Merge remote-tracking branch 'origin/master' into TGUI-4

This commit is contained in:
Letter N
2020-08-06 18:26:04 +08:00
222 changed files with 2630 additions and 1031 deletions
+46 -25
View File
@@ -32681,6 +32681,10 @@
/obj/effect/turf_decal/tile/neutral{ /obj/effect/turf_decal/tile/neutral{
dir = 8 dir = 8
}, },
/obj/machinery/light{
dir = 1;
light_color = "#cee5d2"
},
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/foyer) /area/ai_monitored/turret_protected/aisat/foyer)
"blC" = ( "blC" = (
@@ -36118,13 +36122,9 @@
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior) /area/ai_monitored/turret_protected/aisat_interior)
"bsf" = ( "bsf" = (
/obj/machinery/light,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{ /obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4 dir = 4
}, },
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/foyer) /area/ai_monitored/turret_protected/aisat/foyer)
"bsg" = ( "bsg" = (
@@ -37682,16 +37682,10 @@
/turf/closed/wall, /turf/closed/wall,
/area/aisat) /area/aisat)
"bvu" = ( "bvu" = (
/obj/structure/table/wood,
/obj/machinery/light/small{ /obj/machinery/light/small{
dir = 8 dir = 8
}, },
/obj/item/radio/off{ /obj/machinery/announcement_system,
pixel_y = 4
},
/obj/item/screwdriver{
pixel_y = 10
},
/turf/open/floor/plasteel/grimy, /turf/open/floor/plasteel/grimy,
/area/tcommsat/computer) /area/tcommsat/computer)
"bvv" = ( "bvv" = (
@@ -40188,12 +40182,15 @@
/area/tcommsat/computer) /area/tcommsat/computer)
"bAW" = ( "bAW" = (
/obj/structure/table/wood, /obj/structure/table/wood,
/obj/item/folder/blue,
/obj/machinery/status_display/evac{ /obj/machinery/status_display/evac{
pixel_y = 31 pixel_y = 31
}, },
/obj/item/folder/blue, /obj/item/radio/off{
/obj/item/pen, pixel_y = 4
},
/obj/item/screwdriver{
pixel_y = 10
},
/turf/open/floor/plasteel/grimy, /turf/open/floor/plasteel/grimy,
/area/tcommsat/computer) /area/tcommsat/computer)
"bAX" = ( "bAX" = (
@@ -42716,9 +42713,12 @@
/turf/open/floor/carpet, /turf/open/floor/carpet,
/area/crew_quarters/theatre) /area/crew_quarters/theatre)
"bGh" = ( "bGh" = (
/obj/machinery/announcement_system, /obj/effect/turf_decal/tile/blue,
/turf/open/floor/plasteel/grimy, /obj/effect/turf_decal/tile/blue{
/area/tcommsat/computer) dir = 1
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/foyer)
"bGj" = ( "bGj" = (
/obj/machinery/vending/cola/random, /obj/machinery/vending/cola/random,
/obj/machinery/newscaster{ /obj/machinery/newscaster{
@@ -81595,6 +81595,10 @@
}, },
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/hallway/primary/port) /area/hallway/primary/port)
"jQK" = (
/obj/structure/lattice,
/turf/closed/wall/r_wall,
/area/aisat)
"jRo" = ( "jRo" = (
/obj/structure/table/wood, /obj/structure/table/wood,
/obj/machinery/newscaster{ /obj/machinery/newscaster{
@@ -81912,6 +81916,16 @@
/obj/machinery/door/firedoor, /obj/machinery/door/firedoor,
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/hallway/primary/port) /area/hallway/primary/port)
"nix" = (
/obj/machinery/light/small{
dir = 8
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/foyer)
"njd" = ( "njd" = (
/obj/machinery/atmospherics/components/binary/pump{ /obj/machinery/atmospherics/components/binary/pump{
dir = 8; dir = 8;
@@ -82580,6 +82594,13 @@
}, },
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/starboard) /area/maintenance/starboard)
"txh" = (
/obj/machinery/door/airlock/hatch{
name = "Telecomms Control Room";
req_one_access_txt = "19; 61"
},
/turf/open/floor/plasteel/dark,
/area/tcommsat/computer)
"txj" = ( "txj" = (
/obj/structure/chair/office/light{ /obj/structure/chair/office/light{
dir = 1 dir = 1
@@ -136361,9 +136382,9 @@ bnw
bpJ bpJ
brW brW
aRy aRy
bvt aRy
aaa aRy
aTU jQK
aaa aaa
aaa aaa
aaa aaa
@@ -136617,9 +136638,9 @@ blC
bnx bnx
bpK bpK
bsf bsf
aRy bGh
aRy nix
aRy bGh
aRy aRy
aRy aRy
aRy aRy
@@ -136876,7 +136897,7 @@ bpL
brY brY
btL btL
btL btL
btL txh
btL btL
btL btL
bCD bCD
@@ -137133,7 +137154,7 @@ bpM
brZ brZ
btL btL
bvu bvu
bGh bxq
bzn bzn
bAU bAU
bCD bCD
+4
View File
@@ -144,6 +144,10 @@
#define WINGCOLOR 26 #define WINGCOLOR 26
#define CAN_SCAR 27 // If this species can be scarred (fleshy) #define CAN_SCAR 27 // If this species can be scarred (fleshy)
/// Used for determining which wounds are applicable to this species.
#define HAS_FLESH 28 /// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD)
#define HAS_BONE 29 /// if we have bones (can suffer bone wounds)
//organ slots //organ slots
#define ORGAN_SLOT_BRAIN "brain" #define ORGAN_SLOT_BRAIN "brain"
#define ORGAN_SLOT_APPENDIX "appendix" #define ORGAN_SLOT_APPENDIX "appendix"
+1
View File
@@ -80,6 +80,7 @@
#define ADMIN_PUNISHMENT_SCARIFY "Scarify" #define ADMIN_PUNISHMENT_SCARIFY "Scarify"
#define ADMIN_PUNISHMENT_PICKLE "Pickle-ify" #define ADMIN_PUNISHMENT_PICKLE "Pickle-ify"
#define ADMIN_PUNISHMENT_FRY "Fry" #define ADMIN_PUNISHMENT_FRY "Fry"
#define ADMIN_PUNISHMENT_PERFORATE ":B:erforate"
#define AHELP_ACTIVE 1 #define AHELP_ACTIVE 1
#define AHELP_CLOSED 2 #define AHELP_CLOSED 2
+3 -3
View File
@@ -209,9 +209,9 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define GUN_AIMING_TIME (2 SECONDS) #define GUN_AIMING_TIME (2 SECONDS)
//Object/Item sharpness //Object/Item sharpness
#define IS_BLUNT 0 #define SHARP_NONE 0
#define IS_SHARP 1 #define SHARP_EDGED 1
#define IS_SHARP_ACCURATE 2 #define SHARP_POINTY 2
//His Grace. //His Grace.
#define HIS_GRACE_SATIATED 0 //He hungers not. If bloodthirst is set to this, His Grace is asleep. #define HIS_GRACE_SATIATED 0 //He hungers not. If bloodthirst is set to this, His Grace is asleep.
+2 -2
View File
@@ -356,8 +356,8 @@
#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user) #define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user)
// /obj/item/projectile signals (sent to the firer) // /obj/item/projectile signals (sent to the firer)
#define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) #define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit" ///from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle, hit_limb)
#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) #define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" ///from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle, hit_limb)
#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/item/projectile/proc/fire(): (obj/item/projectile, atom/original_target) #define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/item/projectile/proc/fire(): (obj/item/projectile, atom/original_target)
#define COMSIG_PROJECTILE_FIRE "projectile_fire" ///from the base of /obj/item/projectile/proc/fire(): () #define COMSIG_PROJECTILE_FIRE "projectile_fire" ///from the base of /obj/item/projectile/proc/fire(): ()
#define COMSIG_PROJECTILE_RANGE_OUT "projectile_range_out" // sent to targets during the process_hit proc of projectiles #define COMSIG_PROJECTILE_RANGE_OUT "projectile_range_out" // sent to targets during the process_hit proc of projectiles
-8
View File
@@ -199,14 +199,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isclothing(A) (istype(A, /obj/item/clothing)) #define isclothing(A) (istype(A, /obj/item/clothing))
GLOBAL_LIST_INIT(pointed_types, typecacheof(list(
/obj/item/pen,
/obj/item/screwdriver,
/obj/item/reagent_containers/syringe,
/obj/item/kitchen/fork)))
#define is_pointed(W) (is_type_in_typecache(W, GLOB.pointed_types))
#define isbodypart(A) (istype(A, /obj/item/bodypart)) #define isbodypart(A) (istype(A, /obj/item/bodypart))
#define isprojectile(A) (istype(A, /obj/item/projectile)) #define isprojectile(A) (istype(A, /obj/item/projectile))
+3
View File
@@ -435,6 +435,9 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define ION_FILE "ion_laws.json" #define ION_FILE "ion_laws.json"
#define REDPILL_FILE "redpill.json" #define REDPILL_FILE "redpill.json"
#define PIRATE_NAMES_FILE "pirates.json" #define PIRATE_NAMES_FILE "pirates.json"
#define FLESH_SCAR_FILE "wounds/flesh_scar_desc.json"
#define BONE_SCAR_FILE "wounds/bone_scar_desc.json"
#define SCAR_LOC_FILE "wounds/scar_loc.json"
//Fullscreen overlay resolution in tiles. //Fullscreen overlay resolution in tiles.
+1 -1
View File
@@ -19,7 +19,7 @@
/// Size of EACH left/right border icon for volumetric boxes /// Size of EACH left/right border icon for volumetric boxes
#define VOLUMETRIC_STORAGE_BOX_BORDER_SIZE 1 #define VOLUMETRIC_STORAGE_BOX_BORDER_SIZE 1
/// Minimum pixels an item must have in volumetric scaled storage UI /// Minimum pixels an item must have in volumetric scaled storage UI
#define MINIMUM_PIXELS_PER_ITEM 8 #define MINIMUM_PIXELS_PER_ITEM 16
/// Maximum number of objects that will be allowed to be displayed using the volumetric display system. Arbitrary number to prevent server lockups. /// Maximum number of objects that will be allowed to be displayed using the volumetric display system. Arbitrary number to prevent server lockups.
#define MAXIMUM_VOLUMETRIC_ITEMS 256 #define MAXIMUM_VOLUMETRIC_ITEMS 256
/// How much padding to give between items /// How much padding to give between items
+95 -19
View File
@@ -1,4 +1,13 @@
#define WOUND_DAMAGE_EXPONENT 1.4
#define WOUND_DAMAGE_EXPONENT 1.225
/// an attack must do this much damage after armor in order to roll for being a wound (incremental pressure damage need not apply)
#define WOUND_MINIMUM_DAMAGE 5
/// an attack must do this much damage after armor in order to be eliigible to dismember a suitably mushed bodypart
#define DISMEMBER_MINIMUM_DAMAGE 10
/// any damage dealt over this is ignored for damage rolls unless the target has the frail quirk (35^1.4=145)
#define WOUND_MAX_CONSIDERED_DAMAGE 35
#define WOUND_SEVERITY_TRIVIAL 0 // for jokey/meme wounds like stubbed toe, no standard messages/sounds or second winds #define WOUND_SEVERITY_TRIVIAL 0 // for jokey/meme wounds like stubbed toe, no standard messages/sounds or second winds
#define WOUND_SEVERITY_MODERATE 1 #define WOUND_SEVERITY_MODERATE 1
@@ -6,38 +15,105 @@
#define WOUND_SEVERITY_CRITICAL 3 #define WOUND_SEVERITY_CRITICAL 3
#define WOUND_SEVERITY_LOSS 4 // theoretical total limb loss, like dismemberment for cuts #define WOUND_SEVERITY_LOSS 4 // theoretical total limb loss, like dismemberment for cuts
#define WOUND_BRUTE 0 /// any brute weapon/attack that doesn't have sharpness. rolls for blunt bone wounds
#define WOUND_SHARP 1 #define WOUND_BLUNT 1
#define WOUND_BURN 2 /// any brute weapon/attack with sharpness = SHARP_EDGED. rolls for slash wounds
#define WOUND_SLASH 2
/// any brute weapon/attack with sharpness = SHARP_POINTY. rolls for piercing wounds
#define WOUND_PIERCE 3
/// any concentrated burn attack (lasers really). rolls for burning wounds
#define WOUND_BURN 4
// How much determination reagent to add each time someone gains a new wound in [/datum/wound/proc/second_wind()] // How much determination reagent to add each time someone gains a new wound in [/datum/wound/proc/second_wind()]
#define WOUND_DETERMINATION_MODERATE 1 #define WOUND_DETERMINATION_MODERATE 1
#define WOUND_DETERMINATION_SEVERE 2.5 #define WOUND_DETERMINATION_SEVERE 2.5
#define WOUND_DETERMINATION_CRITICAL 5 #define WOUND_DETERMINATION_CRITICAL 5
#define WOUND_DETERMINATION_LOSS 7.5
/// the max amount of determination you can have
#define WOUND_DETERMINATION_MAX 10 #define WOUND_DETERMINATION_MAX 10
// set wound_bonus on an item or attack to this to disable checking wounding for the attack /// set wound_bonus on an item or attack to this to disable checking wounding for the attack
#define CANT_WOUND -100 #define CANT_WOUND -100
// list in order of highest severity to lowest // list in order of highest severity to lowest
#define WOUND_LIST_BONE list(/datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/moderate) GLOBAL_LIST_INIT(global_wound_types, list(WOUND_BLUNT = list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate),
#define WOUND_LIST_CUT list(/datum/wound/brute/cut/loss, /datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate) WOUND_SLASH = list(/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate),
#define WOUND_LIST_BURN list(/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate) WOUND_PIERCE = list(/datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate),
WOUND_BURN = list(/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate)
))
GLOBAL_LIST_INIT(global_all_wound_types, list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate,
/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate,
/datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate,
/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate))
// Thresholds for infection for burn wounds, once infestation hits each threshold, things get steadily worse // Thresholds for infection for burn wounds, once infestation hits each threshold, things get steadily worse
#define WOUND_INFECTION_MODERATE 4 // below this has no ill effects from infection /// below this has no ill effects from infection
#define WOUND_INFECTION_SEVERE 8 // then below here, you ooze some pus and suffer minor tox damage, but nothing serious #define WOUND_INFECTION_MODERATE 4
#define WOUND_INFECTION_CRITICAL 12 // then below here, your limb occasionally locks up from damage and infection and briefly becomes disabled. Things are getting really bad /// then below here, you ooze some pus and suffer minor tox damage, but nothing serious
#define WOUND_INFECTION_SEPTIC 20 // below here, your skin is almost entirely falling off and your limb locks up more frequently. You are within a stone's throw of septic paralysis and losing the limb #define WOUND_INFECTION_SEVERE 8
/// then below here, your limb occasionally locks up from damage and infection and briefly becomes disabled. Things are getting really bad
#define WOUND_INFECTION_CRITICAL 12
/// below here, your skin is almost entirely falling off and your limb locks up more frequently. You are within a stone's throw of septic paralysis and losing the limb
#define WOUND_INFECTION_SEPTIC 20
// above WOUND_INFECTION_SEPTIC, your limb is completely putrid and you start rolling to lose the entire limb by way of paralyzation. After 3 failed rolls (~4-5% each probably), the limb is paralyzed // above WOUND_INFECTION_SEPTIC, your limb is completely putrid and you start rolling to lose the entire limb by way of paralyzation. After 3 failed rolls (~4-5% each probably), the limb is paralyzed
#define WOUND_BURN_SANITIZATION_RATE 0.15 // how quickly sanitization removes infestation and decays per tick
#define WOUND_CUT_MAX_BLOODFLOW 8 // how much blood you can lose per tick per cut max. 8 is a LOT of blood for one cut so don't worry about hitting it easily /// how quickly sanitization removes infestation and decays per tick
#define WOUND_BONE_HEAD_TIME_VARIANCE 20 // if we suffer a bone wound to the head that creates brain traumas, the timer for the trauma cycle is +/- by this percent (0-100) #define WOUND_BURN_SANITIZATION_RATE 0.15
/// how much blood you can lose per tick per slash max. 8 is a LOT of blood for one cut so don't worry about hitting it easily
#define WOUND_SLASH_MAX_BLOODFLOW 8
/// dead people don't bleed, but they can clot! this is the minimum amount of clotting per tick on dead people, so even critical cuts will slowly clot in dead people
#define WOUND_SLASH_DEAD_CLOT_MIN 0.05
/// if we suffer a bone wound to the head that creates brain traumas, the timer for the trauma cycle is +/- by this percent (0-100)
#define WOUND_BONE_HEAD_TIME_VARIANCE 20
// The following are for persistent scar save formats // The following are for persistent scar save formats
#define SCAR_SAVE_ZONE 1 // The body_zone we're applying to on granting /// The version number of the scar we're saving
#define SCAR_SAVE_DESC 2 // The description we're loading #define SCAR_SAVE_VERS 1
#define SCAR_SAVE_PRECISE_LOCATION 3 // The precise location we're loading /// The body_zone we're applying to on granting
#define SCAR_SAVE_SEVERITY 4 // The severity the scar had #define SCAR_SAVE_ZONE 2
/// The description we're loading
#define SCAR_SAVE_DESC 3
/// The precise location we're loading
#define SCAR_SAVE_PRECISE_LOCATION 4
/// The severity the scar had
#define SCAR_SAVE_SEVERITY 5
///how many fields there are above (NOT INCLUDING THIS OBVIOUSLY)
#define SCAR_SAVE_LENGTH 5
// increment this number when you update the persistent scarring format in a way that invalidates previous saved scars (new fields, reordering, etc)
/// saved scars with a version lower than this will be discarded
#define SCAR_CURRENT_VERSION 1
// With the wounds pt. 2 update, general dismemberment now requires 2 things for a limb to be dismemberable (bone only creatures just need the second):
// 1. Skin is mangled: A critical slash or pierce wound on that limb
// 2. Bone is mangled: At least a severe bone wound on that limb
// see [/obj/item/bodypart/proc/get_mangled_state] for more information
#define BODYPART_MANGLED_NONE 0
#define BODYPART_MANGLED_BONE 1
#define BODYPART_MANGLED_FLESH 2
#define BODYPART_MANGLED_BOTH 3
// What kind of biology we have, and what wounds we can suffer, mostly relies on the HAS_FLESH and HAS_BONE species traits on human species
/// golems and androids, cannot suffer any wounds
#define BIO_INORGANIC 0
/// skeletons and plasmemes, can only suffer bone wounds, only needs mangled bone to be able to dismember
#define BIO_JUST_BONE 1
/// nothing right now, maybe slimepeople in the future, can only suffer slashing, piercing, and burn wounds
#define BIO_JUST_FLESH 2
/// standard humanoids, can suffer all wounds, needs mangled bone and flesh to dismember
#define BIO_FLESH_BONE 3
/// If this wound requires having the HAS_FLESH flag for humanoids
#define FLESH_WOUND (1<<0)
/// If this wound requires having the HAS_BONE flag for humanaoids
#define BONE_WOUND (1<<1)
/// If having this wound counts as mangled flesh for dismemberment
#define MANGLES_FLESH (1<<2)
/// If having this wound counts as mangled bone for dismemberment
#define MANGLES_BONE (1<<3)
/// If this wound marks the limb as being allowed to have gauze applied
#define ACCEPTS_GAUZE (1<<4)
+9 -10
View File
@@ -238,25 +238,24 @@
else else
return clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 return clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100
/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area, current_force) /mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area, obj/item/bodypart/hit_bodypart)
var/message_verb = "attacked" var/message_verb = "attacked"
if(I.attack_verb && I.attack_verb.len) if(length(I.attack_verb))
message_verb = "[pick(I.attack_verb)]" message_verb = "[pick(I.attack_verb)]"
if(current_force < I.force * FEEBLE_ATTACK_MSG_THRESHOLD)
message_verb = "[pick("feebly", "limply", "saplessly")] [message_verb]"
else if(!I.force) else if(!I.force)
return return
var/message_hit_area = "" var/message_hit_area = ""
if(hit_area) if(hit_area)
message_hit_area = " in the [hit_area]" message_hit_area = " in the [hit_area]"
var/attack_message = "[src] has been [message_verb][message_hit_area] with [I]." var/attack_message = "[src] is [message_verb][message_hit_area] with [I]!"
var/attack_message_local = "You're [message_verb][message_hit_area] with [I]!"
if(user in viewers(src, null)) if(user in viewers(src, null))
attack_message = "[user] has [message_verb] [src][message_hit_area] with [I]!" attack_message = "[user] [message_verb] [src][message_hit_area] with [I]!"
attack_message_local = "[user] [message_verb] you[message_hit_area] with [I]!"
if(user == src)
attack_message_local = "You [message_verb] yourself[message_hit_area] with [I]"
visible_message("<span class='danger'>[attack_message]</span>",\ visible_message("<span class='danger'>[attack_message]</span>",\
"<span class='userdanger'>[attack_message]</span>", null, COMBAT_MESSAGE_RANGE) "<span class='userdanger'>[attack_message_local]</span>", null, COMBAT_MESSAGE_RANGE)
if(hit_area == BODY_ZONE_HEAD)
if(prob(2))
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
return 1 return 1
/// How much stamina this takes to swing this is not for realism purposes hecc off. /// How much stamina this takes to swing this is not for realism purposes hecc off.
+2 -2
View File
@@ -561,8 +561,8 @@ SUBSYSTEM_DEF(persistence)
ending_human.client.prefs.scars_list["[ending_human.client.prefs.scars_index]"] = "" ending_human.client.prefs.scars_list["[ending_human.client.prefs.scars_index]"] = ""
else else
for(var/k in ending_human.all_wounds) for(var/k in ending_human.all_wounds)
var/datum/wound/W = k var/datum/wound/iter_wound = k
W.remove_wound() // so we can get the scars for open wounds iter_wound.remove_wound() // so we can get the scars for open wounds
if(!ending_human.client) if(!ending_human.client)
return return
ending_human.client.prefs.scars_list["[ending_human.client.prefs.scars_index]"] = ending_human.format_scars() ending_human.client.prefs.scars_list["[ending_human.client.prefs.scars_index]"] = ending_human.format_scars()
@@ -50,20 +50,17 @@ PROCESSING_SUBSYSTEM_DEF(circuit)
/obj/item/electronic_assembly/simple, /obj/item/electronic_assembly/simple,
/obj/item/electronic_assembly/hook, /obj/item/electronic_assembly/hook,
/obj/item/electronic_assembly/pda, /obj/item/electronic_assembly/pda,
/obj/item/electronic_assembly/dildo,
/obj/item/electronic_assembly/small/default, /obj/item/electronic_assembly/small/default,
/obj/item/electronic_assembly/small/cylinder, /obj/item/electronic_assembly/small/cylinder,
/obj/item/electronic_assembly/small/scanner, /obj/item/electronic_assembly/small/scanner,
/obj/item/electronic_assembly/small/hook, /obj/item/electronic_assembly/small/hook,
/obj/item/electronic_assembly/small/box, /obj/item/electronic_assembly/small/box,
/obj/item/electronic_assembly/small/dildo,
/obj/item/electronic_assembly/medium/default, /obj/item/electronic_assembly/medium/default,
/obj/item/electronic_assembly/medium/box, /obj/item/electronic_assembly/medium/box,
/obj/item/electronic_assembly/medium/clam, /obj/item/electronic_assembly/medium/clam,
/obj/item/electronic_assembly/medium/medical, /obj/item/electronic_assembly/medium/medical,
/obj/item/electronic_assembly/medium/gun, /obj/item/electronic_assembly/medium/gun,
/obj/item/electronic_assembly/medium/radio, /obj/item/electronic_assembly/medium/radio,
/obj/item/electronic_assembly/medium/dildo,
/obj/item/electronic_assembly/large/default, /obj/item/electronic_assembly/large/default,
/obj/item/electronic_assembly/large/scope, /obj/item/electronic_assembly/large/scope,
/obj/item/electronic_assembly/large/terminal, /obj/item/electronic_assembly/large/terminal,
+2 -1
View File
@@ -711,7 +711,8 @@ SUBSYSTEM_DEF(ticker)
'sound/roundend/yeehaw.ogg', 'sound/roundend/yeehaw.ogg',
'sound/roundend/disappointed.ogg', 'sound/roundend/disappointed.ogg',
'sound/roundend/gondolabridge.ogg', 'sound/roundend/gondolabridge.ogg',
'sound/roundend/haveabeautifultime.ogg'\ 'sound/roundend/haveabeautifultime.ogg',
'sound/roundend/CitadelStationHasSeenBetterDays.ogg'\
) )
SEND_SOUND(world, sound(round_end_sound)) SEND_SOUND(world, sound(round_end_sound))
+1 -1
View File
@@ -67,7 +67,7 @@
H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD, wound_bonus=CANT_WOUND) // easy tiger, we'll get to that in a sec H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD, wound_bonus=CANT_WOUND) // easy tiger, we'll get to that in a sec
var/obj/item/bodypart/slit_throat = H.get_bodypart(BODY_ZONE_HEAD) var/obj/item/bodypart/slit_throat = H.get_bodypart(BODY_ZONE_HEAD)
if(slit_throat) if(slit_throat)
var/datum/wound/brute/cut/critical/screaming_through_a_slit_throat = new var/datum/wound/slash/critical/screaming_through_a_slit_throat = new
screaming_through_a_slit_throat.apply_wound(slit_throat) screaming_through_a_slit_throat.apply_wound(slit_throat)
H.apply_status_effect(/datum/status_effect/neck_slice) H.apply_status_effect(/datum/status_effect/neck_slice)
+19 -12
View File
@@ -29,7 +29,6 @@
*/ */
/datum/component/embedded /datum/component/embedded
dupe_mode = COMPONENT_DUPE_ALLOWED dupe_mode = COMPONENT_DUPE_ALLOWED
var/obj/item/bodypart/limb var/obj/item/bodypart/limb
@@ -139,30 +138,36 @@
limb.embedded_objects |= weapon // on the inside... on the inside... limb.embedded_objects |= weapon // on the inside... on the inside...
weapon.forceMove(victim) weapon.forceMove(victim)
RegisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING), .proc/byeItemCarbon) RegisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING), .proc/byeItemCarbon)
var/damage = 0
if(harmful) if(harmful)
victim.visible_message("<span class='danger'>[weapon] embeds itself in [victim]'s [limb.name]!</span>",ignored_mobs=victim) victim.visible_message("<span class='danger'>[weapon] embeds itself in [victim]'s [limb.name]!</span>",ignored_mobs=victim)
to_chat(victim, "<span class='userdanger'>[weapon] embeds itself in your [limb.name]!</span>") to_chat(victim, "<span class='userdanger'>[weapon] embeds itself in your [limb.name]!</span>")
victim.throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) victim.throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
playsound(victim,'sound/weapons/bladeslice.ogg', 40) playsound(victim,'sound/weapons/bladeslice.ogg', 40)
weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody! weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody!
var/damage = weapon.w_class * impact_pain_mult damage = weapon.w_class * impact_pain_mult
limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus=-30, sharpness = TRUE)
SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded)
else else
victim.visible_message("<span class='danger'>[weapon] sticks itself to [victim]'s [limb.name]!</span>",ignored_mobs=victim) victim.visible_message("<span class='danger'>[weapon] sticks itself to [victim]'s [limb.name]!</span>",ignored_mobs=victim)
to_chat(victim, "<span class='userdanger'>[weapon] sticks itself to your [limb.name]!</span>") to_chat(victim, "<span class='userdanger'>[weapon] sticks itself to your [limb.name]!</span>")
if(damage > 0)
var/armor = victim.run_armor_check(limb.body_zone, "melee", "Your armor has protected your [limb.name].", "Your armor has softened a hit to your [limb.name].",weapon.armour_penetration)
limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, blocked=armor, sharpness = weapon.get_sharpness())
/// Called every time a carbon with a harmful embed moves, rolling a chance for the item to cause pain. The chance is halved if the carbon is crawling or walking. /// Called every time a carbon with a harmful embed moves, rolling a chance for the item to cause pain. The chance is halved if the carbon is crawling or walking.
/datum/component/embedded/proc/jostleCheck() /datum/component/embedded/proc/jostleCheck()
var/mob/living/carbon/victim = parent var/mob/living/carbon/victim = parent
var/chance = jostle_chance var/damage = weapon.w_class * pain_mult
var/pain_chance_current = jostle_chance
if(victim.m_intent == MOVE_INTENT_WALK || !(victim.mobility_flags & MOBILITY_STAND)) if(victim.m_intent == MOVE_INTENT_WALK || !(victim.mobility_flags & MOBILITY_STAND))
chance *= 0.5 pain_chance_current *= 0.5
if(harmful && prob(chance)) if(pain_stam_pct && IS_STAMCRIT(victim)) //if it's a less-lethal embed, give them a break if they're already stamcritted
var/damage = weapon.w_class * jostle_pain_mult pain_chance_current *= 0.2
damage *= 0.5
if(harmful && prob(pain_chance_current))
limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND) limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND)
to_chat(victim, "<span class='userdanger'>[weapon] embedded in your [limb.name] jostles and stings!</span>") to_chat(victim, "<span class='userdanger'>[weapon] embedded in your [limb.name] jostles and stings!</span>")
@@ -199,7 +204,7 @@
if(harmful) if(harmful)
var/damage = weapon.w_class * remove_pain_mult var/damage = weapon.w_class * remove_pain_mult
limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, sharpness=TRUE) //It hurts to rip it out, get surgery you dingus. limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND) //It hurts to rip it out, get surgery you dingus.
victim.emote("scream") victim.emote("scream")
victim.visible_message("<span class='notice'>[victim] successfully rips [weapon] out of [victim.p_their()] [limb.name]!</span>", "<span class='notice'>You successfully remove [weapon] from your [limb.name].</span>") victim.visible_message("<span class='notice'>[victim] successfully rips [weapon] out of [victim.p_their()] [limb.name]!</span>", "<span class='notice'>You successfully remove [weapon] from your [limb.name].</span>")
else else
@@ -279,11 +284,13 @@
limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND) limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND)
to_chat(victim, "<span class='userdanger'>[weapon] embedded in your [limb.name] hurts!</span>") to_chat(victim, "<span class='userdanger'>[weapon] embedded in your [limb.name] hurts!</span>")
if(prob(fall_chance)) var/fall_chance_current = fall_chance
if(victim.mobility_flags & ~MOBILITY_STAND)
fall_chance_current *= 0.2
if(prob(fall_chance_current))
fallOutCarbon() fallOutCarbon()
//////////////////////////////////////// ////////////////////////////////////////
//////////////TURF PROCS//////////////// //////////////TURF PROCS////////////////
//////////////////////////////////////// ////////////////////////////////////////
+47 -8
View File
@@ -1,3 +1,8 @@
// the following defines are used for [/datum/component/pellet_cloud/var/list/wound_info_by_part] to store the damage, wound_bonus, and bw_bonus for each bodypart hit
#define CLOUD_POSITION_DAMAGE 1
#define CLOUD_POSITION_W_BONUS 2
#define CLOUD_POSITION_BW_BONUS 3
/* /*
* This component is used when you want to create a bunch of shrapnel or projectiles (say, shrapnel from a fragmentation grenade, or buckshot from a shotgun) from a central point, * This component is used when you want to create a bunch of shrapnel or projectiles (say, shrapnel from a fragmentation grenade, or buckshot from a shotgun) from a central point,
* without necessarily printing a separate message for every single impact. This component should be instantiated right when you need it (like the moment of firing), then activated * without necessarily printing a separate message for every single impact. This component should be instantiated right when you need it (like the moment of firing), then activated
@@ -29,7 +34,10 @@
var/list/pellets = list() var/list/pellets = list()
/// An associated list with the atom hit as the key and how many pellets they've eaten for the value, for printing aggregate messages /// An associated list with the atom hit as the key and how many pellets they've eaten for the value, for printing aggregate messages
var/list/targets_hit = list() var/list/targets_hit = list()
/// For grenades, any /mob/living's the grenade is moved onto, see [/datum/component/pellet_cloud/proc/handle_martyrs()]
/// Another associated list for hit bodyparts on carbons so we can track how much wounding potential we have for each bodypart
var/list/wound_info_by_part = list()
/// For grenades, any /mob/living's the grenade is moved onto, see [/datum/component/pellet_cloud/proc/handle_martyrs]
var/list/bodies var/list/bodies
/// For grenades, tracking people who die covering a grenade for achievement purposes, see [/datum/component/pellet_cloud/proc/handle_martyrs()] /// For grenades, tracking people who die covering a grenade for achievement purposes, see [/datum/component/pellet_cloud/proc/handle_martyrs()]
var/list/purple_hearts var/list/purple_hearts
@@ -64,6 +72,7 @@
/datum/component/pellet_cloud/Destroy(force, silent) /datum/component/pellet_cloud/Destroy(force, silent)
purple_hearts = null purple_hearts = null
pellets = null pellets = null
wound_info_by_part = null
targets_hit = null targets_hit = null
bodies = null bodies = null
return ..() return ..()
@@ -187,10 +196,26 @@
break break
///One of our pellets hit something, record what it was and check if we're done (terminated == num_pellets) ///One of our pellets hit something, record what it was and check if we're done (terminated == num_pellets)
/datum/component/pellet_cloud/proc/pellet_hit(obj/item/projectile/P, atom/movable/firer, atom/target, Angle) /datum/component/pellet_cloud/proc/pellet_hit(obj/item/projectile/P, atom/movable/firer, atom/target, Angle, hit_zone)
pellets -= P pellets -= P
terminated++ terminated++
hits++ hits++
var/obj/item/bodypart/hit_part
if(iscarbon(target) && hit_zone)
var/mob/living/carbon/hit_carbon = target
hit_part = hit_carbon.get_bodypart(hit_zone)
if(hit_part)
target = hit_part
if(P.wound_bonus != CANT_WOUND) // handle wounding
// unfortunately, due to how pellet clouds handle finalizing only after every pellet is accounted for, that also means there might be a short delay in dealing wounds if one pellet goes wide
// while buckshot may reach a target or miss it all in one tick, we also have to account for possible ricochets that may take a bit longer to hit the target
if(isnull(wound_info_by_part[hit_part]))
wound_info_by_part[hit_part] = list(0, 0, 0)
wound_info_by_part[hit_part][CLOUD_POSITION_DAMAGE] += P.damage // these account for decay
wound_info_by_part[hit_part][CLOUD_POSITION_W_BONUS] += P.wound_bonus
wound_info_by_part[hit_part][CLOUD_POSITION_BW_BONUS] += P.bare_wound_bonus
P.wound_bonus = CANT_WOUND // actual wounding will be handled aggregate
targets_hit[target]++ targets_hit[target]++
if(targets_hit[target] == 1) if(targets_hit[target] == 1)
RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/on_target_qdel, override=TRUE) RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/on_target_qdel, override=TRUE)
@@ -231,13 +256,23 @@
for(var/atom/target in targets_hit) for(var/atom/target in targets_hit)
var/num_hits = targets_hit[target] var/num_hits = targets_hit[target]
UnregisterSignal(target, COMSIG_PARENT_QDELETING) UnregisterSignal(target, COMSIG_PARENT_QDELETING)
if(num_hits > 1) var/obj/item/bodypart/hit_part
target.visible_message("<span class='danger'>[target] is hit by [num_hits] [proj_name]s!</span>", null, null, COMBAT_MESSAGE_RANGE, target) if(isbodypart(target))
to_chat(target, "<span class='userdanger'>You're hit by [num_hits] [proj_name]s!</span>") hit_part = target
else target = hit_part.owner
target.visible_message("<span class='danger'>[target] is hit by a [proj_name]!</span>", null, null, COMBAT_MESSAGE_RANGE, target) var/damage_dealt = wound_info_by_part[hit_part][CLOUD_POSITION_DAMAGE]
to_chat(target, "<span class='userdanger'>You're hit by a [proj_name]!</span>") var/w_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_W_BONUS]
var/bw_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_BW_BONUS]
var/wound_type = (initial(P.damage_type) == BRUTE) ? WOUND_BLUNT : WOUND_BURN // sharpness is handled in the wound rolling
wound_info_by_part[hit_part] = null
hit_part.painless_wound_roll(wound_type, damage_dealt, w_bonus, bw_bonus, initial(P.sharpness))
if(num_hits > 1)
target.visible_message("<span class='danger'>[target] is hit by [num_hits] [proj_name]s[hit_part ? " in the [hit_part.name]" : ""]!</span>", null, null, COMBAT_MESSAGE_RANGE, target)
to_chat(target, "<span class='userdanger'>You're hit by [num_hits] [proj_name]s[hit_part ? " in the [hit_part.name]" : ""]!</span>")
else
target.visible_message("<span class='danger'>[target] is hit by a [proj_name][hit_part ? " in the [hit_part.name]" : ""]!</span>", null, null, COMBAT_MESSAGE_RANGE, target)
to_chat(target, "<span class='userdanger'>You're hit by a [proj_name][hit_part ? " in the [hit_part.name]" : ""]!</span>")
UnregisterSignal(parent, COMSIG_PARENT_PREQDELETED) UnregisterSignal(parent, COMSIG_PARENT_PREQDELETED)
if(queued_delete) if(queued_delete)
qdel(parent) qdel(parent)
@@ -281,3 +316,7 @@
targets_hit -= target targets_hit -= target
bodies -= target bodies -= target
purple_hearts -= target purple_hearts -= target
#undef CLOUD_POSITION_DAMAGE
#undef CLOUD_POSITION_W_BONUS
#undef CLOUD_POSITION_BW_BONUS
+20 -36
View File
@@ -2,7 +2,7 @@
The presence of this element allows an item (or a projectile carrying an item) to embed itself in a human or turf when it is thrown into a target (whether by hand, gun, or explosive wave) with either The presence of this element allows an item (or a projectile carrying an item) to embed itself in a human or turf when it is thrown into a target (whether by hand, gun, or explosive wave) with either
at least 4 throwspeed (EMBED_THROWSPEED_THRESHOLD) or ignore_throwspeed_threshold set to TRUE. Items meant to be used as shrapnel for projectiles should have ignore_throwspeed_threshold set to true. at least 4 throwspeed (EMBED_THROWSPEED_THRESHOLD) or ignore_throwspeed_threshold set to TRUE. Items meant to be used as shrapnel for projectiles should have ignore_throwspeed_threshold set to true.
Whether we're dealing with a direct /obj/item (throwing a knife at someone) or an /obj/projectile with a shrapnel_type, how we handle things plays out the same, with one extra step separating them. Whether we're dealing with a direct /obj/item (throwing a knife at someone) or an /obj/item/projectile with a shrapnel_type, how we handle things plays out the same, with one extra step separating them.
Items simply make their COMSIG_MOVABLE_IMPACT or COMSIG_MOVABLE_IMPACT_ZONE check (against a closed turf or a carbon, respectively), while projectiles check on COMSIG_PROJECTILE_SELF_ON_HIT. Items simply make their COMSIG_MOVABLE_IMPACT or COMSIG_MOVABLE_IMPACT_ZONE check (against a closed turf or a carbon, respectively), while projectiles check on COMSIG_PROJECTILE_SELF_ON_HIT.
Upon a projectile hitting a valid target, it spawns whatever type of payload it has defined, then has that try to embed itself in the target on its own. Upon a projectile hitting a valid target, it spawns whatever type of payload it has defined, then has that try to embed itself in the target on its own.
@@ -37,10 +37,10 @@
if(!isitem(target) && !isprojectile(target)) if(!isitem(target) && !isprojectile(target))
return ELEMENT_INCOMPATIBLE return ELEMENT_INCOMPATIBLE
RegisterSignal(target, COMSIG_ELEMENT_ATTACH, .proc/severancePackage)
if(isitem(target)) if(isitem(target))
RegisterSignal(target, COMSIG_MOVABLE_IMPACT_ZONE, .proc/checkEmbedMob) RegisterSignal(target, COMSIG_MOVABLE_IMPACT_ZONE, .proc/checkEmbedMob)
RegisterSignal(target, COMSIG_MOVABLE_IMPACT, .proc/checkEmbedOther) RegisterSignal(target, COMSIG_MOVABLE_IMPACT, .proc/checkEmbedOther)
RegisterSignal(target, COMSIG_ELEMENT_ATTACH, .proc/severancePackage)
RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/examined) RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/examined)
RegisterSignal(target, COMSIG_EMBED_TRY_FORCE, .proc/tryForceEmbed) RegisterSignal(target, COMSIG_EMBED_TRY_FORCE, .proc/tryForceEmbed)
RegisterSignal(target, COMSIG_ITEM_DISABLE_EMBED, .proc/detachFromWeapon) RegisterSignal(target, COMSIG_ITEM_DISABLE_EMBED, .proc/detachFromWeapon)
@@ -68,7 +68,7 @@
if(isitem(target)) if(isitem(target))
UnregisterSignal(target, list(COMSIG_MOVABLE_IMPACT_ZONE, COMSIG_ELEMENT_ATTACH, COMSIG_MOVABLE_IMPACT, COMSIG_PARENT_EXAMINE, COMSIG_EMBED_TRY_FORCE, COMSIG_ITEM_DISABLE_EMBED)) UnregisterSignal(target, list(COMSIG_MOVABLE_IMPACT_ZONE, COMSIG_ELEMENT_ATTACH, COMSIG_MOVABLE_IMPACT, COMSIG_PARENT_EXAMINE, COMSIG_EMBED_TRY_FORCE, COMSIG_ITEM_DISABLE_EMBED))
else else
UnregisterSignal(target, list(COMSIG_PROJECTILE_SELF_ON_HIT)) UnregisterSignal(target, list(COMSIG_PROJECTILE_SELF_ON_HIT, COMSIG_ELEMENT_ATTACH))
/// Checking to see if we're gonna embed into a human /// Checking to see if we're gonna embed into a human
@@ -79,13 +79,13 @@
var/actual_chance = embed_chance var/actual_chance = embed_chance
if(!weapon.isEmbedHarmless()) // all the armor in the world won't save you from a kick me sign if(!weapon.isEmbedHarmless()) // all the armor in the world won't save you from a kick me sign
var/armor = max(victim.run_armor_check(hit_zone, "bullet", silent=TRUE), victim.run_armor_check(hit_zone, "bomb", silent=TRUE)) // we'll be nice and take the better of bullet and bomb armor var/armor = max(victim.run_armor_check(hit_zone, "bullet", silent=TRUE), victim.run_armor_check(hit_zone, "bomb", silent=TRUE)) * 0.5 // we'll be nice and take the better of bullet and bomb armor, halved
if(armor) // we only care about armor penetration if there's actually armor to penetrate if(armor) // we only care about armor penetration if there's actually armor to penetrate
var/pen_mod = -armor + weapon.armour_penetration // even a little bit of armor can make a big difference for shrapnel with large negative armor pen var/pen_mod = -armor + weapon.armour_penetration // even a little bit of armor can make a big difference for shrapnel with large negative armor pen
actual_chance += pen_mod // doing the armor pen as a separate calc just in case this ever gets expanded on actual_chance += pen_mod // doing the armor pen as a separate calc just in case this ever gets expanded on
if(actual_chance <= 0) if(actual_chance <= 0)
victim.visible_message("<span class='danger'>[weapon] bounces off [victim]'s armor!</span>", "<span class='notice'>[weapon] bounces off your armor!</span>", vision_distance = COMBAT_MESSAGE_RANGE) victim.visible_message("<span class='danger'>[weapon] bounces off [victim]'s armor, unable to embed!</span>", "<span class='notice'>[weapon] bounces off your armor, unable to embed!</span>", vision_distance = COMBAT_MESSAGE_RANGE)
return return
var/roll_embed = prob(actual_chance) var/roll_embed = prob(actual_chance)
@@ -147,7 +147,7 @@
return TRUE return TRUE
///A different embed element has been attached, so we'll detach and let them handle things ///A different embed element has been attached, so we'll detach and let them handle things
/datum/element/embed/proc/severancePackage(obj/item/weapon, datum/element/E) /datum/element/embed/proc/severancePackage(obj/weapon, datum/element/E)
if(istype(E, /datum/element/embed)) if(istype(E, /datum/element/embed))
Detach(weapon) Detach(weapon)
@@ -169,46 +169,35 @@
* it to call tryForceEmbed() on its own embed element (it's out of our hands here, our projectile is done), where it will run through all the checks it needs to. * it to call tryForceEmbed() on its own embed element (it's out of our hands here, our projectile is done), where it will run through all the checks it needs to.
*/ */
/datum/element/embed/proc/checkEmbedProjectile(obj/item/projectile/P, atom/movable/firer, atom/hit, angle, hit_zone) /datum/element/embed/proc/checkEmbedProjectile(obj/item/projectile/P, atom/movable/firer, atom/hit, angle, hit_zone)
if(!iscarbon(hit) && !isclosedturf(hit)) if(!iscarbon(hit))
Detach(P) Detach(P)
return // we don't care return // we don't care
var/obj/item/payload = new payload_type(get_turf(hit)) var/obj/item/payload = new payload_type(get_turf(hit))
var/did_embed if(istype(payload, /obj/item/shrapnel/bullet))
if(iscarbon(hit)) payload.name = P.name
var/mob/living/carbon/C = hit payload.embedding = P.embedding
var/obj/item/bodypart/limb payload.updateEmbedding()
limb = C.get_bodypart(hit_zone) var/mob/living/carbon/C = hit
if(!limb) var/obj/item/bodypart/limb = C.get_bodypart(hit_zone)
limb = C.get_bodypart() if(!limb)
did_embed = payload.tryEmbed(limb) limb = C.get_bodypart()
else
did_embed = payload.tryEmbed(hit)
if(!did_embed) payload.tryEmbed(limb)
payload.failedEmbed()
Detach(P) Detach(P)
/** /**
* tryForceEmbed() is called here when we fire COMSIG_EMBED_TRY_FORCE from [/obj/item/proc/tryEmbed]. Mostly, this means we're a piece of shrapnel from a projectile that just impacted something, and we're trying to embed in it.
*
* The reason for this extra mucking about is avoiding having to do an extra hitby(), and annoying the target by impacting them once with the projectile, then again with the shrapnel (which likely represents said bullet), and possibly
* AGAIN if we actually embed. This way, we save on at least one message. Runs the standard embed checks on the mob/turf.
*
* Arguments: * Arguments:
* * I- what we're trying to embed, obviously * * I- the item we're trying to insert into the target
* * target- what we're trying to shish-kabob, either a bodypart, a carbon, or a closed turf * * target- what we're trying to shish-kabob, either a bodypart or a carbon
* * hit_zone- if our target is a carbon, try to hit them in this zone, if we don't have one, pick a random one. If our target is a bodypart, we already know where we're hitting. * * hit_zone- if our target is a carbon, try to hit them in this zone, if we don't have one, pick a random one. If our target is a bodypart, we already know where we're hitting.
* * forced- if we want this to succeed 100% * * forced- if we want this to succeed 100%
*/ */
/datum/element/embed/proc/tryForceEmbed(obj/item/I, atom/target, hit_zone, forced=FALSE) /datum/element/embed/proc/tryForceEmbed(obj/item/I, atom/target, hit_zone, forced=FALSE)
var/obj/item/bodypart/limb var/obj/item/bodypart/limb
var/mob/living/carbon/C var/mob/living/carbon/C
var/turf/closed/T
if(!forced && !prob(embed_chance)) if(!forced && !prob(embed_chance))
return return
if(iscarbon(target)) if(iscarbon(target))
C = target C = target
if(!hit_zone) if(!hit_zone)
@@ -218,10 +207,5 @@
limb = target limb = target
hit_zone = limb.body_zone hit_zone = limb.body_zone
C = limb.owner C = limb.owner
else if(isclosedturf(target)) checkEmbedMob(I, C, hit_zone, forced=TRUE)
T = target return TRUE
if(C)
return checkEmbedMob(I, C, hit_zone, forced=TRUE)
else if(T)
return checkEmbedOther(I, T, forced=TRUE)
+6 -8
View File
@@ -196,14 +196,12 @@ GLOBAL_LIST_EMPTY(explosions)
//------- EX_ACT AND TURF FIRES ------- //------- EX_ACT AND TURF FIRES -------
if(T == epicenter) // Ensures explosives detonating from bags trigger other explosives in that bag if((T == epicenter) && !QDELETED(explosion_source) && ismovable(explosion_source) && (get_turf(explosion_source) == T)) // Ensures explosives detonating from bags trigger other explosives in that bag
var/list/items = list() var/list/atoms = list()
for(var/I in T) for(var/atom/A in explosion_source.loc) // the ismovableatom check 2 lines above makes sure we don't nuke an /area
var/atom/A = I atoms += A
if (!(A.flags_1 & PREVENT_CONTENTS_EXPLOSION_1)) //The atom/contents_explosion() proc returns null if the contents ex_acting has been handled by the atom, and TRUE if it hasn't. for(var/i in atoms)
items += A.GetAllContents() var/atom/A = i
for(var/O in items)
var/atom/A = O
if(!QDELETED(A)) if(!QDELETED(A))
A.ex_act(dist) A.ex_act(dist)
+1 -1
View File
@@ -410,7 +410,7 @@
throw_speed = 4 throw_speed = 4
embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 100, "embedded_fall_chance" = 0) embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 100, "embedded_fall_chance" = 0)
w_class = WEIGHT_CLASS_SMALL w_class = WEIGHT_CLASS_SMALL
sharpness = IS_SHARP sharpness = SHARP_POINTY
var/mob/living/carbon/human/fired_by var/mob/living/carbon/human/fired_by
/// if we missed our target /// if we missed our target
var/missed = TRUE var/missed = TRUE
+18
View File
@@ -27,6 +27,24 @@
target.attack_hulk(owner) target.attack_hulk(owner)
return INTERRUPT_UNARMED_ATTACK | NO_AUTO_CLICKDELAY_HANDLING return INTERRUPT_UNARMED_ATTACK | NO_AUTO_CLICKDELAY_HANDLING
/**
*Checks damage of a hulk's arm and applies bone wounds as necessary.
*
*Called by specific atoms being attacked, such as walls. If an atom
*does not call this proc, than punching that atom will not cause
*arm breaking (even if the atom deals recoil damage to hulks).
*Arguments:
*arg1 is the arm to evaluate damage of and possibly break.
*/
/datum/mutation/human/hulk/proc/break_an_arm(obj/item/bodypart/arm)
switch(arm.brute_dam)
if(45 to 50)
arm.force_wound_upwards(/datum/wound/blunt/critical)
if(41 to 45)
arm.force_wound_upwards(/datum/wound/blunt/severe)
if(35 to 41)
arm.force_wound_upwards(/datum/wound/blunt/moderate)
/datum/mutation/human/hulk/on_life() /datum/mutation/human/hulk/on_life()
if(owner.health < 0) if(owner.health < 0)
on_losing(owner) on_losing(owner)
+1 -1
View File
@@ -448,7 +448,7 @@
var/still_bleeding = FALSE var/still_bleeding = FALSE
for(var/thing in throat.wounds) for(var/thing in throat.wounds)
var/datum/wound/W = thing var/datum/wound/W = thing
if(W.wound_type == WOUND_LIST_CUT && W.severity > WOUND_SEVERITY_MODERATE) if(W.wound_type == WOUND_SLASH && W.severity > WOUND_SEVERITY_MODERATE)
still_bleeding = TRUE still_bleeding = TRUE
break break
if(!still_bleeding) if(!still_bleeding)
+20 -11
View File
@@ -117,8 +117,7 @@
/datum/status_effect/wound/on_creation(mob/living/new_owner, incoming_wound) /datum/status_effect/wound/on_creation(mob/living/new_owner, incoming_wound)
. = ..() . = ..()
var/datum/wound/W = incoming_wound linked_wound = incoming_wound
linked_wound = W
linked_limb = linked_wound.limb linked_limb = linked_wound.limb
/datum/status_effect/wound/on_remove() /datum/status_effect/wound/on_remove()
@@ -140,9 +139,9 @@
// bones // bones
/datum/status_effect/wound/bone /datum/status_effect/wound/blunt
/datum/status_effect/wound/bone/interact_speed_modifier() /datum/status_effect/wound/blunt/interact_speed_modifier()
var/mob/living/carbon/C = owner var/mob/living/carbon/C = owner
if(C.get_active_hand() == linked_limb) if(C.get_active_hand() == linked_limb)
@@ -151,7 +150,7 @@
return 1 return 1
/datum/status_effect/wound/bone/action_cooldown_mod() /datum/status_effect/wound/blunt/action_cooldown_mod()
var/mob/living/carbon/C = owner var/mob/living/carbon/C = owner
if(C.get_active_hand() == linked_limb) if(C.get_active_hand() == linked_limb)
@@ -159,24 +158,34 @@
return 1 return 1
/datum/status_effect/wound/bone/moderate /datum/status_effect/wound/blunt/moderate
id = "disjoint" id = "disjoint"
/datum/status_effect/wound/bone/severe /datum/status_effect/wound/blunt/severe
id = "hairline" id = "hairline"
/datum/status_effect/wound/bone/critical /datum/status_effect/wound/blunt/critical
id = "compound" id = "compound"
// cuts // cuts
/datum/status_effect/wound/cut/moderate /datum/status_effect/wound/slash/moderate
id = "abrasion" id = "abrasion"
/datum/status_effect/wound/cut/severe /datum/status_effect/wound/slash/severe
id = "laceration" id = "laceration"
/datum/status_effect/wound/cut/critical /datum/status_effect/wound/slash/critical
id = "avulsion" id = "avulsion"
// pierce
/datum/status_effect/wound/pierce/moderate
id = "breakage"
/datum/status_effect/wound/pierce/severe
id = "puncture"
/datum/status_effect/wound/pierce/critical
id = "rupture"
// burns // burns
/datum/status_effect/wound/burn/moderate /datum/status_effect/wound/burn/moderate
id = "seconddeg" id = "seconddeg"
+3 -5
View File
@@ -14,7 +14,7 @@
if(NOBLOOD in H.dna.species.species_traits) //can't lose blood if your species doesn't have any if(NOBLOOD in H.dna.species.species_traits) //can't lose blood if your species doesn't have any
return return
else else
quirk_holder.blood_volume -= 0.275 quirk_holder.blood_volume -= 0.2
/datum/quirk/depression /datum/quirk/depression
name = "Depression" name = "Depression"
@@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
if("Botanist") if("Botanist")
heirloom_type = pick(/obj/item/cultivator, /obj/item/reagent_containers/glass/bucket, /obj/item/storage/bag/plants, /obj/item/toy/plush/beeplushie) heirloom_type = pick(/obj/item/cultivator, /obj/item/reagent_containers/glass/bucket, /obj/item/storage/bag/plants, /obj/item/toy/plush/beeplushie)
if("Medical Doctor") if("Medical Doctor")
heirloom_type = /obj/item/healthanalyzer/advanced heirloom_type = /obj/item/healthanalyzer
if("Paramedic") if("Paramedic")
heirloom_type = /obj/item/lighter heirloom_type = /obj/item/lighter
if("Station Engineer") if("Station Engineer")
@@ -337,10 +337,8 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
dumb_thing = FALSE //only once per life dumb_thing = FALSE //only once per life
if(prob(1)) if(prob(1))
new/obj/item/reagent_containers/food/snacks/pastatomato(get_turf(H)) //now that's what I call spaghetti code new/obj/item/reagent_containers/food/snacks/pastatomato(get_turf(H)) //now that's what I call spaghetti code
// small chance to make eye contact with inanimate objects/mindless mobs because of nerves // small chance to make eye contact with inanimate objects/mindless mobs because of nerves
/datum/quirk/social_anxiety/proc/looks_at_floor(datum/source, atom/A) /datum/quirk/social_anxiety/proc/looks_at_floor(datum/source, atom/A)
var/mob/living/mind_check = A var/mob/living/mind_check = A
if(prob(85) || (istype(mind_check) && mind_check.mind)) if(prob(85) || (istype(mind_check) && mind_check.mind))
+28 -10
View File
@@ -53,8 +53,12 @@
if(victim) if(victim)
LAZYADD(victim.all_scars, src) LAZYADD(victim.all_scars, src)
description = pick(W.scarring_descriptions) if(victim && victim.get_biological_state() == BIO_JUST_BONE)
precise_location = pick(limb.specific_locations) description = pick(strings(BONE_SCAR_FILE, W.scar_keyword)) || "general disfigurement"
else
description = pick(strings(FLESH_SCAR_FILE, W.scar_keyword)) || "general disfigurement"
precise_location = pick(strings(SCAR_LOC_FILE, limb.body_zone))
switch(W.severity) switch(W.severity)
if(WOUND_SEVERITY_MODERATE) if(WOUND_SEVERITY_MODERATE)
visibility = 2 visibility = 2
@@ -62,6 +66,9 @@
visibility = 3 visibility = 3
if(WOUND_SEVERITY_CRITICAL) if(WOUND_SEVERITY_CRITICAL)
visibility = 5 visibility = 5
if(WOUND_SEVERITY_LOSS)
visibility = 7
precise_location = "amputation"
/// Used when we finalize a scar from a healing cut /// Used when we finalize a scar from a healing cut
/datum/scar/proc/lazy_attach(obj/item/bodypart/BP, datum/wound/W) /datum/scar/proc/lazy_attach(obj/item/bodypart/BP, datum/wound/W)
@@ -71,10 +78,11 @@
LAZYADD(victim.all_scars, src) LAZYADD(victim.all_scars, src)
/// Used to "load" a persistent scar /// Used to "load" a persistent scar
/datum/scar/proc/load(obj/item/bodypart/BP, description, specific_location, severity=WOUND_SEVERITY_SEVERE) /datum/scar/proc/load(obj/item/bodypart/BP, version, description, specific_location, severity=WOUND_SEVERITY_SEVERE)
if(!(BP.body_zone in applicable_zones)) if(!(BP.body_zone in applicable_zones) || !BP.is_organic_limb())
qdel(src) qdel(src)
return return
limb = BP limb = BP
src.severity = severity src.severity = severity
LAZYADD(limb.scars, src) LAZYADD(limb.scars, src)
@@ -90,6 +98,8 @@
visibility = 3 visibility = 3
if(WOUND_SEVERITY_CRITICAL) if(WOUND_SEVERITY_CRITICAL)
visibility = 5 visibility = 5
if(WOUND_SEVERITY_LOSS)
visibility = 7
return TRUE return TRUE
/// What will show up in examine_more() if this scar is visible /// What will show up in examine_more() if this scar is visible
@@ -102,9 +112,12 @@
if(WOUND_SEVERITY_MODERATE) if(WOUND_SEVERITY_MODERATE)
msg = "<span class='tinynotice'>[msg]</span>" msg = "<span class='tinynotice'>[msg]</span>"
if(WOUND_SEVERITY_SEVERE) if(WOUND_SEVERITY_SEVERE)
msg = "<span class='smallnotice'>[msg]</span>" msg = "<span class='smallnoticeital'>[msg]</span>"
if(WOUND_SEVERITY_CRITICAL) if(WOUND_SEVERITY_CRITICAL)
msg = "<span class='smallnotice'><b>[msg]</b></span>" msg = "<span class='smallnoticeital'><b>[msg]</b></span>"
if(WOUND_SEVERITY_LOSS)
msg = "[victim.p_their(TRUE)] [limb.name] [description]." // different format
msg = "<span class='notice'><i><b>[msg]</b></i></span>"
return "\t[msg]" return "\t[msg]"
/// Whether a scar can currently be seen by the viewer /// Whether a scar can currently be seen by the viewer
@@ -117,12 +130,12 @@
if(!ishuman(victim) || isobserver(viewer) || victim == viewer) if(!ishuman(victim) || isobserver(viewer) || victim == viewer)
return TRUE return TRUE
var/mob/living/carbon/human/H = victim var/mob/living/carbon/human/human_victim = victim
if(istype(limb, /obj/item/bodypart/head)) if(istype(limb, /obj/item/bodypart/head))
if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE))) if((human_victim.wear_mask && (human_victim.wear_mask.flags_inv & HIDEFACE)) || (human_victim.head && (human_victim.head.flags_inv & HIDEFACE)))
return FALSE return FALSE
else if(limb.scars_covered_by_clothes) else if(limb.scars_covered_by_clothes)
var/num_covers = LAZYLEN(H.clothingonpart(limb)) var/num_covers = LAZYLEN(human_victim.clothingonpart(limb))
if(num_covers + get_dist(viewer, victim) >= visibility) if(num_covers + get_dist(viewer, victim) >= visibility)
return FALSE return FALSE
@@ -131,4 +144,9 @@
/// Used to format a scar to safe in preferences for persistent scars /// Used to format a scar to safe in preferences for persistent scars
/datum/scar/proc/format() /datum/scar/proc/format()
if(!fake) if(!fake)
return "[limb.body_zone]|[description]|[precise_location]|[severity]" return "[SCAR_CURRENT_VERSION]|[limb.body_zone]|[description]|[precise_location]|[severity]"
/// Used to format a scar to safe in preferences for persistent scars
/datum/scar/proc/format_amputated(body_zone)
description = pick(list("is several skintone shades paler than the rest of the body", "is a gruesome patchwork of artificial flesh", "has a large series of attachment scars at the articulation points"))
return "[SCAR_CURRENT_VERSION]|[body_zone]|[description]|amputated|[WOUND_SEVERITY_LOSS]"
+30 -21
View File
@@ -33,15 +33,13 @@
/// Either WOUND_SEVERITY_TRIVIAL (meme wounds like stubbed toe), WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, or WOUND_SEVERITY_CRITICAL (or maybe WOUND_SEVERITY_LOSS) /// Either WOUND_SEVERITY_TRIVIAL (meme wounds like stubbed toe), WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, or WOUND_SEVERITY_CRITICAL (or maybe WOUND_SEVERITY_LOSS)
var/severity = WOUND_SEVERITY_MODERATE var/severity = WOUND_SEVERITY_MODERATE
/// The list of wounds it belongs in, WOUND_LIST_BONE, WOUND_LIST_CUT, or WOUND_LIST_BURN /// The list of wounds it belongs in, WOUND_LIST_BLUNT, WOUND_LIST_SLASH, or WOUND_LIST_BURN
var/wound_type var/wound_type
/// What body zones can we affect /// What body zones can we affect
var/list/viable_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) var/list/viable_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
/// Who owns the body part that we're wounding /// Who owns the body part that we're wounding
var/mob/living/carbon/victim = null var/mob/living/carbon/victim = null
/// If we only work on organics (everything right now)
var/organic_only = TRUE
/// The bodypart we're parented to /// The bodypart we're parented to
var/obj/item/bodypart/limb = null var/obj/item/bodypart/limb = null
@@ -51,8 +49,6 @@
var/list/treatable_by_grabbed var/list/treatable_by_grabbed
/// Tools with the specified tool flag will also be able to try directly treating this wound /// Tools with the specified tool flag will also be able to try directly treating this wound
var/treatable_tool var/treatable_tool
/// Set to TRUE if we don't give a shit about the patient's comfort and are allowed to just use any random sharp thing on this wound. Will require an aggressive grab or more to perform
var/treatable_sharp
/// How long it will take to treat this wound with a standard effective tool, assuming it doesn't need surgery /// How long it will take to treat this wound with a standard effective tool, assuming it doesn't need surgery
var/base_treat_time = 5 SECONDS var/base_treat_time = 5 SECONDS
@@ -65,17 +61,13 @@
/// How much we're contributing to this limb's bleed_rate /// How much we're contributing to this limb's bleed_rate
var/blood_flow var/blood_flow
/// The minimum we need to roll on [/obj/item/bodypart/proc/check_wounding()] to begin suffering this wound, see check_wounding_mods() for more /// The minimum we need to roll on [/obj/item/bodypart/proc/check_wounding] to begin suffering this wound, see check_wounding_mods() for more
var/threshold_minimum var/threshold_minimum
/// How much having this wound will add to all future check_wounding() rolls on this limb, to allow progression to worse injuries with repeated damage /// How much having this wound will add to all future check_wounding() rolls on this limb, to allow progression to worse injuries with repeated damage
var/threshold_penalty var/threshold_penalty
/// If we need to process each life tick /// If we need to process each life tick
var/processes = FALSE var/processes = FALSE
/// If TRUE and an item that can treat multiple different types of coexisting wounds (gauze can be used to splint broken bones, staunch bleeding, and cover burns), we get first dibs if we come up first for it, then become nonpriority.
/// Otherwise, if no untreated wound claims the item, we cycle through the non priority wounds and pick a random one who can use that item.
var/treat_priority = FALSE
/// If having this wound makes currently makes the parent bodypart unusable /// If having this wound makes currently makes the parent bodypart unusable
var/disabling var/disabling
@@ -89,12 +81,15 @@
var/cryo_progress var/cryo_progress
/// What kind of scars this wound will create description wise once healed /// What kind of scars this wound will create description wise once healed
var/list/scarring_descriptions = list("general disfigurement") var/scar_keyword = "generic"
/// If we've already tried scarring while removing (since remove_wound calls qdel, and qdel calls remove wound, .....) TODO: make this cleaner /// If we've already tried scarring while removing (since remove_wound calls qdel, and qdel calls remove wound, .....) TODO: make this cleaner
var/already_scarred = FALSE var/already_scarred = FALSE
/// If we forced this wound through badmin smite, we won't count it towards the round totals /// If we forced this wound through badmin smite, we won't count it towards the round totals
var/from_smite var/from_smite
/// What flags apply to this wound
var/wound_flags = (FLESH_WOUND | BONE_WOUND | ACCEPTS_GAUZE)
/datum/wound/Destroy() /datum/wound/Destroy()
if(attached_surgery) if(attached_surgery)
QDEL_NULL(attached_surgery) QDEL_NULL(attached_surgery)
@@ -115,13 +110,13 @@
* * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented) * * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented)
*/ */
/datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE) /datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE)
if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || isalien(L.owner)) if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || isalien(L.owner) || !L.is_organic_limb())
qdel(src) qdel(src)
return return
if(ishuman(L.owner)) if(ishuman(L.owner))
var/mob/living/carbon/human/H = L.owner var/mob/living/carbon/human/H = L.owner
if(organic_only && ((NOBLOOD in H.dna.species.species_traits) || !L.is_organic_limb())) if(((wound_flags & BONE_WOUND) && !(HAS_BONE in H.dna.species.species_traits)) || ((wound_flags & FLESH_WOUND) && !(HAS_FLESH in H.dna.species.species_traits)))
qdel(src) qdel(src)
return return
@@ -161,7 +156,7 @@
victim.visible_message(msg, "<span class='userdanger'>Your [limb.name] [occur_text]!</span>", vision_distance = vis_dist) victim.visible_message(msg, "<span class='userdanger'>Your [limb.name] [occur_text]!</span>", vision_distance = vis_dist)
if(sound_effect) if(sound_effect)
playsound(L.owner, sound_effect, 60 + 20 * severity, TRUE) playsound(L.owner, sound_effect, 70 + 20 * severity, TRUE)
if(!demoted) if(!demoted)
wound_injury(old_wound) wound_injury(old_wound)
@@ -181,7 +176,7 @@
SEND_SIGNAL(victim, COMSIG_CARBON_LOSE_WOUND, src, limb) SEND_SIGNAL(victim, COMSIG_CARBON_LOSE_WOUND, src, limb)
if(limb && !ignore_limb) if(limb && !ignore_limb)
LAZYREMOVE(limb.wounds, src) LAZYREMOVE(limb.wounds, src)
limb.update_wounds() limb.update_wounds(replaced)
/** /**
* replace_wound() is used when you want to replace the current wound with a new wound, presumably of the same category, just of a different severity (either up or down counts) * replace_wound() is used when you want to replace the current wound with a new wound, presumably of the same category, just of a different severity (either up or down counts)
@@ -189,7 +184,7 @@
* This proc actually instantiates the new wound based off the specific type path passed, then returns the new instantiated wound datum. * This proc actually instantiates the new wound based off the specific type path passed, then returns the new instantiated wound datum.
* *
* Arguments: * Arguments:
* * new_type- The TYPE PATH of the wound you want to replace this, like /datum/wound/brute/cut/severe * * new_type- The TYPE PATH of the wound you want to replace this, like /datum/wound/slash/severe
* * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented) * * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented)
*/ */
/datum/wound/proc/replace_wound(new_type, smited = FALSE) /datum/wound/proc/replace_wound(new_type, smited = FALSE)
@@ -206,7 +201,6 @@
/// Additional beneficial effects when the wound is gained, in case you want to give a temporary boost to allow the victim to try an escape or last stand /// Additional beneficial effects when the wound is gained, in case you want to give a temporary boost to allow the victim to try an escape or last stand
/datum/wound/proc/second_wind() /datum/wound/proc/second_wind()
switch(severity) switch(severity)
if(WOUND_SEVERITY_MODERATE) if(WOUND_SEVERITY_MODERATE)
victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_MODERATE) victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_MODERATE)
@@ -214,11 +208,13 @@
victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_SEVERE) victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_SEVERE)
if(WOUND_SEVERITY_CRITICAL) if(WOUND_SEVERITY_CRITICAL)
victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_CRITICAL) victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_CRITICAL)
if(WOUND_SEVERITY_LOSS)
victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_LOSS)
/** /**
* try_treating() is an intercept run from [/mob/living/carbon/attackby()] right after surgeries but before anything else. Return TRUE here if the item is something that is relevant to treatment to take over the interaction. * try_treating() is an intercept run from [/mob/living/carbon/proc/attackby] right after surgeries but before anything else. Return TRUE here if the item is something that is relevant to treatment to take over the interaction.
* *
* This proc leads into [/datum/wound/proc/treat()] and probably shouldn't be added onto in children types. You can specify what items or tools you want to be intercepted * This proc leads into [/datum/wound/proc/treat] and probably shouldn't be added onto in children types. You can specify what items or tools you want to be intercepted
* with var/list/treatable_by and var/treatable_tool, then if an item fulfills one of those requirements and our wound claims it first, it goes over to treat() and treat_self(). * with var/list/treatable_by and var/treatable_tool, then if an item fulfills one of those requirements and our wound claims it first, it goes over to treat() and treat_self().
* *
* Arguments: * Arguments:
@@ -258,7 +254,7 @@
treat(I, user) treat(I, user)
return TRUE return TRUE
/// Return TRUE if we have an item that can only be used while aggro grabbed (unhanded aggro grab treatments go in [/datum/wound/proc/try_handling()]). Treatment is still is handled in [/datum/wound/proc/treat()] /// Return TRUE if we have an item that can only be used while aggro grabbed (unhanded aggro grab treatments go in [/datum/wound/proc/try_handling]). Treatment is still is handled in [/datum/wound/proc/treat]
/datum/wound/proc/check_grab_treatments(obj/item/I, mob/user) /datum/wound/proc/check_grab_treatments(obj/item/I, mob/user)
return FALSE return FALSE
@@ -288,10 +284,22 @@
if(cryo_progress > 33 * severity) if(cryo_progress > 33 * severity)
qdel(src) qdel(src)
/// When synthflesh is applied to the victim, we call this. No sense in setting up an entire chem reaction system for wounds when we only care for a few chems. Probably will change in the future
/datum/wound/proc/on_synthflesh(power)
return
/// Called when the patient is undergoing stasis, so that having fully treated a wound doesn't make you sit there helplessly until you think to unbuckle them
/datum/wound/proc/on_stasis()
return
/// Called when we're crushed in an airlock or firedoor, for one of the improvised joint dislocation fixes /// Called when we're crushed in an airlock or firedoor, for one of the improvised joint dislocation fixes
/datum/wound/proc/crush() /datum/wound/proc/crush()
return return
/// Used when we're being dragged while bleeding, the value we return is how much bloodloss this wound causes from being dragged. Since it's a proc, you can let bandages soak some of the blood
/datum/wound/proc/drag_bleed_amount()
return
/** /**
* get_examine_description() is used in carbon/examine and human/examine to show the status of this wound. Useful if you need to show some status like the wound being splinted or bandaged. * get_examine_description() is used in carbon/examine and human/examine to show the status of this wound. Useful if you need to show some status like the wound being splinted or bandaged.
* *
@@ -301,7 +309,8 @@
* * mob/user: The user examining the wound's owner, if that matters * * mob/user: The user examining the wound's owner, if that matters
*/ */
/datum/wound/proc/get_examine_description(mob/user) /datum/wound/proc/get_examine_description(mob/user)
return "<B>[victim.p_their(TRUE)] [limb.name] [examine_desc]!</B>" . = "[victim.p_their(TRUE)] [limb.name] [examine_desc]"
. = severity <= WOUND_SEVERITY_MODERATE ? "[.]." : "<B>[.]!</B>"
/datum/wound/proc/get_scanner_description(mob/user) /datum/wound/proc/get_scanner_description(mob/user)
return "Type: [name]\nSeverity: [severity_text()]\nDescription: [desc]\nRecommended Treatment: [treat_text]" return "Type: [name]\nSeverity: [severity_text()]\nDescription: [desc]\nRecommended Treatment: [treat_text]"
+82 -115
View File
@@ -1,4 +1,3 @@
/* /*
Bones Bones
*/ */
@@ -7,12 +6,10 @@
/* /*
Base definition Base definition
*/ */
/datum/wound/brute/bone /datum/wound/blunt
sound_effect = 'sound/effects/crack1.ogg' sound_effect = 'sound/effects/wounds/crack1.ogg'
wound_type = WOUND_LIST_BONE wound_type = WOUND_BLUNT
wound_flags = (BONE_WOUND | ACCEPTS_GAUZE)
/// The item we're currently splinted with, if there is one
var/obj/item/stack/splinted
/// Have we been taped? /// Have we been taped?
var/taped var/taped
@@ -31,12 +28,12 @@
/// How long do we wait +/- 20% for the next trauma? /// How long do we wait +/- 20% for the next trauma?
var/trauma_cycle_cooldown var/trauma_cycle_cooldown
/// If this is a chest wound and this is set, we have this chance to cough up blood when hit in the chest /// If this is a chest wound and this is set, we have this chance to cough up blood when hit in the chest
var/chance_internal_bleeding = 0 var/internal_bleeding_chance = 0
/* /*
Overwriting of base procs Overwriting of base procs
*/ */
/datum/wound/brute/bone/wound_injury(datum/wound/old_wound = null) /datum/wound/blunt/wound_injury(datum/wound/old_wound = null)
if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group) if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group)
processes = TRUE processes = TRUE
active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND) active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND)
@@ -53,14 +50,14 @@
update_inefficiencies() update_inefficiencies()
/datum/wound/brute/bone/remove_wound(ignore_limb, replaced) /datum/wound/blunt/remove_wound(ignore_limb, replaced)
limp_slowdown = 0 limp_slowdown = 0
QDEL_NULL(active_trauma) QDEL_NULL(active_trauma)
if(victim) if(victim)
UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK)
return ..() return ..()
/datum/wound/brute/bone/handle_process() /datum/wound/blunt/handle_process()
. = ..() . = ..()
if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group && world.time > next_trauma_cycle) if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group && world.time > next_trauma_cycle)
if(active_trauma) if(active_trauma)
@@ -86,7 +83,7 @@
remove_wound() remove_wound()
/// If we're a human who's punching something with a broken arm, we might hurt ourselves doing so /// If we're a human who's punching something with a broken arm, we might hurt ourselves doing so
/datum/wound/brute/bone/proc/attack_with_hurt_hand(mob/M, atom/target, proximity) /datum/wound/blunt/proc/attack_with_hurt_hand(mob/M, atom/target, proximity)
if(victim.get_active_hand() != limb || victim.a_intent == INTENT_HELP || !ismob(target) || severity <= WOUND_SEVERITY_MODERATE) if(victim.get_active_hand() != limb || victim.a_intent == INTENT_HELP || !ismob(target) || severity <= WOUND_SEVERITY_MODERATE)
return return
@@ -104,61 +101,54 @@
limb.receive_damage(brute=rand(3,7)) limb.receive_damage(brute=rand(3,7))
return COMPONENT_NO_ATTACK_HAND return COMPONENT_NO_ATTACK_HAND
/datum/wound/brute/bone/receive_damage(wounding_type, wounding_dmg, wound_bonus) /datum/wound/blunt/receive_damage(wounding_type, wounding_dmg, wound_bonus)
if(!victim) if(!victim || wounding_dmg < WOUND_MINIMUM_DAMAGE)
return return
if(ishuman(victim))
var/mob/living/carbon/human/human_victim = victim
if(NOBLOOD in human_victim.dna?.species.species_traits)
return
if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume && prob(chance_internal_bleeding + wounding_dmg)) if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume && prob(internal_bleeding_chance + wounding_dmg))
var/blood_bled = rand(1, wounding_dmg * (severity == WOUND_SEVERITY_CRITICAL ? 2 : 1.5)) // 12 brute toolbox can cause up to 18/24 bleeding with a severe/critical chest wound var/blood_bled = rand(1, wounding_dmg * (severity == WOUND_SEVERITY_CRITICAL ? 2 : 1.5)) // 12 brute toolbox can cause up to 18/24 bleeding with a severe/critical chest wound
switch(blood_bled) switch(blood_bled)
if(1 to 6) if(1 to 6)
victim.bleed(blood_bled, TRUE) victim.bleed(blood_bled, TRUE)
if(7 to 13) if(7 to 13)
victim.visible_message("<span class='danger'>[victim] coughs up a bit of blood from the blow to [victim.p_their()] chest.</span>", "<span class='danger'>You cough up a bit of blood from the blow to your chest.</span>") victim.visible_message("<span class='smalldanger'>[victim] coughs up a bit of blood from the blow to [victim.p_their()] chest.</span>", "<span class='danger'>You cough up a bit of blood from the blow to your chest.</span>", vision_distance=COMBAT_MESSAGE_RANGE)
victim.bleed(blood_bled, TRUE) victim.bleed(blood_bled, TRUE)
if(14 to 19) if(14 to 19)
victim.visible_message("<span class='danger'>[victim] spits out a string of blood from the blow to [victim.p_their()] chest!</span>", "<span class='danger'>You spit out a string of blood from the blow to your chest!</span>") victim.visible_message("<span class='smalldanger'>[victim] spits out a string of blood from the blow to [victim.p_their()] chest!</span>", "<span class='danger'>You spit out a string of blood from the blow to your chest!</span>", vision_distance=COMBAT_MESSAGE_RANGE)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir)
victim.bleed(blood_bled) victim.bleed(blood_bled)
if(20 to INFINITY) if(20 to INFINITY)
victim.visible_message("<span class='danger'>[victim] chokes up a spray of blood from the blow to [victim.p_their()] chest!</span>", "<span class='danger'><b>You choke up on a spray of blood from the blow to your chest!</b></span>") victim.visible_message("<span class='danger'>[victim] chokes up a spray of blood from the blow to [victim.p_their()] chest!</span>", "<span class='danger'><b>You choke up on a spray of blood from the blow to your chest!</b></span>", vision_distance=COMBAT_MESSAGE_RANGE)
victim.bleed(blood_bled) victim.bleed(blood_bled)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir)
victim.add_splatter_floor(get_step(victim.loc, victim.dir)) victim.add_splatter_floor(get_step(victim.loc, victim.dir))
if(!(wounding_type in list(WOUND_SHARP, WOUND_BURN)) || !splinted || wound_bonus == CANT_WOUND)
return
splinted.take_damage(wounding_dmg, damage_type = (wounding_type == WOUND_SHARP ? BRUTE : BURN), sound_effect = FALSE) /datum/wound/blunt/get_examine_description(mob/user)
if(QDELETED(splinted)) if(!limb.current_gauze && !gelled && !taped)
var/destroyed_verb = (wounding_type == WOUND_SHARP ? "torn" : "burned")
victim.visible_message("<span class='danger'>The splint securing [victim]'s [limb.name] is [destroyed_verb] away!</span>", "<span class='danger'><b>The splint securing your [limb.name] is [destroyed_verb] away!</b></span>", vision_distance=COMBAT_MESSAGE_RANGE)
splinted = null
treat_priority = TRUE
update_inefficiencies()
/datum/wound/brute/bone/get_examine_description(mob/user)
if(!splinted && !gelled && !taped)
return ..() return ..()
var/msg = "" var/list/msg = list()
if(!splinted) if(!limb.current_gauze)
msg = "<B>[victim.p_their(TRUE)] [limb.name] [examine_desc]" msg += "[victim.p_their(TRUE)] [limb.name] [examine_desc]"
else else
var/splint_condition = "" var/sling_condition = ""
// how much life we have left in these bandages // how much life we have left in these bandages
switch(splinted.obj_integrity / splinted.max_integrity * 100) switch(limb.current_gauze.obj_integrity / limb.current_gauze.max_integrity * 100)
if(0 to 25) if(0 to 25)
splint_condition = "just barely " sling_condition = "just barely "
if(25 to 50) if(25 to 50)
splint_condition = "loosely " sling_condition = "loosely "
if(50 to 75) if(50 to 75)
splint_condition = "mostly " sling_condition = "mostly "
if(75 to INFINITY) if(75 to INFINITY)
splint_condition = "tightly " sling_condition = "tightly "
msg = "<B>[victim.p_their(TRUE)] [limb.name] is [splint_condition] fastened in a splint of [splinted.name]</B>" msg += "[victim.p_their(TRUE)] [limb.name] is [sling_condition] fastened in a sling of [limb.current_gauze.name]"
if(taped) if(taped)
msg += ", <span class='notice'>and appears to be reforming itself under some surgical tape!</span>" msg += ", <span class='notice'>and appears to be reforming itself under some surgical tape!</span>"
@@ -166,58 +156,35 @@
msg += ", <span class='notice'>with fizzing flecks of blue bone gel sparking off the bone!</span>" msg += ", <span class='notice'>with fizzing flecks of blue bone gel sparking off the bone!</span>"
else else
msg += "!" msg += "!"
return "[msg]</B>" return "<B>[msg.Join()]</B>"
/* /*
New common procs for /datum/wound/brute/bone/ New common procs for /datum/wound/blunt/
*/ */
/datum/wound/brute/bone/proc/update_inefficiencies() /datum/wound/blunt/proc/update_inefficiencies()
if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
if(splinted) if(limb.current_gauze)
limp_slowdown = initial(limp_slowdown) * splinted.splint_factor limp_slowdown = initial(limp_slowdown) * limb.current_gauze.splint_factor
else else
limp_slowdown = initial(limp_slowdown) limp_slowdown = initial(limp_slowdown)
victim.apply_status_effect(STATUS_EFFECT_LIMP) victim.apply_status_effect(STATUS_EFFECT_LIMP)
else if(limb.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) else if(limb.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
if(splinted) if(limb.current_gauze)
interaction_efficiency_penalty = 1 + ((interaction_efficiency_penalty - 1) * splinted.splint_factor) interaction_efficiency_penalty = 1 + ((interaction_efficiency_penalty - 1) * limb.current_gauze.splint_factor)
else else
interaction_efficiency_penalty = interaction_efficiency_penalty interaction_efficiency_penalty = interaction_efficiency_penalty
if(initial(disabling) && splinted) if(initial(disabling))
disabling = FALSE disabling = !limb.current_gauze
else if(initial(disabling))
disabling = TRUE
limb.update_wounds() limb.update_wounds()
/*
BEWARE OF REDUNDANCY AHEAD THAT I MUST PARE DOWN
*/
/datum/wound/brute/bone/proc/splint(obj/item/stack/I, mob/user)
if(splinted && splinted.splint_factor >= I.splint_factor)
to_chat(user, "<span class='warning'>The splint already on [user == victim ? "your" : "[victim]'s"] [limb.name] is better than you can do with [I].</span>")
return
user.visible_message("<span class='danger'>[user] begins splinting [victim]'s [limb.name] with [I].</span>", "<span class='warning'>You begin splinting [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists)))
return
user.visible_message("<span class='green'>[user] finishes splinting [victim]'s [limb.name]!</span>", "<span class='green'>You finish splinting [user == victim ? "your" : "[victim]'s"] [limb.name]!</span>")
treat_priority = FALSE
splinted = new I.type(limb)
splinted.amount = 1
I.use(1)
update_inefficiencies()
/* /*
Moderate (Joint Dislocation) Moderate (Joint Dislocation)
*/ */
/datum/wound/brute/bone/moderate /datum/wound/blunt/moderate
name = "Joint Dislocation" name = "Joint Dislocation"
desc = "Patient's bone has been unset from socket, causing pain and reduced motor function." desc = "Patient's bone has been unset from socket, causing pain and reduced motor function."
treat_text = "Recommended application of bonesetter to affected limb, though manual relocation by applying an aggressive grab to the patient and helpfully interacting with afflicted limb may suffice." treat_text = "Recommended application of bonesetter to affected limb, though manual relocation by applying an aggressive grab to the patient and helpfully interacting with afflicted limb may suffice."
@@ -226,19 +193,20 @@
severity = WOUND_SEVERITY_MODERATE severity = WOUND_SEVERITY_MODERATE
viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
interaction_efficiency_penalty = 1.5 interaction_efficiency_penalty = 1.5
limp_slowdown = 3 limp_slowdown = 1.5
threshold_minimum = 35 threshold_minimum = 45
threshold_penalty = 15 threshold_penalty = 15
treatable_tool = TOOL_BONESET treatable_tool = TOOL_BONESET
status_effect_type = /datum/status_effect/wound/bone/moderate wound_flags = (BONE_WOUND)
scarring_descriptions = list("light discoloring", "a slight blue tint") status_effect_type = /datum/status_effect/wound/blunt/moderate
scar_keyword = "bluntmoderate"
/datum/wound/brute/bone/moderate/crush() /datum/wound/blunt/moderate/crush()
if(prob(33)) if(prob(33))
victim.visible_message("<span class='danger'>[victim]'s dislocated [limb.name] pops back into place!</span>", "<span class='userdanger'>Your dislocated [limb.name] pops back into place! Ow!</span>") victim.visible_message("<span class='danger'>[victim]'s dislocated [limb.name] pops back into place!</span>", "<span class='userdanger'>Your dislocated [limb.name] pops back into place! Ow!</span>")
remove_wound() remove_wound()
/datum/wound/brute/bone/moderate/try_handling(mob/living/carbon/human/user) /datum/wound/blunt/moderate/try_handling(mob/living/carbon/human/user)
if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB) if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB)
return FALSE return FALSE
@@ -256,7 +224,7 @@
return TRUE return TRUE
/// If someone is snapping our dislocated joint back into place by hand with an aggro grab and help intent /// If someone is snapping our dislocated joint back into place by hand with an aggro grab and help intent
/datum/wound/brute/bone/moderate/proc/chiropractice(mob/living/carbon/human/user) /datum/wound/blunt/moderate/proc/chiropractice(mob/living/carbon/human/user)
var/time = base_treat_time var/time = base_treat_time
if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
@@ -275,7 +243,7 @@
chiropractice(user) chiropractice(user)
/// If someone is snapping our dislocated joint into a fracture by hand with an aggro grab and harm or disarm intent /// If someone is snapping our dislocated joint into a fracture by hand with an aggro grab and harm or disarm intent
/datum/wound/brute/bone/moderate/proc/malpractice(mob/living/carbon/human/user) /datum/wound/blunt/moderate/proc/malpractice(mob/living/carbon/human/user)
var/time = base_treat_time var/time = base_treat_time
if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
@@ -293,7 +261,7 @@
malpractice(user) malpractice(user)
/datum/wound/brute/bone/moderate/treat(obj/item/I, mob/user) /datum/wound/blunt/moderate/treat(obj/item/I, mob/user)
if(victim == user) if(victim == user)
victim.visible_message("<span class='danger'>[user] begins resetting [victim.p_their()] [limb.name] with [I].</span>", "<span class='warning'>You begin resetting your [limb.name] with [I]...</span>") victim.visible_message("<span class='danger'>[user] begins resetting [victim.p_their()] [limb.name] with [I].</span>", "<span class='warning'>You begin resetting your [limb.name] with [I]...</span>")
else else
@@ -317,56 +285,57 @@
Severe (Hairline Fracture) Severe (Hairline Fracture)
*/ */
/datum/wound/brute/bone/severe /datum/wound/blunt/severe
name = "Hairline Fracture" name = "Hairline Fracture"
desc = "Patient's bone has suffered a crack in the foundation, causing serious pain and reduced limb functionality." desc = "Patient's bone has suffered a crack in the foundation, causing serious pain and reduced limb functionality."
treat_text = "Recommended light surgical application of bone gel, though splinting will prevent worsening situation." treat_text = "Recommended light surgical application of bone gel, though a sling of medical gauze will prevent worsening situation."
examine_desc = "appears bruised and grotesquely swollen" examine_desc = "appears grotesquely swollen, its attachment weakened"
occur_text = "sprays chips of bone and develops a nasty looking bruise" occur_text = "sprays chips of bone and develops a nasty looking bruise"
severity = WOUND_SEVERITY_SEVERE severity = WOUND_SEVERITY_SEVERE
interaction_efficiency_penalty = 2 interaction_efficiency_penalty = 2
limp_slowdown = 6 limp_slowdown = 4
threshold_minimum = 60 threshold_minimum = 70
threshold_penalty = 30 threshold_penalty = 30
treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/gauze, /obj/item/stack/medical/bone_gel) treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel)
status_effect_type = /datum/status_effect/wound/bone/severe status_effect_type = /datum/status_effect/wound/blunt/severe
treat_priority = TRUE scar_keyword = "bluntsevere"
scarring_descriptions = list("a faded, fist-sized bruise", "a vaguely triangular peel scar")
brain_trauma_group = BRAIN_TRAUMA_MILD brain_trauma_group = BRAIN_TRAUMA_MILD
trauma_cycle_cooldown = 1.5 MINUTES trauma_cycle_cooldown = 1.5 MINUTES
chance_internal_bleeding = 40 internal_bleeding_chance = 40
wound_flags = (BONE_WOUND | ACCEPTS_GAUZE | MANGLES_BONE)
/datum/wound/brute/bone/critical /datum/wound/blunt/critical
name = "Compound Fracture" name = "Compound Fracture"
desc = "Patient's bones have suffered multiple gruesome fractures, causing significant pain and near uselessness of limb." desc = "Patient's bones have suffered multiple gruesome fractures, causing significant pain and near uselessness of limb."
treat_text = "Immediate binding of affected limb, followed by surgical intervention ASAP." treat_text = "Immediate binding of affected limb, followed by surgical intervention ASAP."
examine_desc = "has a cracked bone sticking out of it" examine_desc = "is mangled and pulped, seemingly held together by tissue alone"
occur_text = "cracks apart, exposing broken bones to open air" occur_text = "cracks apart, exposing broken bones to open air"
severity = WOUND_SEVERITY_CRITICAL severity = WOUND_SEVERITY_CRITICAL
interaction_efficiency_penalty = 4 interaction_efficiency_penalty = 4
limp_slowdown = 9 limp_slowdown = 6
sound_effect = 'sound/effects/crack2.ogg' sound_effect = 'sound/effects/wounds/crack2.ogg'
threshold_minimum = 115 threshold_minimum = 125
threshold_penalty = 50 threshold_penalty = 50
disabling = TRUE disabling = TRUE
treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/gauze, /obj/item/stack/medical/bone_gel) treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel)
status_effect_type = /datum/status_effect/wound/bone/critical status_effect_type = /datum/status_effect/wound/blunt/critical
treat_priority = TRUE scar_keyword = "bluntcritical"
scarring_descriptions = list("a section of janky skin lines and badly healed scars", "a large patch of uneven skin tone", "a cluster of calluses")
brain_trauma_group = BRAIN_TRAUMA_SEVERE brain_trauma_group = BRAIN_TRAUMA_SEVERE
trauma_cycle_cooldown = 2.5 MINUTES trauma_cycle_cooldown = 2.5 MINUTES
chance_internal_bleeding = 60 internal_bleeding_chance = 60
wound_flags = (BONE_WOUND | ACCEPTS_GAUZE | MANGLES_BONE)
// doesn't make much sense for "a" bone to stick out of your head // doesn't make much sense for "a" bone to stick out of your head
/datum/wound/brute/bone/critical/apply_wound(obj/item/bodypart/L, silent, datum/wound/old_wound, smited) /datum/wound/blunt/critical/apply_wound(obj/item/bodypart/L, silent, datum/wound/old_wound, smited)
if(L.body_zone == BODY_ZONE_HEAD) if(L.body_zone == BODY_ZONE_HEAD)
occur_text = "splits open, exposing a bare, cracked skull through the flesh and blood" occur_text = "splits open, exposing a bare, cracked skull through the flesh and blood"
examine_desc = "has an unsettling indent, with bits of skull poking out" examine_desc = "has an unsettling indent, with bits of skull poking out"
. = ..() . = ..()
/// if someone is using bone gel on our wound /// if someone is using bone gel on our wound
/datum/wound/brute/bone/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user) /datum/wound/blunt/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user)
if(gelled) if(gelled)
to_chat(user, "<span class='warning'>[user == victim ? "Your" : "[victim]'s"] [limb.name] is already coated with bone gel!</span>") to_chat(user, "<span class='warning'>[user == victim ? "Your" : "[victim]'s"] [limb.name] is already coated with bone gel!</span>")
return return
@@ -385,12 +354,12 @@
var/painkiller_bonus = 0 var/painkiller_bonus = 0
if(victim.drunkenness) if(victim.drunkenness)
painkiller_bonus += 5 painkiller_bonus += 5
if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/medicine/morphine)) if(victim.reagents?.has_reagent(/datum/reagent/medicine/morphine))
painkiller_bonus += 10 painkiller_bonus += 10
if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/determination)) if(victim.reagents?.has_reagent(/datum/reagent/determination))
painkiller_bonus += 5 painkiller_bonus += 5
if(prob(25 + (20 * (severity - 2)) - painkiller_bonus)) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by painkillers if(prob(25 + (20 * severity - 2) - painkiller_bonus)) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by painkillers
victim.visible_message("<span class='danger'>[victim] fails to finish applying [I] to [victim.p_their()] [limb.name], passing out from the pain!</span>", "<span class='notice'>You black out from the pain of applying [I] to your [limb.name] before you can finish!</span>") victim.visible_message("<span class='danger'>[victim] fails to finish applying [I] to [victim.p_their()] [limb.name], passing out from the pain!</span>", "<span class='notice'>You black out from the pain of applying [I] to your [limb.name] before you can finish!</span>")
victim.AdjustUnconscious(5 SECONDS) victim.AdjustUnconscious(5 SECONDS)
return return
@@ -401,7 +370,7 @@
gelled = TRUE gelled = TRUE
/// if someone is using surgical tape on our wound /// if someone is using surgical tape on our wound
/datum/wound/brute/bone/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user) /datum/wound/blunt/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user)
if(!gelled) if(!gelled)
to_chat(user, "<span class='warning'>[user == victim ? "Your" : "[victim]'s"] [limb.name] must be coated with bone gel to perform this emergency operation!</span>") to_chat(user, "<span class='warning'>[user == victim ? "Your" : "[victim]'s"] [limb.name] must be coated with bone gel to perform this emergency operation!</span>")
return return
@@ -426,15 +395,13 @@
taped = TRUE taped = TRUE
processes = TRUE processes = TRUE
/datum/wound/brute/bone/treat(obj/item/I, mob/user) /datum/wound/blunt/treat(obj/item/I, mob/user)
if(istype(I, /obj/item/stack/medical/bone_gel)) if(istype(I, /obj/item/stack/medical/bone_gel))
gel(I, user) gel(I, user)
else if(istype(I, /obj/item/stack/sticky_tape/surgical)) else if(istype(I, /obj/item/stack/sticky_tape/surgical))
tape(I, user) tape(I, user)
else if(istype(I, /obj/item/stack/medical/gauze))
splint(I, user)
/datum/wound/brute/bone/get_scanner_description(mob/user) /datum/wound/blunt/get_scanner_description(mob/user)
. = ..() . = ..()
. += "<div class='ml-3'>" . += "<div class='ml-3'>"
@@ -444,7 +411,7 @@
else if(!taped) else if(!taped)
. += "<span class='notice'>Continue Alternative Treatment: Apply surgical tape directly to injured limb to begin bone regeneration. Note, this is both excruciatingly painful and slow.</span>\n" . += "<span class='notice'>Continue Alternative Treatment: Apply surgical tape directly to injured limb to begin bone regeneration. Note, this is both excruciatingly painful and slow.</span>\n"
else else
. += "<span class='notice'>Note: Bone regeneration in effect. Bone is [round((regen_points_current*100)/regen_points_needed,0.1)]% regenerated.</span>\n" . += "<span class='notice'>Note: Bone regeneration in effect. Bone is [round(regen_points_current*100/regen_points_needed)]% regenerated.</span>\n"
if(limb.body_zone == BODY_ZONE_HEAD) if(limb.body_zone == BODY_ZONE_HEAD)
. += "Cranial Trauma Detected: Patient will suffer random bouts of [severity == WOUND_SEVERITY_SEVERE ? "mild" : "severe"] brain traumas until bone is repaired." . += "Cranial Trauma Detected: Patient will suffer random bouts of [severity == WOUND_SEVERITY_SEVERE ? "mild" : "severe"] brain traumas until bone is repaired."
+42 -69
View File
@@ -1,14 +1,14 @@
// TODO: well, a lot really, but specifically I want to add potential fusing of clothing/equipment on the affected area, and limb infections, though those may go in body part code // TODO: well, a lot really, but specifically I want to add potential fusing of clothing/equipment on the affected area, and limb infections, though those may go in body part code
/datum/wound/burn /datum/wound/burn
a_or_from = "from" a_or_from = "from"
wound_type = WOUND_LIST_BURN wound_type = WOUND_BURN
processes = TRUE processes = TRUE
sound_effect = 'sound/effects/sizzle1.ogg' sound_effect = 'sound/effects/wounds/sizzle1.ogg'
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE)
treatable_by = list(/obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) // sterilizer and alcohol will require reagent treatments, coming soon treatable_by = list(/obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) // sterilizer and alcohol will require reagent treatments, coming soon
// Flesh damage vars // Flesh damage vars
/// How much damage to our flesh we currently have. Once both this and infestation reach 0, the wound is considered healed /// How much damage to our flesh we currently have. Once both this and infestation reach 0, the wound is considered healed
@@ -27,8 +27,6 @@
/// Once we reach infestation beyond WOUND_INFESTATION_SEPSIS, we get this many warnings before the limb is completely paralyzed (you'd have to ignore a really bad burn for a really long time for this to happen) /// Once we reach infestation beyond WOUND_INFESTATION_SEPSIS, we get this many warnings before the limb is completely paralyzed (you'd have to ignore a really bad burn for a really long time for this to happen)
var/strikes_to_lose_limb = 3 var/strikes_to_lose_limb = 3
/// The current bandage we have for this wound (maybe move bandages to the limb?)
var/obj/item/stack/current_bandage
/datum/wound/burn/handle_process() /datum/wound/burn/handle_process()
. = ..() . = ..()
@@ -47,15 +45,11 @@
sanitization += 0.3 sanitization += 0.3
flesh_healing += 0.5 flesh_healing += 0.5
if(current_bandage) if(limb.current_gauze)
current_bandage.absorption_capacity -= WOUND_BURN_SANITIZATION_RATE limb.seep_gauze(WOUND_BURN_SANITIZATION_RATE)
if(current_bandage.absorption_capacity <= 0)
victim.visible_message("<span class='danger'>Pus soaks through \the [current_bandage] on [victim]'s [limb.name].</span>", "<span class='warning'>Pus soaks through \the [current_bandage] on your [limb.name].</span>", vision_distance=COMBAT_MESSAGE_RANGE)
QDEL_NULL(current_bandage)
treat_priority = TRUE
if(flesh_healing > 0) if(flesh_healing > 0)
var/bandage_factor = (current_bandage ? current_bandage.splint_factor : 1) var/bandage_factor = (limb.current_gauze ? limb.current_gauze.splint_factor : 1)
flesh_damage = max(0, flesh_damage - 1) flesh_damage = max(0, flesh_damage - 1)
flesh_healing = max(0, flesh_healing - bandage_factor) // good bandages multiply the length of flesh healing flesh_healing = max(0, flesh_healing - bandage_factor) // good bandages multiply the length of flesh healing
@@ -67,7 +61,7 @@
// sanitization is checked after the clearing check but before the rest, because we freeze the effects of infection while we have sanitization // sanitization is checked after the clearing check but before the rest, because we freeze the effects of infection while we have sanitization
if(sanitization > 0) if(sanitization > 0)
var/bandage_factor = (current_bandage ? current_bandage.splint_factor : 1) var/bandage_factor = (limb.current_gauze ? limb.current_gauze.splint_factor : 1)
infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE) infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE)
sanitization = max(0, sanitization - (WOUND_BURN_SANITIZATION_RATE * bandage_factor)) sanitization = max(0, sanitization - (WOUND_BURN_SANITIZATION_RATE * bandage_factor))
return return
@@ -122,10 +116,10 @@
if(strikes_to_lose_limb <= 0) if(strikes_to_lose_limb <= 0)
return "<span class='deadsay'><B>[victim.p_their(TRUE)] [limb.name] is completely dead and unrecognizable as organic.</B></span>" return "<span class='deadsay'><B>[victim.p_their(TRUE)] [limb.name] is completely dead and unrecognizable as organic.</B></span>"
var/condition = "" var/list/condition = list("[victim.p_their(TRUE)] [limb.name] [examine_desc]")
if(current_bandage) if(limb.current_gauze)
var/bandage_condition var/bandage_condition
switch(current_bandage.absorption_capacity) switch(limb.current_gauze.absorption_capacity)
if(0 to 1.25) if(0 to 1.25)
bandage_condition = "nearly ruined " bandage_condition = "nearly ruined "
if(1.25 to 2.75) if(1.25 to 2.75)
@@ -135,7 +129,7 @@
if(4 to INFINITY) if(4 to INFINITY)
bandage_condition = "clean " bandage_condition = "clean "
condition += " underneath a dressing of [bandage_condition] [current_bandage.name]" condition += " underneath a dressing of [bandage_condition] [limb.current_gauze.name]"
else else
switch(infestation) switch(infestation)
if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE)
@@ -149,7 +143,7 @@
else else
condition += "!" condition += "!"
return "<B>[victim.p_their(TRUE)] [limb.name] [examine_desc][condition]</B>" return "<B>[condition.Join()]</B>"
/datum/wound/burn/get_scanner_description(mob/user) /datum/wound/burn/get_scanner_description(mob/user)
if(strikes_to_lose_limb == 0) if(strikes_to_lose_limb == 0)
@@ -186,7 +180,7 @@
/// if someone is using ointment on our burns /// if someone is using ointment on our burns
/datum/wound/burn/proc/ointment(obj/item/stack/medical/ointment/I, mob/user) /datum/wound/burn/proc/ointment(obj/item/stack/medical/ointment/I, mob/user)
user.visible_message("<span class='notice'>[user] begins applying [I] to [victim]'s [limb.name]...</span>", "<span class='notice'>You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]...</span>") user.visible_message("<span class='notice'>[user] begins applying [I] to [victim]'s [limb.name]...</span>", "<span class='notice'>You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]...</span>")
if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target = victim)) if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), extra_checks = CALLBACK(src, .proc/still_exists)))
return return
limb.heal_damage(I.heal_brute, I.heal_burn) limb.heal_damage(I.heal_brute, I.heal_burn)
@@ -200,36 +194,6 @@
else else
try_treating(I, user) try_treating(I, user)
/// for use in the burn dressing surgery since we don't want to make them do another do_after obviously
/datum/wound/burn/proc/force_bandage(obj/item/stack/medical/gauze/I, mob/user)
QDEL_NULL(current_bandage)
current_bandage = new I.type(limb)
current_bandage.amount = 1
treat_priority = FALSE
sanitization += I.sanitization
I.use(1)
/// if someone is wrapping gauze on our burns
/datum/wound/burn/proc/bandage(obj/item/stack/medical/gauze/I, mob/user)
if(current_bandage)
if(current_bandage.absorption_capacity > I.absorption_capacity + 1)
to_chat(user, "<span class='warning'>The [current_bandage] on [victim]'s [limb.name] is still in better condition than your [I.name]!</span>")
return
user.visible_message("<span class='warning'>[user] begins to redress the burns on [victim]'s [limb.name] with [I]...</span>", "<span class='warning'>You begin redressing the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
else
user.visible_message("<span class='notice'>[user] begins to dress the burns on [victim]'s [limb.name] with [I]...</span>", "<span class='notice'>You begin dressing the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
user.visible_message("<span class='green'>[user] applies [I] to [victim].</span>", "<span class='green'>You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.name].</span>")
QDEL_NULL(current_bandage)
current_bandage = new I.type(limb)
current_bandage.amount = 1
treat_priority = FALSE
sanitization += I.sanitization
I.use(1)
/// if someone is using mesh on our burns /// if someone is using mesh on our burns
/datum/wound/burn/proc/mesh(obj/item/stack/medical/mesh/I, mob/user) /datum/wound/burn/proc/mesh(obj/item/stack/medical/mesh/I, mob/user)
user.visible_message("<span class='notice'>[user] begins wrapping [victim]'s [limb.name] with [I]...</span>", "<span class='notice'>You begin wrapping [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>") user.visible_message("<span class='notice'>[user] begins wrapping [victim]'s [limb.name] with [I]...</span>", "<span class='notice'>You begin wrapping [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
@@ -249,7 +213,7 @@
/// Paramedic UV penlights /// Paramedic UV penlights
/datum/wound/burn/proc/uv(obj/item/flashlight/pen/paramedic/I, mob/user) /datum/wound/burn/proc/uv(obj/item/flashlight/pen/paramedic/I, mob/user)
if(I.uv_cooldown > world.time) if(!COOLDOWN_FINISHED(I, uv_cooldown))
to_chat(user, "<span class='notice'>[I] is still recharging!</span>") to_chat(user, "<span class='notice'>[I] is still recharging!</span>")
return return
if(infestation <= 0 || infestation < sanitization) if(infestation <= 0 || infestation < sanitization)
@@ -258,20 +222,29 @@
user.visible_message("<span class='notice'>[user] flashes the burns on [victim]'s [limb] with [I].</span>", "<span class='notice'>You flash the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I].</span>", vision_distance=COMBAT_MESSAGE_RANGE) user.visible_message("<span class='notice'>[user] flashes the burns on [victim]'s [limb] with [I].</span>", "<span class='notice'>You flash the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I].</span>", vision_distance=COMBAT_MESSAGE_RANGE)
sanitization += I.uv_power sanitization += I.uv_power
I.uv_cooldown = world.time + I.uv_cooldown_length COOLDOWN_START(I, uv_cooldown, I.uv_cooldown_length)
/datum/wound/burn/treat(obj/item/I, mob/user) /datum/wound/burn/treat(obj/item/I, mob/user)
if(istype(I, /obj/item/stack/medical/gauze)) if(istype(I, /obj/item/stack/medical/ointment))
bandage(I, user)
else if(istype(I, /obj/item/stack/medical/ointment))
ointment(I, user) ointment(I, user)
else if(istype(I, /obj/item/stack/medical/mesh)) else if(istype(I, /obj/item/stack/medical/mesh))
mesh(I, user) mesh(I, user)
else if(istype(I, /obj/item/flashlight/pen/paramedic)) else if(istype(I, /obj/item/flashlight/pen/paramedic))
uv(I, user) uv(I, user)
/// basic support for instabitaluri/synthflesh healing flesh damage, more chem support in the future // people complained about burns not healing on stasis beds, so in addition to checking if it's cured, they also get the special ability to very slowly heal on stasis beds if they have the healing effects stored
/datum/wound/burn/proc/regenerate_flesh(amount) /datum/wound/burn/on_stasis()
. = ..()
if(flesh_healing > 0)
flesh_damage = max(0, flesh_damage - 0.2)
if((flesh_damage <= 0) && (infestation <= 1))
to_chat(victim, "<span class='green'>The burns on your [limb.name] have cleared up!</span>")
qdel(src)
return
if(sanitization > 0)
infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE * 0.2)
/datum/wound/burn/on_synthflesh(amount)
flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard
// we don't even care about first degree burns, straight to second // we don't even care about first degree burns, straight to second
@@ -282,12 +255,12 @@
examine_desc = "is badly burned and breaking out in blisters" examine_desc = "is badly burned and breaking out in blisters"
occur_text = "breaks out with violent red burns" occur_text = "breaks out with violent red burns"
severity = WOUND_SEVERITY_MODERATE severity = WOUND_SEVERITY_MODERATE
damage_mulitplier_penalty = 1.1 damage_mulitplier_penalty = 1.05
threshold_minimum = 40 threshold_minimum = 50
threshold_penalty = 30 // burns cause significant decrease in limb integrity compared to other wounds threshold_penalty = 30 // burns cause significant decrease in limb integrity compared to other wounds
status_effect_type = /datum/status_effect/wound/burn/moderate status_effect_type = /datum/status_effect/wound/burn/moderate
flesh_damage = 5 flesh_damage = 5
scarring_descriptions = list("small amoeba-shaped skinmarks", "a faded streak of depressed skin") scar_keyword = "burnmoderate"
/datum/wound/burn/severe /datum/wound/burn/severe
name = "Third Degree Burns" name = "Third Degree Burns"
@@ -296,14 +269,14 @@
examine_desc = "appears seriously charred, with aggressive red splotches" examine_desc = "appears seriously charred, with aggressive red splotches"
occur_text = "chars rapidly, exposing ruined tissue and spreading angry red burns" occur_text = "chars rapidly, exposing ruined tissue and spreading angry red burns"
severity = WOUND_SEVERITY_SEVERE severity = WOUND_SEVERITY_SEVERE
damage_mulitplier_penalty = 1.2 damage_mulitplier_penalty = 1.1
threshold_minimum = 80 threshold_minimum = 90
threshold_penalty = 40 threshold_penalty = 40
status_effect_type = /datum/status_effect/wound/burn/severe status_effect_type = /datum/status_effect/wound/burn/severe
treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh)
infestation_rate = 0.05 // appx 13 minutes to reach sepsis without any treatment infestation_rate = 0.05 // appx 13 minutes to reach sepsis without any treatment
flesh_damage = 12.5 flesh_damage = 12.5
scarring_descriptions = list("a large, jagged patch of faded skin", "random spots of shiny, smooth skin", "spots of taut, leathery skin") scar_keyword = "burnsevere"
/datum/wound/burn/critical /datum/wound/burn/critical
name = "Catastrophic Burns" name = "Catastrophic Burns"
@@ -312,12 +285,12 @@
examine_desc = "is a ruined mess of blanched bone, melted fat, and charred tissue" examine_desc = "is a ruined mess of blanched bone, melted fat, and charred tissue"
occur_text = "vaporizes as flesh, bone, and fat melt together in a horrifying mess" occur_text = "vaporizes as flesh, bone, and fat melt together in a horrifying mess"
severity = WOUND_SEVERITY_CRITICAL severity = WOUND_SEVERITY_CRITICAL
damage_mulitplier_penalty = 1.3 damage_mulitplier_penalty = 1.15
sound_effect = 'sound/effects/sizzle2.ogg' sound_effect = 'sound/effects/wounds/sizzle2.ogg'
threshold_minimum = 140 threshold_minimum = 150
threshold_penalty = 80 threshold_penalty = 80
status_effect_type = /datum/status_effect/wound/burn/critical status_effect_type = /datum/status_effect/wound/burn/critical
treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh)
infestation_rate = 0.15 // appx 4.33 minutes to reach sepsis without any treatment infestation_rate = 0.15 // appx 4.33 minutes to reach sepsis without any treatment
flesh_damage = 20 flesh_damage = 20
scarring_descriptions = list("massive, disfiguring keloid scars", "several long streaks of badly discolored and malformed skin", "unmistakeable splotches of dead tissue from serious burns") scar_keyword = "burncritical"
+41
View File
@@ -0,0 +1,41 @@
/datum/wound/loss
name = "Dismembered"
desc = "oof ouch!!"
sound_effect = 'sound/effects/dismember.ogg'
severity = WOUND_SEVERITY_LOSS
threshold_minimum = 180
status_effect_type = null
scar_keyword = "dismember"
wound_flags = null
/// Our special proc for our special dismembering, the wounding type only matters for what text we have
/datum/wound/loss/proc/apply_dismember(obj/item/bodypart/dismembered_part, wounding_type=WOUND_SLASH)
if(!istype(dismembered_part) || !dismembered_part.owner || !(dismembered_part.body_zone in viable_zones) || isalien(dismembered_part.owner) || !dismembered_part.can_dismember())
qdel(src)
return
already_scarred = TRUE // so we don't scar a limb we don't have. If I add different levels of amputation desc, do it here
switch(wounding_type)
if(WOUND_BLUNT)
occur_text = "is shattered through the last bone holding it together, severing it completely!"
if(WOUND_SLASH)
occur_text = "is slashed through the last tissue holding it together, severing it completely!"
if(WOUND_PIERCE)
occur_text = "is pierced through the last tissue holding it together, severing it completely!"
if(WOUND_BURN)
occur_text = "is completely incinerated, falling to dust!"
victim = dismembered_part.owner
var/msg = "<span class='bolddanger'>[victim]'s [dismembered_part.name] [occur_text]!</span>"
victim.visible_message(msg, "<span class='userdanger'>Your [dismembered_part.name] [occur_text]!</span>")
limb = dismembered_part
severity = WOUND_SEVERITY_LOSS
second_wind()
log_wound(victim, src)
dismembered_part.dismember(wounding_type == WOUND_BURN ? BURN : BRUTE)
qdel(src)
+170
View File
@@ -0,0 +1,170 @@
/*
Pierce
*/
/datum/wound/pierce
sound_effect = 'sound/weapons/slice.ogg'
processes = TRUE
wound_type = WOUND_PIERCE
treatable_by = list(/obj/item/stack/medical/suture)
treatable_tool = TOOL_CAUTERY
base_treat_time = 3 SECONDS
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE)
/// How much blood we start losing when this wound is first applied
var/initial_flow
/// If gauzed, what percent of the internal bleeding actually clots of the total absorption rate
var/gauzed_clot_rate
/// When hit on this bodypart, we have this chance of losing some blood + the incoming damage
var/internal_bleeding_chance
/// If we let off blood when hit, the max blood lost is this * the incoming damage
var/internal_bleeding_coefficient
/datum/wound/pierce/wound_injury(datum/wound/old_wound)
blood_flow = initial_flow
/datum/wound/pierce/receive_damage(wounding_type, wounding_dmg, wound_bonus)
if(victim.stat == DEAD || wounding_dmg < 5)
return
if(victim.blood_volume && prob(internal_bleeding_chance + wounding_dmg))
if(limb.current_gauze && limb.current_gauze.splint_factor)
wounding_dmg *= (1 - limb.current_gauze.splint_factor)
var/blood_bled = rand(1, wounding_dmg * internal_bleeding_coefficient) // 12 brute toolbox can cause up to 15/18/21 bloodloss on mod/sev/crit
switch(blood_bled)
if(1 to 6)
victim.bleed(blood_bled, TRUE)
if(7 to 13)
victim.visible_message("<span class='smalldanger'>Blood droplets fly from the hole in [victim]'s [limb.name].</span>", "<span class='danger'>You cough up a bit of blood from the blow to your [limb.name].</span>", vision_distance=COMBAT_MESSAGE_RANGE)
victim.bleed(blood_bled, TRUE)
if(14 to 19)
victim.visible_message("<span class='smalldanger'>A small stream of blood spurts from the hole in [victim]'s [limb.name]!</span>", "<span class='danger'>You spit out a string of blood from the blow to your [limb.name]!</span>", vision_distance=COMBAT_MESSAGE_RANGE)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir)
victim.bleed(blood_bled)
if(20 to INFINITY)
victim.visible_message("<span class='danger'>A spray of blood streams from the gash in [victim]'s [limb.name]!</span>", "<span class='danger'><b>You choke up on a spray of blood from the blow to your [limb.name]!</b></span>", vision_distance=COMBAT_MESSAGE_RANGE)
victim.bleed(blood_bled)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir)
victim.add_splatter_floor(get_step(victim.loc, victim.dir))
/datum/wound/pierce/handle_process()
blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)
if(victim.bodytemperature < (BODYTEMP_NORMAL - 10))
blood_flow -= 0.2
if(prob(5))
to_chat(victim, "<span class='notice'>You feel the [lowertext(name)] in your [limb.name] firming up from the cold!</span>")
if(victim.reagents?.has_reagent(/datum/reagent/toxin/heparin))
blood_flow += 0.5 // old herapin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first
if(limb.current_gauze)
blood_flow -= limb.current_gauze.absorption_rate * gauzed_clot_rate
limb.current_gauze.absorption_capacity -= limb.current_gauze.absorption_rate
if(blood_flow <= 0)
qdel(src)
/datum/wound/pierce/on_stasis()
. = ..()
if(blood_flow <= 0)
qdel(src)
/datum/wound/pierce/treat(obj/item/I, mob/user)
if(istype(I, /obj/item/stack/medical/suture))
suture(I, user)
else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature() > 300)
tool_cauterize(I, user)
/datum/wound/pierce/on_xadone(power)
. = ..()
blood_flow -= 0.03 * power // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort
/datum/wound/pierce/on_synthflesh(power)
. = ..()
blood_flow -= 0.05 * power // 20u * 0.05 = -1 blood flow, less than with slashes but still good considering smaller bleed rates
/// If someone is using a suture to close this cut
/datum/wound/pierce/proc/suture(obj/item/stack/medical/suture/I, mob/user)
var/self_penalty_mult = (user == victim ? 1.4 : 1)
user.visible_message("<span class='notice'>[user] begins stitching [victim]'s [limb.name] with [I]...</span>", "<span class='notice'>You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
user.visible_message("<span class='green'>[user] stitches up some of the bleeding on [victim].</span>", "<span class='green'>You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"].</span>")
var/blood_sutured = I.stop_bleeding / self_penalty_mult * 0.5
blood_flow -= blood_sutured
limb.heal_damage(I.heal_brute, I.heal_burn)
if(blood_flow > 0)
try_treating(I, user)
else
to_chat(user, "<span class='green'>You successfully close the hole in [user == victim ? "your" : "[victim]'s"] [limb.name].</span>")
/// If someone is using either a cautery tool or something with heat to cauterize this pierce
/datum/wound/pierce/proc/tool_cauterize(obj/item/I, mob/user)
var/self_penalty_mult = (user == victim ? 1.5 : 1)
user.visible_message("<span class='danger'>[user] begins cauterizing [victim]'s [limb.name] with [I]...</span>", "<span class='danger'>You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
user.visible_message("<span class='green'>[user] cauterizes some of the bleeding on [victim].</span>", "<span class='green'>You cauterize some of the bleeding on [victim].</span>")
limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND)
if(prob(30))
victim.emote("scream")
var/blood_cauterized = (0.6 / self_penalty_mult) * 0.5
blood_flow -= blood_cauterized
if(blood_flow > 0)
try_treating(I, user)
/datum/wound/pierce/moderate
name = "Minor Breakage"
desc = "Patient's skin has been broken open, causing severe bruising and minor internal bleeding in affected area."
treat_text = "Treat affected site with bandaging or exposure to extreme cold. In dire cases, brief exposure to vacuum may suffice." // space is cold in ss13, so it's like an ice pack!
examine_desc = "has a small, circular hole, gently bleeding"
occur_text = "spurts out a thin stream of blood"
sound_effect = 'sound/effects/wounds/pierce1.ogg'
severity = WOUND_SEVERITY_MODERATE
initial_flow = 1.5
gauzed_clot_rate = 0.8
internal_bleeding_chance = 30
internal_bleeding_coefficient = 1.25
threshold_minimum = 40
threshold_penalty = 15
status_effect_type = /datum/status_effect/wound/pierce/moderate
scar_keyword = "piercemoderate"
/datum/wound/pierce/severe
name = "Open Puncture"
desc = "Patient's internal tissue is penetrated, causing sizeable internal bleeding and reduced limb stability."
treat_text = "Repair punctures in skin by suture or cautery, extreme cold may also work."
examine_desc = "is pierced clear through, with bits of tissue obscuring the open hole"
occur_text = "looses a violent spray of blood, revealing a pierced wound"
sound_effect = 'sound/effects/wounds/pierce2.ogg'
severity = WOUND_SEVERITY_SEVERE
initial_flow = 2.25
gauzed_clot_rate = 0.6
internal_bleeding_chance = 60
internal_bleeding_coefficient = 1.5
threshold_minimum = 60
threshold_penalty = 25
status_effect_type = /datum/status_effect/wound/pierce/severe
scar_keyword = "piercesevere"
/datum/wound/pierce/critical
name = "Ruptured Cavity"
desc = "Patient's internal tissue and circulatory system is shredded, causing significant internal bleeding and damage to internal organs."
treat_text = "Surgical repair of puncture wound, followed by supervised resanguination."
examine_desc = "is ripped clear through, barely held together by exposed bone"
occur_text = "blasts apart, sending chunks of viscera flying in all directions"
sound_effect = 'sound/effects/wounds/pierce3.ogg'
severity = WOUND_SEVERITY_CRITICAL
initial_flow = 3
gauzed_clot_rate = 0.4
internal_bleeding_chance = 80
internal_bleeding_coefficient = 1.75
threshold_minimum = 110
threshold_penalty = 40
status_effect_type = /datum/status_effect/wound/pierce/critical
scar_keyword = "piercecritical"
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH)
@@ -1,17 +1,16 @@
/* /*
Cuts Cuts
*/ */
/datum/wound/brute/cut /datum/wound/slash
sound_effect = 'sound/weapons/slice.ogg' sound_effect = 'sound/weapons/slice.ogg'
processes = TRUE processes = TRUE
wound_type = WOUND_LIST_CUT wound_type = WOUND_SLASH
treatable_by = list(/obj/item/stack/medical/suture, /obj/item/stack/medical/gauze) treatable_by = list(/obj/item/stack/medical/suture)
treatable_by_grabbed = list(/obj/item/gun/energy/laser) treatable_by_grabbed = list(/obj/item/gun/energy/laser)
treatable_tool = TOOL_CAUTERY treatable_tool = TOOL_CAUTERY
treat_priority = TRUE
base_treat_time = 3 SECONDS base_treat_time = 3 SECONDS
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE)
/// How much blood we start losing when this wound is first applied /// How much blood we start losing when this wound is first applied
var/initial_flow var/initial_flow
@@ -27,75 +26,82 @@
var/max_per_type var/max_per_type
/// The maximum flow we've had so far /// The maximum flow we've had so far
var/highest_flow var/highest_flow
/// How much flow we've already cauterized
var/cauterized
/// How much flow we've already sutured
var/sutured
/// The current bandage we have for this wound (maybe move bandages to the limb?)
var/obj/item/stack/current_bandage
/// A bad system I'm using to track the worst scar we earned (since we can demote, we want the biggest our wound has been, not what it was when it was cured (probably moderate)) /// A bad system I'm using to track the worst scar we earned (since we can demote, we want the biggest our wound has been, not what it was when it was cured (probably moderate))
var/datum/scar/highest_scar var/datum/scar/highest_scar
/datum/wound/brute/cut/wound_injury(datum/wound/brute/cut/old_wound = null) /datum/wound/slash/wound_injury(datum/wound/slash/old_wound = null)
blood_flow = initial_flow blood_flow = initial_flow
if(old_wound) if(old_wound)
blood_flow = max(old_wound.blood_flow, initial_flow) blood_flow = max(old_wound.blood_flow, initial_flow)
if(old_wound.severity > severity && old_wound.highest_scar) if(old_wound.severity > severity && old_wound.highest_scar)
highest_scar = old_wound.highest_scar highest_scar = old_wound.highest_scar
old_wound.highest_scar = null old_wound.highest_scar = null
if(old_wound.current_bandage)
current_bandage = old_wound.current_bandage
old_wound.current_bandage = null
if(!highest_scar) if(!highest_scar)
highest_scar = new highest_scar = new
highest_scar.generate(limb, src, add_to_scars=FALSE) highest_scar.generate(limb, src, add_to_scars=FALSE)
/datum/wound/brute/cut/remove_wound(ignore_limb, replaced) /datum/wound/slash/remove_wound(ignore_limb, replaced)
if(!replaced && highest_scar) if(!replaced && highest_scar)
already_scarred = TRUE already_scarred = TRUE
highest_scar.lazy_attach(limb) highest_scar.lazy_attach(limb)
return ..() return ..()
/datum/wound/brute/cut/get_examine_description(mob/user) /datum/wound/slash/get_examine_description(mob/user)
if(!current_bandage) if(!limb.current_gauze)
return ..() return ..()
var/bandage_condition = "" var/list/msg = list("The cuts on [victim.p_their()] [limb.name] are wrapped with")
// how much life we have left in these bandages // how much life we have left in these bandages
switch(current_bandage.absorption_capacity) switch(limb.current_gauze.absorption_capacity)
if(0 to 1.25) if(0 to 1.25)
bandage_condition = "nearly ruined " msg += "nearly ruined "
if(1.25 to 2.75) if(1.25 to 2.75)
bandage_condition = "badly worn " msg += "badly worn "
if(2.75 to 4) if(2.75 to 4)
bandage_condition = "slightly bloodied " msg += "slightly bloodied "
if(4 to INFINITY) if(4 to INFINITY)
bandage_condition = "clean " msg += "clean "
return "<B>The cuts on [victim.p_their()] [limb.name] are wrapped with [bandage_condition] [current_bandage.name]!</B>" msg += "[limb.current_gauze.name]!"
/datum/wound/brute/cut/receive_damage(wounding_type, wounding_dmg, wound_bonus) return "<B>[msg.Join()]</B>"
if(victim.stat != DEAD && wounding_type == WOUND_SHARP) // can't stab dead bodies to make it bleed faster this way
/datum/wound/slash/receive_damage(wounding_type, wounding_dmg, wound_bonus)
if(victim.stat != DEAD && wounding_type == WOUND_SLASH) // can't stab dead bodies to make it bleed faster this way
blood_flow += 0.05 * wounding_dmg blood_flow += 0.05 * wounding_dmg
/datum/wound/brute/cut/handle_process() /datum/wound/slash/drag_bleed_amount()
blood_flow = min(blood_flow, WOUND_CUT_MAX_BLOODFLOW) // say we have 3 severe cuts with 3 blood flow each, pretty reasonable
// compare with being at 100 brute damage before, where you bled (brute/100 * 2), = 2 blood per tile
var/bleed_amt = min(blood_flow * 0.1, 1) // 3 * 3 * 0.1 = 0.9 blood total, less than before! the share here is .3 blood of course.
if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/toxin/heparin)) if(limb.current_gauze) // gauze stops all bleeding from dragging on this limb, but wears the gauze out quicker
limb.seep_gauze(bleed_amt * 0.33)
return
return bleed_amt
/datum/wound/slash/handle_process()
if(victim.stat == DEAD)
blood_flow -= max(clot_rate, WOUND_SLASH_DEAD_CLOT_MIN)
if(blood_flow < minimum_flow)
if(demotes_to)
replace_wound(demotes_to)
return
qdel(src)
return
blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)
if(victim.reagents?.has_reagent(/datum/reagent/toxin/heparin))
blood_flow += 0.5 // old herapin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first blood_flow += 0.5 // old herapin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first
else if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/medicine/coagulant))
blood_flow -= 0.25
if(current_bandage) if(limb.current_gauze)
if(clot_rate > 0) if(clot_rate > 0)
blood_flow -= clot_rate blood_flow -= clot_rate
blood_flow -= current_bandage.absorption_rate blood_flow -= limb.current_gauze.absorption_rate
current_bandage.absorption_capacity -= current_bandage.absorption_rate limb.seep_gauze(limb.current_gauze.absorption_rate)
if(current_bandage.absorption_capacity < 0)
victim.visible_message("<span class='danger'>Blood soaks through \the [current_bandage] on [victim]'s [limb.name].</span>", "<span class='warning'>Blood soaks through \the [current_bandage] on your [limb.name].</span>", vision_distance=COMBAT_MESSAGE_RANGE)
QDEL_NULL(current_bandage)
treat_priority = TRUE
else else
blood_flow -= clot_rate blood_flow -= clot_rate
@@ -109,41 +115,57 @@
to_chat(victim, "<span class='green'>The cut on your [limb.name] has stopped bleeding!</span>") to_chat(victim, "<span class='green'>The cut on your [limb.name] has stopped bleeding!</span>")
qdel(src) qdel(src)
/datum/wound/slash/on_stasis()
if(blood_flow >= minimum_flow)
return
if(demotes_to)
replace_wound(demotes_to)
return
qdel(src)
/* BEWARE, THE BELOW NONSENSE IS MADNESS. bones.dm looks more like what I have in mind and is sufficiently clean, don't pay attention to this messiness */ /* BEWARE, THE BELOW NONSENSE IS MADNESS. bones.dm looks more like what I have in mind and is sufficiently clean, don't pay attention to this messiness */
/datum/wound/brute/cut/check_grab_treatments(obj/item/I, mob/user) /datum/wound/slash/check_grab_treatments(obj/item/I, mob/user)
if(istype(I, /obj/item/gun/energy/laser)) if(istype(I, /obj/item/gun/energy/laser))
return TRUE return TRUE
/datum/wound/brute/cut/treat(obj/item/I, mob/user) /datum/wound/slash/treat(obj/item/I, mob/user)
if(istype(I, /obj/item/gun/energy/laser)) if(istype(I, /obj/item/gun/energy/laser))
las_cauterize(I, user) las_cauterize(I, user)
else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature() > 300) else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature() > 300)
tool_cauterize(I, user) tool_cauterize(I, user)
else if(istype(I, /obj/item/stack/medical/gauze))
bandage(I, user)
else if(istype(I, /obj/item/stack/medical/suture)) else if(istype(I, /obj/item/stack/medical/suture))
suture(I, user) suture(I, user)
/datum/wound/brute/cut/try_handling(mob/living/carbon/human/user) /datum/wound/slash/try_handling(mob/living/carbon/human/user)
if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB) if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB)
return FALSE return FALSE
if(!iscatperson(user)) if(!iscatperson(user))
return FALSE return FALSE
if(!(user.client?.prefs.vore_flags & LICKABLE))
return FALSE
lick_wounds(user) lick_wounds(user)
return TRUE return TRUE
/// if a felinid is licking this cut to reduce bleeding /// if a felinid is licking this cut to reduce bleeding
/datum/wound/brute/cut/proc/lick_wounds(mob/living/carbon/human/user) /datum/wound/slash/proc/lick_wounds(mob/living/carbon/human/user)
if(INTERACTING_WITH(user, victim)) if(INTERACTING_WITH(user, victim))
to_chat(user, "<span class='warning'>You're already interacting with [victim]!</span>") to_chat(user, "<span class='warning'>You're already interacting with [victim]!</span>")
return return
if(user.is_mouth_covered())
to_chat(user, "<span class='warning'>Your mouth is covered, you can't lick [victim]'s wounds!</span>")
return
if(!user.getorganslot(ORGAN_SLOT_TONGUE))
to_chat(user, "<span class='warning'>You can't lick wounds without a tongue!</span>") // f in chat
return
// transmission is one way patient -> felinid since google said cat saliva is antiseptic or whatever, and also because felinids are already risking getting beaten for this even without people suspecting they're spreading a deathvirus
for(var/datum/disease/D in victim.diseases)
user.ForceContractDisease(D)
user.visible_message("<span class='notice'>[user] begins licking the wounds on [victim]'s [limb.name].</span>", "<span class='notice'>You begin licking the wounds on [victim]'s [limb.name]...</span>", ignored_mobs=victim) user.visible_message("<span class='notice'>[user] begins licking the wounds on [victim]'s [limb.name].</span>", "<span class='notice'>You begin licking the wounds on [victim]'s [limb.name]...</span>", ignored_mobs=victim)
to_chat(victim, "<span class='notice'>[user] begins to lick the wounds on your [limb.name].</span") to_chat(victim, "<span class='notice'>[user] begins to lick the wounds on your [limb.name].</span")
if(!do_after(user, base_treat_time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) if(!do_after(user, base_treat_time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
@@ -163,12 +185,16 @@
else if(demotes_to) else if(demotes_to)
to_chat(user, "<span class='green'>You successfully lower the severity of [victim]'s cuts.</span>") to_chat(user, "<span class='green'>You successfully lower the severity of [victim]'s cuts.</span>")
/datum/wound/brute/cut/on_xadone(power) /datum/wound/slash/on_xadone(power)
. = ..() . = ..()
blood_flow -= 0.03 * power // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort blood_flow -= 0.03 * power // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort
/datum/wound/slash/on_synthflesh(power)
. = ..()
blood_flow -= 0.075 * power // 20u * 0.075 = -1.5 blood flow, pretty good for how little effort it is
/// If someone's putting a laser gun up to our cut to cauterize it /// If someone's putting a laser gun up to our cut to cauterize it
/datum/wound/brute/cut/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user) /datum/wound/slash/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user)
var/self_penalty_mult = (user == victim ? 1.25 : 1) var/self_penalty_mult = (user == victim ? 1.25 : 1)
user.visible_message("<span class='warning'>[user] begins aiming [lasgun] directly at [victim]'s [limb.name]...</span>", "<span class='userdanger'>You begin aiming [lasgun] directly at [user == victim ? "your" : "[victim]'s"] [limb.name]...</span>") user.visible_message("<span class='warning'>[user] begins aiming [lasgun] directly at [victim]'s [limb.name]...</span>", "<span class='userdanger'>You begin aiming [lasgun] directly at [user == victim ? "your" : "[victim]'s"] [limb.name]...</span>")
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
@@ -180,11 +206,10 @@
return return
victim.emote("scream") victim.emote("scream")
blood_flow -= damage / (5 * self_penalty_mult) // 20 / 5 = 4 bloodflow removed, p good blood_flow -= damage / (5 * self_penalty_mult) // 20 / 5 = 4 bloodflow removed, p good
cauterized += damage / (5 * self_penalty_mult)
victim.visible_message("<span class='warning'>The cuts on [victim]'s [limb.name] scar over!</span>") victim.visible_message("<span class='warning'>The cuts on [victim]'s [limb.name] scar over!</span>")
/// If someone is using either a cautery tool or something with heat to cauterize this cut /// If someone is using either a cautery tool or something with heat to cauterize this cut
/datum/wound/brute/cut/proc/tool_cauterize(obj/item/I, mob/user) /datum/wound/slash/proc/tool_cauterize(obj/item/I, mob/user)
var/self_penalty_mult = (user == victim ? 1.5 : 1) var/self_penalty_mult = (user == victim ? 1.5 : 1)
user.visible_message("<span class='danger'>[user] begins cauterizing [victim]'s [limb.name] with [I]...</span>", "<span class='danger'>You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>") user.visible_message("<span class='danger'>[user] begins cauterizing [victim]'s [limb.name] with [I]...</span>", "<span class='danger'>You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
@@ -196,7 +221,6 @@
victim.emote("scream") victim.emote("scream")
var/blood_cauterized = (0.6 / self_penalty_mult) var/blood_cauterized = (0.6 / self_penalty_mult)
blood_flow -= blood_cauterized blood_flow -= blood_cauterized
cauterized += blood_cauterized
if(blood_flow > minimum_flow) if(blood_flow > minimum_flow)
try_treating(I, user) try_treating(I, user)
@@ -204,15 +228,15 @@
to_chat(user, "<span class='green'>You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.</span>") to_chat(user, "<span class='green'>You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.</span>")
/// If someone is using a suture to close this cut /// If someone is using a suture to close this cut
/datum/wound/brute/cut/proc/suture(obj/item/stack/medical/suture/I, mob/user) /datum/wound/slash/proc/suture(obj/item/stack/medical/suture/I, mob/user)
var/self_penalty_mult = (user == victim ? 1.4 : 1) var/self_penalty_mult = (user == victim ? 1.4 : 1)
user.visible_message("<span class='notice'>[user] begins stitching [victim]'s [limb.name] with [I]...</span>", "<span class='notice'>You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>") user.visible_message("<span class='notice'>[user] begins stitching [victim]'s [limb.name] with [I]...</span>", "<span class='notice'>You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return return
user.visible_message("<span class='green'>[user] stitches up some of the bleeding on [victim].</span>", "<span class='green'>You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"].</span>") user.visible_message("<span class='green'>[user] stitches up some of the bleeding on [victim].</span>", "<span class='green'>You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"].</span>")
var/blood_sutured = I.stop_bleeding / self_penalty_mult var/blood_sutured = I.stop_bleeding / self_penalty_mult
blood_flow -= blood_sutured blood_flow -= blood_sutured
sutured += blood_sutured
limb.heal_damage(I.heal_brute, I.heal_burn) limb.heal_damage(I.heal_brute, I.heal_burn)
if(blood_flow > minimum_flow) if(blood_flow > minimum_flow)
@@ -220,95 +244,57 @@
else if(demotes_to) else if(demotes_to)
to_chat(user, "<span class='green'>You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.</span>") to_chat(user, "<span class='green'>You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.</span>")
/// If someone is using gauze on this cut
/datum/wound/brute/cut/proc/bandage(obj/item/stack/I, mob/user)
if(current_bandage)
if(current_bandage.absorption_capacity > I.absorption_capacity + 1)
to_chat(user, "<span class='warning'>The [current_bandage] on [victim]'s [limb.name] is still in better condition than your [I.name]!</span>")
return
else
user.visible_message("<span class='warning'>[user] begins rewrapping the cuts on [victim]'s [limb.name] with [I]...</span>", "<span class='warning'>You begin rewrapping the cuts on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
else
user.visible_message("<span class='warning'>[user] begins wrapping the cuts on [victim]'s [limb.name] with [I]...</span>", "<span class='warning'>You begin wrapping the cuts on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
if(!do_after(user, base_treat_time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
user.visible_message("<span class='green'>[user] applies [I] to [victim]'s [limb.name].</span>", "<span class='green'>You bandage some of the bleeding on [user == victim ? "yourself" : "[victim]"].</span>") /datum/wound/slash/moderate
QDEL_NULL(current_bandage)
current_bandage = new I.type(limb)
current_bandage.amount = 1
treat_priority = FALSE
I.use(1)
/datum/wound/brute/cut/moderate
name = "Rough Abrasion" name = "Rough Abrasion"
desc = "Patient's skin has been badly scraped, generating moderate blood loss." desc = "Patient's skin has been badly scraped, generating moderate blood loss."
treat_text = "Application of clean bandages or first-aid grade sutures, followed by food and rest." treat_text = "Application of clean bandages or first-aid grade sutures, followed by food and rest."
examine_desc = "has an open cut" examine_desc = "has an open cut"
occur_text = "is cut open, slowly leaking blood" occur_text = "is cut open, slowly leaking blood"
sound_effect = 'sound/effects/blood1.ogg' sound_effect = 'sound/effects/wounds/blood1.ogg'
severity = WOUND_SEVERITY_MODERATE severity = WOUND_SEVERITY_MODERATE
initial_flow = 2 initial_flow = 2
minimum_flow = 0.5 minimum_flow = 0.5
max_per_type = 3 max_per_type = 3
clot_rate = 0.15 clot_rate = 0.12
threshold_minimum = 20 threshold_minimum = 30
threshold_penalty = 10 threshold_penalty = 10
status_effect_type = /datum/status_effect/wound/cut/moderate status_effect_type = /datum/status_effect/wound/slash/moderate
scarring_descriptions = list("light, faded lines", "minor cut marks", "a small faded slit", "a series of small scars") scar_keyword = "slashmoderate"
/datum/wound/brute/cut/severe /datum/wound/slash/severe
name = "Open Laceration" name = "Open Laceration"
desc = "Patient's skin is ripped clean open, allowing significant blood loss." desc = "Patient's skin is ripped clean open, allowing significant blood loss."
treat_text = "Speedy application of first-aid grade sutures and clean bandages, followed by vitals monitoring to ensure recovery." treat_text = "Speedy application of first-aid grade sutures and clean bandages, followed by vitals monitoring to ensure recovery."
examine_desc = "has a severe cut" examine_desc = "has a severe cut"
occur_text = "is ripped open, veins spurting blood" occur_text = "is ripped open, veins spurting blood"
sound_effect = 'sound/effects/blood2.ogg' sound_effect = 'sound/effects/wounds/blood2.ogg'
severity = WOUND_SEVERITY_SEVERE severity = WOUND_SEVERITY_SEVERE
initial_flow = 3.25 initial_flow = 3.25
minimum_flow = 2.75 minimum_flow = 2.75
clot_rate = 0.07 clot_rate = 0.07
max_per_type = 4 max_per_type = 4
threshold_minimum = 50 threshold_minimum = 60
threshold_penalty = 25 threshold_penalty = 25
demotes_to = /datum/wound/brute/cut/moderate demotes_to = /datum/wound/slash/moderate
status_effect_type = /datum/status_effect/wound/cut/severe status_effect_type = /datum/status_effect/wound/slash/severe
scarring_descriptions = list("a twisted line of faded gashes", "a gnarled sickle-shaped slice scar", "a long-faded puncture wound") scar_keyword = "slashsevere"
/datum/wound/brute/cut/critical /datum/wound/slash/critical
name = "Weeping Avulsion" name = "Weeping Avulsion"
desc = "Patient's skin is completely torn open, along with significant loss of tissue. Extreme blood loss will lead to quick death without intervention." desc = "Patient's skin is completely torn open, along with significant loss of tissue. Extreme blood loss will lead to quick death without intervention."
treat_text = "Immediate bandaging and either suturing or cauterization, followed by supervised resanguination." treat_text = "Immediate bandaging and either suturing or cauterization, followed by supervised resanguination."
examine_desc = "is spurting blood at an alarming rate" examine_desc = "is carved down to the bone, spraying blood wildly"
occur_text = "is torn open, spraying blood wildly" occur_text = "is torn open, spraying blood wildly"
sound_effect = 'sound/effects/blood3.ogg' sound_effect = 'sound/effects/wounds/blood3.ogg'
severity = WOUND_SEVERITY_CRITICAL severity = WOUND_SEVERITY_CRITICAL
initial_flow = 4.25 initial_flow = 4.25
minimum_flow = 4 minimum_flow = 4
clot_rate = -0.05 // critical cuts actively get worse instead of better clot_rate = -0.05 // critical cuts actively get worse instead of better
max_per_type = 5 max_per_type = 5
threshold_minimum = 80 threshold_minimum = 90
threshold_penalty = 40 threshold_penalty = 40
demotes_to = /datum/wound/brute/cut/severe demotes_to = /datum/wound/slash/severe
status_effect_type = /datum/status_effect/wound/cut/critical status_effect_type = /datum/status_effect/wound/slash/critical
scarring_descriptions = list("a winding path of very badly healed scar tissue", "a series of peaks and valleys along a gruesome line of cut scar tissue", "a grotesque snake of indentations and stitching scars") scar_keyword = "slashcritical"
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH)
// TODO: see about moving dismemberment over to this, i'll have to add judging dismembering power/wound potential wrt item size i guess
/datum/wound/brute/cut/loss
name = "Dismembered"
desc = "oof ouch!!"
occur_text = "is violently dismembered!"
sound_effect = 'sound/effects/dismember.ogg'
viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
severity = WOUND_SEVERITY_LOSS
threshold_minimum = 180
status_effect_type = null
/datum/wound/brute/cut/loss/apply_wound(obj/item/bodypart/L, silent, datum/wound/brute/cut/old_wound, smited = FALSE)
if(!L.dismemberable)
qdel(src)
return
L.dismember()
qdel(src)
@@ -62,7 +62,7 @@
hitsound = null hitsound = null
attack_verb_on = list("slipped") attack_verb_on = list("slipped")
clumsy_check = FALSE clumsy_check = FALSE
sharpness = IS_BLUNT sharpness = SHARP_NONE
sword_color = "yellow" sword_color = "yellow"
heat = 0 heat = 0
light_color = "#ffff00" light_color = "#ffff00"
-1
View File
@@ -1112,7 +1112,6 @@
detonated = 1 detonated = 1
charge = null charge = null
for(var/mob/living/carbon/human/H in orange(2,src)) for(var/mob/living/carbon/human/H in orange(2,src))
H.Unconscious(160)
H.adjust_fire_stacks(20) H.adjust_fire_stacks(20)
H.IgniteMob() //Guaranteed knockout and ignition for nearby people H.IgniteMob() //Guaranteed knockout and ignition for nearby people
H.apply_damage(40, BRUTE, BODY_ZONE_CHEST) H.apply_damage(40, BRUTE, BODY_ZONE_CHEST)
+2 -1
View File
@@ -342,7 +342,8 @@
L.visible_message("<span class='warning'>[src] closes on [L], crushing [L.p_them()]!</span>", "<span class='userdanger'>[src] closes on you and crushes you!</span>") L.visible_message("<span class='warning'>[src] closes on [L], crushing [L.p_them()]!</span>", "<span class='userdanger'>[src] closes on you and crushes you!</span>")
if(iscarbon(L)) if(iscarbon(L))
var/mob/living/carbon/C = L var/mob/living/carbon/C = L
for(var/datum/wound/W in C.all_wounds) for(var/i in C.all_wounds) // should probably replace with signal
var/datum/wound/W = i
W.crush(DOOR_CRUSH_DAMAGE) W.crush(DOOR_CRUSH_DAMAGE)
if(isalien(L)) //For xenos if(isalien(L)) //For xenos
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans.
@@ -564,16 +564,16 @@
return return
/obj/machinery/porta_turret/proc/shootAt(atom/movable/target, stagger_enabled = FALSE) /obj/machinery/porta_turret/proc/shootAt(atom/movable/target, stagger_enabled = FALSE)
if(stagger_enabled)
randomize_shot_stagger()
sleep(shot_stagger)
if(!raised) //the turret has to be raised in order to fire - makes sense, right? if(!raised) //the turret has to be raised in order to fire - makes sense, right?
return return
if(!(obj_flags & EMAGGED)) //if it hasn't been emagged, cooldown before shooting again if(last_fired + shot_delay > world.time)
if(last_fired + shot_delay > world.time) return
return last_fired = world.time
last_fired = world.time
if(stagger_enabled)
randomize_shot_stagger()
sleep(shot_stagger)
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
var/turf/U = get_turf(target) var/turf/U = get_turf(target)
+5 -5
View File
@@ -103,12 +103,12 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
mouse_drag_pointer = MOUSE_ACTIVE_POINTER //the icon to indicate this object is being dragged mouse_drag_pointer = MOUSE_ACTIVE_POINTER //the icon to indicate this object is being dragged
var/list/embedding = NONE var/list/embedding
var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES
var/heat = 0 var/heat = 0
///All items with sharpness of IS_SHARP or higher will automatically get the butchering component. ///All items with sharpness of SHARP_EDGED or higher will automatically get the butchering component.
var/sharpness = IS_BLUNT var/sharpness = SHARP_NONE
var/tool_behaviour = NONE var/tool_behaviour = NONE
var/toolspeed = 1 var/toolspeed = 1
@@ -206,7 +206,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(GLOB.rpg_loot_items) if(GLOB.rpg_loot_items)
AddComponent(/datum/component/fantasy) AddComponent(/datum/component/fantasy)
if(sharpness) //give sharp objects butchering functionality, for consistency if(sharpness && force > 5) //give sharp objects butchering functionality, for consistency
AddComponent(/datum/component/butchering, 80 * toolspeed) AddComponent(/datum/component/butchering, 80 * toolspeed)
/obj/item/proc/check_allowed_items(atom/target, not_inside, target_self) /obj/item/proc/check_allowed_items(atom/target, not_inside, target_self)
@@ -1090,7 +1090,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/proc/updateEmbedding() /obj/item/proc/updateEmbedding()
if(!islist(embedding) || !LAZYLEN(embedding)) if(!LAZYLEN(embedding))
return return
AddElement(/datum/element/embed,\ AddElement(/datum/element/embed,\
+1 -5
View File
@@ -16,7 +16,7 @@
custom_materials = list(/datum/material/iron=13000) custom_materials = list(/datum/material/iron=13000)
attack_verb = list("sawed", "torn", "cut", "chopped", "diced") attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = "swing_hit" hitsound = "swing_hit"
sharpness = IS_SHARP sharpness = SHARP_EDGED
actions_types = list(/datum/action/item_action/startchainsaw) actions_types = list(/datum/action/item_action/startchainsaw)
tool_behaviour = TOOL_SAW tool_behaviour = TOOL_SAW
toolspeed = 0.5 toolspeed = 0.5
@@ -71,10 +71,6 @@
/obj/item/chainsaw/update_icon_state() /obj/item/chainsaw/update_icon_state()
icon_state = "chainsaw_[on ? "on" : "off"]" icon_state = "chainsaw_[on ? "on" : "off"]"
/obj/item/chainsaw/get_dismemberment_chance()
if(wielded)
. = ..()
/obj/item/chainsaw/doomslayer /obj/item/chainsaw/doomslayer
name = "THE GREAT COMMUNICATOR" name = "THE GREAT COMMUNICATOR"
desc = "<span class='warning'>VRRRRRRR!!!</span>" desc = "<span class='warning'>VRRRRRRR!!!</span>"
+1 -1
View File
@@ -105,7 +105,7 @@
to_chat(user, "<span class='warning'>You lack the grace to wield this!</span>") to_chat(user, "<span class='warning'>You lack the grace to wield this!</span>")
return COMPONENT_TWOHANDED_BLOCK_WIELD return COMPONENT_TWOHANDED_BLOCK_WIELD
wielded = TRUE wielded = TRUE
sharpness = IS_SHARP sharpness = SHARP_EDGED
w_class = w_class_on w_class = w_class_on
total_mass = total_mass_on total_mass = total_mass_on
hitsound = 'sound/weapons/blade1.ogg' hitsound = 'sound/weapons/blade1.ogg'
+3 -2
View File
@@ -13,11 +13,12 @@
slot_flags = ITEM_SLOT_BACK slot_flags = ITEM_SLOT_BACK
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP sharpness = SHARP_EDGED
max_integrity = 200 max_integrity = 200
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
resistance_flags = FIRE_PROOF resistance_flags = FIRE_PROOF
wound_bonus = -20 wound_bonus = -15
bare_wound_bonus = 20
var/wielded = FALSE // track wielded status on item var/wielded = FALSE // track wielded status on item
/obj/item/fireaxe/Initialize() /obj/item/fireaxe/Initialize()
+9 -9
View File
@@ -352,7 +352,7 @@
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT
block_chance = 30 block_chance = 30
sharpness = IS_SHARP sharpness = SHARP_EDGED
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
@@ -452,7 +452,7 @@
w_class = WEIGHT_CLASS_BULKY w_class = WEIGHT_CLASS_BULKY
armour_penetration = 35 armour_penetration = 35
slot_flags = ITEM_SLOT_BACK slot_flags = ITEM_SLOT_BACK
sharpness = IS_SHARP sharpness = SHARP_EDGED
attack_verb = list("chopped", "sliced", "cut", "reaped") attack_verb = list("chopped", "sliced", "cut", "reaped")
/obj/item/nullrod/scythe/Initialize() /obj/item/nullrod/scythe/Initialize()
@@ -575,7 +575,7 @@
righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
item_flags = ABSTRACT item_flags = ABSTRACT
sharpness = IS_SHARP sharpness = SHARP_EDGED
attack_verb = list("sawed", "torn", "cut", "chopped", "diced") attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsawhit.ogg' hitsound = 'sound/weapons/chainsawhit.ogg'
total_mass = TOTAL_MASS_HAND_REPLACEMENT total_mass = TOTAL_MASS_HAND_REPLACEMENT
@@ -594,7 +594,7 @@
name = "clown dagger" name = "clown dagger"
desc = "Used for absolutely hilarious sacrifices." desc = "Used for absolutely hilarious sacrifices."
hitsound = 'sound/items/bikehorn.ogg' hitsound = 'sound/items/bikehorn.ogg'
sharpness = IS_SHARP sharpness = SHARP_EDGED
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
/obj/item/nullrod/pride_hammer /obj/item/nullrod/pride_hammer
@@ -645,7 +645,7 @@
throw_speed = 4 throw_speed = 4
throw_range = 7 throw_range = 7
throwforce = 30 throwforce = 30
sharpness = IS_SHARP sharpness = SHARP_EDGED
attack_verb = list("enlightened", "redpilled") attack_verb = list("enlightened", "redpilled")
/obj/item/nullrod/armblade /obj/item/nullrod/armblade
@@ -657,7 +657,7 @@
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
item_flags = ABSTRACT item_flags = ABSTRACT
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
sharpness = IS_SHARP sharpness = SHARP_EDGED
wound_bonus = -20 wound_bonus = -20
bare_wound_bonus = 25 bare_wound_bonus = 25
total_mass = TOTAL_MASS_HAND_REPLACEMENT total_mass = TOTAL_MASS_HAND_REPLACEMENT
@@ -699,7 +699,7 @@
force = 15 force = 15
block_chance = 40 block_chance = 40
slot_flags = ITEM_SLOT_BACK slot_flags = ITEM_SLOT_BACK
sharpness = IS_BLUNT sharpness = SHARP_NONE
hitsound = "swing_hit" hitsound = "swing_hit"
attack_verb = list("smashed", "slammed", "whacked", "thwacked") attack_verb = list("smashed", "slammed", "whacked", "thwacked")
icon = 'icons/obj/items_and_weapons.dmi' icon = 'icons/obj/items_and_weapons.dmi'
@@ -754,7 +754,7 @@
name = "arrhythmic knife" name = "arrhythmic knife"
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
desc = "They say fear is the true mind killer, but stabbing them in the head works too. Honour compels you to not sheathe it once drawn." desc = "They say fear is the true mind killer, but stabbing them in the head works too. Honour compels you to not sheathe it once drawn."
sharpness = IS_SHARP sharpness = SHARP_EDGED
slot_flags = null slot_flags = null
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
@@ -782,7 +782,7 @@
desc = "Holding this makes you look absolutely devilish." desc = "Holding this makes you look absolutely devilish."
attack_verb = list("poked", "impaled", "pierced", "jabbed") attack_verb = list("poked", "impaled", "pierced", "jabbed")
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP sharpness = SHARP_EDGED
/obj/item/nullrod/egyptian /obj/item/nullrod/egyptian
name = "egyptian staff" name = "egyptian staff"
@@ -38,6 +38,23 @@
if(!uses) if(!uses)
qdel(src) qdel(src)
/obj/item/implant/warp
name = "warp implant"
desc = "Saves your position somewhere, and then warps you back to it after five seconds."
icon_state = "warp"
uses = 15
/obj/item/implant/warp/activate()
. = ..()
uses--
imp_in.do_adrenaline(150, TRUE, 0, 0, TRUE, list(/datum/reagent/fermi/eigenstate = 1.2), "<span class='boldnotice'>You feel an internal prick as as the bluespace starts ramping up!</span>")
to_chat(imp_in, "<span class='notice'>You feel an internal prick as as the bluespace starts ramping up!</span>")
if(!uses)
qdel(src)
/obj/item/implanter/warp
name = "implanter (warp)"
imp_type = /obj/item/implant/warp
/obj/item/implant/emp /obj/item/implant/emp
name = "emp implant" name = "emp implant"
+4 -3
View File
@@ -18,7 +18,7 @@
name = "fork" name = "fork"
desc = "Pointy." desc = "Pointy."
icon_state = "fork" icon_state = "fork"
force = 5 force = 4
w_class = WEIGHT_CLASS_TINY w_class = WEIGHT_CLASS_TINY
throwforce = 0 throwforce = 0
throw_speed = 3 throw_speed = 3
@@ -28,6 +28,7 @@
attack_verb = list("attacked", "stabbed", "poked") attack_verb = list("attacked", "stabbed", "poked")
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
sharpness = SHARP_POINTY
var/datum/reagent/forkload //used to eat omelette var/datum/reagent/forkload //used to eat omelette
/obj/item/kitchen/fork/suicide_act(mob/living/carbon/user) /obj/item/kitchen/fork/suicide_act(mob/living/carbon/user)
@@ -61,7 +62,7 @@
throw_speed = 4 throw_speed = 4
throw_range = 6 throw_range = 6
embedding = list("pain_mult" = 2, "embed_chance" = 100, "fall_chance" = 0, "embed_chance_turf_mod" = 15) embedding = list("pain_mult" = 2, "embed_chance" = 100, "fall_chance" = 0, "embed_chance_turf_mod" = 15)
sharpness = IS_SHARP sharpness = SHARP_EDGED
/obj/item/kitchen/knife /obj/item/kitchen/knife
name = "kitchen knife" name = "kitchen knife"
@@ -76,7 +77,7 @@
throw_range = 6 throw_range = 6
custom_materials = list(/datum/material/iron=12000) custom_materials = list(/datum/material/iron=12000)
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP_ACCURATE sharpness = SHARP_POINTY
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/bayonet = FALSE //Can this be attached to a gun? var/bayonet = FALSE //Can this be attached to a gun?
wound_bonus = -5 wound_bonus = -5
+1 -1
View File
@@ -54,5 +54,5 @@
var/obj/item/tank/T = W var/obj/item/tank/T = W
blow(T, user) blow(T, user)
return return
if (W.get_sharpness() || W.get_temperature() || is_pointed(W)) if (W.get_sharpness() || W.get_temperature())
burst() burst()
+4 -4
View File
@@ -102,7 +102,7 @@
attack_verb_off = list("tapped", "poked") attack_verb_off = list("tapped", "poked")
throw_speed = 3 throw_speed = 3
throw_range = 5 throw_range = 5
sharpness = IS_SHARP sharpness = SHARP_EDGED
embedding = list("embed_chance" = 75, "impact_pain_mult" = 10) embedding = list("embed_chance" = 75, "impact_pain_mult" = 10)
armour_penetration = 35 armour_penetration = 35
item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY
@@ -180,7 +180,7 @@
sword_color = null //stops icon from breaking when turned on. sword_color = null //stops icon from breaking when turned on.
hitcost = 75 //Costs more than a standard cyborg esword hitcost = 75 //Costs more than a standard cyborg esword
w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_NORMAL
sharpness = IS_SHARP sharpness = SHARP_EDGED
light_color = "#40ceff" light_color = "#40ceff"
tool_behaviour = TOOL_SAW tool_behaviour = TOOL_SAW
toolspeed = 0.7 toolspeed = 0.7
@@ -255,7 +255,7 @@
throw_range = 1 throw_range = 1
w_class = WEIGHT_CLASS_BULKY//So you can't hide it in your pocket or some such. w_class = WEIGHT_CLASS_BULKY//So you can't hide it in your pocket or some such.
var/datum/effect_system/spark_spread/spark_system var/datum/effect_system/spark_spread/spark_system
sharpness = IS_SHARP sharpness = SHARP_EDGED
//Most of the other special functions are handled in their own files. aka special snowflake code so kewl //Most of the other special functions are handled in their own files. aka special snowflake code so kewl
/obj/item/melee/transforming/energy/blade/Initialize() /obj/item/melee/transforming/energy/blade/Initialize()
@@ -291,7 +291,7 @@
attack_verb_off = list("tapped", "poked") attack_verb_off = list("tapped", "poked")
throw_speed = 3 throw_speed = 3
throw_range = 5 throw_range = 5
sharpness = IS_SHARP sharpness = SHARP_EDGED
embedding = list("embedded_pain_multiplier" = 6, "embed_chance" = 20, "embedded_fall_chance" = 60) embedding = list("embedded_pain_multiplier" = 6, "embed_chance" = 20, "embedded_fall_chance" = 60)
armour_penetration = 10 armour_penetration = 10
block_chance = 35 block_chance = 35
+3 -3
View File
@@ -44,7 +44,7 @@
throwforce = 10 throwforce = 10
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "impaled", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_verb = list("attacked", "impaled", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP sharpness = SHARP_EDGED
total_mass = TOTAL_MASS_HAND_REPLACEMENT total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/melee/synthetic_arm_blade/Initialize() /obj/item/melee/synthetic_arm_blade/Initialize()
@@ -64,7 +64,7 @@
throwforce = 15 throwforce = 15
w_class = WEIGHT_CLASS_BULKY w_class = WEIGHT_CLASS_BULKY
armour_penetration = 75 armour_penetration = 75
sharpness = IS_SHARP sharpness = SHARP_EDGED
attack_verb = list("slashed", "cut") attack_verb = list("slashed", "cut")
hitsound = 'sound/weapons/rapierhit.ogg' hitsound = 'sound/weapons/rapierhit.ogg'
custom_materials = list(/datum/material/iron = 1000) custom_materials = list(/datum/material/iron = 1000)
@@ -168,7 +168,7 @@
flags_1 = CONDUCT_1 flags_1 = CONDUCT_1
obj_flags = UNIQUE_RENAME obj_flags = UNIQUE_RENAME
w_class = WEIGHT_CLASS_BULKY w_class = WEIGHT_CLASS_BULKY
sharpness = IS_SHARP_ACCURATE //It cant be sharpend cook -_- sharpness = SHARP_POINTY //It cant be sharpend cook -_-
attack_verb = list("stabs", "punctures", "pierces", "pokes") attack_verb = list("stabs", "punctures", "pierces", "pokes")
hitsound = 'sound/weapons/rapierhit.ogg' hitsound = 'sound/weapons/rapierhit.ogg'
total_mass = 0.4 total_mass = 0.4
@@ -1,5 +1,5 @@
/obj/item/melee/transforming /obj/item/melee/transforming
sharpness = IS_SHARP sharpness = SHARP_EDGED
var/active = FALSE var/active = FALSE
var/force_on = 30 //force when active var/force_on = 30 //force when active
var/faction_bonus_force = 0 //Bonus force dealt against certain factions var/faction_bonus_force = 0 //Bonus force dealt against certain factions
+1 -1
View File
@@ -9,7 +9,7 @@
w_class = WEIGHT_CLASS_BULKY w_class = WEIGHT_CLASS_BULKY
attack_verb = list("attacked", "impaled", "pierced") attack_verb = list("attacked", "impaled", "pierced")
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP sharpness = SHARP_EDGED
max_integrity = 200 max_integrity = 200
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
resistance_flags = FIRE_PROOF resistance_flags = FIRE_PROOF
+1 -1
View File
@@ -39,7 +39,7 @@
I.force = clamp(I.force + increment, 0, max) I.force = clamp(I.force + increment, 0, max)
user.visible_message("<span class='notice'>[user] sharpens [I] with [src]!</span>", "<span class='notice'>You sharpen [I], making it much more deadly than before.</span>") user.visible_message("<span class='notice'>[user] sharpens [I] with [src]!</span>", "<span class='notice'>You sharpen [I], making it much more deadly than before.</span>")
I.sharpness = IS_SHARP_ACCURATE I.sharpness = SHARP_POINTY
I.throwforce = clamp(I.throwforce + increment, 0, max) I.throwforce = clamp(I.throwforce + increment, 0, max)
I.name = "[prefix] [I.name]" I.name = "[prefix] [I.name]"
name = "worn out [name]" name = "worn out [name]"
+14 -13
View File
@@ -7,13 +7,13 @@
icon_state = "large" icon_state = "large"
w_class = WEIGHT_CLASS_TINY w_class = WEIGHT_CLASS_TINY
item_flags = DROPDEL item_flags = DROPDEL
sharpness = TRUE sharpness = SHARP_EDGED
/obj/item/shrapnel/stingball // stingbang grenades /obj/item/shrapnel/stingball // stingbang grenades
name = "stingball" name = "stingball"
embedding = list(embed_chance=90, fall_chance=3, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.7, pain_mult=5, jostle_pain_mult=6, rip_time=15, embed_chance_turf_mod=-100) embedding = list(embed_chance=90, fall_chance=3, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.7, pain_mult=5, jostle_pain_mult=6, rip_time=15, embed_chance_turf_mod=-100)
icon_state = "tiny" icon_state = "tiny"
sharpness = FALSE sharpness = SHARP_NONE
/obj/item/shrapnel/bullet // bullets /obj/item/shrapnel/bullet // bullets
name = "bullet" name = "bullet"
@@ -30,23 +30,24 @@
/obj/item/projectile/bullet/shrapnel /obj/item/projectile/bullet/shrapnel
name = "flying shrapnel shard" name = "flying shrapnel shard"
damage = 8 damage = 14
range = 10 range = 20
armour_penetration = -30 armour_penetration = -30
dismemberment = 5 dismemberment = 5
ricochets_max = 2 ricochets_max = 2
ricochet_chance = 40 ricochet_chance = 70
shrapnel_type = /obj/item/shrapnel shrapnel_type = /obj/item/shrapnel
ricochet_incidence_leeway = 60 ricochet_incidence_leeway = 60
sharpness = TRUE sharpness = SHARP_EDGED
wound_bonus = 30 wound_bonus = 40
/obj/item/projectile/bullet/shrapnel/mega /obj/item/projectile/bullet/shrapnel/mega
name = "flying shrapnel hunk" name = "flying shrapnel hunk"
range = 25 range = 45
dismemberment = 10 dismemberment = 15
ricochets_max = 4 ricochets_max = 6
ricochet_chance = 90 ricochet_chance = 130
ricochet_incidence_leeway = 0
ricochet_decay_chance = 0.9 ricochet_decay_chance = 0.9
/obj/item/projectile/bullet/pellet/stingball /obj/item/projectile/bullet/pellet/stingball
@@ -71,10 +72,10 @@
name = "breakbang pellet" name = "breakbang pellet"
damage = 10 damage = 10
wound_bonus = 40 wound_bonus = 40
sharpness = FALSE sharpness = SHARP_NONE
/obj/item/projectile/bullet/pellet/stingball/shred /obj/item/projectile/bullet/pellet/stingball/shred
name = "shredbang pellet" name = "shredbang pellet"
damage = 10 damage = 10
wound_bonus = 30 wound_bonus = 30
sharpness = TRUE sharpness = SHARP_EDGED
+3 -3
View File
@@ -15,14 +15,14 @@
custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075) custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075)
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
sharpness = IS_SHARP sharpness = SHARP_EDGED
max_integrity = 200 max_integrity = 200
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
var/obj/item/grenade/explosive = null var/obj/item/grenade/explosive = null
var/war_cry = "AAAAARGH!!!" var/war_cry = "AAAAARGH!!!"
var/icon_prefix = "spearglass" var/icon_prefix = "spearglass"
var/wielded = FALSE // track wielded status on item var/wielded = FALSE // track wielded status on item
wound_bonus = -25 wound_bonus = -15
bare_wound_bonus = 15 bare_wound_bonus = 15
/obj/item/spear/Initialize() /obj/item/spear/Initialize()
@@ -179,7 +179,7 @@
custom_materials = null custom_materials = null
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
sharpness = IS_SHARP sharpness = SHARP_EDGED
icon_prefix = "bone_spear" icon_prefix = "bone_spear"
/obj/item/spear/bonespear/ComponentInitialize() /obj/item/spear/bonespear/ComponentInitialize()
+31 -9
View File
@@ -28,8 +28,7 @@
/obj/item/stack/medical/attack(mob/living/M, mob/user) /obj/item/stack/medical/attack(mob/living/M, mob/user)
. = ..() . = ..()
try_heal(M, user) INVOKE_ASYNC(src, .proc/try_heal, M, user)
/obj/item/stack/medical/proc/try_heal(mob/living/M, mob/user, silent = FALSE) /obj/item/stack/medical/proc/try_heal(mob/living/M, mob/user, silent = FALSE)
if(!M.can_inject(user, TRUE)) if(!M.can_inject(user, TRUE))
@@ -132,11 +131,34 @@
// gauze is only relevant for wounds, which are handled in the wounds themselves // gauze is only relevant for wounds, which are handled in the wounds themselves
/obj/item/stack/medical/gauze/try_heal(mob/living/M, mob/user, silent) /obj/item/stack/medical/gauze/try_heal(mob/living/M, mob/user, silent)
var/obj/item/bodypart/limb = M.get_bodypart(check_zone(user.zone_selected)) var/obj/item/bodypart/limb = M.get_bodypart(check_zone(user.zone_selected))
if(limb) if(!limb)
if(limb.brute_dam > 40) to_chat(user, "<span class='notice'>There's nothing there to bandage!</span>")
to_chat(user, "<span class='warning'>The bleeding on [user==M ? "your" : "[M]'s"] [limb.name] is from bruising, and cannot be treated with [src]!</span>") return
else if(!LAZYLEN(limb.wounds))
to_chat(user, "<span class='warning'>There's no bleeding on [user==M ? "your" : "[M]'s"] [limb.name]</span>") to_chat(user, "<span class='notice'>There's no wounds that require bandaging on [user==M ? "your" : "[M]'s"] [limb.name]!</span>") // good problem to have imo
return
var/gauzeable_wound = FALSE
for(var/i in limb.wounds)
var/datum/wound/woundies = i
if(woundies.wound_flags & ACCEPTS_GAUZE)
gauzeable_wound = TRUE
break
if(!gauzeable_wound)
to_chat(user, "<span class='notice'>There's no wounds that require bandaging on [user==M ? "your" : "[M]'s"] [limb.name]!</span>") // good problem to have imo
return
if(limb.current_gauze && (limb.current_gauze.absorption_capacity * 0.8 > absorption_capacity)) // ignore if our new wrap is < 20% better than the current one, so someone doesn't bandage it 5 times in a row
to_chat(user, "<span class='warning'>The bandage currently on [user==M ? "your" : "[M]'s"] [limb.name] is still in good condition!</span>")
return
user.visible_message("<span class='warning'>[user] begins wrapping the wounds on [M]'s [limb.name] with [src]...</span>", "<span class='warning'>You begin wrapping the wounds on [user == M ? "your" : "[M]'s"] [limb.name] with [src]...</span>")
if(!do_after(user, (user == M ? self_delay : other_delay), target=M))
return
user.visible_message("<span class='green'>[user] applies [src] to [M]'s [limb.name].</span>", "<span class='green'>You bandage the wounds on [user == M ? "yourself" : "[M]'s"] [limb.name].</span>")
limb.apply_gauze(src)
/obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, params) /obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness()) if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness())
@@ -378,9 +400,9 @@
C.emote("scream") C.emote("scream")
for(var/i in C.bodyparts) for(var/i in C.bodyparts)
var/obj/item/bodypart/bone = i var/obj/item/bodypart/bone = i
var/datum/wound/brute/bone/severe/oof_ouch = new var/datum/wound/blunt/severe/oof_ouch = new
oof_ouch.apply_wound(bone) oof_ouch.apply_wound(bone)
var/datum/wound/brute/bone/critical/oof_OUCH = new var/datum/wound/blunt/critical/oof_OUCH = new
oof_OUCH.apply_wound(bone) oof_OUCH.apply_wound(bone)
for(var/i in C.bodyparts) for(var/i in C.bodyparts)
@@ -289,7 +289,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
resistance_flags = ACID_PROOF resistance_flags = ACID_PROOF
armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100) armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100)
max_integrity = 40 max_integrity = 40
sharpness = IS_SHARP sharpness = SHARP_EDGED
var/icon_prefix var/icon_prefix
embedding = list("embed_chance" = 65) embedding = list("embed_chance" = 65)
+2 -1
View File
@@ -19,8 +19,9 @@
return TRUE return TRUE
/obj/item/storage/contents_explosion(severity, target) /obj/item/storage/contents_explosion(severity, target)
var/in_storage = istype(loc, /obj/item/storage)? (max(0, severity - 1)) : (severity)
for(var/atom/A in contents) for(var/atom/A in contents)
A.ex_act(severity, target) A.ex_act(in_storage, target)
CHECK_TICK CHECK_TICK
//Cyberboss says: "USE THIS TO FILL IT, NOT INITIALIZE OR NEW" //Cyberboss says: "USE THIS TO FILL IT, NOT INITIALIZE OR NEW"
+2 -1
View File
@@ -20,7 +20,8 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
var/has_latches = TRUE var/has_latches = TRUE
var/can_rubberify = TRUE var/can_rubberify = TRUE
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //very protecc too rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //very protecc too
wound_bonus = 5 wound_bonus = -10
bare_wound_bonus = 5
/obj/item/storage/toolbox/greyscale /obj/item/storage/toolbox/greyscale
icon_state = "toolbox_default" icon_state = "toolbox_default"
@@ -169,6 +169,14 @@
O.imp = new /obj/item/implant/freedom(O) O.imp = new /obj/item/implant/freedom(O)
O.update_icon() O.update_icon()
/obj/item/storage/box/syndie_kit/imp_warp
name = "boxed warp implant (with injector)"
/obj/item/storage/box/syndie_kit/imp_warp/PopulateContents()
var/obj/item/implanter/O = new(src)
O.imp = new /obj/item/implant/warp(O)
O.update_icon()
/obj/item/storage/box/syndie_kit/imp_microbomb /obj/item/storage/box/syndie_kit/imp_microbomb
name = "Microbomb Implant (with injector)" name = "Microbomb Implant (with injector)"
+3
View File
@@ -18,6 +18,9 @@
toolspeed = 1 toolspeed = 1
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
wound_bonus = -10
bare_wound_bonus = 5
/obj/item/crowbar/suicide_act(mob/user) /obj/item/crowbar/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>") user.visible_message("<span class='suicide'>[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1) playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
@@ -31,6 +31,9 @@
"yellow" = rgb(255, 165, 0) "yellow" = rgb(255, 165, 0)
) )
wound_bonus = -10
bare_wound_bonus = 5
/obj/item/screwdriver/suicide_act(mob/user) /obj/item/screwdriver/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!</span>") user.visible_message("<span class='suicide'>[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return(BRUTELOSS) return(BRUTELOSS)
@@ -33,6 +33,8 @@
heat = 3800 heat = 3800
tool_behaviour = TOOL_WELDER tool_behaviour = TOOL_WELDER
toolspeed = 1 toolspeed = 1
wound_bonus = 0
bare_wound_bonus = 5
/obj/item/weldingtool/Initialize() /obj/item/weldingtool/Initialize()
. = ..() . = ..()
+3
View File
@@ -18,6 +18,9 @@
toolspeed = 1 toolspeed = 1
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
wound_bonus = -10
bare_wound_bonus = 5
/obj/item/wrench/suicide_act(mob/user) /obj/item/wrench/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>") user.visible_message("<span class='suicide'>[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1) playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
+2 -2
View File
@@ -447,7 +447,7 @@
block_parry_data = null block_parry_data = null
attack_verb = list("attacked", "struck", "hit") attack_verb = list("attacked", "struck", "hit")
total_mass_on = TOTAL_MASS_TOY_SWORD total_mass_on = TOTAL_MASS_TOY_SWORD
sharpness = IS_BLUNT sharpness = SHARP_NONE
/obj/item/dualsaber/toy/ComponentInitialize() /obj/item/dualsaber/toy/ComponentInitialize()
AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=0, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg') AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=0, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg')
@@ -466,7 +466,7 @@
attack_verb = list("attacked", "struck", "hit") attack_verb = list("attacked", "struck", "hit")
total_mass_on = TOTAL_MASS_TOY_SWORD total_mass_on = TOTAL_MASS_TOY_SWORD
slowdown_wielded = 0 slowdown_wielded = 0
sharpness = IS_BLUNT sharpness = SHARP_NONE
/obj/item/dualsaber/hypereutactic/toy/ComponentInitialize() /obj/item/dualsaber/hypereutactic/toy/ComponentInitialize()
AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=0, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg') AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=0, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg')
+11 -9
View File
@@ -65,7 +65,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 50 block_chance = 50
sharpness = IS_SHARP sharpness = SHARP_EDGED
max_integrity = 200 max_integrity = 200
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF resistance_flags = FIRE_PROOF
@@ -231,7 +231,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 50 block_chance = 50
sharpness = IS_SHARP sharpness = SHARP_EDGED
max_integrity = 200 max_integrity = 200
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF resistance_flags = FIRE_PROOF
@@ -375,6 +375,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_NORMAL
custom_materials = list(/datum/material/iron=1150, /datum/material/glass=75) custom_materials = list(/datum/material/iron=1150, /datum/material/glass=75)
attack_verb = list("hit", "bludgeoned", "whacked", "bonked") attack_verb = list("hit", "bludgeoned", "whacked", "bonked")
wound_bonus = -10
/obj/item/wirerod/attackby(obj/item/I, mob/user, params) /obj/item/wirerod/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/shard)) if(istype(I, /obj/item/shard))
@@ -412,13 +413,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
force = 2 force = 2
throwforce = 20 //This is never used on mobs since this has a 100% embed chance. throwforce = 10 //This is never used on mobs since this has a 100% embed chance.
throw_speed = 4 throw_speed = 4
embedding = list("pain_mult" = 4, "embed_chance" = 100, "fall_chance" = 0, "embed_chance_turf_mod" = 15) embedding = list("pain_mult" = 4, "embed_chance" = 100, "fall_chance" = 0, "embed_chance_turf_mod" = 15)
armour_penetration = 40 armour_penetration = 40
w_class = WEIGHT_CLASS_SMALL w_class = WEIGHT_CLASS_SMALL
sharpness = IS_SHARP sharpness = SHARP_EDGED
custom_materials = list(/datum/material/iron=500, /datum/material/glass=500) custom_materials = list(/datum/material/iron=500, /datum/material/glass=500)
resistance_flags = FIRE_PROOF resistance_flags = FIRE_PROOF
@@ -431,7 +432,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/throwing_star/toy /obj/item/throwing_star/toy
name = "toy throwing star" name = "toy throwing star"
desc = "An aerodynamic disc strapped with adhesive for sticking to people, good for playing pranks and getting yourself killed by security." desc = "An aerodynamic disc strapped with adhesive for sticking to people, good for playing pranks and getting yourself killed by security."
sharpness = IS_BLUNT sharpness = SHARP_NONE
force = 0 force = 0
throwforce = 0 throwforce = 0
embedding = list("pain_mult" = 0, "jostle_pain_mult" = 0, "embed_chance" = 100, "fall_chance" = 0) embedding = list("pain_mult" = 0, "jostle_pain_mult" = 0, "embed_chance" = 100, "fall_chance" = 0)
@@ -468,7 +469,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
icon_state = extended_icon_state icon_state = extended_icon_state
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP sharpness = SHARP_EDGED
else else
force = initial(force) force = initial(force)
w_class = WEIGHT_CLASS_SMALL w_class = WEIGHT_CLASS_SMALL
@@ -476,7 +477,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
icon_state = retracted_icon_state icon_state = retracted_icon_state
attack_verb = list("stubbed", "poked") attack_verb = list("stubbed", "poked")
hitsound = 'sound/weapons/genhit.ogg' hitsound = 'sound/weapons/genhit.ogg'
sharpness = IS_BLUNT sharpness = SHARP_NONE
/obj/item/switchblade/suicide_act(mob/user) /obj/item/switchblade/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is slitting [user.p_their()] own throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>") user.visible_message("<span class='suicide'>[user] is slitting [user.p_their()] own throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -577,7 +578,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
throwforce = 0 throwforce = 0
throw_range = 0 throw_range = 0
throw_speed = 0 throw_speed = 0
sharpness = IS_SHARP sharpness = SHARP_EDGED
attack_verb = list("sawed", "torn", "cut", "chopped", "diced") attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsawhit.ogg' hitsound = 'sound/weapons/chainsawhit.ogg'
total_mass = TOTAL_MASS_HAND_REPLACEMENT total_mass = TOTAL_MASS_HAND_REPLACEMENT
@@ -706,6 +707,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
obj_flags = UNIQUE_RENAME obj_flags = UNIQUE_RENAME
var/chaplain_spawnable = TRUE var/chaplain_spawnable = TRUE
total_mass = TOTAL_MASS_MEDIEVAL_WEAPON total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
wound_bonus = -5
/obj/item/melee/baseball_bat/chaplain/Initialize() /obj/item/melee/baseball_bat/chaplain/Initialize()
. = ..() . = ..()
@@ -975,7 +977,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
block_chance = 40 block_chance = 40
throwforce = 20 throwforce = 20
throw_speed = 4 throw_speed = 4
sharpness = IS_SHARP sharpness = SHARP_EDGED
attack_verb = list("cut", "sliced", "diced") attack_verb = list("cut", "sliced", "diced")
w_class = WEIGHT_CLASS_BULKY w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK slot_flags = ITEM_SLOT_BACK
+32 -5
View File
@@ -127,18 +127,45 @@
dismantle_wall(1) dismantle_wall(1)
return return
/turf/closed/wall/attack_hulk(mob/user, does_attack_animation = 0) /turf/closed/wall/attack_hulk(mob/living/carbon/user)
..(user, 1) ..()
var/obj/item/bodypart/arm = user.hand_bodyparts[user.active_hand_index]
if(!arm)
return
if(arm.disabled)
return
if(prob(hardness)) if(prob(hardness))
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE)
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
hulk_recoil(arm, user)
dismantle_wall(1) dismantle_wall(1)
else else
playsound(src, 'sound/effects/bang.ogg', 50, 1) playsound(src, 'sound/effects/bang.ogg', 50, TRUE)
add_dent(WALL_DENT_HIT) add_dent(WALL_DENT_HIT)
to_chat(user, text("<span class='notice'>You punch the wall.</span>")) user.visible_message("<span class='danger'>[user] smashes \the [src]!</span>", \
"<span class='danger'>You smash \the [src]!</span>", \
"<span class='hear'>You hear a booming smash!</span>")
return TRUE return TRUE
/**
*Deals damage back to the hulk's arm.
*
*When a hulk manages to break a wall using their hulk smash, this deals back damage to the arm used.
*This is in its own proc just to be easily overridden by other wall types. Default allows for three
*smashed walls per arm. Also, we use CANT_WOUND here because wounds are random. Wounds are applied
*by hulk code based on arm damage and checked when we call break_an_arm().
*Arguments:
**arg1 is the arm to deal damage to.
**arg2 is the hulk
*/
/turf/closed/wall/proc/hulk_recoil(obj/item/bodypart/arm, mob/living/carbon/human/hulkman, var/damage = 20)
arm.receive_damage(brute = damage, blocked = 0, wound_bonus = CANT_WOUND)
var/datum/mutation/human/hulk/smasher = locate(/datum/mutation/human/hulk) in hulkman.dna.mutations
if(!smasher || !damage) //sanity check but also snow and wood walls deal no recoil damage, so no arm breaky
return
smasher.break_an_arm(arm)
/turf/closed/wall/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) /turf/closed/wall/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
to_chat(user, "<span class='notice'>You push the wall but nothing happens!</span>") to_chat(user, "<span class='notice'>You push the wall but nothing happens!</span>")
playsound(src, 'sound/weapons/genhit.ogg', 25, 1) playsound(src, 'sound/weapons/genhit.ogg', 25, 1)
+83 -12
View File
@@ -1283,9 +1283,9 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
ADMIN_PUNISHMENT_SHOES, ADMIN_PUNISHMENT_SHOES,
ADMIN_PUNISHMENT_PICKLE, ADMIN_PUNISHMENT_PICKLE,
ADMIN_PUNISHMENT_FRY, ADMIN_PUNISHMENT_FRY,
ADMIN_PUNISHMENT_CRACK, ADMIN_PUNISHMENT_CRACK,
ADMIN_PUNISHMENT_BLEED, ADMIN_PUNISHMENT_BLEED,
ADMIN_PUNISHMENT_SCARIFY) ADMIN_PUNISHMENT_SCARIFY)
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list 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) to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
return return
var/mob/living/carbon/C = target var/mob/living/carbon/C = target
for(var/obj/item/bodypart/squish_part in C.bodyparts) for(var/i 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)) 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) squish_part.force_wound_upwards(type_wound, smited=TRUE)
if(ADMIN_PUNISHMENT_BLEED) if(ADMIN_PUNISHMENT_BLEED)
if(!iscarbon(target)) if(!iscarbon(target))
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE) to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
return return
var/mob/living/carbon/C = target var/mob/living/carbon/C = target
for(var/obj/item/bodypart/slice_part in C.bodyparts) for(var/i in C.bodyparts)
var/type_wound = pick(list(/datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate)) 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) 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) 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) slice_part.force_wound_upwards(type_wound, smited=TRUE)
if(ADMIN_PUNISHMENT_SCARIFY) if(ADMIN_PUNISHMENT_SCARIFY)
if(!iscarbon(target)) if(!iscarbon(target))
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE) to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
return return
var/mob/living/carbon/C = target var/mob/living/carbon/dude = target
C.generate_fake_scars(rand(1, 4)) dude.generate_fake_scars(rand(1, 4))
to_chat(C, "<span class='warning'>You feel your body grow jaded and torn...</span>") 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) if(ADMIN_PUNISHMENT_PICKLE)
target.turn_into_pickle() target.turn_into_pickle()
if(ADMIN_PUNISHMENT_FRY) if(ADMIN_PUNISHMENT_FRY)
@@ -1408,6 +1454,31 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
punish_log(target, punishment) 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) /client/proc/punish_log(var/whom, var/punishment)
var/msg = "[key_name_admin(usr)] punished [key_name_admin(whom)] with [punishment]." var/msg = "[key_name_admin(usr)] punished [key_name_admin(whom)] with [punishment]."
message_admins(msg) message_admins(msg)
@@ -270,13 +270,15 @@
/datum/antagonist/bloodsucker/AmFinalDeath() /datum/antagonist/bloodsucker/AmFinalDeath()
return owner && owner.AmFinalDeath() return owner && owner.AmFinalDeath()
/datum/antagonist/changeling/AmFinalDeath()
return owner && owner.AmFinalDeath()
/datum/mind/proc/AmFinalDeath() /datum/mind/proc/AmFinalDeath()
return !current || QDELETED(current) || !isliving(current) || isbrain(current) || !get_turf(current) // NOTE: "isliving()" is not the same as STAT == CONSCIOUS. This is to make sure you're not a BORG (aka silicon) return !current || QDELETED(current) || !isliving(current) || isbrain(current) || !get_turf(current) // NOTE: "isliving()" is not the same as STAT == CONSCIOUS. This is to make sure you're not a BORG (aka silicon)
/datum/antagonist/bloodsucker/proc/FinalDeath() /datum/antagonist/bloodsucker/proc/FinalDeath()
//Dont bother if we are already supposed to be dead
if(FinalDeath)
return
FinalDeath = TRUE //We are now supposed to die. Lets not spam it.
if(!iscarbon(owner.current)) //Check for non carbons. if(!iscarbon(owner.current)) //Check for non carbons.
owner.current.gib() owner.current.gib()
return return
@@ -38,6 +38,7 @@
var/level_bloodcost var/level_bloodcost
var/passive_blood_drain = -0.1 //The amount of blood we loose each bloodsucker life() tick var/passive_blood_drain = -0.1 //The amount of blood we loose each bloodsucker life() tick
var/notice_healing //Var to see if you are healing for preventing spam of the chat message inform the user of such var/notice_healing //Var to see if you are healing for preventing spam of the chat message inform the user of such
var/FinalDeath //Have we reached final death? Used to prevent spam.
// LISTS // LISTS
var/static/list/defaultTraits = list (TRAIT_STABLEHEART, TRAIT_NOBREATH, TRAIT_SLEEPIMMUNE, TRAIT_NOCRITDAMAGE, TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_NIGHT_VISION, \ var/static/list/defaultTraits = list (TRAIT_STABLEHEART, TRAIT_NOBREATH, TRAIT_SLEEPIMMUNE, TRAIT_NOCRITDAMAGE, TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_NIGHT_VISION, \
TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_AGEUSIA, TRAIT_COLDBLOODED, TRAIT_NONATURALHEAL, TRAIT_NOMARROW, TRAIT_NOPULSE, TRAIT_VIRUSIMMUNE, TRAIT_NODECAP, TRAIT_NOGUT) TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_AGEUSIA, TRAIT_COLDBLOODED, TRAIT_NONATURALHEAL, TRAIT_NOMARROW, TRAIT_NOPULSE, TRAIT_VIRUSIMMUNE, TRAIT_NODECAP, TRAIT_NOGUT)
@@ -683,6 +684,8 @@
owner.current.hud_used.sunlight_display.invisibility = INVISIBILITY_ABSTRACT owner.current.hud_used.sunlight_display.invisibility = INVISIBILITY_ABSTRACT
/datum/antagonist/bloodsucker/proc/update_hud(updateRank=FALSE) /datum/antagonist/bloodsucker/proc/update_hud(updateRank=FALSE)
if(FinalDeath)
return
// No Hud? Get out. // No Hud? Get out.
if(!owner.current.hud_used) if(!owner.current.hud_used)
return return
@@ -361,9 +361,9 @@
torture_time -= I.force / 4 torture_time -= I.force / 4
torture_dmg_brute += I.force / 4 torture_dmg_brute += I.force / 4
//torture_dmg_burn += I. //torture_dmg_burn += I.
if(I.sharpness == IS_SHARP) if(I.sharpness == SHARP_EDGED)
torture_time -= 1 torture_time -= 1
else if(I.sharpness == IS_SHARP_ACCURATE) else if(I.sharpness == SHARP_POINTY)
torture_time -= 2 torture_time -= 2
if(istype(I, /obj/item/weldingtool)) if(istype(I, /obj/item/weldingtool))
var/obj/item/weldingtool/welder = I var/obj/item/weldingtool/welder = I
@@ -164,7 +164,7 @@
armour_penetration = 20 armour_penetration = 20
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP sharpness = SHARP_EDGED
wound_bonus = -60 wound_bonus = -60
bare_wound_bonus = 20 bare_wound_bonus = 20
var/can_drop = FALSE var/can_drop = FALSE
@@ -30,8 +30,8 @@
C.regenerate_limbs(1) C.regenerate_limbs(1)
C.regenerate_organs() C.regenerate_organs()
for(var/i in C.all_wounds) for(var/i in C.all_wounds)
var/datum/wound/W = i var/datum/wound/iter_wound = i
W.remove_wound() iter_wound.remove_wound()
if(!user.getorganslot(ORGAN_SLOT_BRAIN)) if(!user.getorganslot(ORGAN_SLOT_BRAIN))
var/obj/item/organ/brain/B var/obj/item/organ/brain/B
if(C.has_dna() && C.dna.species.mutant_brain) if(C.has_dna() && C.dna.species.mutant_brain)
@@ -8,7 +8,7 @@
force = 15 //Extra damage is dealt to targets in attack() force = 15 //Extra damage is dealt to targets in attack()
throwforce = 25 throwforce = 25
armour_penetration = 10 armour_penetration = 10
sharpness = IS_SHARP_ACCURATE sharpness = SHARP_POINTY
attack_verb = list("stabbed", "poked", "slashed") attack_verb = list("stabbed", "poked", "slashed")
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
w_class = WEIGHT_CLASS_BULKY w_class = WEIGHT_CLASS_BULKY
+3 -3
View File
@@ -53,7 +53,7 @@
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
flags_1 = CONDUCT_1 flags_1 = CONDUCT_1
sharpness = IS_SHARP sharpness = SHARP_EDGED
w_class = WEIGHT_CLASS_BULKY w_class = WEIGHT_CLASS_BULKY
force = 30 // whoever balanced this got beat in the head by a bible too many times good lord force = 30 // whoever balanced this got beat in the head by a bible too many times good lord
throwforce = 10 throwforce = 10
@@ -114,7 +114,7 @@
armour_penetration = 45 armour_penetration = 45
throw_speed = 1 throw_speed = 1
throw_range = 3 throw_range = 3
sharpness = IS_SHARP sharpness = SHARP_EDGED
light_color = "#ff0000" light_color = "#ff0000"
attack_verb = list("cleaved", "slashed", "torn", "hacked", "ripped", "diced", "carved") attack_verb = list("cleaved", "slashed", "torn", "hacked", "ripped", "diced", "carved")
icon_state = "cultbastard" icon_state = "cultbastard"
@@ -708,7 +708,7 @@
armour_penetration = 30 armour_penetration = 30
block_chance = 30 block_chance = 30
attack_verb = list("attacked", "impaled", "stabbed", "torn", "gored") attack_verb = list("attacked", "impaled", "stabbed", "torn", "gored")
sharpness = IS_SHARP sharpness = SHARP_EDGED
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
var/datum/action/innate/cult/spear/spear_act var/datum/action/innate/cult/spear/spear_act
var/wielded = FALSE // track wielded status on item var/wielded = FALSE // track wielded status on item
@@ -38,7 +38,7 @@
melee_damage_upper = 22.5 melee_damage_upper = 22.5
wound_bonus = -10 wound_bonus = -10
bare_wound_bonus = 0 bare_wound_bonus = 0
sharpness = TRUE sharpness = SHARP_EDGED
see_in_dark = 8 see_in_dark = 8
blood_volume = 0 //No bleeding on getting shot, for skeddadles blood_volume = 0 //No bleeding on getting shot, for skeddadles
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
@@ -259,7 +259,7 @@
to_chat(target, "<span class='userdanger'>You suddenly feel very hot</span>") to_chat(target, "<span class='userdanger'>You suddenly feel very hot</span>")
target.adjust_bodytemperature(50) target.adjust_bodytemperature(50)
GiveHint(target) 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>") to_chat(target, "<span class='userdanger'>You feel a stabbing pain in [parse_zone(user.zone_selected)]!</span>")
target.DefaultCombatKnockdown(40) target.DefaultCombatKnockdown(40)
GiveHint(target) GiveHint(target)
+6
View File
@@ -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." 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 cost = 1500
contains = list(/obj/item/gun/energy/laser/hellgun) 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)
+15
View File
@@ -218,3 +218,18 @@
/obj/item/storage/box/beakers) /obj/item/storage/box/beakers)
crate_name = "virus containment unit crate" crate_name = "virus containment unit crate"
crate_type = /obj/structure/closet/crate/secure/plasma 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"
+2 -1
View File
@@ -832,7 +832,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<b>Socks Color:</b> <span style='border:1px solid #161616; background-color: #[socks_color];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=socks_color;task=input'>Change</a><BR>" dat += "<b>Socks Color:</b> <span style='border:1px solid #161616; background-color: #[socks_color];'>&nbsp;&nbsp;&nbsp;</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>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>" 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 += "<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 += "<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>" dat += "<b>Uplink Location:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=uplink_loc;task=input'>[uplink_spawn_loc]</a>"
@@ -2800,6 +2800,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(custom_tongue != "default") if(custom_tongue != "default")
var/new_tongue = GLOB.roundstart_tongues[custom_tongue] var/new_tongue = GLOB.roundstart_tongues[custom_tongue]
if(new_tongue) if(new_tongue)
character.dna.species.mutanttongue = new_tongue //this means we get our tongue when we clone
var/obj/item/organ/tongue/T = character.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/T = character.getorganslot(ORGAN_SLOT_TONGUE)
if(T) if(T)
qdel(T) qdel(T)
+4 -4
View File
@@ -96,7 +96,7 @@
throw_speed = 4 throw_speed = 4
attack_verb = list("sliced") attack_verb = list("sliced")
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP sharpness = SHARP_EDGED
/obj/item/clothing/glasses/meson/eyepatch /obj/item/clothing/glasses/meson/eyepatch
name = "eyepatch mesons" name = "eyepatch mesons"
@@ -180,7 +180,7 @@
throw_speed = 4 throw_speed = 4
attack_verb = list("sliced") attack_verb = list("sliced")
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP sharpness = SHARP_EDGED
vision_correction = 1 vision_correction = 1
glass_colour_type = /datum/client_colour/glass_colour/lightgreen glass_colour_type = /datum/client_colour/glass_colour/lightgreen
@@ -237,7 +237,7 @@
throw_speed = 4 throw_speed = 4
attack_verb = list("sliced") attack_verb = list("sliced")
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP sharpness = SHARP_EDGED
/obj/item/clothing/glasses/sunglasses/garb/supergarb /obj/item/clothing/glasses/sunglasses/garb/supergarb
name = "black giga gar glasses" name = "black giga gar glasses"
@@ -257,7 +257,7 @@
throw_speed = 4 throw_speed = 4
attack_verb = list("sliced") attack_verb = list("sliced")
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP sharpness = SHARP_EDGED
glass_colour_type = /datum/client_colour/glass_colour/orange glass_colour_type = /datum/client_colour/glass_colour/orange
/obj/item/clothing/glasses/sunglasses/gar/supergar /obj/item/clothing/glasses/sunglasses/gar/supergar
+2 -2
View File
@@ -70,7 +70,7 @@
flash_protect = -2 flash_protect = -2
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green glass_colour_type = /datum/client_colour/glass_colour/green
/obj/item/clothing/glasses/hud/health/night/syndicate /obj/item/clothing/glasses/hud/health/night/syndicate
name = "combat night vision health scanner HUD" 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." 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 throw_speed = 4
attack_verb = list("sliced") attack_verb = list("sliced")
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP sharpness = SHARP_EDGED
/obj/item/clothing/glasses/hud/security/sunglasses/gars/supergars /obj/item/clothing/glasses/hud/security/sunglasses/gars/supergars
name = "giga HUD gar glasses" name = "giga HUD gar glasses"
@@ -7,7 +7,7 @@
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
item_state = "spaceold" item_state = "spaceold"
permeability_coefficient = 0.01 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 flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
dynamic_hair_suffix = "" dynamic_hair_suffix = ""
dynamic_fhair_suffix = "" dynamic_fhair_suffix = ""
@@ -36,7 +36,7 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/flashlight, /obj/item/tank/internals) allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
slowdown = 1 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 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAUR
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
@@ -4,7 +4,7 @@
icon_state = "chronohelmet" icon_state = "chronohelmet"
item_state = "chronohelmet" item_state = "chronohelmet"
slowdown = 1 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 resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/item/clothing/suit/space/chronos/suit = null var/obj/item/clothing/suit/space/chronos/suit = null
@@ -19,7 +19,7 @@
icon_state = "chronosuit" icon_state = "chronosuit"
item_state = "chronosuit" item_state = "chronosuit"
actions_types = list(/datum/action/item_action/toggle) 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 resistance_flags = FIRE_PROOF | ACID_PROOF
mutantrace_variation = STYLE_DIGITIGRADE mutantrace_variation = STYLE_DIGITIGRADE
var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun) var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun)
+7 -7
View File
@@ -5,7 +5,7 @@
icon_state = "hardsuit0-engineering" icon_state = "hardsuit0-engineering"
item_state = "eng_helm" item_state = "eng_helm"
max_integrity = 300 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/basestate = "hardsuit"
var/brightness_on = 4 //luminosity when on var/brightness_on = 4 //luminosity when on
var/on = FALSE var/on = FALSE
@@ -717,7 +717,7 @@
item_state = "rig0-soviet" item_state = "rig0-soviet"
hardsuit_type = "soviet" hardsuit_type = "soviet"
icon_state = "rig0-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 mutantrace_variation = NONE
/obj/item/clothing/suit/space/hardsuit/soviet /obj/item/clothing/suit/space/hardsuit/soviet
@@ -726,7 +726,7 @@
item_state = "rig-soviet" item_state = "rig-soviet"
icon_state = "rig-soviet" icon_state = "rig-soviet"
slowdown = 0.8 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 helmettype = /obj/item/clothing/head/helmet/space/hardsuit/soviet
mutantrace_variation = NONE mutantrace_variation = NONE
@@ -771,7 +771,7 @@
item_state = "ert_medical" item_state = "ert_medical"
hardsuit_type = "ert_medical" hardsuit_type = "ert_medical"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf 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 slowdown = 0
max_charges = 5 max_charges = 5
@@ -800,7 +800,7 @@
icon_state = "hardsuit0-ert_medical" icon_state = "hardsuit0-ert_medical"
item_state = "hardsuit0-ert_medical" item_state = "hardsuit0-ert_medical"
hardsuit_type = "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 /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf/red
icon_state = "hardsuit0-ert_security" icon_state = "hardsuit0-ert_security"
@@ -879,7 +879,7 @@
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | LAVA_PROOF resistance_flags = FIRE_PROOF | LAVA_PROOF
heat_protection = HEAD 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 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) 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" var/energy_color = "#35FFF0"
@@ -923,7 +923,7 @@
item_state = "swat_suit" item_state = "swat_suit"
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | LAVA_PROOF 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) 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 helmettype = /obj/item/clothing/head/helmet/space/hardsuit/lavaknight
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -51,7 +51,7 @@ Contains:
icon_state = "heavy" icon_state = "heavy"
item_state = "swat_suit" 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) 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 strip_delay = 120
resistance_flags = FIRE_PROOF | ACID_PROOF resistance_flags = FIRE_PROOF | ACID_PROOF
mutantrace_variation = STYLE_DIGITIGRADE mutantrace_variation = STYLE_DIGITIGRADE
@@ -63,7 +63,7 @@ Contains:
dynamic_hair_suffix = "+generic" dynamic_hair_suffix = "+generic"
dynamic_fhair_suffix = "+generic" dynamic_fhair_suffix = "+generic"
flags_inv = 0 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 strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -79,7 +79,7 @@ Contains:
flags_inv = 0 flags_inv = 0
w_class = WEIGHT_CLASS_NORMAL 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) 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 strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF 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." desc = "A thick, space-proof tricorne from the royal Space Queen. It's lined with a layer of reflective kevlar."
icon_state = "pirate" icon_state = "pirate"
item_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 flags_inv = HIDEHAIR
strip_delay = 40 strip_delay = 40
equip_delay_other = 20 equip_delay_other = 20
@@ -163,7 +163,7 @@ Contains:
flags_inv = 0 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) 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 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 strip_delay = 40
equip_delay_other = 20 equip_delay_other = 20
mutantrace_variation = STYLE_DIGITIGRADE mutantrace_variation = STYLE_DIGITIGRADE
@@ -175,7 +175,7 @@ Contains:
icon_state = "hardsuit0-ert_commander" icon_state = "hardsuit0-ert_commander"
item_state = "hardsuit0-ert_commander" item_state = "hardsuit0-ert_commander"
hardsuit_type = "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 strip_delay = 130
brightness_on = 7 brightness_on = 7
resistance_flags = ACID_PROOF resistance_flags = ACID_PROOF
@@ -191,7 +191,7 @@ Contains:
item_state = "ert_command" item_state = "ert_command"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert 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) 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 slowdown = 0
strip_delay = 130 strip_delay = 130
resistance_flags = ACID_PROOF resistance_flags = ACID_PROOF
@@ -244,7 +244,7 @@ Contains:
icon_state = "hardsuit0-ert_commander-alert" icon_state = "hardsuit0-ert_commander-alert"
item_state = "hardsuit0-ert_commander-alert" item_state = "hardsuit0-ert_commander-alert"
hardsuit_type = "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 brightness_on = 8
resistance_flags = FIRE_PROOF | ACID_PROOF resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -254,7 +254,7 @@ Contains:
icon_state = "ert_command-alert" icon_state = "ert_command-alert"
item_state = "ert_command-alert" item_state = "ert_command-alert"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/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 resistance_flags = FIRE_PROOF | ACID_PROOF
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC
@@ -303,7 +303,7 @@ Contains:
icon_state = "space" icon_state = "space"
item_state = "s_suit" item_state = "s_suit"
desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies." 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 /obj/item/clothing/head/helmet/space/eva
name = "EVA helmet" name = "EVA helmet"
@@ -311,7 +311,7 @@ Contains:
item_state = "space" item_state = "space"
desc = "A lightweight space helmet with the basic ability to protect the wearer from the vacuum of space during emergencies." desc = "A lightweight space helmet with the basic ability to protect the wearer from the vacuum of space during emergencies."
flash_protect = 0 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 //Radiation
/obj/item/clothing/head/helmet/space/rad /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." desc = "A special helmet that protects against radiation and space. Not much else unfortunately."
icon_state = "cespace_helmet" icon_state = "cespace_helmet"
item_state = "nothing" 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 resistance_flags = FIRE_PROOF
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
actions_types = list() actions_types = list()
@@ -329,7 +329,7 @@ Contains:
desc = "A special suit that protects against radiation and space. Not much else unfortunately." desc = "A special suit that protects against radiation and space. Not much else unfortunately."
icon_state = "hardsuit-rad" icon_state = "hardsuit-rad"
item_state = "nothing" 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 resistance_flags = FIRE_PROOF
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
mutantrace_variation = NONE mutantrace_variation = NONE
@@ -339,7 +339,7 @@ Contains:
desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle." desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
icon_state = "griffinhat" icon_state = "griffinhat"
item_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 strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = ACID_PROOF | FIRE_PROOF resistance_flags = ACID_PROOF | FIRE_PROOF
@@ -351,7 +351,7 @@ Contains:
icon_state = "freedom" icon_state = "freedom"
item_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) 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 strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = ACID_PROOF | FIRE_PROOF 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." desc = "Spaceworthy and it looks like a space carp's head, smells like one too."
icon_state = "carp_helm" icon_state = "carp_helm"
item_state = "syndicate" 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 brightness_on = 0 //luminosity when on
actions_types = list() actions_types = list()
mutantrace_variation = NONE mutantrace_variation = NONE
@@ -380,7 +380,7 @@ Contains:
icon_state = "carp_suit" icon_state = "carp_suit"
item_state = "space_suit_syndicate" item_state = "space_suit_syndicate"
slowdown = 0 //Space carp magic, never stop believing 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 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 helmettype = /obj/item/clothing/head/helmet/space/hardsuit/carp
mutantrace_variation = STYLE_DIGITIGRADE mutantrace_variation = STYLE_DIGITIGRADE
@@ -442,14 +442,14 @@ Contains:
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/old /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." 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 slowdown = 0.8
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/old helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/old
charges = 12 charges = 12
/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/old /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." 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 charges = 12
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker
@@ -467,14 +467,14 @@ Contains:
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/old /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." 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 slowdown = 0.8
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/old helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/old
charges = 6 charges = 6
/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/old /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." 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 charges = 6
/obj/item/clothing/head/helmet/space/fragile /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." 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" icon_state = "syndicate-helm-orange"
item_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 strip_delay = 65
/obj/item/clothing/suit/space/fragile /obj/item/clothing/suit/space/fragile
@@ -492,7 +492,7 @@ Contains:
icon_state = "syndicate-orange" icon_state = "syndicate-orange"
item_state = "syndicate-orange" item_state = "syndicate-orange"
slowdown = 2 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 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) /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" icon_state = "hunter"
item_state = "swat_suit" 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) 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 strip_delay = 130
resistance_flags = FIRE_PROOF | ACID_PROOF resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -5,7 +5,7 @@
name = "EVA plasma envirosuit" 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." 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) 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 resistance_flags = FIRE_PROOF
icon_state = "plasmaman_suit" icon_state = "plasmaman_suit"
item_state = "plasmaman_suit" item_state = "plasmaman_suit"
@@ -40,7 +40,7 @@
icon_state = "plasmaman-helm" icon_state = "plasmaman-helm"
item_state = "plasmaman-helm" item_state = "plasmaman-helm"
strip_delay = 80 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 resistance_flags = FIRE_PROOF
var/brightness_on = 4 //luminosity when the light is on var/brightness_on = 4 //luminosity when the light is on
var/on = FALSE 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." 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" icon_state = "security_envirohelm"
item_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 /obj/item/clothing/head/helmet/space/plasmaman/security/warden
name = "warden's plasma envirosuit helmet" name = "warden's plasma envirosuit helmet"
@@ -132,7 +132,7 @@
desc = "A sturdier plasmaman envirohelmet designed for research directors." desc = "A sturdier plasmaman envirohelmet designed for research directors."
icon_state = "rd_envirohelm" icon_state = "rd_envirohelm"
item_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 /obj/item/clothing/head/helmet/space/plasmaman/robotics
name = "robotics plasma envirosuit helmet" 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." desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange."
icon_state = "engineer_envirohelm" icon_state = "engineer_envirohelm"
item_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 /obj/item/clothing/head/helmet/space/plasmaman/engineering/ce
name = "chief engineer's plasma envirosuit helmet" 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." 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" icon_state = "captain_envirohelm"
item_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 /obj/item/clothing/head/helmet/space/plasmaman/curator
name = "curator's plasma envirosuit helmet" name = "curator's plasma envirosuit helmet"
+2 -2
View File
@@ -4,7 +4,7 @@
icon_state = "syndicate" icon_state = "syndicate"
item_state = "syndicate" item_state = "syndicate"
desc = "Has a tag on it: Totally not property of an enemy corporation, honest!" 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 /obj/item/clothing/suit/space/syndicate
name = "red space suit" name = "red space suit"
@@ -13,7 +13,7 @@
desc = "Has a tag on it: Totally not property of an enemy corporation, honest!" desc = "Has a tag on it: Totally not property of an enemy corporation, honest!"
w_class = WEIGHT_CLASS_NORMAL 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) 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 mutantrace_variation = STYLE_DIGITIGRADE
//Green syndicate space suit //Green syndicate space suit
+3 -3
View File
@@ -8,7 +8,7 @@
equip_delay_other = 40 equip_delay_other = 40
max_integrity = 250 max_integrity = 250
resistance_flags = NONE 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() /obj/item/clothing/suit/armor/Initialize()
@@ -58,7 +58,7 @@
icon_state = "hos" icon_state = "hos"
item_state = "greatcoat" item_state = "greatcoat"
body_parts_covered = CHEST|GROIN|ARMS|LEGS 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 cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS heat_protection = CHEST|GROIN|LEGS|ARMS
strip_delay = 80 strip_delay = 80
@@ -148,7 +148,7 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
heat_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 blocks_shove_knockdown = TRUE
strip_delay = 80 strip_delay = 80
equip_delay_other = 60 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." 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" icon_state = "captain_envirosuit"
item_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 sensor_mode = SENSOR_COORDS
random_sensor = FALSE 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." 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" icon_state = "engineer_envirosuit"
item_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 /obj/item/clothing/under/plasmaman/engineering/ce
name = "chief engineer's plasma envirosuit" 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." 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" icon_state = "rd_envirosuit"
item_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 /obj/item/clothing/under/plasmaman/robotics
name = "robotics plasma envirosuit" name = "robotics plasma envirosuit"
@@ -3,7 +3,7 @@
desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection." desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection."
icon_state = "security_envirosuit" icon_state = "security_envirosuit"
item_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 sensor_mode = SENSOR_COORDS
random_sensor = FALSE random_sensor = FALSE
@@ -110,7 +110,7 @@
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards." desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
name = "janitor's jumpsuit" name = "janitor's jumpsuit"
icon_state = "janitor" 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 /obj/item/clothing/under/rank/civilian/janitor/skirt
name = "janitor's jumpskirt" name = "janitor's jumpskirt"
@@ -4,7 +4,7 @@
name = "chief engineer's jumpsuit" name = "chief engineer's jumpsuit"
icon_state = "chiefengineer" icon_state = "chiefengineer"
item_state = "gy_suit" 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 resistance_flags = NONE
/obj/item/clothing/under/rank/engineering/chief_engineer/skirt /obj/item/clothing/under/rank/engineering/chief_engineer/skirt
@@ -39,7 +39,7 @@
name = "engineer's jumpsuit" name = "engineer's jumpsuit"
icon_state = "engine" icon_state = "engine"
item_state = "engi_suit" 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 resistance_flags = NONE
/obj/item/clothing/under/rank/engineering/engineer/hazard /obj/item/clothing/under/rank/engineering/engineer/hazard
+7 -7
View File
@@ -4,7 +4,7 @@
icon_state = "cmo" icon_state = "cmo"
item_state = "w_suit" item_state = "w_suit"
permeability_coefficient = 0.5 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 /obj/item/clothing/under/rank/medical/chief_medical_officer/skirt
name = "chief medical officer's jumpskirt" name = "chief medical officer's jumpskirt"
@@ -30,7 +30,7 @@
icon_state = "genetics" icon_state = "genetics"
item_state = "w_suit" item_state = "w_suit"
permeability_coefficient = 0.5 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 /obj/item/clothing/under/rank/medical/geneticist/skirt
name = "geneticist's jumpskirt" name = "geneticist's jumpskirt"
@@ -48,7 +48,7 @@
icon_state = "virology" icon_state = "virology"
item_state = "w_suit" item_state = "w_suit"
permeability_coefficient = 0.5 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 /obj/item/clothing/under/rank/medical/virologist/skirt
name = "virologist's jumpskirt" name = "virologist's jumpskirt"
@@ -66,7 +66,7 @@
icon_state = "chemistry" icon_state = "chemistry"
item_state = "w_suit" item_state = "w_suit"
permeability_coefficient = 0.5 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 /obj/item/clothing/under/rank/medical/chemist/skirt
name = "chemist's jumpskirt" name = "chemist's jumpskirt"
@@ -84,7 +84,7 @@
icon_state = "paramedic-dark" icon_state = "paramedic-dark"
item_state = "w_suit" item_state = "w_suit"
permeability_coefficient = 0.5 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 /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." 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" icon_state = "nursesuit"
item_state = "w_suit" item_state = "w_suit"
permeability_coefficient = 0.5 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 body_parts_covered = CHEST|GROIN|ARMS
fitted = NO_FEMALE_UNIFORM fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE can_adjust = FALSE
@@ -122,7 +122,7 @@
icon_state = "medical" icon_state = "medical"
item_state = "w_suit" item_state = "w_suit"
permeability_coefficient = 0.5 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 /obj/item/clothing/under/rank/medical/doctor/blue
name = "blue medical scrubs" name = "blue medical scrubs"
+4 -4
View File
@@ -3,7 +3,7 @@
name = "research director's vest suit" name = "research director's vest suit"
icon_state = "director" icon_state = "director"
item_state = "lb_suit" 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 can_adjust = FALSE
/obj/item/clothing/under/rank/rnd/research_director/skirt /obj/item/clothing/under/rank/rnd/research_director/skirt
@@ -20,7 +20,7 @@
name = "research director's tan suit" name = "research director's tan suit"
icon_state = "rdwhimsy" icon_state = "rdwhimsy"
item_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 can_adjust = TRUE
alt_covers_chest = TRUE alt_covers_chest = TRUE
@@ -39,7 +39,7 @@
name = "research director's turtleneck" name = "research director's turtleneck"
icon_state = "rdturtle" icon_state = "rdturtle"
item_state = "p_suit" 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 can_adjust = TRUE
alt_covers_chest = TRUE alt_covers_chest = TRUE
@@ -59,7 +59,7 @@
icon_state = "toxins" icon_state = "toxins"
item_state = "w_suit" item_state = "w_suit"
permeability_coefficient = 0.5 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 /obj/item/clothing/under/rank/rnd/scientist/skirt
name = "scientist's jumpskirt" name = "scientist's jumpskirt"
+1 -1
View File
@@ -66,7 +66,7 @@
gas_transfer_coefficient = 0.01 gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01 permeability_coefficient = 0.01
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS 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 cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
+10 -10
View File
@@ -4,7 +4,7 @@
icon_state = "syndicate" icon_state = "syndicate"
item_state = "bl_suit" item_state = "bl_suit"
has_sensor = NO_SENSORS 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 alt_covers_chest = TRUE
/obj/item/clothing/under/syndicate/skirt /obj/item/clothing/under/syndicate/skirt
@@ -13,7 +13,7 @@
icon_state = "syndicate_skirt" icon_state = "syndicate_skirt"
item_state = "bl_suit" item_state = "bl_suit"
has_sensor = NO_SENSORS 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 alt_covers_chest = TRUE
fitted = FEMALE_UNIFORM_TOP fitted = FEMALE_UNIFORM_TOP
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
@@ -24,7 +24,7 @@
icon_state = "bloodred_pajamas" icon_state = "bloodred_pajamas"
item_state = "bl_suit" item_state = "bl_suit"
dummy_thick = TRUE 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 resistance_flags = FIRE_PROOF | ACID_PROOF
can_adjust = FALSE can_adjust = FALSE
@@ -33,21 +33,21 @@
desc = "Do operatives dream of nuclear sheep?" desc = "Do operatives dream of nuclear sheep?"
icon_state = "bloodred_pajamas" icon_state = "bloodred_pajamas"
item_state = "bl_suit" 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 /obj/item/clothing/under/syndicate/tacticool
name = "tacticool turtleneck" name = "tacticool turtleneck"
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
icon_state = "tactifool" icon_state = "tactifool"
item_state = "bl_suit" 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 /obj/item/clothing/under/syndicate/tacticool/skirt
name = "tacticool skirtleneck" name = "tacticool skirtleneck"
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
icon_state = "tactifool_skirt" icon_state = "tactifool_skirt"
item_state = "bl_suit" 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 fitted = FEMALE_UNIFORM_TOP
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
@@ -57,7 +57,7 @@
icon_state = "tactifool" icon_state = "tactifool"
item_state = "bl_suit" item_state = "bl_suit"
has_sensor = TRUE 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 /obj/item/clothing/under/syndicate/sniper
name = "Tactical turtleneck suit" name = "Tactical turtleneck suit"
@@ -81,7 +81,7 @@
desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in." desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in."
icon_state = "trackpants" icon_state = "trackpants"
can_adjust = FALSE 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 resistance_flags = NONE
/obj/item/clothing/under/syndicate/combat /obj/item/clothing/under/syndicate/combat
@@ -96,7 +96,7 @@
desc = "Military grade tracksuits for frontline squatting." desc = "Military grade tracksuits for frontline squatting."
icon_state = "rus_under" icon_state = "rus_under"
can_adjust = FALSE 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 resistance_flags = NONE
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
@@ -106,7 +106,7 @@
icon_state = "syndicatebaseball" icon_state = "syndicatebaseball"
item_state = "syndicatebaseball" item_state = "syndicatebaseball"
has_sensor = NO_SENSORS 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 alt_covers_chest = TRUE
mutantrace_variation = USE_TAUR_CLIP_MASK mutantrace_variation = USE_TAUR_CLIP_MASK
+16 -17
View File
@@ -1,8 +1,8 @@
/datum/round_event_control/travelling_trader /datum/round_event_control/travelling_trader
name = "Travelling Trader" name = "Travelling Trader"
typepath = /datum/round_event/travelling_trader typepath = /datum/round_event/travelling_trader
weight = 10 weight = 8
max_occurrences = 3 max_occurrences = 2
earliest_start = 0 MINUTES earliest_start = 0 MINUTES
/datum/round_event/travelling_trader /datum/round_event/travelling_trader
@@ -52,6 +52,14 @@
var/acceptance_speech = "This is exactly what I wanted! I shall be on my way now, thank you.!" var/acceptance_speech = "This is exactly what I wanted! I shall be on my way now, thank you.!"
var/refusal_speech = "A given_item? I wanted a requested_item!" //what they say when refusing an item var/refusal_speech = "A given_item? I wanted a requested_item!" //what they say when refusing an item
var/active = TRUE var/active = TRUE
var/examine_text = list("<span class='warning'>You attempt to look directly at the being's face, but it's just a blur!")
move_resist = MOVE_FORCE_VERY_STRONG
mob_size = MOB_SIZE_LARGE
alpha = 200
/mob/living/carbon/human/dummy/travelling_trader/examine(mob/user)
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, examine_text)
return examine_text
/mob/living/carbon/human/dummy/travelling_trader/proc/setup_speech(var/input_speech, var/obj/item/given_item) /mob/living/carbon/human/dummy/travelling_trader/proc/setup_speech(var/input_speech, var/obj/item/given_item)
if(requested_item) if(requested_item)
@@ -92,6 +100,8 @@
/mob/living/carbon/human/dummy/travelling_trader/Initialize() /mob/living/carbon/human/dummy/travelling_trader/Initialize()
..() ..()
add_atom_colour("#570d6b", FIXED_COLOUR_PRIORITY) //make them purple (otherworldly!)
set_light(1, -0.7, "#AAD84B")
ADD_TRAIT(src,TRAIT_PIERCEIMMUNE, "trader_pierce_immune") //don't let people take their blood ADD_TRAIT(src,TRAIT_PIERCEIMMUNE, "trader_pierce_immune") //don't let people take their blood
equipOutfit(trader_outfit, TRUE) equipOutfit(trader_outfit, TRUE)
for(var/obj/item/item in src.get_equipped_items()) for(var/obj/item/item in src.get_equipped_items())
@@ -159,15 +169,11 @@
trader_name = "Otherworldly Animal Specialist" trader_name = "Otherworldly Animal Specialist"
trader_outfit = /datum/outfit/job/doctor trader_outfit = /datum/outfit/job/doctor
initial_speech = "Greetings, lifeform. I am here to locate a special creature aboard your station." initial_speech = "Greetings, lifeform. I am here to locate a special creature aboard your station."
request_speech = "Find me the creature known as 'requested_item' and you shall be rewarded for your efforts." request_speech = "Find me the creature known as 'requested_item' and hand it to me, preferably in a suitable container."
refusal_speech = "Do you think me to be a fool, lifeform? I know a requested_item when I see one." refusal_speech = "Do you think me to be a fool, lifeform? I know a requested_item when I see one."
possible_wanted_items = list(/mob/living/simple_animal/pet/dog/corgi/Ian = 1, possible_wanted_items = list(/mob/living/simple_animal/pet/dog/corgi = 4,
/mob/living/simple_animal/sloth/paperwork = 1, /mob/living/carbon/monkey = 1,
/mob/living/carbon/monkey/punpun = 1, /mob/living/simple_animal/mouse = 2)
/mob/living/simple_animal/pet/fox/Renault = 1,
/mob/living/simple_animal/hostile/carp/cayenne = 1,
/mob/living/simple_animal/pet/bumbles = 1,
/mob/living/simple_animal/parrot/Poly = 1)
possible_rewards = list(/mob/living/simple_animal/pet/dog/corgi/exoticcorgi = 1, //rewards are animals, friendly to only the person who handed the reward in! possible_rewards = list(/mob/living/simple_animal/pet/dog/corgi/exoticcorgi = 1, //rewards are animals, friendly to only the person who handed the reward in!
/mob/living/simple_animal/cockroach = 1, /mob/living/simple_animal/cockroach = 1,
/mob/living/simple_animal/hostile/skeleton = 1, /mob/living/simple_animal/hostile/skeleton = 1,
@@ -184,13 +190,6 @@
mob/living/carbon/human/dummy/travelling_trader/animal_hunter/Initialize() mob/living/carbon/human/dummy/travelling_trader/animal_hunter/Initialize()
acceptance_speech = pick(list("This lifeform shall make for a great stew, thank you.", "This lifeform shall be of a true use to our cause, thank you.", "The lifeform is adequate. Goodbye.", "This lifeform shall make a great addition to my collection.")) acceptance_speech = pick(list("This lifeform shall make for a great stew, thank you.", "This lifeform shall be of a true use to our cause, thank you.", "The lifeform is adequate. Goodbye.", "This lifeform shall make a great addition to my collection."))
//make sure they only ask for animals that are still alive
for(var/mob/living/animal in possible_wanted_items)
if(!(animal in GLOB.mob_living_list))
possible_wanted_items -= animal
if(!possible_wanted_items)
//all the pets are dead, so ask for a monkey, or sometimes a corgi (corgis are more annoying to get a hold of)
possible_wanted_items = list(/mob/living/simple_animal/pet/dog/corgi = 1, /mob/living/carbon/monkey = 3)
..() ..()
/mob/living/carbon/human/dummy/travelling_trader/animal_hunter/check_item(var/obj/item/supplied_item) //item is likely to be in contents of whats supplied /mob/living/carbon/human/dummy/travelling_trader/animal_hunter/check_item(var/obj/item/supplied_item) //item is likely to be in contents of whats supplied
@@ -299,6 +299,31 @@
desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea." desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea."
list_reagents = list(/datum/reagent/consumable/tea = 30) list_reagents = list(/datum/reagent/consumable/tea = 30)
/obj/item/reagent_containers/food/drinks/mug/tea/red
name = "Dutchess Red tea"
icon_state = "tea"
desc = "Duchess Red's personal blend of red tea leaves and hot water. Great addition to any meal."
list_reagents = list(/datum/reagent/consumable/tea/red = 30)
/obj/item/reagent_containers/food/drinks/mug/tea/green
name = "Prince Green tea"
icon_state = "tea"
desc = "Prince Green's brew of tea. The blend may be different from time to time, but Prince Green swears by it!"
list_reagents = list(/datum/reagent/consumable/tea/green = 30)
/obj/item/reagent_containers/food/drinks/mug/tea/forest
name = "Royal Forest tea"
icon_state = "tea"
desc = "Tea fit for anyone with a sweet tooth like Royal Forest."
list_reagents = list(/datum/reagent/consumable/tea/forest = 30)
/obj/item/reagent_containers/food/drinks/mug/tea/mush
name = "Rebel Mush tea"
icon_state = "tea"
desc = "Rebel Mush, a hallucinogenic tea to help people find their inner self."
list_reagents = list(/datum/reagent/consumable/tea/mush = 30)
/obj/item/reagent_containers/food/drinks/mug/coco /obj/item/reagent_containers/food/drinks/mug/coco
name = "Dutch hot coco" name = "Dutch hot coco"
desc = "Made in Space South America." desc = "Made in Space South America."
@@ -87,7 +87,7 @@
hitsound = 'sound/weapons/bladeslice.ogg' hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("stabbed", "slashed", "attacked") attack_verb = list("stabbed", "slashed", "attacked")
var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken")
sharpness = IS_SHARP sharpness = SHARP_EDGED
/obj/item/broken_bottle/Initialize() /obj/item/broken_bottle/Initialize()
. = ..() . = ..()
+2 -14
View File
@@ -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>") to_chat(user, "<span class='warning'>You cannot slice [src] here! You need a table or at least a tray.</span>")
return FALSE return FALSE
var/slices_lost = 0 user.visible_message("[user] slices [src].", "<span class='notice'>You slice [src].</span>")
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)))
var/reagents_per_slice = reagents.total_volume/slices_num 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) var/obj/item/reagent_containers/food/snacks/slice = new slice_path (loc)
initialize_slice(slice, reagents_per_slice) initialize_slice(slice, reagents_per_slice)
qdel(src) qdel(src)
@@ -18,12 +18,6 @@
results = list(/datum/reagent/consumable/ethanol/bilk = 2) results = list(/datum/reagent/consumable/ethanol/bilk = 2)
required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/ethanol/beer = 1) required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/ethanol/beer = 1)
/datum/chemical_reaction/icetea
name = "Iced Tea"
id = /datum/reagent/consumable/icetea
results = list(/datum/reagent/consumable/icetea = 4)
required_reagents = list(/datum/reagent/consumable/ice = 1, /datum/reagent/consumable/tea = 3)
/datum/chemical_reaction/icecoffee /datum/chemical_reaction/icecoffee
name = "Iced Coffee" name = "Iced Coffee"
id = /datum/reagent/consumable/icecoffee id = /datum/reagent/consumable/icecoffee
@@ -581,13 +575,6 @@
required_reagents = list(/datum/reagent/consumable/lemonjuice = 2, /datum/reagent/water = 2, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/ice = 1) required_reagents = list(/datum/reagent/consumable/lemonjuice = 2, /datum/reagent/water = 2, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/ice = 1)
mix_message = "You're suddenly reminded of home." mix_message = "You're suddenly reminded of home."
/datum/chemical_reaction/arnold_palmer
name = "Arnold Palmer"
id = /datum/reagent/consumable/tea/arnold_palmer
results = list(/datum/reagent/consumable/tea/arnold_palmer = 2)
required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/consumable/lemonade = 1)
mix_message = "The smells of fresh green grass and sand traps waft through the air as the mixture turns a friendly yellow-orange."
/datum/chemical_reaction/chocolate_milk /datum/chemical_reaction/chocolate_milk
name = "chocolate milk" name = "chocolate milk"
id = /datum/reagent/consumable/milk/chocolate_milk id = /datum/reagent/consumable/milk/chocolate_milk
@@ -756,12 +743,6 @@
results = list(/datum/reagent/consumable/pinkmilk = 2) results = list(/datum/reagent/consumable/pinkmilk = 2)
required_reagents = list(/datum/reagent/consumable/strawberryjuice = 1, /datum/reagent/consumable/milk = 1) required_reagents = list(/datum/reagent/consumable/strawberryjuice = 1, /datum/reagent/consumable/milk = 1)
/datum/chemical_reaction/pinktea
name = "Strawberry Tea"
id = /datum/reagent/consumable/pinktea
results = list(/datum/reagent/consumable/pinktea = 5)
required_reagents = list(/datum/reagent/consumable/strawberryjuice = 1, /datum/reagent/consumable/tea/arnold_palmer = 1, /datum/reagent/consumable/sugar = 1)
/datum/chemical_reaction/blank_paper /datum/chemical_reaction/blank_paper
name = "Blank Paper" name = "Blank Paper"
id = /datum/reagent/consumable/ethanol/blank_paper id = /datum/reagent/consumable/ethanol/blank_paper
@@ -903,12 +884,6 @@
results = list(/datum/reagent/consumable/ethanol/mauna_loa = 5) results = list(/datum/reagent/consumable/ethanol/mauna_loa = 5)
required_reagents = list(/datum/reagent/consumable/capsaicin = 2, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/bahama_mama = 2) required_reagents = list(/datum/reagent/consumable/capsaicin = 2, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/bahama_mama = 2)
/datum/chemical_reaction/catnip_tea
name = "Catnip Tea"
id = /datum/reagent/consumable/catnip_tea
results = list(/datum/reagent/consumable/catnip_tea = 3)
required_reagents = list(/datum/reagent/consumable/tea = 5, /datum/reagent/pax/catnip = 2)
/datum/chemical_reaction/commander_and_chief /datum/chemical_reaction/commander_and_chief
name = "Commander and Chief" name = "Commander and Chief"
id = /datum/reagent/consumable/ethanol/commander_and_chief id = /datum/reagent/consumable/ethanol/commander_and_chief
@@ -916,6 +891,76 @@
required_reagents = list(/datum/reagent/consumable/ethanol/alliescocktail = 50, /datum/reagent/consumable/ethanol/champagne = 20, /datum/reagent/consumable/doctor_delight = 10, /datum/reagent/consumable/ethanol/quintuple_sec = 10, /datum/reagent/consumable/ethanol/screwdrivercocktail = 10) required_reagents = list(/datum/reagent/consumable/ethanol/alliescocktail = 50, /datum/reagent/consumable/ethanol/champagne = 20, /datum/reagent/consumable/doctor_delight = 10, /datum/reagent/consumable/ethanol/quintuple_sec = 10, /datum/reagent/consumable/ethanol/screwdrivercocktail = 10)
mix_message = "When your powers combine, I am Captain Pl-..." mix_message = "When your powers combine, I am Captain Pl-..."
////////////////////////////////////////// Tea Base Drinks //////////////////////////////////////
/datum/chemical_reaction/mush
name = "Mush Tea"
id = /datum/reagent/consumable/tea/mush
results = list(/datum/reagent/consumable/tea/mush = 3)
required_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 3, /datum/reagent/consumable/tea = 3)
/datum/chemical_reaction/foresttea1
name = "Forest Tea"
id = /datum/reagent/consumable/tea/forest
results = list(/datum/reagent/consumable/tea/forest = 3)
required_reagents = list(/datum/reagent/consumable/buzz_fuzz= 3, /datum/reagent/consumable/tea = 3)
/datum/chemical_reaction/foresttea2
name = "Forest Tea"
id = /datum/reagent/consumable/tea/forest
results = list(/datum/reagent/consumable/tea/forest = 3)
required_reagents = list(/datum/reagent/consumable/honey = 1, /datum/reagent/consumable/tea = 3)
/datum/chemical_reaction/redtea1
name = "Red Tea"
id = /datum/reagent/consumable/tea/red
results = list(/datum/reagent/consumable/tea/red = 3)
required_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/red = 1, /datum/reagent/consumable/tea = 3)
/datum/chemical_reaction/greentea1
name = "Green Tea"
id = /datum/reagent/consumable/tea/green
results = list(/datum/reagent/consumable/tea/green = 3)
required_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/green = 1, /datum/reagent/consumable/tea = 3)
/datum/chemical_reaction/redtea2
name = "Red Tea"
id = /datum/reagent/consumable/tea/red
results = list(/datum/reagent/consumable/tea/red = 3)
required_reagents = list(/datum/reagent/toxin/teapowder/red = 1, /datum/reagent/water = 3)
/datum/chemical_reaction/greentea2
name = "Green Tea"
id = /datum/reagent/consumable/tea/green
results = list(/datum/reagent/consumable/tea/green = 3)
required_reagents = list(/datum/reagent/toxin/teapowder/green = 1, /datum/reagent/water = 3)
/datum/chemical_reaction/arnold_palmer
name = "Arnold Palmer"
id = /datum/reagent/consumable/tea/arnold_palmer
results = list(/datum/reagent/consumable/tea/arnold_palmer = 2)
required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/consumable/lemonade = 1)
mix_message = "The smells of fresh green grass and sand traps waft through the air as the mixture turns a friendly yellow-orange."
/datum/chemical_reaction/icetea
name = "Iced Tea"
id = /datum/reagent/consumable/icetea
results = list(/datum/reagent/consumable/icetea = 4)
required_reagents = list(/datum/reagent/consumable/ice = 1, /datum/reagent/consumable/tea = 3)
/datum/chemical_reaction/pinktea
name = "Strawberry Tea"
id = /datum/reagent/consumable/pinktea
results = list(/datum/reagent/consumable/pinktea = 5)
required_reagents = list(/datum/reagent/consumable/strawberryjuice = 1, /datum/reagent/consumable/tea/arnold_palmer = 1, /datum/reagent/consumable/sugar = 1)
/datum/chemical_reaction/catnip_tea
name = "Catnip Tea"
id = /datum/reagent/consumable/catnip_tea
results = list(/datum/reagent/consumable/catnip_tea = 3)
required_reagents = list(/datum/reagent/consumable/tea = 5, /datum/reagent/pax/catnip = 2)
////////////////////////////////////////// Race Base Drinks ////////////////////////////////////// ////////////////////////////////////////// Race Base Drinks //////////////////////////////////////
/datum/chemical_reaction/coldscales /datum/chemical_reaction/coldscales
@@ -303,7 +303,10 @@ h1.alert, h2.alert {color: #000000;}
.passive {color: #660000;} .passive {color: #660000;}
.userdanger {color: #ff0000; font-weight: bold; font-size: 185%;} .userdanger {color: #ff0000; font-weight: bold; font-size: 185%;}
.bolddanger {color: #c51e1e;font-weight: bold;}
.danger {color: #ff0000;} .danger {color: #ff0000;}
.tinydanger {color: #c51e1e; font-size: 85%;}
.smalldanger {color: #c51e1e; font-size: 90%;}
.warning {color: #ff0000; font-style: italic;} .warning {color: #ff0000; font-style: italic;}
.alertwarning {color: #FF0000; font-weight: bold} .alertwarning {color: #FF0000; font-weight: bold}
.boldwarning {color: #ff0000; font-style: italic; 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;} .rose {color: #ff5050;}
.info {color: #0000CC;} .info {color: #0000CC;}
.notice {color: #000099;} .notice {color: #000099;}
.tinynotice {color: #6685f5; font-style: italic; font-size: 85%;} .tinynotice {color: #6685f5; font-style: italic; font-size: 85%;}
.smallnotice {color: #6685f5; font-style: italic; font-size: 90%;} .smallnotice {color: #6685f5; font-size: 90%;}
.smallnoticeital {color: #6685f5; font-style: italic; font-size: 90%;}
.boldnotice {color: #000099; font-weight: bold;} .boldnotice {color: #000099; font-weight: bold;}
.adminnotice {color: #0000ff;} .adminnotice {color: #0000ff;}
.adminhelp {color: #ff0000; font-weight: bold;} .adminhelp {color: #ff0000; font-weight: bold;}
+6
View File
@@ -27,6 +27,12 @@
juice_results = list(/datum/reagent/consumable/banana = 0) juice_results = list(/datum/reagent/consumable/banana = 0)
distill_reagent = /datum/reagent/consumable/ethanol/bananahonk 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) /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>") 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) playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1)

Some files were not shown because too many files have changed in this diff Show More