Merge pull request #12894 from timothyteakettle/wounds-part-2
port of wounds part 2
This commit is contained in:
@@ -1283,9 +1283,9 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
ADMIN_PUNISHMENT_SHOES,
|
||||
ADMIN_PUNISHMENT_PICKLE,
|
||||
ADMIN_PUNISHMENT_FRY,
|
||||
ADMIN_PUNISHMENT_CRACK,
|
||||
ADMIN_PUNISHMENT_BLEED,
|
||||
ADMIN_PUNISHMENT_SCARIFY)
|
||||
ADMIN_PUNISHMENT_CRACK,
|
||||
ADMIN_PUNISHMENT_BLEED,
|
||||
ADMIN_PUNISHMENT_SCARIFY)
|
||||
|
||||
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list
|
||||
|
||||
@@ -1368,28 +1368,74 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/C = target
|
||||
for(var/obj/item/bodypart/squish_part in C.bodyparts)
|
||||
var/type_wound = pick(list(/datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/moderate))
|
||||
for(var/i in C.bodyparts)
|
||||
var/obj/item/bodypart/squish_part = i
|
||||
var/type_wound = pick(list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate))
|
||||
squish_part.force_wound_upwards(type_wound, smited=TRUE)
|
||||
if(ADMIN_PUNISHMENT_BLEED)
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/C = target
|
||||
for(var/obj/item/bodypart/slice_part in C.bodyparts)
|
||||
var/type_wound = pick(list(/datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate))
|
||||
for(var/i in C.bodyparts)
|
||||
var/obj/item/bodypart/slice_part = i
|
||||
var/type_wound = pick(list(/datum/wound/slash/severe, /datum/wound/slash/moderate))
|
||||
slice_part.force_wound_upwards(type_wound, smited=TRUE)
|
||||
type_wound = pick(list(/datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate))
|
||||
type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate))
|
||||
slice_part.force_wound_upwards(type_wound, smited=TRUE)
|
||||
type_wound = pick(list(/datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe))
|
||||
type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe))
|
||||
slice_part.force_wound_upwards(type_wound, smited=TRUE)
|
||||
if(ADMIN_PUNISHMENT_SCARIFY)
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/C = target
|
||||
C.generate_fake_scars(rand(1, 4))
|
||||
to_chat(C, "<span class='warning'>You feel your body grow jaded and torn...</span>")
|
||||
var/mob/living/carbon/dude = target
|
||||
dude.generate_fake_scars(rand(1, 4))
|
||||
to_chat(dude, "<span class='warning'>You feel your body grow jaded and torn...</span>")
|
||||
if(ADMIN_PUNISHMENT_PERFORATE)
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
|
||||
var/list/how_fucked_is_this_dude = list("A little", "A lot", "So fucking much", "FUCK THIS DUDE")
|
||||
var/hatred = input("How much do you hate this guy?") in how_fucked_is_this_dude
|
||||
var/repetitions
|
||||
var/shots_per_limb_per_rep = 2
|
||||
var/damage
|
||||
switch(hatred)
|
||||
if("A little")
|
||||
repetitions = 1
|
||||
damage = 5
|
||||
if("A lot")
|
||||
repetitions = 2
|
||||
|
||||
damage = 8
|
||||
if("So fucking much")
|
||||
repetitions = 3
|
||||
damage = 10
|
||||
if("FUCK THIS DUDE")
|
||||
repetitions = 4
|
||||
damage = 10
|
||||
|
||||
var/mob/living/carbon/dude = target
|
||||
var/list/open_adj_turfs = get_adjacent_open_turfs(dude)
|
||||
var/list/wound_bonuses = list(15, 70, 110, 250)
|
||||
|
||||
var/delay_per_shot = 1
|
||||
var/delay_counter = 1
|
||||
|
||||
dude.Immobilize(5 SECONDS)
|
||||
for(var/wound_bonus_rep in 1 to repetitions)
|
||||
for(var/i in dude.bodyparts)
|
||||
var/obj/item/bodypart/slice_part = i
|
||||
var/shots_this_limb = 0
|
||||
for(var/t in shuffle(open_adj_turfs))
|
||||
var/turf/iter_turf = t
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/firing_squad, dude, iter_turf, slice_part.body_zone, wound_bonuses[wound_bonus_rep], damage), delay_counter)
|
||||
delay_counter += delay_per_shot
|
||||
shots_this_limb++
|
||||
if(shots_this_limb > shots_per_limb_per_rep)
|
||||
break
|
||||
if(ADMIN_PUNISHMENT_PICKLE)
|
||||
target.turn_into_pickle()
|
||||
if(ADMIN_PUNISHMENT_FRY)
|
||||
@@ -1408,6 +1454,31 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
|
||||
punish_log(target, punishment)
|
||||
|
||||
/**
|
||||
* firing_squad is a proc for the :B:erforate smite to shoot each individual bullet at them, so that we can add actual delays without sleep() nonsense
|
||||
*
|
||||
* Hilariously, if you drag someone away mid smite, the bullets will still chase after them from the original spot, possibly hitting other people. Too funny to fix imo
|
||||
*
|
||||
* Arguments:
|
||||
* * target- guy we're shooting obviously
|
||||
* * source_turf- where the bullet begins, preferably on a turf next to the target
|
||||
* * body_zone- which bodypart we're aiming for, if there is one there
|
||||
* * wound_bonus- the wounding power we're assigning to the bullet, since we don't care about the base one
|
||||
* * damage- the damage we're assigning to the bullet, since we don't care about the base one
|
||||
*/
|
||||
/proc/firing_squad(mob/living/carbon/target, turf/source_turf, body_zone, wound_bonus, damage)
|
||||
if(!target.get_bodypart(body_zone))
|
||||
return
|
||||
playsound(target, 'sound/weapons/shot.ogg', 100)
|
||||
var/obj/item/projectile/bullet/smite/divine_wrath = new(source_turf)
|
||||
divine_wrath.damage = damage
|
||||
divine_wrath.wound_bonus = wound_bonus
|
||||
divine_wrath.original = target
|
||||
divine_wrath.def_zone = body_zone
|
||||
divine_wrath.spread = 0
|
||||
divine_wrath.preparePixelProjectile(target, source_turf)
|
||||
divine_wrath.fire()
|
||||
|
||||
/client/proc/punish_log(var/whom, var/punishment)
|
||||
var/msg = "[key_name_admin(usr)] punished [key_name_admin(whom)] with [punishment]."
|
||||
message_admins(msg)
|
||||
|
||||
@@ -361,9 +361,9 @@
|
||||
torture_time -= I.force / 4
|
||||
torture_dmg_brute += I.force / 4
|
||||
//torture_dmg_burn += I.
|
||||
if(I.sharpness == IS_SHARP)
|
||||
if(I.sharpness == SHARP_EDGED)
|
||||
torture_time -= 1
|
||||
else if(I.sharpness == IS_SHARP_ACCURATE)
|
||||
else if(I.sharpness == SHARP_POINTY)
|
||||
torture_time -= 2
|
||||
if(istype(I, /obj/item/weldingtool))
|
||||
var/obj/item/weldingtool/welder = I
|
||||
|
||||
@@ -164,7 +164,7 @@
|
||||
armour_penetration = 20
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
wound_bonus = -60
|
||||
bare_wound_bonus = 20
|
||||
var/can_drop = FALSE
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
C.regenerate_limbs(1)
|
||||
C.regenerate_organs()
|
||||
for(var/i in C.all_wounds)
|
||||
var/datum/wound/W = i
|
||||
W.remove_wound()
|
||||
var/datum/wound/iter_wound = i
|
||||
iter_wound.remove_wound()
|
||||
if(!user.getorganslot(ORGAN_SLOT_BRAIN))
|
||||
var/obj/item/organ/brain/B
|
||||
if(C.has_dna() && C.dna.species.mutant_brain)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
force = 15 //Extra damage is dealt to targets in attack()
|
||||
throwforce = 25
|
||||
armour_penetration = 10
|
||||
sharpness = IS_SHARP_ACCURATE
|
||||
sharpness = SHARP_POINTY
|
||||
attack_verb = list("stabbed", "poked", "slashed")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
force = 30 // whoever balanced this got beat in the head by a bible too many times good lord
|
||||
throwforce = 10
|
||||
@@ -114,7 +114,7 @@
|
||||
armour_penetration = 45
|
||||
throw_speed = 1
|
||||
throw_range = 3
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
light_color = "#ff0000"
|
||||
attack_verb = list("cleaved", "slashed", "torn", "hacked", "ripped", "diced", "carved")
|
||||
icon_state = "cultbastard"
|
||||
@@ -708,7 +708,7 @@
|
||||
armour_penetration = 30
|
||||
block_chance = 30
|
||||
attack_verb = list("attacked", "impaled", "stabbed", "torn", "gored")
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
var/datum/action/innate/cult/spear/spear_act
|
||||
var/wielded = FALSE // track wielded status on item
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
melee_damage_upper = 22.5
|
||||
wound_bonus = -10
|
||||
bare_wound_bonus = 0
|
||||
sharpness = TRUE
|
||||
sharpness = SHARP_EDGED
|
||||
see_in_dark = 8
|
||||
blood_volume = 0 //No bleeding on getting shot, for skeddadles
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
|
||||
@@ -259,7 +259,7 @@
|
||||
to_chat(target, "<span class='userdanger'>You suddenly feel very hot</span>")
|
||||
target.adjust_bodytemperature(50)
|
||||
GiveHint(target)
|
||||
else if(is_pointed(I))
|
||||
else if(I.get_sharpness() == SHARP_POINTY)
|
||||
to_chat(target, "<span class='userdanger'>You feel a stabbing pain in [parse_zone(user.zone_selected)]!</span>")
|
||||
target.DefaultCombatKnockdown(40)
|
||||
GiveHint(target)
|
||||
|
||||
@@ -81,3 +81,9 @@
|
||||
desc = "Contains one hellgun, an old pattern of laser gun infamous for its ability to horribly disfigure targets with burns. Technically violates the Space Geneva Convention when used on humanoids."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/gun/energy/laser/hellgun)
|
||||
|
||||
/datum/supply_pack/goody/medipen_twopak
|
||||
name = "Medipen Two-Pak"
|
||||
desc = "Contains one standard epinephrine medipen and one standard emergency first-aid kit medipen. For when you want to prepare for the worst."
|
||||
cost = 500
|
||||
contains = list(/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/hypospray/medipen/ekit)
|
||||
|
||||
@@ -218,3 +218,18 @@
|
||||
/obj/item/storage/box/beakers)
|
||||
crate_name = "virus containment unit crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/plasma
|
||||
|
||||
/datum/supply_pack/medical/medipen_variety
|
||||
name = "Medipen Variety-Pak"
|
||||
desc = "Contains eight different medipens in three different varieties, to assist in quickly treating seriously injured patients."
|
||||
cost = 2000
|
||||
contains = list(/obj/item/reagent_containers/hypospray/medipen/,
|
||||
/obj/item/reagent_containers/hypospray/medipen/,
|
||||
/obj/item/reagent_containers/hypospray/medipen/ekit,
|
||||
/obj/item/reagent_containers/hypospray/medipen/ekit,
|
||||
/obj/item/reagent_containers/hypospray/medipen/ekit,
|
||||
/obj/item/reagent_containers/hypospray/medipen/blood_loss,
|
||||
/obj/item/reagent_containers/hypospray/medipen/blood_loss,
|
||||
/obj/item/reagent_containers/hypospray/medipen/blood_loss)
|
||||
|
||||
crate_name = "medipen crate"
|
||||
|
||||
@@ -832,7 +832,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<b>Socks Color:</b> <span style='border:1px solid #161616; background-color: #[socks_color];'> </span> <a href='?_src_=prefs;preference=socks_color;task=input'>Change</a><BR>"
|
||||
dat += "<b>Backpack:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=bag;task=input'>[backbag]</a>"
|
||||
dat += "<b>Jumpsuit:</b><BR><a href ='?_src_=prefs;preference=suit;task=input'>[jumpsuit_style]</a><BR>"
|
||||
if(CAN_SCAR in pref_species.species_traits)
|
||||
if((HAS_FLESH in pref_species.species_traits) || (HAS_BONE in pref_species.species_traits))
|
||||
dat += "<BR><b>Temporal Scarring:</b><BR><a href='?_src_=prefs;preference=persistent_scars'>[(persistent_scars) ? "Enabled" : "Disabled"]</A>"
|
||||
dat += "<a href='?_src_=prefs;preference=clear_scars'>Clear scar slots</A>"
|
||||
dat += "<b>Uplink Location:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=uplink_loc;task=input'>[uplink_spawn_loc]</a>"
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
throw_speed = 4
|
||||
attack_verb = list("sliced")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
|
||||
/obj/item/clothing/glasses/meson/eyepatch
|
||||
name = "eyepatch mesons"
|
||||
@@ -180,7 +180,7 @@
|
||||
throw_speed = 4
|
||||
attack_verb = list("sliced")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
vision_correction = 1
|
||||
glass_colour_type = /datum/client_colour/glass_colour/lightgreen
|
||||
|
||||
@@ -237,7 +237,7 @@
|
||||
throw_speed = 4
|
||||
attack_verb = list("sliced")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/garb/supergarb
|
||||
name = "black giga gar glasses"
|
||||
@@ -257,7 +257,7 @@
|
||||
throw_speed = 4
|
||||
attack_verb = list("sliced")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
glass_colour_type = /datum/client_colour/glass_colour/orange
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/gar/supergar
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
flash_protect = -2
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||
glass_colour_type = /datum/client_colour/glass_colour/green
|
||||
|
||||
|
||||
/obj/item/clothing/glasses/hud/health/night/syndicate
|
||||
name = "combat night vision health scanner HUD"
|
||||
desc = "An advanced shielded medical heads-up display that allows soldiers to approximate how much lead poisoning their allies have suffered in complete darkness."
|
||||
@@ -221,7 +221,7 @@
|
||||
throw_speed = 4
|
||||
attack_verb = list("sliced")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/sunglasses/gars/supergars
|
||||
name = "giga HUD gar glasses"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
|
||||
item_state = "spaceold"
|
||||
permeability_coefficient = 0.01
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70, "wound" = 5)
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
dynamic_hair_suffix = ""
|
||||
dynamic_fhair_suffix = ""
|
||||
@@ -36,7 +36,7 @@
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
|
||||
slowdown = 1
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70, "wound" = 5)
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAUR
|
||||
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "chronohelmet"
|
||||
item_state = "chronohelmet"
|
||||
slowdown = 1
|
||||
armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 100)
|
||||
armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 100, "wound" = 80)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
var/obj/item/clothing/suit/space/chronos/suit = null
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
icon_state = "chronosuit"
|
||||
item_state = "chronosuit"
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 1000)
|
||||
armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 1000, "wound" = 80)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
icon_state = "hardsuit0-engineering"
|
||||
item_state = "eng_helm"
|
||||
max_integrity = 300
|
||||
armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 50, "acid" = 75)
|
||||
armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 50, "acid" = 75, "wound" = 10)
|
||||
var/basestate = "hardsuit"
|
||||
var/brightness_on = 4 //luminosity when on
|
||||
var/on = FALSE
|
||||
@@ -717,7 +717,7 @@
|
||||
item_state = "rig0-soviet"
|
||||
hardsuit_type = "soviet"
|
||||
icon_state = "rig0-soviet"
|
||||
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 75)
|
||||
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 75, "wound" = 15)
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/soviet
|
||||
@@ -726,7 +726,7 @@
|
||||
item_state = "rig-soviet"
|
||||
icon_state = "rig-soviet"
|
||||
slowdown = 0.8
|
||||
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 75)
|
||||
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 75, "wound" = 15)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/soviet
|
||||
mutantrace_variation = NONE
|
||||
|
||||
@@ -771,7 +771,7 @@
|
||||
item_state = "ert_medical"
|
||||
hardsuit_type = "ert_medical"
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf
|
||||
armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95)
|
||||
armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95, "wound" = 30)
|
||||
slowdown = 0
|
||||
max_charges = 5
|
||||
|
||||
@@ -800,7 +800,7 @@
|
||||
icon_state = "hardsuit0-ert_medical"
|
||||
item_state = "hardsuit0-ert_medical"
|
||||
hardsuit_type = "ert_medical"
|
||||
armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95)
|
||||
armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95, "wound" = 30)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf/red
|
||||
icon_state = "hardsuit0-ert_security"
|
||||
@@ -879,7 +879,7 @@
|
||||
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | LAVA_PROOF
|
||||
heat_protection = HEAD
|
||||
armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100)
|
||||
armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100, "wound" = 30)
|
||||
brightness_on = 7
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator)
|
||||
var/energy_color = "#35FFF0"
|
||||
@@ -923,7 +923,7 @@
|
||||
item_state = "swat_suit"
|
||||
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | LAVA_PROOF
|
||||
armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100)
|
||||
armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100, "wound" = 30)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/lavaknight
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
|
||||
@@ -51,7 +51,7 @@ Contains:
|
||||
icon_state = "heavy"
|
||||
item_state = "swat_suit"
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/kitchen/knife/combat)
|
||||
armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 50, "bio" = 90, "rad" = 20, "fire" = 100, "acid" = 100)
|
||||
armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 50, "bio" = 90, "rad" = 20, "fire" = 100, "acid" = 100, "wound" = 25)
|
||||
strip_delay = 120
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
@@ -63,7 +63,7 @@ Contains:
|
||||
dynamic_hair_suffix = "+generic"
|
||||
dynamic_fhair_suffix = "+generic"
|
||||
flags_inv = 0
|
||||
armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30)
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
@@ -79,7 +79,7 @@ Contains:
|
||||
flags_inv = 0
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30)
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
@@ -140,7 +140,7 @@ Contains:
|
||||
desc = "A thick, space-proof tricorne from the royal Space Queen. It's lined with a layer of reflective kevlar."
|
||||
icon_state = "pirate"
|
||||
item_state = "pirate"
|
||||
armor = list("melee" = 30, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 60, "acid" = 75)
|
||||
armor = list("melee" = 30, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 60, "acid" = 75, "wound" = 30)
|
||||
flags_inv = HIDEHAIR
|
||||
strip_delay = 40
|
||||
equip_delay_other = 20
|
||||
@@ -163,7 +163,7 @@ Contains:
|
||||
flags_inv = 0
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/melee/transforming/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum)
|
||||
slowdown = 0
|
||||
armor = list("melee" = 30, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 60, "acid" = 75)
|
||||
armor = list("melee" = 30, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 60, "acid" = 75, "wound" = 30)
|
||||
strip_delay = 40
|
||||
equip_delay_other = 20
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
@@ -175,7 +175,7 @@ Contains:
|
||||
icon_state = "hardsuit0-ert_commander"
|
||||
item_state = "hardsuit0-ert_commander"
|
||||
hardsuit_type = "ert_commander"
|
||||
armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80)
|
||||
armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80, "wound" = 30)
|
||||
strip_delay = 130
|
||||
brightness_on = 7
|
||||
resistance_flags = ACID_PROOF
|
||||
@@ -191,7 +191,7 @@ Contains:
|
||||
item_state = "ert_command"
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80)
|
||||
armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80, "wound" = 30)
|
||||
slowdown = 0
|
||||
strip_delay = 130
|
||||
resistance_flags = ACID_PROOF
|
||||
@@ -244,7 +244,7 @@ Contains:
|
||||
icon_state = "hardsuit0-ert_commander-alert"
|
||||
item_state = "hardsuit0-ert_commander-alert"
|
||||
hardsuit_type = "ert_commander-alert"
|
||||
armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 50)
|
||||
brightness_on = 8
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
@@ -254,7 +254,7 @@ Contains:
|
||||
icon_state = "ert_command-alert"
|
||||
item_state = "ert_command-alert"
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/alert
|
||||
armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 50)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC
|
||||
|
||||
@@ -303,7 +303,7 @@ Contains:
|
||||
icon_state = "space"
|
||||
item_state = "s_suit"
|
||||
desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies."
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 65)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 65, "wound" = 10)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/eva
|
||||
name = "EVA helmet"
|
||||
@@ -311,7 +311,7 @@ Contains:
|
||||
item_state = "space"
|
||||
desc = "A lightweight space helmet with the basic ability to protect the wearer from the vacuum of space during emergencies."
|
||||
flash_protect = 0
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 65)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 65, "wound" = 10)
|
||||
|
||||
//Radiation
|
||||
/obj/item/clothing/head/helmet/space/rad
|
||||
@@ -319,7 +319,7 @@ Contains:
|
||||
desc = "A special helmet that protects against radiation and space. Not much else unfortunately."
|
||||
icon_state = "cespace_helmet"
|
||||
item_state = "nothing"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
resistance_flags = FIRE_PROOF
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
actions_types = list()
|
||||
@@ -329,7 +329,7 @@ Contains:
|
||||
desc = "A special suit that protects against radiation and space. Not much else unfortunately."
|
||||
icon_state = "hardsuit-rad"
|
||||
item_state = "nothing"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
resistance_flags = FIRE_PROOF
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
mutantrace_variation = NONE
|
||||
@@ -339,7 +339,7 @@ Contains:
|
||||
desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
|
||||
icon_state = "griffinhat"
|
||||
item_state = "griffinhat"
|
||||
armor = list("melee" = 20, "bullet" = 40, "laser" = 30, "energy" = 25, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80)
|
||||
armor = list("melee" = 20, "bullet" = 40, "laser" = 30, "energy" = 25, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80, "wound" = 20)
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = ACID_PROOF | FIRE_PROOF
|
||||
@@ -351,7 +351,7 @@ Contains:
|
||||
icon_state = "freedom"
|
||||
item_state = "freedom"
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
armor = list("melee" = 20, "bullet" = 40, "laser" = 30,"energy" = 25, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80)
|
||||
armor = list("melee" = 20, "bullet" = 40, "laser" = 30,"energy" = 25, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80, "wound" = 20)
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = ACID_PROOF | FIRE_PROOF
|
||||
@@ -364,7 +364,7 @@ Contains:
|
||||
desc = "Spaceworthy and it looks like a space carp's head, smells like one too."
|
||||
icon_state = "carp_helm"
|
||||
item_state = "syndicate"
|
||||
armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75) //As whimpy as a space carp
|
||||
armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75, "wound" = 5) //As whimpy as a space carp
|
||||
brightness_on = 0 //luminosity when on
|
||||
actions_types = list()
|
||||
mutantrace_variation = NONE
|
||||
@@ -380,7 +380,7 @@ Contains:
|
||||
icon_state = "carp_suit"
|
||||
item_state = "space_suit_syndicate"
|
||||
slowdown = 0 //Space carp magic, never stop believing
|
||||
armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75) //As whimpy whimpy whoo
|
||||
armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75, "wound" = 5) //As whimpy whimpy whoo
|
||||
allowed = list(/obj/item/tank/internals, /obj/item/gun/ballistic/automatic/speargun) //I'm giving you a hint here
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/carp
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
@@ -442,14 +442,14 @@ Contains:
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/old
|
||||
desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats. Alas, this one looks pretty worn out and rusted."
|
||||
armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60)
|
||||
armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60, "wound" = 20)
|
||||
slowdown = 0.8
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/old
|
||||
charges = 12
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/old
|
||||
desc = "A helmet worn by those who deal with paranormal threats for a living. Alas, this one looks pretty worn out and rusted."
|
||||
armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60)
|
||||
armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60, "wound" = 20)
|
||||
charges = 12
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker
|
||||
@@ -467,14 +467,14 @@ Contains:
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/old
|
||||
desc = "Voices echo from the hardsuit, driving the user insane. This one is pretty battle-worn, but still fearsome."
|
||||
armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60)
|
||||
armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60, "wound" = 20)
|
||||
slowdown = 0.8
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/old
|
||||
charges = 6
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/old
|
||||
desc = "Peering into the eyes of the helmet is enough to seal damnation. This one is pretty battle-worn, but still fearsome."
|
||||
armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60)
|
||||
armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60, "wound" = 20)
|
||||
charges = 6
|
||||
|
||||
/obj/item/clothing/head/helmet/space/fragile
|
||||
@@ -482,7 +482,7 @@ Contains:
|
||||
desc = "A bulky, air-tight helmet meant to protect the user during emergency situations. It doesn't look very durable."
|
||||
icon_state = "syndicate-helm-orange"
|
||||
item_state = "syndicate-helm-orange"
|
||||
armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
strip_delay = 65
|
||||
|
||||
/obj/item/clothing/suit/space/fragile
|
||||
@@ -492,7 +492,7 @@ Contains:
|
||||
icon_state = "syndicate-orange"
|
||||
item_state = "syndicate-orange"
|
||||
slowdown = 2
|
||||
armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
strip_delay = 65
|
||||
|
||||
/obj/item/clothing/suit/space/fragile/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
|
||||
@@ -525,7 +525,7 @@ Contains:
|
||||
icon_state = "hunter"
|
||||
item_state = "swat_suit"
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/kitchen/knife/combat)
|
||||
armor = list("melee" = 60, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
armor = list("melee" = 60, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wpound" = 25)
|
||||
strip_delay = 130
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
name = "EVA plasma envirosuit"
|
||||
desc = "A special plasma containment suit designed to be space-worthy, as well as worn over other clothing. Like its smaller counterpart, it can automatically extinguish the wearer in a crisis, and holds twice as many charges."
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_casing, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword, /obj/item/restraints/handcuffs, /obj/item/tank)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75, "wound" = 10)
|
||||
resistance_flags = FIRE_PROOF
|
||||
icon_state = "plasmaman_suit"
|
||||
item_state = "plasmaman_suit"
|
||||
@@ -40,7 +40,7 @@
|
||||
icon_state = "plasmaman-helm"
|
||||
item_state = "plasmaman-helm"
|
||||
strip_delay = 80
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75, "wound" = 10)
|
||||
resistance_flags = FIRE_PROOF
|
||||
var/brightness_on = 4 //luminosity when the light is on
|
||||
var/on = FALSE
|
||||
@@ -77,7 +77,7 @@
|
||||
desc = "A plasmaman containment helmet designed for security officers, protecting them from being flashed and burning alive, along-side other undesirables."
|
||||
icon_state = "security_envirohelm"
|
||||
item_state = "security_envirohelm"
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75)
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75, "wound" = 20)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/security/warden
|
||||
name = "warden's plasma envirosuit helmet"
|
||||
@@ -132,7 +132,7 @@
|
||||
desc = "A sturdier plasmaman envirohelmet designed for research directors."
|
||||
icon_state = "rd_envirohelm"
|
||||
item_state = "rd_envirohelm"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75, "wound" = 10)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/robotics
|
||||
name = "robotics plasma envirosuit helmet"
|
||||
@@ -145,7 +145,7 @@
|
||||
desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange."
|
||||
icon_state = "engineer_envirohelm"
|
||||
item_state = "engineer_envirohelm"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 75)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 75, "wound" = 10)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/engineering/ce
|
||||
name = "chief engineer's plasma envirosuit helmet"
|
||||
@@ -194,7 +194,7 @@
|
||||
desc = "A blue and gold envirohelm designed for the station's captain, nonetheless. Made of superior materials to protect them from the station hazards and more."
|
||||
icon_state = "captain_envirohelm"
|
||||
item_state = "captain_envirohelm"
|
||||
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 85)
|
||||
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 85, "wound" = 15)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/curator
|
||||
name = "curator's plasma envirosuit helmet"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "syndicate"
|
||||
item_state = "syndicate"
|
||||
desc = "Has a tag on it: Totally not property of an enemy corporation, honest!"
|
||||
armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85)
|
||||
armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85, "wound" = 20)
|
||||
|
||||
/obj/item/clothing/suit/space/syndicate
|
||||
name = "red space suit"
|
||||
@@ -13,7 +13,7 @@
|
||||
desc = "Has a tag on it: Totally not property of an enemy corporation, honest!"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85)
|
||||
armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85, "wound" = 20)
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
|
||||
//Green syndicate space suit
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
equip_delay_other = 40
|
||||
max_integrity = 250
|
||||
resistance_flags = NONE
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 15)
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 10)
|
||||
|
||||
|
||||
/obj/item/clothing/suit/armor/Initialize()
|
||||
@@ -58,7 +58,7 @@
|
||||
icon_state = "hos"
|
||||
item_state = "greatcoat"
|
||||
body_parts_covered = CHEST|GROIN|ARMS|LEGS
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90, "wound" = 20)
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90, "wound" = 10)
|
||||
cold_protection = CHEST|GROIN|LEGS|ARMS
|
||||
heat_protection = CHEST|GROIN|LEGS|ARMS
|
||||
strip_delay = 80
|
||||
@@ -148,7 +148,7 @@
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "wound" = 30)
|
||||
armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "wound" = 20)
|
||||
blocks_shove_knockdown = TRUE
|
||||
strip_delay = 80
|
||||
equip_delay_other = 60
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
desc = "An expensive piece of plasmaman envirosuit fashion. guaranteed to keep you cool while the station goes down in fierceful fires."
|
||||
icon_state = "captain_envirosuit"
|
||||
item_state = "captain_envirosuit"
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95, "wound" = 15)
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = FALSE
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "An air-tight suit designed to be used by plasmamen exployed as engineers, the usual purple stripes being replaced by engineer's orange. It protects the user from fire and acid damage."
|
||||
icon_state = "engineer_envirosuit"
|
||||
item_state = "engineer_envirosuit"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 95, "acid" = 95)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 95, "acid" = 95, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/plasmaman/engineering/ce
|
||||
name = "chief engineer's plasma envirosuit"
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
desc = "A plasmaman envirosuit designed for the research director to aid them in their job of directing research into the right direction."
|
||||
icon_state = "rd_envirosuit"
|
||||
item_state = "rd_envirosuit"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/plasmaman/robotics
|
||||
name = "robotics plasma envirosuit"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection."
|
||||
icon_state = "security_envirosuit"
|
||||
item_state = "security_envirosuit"
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95, "wound" = 10)
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = FALSE
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
|
||||
name = "janitor's jumpsuit"
|
||||
icon_state = "janitor"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/rank/civilian/janitor/skirt
|
||||
name = "janitor's jumpskirt"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
name = "chief engineer's jumpsuit"
|
||||
icon_state = "chiefengineer"
|
||||
item_state = "gy_suit"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 80, "acid" = 40)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 80, "acid" = 40, "wound" = 5)
|
||||
resistance_flags = NONE
|
||||
|
||||
/obj/item/clothing/under/rank/engineering/chief_engineer/skirt
|
||||
@@ -39,7 +39,7 @@
|
||||
name = "engineer's jumpsuit"
|
||||
icon_state = "engine"
|
||||
item_state = "engi_suit"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 60, "acid" = 20)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 60, "acid" = 20, "wound" = 5)
|
||||
resistance_flags = NONE
|
||||
|
||||
/obj/item/clothing/under/rank/engineering/engineer/hazard
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "cmo"
|
||||
item_state = "w_suit"
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/chief_medical_officer/skirt
|
||||
name = "chief medical officer's jumpskirt"
|
||||
@@ -30,7 +30,7 @@
|
||||
icon_state = "genetics"
|
||||
item_state = "w_suit"
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/geneticist/skirt
|
||||
name = "geneticist's jumpskirt"
|
||||
@@ -48,7 +48,7 @@
|
||||
icon_state = "virology"
|
||||
item_state = "w_suit"
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/virologist/skirt
|
||||
name = "virologist's jumpskirt"
|
||||
@@ -66,7 +66,7 @@
|
||||
icon_state = "chemistry"
|
||||
item_state = "w_suit"
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 65)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 65, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/chemist/skirt
|
||||
name = "chemist's jumpskirt"
|
||||
@@ -84,7 +84,7 @@
|
||||
icon_state = "paramedic-dark"
|
||||
item_state = "w_suit"
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/paramedic/light
|
||||
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic."
|
||||
@@ -110,7 +110,7 @@
|
||||
icon_state = "nursesuit"
|
||||
item_state = "w_suit"
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
can_adjust = FALSE
|
||||
@@ -122,7 +122,7 @@
|
||||
icon_state = "medical"
|
||||
item_state = "w_suit"
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/doctor/blue
|
||||
name = "blue medical scrubs"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
name = "research director's vest suit"
|
||||
icon_state = "director"
|
||||
item_state = "lb_suit"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 35)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 35, "wound" = 5)
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/rnd/research_director/skirt
|
||||
@@ -20,7 +20,7 @@
|
||||
name = "research director's tan suit"
|
||||
icon_state = "rdwhimsy"
|
||||
item_state = "rdwhimsy"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
can_adjust = TRUE
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
name = "research director's turtleneck"
|
||||
icon_state = "rdturtle"
|
||||
item_state = "p_suit"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
can_adjust = TRUE
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
icon_state = "toxins"
|
||||
item_state = "w_suit"
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/rank/rnd/scientist/skirt
|
||||
name = "scientist's jumpskirt"
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
gas_transfer_coefficient = 0.01
|
||||
permeability_coefficient = 0.01
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
armor = list("melee" = 100, "bullet" = 100, "laser" = 100,"energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
armor = list("melee" = 100, "bullet" = 100, "laser" = 100,"energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 1000) //wound defense at 100 wont stop wounds
|
||||
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "syndicate"
|
||||
item_state = "bl_suit"
|
||||
has_sensor = NO_SENSORS
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "wound" = 5)
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
/obj/item/clothing/under/syndicate/skirt
|
||||
@@ -13,7 +13,7 @@
|
||||
icon_state = "syndicate_skirt"
|
||||
item_state = "bl_suit"
|
||||
has_sensor = NO_SENSORS
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "wound" = 5)
|
||||
alt_covers_chest = TRUE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
@@ -24,7 +24,7 @@
|
||||
icon_state = "bloodred_pajamas"
|
||||
item_state = "bl_suit"
|
||||
dummy_thick = TRUE
|
||||
armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 50, "acid" = 40)
|
||||
armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 50, "acid" = 40, "wound" = 10)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
can_adjust = FALSE
|
||||
|
||||
@@ -33,21 +33,21 @@
|
||||
desc = "Do operatives dream of nuclear sheep?"
|
||||
icon_state = "bloodred_pajamas"
|
||||
item_state = "bl_suit"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/syndicate/tacticool
|
||||
name = "tacticool turtleneck"
|
||||
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
|
||||
icon_state = "tactifool"
|
||||
item_state = "bl_suit"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/syndicate/tacticool/skirt
|
||||
name = "tacticool skirtleneck"
|
||||
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
|
||||
icon_state = "tactifool_skirt"
|
||||
item_state = "bl_suit"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "wound" = 5)
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
icon_state = "tactifool"
|
||||
item_state = "bl_suit"
|
||||
has_sensor = TRUE
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/syndicate/sniper
|
||||
name = "Tactical turtleneck suit"
|
||||
@@ -81,7 +81,7 @@
|
||||
desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in."
|
||||
icon_state = "trackpants"
|
||||
can_adjust = FALSE
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
resistance_flags = NONE
|
||||
|
||||
/obj/item/clothing/under/syndicate/combat
|
||||
@@ -96,7 +96,7 @@
|
||||
desc = "Military grade tracksuits for frontline squatting."
|
||||
icon_state = "rus_under"
|
||||
can_adjust = FALSE
|
||||
armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
resistance_flags = NONE
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
icon_state = "syndicatebaseball"
|
||||
item_state = "syndicatebaseball"
|
||||
has_sensor = NO_SENSORS
|
||||
armor = list("melee" = 15, "bullet" = 5, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
|
||||
armor = list("melee" = 15, "bullet" = 5, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "wound" = 10)
|
||||
alt_covers_chest = TRUE
|
||||
mutantrace_variation = USE_TAUR_CLIP_MASK
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("stabbed", "slashed", "attacked")
|
||||
var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken")
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
|
||||
/obj/item/broken_bottle/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -249,21 +249,9 @@ All foods are distributed among various categories. Use common sense.
|
||||
to_chat(user, "<span class='warning'>You cannot slice [src] here! You need a table or at least a tray.</span>")
|
||||
return FALSE
|
||||
|
||||
var/slices_lost = 0
|
||||
if (accuracy >= IS_SHARP_ACCURATE)
|
||||
user.visible_message( \
|
||||
"[user] slices [src].", \
|
||||
"<span class='notice'>You slice [src].</span>" \
|
||||
)
|
||||
else
|
||||
user.visible_message( \
|
||||
"[user] inaccurately slices [src] with [W]!", \
|
||||
"<span class='notice'>You inaccurately slice [src] with your [W]!</span>" \
|
||||
)
|
||||
slices_lost = rand(1,min(1,round(slices_num/2)))
|
||||
|
||||
user.visible_message("[user] slices [src].", "<span class='notice'>You slice [src].</span>")
|
||||
var/reagents_per_slice = reagents.total_volume/slices_num
|
||||
for(var/i=1 to (slices_num-slices_lost))
|
||||
for(var/i=1 to slices_num)
|
||||
var/obj/item/reagent_containers/food/snacks/slice = new slice_path (loc)
|
||||
initialize_slice(slice, reagents_per_slice)
|
||||
qdel(src)
|
||||
|
||||
@@ -303,7 +303,10 @@ h1.alert, h2.alert {color: #000000;}
|
||||
.passive {color: #660000;}
|
||||
|
||||
.userdanger {color: #ff0000; font-weight: bold; font-size: 185%;}
|
||||
.bolddanger {color: #c51e1e;font-weight: bold;}
|
||||
.danger {color: #ff0000;}
|
||||
.tinydanger {color: #c51e1e; font-size: 85%;}
|
||||
.smalldanger {color: #c51e1e; font-size: 90%;}
|
||||
.warning {color: #ff0000; font-style: italic;}
|
||||
.alertwarning {color: #FF0000; font-weight: bold}
|
||||
.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
|
||||
@@ -313,8 +316,9 @@ h1.alert, h2.alert {color: #000000;}
|
||||
.rose {color: #ff5050;}
|
||||
.info {color: #0000CC;}
|
||||
.notice {color: #000099;}
|
||||
.tinynotice {color: #6685f5; font-style: italic; font-size: 85%;}
|
||||
.smallnotice {color: #6685f5; font-style: italic; font-size: 90%;}
|
||||
.tinynotice {color: #6685f5; font-style: italic; font-size: 85%;}
|
||||
.smallnotice {color: #6685f5; font-size: 90%;}
|
||||
.smallnoticeital {color: #6685f5; font-style: italic; font-size: 90%;}
|
||||
.boldnotice {color: #000099; font-weight: bold;}
|
||||
.adminnotice {color: #0000ff;}
|
||||
.adminhelp {color: #ff0000; font-weight: bold;}
|
||||
|
||||
@@ -27,6 +27,12 @@
|
||||
juice_results = list(/datum/reagent/consumable/banana = 0)
|
||||
distill_reagent = /datum/reagent/consumable/ethanol/bananahonk
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana/generate_trash(atom/location)
|
||||
. = ..()
|
||||
var/obj/item/grown/bananapeel/peel = .
|
||||
if(istype(peel))
|
||||
peel.grind_results = list(/datum/reagent/consumable/banana_peel = seed.potency * 0.2)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is aiming [src] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1)
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
custom_materials = list(/datum/material/iron = 15000)
|
||||
attack_verb = list("chopped", "torn", "cut")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
|
||||
/obj/item/hatchet/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075)
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped")
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
actions_types = list(/datum/action/item_action/toggle_light)
|
||||
var/list/trophies = list()
|
||||
var/charged = TRUE
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
custom_materials = list(/datum/material/iron=350)
|
||||
attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
|
||||
/obj/item/shovel/Initialize()
|
||||
. = ..()
|
||||
@@ -181,4 +181,4 @@
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
toolspeed = 0.7
|
||||
attack_verb = list("slashed", "impaled", "stabbed", "sliced")
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
|
||||
@@ -659,7 +659,7 @@
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
hitsound_on = 'sound/weapons/bladeslice.ogg'
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
faction_bonus_force = 30
|
||||
nemesis_factions = list("mining", "boss")
|
||||
var/transform_cooldown
|
||||
@@ -766,7 +766,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
force = 1
|
||||
throwforce = 1
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
|
||||
if(victim.stat == CONSCIOUS)
|
||||
src.visible_message("<span class='warning'>[victim] kicks free of the blood pool just before entering it!</span>", null, "<span class='notice'>You hear splashing and struggling.</span>")
|
||||
else if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/consumable/ethanol/demonsblood))
|
||||
else if(victim.reagents?.has_reagent(/datum/reagent/consumable/ethanol/demonsblood))
|
||||
visible_message("<span class='warning'>Something prevents [victim] from entering the pool!</span>", "<span class='warning'>A strange force is blocking [victim] from entering!</span>", "<span class='notice'>You hear a splash and a thud.</span>")
|
||||
else
|
||||
victim.forceMove(src)
|
||||
@@ -104,7 +104,7 @@
|
||||
if(!victim)
|
||||
return FALSE
|
||||
|
||||
if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/consumable/ethanol/devilskiss))
|
||||
if(victim.reagents?.has_reagent(/datum/reagent/consumable/ethanol/devilskiss))
|
||||
to_chat(src, "<span class='warning'><b>AAH! THEIR FLESH! IT BURNS!</b></span>")
|
||||
adjustBruteLoss(25) //I can't use adjustHealth() here because bloodcrawl affects /mob/living and adjustHealth() only affects simple mobs
|
||||
var/found_bloodpool = FALSE
|
||||
|
||||
@@ -92,17 +92,8 @@
|
||||
if(!all_wounds || !(user.a_intent == INTENT_HELP || user == src))
|
||||
return ..()
|
||||
|
||||
// The following priority/nonpriority searching is so that if we have two wounds on a limb that use the same item for treatment (gauze can bandage cuts AND splint broken bones),
|
||||
// we prefer whichever wound is not already treated (ignore the splinted broken bone for the open cut). If there's no priority wounds that this can treat, go through the
|
||||
// non-priority ones randomly.
|
||||
var/list/nonpriority_wounds = list()
|
||||
for(var/datum/wound/W in shuffle(all_wounds))
|
||||
if(!W.treat_priority)
|
||||
nonpriority_wounds += W
|
||||
else if(W.treat_priority && W.try_treating(I, user))
|
||||
return 1
|
||||
|
||||
for(var/datum/wound/W in shuffle(nonpriority_wounds))
|
||||
for(var/i in shuffle(all_wounds))
|
||||
var/datum/wound/W = i
|
||||
if(W.try_treating(I, user))
|
||||
return 1
|
||||
|
||||
@@ -1209,16 +1200,16 @@
|
||||
/**
|
||||
* generate_fake_scars()- for when you want to scar someone, but you don't want to hurt them first. These scars don't count for temporal scarring (hence, fake)
|
||||
*
|
||||
* If you want a specific wound scar, pass that wound type as the second arg, otherwise you can pass a list like WOUND_LIST_CUT to generate a random cut scar.
|
||||
* If you want a specific wound scar, pass that wound type as the second arg, otherwise you can pass a list like WOUND_LIST_SLASH to generate a random cut scar.
|
||||
*
|
||||
* Arguments:
|
||||
* * num_scars- A number for how many scars you want to add
|
||||
* * forced_type- Which wound or category of wounds you want to choose from, WOUND_LIST_BONE, WOUND_LIST_CUT, or WOUND_LIST_BURN (or some combination). If passed a list, picks randomly from the listed wounds. Defaults to all 3 types
|
||||
* * forced_type- Which wound or category of wounds you want to choose from, WOUND_LIST_BLUNT, WOUND_LIST_SLASH, or WOUND_LIST_BURN (or some combination). If passed a list, picks randomly from the listed wounds. Defaults to all 3 types
|
||||
*/
|
||||
/mob/living/carbon/proc/generate_fake_scars(num_scars, forced_type)
|
||||
for(var/i in 1 to num_scars)
|
||||
var/datum/scar/S = new
|
||||
var/obj/item/bodypart/BP = pick(bodyparts)
|
||||
var/datum/scar/scaries = new
|
||||
var/obj/item/bodypart/scar_part = pick(bodyparts)
|
||||
|
||||
var/wound_type
|
||||
if(forced_type)
|
||||
@@ -1227,9 +1218,17 @@
|
||||
else
|
||||
wound_type = forced_type
|
||||
else
|
||||
wound_type = pick(WOUND_LIST_BONE + WOUND_LIST_CUT + WOUND_LIST_BURN)
|
||||
wound_type = pick(GLOB.global_all_wound_types)
|
||||
|
||||
var/datum/wound/W = new wound_type
|
||||
S.generate(BP, W)
|
||||
S.fake = TRUE
|
||||
QDEL_NULL(W)
|
||||
var/datum/wound/phantom_wound = new wound_type
|
||||
scaries.generate(scar_part, phantom_wound)
|
||||
scaries.fake = TRUE
|
||||
QDEL_NULL(phantom_wound)
|
||||
|
||||
/**
|
||||
* get_biological_state is a helper used to see what kind of wounds we roll for. By default we just assume carbons (read:monkeys) are flesh and bone, but humans rely on their species datums
|
||||
*
|
||||
* go look at the species def for more info [/datum/species/proc/get_biological_state]
|
||||
*/
|
||||
/mob/living/carbon/proc/get_biological_state()
|
||||
return BIO_FLESH_BONE
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
if(!affecting) //missing limb? we select the first bodypart (you can never have zero, because of chest)
|
||||
affecting = bodyparts[1]
|
||||
SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting)
|
||||
send_item_attack_message(I, user, affecting.name, totitemdamage)
|
||||
send_item_attack_message(I, user, affecting.name, affecting, totitemdamage)
|
||||
I.do_stagger_action(src, user, totitemdamage)
|
||||
if(I.force)
|
||||
apply_damage(totitemdamage, I.damtype, affecting, wound_bonus = I.wound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness()) //CIT CHANGE - replaces I.force with totitemdamage
|
||||
@@ -100,12 +100,6 @@
|
||||
head.add_mob_blood(src)
|
||||
update_inv_head()
|
||||
|
||||
//dismemberment
|
||||
var/probability = I.get_dismemberment_chance(affecting)
|
||||
if(prob(probability))
|
||||
if(affecting.dismember(I.damtype))
|
||||
I.add_mob_blood(src)
|
||||
playsound(get_turf(src), I.get_dismember_sound(), 80, 1)
|
||||
return TRUE //successful attack
|
||||
|
||||
/mob/living/carbon/attack_drone(mob/living/simple_animal/drone/user)
|
||||
@@ -131,9 +125,10 @@
|
||||
if(S.next_step(user, act_intent))
|
||||
return TRUE
|
||||
|
||||
for(var/datum/wound/W in all_wounds)
|
||||
for(var/i in all_wounds)
|
||||
var/datum/wound/W = i
|
||||
if(W.try_handling(user))
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/attack_paw(mob/living/carbon/monkey/M)
|
||||
|
||||
@@ -157,6 +152,7 @@
|
||||
for(var/thing in M.diseases)
|
||||
var/datum/disease/D = thing
|
||||
ForceContractDisease(D)
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M)
|
||||
. = ..()
|
||||
@@ -397,7 +393,7 @@
|
||||
to_chat(src, "<span class='warning'>Your eyes are really starting to hurt. This can't be good for you!</span>")
|
||||
if(has_bane(BANE_LIGHT))
|
||||
mind.disrupt_spells(-500)
|
||||
return 1
|
||||
return TRUE
|
||||
else if(damage == 0) // just enough protection
|
||||
if(prob(20))
|
||||
to_chat(src, "<span class='notice'>Something bright flashes in the corner of your vision!</span>")
|
||||
@@ -472,3 +468,35 @@
|
||||
var/obj/item/bodypart/limb = get_bodypart(zone)
|
||||
if(!limb)
|
||||
return
|
||||
|
||||
/mob/living/carbon/send_item_attack_message(obj/item/I, mob/living/user, hit_area, obj/item/bodypart/hit_bodypart, totitemdamage)
|
||||
var/message_verb = "attacked"
|
||||
if(length(I.attack_verb))
|
||||
message_verb = "[pick(I.attack_verb)]"
|
||||
else if(!I.force)
|
||||
return
|
||||
|
||||
var/extra_wound_details = ""
|
||||
if(I.damtype == BRUTE && hit_bodypart.can_dismember())
|
||||
var/mangled_state = hit_bodypart.get_mangled_state()
|
||||
var/bio_state = get_biological_state()
|
||||
if(mangled_state == BODYPART_MANGLED_BOTH)
|
||||
extra_wound_details = ", threatening to sever it entirely"
|
||||
else if((mangled_state == BODYPART_MANGLED_FLESH && I.get_sharpness()) || (mangled_state & BODYPART_MANGLED_BONE && bio_state == BIO_JUST_BONE))
|
||||
extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] through to the bone"
|
||||
else if((mangled_state == BODYPART_MANGLED_BONE && I.get_sharpness()) || (mangled_state & BODYPART_MANGLED_FLESH && bio_state == BIO_JUST_FLESH))
|
||||
extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] at the remaining tissue"
|
||||
|
||||
var/message_hit_area = ""
|
||||
if(hit_area)
|
||||
message_hit_area = " in the [hit_area]"
|
||||
var/attack_message = "[src] is [message_verb][message_hit_area] with [I][extra_wound_details]!"
|
||||
var/attack_message_local = "You're [message_verb][message_hit_area] with [I][extra_wound_details]!"
|
||||
if(user in viewers(src, null))
|
||||
attack_message = "[user] [message_verb] [src][message_hit_area] with [I][extra_wound_details]!"
|
||||
attack_message_local = "[user] [message_verb] you[message_hit_area] with [I][extra_wound_details]!"
|
||||
if(user == src)
|
||||
attack_message_local = "You [message_verb] yourself[message_hit_area] with [I][extra_wound_details]"
|
||||
visible_message("<span class='danger'>[attack_message]</span>",\
|
||||
"<span class='userdanger'>[attack_message_local]</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
return TRUE
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
|
||||
/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE)
|
||||
/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
|
||||
SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone)
|
||||
var/hit_percent = (100-blocked)/100
|
||||
if(!forced && hit_percent <= 0)
|
||||
@@ -202,7 +202,7 @@
|
||||
//Damages ONE bodypart randomly selected from damagable ones.
|
||||
//It automatically updates damage overlays if necessary
|
||||
//It automatically updates health status
|
||||
/mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE)
|
||||
/mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
|
||||
var/list/obj/item/bodypart/parts = get_damageable_bodyparts()
|
||||
if(!parts.len)
|
||||
return
|
||||
|
||||
@@ -44,7 +44,8 @@
|
||||
msg += "<B>[t_He] [t_has] \a [icon2html(I, user)] [I] stuck to [t_his] [BP.name]!</B>\n"
|
||||
else
|
||||
msg += "<B>[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!</B>\n"
|
||||
for(var/datum/wound/W in BP.wounds)
|
||||
for(var/i in BP.wounds)
|
||||
var/datum/wound/W = i
|
||||
msg += "[W.get_examine_description(user)]\n"
|
||||
|
||||
for(var/X in disabled)
|
||||
@@ -109,7 +110,7 @@
|
||||
|
||||
switch(scar_severity)
|
||||
if(1 to 2)
|
||||
msg += "<span class='smallnotice'>[t_He] [t_has] visible scarring, you can look again to take a closer look...</span>\n"
|
||||
msg += "<span class='smallnoticeital'>[t_He] [t_has] visible scarring, you can look again to take a closer look...</span>\n"
|
||||
if(3 to 4)
|
||||
msg += "<span class='notice'><i>[t_He] [t_has] several bad scars, you can look again to take a closer look...</i></span>\n"
|
||||
if(5 to 6)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
// depending on the species, it will run the corresponding apply_damage code there
|
||||
/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE)
|
||||
/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
|
||||
return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness)
|
||||
|
||||
|
||||
@@ -163,8 +163,9 @@
|
||||
msg += "<B>[t_He] [t_has] \a [icon2html(I, user)] [I] stuck to [t_his] [BP.name]!</B>\n"
|
||||
else
|
||||
msg += "<B>[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!</B>\n"
|
||||
for(var/datum/wound/W in BP.wounds)
|
||||
msg += "[W.get_examine_description(user)]\n"
|
||||
for(var/i in BP.wounds)
|
||||
var/datum/wound/iter_wound = i
|
||||
msg += "[iter_wound.get_examine_description(user)]\n"
|
||||
|
||||
for(var/X in disabled)
|
||||
var/obj/item/bodypart/BP = X
|
||||
@@ -270,7 +271,12 @@
|
||||
bleeding_limbs += BP
|
||||
|
||||
var/num_bleeds = LAZYLEN(bleeding_limbs)
|
||||
var/bleed_text = "<B>[t_He] [t_is] bleeding from [t_his]"
|
||||
var/list/bleed_text
|
||||
if(appears_dead)
|
||||
bleed_text = list("<span class='deadsay'><B>Blood is visible in [t_his] open")
|
||||
else
|
||||
bleed_text = list("<B>[t_He] [t_is] bleeding from [t_his]")
|
||||
|
||||
switch(num_bleeds)
|
||||
if(1 to 2)
|
||||
bleed_text += " [bleeding_limbs[1].name][num_bleeds == 2 ? " and [bleeding_limbs[2].name]" : ""]"
|
||||
@@ -280,8 +286,15 @@
|
||||
bleed_text += " [BP.name],"
|
||||
bleed_text += " and [bleeding_limbs[num_bleeds].name]"
|
||||
|
||||
bleed_text += "!</B>\n"
|
||||
msg += bleed_text
|
||||
|
||||
if(appears_dead)
|
||||
bleed_text += ", but it has pooled and is not flowing.</span></B>\n"
|
||||
else
|
||||
if(reagents.has_reagent(/datum/reagent/toxin/heparin))
|
||||
bleed_text += " incredibly quickly"
|
||||
|
||||
bleed_text += "!</B>\n"
|
||||
msg += bleed_text.Join()
|
||||
|
||||
if(reagents.has_reagent(/datum/reagent/teslium))
|
||||
msg += "[t_He] [t_is] emitting a gentle blue glow!\n"
|
||||
@@ -365,7 +378,7 @@
|
||||
|
||||
switch(scar_severity)
|
||||
if(1 to 2)
|
||||
msg += "<span class='smallnotice'>[t_He] [t_has] visible scarring, you can look again to take a closer look...</span>\n"
|
||||
msg += "<span class='smallnoticeital'>[t_He] [t_has] visible scarring, you can look again to take a closer look...</span>\n"
|
||||
if(3 to 4)
|
||||
msg += "<span class='notice'><i>[t_He] [t_has] several bad scars, you can look again to take a closer look...</i></span>\n"
|
||||
if(5 to 6)
|
||||
|
||||
@@ -154,19 +154,29 @@
|
||||
|
||||
/// For use formatting all of the scars this human has for saving for persistent scarring
|
||||
/mob/living/carbon/human/proc/format_scars()
|
||||
if(!all_scars)
|
||||
var/list/missing_bodyparts = get_missing_limbs()
|
||||
if(!all_scars && !length(missing_bodyparts))
|
||||
return
|
||||
var/scars = ""
|
||||
for(var/i in missing_bodyparts)
|
||||
var/datum/scar/scaries = new
|
||||
scars += "[scaries.format_amputated(i)]"
|
||||
for(var/i in all_scars)
|
||||
var/datum/scar/S = i
|
||||
scars += "[S.format()];"
|
||||
var/datum/scar/scaries = i
|
||||
scars += "[scaries.format()];"
|
||||
return scars
|
||||
|
||||
/// Takes a single scar from the persistent scar loader and recreates it from the saved data
|
||||
/mob/living/carbon/human/proc/load_scar(scar_line)
|
||||
var/list/scar_data = splittext(scar_line, "|")
|
||||
if(LAZYLEN(scar_data) != 4)
|
||||
if(LAZYLEN(scar_data) != SCAR_SAVE_LENGTH)
|
||||
return // invalid, should delete
|
||||
var/obj/item/bodypart/BP = get_bodypart("[scar_data[SCAR_SAVE_ZONE]]")
|
||||
var/datum/scar/S = new
|
||||
return S.load(BP, scar_data[SCAR_SAVE_DESC], scar_data[SCAR_SAVE_PRECISE_LOCATION], text2num(scar_data[SCAR_SAVE_SEVERITY]))
|
||||
var/version = text2num(scar_data[SCAR_SAVE_VERS])
|
||||
if(!version || version < SCAR_CURRENT_VERSION) // get rid of old scars
|
||||
return
|
||||
var/obj/item/bodypart/the_part = get_bodypart("[scar_data[SCAR_SAVE_ZONE]]")
|
||||
var/datum/scar/scaries = new
|
||||
return scaries.load(the_part, scar_data[SCAR_SAVE_VERS], scar_data[SCAR_SAVE_DESC], scar_data[SCAR_SAVE_PRECISE_LOCATION], text2num(scar_data[SCAR_SAVE_SEVERITY]))
|
||||
|
||||
/mob/living/carbon/human/get_biological_state()
|
||||
return dna.species.get_biological_state()
|
||||
|
||||
@@ -73,7 +73,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
var/datum/outfit/outfit_important_for_life // A path to an outfit that is important for species life e.g. plasmaman outfit
|
||||
|
||||
// species-only traits. Can be found in DNA.dm
|
||||
var/list/species_traits = list(CAN_SCAR) //by default they can scar unless set to something else
|
||||
var/list/species_traits = list(HAS_FLESH,HAS_BONE) //by default they can scar and have bones/flesh unless set to something else
|
||||
// generic traits tied to having the species
|
||||
var/list/inherent_traits = list()
|
||||
var/inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
@@ -1746,20 +1746,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
apply_damage(totitemdamage * weakness, I.damtype, def_zone, armor_block, H, wound_bonus = Iwound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness())
|
||||
|
||||
|
||||
H.send_item_attack_message(I, user, hit_area, totitemdamage)
|
||||
H.send_item_attack_message(I, user, hit_area, affecting, totitemdamage)
|
||||
|
||||
I.do_stagger_action(H, user, totitemdamage)
|
||||
|
||||
if(!totitemdamage)
|
||||
return 0 //item force is zero
|
||||
|
||||
//dismemberment
|
||||
var/probability = I.get_dismemberment_chance(affecting)
|
||||
if(prob(probability) || (HAS_TRAIT(H, TRAIT_EASYDISMEMBER) && prob(probability))) //try twice
|
||||
if(affecting.dismember(I.damtype))
|
||||
I.add_mob_blood(H)
|
||||
playsound(get_turf(H), I.get_dismember_sound(), 80, 1)
|
||||
|
||||
var/bloody = 0
|
||||
if(((I.damtype == BRUTE) && I.force && prob(25 + (I.force * 2))))
|
||||
if(affecting.status == BODYPART_ORGANIC)
|
||||
@@ -1962,7 +1955,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
target.ShoveOffBalance(SHOVE_OFFBALANCE_DURATION)
|
||||
log_combat(user, target, "shoved", append_message)
|
||||
|
||||
/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE)
|
||||
/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
|
||||
SEND_SIGNAL(H, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone, wound_bonus, bare_wound_bonus, sharpness) // make sure putting wound_bonus here doesn't screw up other signals or uses for this signal
|
||||
var/hit_percent = (100-(blocked+armor))/100
|
||||
hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100
|
||||
@@ -2038,6 +2031,25 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
// called before a projectile hit
|
||||
return
|
||||
|
||||
/**
|
||||
|
||||
|
||||
|
||||
* The human species version of [/mob/living/carbon/proc/get_biological_state]. Depends on the HAS_FLESH and HAS_BONE species traits, having bones lets you have bone wounds, having flesh lets you have burn, slash, and piercing wounds
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/datum/species/proc/get_biological_state(mob/living/carbon/human/H)
|
||||
. = BIO_INORGANIC
|
||||
if(HAS_FLESH in species_traits)
|
||||
. |= BIO_JUST_FLESH
|
||||
if(HAS_BONE in species_traits)
|
||||
. |= BIO_JUST_BONE
|
||||
|
||||
/////////////
|
||||
//BREATHING//
|
||||
/////////////
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
id = "abductor"
|
||||
say_mod = "gibbers"
|
||||
sexes = FALSE
|
||||
species_traits = list(NOBLOOD,NOEYES,NOGENITALS,NOAROUSAL,CAN_SCAR)
|
||||
species_traits = list(NOBLOOD,NOEYES,NOGENITALS,NOAROUSAL,HAS_FLESH,HAS_BONE)
|
||||
inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_CHUNKYFINGERS,TRAIT_NOHUNGER,TRAIT_NOBREATH)
|
||||
mutanttongue = /obj/item/organ/tongue/abductor
|
||||
species_type = "alien"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Angel"
|
||||
id = "angel"
|
||||
default_color = "FFFFFF"
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,CAN_SCAR)
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,HAS_FLESH,HAS_BONE)
|
||||
mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "wings" = "Angel")
|
||||
use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM
|
||||
no_equip = list(SLOT_BACK)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
id = "insect"
|
||||
say_mod = "chitters"
|
||||
default_color = "00FF00"
|
||||
species_traits = list(LIPS,EYECOLOR,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR,CAN_SCAR)
|
||||
species_traits = list(LIPS,EYECOLOR,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE)
|
||||
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
|
||||
mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_tail" = "None", "mam_ears" = "None",
|
||||
"insect_wings" = "None", "insect_fluff" = "None", "mam_snouts" = "None", "taur" = "None", "insect_markings" = "None")
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
name = "Dullahan"
|
||||
id = "dullahan"
|
||||
default_color = "FFFFFF"
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS)
|
||||
inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH,CAN_SCAR)
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,HAS_FLESH,HAS_BONE)
|
||||
inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
|
||||
mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "deco_wings" = "None")
|
||||
use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM
|
||||
mutant_brain = /obj/item/organ/brain/dullahan
|
||||
|
||||
@@ -6,7 +6,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
|
||||
name = "Dwarf"
|
||||
id = "dwarf" //Also called Homo sapiens pumilionis
|
||||
default_color = "FFFFFF"
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,CAN_SCAR)
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,HAS_FLESH,HAS_BONE)
|
||||
inherent_traits = list(TRAIT_DWARF,TRAIT_SNOB)
|
||||
limbs_id = "human"
|
||||
use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Anthromorphic Fly"
|
||||
id = "fly"
|
||||
say_mod = "buzzes"
|
||||
species_traits = list(NOEYES,CAN_SCAR)
|
||||
species_traits = list(NOEYES,HAS_FLESH,HAS_BONE)
|
||||
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
|
||||
mutanttongue = /obj/item/organ/tongue/fly
|
||||
mutantliver = /obj/item/organ/liver/fly
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
id = "mammal"
|
||||
default_color = "4B4B4B"
|
||||
icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR,CAN_SCAR)
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE)
|
||||
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BEAST
|
||||
mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None",
|
||||
"mam_body_markings" = "Husky", "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian")
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
id = "human"
|
||||
default_color = "FFFFFF"
|
||||
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR,CAN_SCAR)
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR,HAS_FLESH,HAS_BONE)
|
||||
mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF","mcolor3" = "FFFFFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None")
|
||||
use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM
|
||||
skinned_type = /obj/item/stack/sheet/animalhide/human
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
|
||||
blacklisted = 0
|
||||
sexes = 0
|
||||
species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING)
|
||||
species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING,HAS_FLESH,HAS_BONE)
|
||||
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
|
||||
mutant_bodyparts = list("ipc_screen" = "Blank", "ipc_antenna" = "None")
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
id = "jelly"
|
||||
default_color = "00FF90"
|
||||
say_mod = "chirps"
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,WINGCOLOR)
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,WINGCOLOR,HAS_FLESH,HAS_BONE)
|
||||
mutantlungs = /obj/item/organ/lungs/slime
|
||||
mutant_heart = /obj/item/organ/heart/slime
|
||||
mutant_bodyparts = list("mcolor" = "FFFFFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None", "deco_wings" = "None")
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
id = "lizard"
|
||||
say_mod = "hisses"
|
||||
default_color = "00FF00"
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR,WINGCOLOR,CAN_SCAR)
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE)
|
||||
mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur", "deco_wings")
|
||||
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE
|
||||
mutanttongue = /obj/item/organ/tongue/lizard
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
nojumpsuit = TRUE
|
||||
|
||||
say_mod = "poofs" //what does a mushroom sound like
|
||||
species_traits = list(MUTCOLORS, NOEYES, NO_UNDERWEAR,NOGENITALS,NOAROUSAL,CAN_SCAR)
|
||||
species_traits = list(MUTCOLORS, NOEYES, NO_UNDERWEAR,NOGENITALS,NOAROUSAL,HAS_FLESH,HAS_BONE)
|
||||
inherent_traits = list(TRAIT_NOBREATH)
|
||||
speedmod = 1.5 //faster than golems but not by much
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
say_mod = "rattles"
|
||||
sexes = 0
|
||||
meat = /obj/item/stack/sheet/mineral/plasma
|
||||
species_traits = list(NOBLOOD,NOTRANSSTING,NOGENITALS)
|
||||
species_traits = list(NOBLOOD,NOTRANSSTING,NOGENITALS,HAS_BONE)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER,TRAIT_CALCIUM_HEALER)
|
||||
inherent_biotypes = MOB_HUMANOID|MOB_MINERAL
|
||||
mutantlungs = /obj/item/organ/lungs/plasmaman
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
name = "Anthromorphic Plant"
|
||||
id = "pod"
|
||||
default_color = "59CE00"
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,CAN_SCAR)
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,CAN_SCAR,HAS_FLESH,HAS_BONE)
|
||||
attack_verb = "slash"
|
||||
attack_sound = 'sound/weapons/slice.ogg'
|
||||
miss_sound = 'sound/weapons/slashmiss.ogg'
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
blacklisted = 1
|
||||
ignored_by = list(/mob/living/simple_animal/hostile/faithless)
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/shadow
|
||||
species_traits = list(NOBLOOD,NOEYES,CAN_SCAR)
|
||||
inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH,CAN_SCAR)
|
||||
species_traits = list(NOBLOOD,NOEYES,HAS_FLESH,HAS_BONE)
|
||||
inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH)
|
||||
|
||||
dangerous_existence = 1
|
||||
mutanteyes = /obj/item/organ/eyes/night_vision
|
||||
@@ -166,7 +166,7 @@
|
||||
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
||||
item_flags = ABSTRACT | DROPDEL
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
total_mass = TOTAL_MASS_HAND_REPLACEMENT
|
||||
|
||||
/obj/item/light_eater/Initialize()
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
blacklisted = 0
|
||||
sexes = 0
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
|
||||
species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL)
|
||||
species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL,HAS_BONE)
|
||||
inherent_traits = list(TRAIT_NOBREATH,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
|
||||
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
|
||||
mutanttongue = /obj/item/organ/tongue/bone
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
|
||||
say_mod = "beeps"
|
||||
default_color = "00FF00"
|
||||
species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR)
|
||||
species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR,HAS_FLESH,HAS_BONE)
|
||||
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
|
||||
mutant_bodyparts = list("ipc_antenna" = "Synthetic Lizard - Antennae","mam_tail" = "Synthetic Lizard", "mam_snouts" = "Synthetic Lizard - Snout", "legs" = "Digitigrade", "mam_body_markings" = "Synthetic Lizard - Plates", "taur" = "None")
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Vampire"
|
||||
id = "vampire"
|
||||
default_color = "FFFFFF"
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD)
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD,HAS_FLESH,HAS_BONE)
|
||||
inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
|
||||
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
|
||||
mutant_bodyparts = list("mcolor" = "FFFFFF", "tail_human" = "None", "ears" = "None", "deco_wings" = "None")
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
sexes = 0
|
||||
blacklisted = 1
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
|
||||
species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING,CAN_SCAR)
|
||||
species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING,HAS_FLESH,HAS_BONE)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH)
|
||||
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
|
||||
mutanttongue = /obj/item/organ/tongue/zombie
|
||||
@@ -45,7 +45,7 @@
|
||||
/datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount)
|
||||
. = min(20, amount)
|
||||
|
||||
/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE)
|
||||
/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
|
||||
. = ..()
|
||||
if(.)
|
||||
regen_cooldown = world.time + REGENERATION_DELAY
|
||||
@@ -63,9 +63,9 @@
|
||||
C.heal_overall_damage(heal_amt,heal_amt)
|
||||
C.adjustToxLoss(-heal_amt)
|
||||
for(var/i in C.all_wounds)
|
||||
var/datum/wound/W = i
|
||||
if(prob(4-W.severity))
|
||||
W.remove_wound()
|
||||
var/datum/wound/iter_wound = i
|
||||
if(prob(4-iter_wound.severity))
|
||||
iter_wound.remove_wound()
|
||||
if(!C.InCritical() && prob(4))
|
||||
playsound(C, pick(spooks), 50, TRUE, 10)
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
*
|
||||
* Returns TRUE if damage applied
|
||||
*/
|
||||
/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE)
|
||||
/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
|
||||
var/hit_percent = (100-blocked)/100
|
||||
if(!damage || (hit_percent <= 0))
|
||||
return 0
|
||||
@@ -245,7 +245,7 @@
|
||||
update_stamina()
|
||||
|
||||
// damage ONE external organ, organ gets randomly selected from damaged ones.
|
||||
/mob/living/proc/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE)
|
||||
/mob/living/proc/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
|
||||
adjustBruteLoss(brute, FALSE) //zero as argument for no instant health update
|
||||
adjustFireLoss(burn, FALSE)
|
||||
adjustStaminaLoss(stamina, FALSE)
|
||||
|
||||
@@ -605,41 +605,55 @@
|
||||
SEND_SIGNAL(item, COMSIG_ITEM_WEARERCROSSED, AM)
|
||||
|
||||
/mob/living/proc/makeTrail(turf/target_turf, turf/start, direction)
|
||||
if(!has_gravity())
|
||||
if(!has_gravity() || !isturf(start) || !blood_volume)
|
||||
return
|
||||
var/blood_exists = FALSE
|
||||
var/blood_exists = locate(/obj/effect/decal/cleanable/trail_holder) in start
|
||||
|
||||
for(var/obj/effect/decal/cleanable/trail_holder/C in start) //checks for blood splatter already on the floor
|
||||
blood_exists = TRUE
|
||||
if(isturf(start))
|
||||
var/trail_type = getTrail()
|
||||
if(trail_type)
|
||||
var/brute_ratio = round(getBruteLoss() / maxHealth, 0.1)
|
||||
if(blood_volume && blood_volume > max((BLOOD_VOLUME_NORMAL*blood_ratio)*(1 - brute_ratio * 0.25), 0))//don't leave trail if blood volume below a threshold
|
||||
blood_volume = max(blood_volume - max(1, brute_ratio * 2), 0) //that depends on our brute damage.
|
||||
var/newdir = get_dir(target_turf, start)
|
||||
if(newdir != direction)
|
||||
newdir = newdir | direction
|
||||
if(newdir == 3) //N + S
|
||||
newdir = NORTH
|
||||
else if(newdir == 12) //E + W
|
||||
newdir = EAST
|
||||
if((newdir in GLOB.cardinals) && (prob(50)))
|
||||
newdir = turn(get_dir(target_turf, start), 180)
|
||||
if(!blood_exists)
|
||||
new /obj/effect/decal/cleanable/trail_holder(start, get_static_viruses())
|
||||
var/trail_type = getTrail()
|
||||
if(!trail_type)
|
||||
return
|
||||
|
||||
for(var/obj/effect/decal/cleanable/trail_holder/TH in start)
|
||||
if((!(newdir in TH.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && TH.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled)
|
||||
TH.existing_dirs += newdir
|
||||
TH.add_overlay(image('icons/effects/blood.dmi', trail_type, dir = newdir))
|
||||
TH.transfer_mob_blood_dna(src)
|
||||
var/brute_ratio = round(getBruteLoss() / maxHealth, 0.1)
|
||||
if(blood_volume < max(BLOOD_VOLUME_NORMAL*(1 - brute_ratio * 0.25), 0))//don't leave trail if blood volume below a threshold
|
||||
return
|
||||
|
||||
var/bleed_amount = bleedDragAmount()
|
||||
blood_volume = max(blood_volume - bleed_amount, 0) //that depends on our brute damage.
|
||||
var/newdir = get_dir(target_turf, start)
|
||||
if(newdir != direction)
|
||||
newdir = newdir | direction
|
||||
if(newdir == (NORTH|SOUTH))
|
||||
newdir = NORTH
|
||||
else if(newdir == (EAST|WEST))
|
||||
newdir = EAST
|
||||
if((newdir in GLOB.cardinals) && (prob(50)))
|
||||
newdir = turn(get_dir(target_turf, start), 180)
|
||||
if(!blood_exists)
|
||||
new /obj/effect/decal/cleanable/trail_holder(start, get_static_viruses())
|
||||
|
||||
for(var/obj/effect/decal/cleanable/trail_holder/TH in start)
|
||||
if((!(newdir in TH.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && TH.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled)
|
||||
TH.existing_dirs += newdir
|
||||
TH.add_overlay(image('icons/effects/blood.dmi', trail_type, dir = newdir))
|
||||
TH.transfer_mob_blood_dna(src)
|
||||
|
||||
/mob/living/carbon/human/makeTrail(turf/T)
|
||||
if((NOBLOOD in dna.species.species_traits) || !is_bleeding() || bleedsuppress)
|
||||
return
|
||||
..()
|
||||
|
||||
///Returns how much blood we're losing from being dragged a tile, from [mob/living/proc/makeTrail]
|
||||
/mob/living/proc/bleedDragAmount()
|
||||
var/brute_ratio = round(getBruteLoss() / maxHealth, 0.1)
|
||||
return max(1, brute_ratio * 2)
|
||||
|
||||
/mob/living/carbon/bleedDragAmount()
|
||||
var/bleed_amount = 0
|
||||
for(var/i in all_wounds)
|
||||
var/datum/wound/iter_wound = i
|
||||
bleed_amount += iter_wound.drag_bleed_amount()
|
||||
return bleed_amount
|
||||
|
||||
/mob/living/proc/getTrail()
|
||||
if(getBruteLoss() < 300)
|
||||
return pick("ltrails_1", "ltrails_2")
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
totaldamage = block_calculate_resultant_damage(totaldamage, returnlist)
|
||||
var/armor = run_armor_check(def_zone, P.flag, null, null, P.armour_penetration, null)
|
||||
if(!P.nodamage)
|
||||
apply_damage(totaldamage, P.damage_type, def_zone, armor, wound_bonus=P.wound_bonus, bare_wound_bonus=P.bare_wound_bonus, sharpness=P.sharpness)
|
||||
apply_damage(totaldamage, P.damage_type, def_zone, armor, wound_bonus = P.wound_bonus, bare_wound_bonus = P.bare_wound_bonus, sharpness = P.sharpness)
|
||||
if(P.dismemberment)
|
||||
check_projectile_dismemberment(P, def_zone)
|
||||
var/missing = 100 - final_percent
|
||||
@@ -136,12 +136,13 @@
|
||||
dtype = I.damtype
|
||||
|
||||
if(!blocked)
|
||||
visible_message("<span class='danger'>[src] has been hit by [I].</span>", \
|
||||
"<span class='userdanger'>You have been hit by [I].</span>")
|
||||
var/armor = run_armor_check(impacting_zone, "melee", "Your armor has protected your [parse_zone(impacting_zone)].", "Your armor has softened hit to your [parse_zone(impacting_zone)].",I.armour_penetration)
|
||||
apply_damage(total_damage, dtype, impacting_zone, armor, sharpness=I.sharpness)
|
||||
if(I.thrownby)
|
||||
log_combat(I.thrownby, src, "threw and hit", I)
|
||||
if(!nosell_hit)
|
||||
visible_message("<span class='danger'>[src] is hit by [I]!</span>", \
|
||||
"<span class='userdanger'>You're hit by [I]!</span>")
|
||||
if(!I.throwforce)
|
||||
return
|
||||
var/armor = run_armor_check(impacting_zone, "melee", "Your armor has protected your [parse_zone(impacting_zone)].", "Your armor has softened hit to your [parse_zone(impacting_zone)].",I.armour_penetration)
|
||||
apply_damage(I.throwforce, dtype, impacting_zone, armor, sharpness=I.get_sharpness(), wound_bonus=(nosell_hit * CANT_WOUND))
|
||||
else
|
||||
return 1
|
||||
else
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE)
|
||||
/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
|
||||
var/hit_percent = (100-blocked)/100
|
||||
if(!damage || (!forced && hit_percent <= 0))
|
||||
return 0
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
melee_damage_upper = 15
|
||||
wound_bonus = -5
|
||||
bare_wound_bonus = 10 // BEAR wound bonus am i right
|
||||
sharpness = TRUE
|
||||
sharpness = SHARP_EDGED
|
||||
attack_verb_continuous = "claws"
|
||||
attack_verb_simple = "claw"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
melee_damage_upper = 15
|
||||
wound_bonus = -10
|
||||
bare_wound_bonus = 20
|
||||
sharpness = TRUE
|
||||
sharpness = SHARP_EDGED
|
||||
icon_state = "syndicate_knife"
|
||||
icon_living = "syndicate_knife"
|
||||
loot = list(/obj/effect/gibspawner/human)
|
||||
|
||||
@@ -145,7 +145,7 @@
|
||||
//How much bare wounding power it has
|
||||
var/bare_wound_bonus = 0
|
||||
//If the attacks from this are sharp
|
||||
var/sharpness = FALSE
|
||||
var/sharpness = SHARP_NONE
|
||||
|
||||
/mob/living/simple_animal/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
block_chance = 50
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
max_integrity = 200
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
|
||||
@@ -14,5 +14,5 @@
|
||||
|
||||
/obj/item/throwing_star/ninja
|
||||
name = "ninja throwing star"
|
||||
throwforce = 30
|
||||
throwforce = 20
|
||||
embedding = list("pain_mult" = 6, "embed_chance" = 100, "fall_chance" = 0, "embed_chance_turf_mod" = 15)
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
var/degrees = 0
|
||||
var/font = PEN_FONT
|
||||
embedding = list()
|
||||
sharpness = SHARP_POINTY
|
||||
|
||||
/obj/item/pen/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is scribbling numbers all over [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit sudoku...</span>")
|
||||
@@ -84,7 +85,7 @@
|
||||
throw_speed = 4
|
||||
colour = "crimson"
|
||||
custom_materials = list(/datum/material/gold = 750)
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
resistance_flags = FIRE_PROOF
|
||||
unique_reskin = list("Oak" = "pen-fountain-o",
|
||||
"Gold" = "pen-fountain-g",
|
||||
@@ -180,7 +181,7 @@
|
||||
*/
|
||||
/obj/item/pen/edagger
|
||||
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
var/on = FALSE
|
||||
embedding = list(embed_chance = EMBED_CHANCE)
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
/obj/item/ammo_box/c38/dumdum
|
||||
name = "speed loader (.38 DumDum)"
|
||||
desc = "Designed to quickly reload revolvers. DumDum bullets shatter on impact and shred the target's innards, likely getting caught inside."
|
||||
desc = "Designed to quickly reload revolvers. These rounds expand on impact, allowing them to shred the target and cause massive bleeding. Very weak against armor and distant targets."
|
||||
ammo_type = /obj/item/ammo_casing/c38/dumdum
|
||||
|
||||
/obj/item/ammo_box/c38/match
|
||||
|
||||
@@ -193,7 +193,8 @@
|
||||
return
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
for(var/datum/wound/W in C.all_wounds)
|
||||
for(var/i in C.all_wounds)
|
||||
var/datum/wound/W = i
|
||||
if(W.try_treating(src, user))
|
||||
return // another coward cured!
|
||||
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
flags_1 = CONDUCT_1
|
||||
attack_verb = list("attacked", "slashed", "cut", "sliced")
|
||||
force = 12
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
inaccuracy_modifier = 0.25
|
||||
can_charge = 0
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
force = 20
|
||||
armour_penetration = 75
|
||||
block_chance = 50
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
max_charges = 4
|
||||
|
||||
/obj/item/gun/magic/staff/spellblade/Initialize()
|
||||
|
||||
@@ -149,19 +149,25 @@
|
||||
|
||||
var/temporary_unstoppable_movement = FALSE
|
||||
|
||||
///If defined, on hit we create an item of this type then call hitby() on the hit target with this
|
||||
///If defined, on hit we create an item of this type then call hitby() on the hit target with this, mainly used for embedding items (bullets) in targets
|
||||
var/shrapnel_type
|
||||
///If TRUE, hit mobs even if they're on the floor and not our target
|
||||
var/hit_stunned_targets = FALSE
|
||||
|
||||
wound_bonus = CANT_WOUND
|
||||
///How much we want to drop both wound_bonus and bare_wound_bonus (to a minimum of 0 for the latter) per tile, for falloff purposes
|
||||
var/wound_falloff_tile
|
||||
///How much we want to drop the embed_chance value, if we can embed, per tile, for falloff purposes
|
||||
var/embed_falloff_tile
|
||||
/// For telling whether we want to roll for bone breaking or lacerations if we're bothering with wounds
|
||||
sharpness = FALSE
|
||||
sharpness = SHARP_NONE
|
||||
|
||||
/obj/item/projectile/Initialize()
|
||||
. = ..()
|
||||
permutated = list()
|
||||
decayedRange = range
|
||||
if(embedding)
|
||||
updateEmbedding()
|
||||
|
||||
/**
|
||||
* Artificially modified to be called at around every world.icon_size pixels of movement.
|
||||
@@ -169,6 +175,11 @@
|
||||
*/
|
||||
/obj/item/projectile/proc/Range()
|
||||
range--
|
||||
if(wound_bonus != CANT_WOUND)
|
||||
wound_bonus += wound_falloff_tile
|
||||
bare_wound_bonus = max(0, bare_wound_bonus + wound_falloff_tile)
|
||||
if(embedding)
|
||||
embedding["embed_chance"] += embed_falloff_tile
|
||||
if(range <= 0 && loc)
|
||||
on_range()
|
||||
|
||||
|
||||
@@ -8,4 +8,12 @@
|
||||
flag = "bullet"
|
||||
hitsound_wall = "ricochet"
|
||||
impact_effect_type = /obj/effect/temp_visual/impact_effect
|
||||
sharpness = TRUE
|
||||
sharpness = SHARP_POINTY
|
||||
shrapnel_type = /obj/item/shrapnel/bullet
|
||||
embedding = list(embed_chance=15, fall_chance=2, jostle_chance=0, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.5, pain_mult=3, rip_time=10)
|
||||
wound_falloff_tile = -5
|
||||
embed_falloff_tile = -5
|
||||
|
||||
/obj/item/projectile/bullet/smite
|
||||
name = "divine retribution"
|
||||
damage = 10
|
||||
|
||||
@@ -25,8 +25,10 @@
|
||||
|
||||
/obj/item/projectile/bullet/mm195x129
|
||||
name = "1.95x129mm bullet"
|
||||
damage = 45
|
||||
damage = 40
|
||||
armour_penetration = 5
|
||||
wound_bonus = -50
|
||||
wound_falloff_tile = 0
|
||||
|
||||
/obj/item/projectile/bullet/mm195x129_ap
|
||||
name = "1.95x129mm armor-piercing bullet"
|
||||
@@ -35,8 +37,12 @@
|
||||
|
||||
/obj/item/projectile/bullet/mm195x129_hp
|
||||
name = "1.95x129mm hollow-point bullet"
|
||||
damage = 60
|
||||
damage = 50
|
||||
armour_penetration = -60
|
||||
sharpness = SHARP_EDGED
|
||||
wound_bonus = -40
|
||||
bare_wound_bonus = 30
|
||||
wound_falloff_tile = -8
|
||||
|
||||
/obj/item/projectile/bullet/incendiary/mm195x129
|
||||
name = "1.95x129mm incendiary bullet"
|
||||
|
||||
@@ -3,11 +3,13 @@
|
||||
/obj/item/projectile/bullet/c9mm
|
||||
name = "9mm bullet"
|
||||
damage = 20
|
||||
embedding = list(embed_chance=15, fall_chance=3, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10)
|
||||
|
||||
/obj/item/projectile/bullet/c9mm_ap
|
||||
name = "9mm armor-piercing bullet"
|
||||
damage = 15
|
||||
armour_penetration = 40
|
||||
embedding = null
|
||||
|
||||
/obj/item/projectile/bullet/incendiary/c9mm
|
||||
name = "9mm incendiary bullet"
|
||||
|
||||
@@ -19,8 +19,9 @@
|
||||
ricochet_chance = 50
|
||||
ricochet_auto_aim_angle = 10
|
||||
ricochet_auto_aim_range = 3
|
||||
wound_bonus = -35
|
||||
sharpness = TRUE
|
||||
wound_bonus = -20
|
||||
bare_wound_bonus = 10
|
||||
embedding = list(embed_chance=15, fall_chance=2, jostle_chance=2, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=3, jostle_pain_mult=5, rip_time=10)
|
||||
|
||||
/obj/item/projectile/bullet/c38/match
|
||||
name = ".38 Match bullet"
|
||||
@@ -43,13 +44,21 @@
|
||||
ricochet_chance = 130
|
||||
ricochet_decay_damage = 0.8
|
||||
shrapnel_type = NONE
|
||||
sharpness = SHARP_NONE
|
||||
embedding = null
|
||||
|
||||
// premium .38 ammo from cargo, weak against armor, lower base damage, but excellent at embedding and causing slice wounds at close range
|
||||
/obj/item/projectile/bullet/c38/dumdum
|
||||
name = ".38 DumDum bullet"
|
||||
damage = 15
|
||||
armour_penetration = -30
|
||||
ricochets_max = 0
|
||||
shrapnel_type = /obj/item/shrapnel/bullet/c38/dumdum
|
||||
sharpness = SHARP_EDGED
|
||||
wound_bonus = 20
|
||||
bare_wound_bonus = 20
|
||||
embedding = list(embed_chance=75, fall_chance=3, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10)
|
||||
wound_falloff_tile = -5
|
||||
embed_falloff_tile = -15
|
||||
|
||||
/obj/item/projectile/bullet/c38/rubber
|
||||
name = ".38 rubber bullet"
|
||||
@@ -102,6 +111,7 @@
|
||||
/obj/item/projectile/bullet/a357
|
||||
name = ".357 bullet"
|
||||
damage = 60
|
||||
wound_bonus = -70
|
||||
|
||||
/obj/item/projectile/bullet/a357/ap
|
||||
name = ".357 armor-piercing bullet"
|
||||
|
||||
@@ -3,12 +3,15 @@
|
||||
/obj/item/projectile/bullet/a556
|
||||
name = "5.56mm bullet"
|
||||
damage = 35
|
||||
wound_bonus = -40
|
||||
|
||||
// 7.62 (Nagant Rifle)
|
||||
|
||||
/obj/item/projectile/bullet/a762
|
||||
name = "7.62 bullet"
|
||||
damage = 60
|
||||
wound_bonus = -35
|
||||
wound_falloff_tile = 0
|
||||
|
||||
/obj/item/projectile/bullet/a762_enchanted
|
||||
name = "enchanted 7.62 bullet"
|
||||
|
||||
@@ -1,23 +1,26 @@
|
||||
/obj/item/projectile/bullet/shotgun_slug
|
||||
name = "12g shotgun slug"
|
||||
damage = 60
|
||||
damage = 50
|
||||
sharpness = SHARP_POINTY
|
||||
wound_bonus = 0
|
||||
|
||||
/obj/item/projectile/bullet/shotgun_slug/executioner
|
||||
name = "executioner slug" // admin only, can dismember limbs
|
||||
sharpness = TRUE
|
||||
wound_bonus = 0
|
||||
sharpness = SHARP_EDGED
|
||||
wound_bonus = 80
|
||||
|
||||
/obj/item/projectile/bullet/shotgun_slug/pulverizer
|
||||
name = "pulverizer slug" // admin only, can crush bones
|
||||
sharpness = FALSE
|
||||
wound_bonus = 0
|
||||
sharpness = SHARP_NONE
|
||||
wound_bonus = 80
|
||||
|
||||
/obj/item/projectile/bullet/shotgun_beanbag
|
||||
name = "beanbag slug"
|
||||
damage = 10
|
||||
stamina = 70
|
||||
wound_bonus = 20
|
||||
sharpness = FALSE
|
||||
sharpness = SHARP_NONE
|
||||
embedding = null
|
||||
|
||||
/obj/item/projectile/bullet/incendiary/shotgun
|
||||
name = "incendiary slug"
|
||||
@@ -83,18 +86,22 @@
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/obj/item/projectile/bullet/pellet
|
||||
var/tile_dropoff = 0.75
|
||||
var/tile_dropoff = 0.45
|
||||
var/tile_dropoff_s = 1.25
|
||||
|
||||
/obj/item/projectile/bullet/pellet/shotgun_buckshot
|
||||
name = "buckshot pellet"
|
||||
damage = 12.5
|
||||
wound_bonus = -10
|
||||
damage = 7.5
|
||||
wound_bonus = 5
|
||||
bare_wound_bonus = 5
|
||||
wound_falloff_tile = -2.5 // low damage + additional dropoff will already curb wounding potential anything past point blank
|
||||
|
||||
/obj/item/projectile/bullet/pellet/shotgun_rubbershot
|
||||
name = "rubbershot pellet"
|
||||
damage = 2
|
||||
stamina = 15
|
||||
sharpness = SHARP_NONE
|
||||
embedding = null
|
||||
|
||||
/obj/item/projectile/bullet/pellet/Range()
|
||||
..()
|
||||
@@ -106,8 +113,10 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/item/projectile/bullet/pellet/shotgun_improvised
|
||||
tile_dropoff = 0.55 //Come on it does 6 damage don't be like that.
|
||||
tile_dropoff = 0.35 //Come on it does 6 damage don't be like that.
|
||||
damage = 6
|
||||
wound_bonus = 0
|
||||
bare_wound_bonus = 7.5
|
||||
|
||||
/obj/item/projectile/bullet/pellet/shotgun_improvised/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
/obj/item/projectile/bullet/c45
|
||||
name = ".45 bullet"
|
||||
damage = 30
|
||||
wound_bonus = -10
|
||||
wound_falloff_tile = -10
|
||||
|
||||
/obj/item/projectile/bullet/c45_cleaning
|
||||
name = ".45 bullet"
|
||||
@@ -51,11 +53,15 @@
|
||||
/obj/item/projectile/bullet/c46x30mm
|
||||
name = "4.6x30mm bullet"
|
||||
damage = 15
|
||||
wound_bonus = -5
|
||||
bare_wound_bonus = 5
|
||||
embed_falloff_tile = -4
|
||||
|
||||
/obj/item/projectile/bullet/c46x30mm_ap
|
||||
name = "4.6x30mm armor-piercing bullet"
|
||||
damage = 12.5
|
||||
armour_penetration = 40
|
||||
embedding = null
|
||||
|
||||
/obj/item/projectile/bullet/incendiary/c46x30mm
|
||||
name = "4.6x30mm incendiary bullet"
|
||||
|
||||
@@ -217,6 +217,9 @@
|
||||
/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M)
|
||||
if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER))
|
||||
M.heal_bodypart_damage(1.5,0, 0)
|
||||
for(var/i in M.all_wounds)
|
||||
var/datum/wound/iter_wound = i
|
||||
iter_wound.on_xadone(2)
|
||||
. = 1
|
||||
else
|
||||
if(M.getBruteLoss() && prob(20))
|
||||
@@ -1013,4 +1016,23 @@
|
||||
if(M.getToxLoss() && prob(30))
|
||||
M.adjustToxLoss(-1, 0)
|
||||
..()
|
||||
. = TRUE
|
||||
. = TRUE
|
||||
|
||||
// i googled "natural coagulant" and a couple of results came up for banana peels, so after precisely 30 more seconds of research, i now dub grinding banana peels good for your blood
|
||||
/datum/reagent/consumable/banana_peel
|
||||
name = "Pulped Banana Peel"
|
||||
description = "Okay, so you put a banana peel in a grinder... Why, exactly?"
|
||||
color = "#863333" // rgb: 175, 175, 0
|
||||
reagent_state = SOLID
|
||||
taste_description = "stringy, bitter pulp"
|
||||
glass_name = "glass of banana peel pulp"
|
||||
glass_desc = "Okay, so you put a banana peel in a grinder... Why, exactly?"
|
||||
|
||||
/datum/reagent/consumable/baked_banana_peel
|
||||
name = "Baked Banana Peel Powder"
|
||||
description = "You took a banana peel... pulped it... baked it... Where are you going with this?"
|
||||
color = "#863333" // rgb: 175, 175, 0
|
||||
reagent_state = SOLID
|
||||
taste_description = "bitter powder"
|
||||
glass_name = "glass of banana peel powder"
|
||||
description = "You took a banana peel... pulped it... baked it... Where are you going with this?"
|
||||
|
||||
@@ -145,8 +145,8 @@
|
||||
M.adjustToxLoss(-power, 0, TRUE) //heals TOXINLOVERs
|
||||
M.adjustCloneLoss(-power, 0)
|
||||
for(var/i in M.all_wounds)
|
||||
var/datum/wound/W = i
|
||||
W.on_xadone(power)
|
||||
var/datum/wound/iter_wound = i
|
||||
iter_wound.on_xadone(power)
|
||||
REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) //fixes common causes for disfiguration
|
||||
. = 1
|
||||
metabolization_rate = REAGENTS_METABOLISM * (0.00001 * (M.bodytemperature ** 2) + 0.5)
|
||||
@@ -196,8 +196,8 @@
|
||||
M.adjustToxLoss(-power, 0, TRUE)
|
||||
M.adjustCloneLoss(-power, 0)
|
||||
for(var/i in M.all_wounds)
|
||||
var/datum/wound/W = i
|
||||
W.on_xadone(power)
|
||||
var/datum/wound/iter_wound = i
|
||||
iter_wound.on_xadone(power)
|
||||
REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC)
|
||||
. = 1
|
||||
..()
|
||||
@@ -365,7 +365,7 @@
|
||||
|
||||
/datum/reagent/medicine/salglu_solution
|
||||
name = "Saline-Glucose Solution"
|
||||
description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute."
|
||||
description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute, as well as slowly speeding blood regeneration."
|
||||
reagent_state = LIQUID
|
||||
color = "#DCDCDC"
|
||||
metabolization_rate = 0.5 * REAGENTS_METABOLISM
|
||||
@@ -373,6 +373,7 @@
|
||||
taste_description = "sweetness and salt"
|
||||
var/last_added = 0
|
||||
var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active
|
||||
var/extra_regen = 0.25 // in addition to acting as temporary blood, also add this much to their actual blood per tick
|
||||
pH = 5.5
|
||||
|
||||
/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M)
|
||||
@@ -385,7 +386,7 @@
|
||||
var/amount_to_add = min(M.blood_volume, volume*5)
|
||||
var/new_blood_level = min(M.blood_volume + amount_to_add, maximum_reachable)
|
||||
last_added = new_blood_level - M.blood_volume
|
||||
M.blood_volume = new_blood_level
|
||||
M.blood_volume = new_blood_level + extra_regen
|
||||
if(prob(33))
|
||||
M.adjustBruteLoss(-0.5*REM, 0)
|
||||
M.adjustFireLoss(-0.5*REM, 0)
|
||||
@@ -471,8 +472,9 @@
|
||||
else if(method in list(PATCH, TOUCH))
|
||||
M.adjustBruteLoss(-1 * reac_volume)
|
||||
M.adjustFireLoss(-1 * reac_volume)
|
||||
for(var/datum/wound/burn/burn_wound in C.all_wounds)
|
||||
burn_wound.regenerate_flesh(reac_volume)
|
||||
for(var/i in C.all_wounds)
|
||||
var/datum/wound/iter_wound = i
|
||||
iter_wound.on_synthflesh(reac_volume)
|
||||
if(show_message)
|
||||
to_chat(M, "<span class='danger'>You feel your burns and bruises healing! It stings like hell!</span>")
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
|
||||
@@ -1592,10 +1594,56 @@
|
||||
to_chat(C, "[pick(GLOB.wisdoms)]") //give them a random wisdom
|
||||
..()
|
||||
|
||||
// handled in cut wounds process
|
||||
// helps bleeding wounds clot faster
|
||||
/datum/reagent/medicine/coagulant
|
||||
name = "Sanguirite"
|
||||
description = "A coagulant used to help open cuts clot faster."
|
||||
description = "A proprietary coagulant used to help bleeding wounds clot faster."
|
||||
reagent_state = LIQUID
|
||||
color = "#bb2424"
|
||||
metabolization_rate = 0.25 * REAGENTS_METABOLISM
|
||||
overdose_threshold = 20
|
||||
/// How much base clotting we do per bleeding wound, multiplied by the below number for each bleeding wound
|
||||
var/clot_rate = 0.25
|
||||
/// If we have multiple bleeding wounds, we count the number of bleeding wounds, then multiply the clot rate by this^(n) before applying it to each cut, so more cuts = less clotting per cut (though still more total clotting)
|
||||
var/clot_coeff_per_wound = 0.9
|
||||
|
||||
/datum/reagent/medicine/coagulant/on_mob_life(mob/living/carbon/M)
|
||||
. = ..()
|
||||
if(!M.blood_volume || !M.all_wounds)
|
||||
return
|
||||
|
||||
var/effective_clot_rate = clot_rate
|
||||
|
||||
for(var/i in M.all_wounds)
|
||||
var/datum/wound/iter_wound = i
|
||||
if(iter_wound.blood_flow)
|
||||
effective_clot_rate *= clot_coeff_per_wound
|
||||
|
||||
for(var/i in M.all_wounds)
|
||||
var/datum/wound/iter_wound = i
|
||||
iter_wound.blood_flow = max(0, iter_wound.blood_flow - effective_clot_rate)
|
||||
|
||||
/datum/reagent/medicine/coagulant/overdose_process(mob/living/M)
|
||||
. = ..()
|
||||
if(!M.blood_volume)
|
||||
return
|
||||
|
||||
if(prob(15))
|
||||
M.losebreath += rand(2,4)
|
||||
M.adjustOxyLoss(rand(1,3))
|
||||
if(prob(30))
|
||||
to_chat(M, "<span class='danger'>You can feel your blood clotting up in your veins!</span>")
|
||||
else if(prob(10))
|
||||
to_chat(M, "<span class='userdanger'>You feel like your blood has stopped moving!</span>")
|
||||
if(prob(50))
|
||||
var/obj/item/organ/lungs/our_lungs = M.getorganslot(ORGAN_SLOT_LUNGS)
|
||||
our_lungs.applyOrganDamage(1)
|
||||
else
|
||||
var/obj/item/organ/heart/our_heart = M.getorganslot(ORGAN_SLOT_HEART)
|
||||
our_heart.applyOrganDamage(1)
|
||||
|
||||
// can be synthesized on station rather than bought. made by grinding a banana peel, heating it up, then mixing the banana peel powder with salglu
|
||||
/datum/reagent/medicine/coagulant/weak
|
||||
name = "Synthi-Sanguirite"
|
||||
description = "A synthetic coagulant used to help bleeding wounds clot faster. Not quite as effective as name brand Sanguirite, especially on patients with lots of cuts."
|
||||
clot_coeff_per_wound = 0.8
|
||||
|
||||
@@ -244,6 +244,11 @@
|
||||
glass_desc = "The father of all refreshments."
|
||||
shot_glass_icon_state = "shotglassclear"
|
||||
|
||||
/datum/reagent/water/on_mob_life(mob/living/carbon/M)
|
||||
. = ..()
|
||||
if(M.blood_volume)
|
||||
M.blood_volume += 0.1 // water is good for you!
|
||||
|
||||
/*
|
||||
* Water reaction to turf
|
||||
*/
|
||||
@@ -334,6 +339,8 @@
|
||||
return ..()
|
||||
|
||||
/datum/reagent/water/holywater/on_mob_life(mob/living/carbon/M)
|
||||
if(M.blood_volume)
|
||||
M.blood_volume += 0.1 // water is good for you!
|
||||
if(!data)
|
||||
data = list("misc" = 1)
|
||||
data["misc"]++
|
||||
@@ -2304,6 +2311,7 @@
|
||||
metabolization_rate = 0.75 * REAGENTS_METABOLISM // 5u (WOUND_DETERMINATION_CRITICAL) will last for ~17 ticks
|
||||
/// Whether we've had at least WOUND_DETERMINATION_SEVERE (2.5u) of determination at any given time. No damage slowdown immunity or indication we're having a second wind if it's just a single moderate wound
|
||||
var/significant = FALSE
|
||||
self_consuming = TRUE
|
||||
|
||||
/datum/reagent/determination/on_mob_end_metabolize(mob/living/carbon/M)
|
||||
if(significant)
|
||||
@@ -2337,7 +2345,6 @@
|
||||
color = "#E6E6DA"
|
||||
taste_mult = 0
|
||||
|
||||
|
||||
/datum/reagent/hairball
|
||||
name = "Hairball"
|
||||
description = "A bundle of keratinous bits and fibers, not easily digestible."
|
||||
@@ -2385,4 +2392,4 @@
|
||||
M.reagents.del_reagent(/datum/reagent/hairball)
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
|
||||
@@ -50,6 +50,18 @@
|
||||
results = list(/datum/reagent/medicine/salglu_solution = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1)
|
||||
|
||||
/datum/chemical_reaction/baked_banana_peel
|
||||
results = list(/datum/reagent/consumable/baked_banana_peel = 1)
|
||||
required_temp = 413.15 // if it's good enough for caramel it's good enough for this
|
||||
required_reagents = list(/datum/reagent/consumable/banana_peel = 1)
|
||||
mix_message = "The pulp dries up and takes on a powdery state!"
|
||||
mob_react = FALSE
|
||||
|
||||
/datum/chemical_reaction/coagulant_weak
|
||||
results = list(/datum/reagent/medicine/coagulant/weak = 3)
|
||||
required_reagents = list(/datum/reagent/medicine/salglu_solution = 2, /datum/reagent/consumable/baked_banana_peel = 1)
|
||||
mob_react = FALSE
|
||||
|
||||
/datum/chemical_reaction/mine_salve
|
||||
name = "Miner's Salve"
|
||||
id = /datum/reagent/medicine/mine_salve
|
||||
|
||||
@@ -135,11 +135,18 @@
|
||||
|
||||
/obj/item/reagent_containers/hypospray/medipen/ekit
|
||||
name = "emergency first-aid autoinjector"
|
||||
desc = "An epinephrine medipen with trace amounts of coagulants and antibiotics to help stabilize bad cuts and burns."
|
||||
desc = "An epinephrine medipen with extra coagulant and antibiotics to help stabilize bad cuts and burns."
|
||||
volume = 15
|
||||
amount_per_transfer_from_this = 15
|
||||
list_reagents = list(/datum/reagent/medicine/epinephrine = 12, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/medicine/spaceacillin = 0.5)
|
||||
|
||||
/obj/item/reagent_containers/hypospray/medipen/blood_loss
|
||||
name = "hypovolemic-response autoinjector"
|
||||
desc = "A medipen designed to stabilize and rapidly reverse severe bloodloss."
|
||||
volume = 15
|
||||
amount_per_transfer_from_this = 15
|
||||
list_reagents = list(/datum/reagent/medicine/epinephrine = 5, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/iron = 3.5, /datum/reagent/medicine/salglu_solution = 4)
|
||||
|
||||
/obj/item/reagent_containers/hypospray/medipen/stimulants
|
||||
name = "illegal stimpack medipen"
|
||||
desc = "A highly illegal medipen due to its load and small injections, allow for five uses before being drained"
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
custom_materials = list(/datum/material/iron=10, /datum/material/glass=20)
|
||||
reagent_flags = TRANSPARENT
|
||||
custom_price = PRICE_CHEAP_AS_FREE
|
||||
sharpness = SHARP_POINTY
|
||||
|
||||
/obj/item/reagent_containers/syringe/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -86,12 +86,12 @@
|
||||
|
||||
/// A hat won't cover your face, but a shirt covering your chest will cover your... you know, chest
|
||||
var/scars_covered_by_clothes = TRUE
|
||||
/// Descriptions for the locations on the limb for scars to be assigned, just cosmetic
|
||||
var/list/specific_locations = list("general area")
|
||||
/// So we know if we need to scream if this limb hits max damage
|
||||
var/last_maxed
|
||||
/// How much generic bleedstacks we have on this bodypart
|
||||
var/generic_bleedstacks
|
||||
/// If we have a gauze wrapping currently applied (not including splints)
|
||||
var/obj/item/stack/current_gauze
|
||||
|
||||
/obj/item/bodypart/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -151,8 +151,20 @@
|
||||
var/turf/T = get_turf(src)
|
||||
if(status != BODYPART_ROBOTIC)
|
||||
playsound(T, 'sound/misc/splort.ogg', 50, 1, -1)
|
||||
for(var/obj/item/I in src)
|
||||
I.forceMove(T)
|
||||
if(current_gauze)
|
||||
QDEL_NULL(current_gauze)
|
||||
for(var/obj/item/organ/drop_organ in get_organs())
|
||||
drop_organ.transfer_to_limb(src, owner)
|
||||
|
||||
///since organs aren't actually stored in the bodypart themselves while attached to a person, we have to query the owner for what we should have
|
||||
/obj/item/bodypart/proc/get_organs()
|
||||
if(!owner)
|
||||
return
|
||||
. = list()
|
||||
for(var/i in owner.internal_organs) //internal organs inside the dismembered limb are dropped.
|
||||
var/obj/item/organ/organ_check = i
|
||||
if(check_zone(organ_check.zone) == body_zone)
|
||||
. += organ_check
|
||||
|
||||
/obj/item/bodypart/proc/consider_processing()
|
||||
if(stamina_dam > DAMAGE_PRECISION)
|
||||
@@ -171,7 +183,7 @@
|
||||
//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all.
|
||||
//Damage will not exceed max_damage using this proc
|
||||
//Cannot apply negative damage
|
||||
/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, blocked = 0, updating_health = TRUE, required_status = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) // maybe separate BRUTE_SHARP and BRUTE_OTHER eventually somehow hmm
|
||||
/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, blocked = 0, updating_health = TRUE, required_status = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) // maybe separate BRUTE_SHARP and BRUTE_OTHER eventually somehow hmm
|
||||
if(owner && (owner.status_flags & GODMODE))
|
||||
return FALSE //godmode
|
||||
var/dmg_mlt = CONFIG_GET(number/damage_multiplier)
|
||||
@@ -192,16 +204,64 @@
|
||||
if(ALIEN_BODYPART,LARVA_BODYPART) //aliens take some additional burn //nothing can burn with so much snowflake code around
|
||||
burn *= 1.2
|
||||
|
||||
var/wounding_type = (brute > burn ? WOUND_BRUTE : WOUND_BURN)
|
||||
/*
|
||||
// START WOUND HANDLING
|
||||
*/
|
||||
|
||||
// what kind of wounds we're gonna roll for, take the greater between brute and burn, then if it's brute, we subdivide based on sharpness
|
||||
var/wounding_type = (brute > burn ? WOUND_BLUNT : WOUND_BURN)
|
||||
var/wounding_dmg = max(brute, burn)
|
||||
if(wounding_type == WOUND_BRUTE && sharpness)
|
||||
wounding_type = WOUND_SHARP
|
||||
// i know this is effectively the same check as above but i don't know if those can null the damage by rounding and want to be safe
|
||||
if(owner && wounding_dmg > 4 && wound_bonus != CANT_WOUND)
|
||||
// if you want to make tox wounds or some other type, this will need to be expanded and made more modular
|
||||
// handle all our wounding stuff
|
||||
var/mangled_state = get_mangled_state()
|
||||
var/bio_state = owner.get_biological_state()
|
||||
var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%)
|
||||
|
||||
if(wounding_type == WOUND_BLUNT)
|
||||
if(sharpness == SHARP_EDGED)
|
||||
wounding_type = WOUND_SLASH
|
||||
else if(sharpness == SHARP_POINTY)
|
||||
wounding_type = WOUND_PIERCE
|
||||
|
||||
//Handling for bone only/flesh only(none right now)/flesh and bone targets
|
||||
switch(bio_state)
|
||||
// if we're bone only, all cutting attacks go straight to the bone
|
||||
if(BIO_JUST_BONE)
|
||||
if(wounding_type == WOUND_SLASH)
|
||||
wounding_type = WOUND_BLUNT
|
||||
wounding_dmg *= (easy_dismember ? 1 : 0.5)
|
||||
else if(wounding_type == WOUND_PIERCE)
|
||||
wounding_type = WOUND_BLUNT
|
||||
wounding_dmg *= (easy_dismember ? 1 : 0.75)
|
||||
if((mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus))
|
||||
return
|
||||
// note that there's no handling for BIO_JUST_FLESH since we don't have any that are that right now (slimepeople maybe someday)
|
||||
// standard humanoids
|
||||
if(BIO_FLESH_BONE)
|
||||
// if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate
|
||||
// So a big sharp weapon is still all you need to destroy a limb
|
||||
if(mangled_state == BODYPART_MANGLED_FLESH && sharpness)
|
||||
playsound(src, "sound/effects/wounds/crackandbleed.ogg", 100)
|
||||
if(wounding_type == WOUND_SLASH && !easy_dismember)
|
||||
wounding_dmg *= 0.5 // edged weapons pass along 50% of their wounding damage to the bone since the power is spread out over a larger area
|
||||
if(wounding_type == WOUND_PIERCE && !easy_dismember)
|
||||
wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated
|
||||
wounding_type = WOUND_BLUNT
|
||||
else if(mangled_state == BODYPART_MANGLED_BOTH && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus))
|
||||
return
|
||||
|
||||
// now we have our wounding_type and are ready to carry on with wounds and dealing the actual damage
|
||||
if(owner && wounding_dmg >= WOUND_MINIMUM_DAMAGE && wound_bonus != CANT_WOUND)
|
||||
check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)
|
||||
|
||||
for(var/i in wounds)
|
||||
var/datum/wound/iter_wound = i
|
||||
iter_wound.receive_damage(wounding_type, wounding_dmg, wound_bonus)
|
||||
|
||||
/*
|
||||
// END WOUND HANDLING
|
||||
*/
|
||||
|
||||
//back to our regularly scheduled program, we now actually apply damage if there's room below limb damage cap
|
||||
|
||||
var/can_inflict = max_damage - get_damage()
|
||||
|
||||
var/total_damage = brute + burn
|
||||
@@ -213,10 +273,6 @@
|
||||
if(can_inflict <= 0)
|
||||
return FALSE
|
||||
|
||||
for(var/i in wounds)
|
||||
var/datum/wound/W = i
|
||||
W.receive_damage(wounding_type, wounding_dmg, wound_bonus)
|
||||
|
||||
brute_dam += brute
|
||||
burn_dam += burn
|
||||
|
||||
@@ -236,14 +292,58 @@
|
||||
update_disabled()
|
||||
return update_bodypart_damage_state()
|
||||
|
||||
/// Allows us to roll for and apply a wound without actually dealing damage. Used for aggregate wounding power with pellet clouds
|
||||
/obj/item/bodypart/proc/painless_wound_roll(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus, sharpness=SHARP_NONE)
|
||||
if(!owner || phantom_wounding_dmg <= WOUND_MINIMUM_DAMAGE || wound_bonus == CANT_WOUND)
|
||||
return
|
||||
|
||||
var/mangled_state = get_mangled_state()
|
||||
var/bio_state = owner.get_biological_state()
|
||||
var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%)
|
||||
|
||||
if(wounding_type == WOUND_BLUNT)
|
||||
if(sharpness == SHARP_EDGED)
|
||||
wounding_type = WOUND_SLASH
|
||||
else if(sharpness == SHARP_POINTY)
|
||||
wounding_type = WOUND_PIERCE
|
||||
|
||||
//Handling for bone only/flesh only(none right now)/flesh and bone targets
|
||||
switch(bio_state)
|
||||
// if we're bone only, all cutting attacks go straight to the bone
|
||||
if(BIO_JUST_BONE)
|
||||
if(wounding_type == WOUND_SLASH)
|
||||
wounding_type = WOUND_BLUNT
|
||||
phantom_wounding_dmg *= (easy_dismember ? 1 : 0.5)
|
||||
else if(wounding_type == WOUND_PIERCE)
|
||||
wounding_type = WOUND_BLUNT
|
||||
phantom_wounding_dmg *= (easy_dismember ? 1 : 0.75)
|
||||
if((mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus))
|
||||
return
|
||||
// note that there's no handling for BIO_JUST_FLESH since we don't have any that are that right now (slimepeople maybe someday)
|
||||
// standard humanoids
|
||||
if(BIO_FLESH_BONE)
|
||||
// if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate
|
||||
// So a big sharp weapon is still all you need to destroy a limb
|
||||
if(mangled_state == BODYPART_MANGLED_FLESH && sharpness)
|
||||
playsound(src, "sound/effects/wounds/crackandbleed.ogg", 100)
|
||||
if(wounding_type == WOUND_SLASH && !easy_dismember)
|
||||
phantom_wounding_dmg *= 0.5 // edged weapons pass along 50% of their wounding damage to the bone since the power is spread out over a larger area
|
||||
if(wounding_type == WOUND_PIERCE && !easy_dismember)
|
||||
phantom_wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated
|
||||
wounding_type = WOUND_BLUNT
|
||||
else if(mangled_state == BODYPART_MANGLED_BOTH && try_dismember(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus))
|
||||
return
|
||||
|
||||
check_wounding(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus)
|
||||
|
||||
/**
|
||||
* check_wounding() is where we handle rolling for, selecting, and applying a wound if we meet the criteria
|
||||
*
|
||||
* We generate a "score" for how woundable the attack was based on the damage and other factors discussed in [check_wounding_mods()], then go down the list from most severe to least severe wounds in that category.
|
||||
* We generate a "score" for how woundable the attack was based on the damage and other factors discussed in [/obj/item/bodypart/proc/check_wounding_mods], then go down the list from most severe to least severe wounds in that category.
|
||||
* We can promote a wound from a lesser to a higher severity this way, but we give up if we have a wound of the given type and fail to roll a higher severity, so no sidegrades/downgrades
|
||||
*
|
||||
* Arguments:
|
||||
* * woundtype- Either WOUND_SHARP, WOUND_BRUTE, or WOUND_BURN based on the attack type.
|
||||
* * woundtype- Either WOUND_BLUNT, WOUND_SLASH, WOUND_PIERCE, or WOUND_BURN based on the attack type.
|
||||
* * damage- How much damage is tied to this attack, since wounding potential scales with damage in an attack (see: WOUND_DAMAGE_EXPONENT)
|
||||
* * wound_bonus- The wound_bonus of an attack
|
||||
* * bare_wound_bonus- The bare_wound_bonus of an attack
|
||||
@@ -252,19 +352,24 @@
|
||||
// actually roll wounds if applicable
|
||||
if(HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE))
|
||||
damage *= 1.5
|
||||
else
|
||||
damage = min(damage, WOUND_MAX_CONSIDERED_DAMAGE)
|
||||
|
||||
var/base_roll = rand(1, round(damage ** WOUND_DAMAGE_EXPONENT))
|
||||
var/base_roll = rand(max(damage/1.5,25), round(damage ** WOUND_DAMAGE_EXPONENT))
|
||||
var/injury_roll = base_roll
|
||||
injury_roll += check_woundings_mods(woundtype, damage, wound_bonus, bare_wound_bonus)
|
||||
var/list/wounds_checking
|
||||
var/list/wounds_checking = GLOB.global_wound_types[woundtype]
|
||||
|
||||
switch(woundtype)
|
||||
if(WOUND_SHARP)
|
||||
wounds_checking = WOUND_LIST_CUT
|
||||
if(WOUND_BRUTE)
|
||||
wounds_checking = WOUND_LIST_BONE
|
||||
if(WOUND_BURN)
|
||||
wounds_checking = WOUND_LIST_BURN
|
||||
// quick re-check to see if bare_wound_bonus applies, for the benefit of log_wound(), see about getting the check from check_woundings_mods() somehow
|
||||
if(ishuman(owner))
|
||||
var/mob/living/carbon/human/human_wearer = owner
|
||||
var/list/clothing = human_wearer.clothingonpart(src)
|
||||
for(var/i in clothing)
|
||||
var/obj/item/clothing/clothes_check = i
|
||||
// unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary
|
||||
if(clothes_check.armor.getRating("wound"))
|
||||
bare_wound_bonus = 0
|
||||
break
|
||||
|
||||
//cycle through the wounds of the relevant category from the most severe down
|
||||
for(var/PW in wounds_checking)
|
||||
@@ -279,21 +384,22 @@
|
||||
replaced_wound = existing_wound
|
||||
|
||||
if(initial(possible_wound.threshold_minimum) < injury_roll)
|
||||
var/datum/wound/new_wound
|
||||
if(replaced_wound)
|
||||
var/datum/wound/new_wound = replaced_wound.replace_wound(possible_wound)
|
||||
log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll)
|
||||
new_wound = replaced_wound.replace_wound(possible_wound)
|
||||
log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) // dismembering wounds are logged in the apply_wound() for loss wounds since they delete themselves immediately, these will be immediately returned
|
||||
else
|
||||
var/datum/wound/new_wound = new possible_wound
|
||||
new_wound = new possible_wound
|
||||
new_wound.apply_wound(src)
|
||||
log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll)
|
||||
return
|
||||
return new_wound
|
||||
|
||||
// try forcing a specific wound, but only if there isn't already a wound of that severity or greater for that type on this bodypart
|
||||
/obj/item/bodypart/proc/force_wound_upwards(specific_woundtype, smited = FALSE)
|
||||
var/datum/wound/potential_wound = specific_woundtype
|
||||
for(var/i in wounds)
|
||||
var/datum/wound/existing_wound = i
|
||||
if(existing_wound.type in (initial(potential_wound.wound_type)))
|
||||
if(existing_wound.wound_type == initial(potential_wound.wound_type))
|
||||
if(existing_wound.severity < initial(potential_wound.severity)) // we only try if the existing one is inferior to the one we're trying to force
|
||||
existing_wound.replace_wound(potential_wound, smited)
|
||||
return
|
||||
@@ -301,12 +407,20 @@
|
||||
var/datum/wound/new_wound = new potential_wound
|
||||
new_wound.apply_wound(src, smited = smited)
|
||||
|
||||
/**
|
||||
* check_wounding_mods() is where we handle the various modifiers of a wound roll
|
||||
*
|
||||
* A short list of things we consider: any armor a human target may be wearing, and if they have no wound armor on the limb, if we have a bare_wound_bonus to apply, plus the plain wound_bonus
|
||||
* We also flick through all of the wounds we currently have on this limb and add their threshold penalties, so that having lots of bad wounds makes you more liable to get hurt worse
|
||||
* Lastly, we add the inherent wound_resistance variable the bodypart has (heads and chests are slightly harder to wound), and a small bonus if the limb is already disabled
|
||||
*
|
||||
* Arguments:
|
||||
* * It's the same ones on [receive_damage]
|
||||
*/
|
||||
/obj/item/bodypart/proc/check_woundings_mods(wounding_type, damage, wound_bonus, bare_wound_bonus)
|
||||
var/armor_ablation = 0
|
||||
var/injury_mod = 0
|
||||
|
||||
//var/bwb = 0
|
||||
|
||||
if(owner && ishuman(owner))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
var/list/clothing = H.clothingonpart(src)
|
||||
@@ -314,7 +428,7 @@
|
||||
var/obj/item/clothing/C = c
|
||||
// unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary
|
||||
armor_ablation += C.armor.getRating("wound")
|
||||
if(wounding_type == WOUND_SHARP)
|
||||
if(wounding_type == WOUND_SLASH)
|
||||
C.take_damage_zone(body_zone, damage, BRUTE, armour_penetration)
|
||||
else if(wounding_type == WOUND_BURN && damage >= 10) // lazy way to block freezing from shredding clothes without adding another var onto apply_damage()
|
||||
C.take_damage_zone(body_zone, damage, BURN, armour_penetration)
|
||||
@@ -330,7 +444,7 @@
|
||||
injury_mod += W.threshold_penalty
|
||||
|
||||
var/part_mod = -wound_resistance
|
||||
if(is_disabled())
|
||||
if(get_damage(TRUE) >= max_damage)
|
||||
part_mod += disabled_wound_penalty
|
||||
|
||||
injury_mod += part_mod
|
||||
@@ -383,11 +497,11 @@
|
||||
return BODYPART_DISABLED_WOUND
|
||||
if(can_dismember() && !HAS_TRAIT(owner, TRAIT_NODISMEMBER))
|
||||
. = disabled //inertia, to avoid limbs healing 0.1 damage and being re-enabled
|
||||
if((get_damage(TRUE) >= max_damage) || (HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE) && (get_damage(TRUE) >= (max_damage * 0.6)))) //Easy limb disable disables the limb at 40% health instead of 0%
|
||||
if(get_damage(TRUE) >= max_damage * (HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE) ? 0.6 : 1)) //Easy limb disable disables the limb at 40% health instead of 0%
|
||||
if(!last_maxed)
|
||||
owner.emote("scream")
|
||||
last_maxed = TRUE
|
||||
if(!is_organic_limb())
|
||||
if(!is_organic_limb() || stamina_dam >= max_damage)
|
||||
return BODYPART_DISABLED_DAMAGE
|
||||
else if(disabled && (get_damage(TRUE) <= (max_damage * 0.8))) // reenabled at 80% now instead of 50% as of wounds update
|
||||
last_maxed = FALSE
|
||||
@@ -741,17 +855,29 @@
|
||||
/obj/item/bodypart/proc/get_wound_type(checking_type)
|
||||
if(isnull(wounds))
|
||||
return
|
||||
for(var/thing in wounds)
|
||||
var/datum/wound/W = thing
|
||||
if(istype(W, checking_type))
|
||||
return W
|
||||
for(var/i in wounds)
|
||||
if(istype(i, checking_type))
|
||||
return i
|
||||
|
||||
/// very rough start for updating efficiency and other stats on a body part whenever a wound is gained/lost
|
||||
/obj/item/bodypart/proc/update_wounds()
|
||||
/**
|
||||
* update_wounds() is called whenever a wound is gained or lost on this bodypart, as well as if there's a change of some kind on a bone wound possibly changing disabled status
|
||||
*
|
||||
* Covers tabulating the damage multipliers we have from wounds (burn specifically), as well as deleting our gauze wrapping if we don't have any wounds that can use bandaging
|
||||
*
|
||||
* Arguments:
|
||||
* * replaced- If true, this is being called from the remove_wound() of a wound that's being replaced, so the bandage that already existed is still relevant, but the new wound hasn't been added yet
|
||||
*/
|
||||
/obj/item/bodypart/proc/update_wounds(replaced = FALSE)
|
||||
var/dam_mul = 1 //initial(wound_damage_multiplier)
|
||||
// we can only have one wound per type, but remember there's multiple types
|
||||
for(var/datum/wound/W in wounds)
|
||||
dam_mul *= W.damage_mulitplier_penalty
|
||||
// we can (normally) only have one wound per type, but remember there's multiple types (smites like :B:loodless can generate multiple cuts on a limb)
|
||||
for(var/i in wounds)
|
||||
var/datum/wound/iter_wound = i
|
||||
dam_mul *= iter_wound.damage_mulitplier_penalty
|
||||
|
||||
if(!LAZYLEN(wounds) && current_gauze && !replaced)
|
||||
owner.visible_message("<span class='notice'>\The [current_gauze] on [owner]'s [name] fall away.</span>", "<span class='notice'>The [current_gauze] on your [name] fall away.</span>")
|
||||
QDEL_NULL(current_gauze)
|
||||
wound_damage_multiplier = dam_mul
|
||||
update_disabled()
|
||||
|
||||
@@ -761,8 +887,6 @@
|
||||
var/bleed_rate = 0
|
||||
if(generic_bleedstacks > 0)
|
||||
bleed_rate++
|
||||
if(brute_dam >= 40)
|
||||
bleed_rate += (brute_dam * 0.008)
|
||||
|
||||
//We want an accurate reading of .len
|
||||
listclearnulls(embedded_objects)
|
||||
@@ -773,5 +897,40 @@
|
||||
for(var/thing in wounds)
|
||||
var/datum/wound/W = thing
|
||||
bleed_rate += W.blood_flow
|
||||
|
||||
if(owner.mobility_flags & ~MOBILITY_STAND)
|
||||
bleed_rate *= 0.75
|
||||
return bleed_rate
|
||||
|
||||
/**
|
||||
* apply_gauze() is used to- well, apply gauze to a bodypart
|
||||
*
|
||||
* As of the Wounds 2 PR, all bleeding is now bodypart based rather than the old bleedstacks system, and 90% of standard bleeding comes from flesh wounds (the exception is embedded weapons).
|
||||
* The same way bleeding is totaled up by bodyparts, gauze now applies to all wounds on the same part. Thus, having a slash wound, a pierce wound, and a broken bone wound would have the gauze
|
||||
* applying blood staunching to the first two wounds, while also acting as a sling for the third one. Once enough blood has been absorbed or all wounds with the ACCEPTS_GAUZE flag have been cleared,
|
||||
* the gauze falls off.
|
||||
*
|
||||
* Arguments:
|
||||
* * gauze- Just the gauze stack we're taking a sheet from to apply here
|
||||
*/
|
||||
/obj/item/bodypart/proc/apply_gauze(obj/item/stack/gauze)
|
||||
if(!istype(gauze) || !gauze.absorption_capacity)
|
||||
return
|
||||
QDEL_NULL(current_gauze)
|
||||
current_gauze = new gauze.type(src, 1)
|
||||
gauze.use(1)
|
||||
|
||||
/**
|
||||
* seep_gauze() is for when a gauze wrapping absorbs blood or pus from wounds, lowering its absorption capacity.
|
||||
*
|
||||
* The passed amount of seepage is deducted from the bandage's absorption capacity, and if we reach a negative absorption capacity, the bandages fall off and we're left with nothing.
|
||||
*
|
||||
* Arguments:
|
||||
* * seep_amt - How much absorption capacity we're removing from our current bandages (think, how much blood or pus are we soaking up this tick?)
|
||||
*/
|
||||
/obj/item/bodypart/proc/seep_gauze(seep_amt = 0)
|
||||
if(!current_gauze)
|
||||
return
|
||||
current_gauze.absorption_capacity -= seep_amt
|
||||
if(current_gauze.absorption_capacity < 0)
|
||||
owner.visible_message("<span class='danger'>\The [current_gauze] on [owner]'s [name] fall away in rags.</span>", "<span class='warning'>\The [current_gauze] on your [name] fall away in rags.</span>", vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
QDEL_NULL(current_gauze)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
return TRUE
|
||||
|
||||
//Dismember a limb
|
||||
/obj/item/bodypart/proc/dismember(dam_type = BRUTE)
|
||||
/obj/item/bodypart/proc/dismember(dam_type = BRUTE, silent=TRUE)
|
||||
if(!owner)
|
||||
return FALSE
|
||||
var/mob/living/carbon/C = owner
|
||||
@@ -16,7 +16,8 @@
|
||||
return FALSE
|
||||
var/obj/item/bodypart/affecting = C.get_bodypart(BODY_ZONE_CHEST)
|
||||
affecting.receive_damage(clamp(brute_dam/2 * affecting.body_damage_coeff, 15, 50), clamp(burn_dam/2 * affecting.body_damage_coeff, 0, 50), wound_bonus=CANT_WOUND) //Damage the chest based on limb's existing damage
|
||||
C.visible_message("<span class='danger'><B>[C]'s [src.name] has been violently dismembered!</B></span>")
|
||||
if(!silent)
|
||||
C.visible_message("<span class='danger'><B>[C]'s [name] is violently dismembered!</B></span>")
|
||||
C.emote("scream")
|
||||
SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered)
|
||||
drop_limb()
|
||||
@@ -30,6 +31,7 @@
|
||||
burn()
|
||||
return TRUE
|
||||
add_mob_blood(C)
|
||||
C.bleed(rand(20, 40))
|
||||
var/direction = pick(GLOB.cardinals)
|
||||
var/t_range = rand(2,max(throw_range/2, 2))
|
||||
var/turf/target_turf = get_turf(src)
|
||||
@@ -80,8 +82,6 @@
|
||||
if(organ_spilled)
|
||||
C.visible_message("<span class='danger'><B>[C]'s internal organs spill out onto the floor!</B></span>")
|
||||
|
||||
|
||||
|
||||
//limb removal. The "special" argument is used for swapping a limb with a new one without the effects of losing a limb kicking in.
|
||||
/obj/item/bodypart/proc/drop_limb(special, dismembered)
|
||||
if(!owner)
|
||||
@@ -153,7 +153,52 @@
|
||||
|
||||
forceMove(Tsec)
|
||||
|
||||
/**
|
||||
* get_mangled_state() is relevant for flesh and bone bodyparts, and returns whether this bodypart has mangled skin, mangled bone, or both (or neither i guess)
|
||||
*
|
||||
* Dismemberment for flesh and bone requires the victim to have the skin on their bodypart destroyed (either a critical cut or piercing wound), and at least a hairline fracture
|
||||
* (severe bone), at which point we can start rolling for dismembering. The attack must also deal at least 10 damage, and must be a brute attack of some kind (sorry for now, cakehat, maybe later)
|
||||
*
|
||||
* Returns: BODYPART_MANGLED_NONE if we're fine, BODYPART_MANGLED_FLESH if our skin is broken, BODYPART_MANGLED_BONE if our bone is broken, or BODYPART_MANGLED_BOTH if both are broken and we're up for dismembering
|
||||
*/
|
||||
/obj/item/bodypart/proc/get_mangled_state()
|
||||
. = BODYPART_MANGLED_NONE
|
||||
|
||||
for(var/i in wounds)
|
||||
var/datum/wound/iter_wound = i
|
||||
if((iter_wound.wound_flags & MANGLES_BONE))
|
||||
. |= BODYPART_MANGLED_BONE
|
||||
if((iter_wound.wound_flags & MANGLES_FLESH))
|
||||
. |= BODYPART_MANGLED_FLESH
|
||||
|
||||
/**
|
||||
* try_dismember() is used, once we've confirmed that a flesh and bone bodypart has both the skin and bone mangled, to actually roll for it
|
||||
*
|
||||
* Mangling is described in the above proc, [/obj/item/bodypart/proc/get_mangled_state()]. This simply makes the roll for whether we actually dismember or not
|
||||
* using how damaged the limb already is, and how much damage this blow was for. If we have a critical bone wound instead of just a severe, we add +10% to the roll.
|
||||
* Lastly, we choose which kind of dismember we want based on the wounding type we hit with. Note we don't care about all the normal mods or armor for this
|
||||
*
|
||||
* Arguments:
|
||||
* * wounding_type: Either WOUND_BLUNT, WOUND_SLASH, or WOUND_PIERCE, basically only matters for the dismember message
|
||||
* * wounding_dmg: The damage of the strike that prompted this roll, higher damage = higher chance
|
||||
* * wound_bonus: Not actually used right now, but maybe someday
|
||||
* * bare_wound_bonus: ditto above
|
||||
*/
|
||||
/obj/item/bodypart/proc/try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)
|
||||
if(wounding_dmg < DISMEMBER_MINIMUM_DAMAGE)
|
||||
return
|
||||
|
||||
var/base_chance = wounding_dmg + (get_damage() / max_damage * 50) // how much damage we dealt with this blow, + 50% of the damage percentage we already had on this bodypart
|
||||
if(locate(/datum/wound/blunt/critical) in wounds) // we only require a severe bone break, but if there's a critical bone break, we'll add 10% more
|
||||
base_chance += 10
|
||||
|
||||
if(!prob(base_chance))
|
||||
return
|
||||
|
||||
var/datum/wound/loss/dismembering = new
|
||||
dismembering.apply_dismember(src, wounding_type)
|
||||
|
||||
return TRUE
|
||||
|
||||
//when a limb is dropped, the internal organs are removed from the mob and put into the limb
|
||||
/obj/item/organ/proc/transfer_to_limb(obj/item/bodypart/LB, mob/living/carbon/C)
|
||||
@@ -378,7 +423,7 @@
|
||||
/mob/living/carbon/regenerate_limb(limb_zone, noheal)
|
||||
var/obj/item/bodypart/L
|
||||
if(get_bodypart(limb_zone))
|
||||
return 0
|
||||
return FALSE
|
||||
L = newBodyPart(limb_zone, 0, 0)
|
||||
if(L)
|
||||
if(!noheal)
|
||||
@@ -386,6 +431,8 @@
|
||||
L.burn_dam = 0
|
||||
L.brutestate = 0
|
||||
L.burnstate = 0
|
||||
|
||||
var/datum/scar/scaries = new
|
||||
var/datum/wound/loss/phantom_loss = new // stolen valor, really
|
||||
scaries.generate(L, phantom_loss)
|
||||
L.attach_limb(src, 1)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
@@ -36,11 +36,10 @@
|
||||
var/custom_head
|
||||
|
||||
wound_resistance = 10
|
||||
specific_locations = list("left eyebrow", "cheekbone", "neck", "throat", "jawline", "entire face")
|
||||
scars_covered_by_clothes = FALSE
|
||||
|
||||
/obj/item/bodypart/head/can_dismember(obj/item/I)
|
||||
if(!((owner.stat == DEAD) || owner.InFullCritical()))
|
||||
if(owner && !((owner.stat == DEAD) || owner.InFullCritical()))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
var/obj/item/cavity_item
|
||||
|
||||
/obj/item/bodypart/chest/can_dismember(obj/item/I)
|
||||
if(!((owner.stat == DEAD) || owner.InFullCritical()))
|
||||
if(!((owner.stat == DEAD) || owner.InFullCritical()) || !get_organs())
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
target_mobtypes = list(/mob/living/carbon/human)
|
||||
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
|
||||
requires_real_bodypart = TRUE
|
||||
targetable_wound = /datum/wound/brute/bone/severe
|
||||
targetable_wound = /datum/wound/blunt/severe
|
||||
|
||||
/datum/surgery/repair_bone_hairline/can_start(mob/living/user, mob/living/carbon/target)
|
||||
if(..())
|
||||
@@ -23,7 +23,7 @@
|
||||
target_mobtypes = list(/mob/living/carbon/human)
|
||||
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
|
||||
requires_real_bodypart = TRUE
|
||||
targetable_wound = /datum/wound/brute/bone/critical
|
||||
targetable_wound = /datum/wound/blunt/critical
|
||||
|
||||
/datum/surgery/repair_bone_compound/can_start(mob/living/user, mob/living/carbon/target)
|
||||
if(..())
|
||||
|
||||
@@ -94,7 +94,8 @@
|
||||
log_combat(user, target, "dressed burns in", addition="INTENT: [uppertext(user.a_intent)]")
|
||||
burn_wound.sanitization += 3
|
||||
burn_wound.flesh_healing += 5
|
||||
burn_wound.force_bandage(tool)
|
||||
var/obj/item/bodypart/the_part = target.get_bodypart(target_zone)
|
||||
the_part.apply_gauze(tool)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[target] has no burns there!</span>")
|
||||
return ..()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user