[MIRROR] Kapulimbs [MDB IGNORE] (#12497)

* Kapulimbs

* conflicts

* part one of fixes

* more fex

* ugh

* more fix

* eee

* e

* more fix

* Well it compiles, but we need to get digi legs working

* more fixes

* https://github.com/tgstation/tgstation/pull/65887

* https://github.com/tgstation/tgstation/pull/65904

* https://github.com/tgstation/tgstation/pull/65923

* more fix

* now uses dna specific icon overrides.

* species code no longer dictates what icon the limbs use

* digitigrade legs implemenation

* more fixes, species indexing, species bodyparts

* remaining mutant bois

* 0

* okay this work!

* IPC stuffs

* inv file uses

* optimisation and limb string rendering digitigrade stuff

* wew

* partial vox support

* bodymarkings are now stored on the bodypart

* limb key caching

* Update carbon_update_icons.dm

* Update carbon_update_icons.dm

* Moves our mutant variance to the new system and makes shoes squash.

* all legs do it

* https://github.com/tgstation/tgstation/pull/65918

* https://github.com/tgstation/tgstation/pull/65899

* https://github.com/tgstation/tgstation/pull/65990

* teshari bodytype

* them teshari's aren't humans

* bandaid for future proper teshari implementation

* Update vox_bodyparts.dm

* fixes chests and teshari implementation

* fixes

* fex

* Update mutant_zombie_bodyparts.dm

* oops

* Update synthetic_lizard_bodyparts.dm

* Update code/modules/mob/living/carbon/human/human_update_icons.dm

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>

* Update code/modules/mob/living/carbon/human/human_update_icons.dm

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>

* Update code/modules/mob/living/carbon/human/human_update_icons.dm

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>

* Update modular_skyrat/master_files/code/modules/surgery/bodyparts/species_parts/ghoul_bodyparts.dm

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>

* Update modular_skyrat/master_files/code/modules/surgery/bodyparts/species_parts/ghoul_bodyparts.dm

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>

* Update modular_skyrat/master_files/code/modules/surgery/bodyparts/species_parts/ghoul_bodyparts.dm

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>

* Update modular_skyrat/master_files/code/modules/surgery/bodyparts/species_parts/ghoul_bodyparts.dm

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>

* Update code/modules/mob/living/carbon/human/species.dm

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>

* Update scissors.dm

* wound stuff

* Update carbon_examine.dm

* more stuff

* Delete human_update_icons.dm

* begone thot

* https://github.com/tgstation/tgstation/pull/66065

* Update _external_organs.dm

Co-authored-by: Kapu1178 <75460809+Kapu1178@users.noreply.github.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
This commit is contained in:
SkyratBot
2022-04-11 02:40:05 +01:00
committed by GitHub
co-authored by GoldenAlpharex Kapu1178 Gandalf
parent 0df94684c1
commit 3916ea03de
323 changed files with 4790 additions and 8221 deletions
+24 -58
View File
@@ -81,30 +81,28 @@
#define NOBLOOD 6
#define NOTRANSSTING 7
#define NOZOMBIE 8
/// Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi)
#define DIGITIGRADE 9
#define NO_UNDERWEAR 10
#define NOSTOMACH 11
#define NO_DNA_COPY 12
#define DRINKSBLOOD 13
#define NO_UNDERWEAR 9
#define NOSTOMACH 10
#define NO_DNA_COPY 11
#define DRINKSBLOOD 12
/// Use this if you want to change the race's color without the player being able to pick their own color. AKA special color shifting
#define DYNCOLORS 14
#define AGENDER 15
#define DYNCOLORS 13
#define AGENDER 14
/// Do not draw eyes or eyeless overlay
#define NOEYESPRITES 16
#define NOEYESPRITES 15
/// Used for determining which wounds are applicable to this species.
/// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD)
#define HAS_FLESH 17
#define HAS_FLESH 16
/// if we have bones (can suffer bone wounds)
#define HAS_BONE 18
#define HAS_BONE 17
///If we have a limb-specific overlay sprite
#define HAS_MARKINGS 19
#define HAS_MARKINGS 18
/// Do not draw blood overlay
#define NOBLOODOVERLAY 20
#define NOBLOODOVERLAY 19
///No augments, for monkeys in specific because they will turn into fucking freakazoids https://cdn.discordapp.com/attachments/326831214667235328/791313258912153640/102707682-fa7cad80-4294-11eb-8f13-8c689468aeb0.png
#define NOAUGMENTS 21
#define NOAUGMENTS 20
///will be assigned a universal vampire themed last name shared by their department. this is preferenced!
#define BLOOD_CLANS 22
#define BLOOD_CLANS 21
//organ slots
#define ORGAN_SLOT_ADAMANTINE_RESONATOR "adamantine_resonator"
@@ -163,7 +161,7 @@
#define CHROMOSOME_NONE 1
#define CHROMOSOME_USED 2
//used for mob's genetic gender (mainly just for pronouns, members of sexed species with plural gender refer to their body_type for the actual sprites, which is not genetic)
//used for mob's genetic gender (mainly just for pronouns, members of sexed species with plural gender refer to their physique for the actual sprites, which is not genetic)
#define G_MALE 1
#define G_FEMALE 2
#define G_PLURAL 3
@@ -201,42 +199,10 @@ GLOBAL_LIST_INIT(organ_process_order, list(
ORGAN_SLOT_XENO_NEUROTOXINGLAND,
ORGAN_SLOT_XENO_EGGSAC,))
//Defines for Species IDs
#define SPECIES_HUMAN "human"
#define SPECIES_FELINE "felinid"
#define SPECIES_MOTH "moth"
#define SPECIES_ETHEREAL "ethereal"
#define SPECIES_PLASMAMAN "plasmaman"
#define SPECIES_FLY "fly"
#define SPECIES_MONKEY "monkey"
#define SPECIES_JELLYPERSON "jelly"
#define SPECIES_SLIMEPERSON "slime"
#define SPECIES_LUMINESCENT "lum"
#define SPECIES_STARGAZER "stargazer"
#define SPECIES_LIZARD "lizard"
#define SPECIES_LIZARD_ASH "ashlizard"
#define SPECIES_LIZARD_SILVER "silverlizard"
#define SPECIES_DULLAHAN "dullahan"
#define SPECIES_SKELETON "skeleton"
#define SPECIES_VAMPIRE "vampire"
#define SPECIES_ZOMBIE "memezombies"
#define SPECIES_ZOMBIE_HALLOWEEN "zombie"
#define SPECIES_ADDICT "goofzombies"
#define SPECIES_ABDUCTOR "abductor"
#define SPECIES_ANDROID "android"
#define SPECIES_MUSHROOM "mush"
#define SPECIES_PODPERSON "pod"
#define SPECIES_SHADOW "shadow"
#define SPECIES_NIGHTMARE "nightmare"
#define SPECIES_SNAIL "snail"
#define SPECIES_SYNTH "synth"
#define SPECIES_SYNTH_MILITARY "military_synth"
//Defines for Golem Species IDs
#define SPECIES_GOLEM "iron_golem"
#define SPECIES_GOLEM_ADAMANTINE "adamantine_golem"
#define SPECIES_GOLEM_PLASMA "plasma_golem"
#define SPECIES_GOLEM "golem"
#define SPECIES_GOLEM_ADAMANTINE "a_golem"
#define SPECIES_GOLEM_PLASMA "p_golem"
#define SPECIES_GOLEM_DIAMOND "diamond_golem"
#define SPECIES_GOLEM_GOLD "gold_golem"
#define SPECIES_GOLEM_SILVER "silver_golem"
@@ -249,16 +215,16 @@ GLOBAL_LIST_INIT(organ_process_order, list(
#define SPECIES_GOLEM_SAND "sand_golem"
#define SPECIES_GOLEM_GLASS "glass_golem"
#define SPECIES_GOLEM_BLUESPACE "bluespace_golem"
#define SPECIES_GOLEM_BANANIUM "bananium_golem"
#define SPECIES_GOLEM_CULT "runic_golem"
#define SPECIES_GOLEM_CLOTH "cloth_golem"
#define SPECIES_GOLEM_BANANIUM "ba_golem"
#define SPECIES_GOLEM_CULT "cultgolem"
#define SPECIES_GOLEM_CLOTH "clothgolem"
#define SPECIES_GOLEM_PLASTIC "plastic_golem"
#define SPECIES_GOLEM_BRONZE "bronze_golem"
#define SPECIES_GOLEM_CARDBOARD "cardboard_golem"
#define SPECIES_GOLEM_CARDBOARD "c_golem"
#define SPECIES_GOLEM_LEATHER "leather_golem"
#define SPECIES_GOLEM_DURATHREAD "durathread_golem"
#define SPECIES_GOLEM_BONE "bone_golem"
#define SPECIES_GOLEM_SNOW "snow_golem"
#define SPECIES_GOLEM_DURATHREAD "d_golem"
#define SPECIES_GOLEM_BONE "b_golem"
#define SPECIES_GOLEM_SNOW "sn_golem"
#define SPECIES_GOLEM_HYDROGEN "metallic_hydrogen_golem"
// Defines for used in creating "perks" for the species preference pages.
+2
View File
@@ -0,0 +1,2 @@
///The standard amount of bodyparts a carbon has. Currently 6, HEAD/L_ARM/R_ARM/CHEST/L_LEG/R_LEG
#define BODYPARTS_DEFAULT_MAXIMUM 6
+19 -7
View File
@@ -148,13 +148,25 @@
#define ALT_STYLE 1
#define DIGITIGRADE_STYLE 2
//flags for outfits that have mutantrace variants (try not to use this): Currently only needed if you're trying to add tight fitting bootyshorts
#define NO_MUTANTRACE_VARIATION 0
#define MUTANTRACE_VARIATION 1
#define NOT_DIGITIGRADE 0
#define FULL_DIGITIGRADE 1
#define SQUISHED_DIGITIGRADE 2
//Flags (actual flags, fucker ^) for /obj/item/var/supports_variations_flags
///No alternative sprites based on bodytype
#define CLOTHING_NO_VARIATION (1<<0)
///Has a sprite for digitigrade legs specifically.
#define CLOTHING_DIGITIGRADE_VARIATION (1<<1)
///The sprite works fine for digitigrade legs as-is.
#define CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON (1<<2)
// SKYRAT EDIT ADDITION
/// The sprite works fine for snouts.
#define CLOTHING_SNOUTED_VARIATION (1<<3)
/// The sprite works fine for snouts as-is.
#define CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON (1<<4)
/// The sprite works fine for vox snouts.
#define CLOTHING_SNOUTED_VOX_VARIATION (1<<5)
/// The sprite works fine for vox snouts as is.
#define CLOTHING_SNOUTED_VOX_VARIATION_NO_NEW_ICON (1<<6)
/// The sprite works fine for vox snouts.
#define CLOTHING_VOX_HAND_VARIATION (1<<7)
// SKYRAT EDIT END
//flags for covering body parts
#define GLASSESCOVERSEYES (1<<0)
+62 -3
View File
@@ -49,13 +49,11 @@
#define MOB_SPIRIT (1 << 9)
#define MOB_PLANT (1 << 10)
//Organ defines for carbon mobs
#define ORGAN_ORGANIC 1
#define ORGAN_ROBOTIC 2
#define BODYPART_ORGANIC 1
#define BODYPART_ROBOTIC 2
#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi'
#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi'
@@ -63,7 +61,68 @@
#define ALIEN_BODYPART "alien"
#define LARVA_BODYPART "larva"
//Bodypart change blocking flags
///Bodypart does not get replaced during set_species()
#define BP_BLOCK_CHANGE_SPECIES (1<<0)
//Bodytype defines for how things can be worn, surgery, and other misc things.
///The limb is organic
#define BODYTYPE_ORGANIC (1<<0)
///The limb is robotic
#define BODYTYPE_ROBOTIC (1<<1)
///The limb fits the human mold
#define BODYTYPE_HUMANOID (1<<2)
///The limb is digitigrade
#define BODYTYPE_DIGITIGRADE (1<<3) //Cancer
///The limb fits the monkey mold
#define BODYTYPE_MONKEY (1<<4)
///The limb is snouted
#define BODYTYPE_SNOUTED (1<<5)
// SKYRAT EDIT ADDITION
///The limb fits the vox shape
#define BODYTYPE_VOX (1<<6)
///The limb fits the teshari shape
#define BODYTYPE_TESHARI (1<<7)
// SKYRAT EDIT END
//Defines for Species IDs
#define SPECIES_ABDUCTOR "abductor"
#define SPECIES_ANDROID "android"
#define SPECIES_DULLAHAN "dullahan"
#define SPECIES_ETHEREAL "ethereal"
#define SPECIES_FELINE "felinid"
#define SPECIES_FLYPERSON "fly"
#define SPECIES_HUMAN "human"
#define SPECIES_JELLYPERSON "jelly"
#define SPECIES_SLIMEPERSON "slime"
#define SPECIES_LUMINESCENT "luminescent"
#define SPECIES_STARGAZER "stargazer"
#define SPECIES_LIZARD "lizard"
#define SPECIES_LIZARD_ASH "ashwalker"
#define SPECIES_LIZARD_SILVER "silverscale"
#define SPECIES_NIGHTMARE "nightmare"
#define SPECIES_MONKEY "monkey"
#define SPECIES_MOTH "moth"
#define SPECIES_MUSHROOM "mush"
#define SPECIES_PLASMAMAN "plasmaman"
#define SPECIES_PODPERSON "pod"
#define SPECIES_SHADOW "shadow"
#define SPECIES_SKELETON "skeleton"
#define SPECIES_SNAIL "snail"
#define SPECIES_VAMPIRE "vampire"
#define SPECIES_ZOMBIE "zombie"
#define SPECIES_ZOMBIE_INFECTIOUS "memezombie"
#define SPECIES_ZOMBIE_KROKODIL "krokodil_zombie"
//See: datum/species/var/digitigrade_customization
///The species does not have digitigrade legs in generation.
#define DIGITIGRADE_NEVER 0
///The species can have digitigrade legs in generation
#define DIGITIGRADE_OPTIONAL 1
///The species is forced to have digitigrade legs in generation.
#define DIGITIGRADE_FORCED 2
//TODO: Remove entirely in favor of the BODYTYPE system
///Body type bitfields for allowed_animal_origin used to check compatible surgery body types (use NONE for no matching body type)
#define HUMAN_BODY (1 << 0)
#define MONKEY_BODY (1 << 1)
+15
View File
@@ -0,0 +1,15 @@
//HUMAN PATHS
///The dmi for humanoid uniforms
#define DEFAULT_UNIFORM_FILE 'icons/mob/clothing/under/default.dmi'
///The dmi for humanoid shoes
#define DEFAULT_SHOES_FILE 'icons/mob/clothing/feet.dmi'
///The dmi for humanoid oversuits
#define DEFAULT_SUIT_FILE 'icons/mob/clothing/suit.dmi'
//DIGITIGRADE PATHS
///The dmi containing digitigrade uniforms
#define DIGITIGRADE_UNIFORM_FILE 'modular_skyrat/master_files/icons/mob/clothing/uniform_digi.dmi' // SKYRAT EDIT CHANGE
///The dmi containing digitigrade shoes
#define DIGITIGRADE_SHOES_FILE 'modular_skyrat/master_files/icons/mob/clothing/feet_digi.dmi' // SKYRAT EDIT CHANGE
///The dmi containing digitigrade oversuits
#define DIGITIGRADE_SUIT_FILE 'modular_skyrat/master_files/icons/mob/clothing/suit_digi.dmi' // SKYRAT EDIT CHANGE
@@ -0,0 +1,7 @@
/// Creates a mutable appearance glued to the EMISSIVE_PLAN, using the values from a mutable appearance
/proc/emissive_appearance_copy(mutable_appearance/to_use, appearance_flags = (RESET_COLOR|KEEP_APART))
var/mutable_appearance/appearance = mutable_appearance(to_use.icon, to_use.icon_state, to_use.layer, EMISSIVE_PLANE, to_use.alpha, to_use.appearance_flags | appearance_flags)
appearance.color = GLOB.emissive_color
appearance.pixel_x = to_use.pixel_x
appearance.pixel_y = to_use.pixel_y
return appearance
@@ -1,9 +1,6 @@
//flags for outfits that have mutant variants: Most of these require additional sprites to work.
#define STYLE_DIGITIGRADE (1<<0) //jumpsuits, suits and shoes
#define STYLE_MUZZLE (1<<1) //hats or masks
#define STYLE_TAUR_SNAKE (1<<2) //taur-friendly suits
#define STYLE_TAUR_PAW (1<<3)
#define STYLE_TAUR_HOOF (1<<4)
#define STYLE_TAUR_ALL (STYLE_TAUR_SNAKE|STYLE_TAUR_PAW|STYLE_TAUR_HOOF)
#define STYLE_VOX (1<<5) //For glasses, masks and head pieces for the Vox race
#define STYLE_TESHARI (1<<6) //teshari clothes and shit
@@ -2,4 +2,4 @@
#define RESKIN_ICON_STATE "reskin_icon_state"
#define RESKIN_WORN_ICON "reskin_worn_icon"
#define RESKIN_WORN_ICON_STATE "reskin_worn_icon_state"
#define RESKIN_MUTANT_VARIANTS "reskin_mutant_variants"
#define RESKIN_supports_variations_flags "reskin_supports_variations_flags"
@@ -0,0 +1,8 @@
///The dmi containing snouted masks
#define SNOUTED_MASK_FILE 'modular_skyrat/master_files/icons/mob/clothing/mask_muzzled.dmi'
///The dmi containing snouted hats
#define SNOUTED_HEAD_FILE 'modular_skyrat/master_files/icons/mob/clothing/head_muzzled.dmi'
// Vox stuff
///The dmi containing vox glasses
#define VOX_GLASSES_FILE 'modular_skyrat/master_files/icons/mob/clothing/species/vox/eyes.dmi'
+1
View File
@@ -0,0 +1 @@
#define IS_ORGANIC_LIMB(limb) (limb.bodytype & BODYTYPE_ORGANIC)
+23
View File
@@ -1276,3 +1276,26 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects)
animate(src, pixel_x = pixel_x + shiftx, pixel_y = pixel_y + shifty, time = 0.2, loop = duration)
pixel_x = initialpixelx
pixel_y = initialpixely
///Checks if the given iconstate exists in the given file, caching the result. Setting scream to TRUE will print a stack trace ONCE.
/proc/icon_exists(file, state, scream)
var/static/list/icon_states_cache = list()
if(icon_states_cache[file]?[state])
return TRUE
if(icon_states_cache[file]?[state] == FALSE)
return FALSE
var/list/states = icon_states(file)
if(!icon_states_cache[file])
icon_states_cache[file] = list()
if(state in states)
icon_states_cache[file][state] = TRUE
return TRUE
else
icon_states_cache[file][state] = FALSE
if(scream)
stack_trace("Icon Lookup for state: [state] in file [file] failed.")
return FALSE
-8
View File
@@ -10,11 +10,3 @@
appearance.color = GLOB.em_block_color
return appearance
//SKYRAT EDIT ADDITION
/// Creates a mutable appearance glued to the EMISSIVE_PLAN, using the values from a mutable appearance
/proc/emissive_appearance_copy(mutable_appearance/to_use, appearance_flags = (RESET_COLOR|KEEP_APART))
var/mutable_appearance/appearance = mutable_appearance(to_use.icon, to_use.icon_state, to_use.layer, EMISSIVE_PLANE, to_use.alpha, to_use.appearance_flags | appearance_flags)
appearance.color = GLOB.emissive_color
appearance.pixel_x = to_use.pixel_x
appearance.pixel_y = to_use.pixel_y
return appearance
+4 -4
View File
@@ -153,7 +153,7 @@ GLOBAL_LIST_INIT(modulo_angle_to_dir, list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH,
return .
/// For finding out what body parts a body zone covers, the inverse of the below basically
/proc/zone2body_parts_covered(def_zone)
/proc/body_zone2cover_flags(def_zone)
switch(def_zone)
if(BODY_ZONE_CHEST)
return list(CHEST, GROIN)
@@ -169,14 +169,14 @@ GLOBAL_LIST_INIT(modulo_angle_to_dir, list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH,
return list(LEG_RIGHT, FOOT_RIGHT)
//Turns a Body_parts_covered bitfield into a list of organ/limb names.
//(I challenge you to find a use for this) -I found a use for it!!
/proc/body_parts_covered2organ_names(bpc)
//(I challenge you to find a use for this) -I found a use for it!! | So did I!.
/proc/cover_flags2body_zones(bpc)
var/list/covered_parts = list()
if(!bpc)
return 0
if(bpc & FULL_BODY)
if(bpc == FULL_BODY)
covered_parts |= list(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM,BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_L_LEG,BODY_ZONE_R_LEG)
else
+1
View File
@@ -6,6 +6,7 @@
var/typename = "[type]"
var/static/list/TYPES_SHORTCUTS = list(
/obj/effect/decal/cleanable = "CLEANABLE",
/obj/item/bodypart = "BODYPART",
/obj/item/radio/headset = "HEADSET",
/obj/item/clothing/head/helmet/space = "SPESSHELMET",
/obj/item/book/manual = "MANUAL",
+15
View File
@@ -355,3 +355,18 @@ DEFINE_BITFIELD(reaction_flags, list(
"REACTION_PH_VOL_CONSTANT" = REACTION_PH_VOL_CONSTANT,
"REACTION_REAL_TIME_SPLIT" = REACTION_REAL_TIME_SPLIT,
))
DEFINE_BITFIELD(bodytype, list(
"BODYTYPE_DIGITIGRADE" = BODYTYPE_DIGITIGRADE,
"BODYTYPE_HUMANOID" = BODYTYPE_HUMANOID,
"BODYTYPE_MONKEY" = BODYTYPE_MONKEY,
"BODYTYPE_ORGANIC" = BODYTYPE_ORGANIC,
"BODYTYPE_ROBOTIC" = BODYTYPE_ROBOTIC,
"BODYTYPE_SNOUTED" = BODYTYPE_SNOUTED,
))
DEFINE_BITFIELD(supports_variations_flags, list(
"CLOTHING_NO_VARIATION" = CLOTHING_NO_VARIATION,
"CLOTHING_DIGITIGRADE_VARIATION" = CLOTHING_DIGITIGRADE_VARIATION,
"CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON" = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON,
))
-1
View File
@@ -493,7 +493,6 @@ GLOBAL_LIST_INIT(phobia_species, list(
"conspiracies" = typecacheof(list(
/datum/species/abductor,
/datum/species/lizard,
/datum/species/synth,
)),
"insects" = typecacheof(list(
/datum/species/fly,
+2 -2
View File
@@ -52,7 +52,7 @@
freak_out(O)
return
for(var/mob/living/carbon/human/HU in seen_atoms) //check equipment for trigger items
for(var/X in HU.get_all_slots() | HU.held_items)
for(var/X in HU.get_all_worn_items() | HU.held_items)
var/obj/I = X
if(!QDELETED(I) && (is_type_in_typecache(I, trigger_objs) || (phobia_type == "blood" && HAS_BLOOD_DNA(I))))
freak_out(I)
@@ -213,7 +213,7 @@
/datum/brain_trauma/mild/phobia/guns
phobia_type = "guns"
random_gain = FALSE
/datum/brain_trauma/mild/phobia/blood
phobia_type = "blood"
random_gain = FALSE
+1 -11
View File
@@ -241,7 +241,6 @@
/datum/component/bloodysoles/feet/update_icon()
if(ishuman(wielder))
var/mob/living/carbon/human/human = wielder
fix_soles() //SKYRAT ADDITION - DIGI_BLOODSOLE
if(NOBLOODOVERLAY in human.dna.species.species_traits)
return
if(bloody_shoes[BLOOD_STATE_HUMAN] > 0 && !is_obscured())
@@ -261,7 +260,7 @@
var/obj/item/bodypart/affecting = X
if(affecting.body_part == LEG_RIGHT || affecting.body_part == LEG_LEFT)
if(!affecting.bodypart_disabled)
FP.species_types |= affecting.species_id
FP.species_types |= affecting.limb_id
break
@@ -282,15 +281,6 @@
..()
//SKYRAT EDIT ADDITION BEGIN - DIGI_BLOODSOLE
/datum/component/bloodysoles/feet/proc/fix_soles()
var/mob/living/carbon/H = parent
if (DIGITIGRADE in H.dna.species.species_traits)
if (bloody_feet.icon_state != "shoeblood_digi")
bloody_feet = mutable_appearance('modular_skyrat/modules/digi_bloodsole/icons/blood.dmi', "shoeblood_digi", SHOES_LAYER)
else if (bloody_feet.icon_state != "shoeblood")
bloody_feet = mutable_appearance('icons/effects/blood.dmi', "shoeblood", SHOES_LAYER)
//SKYRAT EDIT ADDITION END
/datum/component/bloodysoles/feet/proc/unequip_shoecover(datum/source)
SIGNAL_HANDLER
+1 -1
View File
@@ -89,7 +89,7 @@
if(!istype(O))
return
if(O.status == BODYPART_ROBOTIC)
if(!IS_ORGANIC_LIMB(O))
return
if (!(flags & CALTROP_BYPASS_SHOES))
+2 -2
View File
@@ -25,9 +25,9 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list(
if(ishuman(parent))
var/mob/living/carbon/human/H = parent
if(H.dna.species.limbs_id == SPECIES_LIZARD)
if(H.dna.species.bodytype & BODYTYPE_SNOUTED)
creamface.icon_state = "creampie_lizard"
else if(H.dna.species.limbs_id == SPECIES_MONKEY)
else if(H.dna.species.bodytype & BODYTYPE_MONKEY)
creamface.icon_state = "creampie_monkey"
else
creamface.icon_state = "creampie_human"
+3 -3
View File
@@ -89,7 +89,7 @@
if(affecting)
if(!surgery.requires_bodypart)
continue
if(surgery.requires_bodypart_type && affecting.status != surgery.requires_bodypart_type)
if(surgery.requires_bodypart_type && !(affecting.bodytype & surgery.requires_bodypart_type))
continue
if(surgery.requires_real_bodypart && affecting.is_pseudopart)
continue
@@ -128,7 +128,7 @@
var/required_tool_type = TOOL_CAUTERY
var/obj/item/close_tool = user.get_inactive_held_item()
var/is_robotic = the_surgery.requires_bodypart_type == BODYPART_ROBOTIC
var/is_robotic = the_surgery.requires_bodypart_type == BODYTYPE_ROBOTIC
if(is_robotic)
required_tool_type = TOOL_SCREWDRIVER
@@ -300,7 +300,7 @@
return
if (!isnull(affecting_limb) && surgery.requires_bodypart_type && affecting_limb.status != surgery.requires_bodypart_type)
if (!isnull(affecting_limb) && surgery.requires_bodypart_type && !(affecting_limb.bodytype & surgery.requires_bodypart_type))
target.balloon_alert(user, "not the right type of limb!")
return
+1 -1
View File
@@ -24,7 +24,7 @@
return
COOLDOWN_START(src, surge_cooldown, 1 MINUTES)
surged.balloon_alert(surged, "you refuse to give up!")//breaks balloon alert conventions by using a "!" for a fail message but that's okay because it's a pretty awesome moment
surged.heal_overall_damage(15, 15, 0, BODYPART_ORGANIC)
surged.heal_overall_damage(15, 15, 0, BODYTYPE_ORGANIC)
if(surged.reagents.get_reagent_amount(/datum/reagent/medicine/ephedrine) < 20)
surged.reagents.add_reagent(/datum/reagent/medicine/ephedrine, 10)
if(surged.reagents.get_reagent_amount(/datum/reagent/medicine/epinephrine) < 20)
@@ -71,14 +71,14 @@ Bonus
/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A)
M.adjust_fire_stacks(1 * power)
M.take_overall_damage(burn = 3 * power, required_status = BODYPART_ORGANIC)
M.take_overall_damage(burn = 3 * power, required_status = BODYTYPE_ORGANIC)
if(infective)
A.spread(2)
return 1
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
M.adjust_fire_stacks(3 * power)
M.take_overall_damage(burn = 5 * power, required_status = BODYPART_ORGANIC)
M.take_overall_damage(burn = 5 * power, required_status = BODYTYPE_ORGANIC)
if(infective)
A.spread(4)
return 1
@@ -164,7 +164,7 @@ Bonus
/datum/symptom/alkali/proc/Alkali_fire_stage_4(mob/living/M, datum/disease/advance/A)
var/get_stacks = 6 * power
M.adjust_fire_stacks(get_stacks)
M.take_overall_damage(burn = get_stacks / 2, required_status = BODYPART_ORGANIC)
M.take_overall_damage(burn = get_stacks / 2, required_status = BODYTYPE_ORGANIC)
if(chems)
M.reagents.add_reagent(/datum/reagent/clf3, 2 * power)
return 1
@@ -172,7 +172,7 @@ Bonus
/datum/symptom/alkali/proc/Alkali_fire_stage_5(mob/living/M, datum/disease/advance/A)
var/get_stacks = 8 * power
M.adjust_fire_stacks(get_stacks)
M.take_overall_damage(burn = get_stacks, required_status = BODYPART_ORGANIC)
M.take_overall_damage(burn = get_stacks, required_status = BODYTYPE_ORGANIC)
if(chems)
M.reagents.add_reagent_list(list(/datum/reagent/napalm = 4 * power, /datum/reagent/clf3 = 4 * power))
return 1
@@ -59,7 +59,7 @@ Bonus
/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
var/get_damage = rand(15,25) * power
M.take_overall_damage(brute = get_damage, required_status = BODYPART_ORGANIC)
M.take_overall_damage(brute = get_damage, required_status = BODYTYPE_ORGANIC)
if(pain)
M.adjustStaminaLoss(get_damage * 2)
if(bleed)
@@ -131,7 +131,7 @@ Bonus
/datum/symptom/flesh_death/proc/Flesh_death(mob/living/M, datum/disease/advance/A)
var/get_damage = rand(6,10)
M.take_overall_damage(brute = get_damage, required_status = BODYPART_ORGANIC)
M.take_overall_damage(brute = get_damage, required_status = BODYTYPE_ORGANIC)
if(chems)
M.reagents.add_reagent_list(list(/datum/reagent/toxin/heparin = 2, /datum/reagent/toxin/lipolicide = 2))
if(zombie)
+11 -11
View File
@@ -160,13 +160,13 @@
M.adjustToxLoss(-(4 * heal_amt)) //most effective on toxins
var/list/parts = M.get_damaged_bodyparts(1,1, null, BODYPART_ORGANIC)
var/list/parts = M.get_damaged_bodyparts(1,1, null, BODYTYPE_ORGANIC)
if(!parts.len)
return
for(var/obj/item/bodypart/L in parts)
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, null, BODYPART_ORGANIC))
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, null, BODYTYPE_ORGANIC))
M.update_damage_overlays()
return 1
@@ -278,7 +278,7 @@
/datum/symptom/heal/darkness/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
var/heal_amt = 2 * actual_power
var/list/parts = M.get_damaged_bodyparts(1,1, null, BODYPART_ORGANIC)
var/list/parts = M.get_damaged_bodyparts(1,1, null, BODYTYPE_ORGANIC)
if(!parts.len)
return
@@ -287,7 +287,7 @@
to_chat(M, span_notice("The darkness soothes and mends your wounds."))
for(var/obj/item/bodypart/L in parts)
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5, null, BODYPART_ORGANIC)) //more effective on brute
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5, null, BODYTYPE_ORGANIC)) //more effective on brute
M.update_damage_overlays()
return 1
@@ -381,7 +381,7 @@
return
for(var/obj/item/bodypart/L in parts)
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, null, BODYPART_ORGANIC))
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, null, BODYTYPE_ORGANIC))
M.update_damage_overlays()
if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0)
@@ -434,7 +434,7 @@
/datum/symptom/heal/water/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
var/heal_amt = 2 * actual_power
var/list/parts = M.get_damaged_bodyparts(1,1, null, BODYPART_ORGANIC) //more effective on burns
var/list/parts = M.get_damaged_bodyparts(1,1, null, BODYTYPE_ORGANIC) //more effective on burns
if(!parts.len)
return
@@ -443,7 +443,7 @@
to_chat(M, span_notice("You feel yourself absorbing the water around you to soothe your damaged skin."))
for(var/obj/item/bodypart/L in parts)
if(L.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len, null, BODYPART_ORGANIC))
if(L.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len, null, BODYTYPE_ORGANIC))
M.update_damage_overlays()
return 1
@@ -514,13 +514,13 @@
M.adjustToxLoss(-heal_amt)
var/list/parts = M.get_damaged_bodyparts(1,1, null, BODYPART_ORGANIC)
var/list/parts = M.get_damaged_bodyparts(1,1, null, BODYTYPE_ORGANIC)
if(!parts.len)
return
if(prob(5))
to_chat(M, span_notice("The pain from your wounds fades rapidly."))
for(var/obj/item/bodypart/L in parts)
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, null, BODYPART_ORGANIC))
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, null, BODYTYPE_ORGANIC))
M.update_damage_overlays()
return 1
@@ -564,7 +564,7 @@
M.adjustToxLoss(-(2 * heal_amt))
var/list/parts = M.get_damaged_bodyparts(1,1, null, BODYPART_ORGANIC)
var/list/parts = M.get_damaged_bodyparts(1,1, null, BODYTYPE_ORGANIC)
if(!parts.len)
return
@@ -573,6 +573,6 @@
to_chat(M, span_notice("Your skin glows faintly, and you feel your wounds mending themselves."))
for(var/obj/item/bodypart/L in parts)
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, null, BODYPART_ORGANIC))
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, null, BODYTYPE_ORGANIC))
M.update_damage_overlays()
return 1
@@ -51,7 +51,7 @@ BONUS
var/mob/living/carbon/M = A.affected_mob
var/picked_bodypart = pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)
var/obj/item/bodypart/bodypart = M.get_bodypart(picked_bodypart)
if(bodypart && bodypart.status == BODYPART_ORGANIC && !bodypart.is_pseudopart) //robotic limbs will mean less scratching overall (why are golems able to damage themselves with self-scratching, but not androids? the world may never know)
if(bodypart && IS_ORGANIC_LIMB(bodypart) && !bodypart.is_pseudopart) //robotic limbs will mean less scratching overall (why are golems able to damage themselves with self-scratching, but not androids? the world may never know)
var/can_scratch = scratch && !M.incapacitated()
M.visible_message("[can_scratch ? span_warning("[M] scratches [M.p_their()] [bodypart.name].") : ""]", span_warning("Your [bodypart.name] itches. [can_scratch ? " You scratch it." : ""]"))
if(can_scratch)
+4 -8
View File
@@ -539,9 +539,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
/mob/living/carbon/human/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE)
..()
if(icon_update)
update_body()
update_hair()
update_body_parts()
update_body(is_creating = TRUE)
update_mutations_overlay()// no lizard with human hulk overlay please.
*/
@@ -583,9 +581,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
domutcheck()
if(mrace || newfeatures || ui)
update_body()
update_hair()
update_body_parts()
update_body(is_creating = TRUE)
update_mutations_overlay()
if(LAZYLEN(mutations))
@@ -665,9 +661,9 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
if(icon_update)
dna.species.handle_body(src) // We want 'update_body_parts()' to be called only if mutcolor_update is TRUE, so no 'update_body()' here.
update_hair()
update_hair(is_creating = TRUE)
if(mutcolor_update)
update_body_parts()
update_body_parts(update_limb_data = TRUE)
if(mutations_overlay_update)
update_mutations_overlay()
*/
+25
View File
@@ -0,0 +1,25 @@
/**
* ## soft landing element!
*
* Non bespoke element (1 in existence) that makes objs provide a soft landing when you fall on them!
*/
/datum/element/soft_landing
element_flags = ELEMENT_DETACH
/datum/element/soft_landing/Attach(datum/target)
. = ..()
if(!isatom(target))
return ELEMENT_INCOMPATIBLE
RegisterSignal(target, COMSIG_ATOM_INTERCEPT_Z_FALL, .proc/intercept_z_fall)
/datum/element/soft_landing/Detach(datum/target)
. = ..()
UnregisterSignal(target, COMSIG_ATOM_INTERCEPT_Z_FALL)
///signal called by the stat of the target changing
/datum/element/soft_landing/proc/intercept_z_fall(obj/soft_object, falling_movables, levels)
SIGNAL_HANDLER
for (var/mob/living/falling_victim in falling_movables)
to_chat(falling_victim, span_notice("[soft_object] provides a soft landing for you!"))
return FALL_INTERCEPTED | FALL_NO_MESSAGE
+1 -1
View File
@@ -518,7 +518,7 @@
if(brain) //so this doesn't instantly kill you. we could delete the brain, but it lets people cure brain issues they /really/ shouldn't be
brain.zone = BODY_ZONE_HEAD
UnregisterSignal(owner, COMSIG_CARBON_ATTACH_LIMB)
var/successful = owner.regenerate_limb(BODY_ZONE_HEAD, noheal = TRUE) //noheal needs to be TRUE to prevent weird adding and removing mutation healing
var/successful = owner.regenerate_limb(BODY_ZONE_HEAD)
if(!successful)
stack_trace("HARS mutation head regeneration failed! (usually caused by headless syndrome having a head)")
return TRUE
+1 -1
View File
@@ -110,7 +110,7 @@
* * attack_direction: For bloodsplatters, if relevant
*/
/datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE, attack_direction = null)
if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || !L.is_organic_limb() || HAS_TRAIT(L.owner, TRAIT_NEVER_WOUNDED))
if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || !IS_ORGANIC_LIMB(L) || HAS_TRAIT(L.owner, TRAIT_NEVER_WOUNDED))
qdel(src)
return
+40 -40
View File
@@ -50,7 +50,7 @@
I = victim.get_inactive_held_item()
if(I && victim.dropItemToGround(I))
victim.visible_message(span_danger("[victim] drops [I] in shock!"), span_warning("<b>The force on your [limb.name] causes you to drop [I]!</b>"), vision_distance=COMBAT_MESSAGE_RANGE)
victim.visible_message(span_danger("[victim] drops [I] in shock!"), span_warning("<b>The force on your [parse_zone(limb.body_zone)] causes you to drop [I]!</b>"), vision_distance=COMBAT_MESSAGE_RANGE)
update_inefficiencies()
@@ -93,7 +93,7 @@
if(!victim || !limb)
qdel(src)
return
to_chat(victim, span_green("Your [limb.name] has recovered from its [name]!"))
to_chat(victim, span_green("Your [parse_zone(limb.body_zone)] has recovered from its [name]!"))
remove_wound()
/// If we're a human who's punching something with a broken arm, we might hurt ourselves doing so
@@ -107,11 +107,11 @@
if(prob((severity - 1) * 15))
// And you have a 70% or 50% chance to actually land the blow, respectively
if(prob(70 - 20 * (severity - 1)))
to_chat(victim, span_userdanger("The fracture in your [limb.name] shoots with pain as you strike [target]!"))
to_chat(victim, span_userdanger("The fracture in your [parse_zone(limb.body_zone)] shoots with pain as you strike [target]!"))
limb.receive_damage(brute=rand(1,5))
else
victim.visible_message(span_danger("[victim] weakly strikes [target] with [victim.p_their()] broken [limb.name], recoiling from pain!"), \
span_userdanger("You fail to strike [target] as the fracture in your [limb.name] lights up in unbearable pain!"), vision_distance=COMBAT_MESSAGE_RANGE)
victim.visible_message(span_danger("[victim] weakly strikes [target] with [victim.p_their()] broken [parse_zone(limb.body_zone)], recoiling from pain!"), \
span_userdanger("You fail to strike [target] as the fracture in your [parse_zone(limb.body_zone)] lights up in unbearable pain!"), vision_distance=COMBAT_MESSAGE_RANGE)
INVOKE_ASYNC(victim, /mob.proc/emote, "scream")
victim.Stun(0.5 SECONDS)
limb.receive_damage(brute=rand(3,7))
@@ -151,7 +151,7 @@
var/list/msg = list()
if(!limb.current_gauze)
msg += "[victim.p_their(TRUE)] [limb.name] [examine_desc]"
msg += "[victim.p_their(TRUE)] [parse_zone(limb.body_zone)] [examine_desc]"
else
var/sling_condition = ""
// how much life we have left in these bandages
@@ -165,7 +165,7 @@
if(4 to INFINITY)
sling_condition = "tightly"
msg += "[victim.p_their(TRUE)] [limb.name] is [sling_condition] fastened in a sling of [limb.current_gauze.name]"
msg += "[victim.p_their(TRUE)] [parse_zone(limb.body_zone)] is [sling_condition] fastened in a sling of [limb.current_gauze.name]"
if(taped)
msg += ", [span_notice("and appears to be reforming itself under some surgical tape!")]"
@@ -233,7 +233,7 @@
/datum/wound/blunt/moderate/proc/door_crush()
SIGNAL_HANDLER
if(prob(40))
victim.visible_message(span_danger("[victim]'s dislocated [limb.name] pops back into place!"), span_userdanger("Your dislocated [limb.name] pops back into place! Ow!"))
victim.visible_message(span_danger("[victim]'s dislocated [parse_zone(limb.body_zone)] pops back into place!"), span_userdanger("Your dislocated [parse_zone(limb.body_zone)] pops back into place! Ow!"))
remove_wound()
/datum/wound/blunt/moderate/try_handling(mob/living/carbon/human/user)
@@ -245,8 +245,8 @@
return TRUE
if(user.grab_state >= GRAB_AGGRESSIVE)
user.visible_message(span_danger("[user] begins twisting and straining [victim]'s dislocated [limb.name]!"), span_notice("You begin twisting and straining [victim]'s dislocated [limb.name]..."), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] begins twisting and straining your dislocated [limb.name]!"))
user.visible_message(span_danger("[user] begins twisting and straining [victim]'s dislocated [parse_zone(limb.body_zone)]!"), span_notice("You begin twisting and straining [victim]'s dislocated [parse_zone(limb.body_zone)]..."), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] begins twisting and straining your dislocated [parse_zone(limb.body_zone)]!"))
if(!user.combat_mode)
chiropractice(user)
else
@@ -261,14 +261,14 @@
return
if(prob(65))
user.visible_message(span_danger("[user] snaps [victim]'s dislocated [limb.name] back into place!"), span_notice("You snap [victim]'s dislocated [limb.name] back into place!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] snaps your dislocated [limb.name] back into place!"))
user.visible_message(span_danger("[user] snaps [victim]'s dislocated [parse_zone(limb.body_zone)] back into place!"), span_notice("You snap [victim]'s dislocated [parse_zone(limb.body_zone)] back into place!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] snaps your dislocated [parse_zone(limb.body_zone)] back into place!"))
victim.emote("scream")
limb.receive_damage(brute=20, wound_bonus=CANT_WOUND)
qdel(src)
else
user.visible_message(span_danger("[user] wrenches [victim]'s dislocated [limb.name] around painfully!"), span_danger("You wrench [victim]'s dislocated [limb.name] around painfully!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] wrenches your dislocated [limb.name] around painfully!"))
user.visible_message(span_danger("[user] wrenches [victim]'s dislocated [parse_zone(limb.body_zone)] around painfully!"), span_danger("You wrench [victim]'s dislocated [parse_zone(limb.body_zone)] around painfully!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] wrenches your dislocated [parse_zone(limb.body_zone)] around painfully!"))
limb.receive_damage(brute=10, wound_bonus=CANT_WOUND)
chiropractice(user)
@@ -280,33 +280,33 @@
return
if(prob(65))
user.visible_message(span_danger("[user] snaps [victim]'s dislocated [limb.name] with a sickening crack!"), span_danger("You snap [victim]'s dislocated [limb.name] with a sickening crack!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] snaps your dislocated [limb.name] with a sickening crack!"))
user.visible_message(span_danger("[user] snaps [victim]'s dislocated [parse_zone(limb.body_zone)] with a sickening crack!"), span_danger("You snap [victim]'s dislocated [parse_zone(limb.body_zone)] with a sickening crack!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] snaps your dislocated [parse_zone(limb.body_zone)] with a sickening crack!"))
victim.emote("scream")
limb.receive_damage(brute=25, wound_bonus=30)
else
user.visible_message(span_danger("[user] wrenches [victim]'s dislocated [limb.name] around painfully!"), span_danger("You wrench [victim]'s dislocated [limb.name] around painfully!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] wrenches your dislocated [limb.name] around painfully!"))
user.visible_message(span_danger("[user] wrenches [victim]'s dislocated [parse_zone(limb.body_zone)] around painfully!"), span_danger("You wrench [victim]'s dislocated [parse_zone(limb.body_zone)] around painfully!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] wrenches your dislocated [parse_zone(limb.body_zone)] around painfully!"))
limb.receive_damage(brute=10, wound_bonus=CANT_WOUND)
malpractice(user)
/datum/wound/blunt/moderate/treat(obj/item/I, mob/user)
if(victim == user)
victim.visible_message(span_danger("[user] begins resetting [victim.p_their()] [limb.name] with [I]."), span_warning("You begin resetting your [limb.name] with [I]..."))
victim.visible_message(span_danger("[user] begins resetting [victim.p_their()] [parse_zone(limb.body_zone)] with [I]."), span_warning("You begin resetting your [parse_zone(limb.body_zone)] with [I]..."))
else
user.visible_message(span_danger("[user] begins resetting [victim]'s [limb.name] with [I]."), span_notice("You begin resetting [victim]'s [limb.name] with [I]..."))
user.visible_message(span_danger("[user] begins resetting [victim]'s [parse_zone(limb.body_zone)] with [I]."), span_notice("You begin resetting [victim]'s [parse_zone(limb.body_zone)] with [I]..."))
if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists)))
return
if(victim == user)
limb.receive_damage(brute=15, wound_bonus=CANT_WOUND)
victim.visible_message(span_danger("[user] finishes resetting [victim.p_their()] [limb.name]!"), span_userdanger("You reset your [limb.name]!"))
victim.visible_message(span_danger("[user] finishes resetting [victim.p_their()] [parse_zone(limb.body_zone)]!"), span_userdanger("You reset your [parse_zone(limb.body_zone)]!"))
else
limb.receive_damage(brute=10, wound_bonus=CANT_WOUND)
user.visible_message(span_danger("[user] finishes resetting [victim]'s [limb.name]!"), span_nicegreen("You finish resetting [victim]'s [limb.name]!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] resets your [limb.name]!"))
user.visible_message(span_danger("[user] finishes resetting [victim]'s [parse_zone(limb.body_zone)]!"), span_nicegreen("You finish resetting [victim]'s [parse_zone(limb.body_zone)]!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] resets your [parse_zone(limb.body_zone)]!"))
victim.emote("scream")
qdel(src)
@@ -377,10 +377,10 @@
return
if(gelled)
to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.name] is already coated with bone gel!"))
to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [parse_zone(limb.body_zone)] is already coated with bone gel!"))
return
user.visible_message(span_danger("[user] begins hastily applying [I] to [victim]'s' [limb.name]..."), span_warning("You begin hastily applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name], disregarding the warning label..."))
user.visible_message(span_danger("[user] begins hastily applying [I] to [victim]'s' [parse_zone(limb.body_zone)]..."), span_warning("You begin hastily applying [I] to [user == victim ? "your" : "[victim]'s"] [parse_zone(limb.body_zone)], disregarding the warning label..."))
if(!do_after(user, base_treat_time * 1.5 * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists)))
return
@@ -388,8 +388,8 @@
I.use(1)
victim.emote("scream")
if(user != victim)
user.visible_message(span_notice("[user] finishes applying [I] to [victim]'s [limb.name], emitting a fizzing noise!"), span_notice("You finish applying [I] to [victim]'s [limb.name]!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] finishes applying [I] to your [limb.name], and you can feel the bones exploding with pain as they begin melting and reforming!"))
user.visible_message(span_notice("[user] finishes applying [I] to [victim]'s [parse_zone(limb.body_zone)], emitting a fizzing noise!"), span_notice("You finish applying [I] to [victim]'s [parse_zone(limb.body_zone)]!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] finishes applying [I] to your [parse_zone(limb.body_zone)], and you can feel the bones exploding with pain as they begin melting and reforming!"))
else
var/painkiller_bonus = 0
if(victim.drunkenness > 10)
@@ -404,10 +404,10 @@
painkiller_bonus += 20
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_danger("[victim] fails to finish applying [I] to [victim.p_their()] [limb.name], passing out from the pain!"), span_notice("You pass out from the pain of applying [I] to your [limb.name] before you can finish!"))
victim.visible_message(span_danger("[victim] fails to finish applying [I] to [victim.p_their()] [parse_zone(limb.body_zone)], passing out from the pain!"), span_notice("You pass out from the pain of applying [I] to your [parse_zone(limb.body_zone)] before you can finish!"))
victim.AdjustUnconscious(5 SECONDS)
return
victim.visible_message(span_notice("[victim] finishes applying [I] to [victim.p_their()] [limb.name], grimacing from the pain!"), span_notice("You finish applying [I] to your [limb.name], and your bones explode in pain!"))
victim.visible_message(span_notice("[victim] finishes applying [I] to [victim.p_their()] [parse_zone(limb.body_zone)], grimacing from the pain!"), span_notice("You finish applying [I] to your [parse_zone(limb.body_zone)], and your bones explode in pain!"))
limb.receive_damage(25, stamina=100, wound_bonus=CANT_WOUND)
gelled = TRUE
@@ -418,20 +418,20 @@
return // poser
if(gelled)
to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.name] is already coated with bone gel!"))
to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [parse_zone(limb.body_zone)] is already coated with bone gel!"))
return
user.visible_message(span_danger("[user] begins applying [I] to [victim]'s' [limb.name]..."), span_warning("You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]..."))
user.visible_message(span_danger("[user] begins applying [I] to [victim]'s' [parse_zone(limb.body_zone)]..."), span_warning("You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [parse_zone(limb.body_zone)]..."))
if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists)))
return
I.use(1)
if(user != victim)
user.visible_message(span_notice("[user] finishes applying [I] to [victim]'s [limb.name], emitting a fizzing noise!"), span_notice("You finish applying [I] to [victim]'s [limb.name]!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] finishes applying [I] to your [limb.name], and you feel a funny fizzy tickling as they begin to reform!"))
user.visible_message(span_notice("[user] finishes applying [I] to [victim]'s [parse_zone(limb.body_zone)], emitting a fizzing noise!"), span_notice("You finish applying [I] to [victim]'s [parse_zone(limb.body_zone)]!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] finishes applying [I] to your [parse_zone(limb.body_zone)], and you feel a funny fizzy tickling as they begin to reform!"))
else
victim.visible_message(span_notice("[victim] finishes applying [I] to [victim.p_their()] [limb.name], emitting a funny fizzing sound!"), span_notice("You finish applying [I] to your [limb.name], and feel a funny fizzy tickling as the bone begins to reform!"))
victim.visible_message(span_notice("[victim] finishes applying [I] to [victim.p_their()] [parse_zone(limb.body_zone)], emitting a funny fizzing sound!"), span_notice("You finish applying [I] to your [parse_zone(limb.body_zone)], and feel a funny fizzy tickling as the bone begins to reform!"))
gelled = TRUE
processes = TRUE
@@ -439,13 +439,13 @@
/// if someone is using surgical tape on our wound
/datum/wound/blunt/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user)
if(!gelled)
to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.name] must be coated with bone gel to perform this emergency operation!"))
to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [parse_zone(limb.body_zone)] must be coated with bone gel to perform this emergency operation!"))
return
if(taped)
to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.name] is already wrapped in [I.name] and reforming!"))
to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [parse_zone(limb.body_zone)] is already wrapped in [I.name] and reforming!"))
return
user.visible_message(span_danger("[user] begins applying [I] to [victim]'s' [limb.name]..."), span_warning("You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]..."))
user.visible_message(span_danger("[user] begins applying [I] to [victim]'s' [parse_zone(limb.body_zone)]..."), span_warning("You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [parse_zone(limb.body_zone)]..."))
if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists)))
return
@@ -455,10 +455,10 @@
I.use(1)
if(user != victim)
user.visible_message(span_notice("[user] finishes applying [I] to [victim]'s [limb.name], emitting a fizzing noise!"), span_notice("You finish applying [I] to [victim]'s [limb.name]!"), ignored_mobs=victim)
to_chat(victim, span_green("[user] finishes applying [I] to your [limb.name], you immediately begin to feel your bones start to reform!"))
user.visible_message(span_notice("[user] finishes applying [I] to [victim]'s [parse_zone(limb.body_zone)], emitting a fizzing noise!"), span_notice("You finish applying [I] to [victim]'s [parse_zone(limb.body_zone)]!"), ignored_mobs=victim)
to_chat(victim, span_green("[user] finishes applying [I] to your [parse_zone(limb.body_zone)], you immediately begin to feel your bones start to reform!"))
else
victim.visible_message(span_notice("[victim] finishes applying [I] to [victim.p_their()] [limb.name], !"), span_green("You finish applying [I] to your [limb.name], and you immediately begin to feel your bones start to reform!"))
victim.visible_message(span_notice("[victim] finishes applying [I] to [victim.p_their()] [parse_zone(limb.body_zone)], !"), span_green("You finish applying [I] to your [parse_zone(limb.body_zone)], and you immediately begin to feel your bones start to reform!"))
taped = TRUE
processes = TRUE
+1 -1
View File
@@ -87,7 +87,7 @@
/// Used to "load" a persistent scar
/datum/scar/proc/load(obj/item/bodypart/BP, version, description, specific_location, severity=WOUND_SEVERITY_SEVERE, biology=BIO_FLESH_BONE, char_slot)
if(!BP.is_organic_limb())
if(!IS_ORGANIC_LIMB(BP))
qdel(src)
return
+4
View File
@@ -674,6 +674,9 @@
* Produces a signal [COMSIG_PARENT_EXAMINE_MORE]
*/
/atom/proc/examine_more(mob/user)
SHOULD_CALL_PARENT(TRUE)
RETURN_TYPE(/list)
. = list()
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE_MORE, user, .)
@@ -1787,6 +1790,7 @@
filters = null
/atom/proc/intercept_zImpact(list/falling_movables, levels = 1)
SHOULD_CALL_PARENT(TRUE)
. |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, falling_movables, levels)
/// Sets the custom materials for an item.
@@ -602,14 +602,15 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
return ..() //well boys we did it, lists are no more
/obj/machinery/computer/arcade/battle/examine_more(mob/user)
var/list/msg = list(span_notice("<i>You notice some writing scribbled on the side of [src]...</i>"))
msg += "\t[span_info("smart -> defend, defend, light attack")]"
msg += "\t[span_info("shotgun -> defend, defend, power attack")]"
msg += "\t[span_info("short temper -> counter, counter, counter")]"
msg += "\t[span_info("poisonous -> light attack, light attack, light attack")]"
msg += "\t[span_info("chonker -> power attack, power attack, power attack")]"
msg += "\t[span_info("magical -> defend until outmagiced")]"
return msg
. = ..()
. += span_notice("<i>You notice some writing scribbled on the side of [src]...</i>")
. += "\t[span_info("smart -> defend, defend, light attack")]"
. += "\t[span_info("shotgun -> defend, defend, power attack")]"
. += "\t[span_info("short temper -> counter, counter, counter")]"
. += "\t[span_info("poisonous -> light attack, light attack, light attack")]"
. += "\t[span_info("chonker -> power attack, power attack, power attack")]"
. += "\t[span_info("magical -> defend until outmagiced")]"
return .
/obj/machinery/computer/arcade/battle/emag_act(mob/user)
if(obj_flags & EMAGGED)
+19 -21
View File
@@ -194,10 +194,10 @@
reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id])
var/built_typepath = being_built.build_path
// If we have a bodypart, we need to initialize the limb on its own. Otherwise we can build it here.
if(ispath(built_typepath, /obj/item/bodypart))
build_limb(built_typepath)
build_limb(create_buildpath())
else
//Just build whatever it is
new built_typepath(loc)
busy = FALSE
@@ -214,26 +214,24 @@
*/
/obj/machinery/limbgrower/proc/build_limb(buildpath)
/// The limb we're making with our buildpath, so we can edit it.
var/obj/item/bodypart/limb = new buildpath(loc)
/// Species with greyscale limbs.
var/list/greyscale_species = list(SPECIES_HUMAN, SPECIES_LIZARD, SPECIES_ETHEREAL)
if(selected_category in greyscale_species) //Species with greyscale parts should be included here
if(selected_category == SPECIES_HUMAN) //humans don't use the full colour spectrum, they use random_skin_tone
limb.skin_tone = random_skin_tone()
else
limb.species_color = "#[random_color()]"
limb.icon = 'icons/mob/human_parts_greyscale.dmi'
limb.should_draw_greyscale = TRUE
else
limb.icon = 'icons/mob/human_parts.dmi'
// Set this limb up using the species name and body zone
limb.icon_state = "[selected_category]_[limb.body_zone]"
limb.name = "\improper biosynthetic [selected_category] [parse_zone(limb.body_zone)]"
limb.desc = "A synthetically produced [selected_category] limb, grown in a tube. This one is for the [parse_zone(limb.body_zone)]."
limb.species_id = selected_category
//i need to create a body part manually using a set icon (otherwise it doesnt appear)
var/obj/item/bodypart/limb
limb = new buildpath(loc)
limb.name = "\improper synthetic [selected_category] [parse_zone(limb.body_zone)]"
limb.limb_id = selected_category
limb.mutation_color = "#62A262"
limb.update_icon_dropped()
limb.original_owner = WEAKREF(src) //prevents updating the icon, so a lizard arm on a human stays a lizard arm etc.
///Returns a valid limb typepath based on the selected option
/obj/machinery/limbgrower/proc/create_buildpath()
var/part_type = being_built.id //their ids match bodypart typepaths
var/species = selected_category
var/path
if(species == SPECIES_HUMAN) //Humans use the parent type.
path = "/obj/item/bodypart/[part_type]"
else
path = "/obj/item/bodypart/[part_type]/[species]"
return text2path(path)
/obj/machinery/limbgrower/RefreshParts()
reagents.maximum_volume = 0
+16 -14
View File
@@ -468,11 +468,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/random, 32)
icon_state = "gas_power"
/obj/structure/sign/poster/contraband/donk_co/examine_more(mob/user)
var/list/msg = list(span_notice("<i>You browse some of the poster's information...</i>"))
msg += "\t[span_info("DONK CO. BRAND DONK POCKETS: IRRESISTABLY DONK!")]"
msg += "\t[span_info("AVAILABLE IN OVER 200 DONKTASTIC FLAVOURS: TRY CLASSIC MEAT, HOT AND SPICY, NEW YORK PEPPERONI PIZZA, BREAKFAST SAUSAGE AND EGG, PHILADELPHIA CHEESESTEAK, HAMBURGER DONK-A-RONI, CHEESE-O-RAMA, AND MANY MORE!")]"
msg += "\t[span_info("AVAILABLE FROM ALL GOOD RETAILERS, AND MANY BAD ONES TOO!")]"
return msg
. = ..()
. += span_notice("<i>You browse some of the poster's information...</i>")
. += "\t[span_info("DONK CO. BRAND DONK POCKETS: IRRESISTABLY DONK!")]"
. += "\t[span_info("AVAILABLE IN OVER 200 DONKTASTIC FLAVOURS: TRY CLASSIC MEAT, HOT AND SPICY, NEW YORK PEPPERONI PIZZA, BREAKFAST SAUSAGE AND EGG, PHILADELPHIA CHEESESTEAK, HAMBURGER DONK-A-RONI, CHEESE-O-RAMA, AND MANY MORE!")]"
. += "\t[span_info("AVAILABLE FROM ALL GOOD RETAILERS, AND MANY BAD ONES TOO!")]"
return .
/obj/structure/sign/poster/contraband/cybersun_six_hundred
name = "Saibāsan: 600 Years Commemorative Poster"
@@ -734,15 +735,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/random, 32)
icon_state = "plasma_effects"
/obj/structure/sign/poster/official/plasma_effects/examine_more(mob/user)
var/list/msg = list(span_notice("<i>You browse some of the poster's information...</i>"))
msg += "\t[span_info("Plasma (scientific name Amenthium) is classified by TerraGov as a Grade 1 Health Hazard, and has significant risks to health associated with chronic exposure.")]"
msg += "\t[span_info("Plasma is known to cross the blood/brain barrier and bioaccumulate in brain tissue, where it begins to result in degradation of brain function. The mechanism for attack is not yet fully known, and as such no concrete preventative advice is available barring proper use of PPE (gloves + protective jumpsuit + respirator).")]"
msg += "\t[span_info("In small doses, plasma induces confusion, short-term amnesia, and heightened aggression. These effects persist with continual exposure.")]"
msg += "\t[span_info("In individuals with chronic exposure, severe effects have been noted. Further heightened aggression, long-term amnesia, Alzheimer's symptoms, schizophrenia, macular degeneration, aneurysms, heightened risk of stroke, and Parkinsons symptoms have all been noted.")]"
msg += "\t[span_info("It is recommended that all individuals in unprotected contact with raw plasma regularly check with company health officials.")]"
msg += "\t[span_info("For more information, please check with TerraGov's extranet site on Amenthium: www.terra.gov/health_and_safety/amenthium/, or our internal risk-assessment documents (document numbers #47582-b (Plasma safety data sheets) and #64210 through #64225 (PPE regulations for working with Plasma), available via NanoDoc to all employees).")]"
msg += "\t[span_info("Nanotrasen: Always looking after your health.")]"
return msg
. = ..()
. += span_notice("<i>You browse some of the poster's information...</i>")
. += "\t[span_info("Plasma (scientific name Amenthium) is classified by TerraGov as a Grade 1 Health Hazard, and has significant risks to health associated with chronic exposure.")]"
. += "\t[span_info("Plasma is known to cross the blood/brain barrier and bioaccumulate in brain tissue, where it begins to result in degradation of brain function. The mechanism for attack is not yet fully known, and as such no concrete preventative advice is available barring proper use of PPE (gloves + protective jumpsuit + respirator).")]"
. += "\t[span_info("In small doses, plasma induces confusion, short-term amnesia, and heightened aggression. These effects persist with continual exposure.")]"
. += "\t[span_info("In individuals with chronic exposure, severe effects have been noted. Further heightened aggression, long-term amnesia, Alzheimer's symptoms, schizophrenia, macular degeneration, aneurysms, heightened risk of stroke, and Parkinsons symptoms have all been noted.")]"
. += "\t[span_info("It is recommended that all individuals in unprotected contact with raw plasma regularly check with company health officials.")]"
. += "\t[span_info("For more information, please check with TerraGov's extranet site on Amenthium: www.terra.gov/health_and_safety/amenthium/, or our internal risk-assessment documents (document numbers #47582-b (Plasma safety data sheets) and #64210 through #64225 (PPE regulations for working with Plasma), available via NanoDoc to all employees).")]"
. += "\t[span_info("Nanotrasen: Always looking after your health.")]"
return .
/obj/structure/sign/poster/official/terragov
name = "TerraGov: United for Humanity"
+4 -2
View File
@@ -149,6 +149,8 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e
var/list/attack_verb_simple
///list() of species types, if a species cannot put items in a certain slot, but species type is in list, it will be able to wear that item
var/list/species_exception = null
///This is a bitfield that defines what variations exist for bodyparts like Digi legs. See: code\_DEFINES\inventory.dm
var/supports_variations_flags = NONE
///A weakref to the mob who threw the item
var/datum/weakref/thrownby = null //I cannot verbally describe how much I hate this var
@@ -1353,8 +1355,8 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e
worn_icon = unique_reskin[pick][RESKIN_WORN_ICON]
if(unique_reskin[pick][RESKIN_WORN_ICON_STATE])
worn_icon_state = unique_reskin[pick][RESKIN_WORN_ICON_STATE]
if(unique_reskin[pick][RESKIN_MUTANT_VARIANTS])
mutant_variants = unique_reskin[pick][RESKIN_MUTANT_VARIANTS]
if(unique_reskin[pick][RESKIN_supports_variations_flags])
supports_variations_flags = unique_reskin[pick][RESKIN_supports_variations_flags]
if(ishuman(M))
var/mob/living/carbon/human/wearer = M
wearer.regenerate_icons() // update that mf
+15 -14
View File
@@ -691,31 +691,32 @@
. += span_notice("<i>There's more information below, you can look again to take a closer look...</i>")
/obj/item/card/id/examine_more(mob/user)
var/list/msg = list(span_notice("<i>You examine [src] closer, and note the following...</i>"))
. = ..()
. += span_notice("<i>You examine [src] closer, and note the following...</i>")
if(registered_age)
msg += "The card indicates that the holder is [registered_age] years old. [(registered_age < AGE_MINOR) ? "There's a holographic stripe that reads <b>[span_danger("'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO'")]</b> along the bottom of the card." : ""]"
. += "The card indicates that the holder is [registered_age] years old. [(registered_age < AGE_MINOR) ? "There's a holographic stripe that reads <b>[span_danger("'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO'")]</b> along the bottom of the card." : ""]"
if(mining_points)
msg += "There's [mining_points] mining equipment redemption point\s loaded onto this card."
. += "There's [mining_points] mining equipment redemption point\s loaded onto this card."
if(registered_account)
msg += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr."
. += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr."
if(registered_account.account_job)
var/datum/bank_account/D = SSeconomy.get_dep_account(registered_account.account_job.paycheck_department)
if(D)
msg += "The [D.account_holder] reports a balance of [D.account_balance] cr."
msg += span_info("Alt-Click the ID to pull money from the linked account in the form of holochips.")
msg += span_info("You can insert credits into the linked account by pressing holochips, cash, or coins against the ID.")
. += "The [D.account_holder] reports a balance of [D.account_balance] cr."
. += span_info("Alt-Click the ID to pull money from the linked account in the form of holochips.")
. += span_info("You can insert credits into the linked account by pressing holochips, cash, or coins against the ID.")
if(registered_account.civilian_bounty)
msg += "<span class='info'><b>There is an active civilian bounty.</b>"
msg += span_info("<i>[registered_account.bounty_text()]</i>")
msg += span_info("Quantity: [registered_account.bounty_num()]")
msg += span_info("Reward: [registered_account.bounty_value()]")
. += "<span class='info'><b>There is an active civilian bounty.</b>"
. += span_info("<i>[registered_account.bounty_text()]</i>")
. += span_info("Quantity: [registered_account.bounty_num()]")
. += span_info("Reward: [registered_account.bounty_value()]")
if(registered_account.account_holder == user.real_name)
msg += span_boldnotice("If you lose this ID card, you can reclaim your account by Alt-Clicking a blank ID card while holding it and entering your account ID number.")
. += span_boldnotice("If you lose this ID card, you can reclaim your account by Alt-Clicking a blank ID card while holding it and entering your account ID number.")
else
msg += span_info("There is no registered account linked to this card. Alt-Click to add one.")
. += span_info("There is no registered account linked to this card. Alt-Click to add one.")
return msg
return .
/obj/item/card/id/GetAccess()
return access.Copy()
+1 -1
View File
@@ -786,7 +786,7 @@
if(istype(target, /obj/item/bodypart) && actually_paints)
var/obj/item/bodypart/limb = target
if(limb.status == BODYPART_ROBOTIC)
if(!IS_ORGANIC_LIMB(limb))
var/list/skins = list()
var/static/list/style_list_icons = list("standard" = 'icons/mob/augmentation/augments.dmi', "engineer" = 'icons/mob/augmentation/augments_engineer.dmi', "security" = 'icons/mob/augmentation/augments_security.dmi', "mining" = 'icons/mob/augmentation/augments_mining.dmi')
for(var/skin_option in style_list_icons)
@@ -252,7 +252,7 @@
if(mode == SCANNER_VERBOSE)
for(var/obj/item/bodypart/limb as anything in damaged)
dmgreport += "<tr><td><font color='#cc3333'>[capitalize(limb.name)]:</font></td>"
dmgreport += "<tr><td><font color='#cc3333'>[capitalize(parse_zone(limb.body_zone))]:</font></td>"
dmgreport += "<td><font color='#cc3333'>[(limb.brute_dam > 0) ? "[CEILING(limb.brute_dam,1)]" : "0"]</font></td>"
dmgreport += "<td><font color='#ff9933'>[(limb.burn_dam > 0) ? "[CEILING(limb.burn_dam,1)]" : "0"]</font></td></tr>"
dmgreport += "</font></table>"
+6 -5
View File
@@ -922,11 +922,12 @@
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/ready_donk/examine_more(mob/user)
var/list/msg = list(span_notice("<i>You browse the back of the box...</i>"))
msg += "\t[span_info("Ready-Donk: a product of Donk Co.")]"
msg += "\t[span_info("Heating instructions: open box and pierce film, heat in microwave on high for 2 minutes. Allow to stand for 60 seconds prior to eating. Product will be hot.")]"
msg += "\t[span_info("Per 200g serving contains: 8g Sodium; 25g Fat, of which 22g are saturated; 2g Sugar.")]"
return msg
. = ..()
. += span_notice("<i>You browse the back of the box...</i>")
. += "\t[span_info("Ready-Donk: a product of Donk Co.")]"
. += "\t[span_info("Heating instructions: open box and pierce film, heat in microwave on high for 2 minutes. Allow to stand for 60 seconds prior to eating. Product will be hot.")]"
. += "\t[span_info("Per 200g serving contains: 8g Sodium; 25g Fat, of which 22g are saturated; 2g Sugar.")]"
return .
/obj/item/food/ready_donk/warm
name = "warm Ready-Donk: Bachelor Chow"
+19 -18
View File
@@ -369,7 +369,7 @@
foodtypes = VEGETABLES
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/soup/moth_bean_stew
/obj/item/food/soup/moth_bean_stew
name = "prickeldröndolhaskl" //prickeld = spicy, röndol = bean, haskl = stew
desc = "A spicy bean stew with lots of veggies, commonly served aboard the fleet as a filling and satisfying meal with rice or bread."
icon = 'icons/obj/food/moth.dmi'
@@ -389,7 +389,7 @@
foodtypes = VEGETABLES | GRAIN
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/soup/moth_fire_soup
/obj/item/food/soup/moth_fire_soup
name = "tömpröttkrakklmæsch" //tömprött = heart (tömp = thump, rött = muscle), krakkl = fire, mæsch = soup
desc = "Tömpröttkrakklmæsch, or heartburn soup, is a cold soup dish that originated amongst the jungle moths, and is named for two things- its rosy pink colour, and its scorchingly hot chilli heat."
icon = 'icons/obj/food/moth.dmi'
@@ -400,7 +400,7 @@
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/soup/rice_porridge
name = "rice porridge"
name = "rice porridge"
desc = "A plate of rice porridge. It's mostly flavourless, but it does fill a spot. To the Chinese it's congee, and moths call it höllflöfmisklsløsk." //höllflöfmiskl = rice (höllflöf = cloud, miskl = seed), sløsk = porridge
icon = 'icons/obj/food/moth.dmi'
icon_state = "rice_porridge"
@@ -410,7 +410,7 @@
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/soup/hua_mulan_congee
name = "\improper Hua Mulan congee"
name = "\improper Hua Mulan congee"
desc = "Nobody is quite sure why this smiley bowl of rice porridge with eggs and bacon is named after a mythological Chinese figure- it's just sorta what it's always been called."
icon = 'icons/obj/food/moth.dmi'
icon_state = "hua_mulan_congee"
@@ -420,7 +420,7 @@
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/soup/toechtauese_rice_porridge
name = "töchtaüse rice porridge"
name = "töchtaüse rice porridge"
desc = "Commonly served aboard the mothic fleet, rice porridge with töchtaüse syrup is more palatable than the regular stuff, if even just because it's spicier than normal."
icon = 'icons/obj/food/moth.dmi'
icon_state = "toechtauese_rice_porridge"
@@ -430,7 +430,7 @@
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/soup/cornmeal_porridge
name = "cornmeal porridge"
name = "cornmeal porridge"
desc = "A plate of cornmeal porridge. It's more flavourful than most porridges, and makes a good base for other flavours, too."
icon = 'icons/obj/food/moth.dmi'
icon_state = "cornmeal_porridge"
@@ -440,7 +440,7 @@
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/soup/cheesy_porridge //milk, polenta, firm cheese, curd cheese, butter
name = "cheesy porridge"
name = "cheesy porridge"
desc = "A rich and creamy bowl of cheesy cornmeal porridge."
icon = 'icons/obj/food/moth.dmi'
icon_state = "cheesy_porridge"
@@ -450,7 +450,7 @@
w_class = WEIGHT_CLASS_SMALL
/obj/item/food/soup/fried_eggplant_polenta
name = "fried eggplant and polenta"
name = "fried eggplant and polenta"
desc = "Polenta loaded with cheese, served with a few discs of fried eggplant and some tomato sauce. Lække!"
icon = 'icons/obj/food/moth.dmi'
icon_state = "fried_eggplant_polenta"
@@ -765,16 +765,17 @@
custom_premium_price = PAYCHECK_EASY * 1.5
/obj/item/storage/box/gum/wake_up/examine_more(mob/user)
var/list/msg = list(span_notice("<i>You read some of the health and safety information...</i>"))
msg += "\t[span_info("For the relief of tiredness and drowsiness while working.")]"
msg += "\t[span_info("Do not chew more than one strip every 12 hours. Do not use as a complete substitute for sleep.")]"
msg += "\t[span_info("Do not give to children under 16. Do not exceed the maximum dosage. Do not ingest. Do not take for more than 3 days consecutively. Do not take in conjunction with other medication. May cause adverse reactions in patients with pre-existing heart conditions.")]"
msg += "\t[span_info("Side effects of Activin use may include twitchy antennae, overactive wings, loss of keratin sheen, loss of setae coverage, arrythmia, blurred vision, and euphoria. Cease taking the medication if side effects occur.")]"
msg += "\t[span_info("Repeated use may cause addiction.")]"
msg += "\t[span_info("If the maximum dosage is exceeded, inform a member of your assigned vessel's medical staff immediately. Do not induce vomiting.")]"
msg += "\t[span_info("Ingredients: each strip contains 500mg of Activin (dextro-methamphetamine). Other ingredients include Green Dye 450 (Verdant Meadow) and artificial herb flavouring.")]"
msg += "\t[span_info("Storage: keep in a cool dry place. Do not use after the use-by date: 32/4/350.")]"
return msg
. = ..()
. += span_notice("<i>You read some of the health and safety information...</i>")
. += "\t[span_info("For the relief of tiredness and drowsiness while working.")]"
. += "\t[span_info("Do not chew more than one strip every 12 hours. Do not use as a complete substitute for sleep.")]"
. += "\t[span_info("Do not give to children under 16. Do not exceed the maximum dosage. Do not ingest. Do not take for more than 3 days consecutively. Do not take in conjunction with other medication. May cause adverse reactions in patients with pre-existing heart conditions.")]"
. += "\t[span_info("Side effects of Activin use may include twitchy antennae, overactive wings, loss of keratin sheen, loss of setae coverage, arrythmia, blurred vision, and euphoria. Cease taking the medication if side effects occur.")]"
. += "\t[span_info("Repeated use may cause addiction.")]"
. += "\t[span_info("If the maximum dosage is exceeded, inform a member of your assigned vessel's medical staff immediately. Do not induce vomiting.")]"
. += "\t[span_info("Ingredients: each strip contains 500mg of Activin (dextro-methamphetamine). Other ingredients include Green Dye 450 (Verdant Meadow) and artificial herb flavouring.")]"
. += "\t[span_info("Storage: keep in a cool dry place. Do not use after the use-by date: 32/4/350.")]"
return .
/obj/item/storage/box/gum/wake_up/PopulateContents()
for(var/i in 1 to 4)
+1 -1
View File
@@ -127,7 +127,7 @@
return FALSE
var/obj/item/bodypart/head/the_head = target.get_bodypart(BODY_ZONE_HEAD)
if((target.get_biological_state() != BIO_FLESH_BONE && target.get_biological_state() != BIO_JUST_FLESH) || !the_head.is_organic_limb())
if((target.get_biological_state() != BIO_FLESH_BONE && target.get_biological_state() != BIO_JUST_FLESH) || !IS_ORGANIC_LIMB(the_head))
to_chat(user, span_warning("You can't noogie [target], [target.p_they()] [target.p_have()] no skin on [target.p_their()] head!"))
return
+6 -6
View File
@@ -53,17 +53,17 @@
/obj/item/robot_suit/update_overlays()
. = ..()
if(l_arm)
. += "[l_arm.icon_state]+o"
. += "[initial(l_arm.icon_state)]+o"
if(r_arm)
. += "[r_arm.icon_state]+o"
. += "[initial(r_arm.icon_state)]+o"
if(chest)
. += "[chest.icon_state]+o"
. += "[initial(chest.icon_state)]+o"
if(l_leg)
. += "[l_leg.icon_state]+o"
. += "[initial(l_leg.icon_state)]+o"
if(r_leg)
. += "[r_leg.icon_state]+o"
. += "[initial(r_leg.icon_state)]+o"
if(head)
. += "[head.icon_state]+o"
. += "[initial(head.icon_state)]+o"
/obj/item/robot_suit/proc/check_completion()
if(l_arm && r_arm && l_leg && r_leg && head && head.flash1 && head.flash2 && chest && chest.wired && chest.cell)
+6 -3
View File
@@ -83,17 +83,20 @@
if(!affecting) //Missing limb?
to_chat(user, span_warning("[C] doesn't have \a [parse_zone(user.zone_selected)]!"))
return FALSE
if(affecting.status != BODYPART_ORGANIC) //Limb must be organic to be healed - RR
if(!IS_ORGANIC_LIMB(affecting)) //Limb must be organic to be healed - RR
to_chat(user, span_warning("[src] won't work on a robotic limb!"))
return FALSE
if(affecting.brute_dam && brute || affecting.burn_dam && burn)
user.visible_message("<span class='infoplain'><span class='green'>[user] applies [src] on [C]'s [affecting.name].</span></span>", "<span class='infoplain'><span class='green'>You apply [src] on [C]'s [affecting.name].</span></span>")
user.visible_message(
span_infoplain(span_green("[user] applies [src] on [C]'s [parse_zone(affecting.body_zone)].")),
span_infoplain(span_green("You apply [src] on [C]'s [parse_zone(affecting.body_zone)]."))
)
var/previous_damage = affecting.get_damage()
if(affecting.heal_damage(brute, burn))
C.update_damage_overlays()
post_heal_effects(max(previous_damage - affecting.get_damage(), 0), C, user)
return TRUE
to_chat(user, span_warning("[C]'s [affecting.name] can not be healed with [src]!"))
to_chat(user, span_warning("[C]'s [parse_zone(affecting.body_zone)] can not be healed with [src]!"))
return FALSE
///Override this proc for special post heal effects.
+4 -5
View File
@@ -132,19 +132,18 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
if(!ishuman(L))
return
var/mob/living/carbon/human/H = L
for(var/X in H.bodyparts)
var/obj/item/bodypart/BP = X
if(BP.status == BODYPART_ROBOTIC)
for(var/obj/item/bodypart/bodypart as anything in H.bodyparts)
if(!IS_ORGANIC_LIMB(bodypart))
to_chat(user, span_warning("[src.deity_name] refuses to heal this metallic taint!"))
return 0
var/heal_amt = 10
var/list/hurt_limbs = H.get_damaged_bodyparts(1, 1, null, BODYPART_ORGANIC)
var/list/hurt_limbs = H.get_damaged_bodyparts(1, 1, null, BODYTYPE_ORGANIC)
if(hurt_limbs.len)
for(var/X in hurt_limbs)
var/obj/item/bodypart/affecting = X
if(affecting.heal_damage(heal_amt, heal_amt, null, BODYPART_ORGANIC))
if(affecting.heal_damage(heal_amt, heal_amt, null, BODYTYPE_ORGANIC))
H.update_damage_overlays()
H.visible_message(span_notice("[user] heals [H] with the power of [deity_name]!"))
to_chat(H, span_boldnotice("May the power of [deity_name] compel you to be healed!"))
+1 -1
View File
@@ -122,7 +122,7 @@
var/obj/item/bodypart/affecting = attacked_humanoid.get_bodypart(check_zone(user.zone_selected))
if(affecting && affecting.status == BODYPART_ROBOTIC && !user.combat_mode)
if(affecting && !IS_ORGANIC_LIMB(affecting) && !user.combat_mode)
if(src.use_tool(attacked_humanoid, user, 0, volume=50, amount=1))
if(user == attacked_humanoid)
user.visible_message(span_notice("[user] starts to fix some of the dents on [attacked_humanoid]'s [affecting.name]."),
@@ -22,6 +22,10 @@
var/buildstackamount = 2
var/bolts = TRUE
/obj/structure/bed/Initialize(mapload)
. = ..()
AddElement(/datum/element/soft_landing)
/obj/structure/bed/examine(mob/user)
. = ..()
if(bolts)
@@ -7,9 +7,10 @@
var/mutable_appearance/armrest
/obj/structure/chair/sofa/Initialize(mapload)
. = ..()
armrest = mutable_appearance(icon, "[icon_state]_armrest", ABOVE_MOB_LAYER)
armrest.plane = GAME_PLANE_UPPER
return ..()
AddElement(/datum/element/soft_landing)
/obj/structure/chair/sofa/electrify_self(obj/item/assembly/shock_kit/input_shock_kit, mob/user, list/overlays_from_child_procs)
if(!overlays_from_child_procs)
+3 -3
View File
@@ -50,7 +50,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28)
hairdresser.hairstyle = new_style
hairdresser.update_hair()
hairdresser.update_hair(is_creating = TRUE)
*/
/obj/structure/mirror/examine_status(mob/user)
@@ -225,7 +225,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28)
if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return TRUE
amazed_human.gender = FEMALE
amazed_human.body_type = FEMALE
amazed_human.physique = FEMALE
to_chat(amazed_human, span_notice("Man, you feel like a woman!"))
else
return TRUE
@@ -235,7 +235,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28)
if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return TRUE
amazed_human.gender = MALE
amazed_human.body_type = MALE
amazed_human.physique = MALE
to_chat(amazed_human, span_notice("Whoa man, you feel like a man!"))
else
return TRUE
+3 -4
View File
@@ -12,7 +12,7 @@
/proc/randomize_human(mob/living/carbon/human/H)
H.gender = pick(MALE, FEMALE)
H.body_type = H.gender
H.physique = H.gender
H.real_name = random_unique_name(H.gender)
H.name = H.real_name
H.underwear = random_underwear(H.gender)
@@ -49,6 +49,5 @@
//SKYRAT EDIT ADDITION END
H.dna.features["pod_hair"] = pick(GLOB.pod_hair_list)
H.update_body()
H.update_hair()
H.update_body_parts()
H.update_body(is_creating = TRUE)
H.update_hair(is_creating = TRUE)
@@ -53,7 +53,7 @@
if(!limb)
replace_limb(zone)
return
if((limb.get_damage() >= (limb.max_damage / 2)) || (limb.status == BODYPART_ROBOTIC))
if((limb.get_damage() >= (limb.max_damage / 2)) || (!IS_ORGANIC_LIMB(limb)))
replace_limb(zone, limb)
return
@@ -72,7 +72,7 @@
return
var/obj/item/bodypart/chest/chest = owner.get_bodypart(BODY_ZONE_CHEST)
if((chest.get_damage() >= (chest.max_damage / 4)) || (chest.status == BODYPART_ROBOTIC))
if((chest.get_damage() >= (chest.max_damage / 4)) || (!IS_ORGANIC_LIMB(chest)))
replace_chest(chest)
return
@@ -208,7 +208,7 @@
addtimer(CALLBACK(src, .proc/keep_replacing_blood), 30)
/obj/item/organ/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest)
if(chest.status == BODYPART_ROBOTIC)
if(!IS_ORGANIC_LIMB(chest))
owner.visible_message(span_warning("[owner]'s [chest.name] rapidly expels its mechanical components, replacing them with flesh!"), span_userdanger("Your [chest.name] rapidly expels its mechanical components, replacing them with flesh!"))
playsound(owner, 'sound/magic/clockwork/anima_fragment_attack.ogg', 50, TRUE)
var/list/dirs = GLOB.alldirs.Copy()
@@ -654,9 +654,11 @@
chosen_dna.transfer_identity(user, TRUE)
user.Digitigrade_Leg_Swap(!(DIGITIGRADE in chosen_dna.species?.species_traits))
for(var/obj/item/bodypart/limb as anything in user.bodyparts)
if(IS_ORGANIC_LIMB(limb))
limb.update_limb(is_creating = TRUE)
user.updateappearance(mutcolor_update = TRUE)
user.update_body()
user.domutcheck()
// Get rid of any scars from previous Changeling-ing
@@ -43,7 +43,7 @@
"<span class='hear'>You hear organic matter ripping \
and tearing!</span>")
user.emote("scream")
user.regenerate_limbs(0, list(BODY_ZONE_HEAD))
user.regenerate_limbs(list(BODY_ZONE_HEAD))
user.regenerate_organs()
/datum/action/changeling/fakedeath/proc/ready_to_regenerate(mob/user)
@@ -23,7 +23,7 @@
"<span class='hear'>You hear organic matter ripping \
and tearing!</span>")
C.emote("scream")
C.regenerate_limbs(1)
C.regenerate_limbs()
if(!user.getorganslot(ORGAN_SLOT_BRAIN))
var/obj/item/organ/brain/B
if(C.has_dna() && C.dna.species.mutantbrain)
@@ -219,18 +219,6 @@
/obj/item/bountytrap = 4
)
/datum/outfit/bountysynth/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(visualsOnly)
return
var/datum/species/synth/synthetic_appearance = new()
H.set_species(synthetic_appearance)
synthetic_appearance.assume_disguise(synthetic_appearance, H)
H.update_hair()
var/obj/item/card/id/W = H.wear_id
W.registered_name = H.real_name
W.update_label()
W.update_icon()
//ids and ert code
/obj/item/card/id/advanced/bountyhunter
@@ -75,7 +75,7 @@
if(istype(weapon, /obj/item/bodypart))
var/obj/item/bodypart/consumed = weapon
if(consumed.status != BODYPART_ORGANIC)
if(!IS_ORGANIC_LIMB(consumed))
balloon_alert(user, "not organic!")
return
@@ -4,7 +4,7 @@
/datum/species/shadow/nightmare
name = "Nightmare"
id = SPECIES_NIGHTMARE
limbs_id = SPECIES_SHADOW
examine_limb_id = SPECIES_SHADOW
burnmod = 1.5
no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE)
species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYESPRITES)
@@ -358,7 +358,7 @@
if(ishuman(mob))
var/mob/living/carbon/human/H = mob
if(H.dna && H.dna.species && !HAS_TRAIT(H, TRAIT_VIRUSIMMUNE)) // SKYRAT EDIT - No more funny purple hair
H.dna.species.handle_hair(H,"#1d2953") //will be reset when blight is cured
H.set_haircolor("#1d2953", override = TRUE) //will be reset when blight is cured
var/blightfound = FALSE
for(var/datum/disease/revblight/blight in H.diseases)
blightfound = TRUE
@@ -20,7 +20,7 @@
affected_mob.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#1d2953")
if(affected_mob.dna && affected_mob.dna.species)
affected_mob.dna.species.handle_mutant_bodyparts(affected_mob)
affected_mob.dna.species.handle_hair(affected_mob)
affected_mob.set_haircolor(null, override = TRUE)
to_chat(affected_mob, span_notice("You feel better."))
..()
@@ -64,7 +64,7 @@
new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(affected_mob.dna && affected_mob.dna.species)
affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#1d2953")
affected_mob.dna.species.handle_hair(affected_mob,"#1d2953")
affected_mob.set_haircolor("#1d2953", override = TRUE)
affected_mob.visible_message(span_warning("[affected_mob] looks terrifyingly gaunt..."), span_revennotice("You suddenly feel like your skin is <i>wrong</i>..."))
affected_mob.add_atom_colour("#1d2953", TEMPORARY_COLOUR_PRIORITY)
addtimer(CALLBACK(src, .proc/cure), 10 SECONDS)
+1 -1
View File
@@ -100,7 +100,7 @@
if(SSatoms.initialized == INITIALIZATION_INSSATOMS)
thief.w_uniform?.update_greyscale()
thief.update_inv_w_uniform()
thief.body_type = FEMALE //update_body() and gender block or something
thief.physique = FEMALE //update_body() and gender block or something
thief.hair_color = "#2A71DC" //hair color dna block
thief.skin_tone = "caucasian2" //skin tone dna block
thief.hairstyle = "Bun Head 2" //update_hair()
@@ -197,15 +197,15 @@
return
var/mob/living/carbon/human/burn_human = burn_living
var/datum/species/burn_species = burn_human.dna.species
if(istype(burn_species, /datum/species/plasmaman) || istype(burn_species, /datum/species/android) || istype(burn_species, /datum/species/synth)) //ignore plasmamen/robotic species
if(istype(burn_species, /datum/species/plasmaman) || istype(burn_species, /datum/species/android)) //ignore plasmamen/robotic species
return
var/list/plasma_parts = list()//a list of the organic parts to be turned into plasma limbs
var/list/robo_parts = list()//keep a reference of robotic parts so we know if we can turn them into a plasmaman
for(var/obj/item/bodypart/burn_limb as anything in burn_human.bodyparts)
if(burn_limb.status == BODYPART_ORGANIC && burn_limb.species_id != SPECIES_PLASMAMAN) //getting every organic, non-plasmaman limb (augments/androids are immune to this)
if(IS_ORGANIC_LIMB(burn_limb) && burn_limb.limb_id != SPECIES_PLASMAMAN) //getting every organic, non-plasmaman limb (augments/androids are immune to this)
plasma_parts += burn_limb
if(burn_limb.status == BODYPART_ROBOTIC)
if(!IS_ORGANIC_LIMB(burn_limb))
robo_parts += burn_limb
burn_human.adjustToxLoss(15)
+2 -1
View File
@@ -389,7 +389,8 @@
var/mob/living/carbon/human/M = new /mob/living/carbon/human(get_turf(src))
new_team_member.prefs.safe_transfer_prefs_to(M, is_antag = TRUE)
M.set_species(/datum/species/synth)
if(M.dna.species.outfit_important_for_life)
M.set_species(/datum/species/human)
M.key = new_team_member.key
M.faction += team
M.equipOutfit(chosen_class)
+2 -4
View File
@@ -566,10 +566,8 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/character_preview_view)
character.dna.real_name = character.real_name
if(icon_updates)
character.icon_render_key = null //turns out if you don't set this to null update_body_parts does nothing, since it assumes the operation was cached
character.update_body()
character.update_hair()
character.update_body_parts()
character.icon_render_keys = list()
character.update_body(is_creating = TRUE)
/// Returns whether the parent mob should have the random hardcore settings enabled. Assumes it has a mind.
+3 -4
View File
@@ -1,4 +1,3 @@
/* SKYRAT EDIT REMOVAL
#define USE_GENDER "Use gender"
/datum/preference/choiced/body_type
@@ -15,9 +14,9 @@
/datum/preference/choiced/body_type/apply_to_human(mob/living/carbon/human/target, value)
if (value == USE_GENDER)
target.body_type = target.gender
target.physique = target.gender
else
target.body_type = value
target.physique = value
/datum/preference/choiced/body_type/is_accessible(datum/preferences/preferences)
if (!..(preferences))
@@ -27,4 +26,4 @@
return initial(species.sexes)
#undef USE_GENDER
*/
+1 -1
View File
@@ -6,7 +6,7 @@
randomize_by_default = FALSE
/datum/preference/choiced/species/deserialize(input, datum/preferences/preferences)
return GLOB.species_list[sanitize_inlist(input, get_choices_serialized(), "human")]
return GLOB.species_list[sanitize_inlist(input, get_choices_serialized(), SPECIES_HUMAN)]
/datum/preference/choiced/species/serialize(input)
var/datum/species/species = input
@@ -53,6 +53,7 @@
/datum/preference/choiced/facial_hairstyle/apply_to_human(mob/living/carbon/human/target, value)
target.facial_hairstyle = value
target.update_hair(is_creating = TRUE)
/datum/preference/choiced/facial_hairstyle/compile_constant_data()
var/list/data = ..()
@@ -69,6 +70,7 @@
/datum/preference/color/facial_hair_color/apply_to_human(mob/living/carbon/human/target, value)
target.facial_hair_color = value
target.update_hair(is_creating = TRUE)
/datum/preference/choiced/facial_hair_gradient
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
@@ -82,7 +84,7 @@
/datum/preference/choiced/facial_hair_gradient/apply_to_human(mob/living/carbon/human/target, value)
LAZYSETLEN(target.grad_style, GRADIENTS_LEN)
target.grad_style[GRADIENT_FACIAL_HAIR_KEY] = value
target.update_hair()
target.update_hair(is_creating = TRUE)
/datum/preference/choiced/facial_hair_gradient/create_default_value()
return "None"
@@ -96,7 +98,7 @@
/datum/preference/color/facial_hair_gradient/apply_to_human(mob/living/carbon/human/target, value)
LAZYSETLEN(target.grad_color, GRADIENTS_LEN)
target.grad_color[GRADIENT_FACIAL_HAIR_KEY] = value
target.update_hair()
target.update_hair(is_creating = TRUE)
/datum/preference/color/facial_hair_gradient/is_accessible(datum/preferences/preferences)
if (!..(preferences))
@@ -145,7 +147,7 @@
/datum/preference/choiced/hair_gradient/apply_to_human(mob/living/carbon/human/target, value)
LAZYSETLEN(target.grad_style, GRADIENTS_LEN)
target.grad_style[GRADIENT_HAIR_KEY] = value
target.update_hair()
target.update_hair(is_creating = TRUE)
/datum/preference/choiced/hair_gradient/create_default_value()
return "None"
@@ -159,7 +161,7 @@
/datum/preference/color/hair_gradient/apply_to_human(mob/living/carbon/human/target, value)
LAZYSETLEN(target.grad_color, GRADIENTS_LEN)
target.grad_color[GRADIENT_HAIR_KEY] = value
target.update_hair()
target.update_hair(is_creating = TRUE)
/datum/preference/color/hair_gradient/is_accessible(datum/preferences/preferences)
if (!..(preferences))
@@ -8,10 +8,10 @@
/datum/preference/choiced/ethereal_color/init_possible_values()
var/list/values = list()
var/icon/ethereal_base = icon('icons/mob/human_parts_greyscale.dmi', "ethereal_head_m")
ethereal_base.Blend(icon('icons/mob/human_parts_greyscale.dmi', "ethereal_chest_m"), ICON_OVERLAY)
ethereal_base.Blend(icon('icons/mob/human_parts_greyscale.dmi', "ethereal_l_arm"), ICON_OVERLAY)
ethereal_base.Blend(icon('icons/mob/human_parts_greyscale.dmi', "ethereal_r_arm"), ICON_OVERLAY)
var/icon/ethereal_base = icon('icons/mob/species/ethereal/bodyparts.dmi', "ethereal_head")
ethereal_base.Blend(icon('icons/mob/species/ethereal/bodyparts.dmi', "ethereal_chest"), ICON_OVERLAY)
ethereal_base.Blend(icon('icons/mob/species/ethereal/bodyparts.dmi', "ethereal_l_arm"), ICON_OVERLAY)
ethereal_base.Blend(icon('icons/mob/species/ethereal/bodyparts.dmi', "ethereal_r_arm"), ICON_OVERLAY)
var/icon/eyes = icon('icons/mob/human_face.dmi', "eyes")
eyes.Blend(COLOR_BLACK, ICON_MULTIPLY)
@@ -1,9 +1,8 @@
/*
/* SKYRAT EDIT REMOVAL
/proc/generate_lizard_side_shots(list/sprite_accessories, key, include_snout = TRUE)
var/list/values = list()
var/icon/lizard = icon('icons/mob/human_parts_greyscale.dmi', "lizard_head_m", EAST)
var/icon/lizard = icon('icons/mob/species/lizard/bodyparts.dmi', "lizard_head", EAST)
var/icon/eyes = icon('icons/mob/human_face.dmi', "eyes", EAST)
eyes.Blend(COLOR_GRAY, ICON_MULTIPLY)
lizard.Blend(eyes, ICON_OVERLAY)
@@ -39,10 +38,10 @@
/datum/preference/choiced/lizard_body_markings/init_possible_values()
var/list/values = list()
var/icon/lizard = icon('icons/mob/human_parts_greyscale.dmi', "lizard_chest_m")
var/icon/lizard = icon('icons/mob/species/lizard/bodyparts.dmi', "lizard_chest_m")
for (var/name in GLOB.sprite_accessories["body_markings"]) //SKYRAT EDIT
var/datum/sprite_accessory/sprite_accessory = GLOB.sprite_accessories["body_markings"][name] //SKYRAT EDIT
for (var/name in GLOB.body_markings_list)
var/datum/sprite_accessory/sprite_accessory = GLOB.body_markings_list[name]
var/icon/final_icon = icon(lizard)
@@ -64,10 +63,7 @@
return values
/datum/preference/choiced/lizard_body_markings/apply_to_human(mob/living/carbon/human/target, value)
if(!target.dna.mutant_bodyparts["body_markings"])
target.dna.mutant_bodyparts["body_markings"] = list()
target.dna.mutant_bodyparts["body_markings"][MUTANT_INDEX_NAME] = value
target.dna.mutant_bodyparts["body_markings"][MUTANT_INDEX_COLOR_LIST] = list("333", "222", "444")
target.dna.features["body_markings"] = value
/datum/preference/choiced/lizard_frills
savefile_key = "feature_lizard_frills"
@@ -77,13 +73,10 @@
should_generate_icons = TRUE
/datum/preference/choiced/lizard_frills/init_possible_values()
return generate_lizard_side_shots(GLOB.sprite_accessories["frills"], "frills") //SKYRAT EDIT
return generate_lizard_side_shots(GLOB.frills_list, "frills")
/datum/preference/choiced/lizard_frills/apply_to_human(mob/living/carbon/human/target, value)
if(!target.dna.species.mutant_bodyparts["frills"])
target.dna.species.mutant_bodyparts["frills"] = list()
target.dna.species.mutant_bodyparts["frills"][MUTANT_INDEX_NAME] = value
target.dna.species.mutant_bodyparts["frills"][MUTANT_INDEX_COLOR_LIST] = list("333", "222", "444")
target.dna.features["frills"] = value
/datum/preference/choiced/lizard_horns
savefile_key = "feature_lizard_horns"
@@ -93,15 +86,11 @@
should_generate_icons = TRUE
/datum/preference/choiced/lizard_horns/init_possible_values()
return generate_lizard_side_shots(GLOB.sprite_accessories["horns"], "horns") //SKYRAT EDIT
return generate_lizard_side_shots(GLOB.horns_list, "horns")
/datum/preference/choiced/lizard_horns/apply_to_human(mob/living/carbon/human/target, value)
if(!target.dna.species.mutant_bodyparts["horns"])
target.dna.species.mutant_bodyparts["horns"] = list()
target.dna.species.mutant_bodyparts["horns"][MUTANT_INDEX_NAME] = value
target.dna.species.mutant_bodyparts["horns"][MUTANT_INDEX_COLOR_LIST] = list("333", "222", "444")
target.dna.features["horns"] = value
/* SKYRAT EDIT REMOVAL
/datum/preference/choiced/lizard_legs
savefile_key = "feature_lizard_legs"
savefile_identifier = PREFERENCE_CHARACTER
@@ -109,27 +98,23 @@
relevant_mutant_bodypart = "legs"
/datum/preference/choiced/lizard_legs/init_possible_values()
return GLOB.sprite_accessories["legs"] //SKYRAT EDIT CHANGE
return assoc_to_keys(GLOB.legs_list)
/datum/preference/choiced/lizard_legs/apply_to_human(mob/living/carbon/human/target, value)
target.dna.features["legs"] = value
*/
/datum/preference/choiced/lizard_snout
savefile_key = "feature_lizrd_snout"
savefile_key = "feature_lizard_snout"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_FEATURES
main_feature_name = "Snout"
should_generate_icons = TRUE
/datum/preference/choiced/lizard_snout/init_possible_values()
return generate_lizard_side_shots(GLOB.sprite_accessories["snout"], "snout", include_snout = FALSE) //SKYRAT EDIT
return generate_lizard_side_shots(GLOB.snouts_list, "snout", include_snout = FALSE)
/datum/preference/choiced/lizard_snout/apply_to_human(mob/living/carbon/human/target, value)
if(!target.dna.species.mutant_bodyparts["snout"])
target.dna.species.mutant_bodyparts["snout"] = list()
target.dna.species.mutant_bodyparts["snout"][MUTANT_INDEX_NAME] = value
target.dna.species.mutant_bodyparts["snout"][MUTANT_INDEX_COLOR_LIST] = list("333", "222", "444")
target.dna.features["snout"] = value
/datum/preference/choiced/lizard_spines
savefile_key = "feature_lizard_spines"
@@ -138,13 +123,10 @@
relevant_mutant_bodypart = "spines"
/datum/preference/choiced/lizard_spines/init_possible_values()
return GLOB.sprite_accessories["spines"] //SKYRAT EDIT
return assoc_to_keys(GLOB.spines_list)
/datum/preference/choiced/lizard_spines/apply_to_human(mob/living/carbon/human/target, value)
if(!target.dna.species.mutant_bodyparts["spines"])
target.dna.species.mutant_bodyparts["spines"] = list()
target.dna.species.mutant_bodyparts["spines"][MUTANT_INDEX_NAME] = value
target.dna.species.mutant_bodyparts["spines"][MUTANT_INDEX_COLOR_LIST] = list("333", "222", "444")
target.dna.features["spines"] = value
/datum/preference/choiced/lizard_tail
savefile_key = "feature_lizard_tail"
@@ -153,11 +135,8 @@
relevant_mutant_bodypart = "tail_lizard"
/datum/preference/choiced/lizard_tail/init_possible_values()
return GLOB.sprite_accessories["tail"] //SKYRAT EDIT
return assoc_to_keys(GLOB.tails_list_lizard)
/datum/preference/choiced/lizard_tail/apply_to_human(mob/living/carbon/human/target, value)
if(!target.dna.species.mutant_bodyparts["tail"])
target.dna.species.mutant_bodyparts["tail"] = list()
target.dna.species.mutant_bodyparts["tail"][MUTANT_INDEX_NAME] = value
target.dna.species.mutant_bodyparts["tail"][MUTANT_INDEX_COLOR_LIST] = list("333", "222", "444")
target.dna.features["tail_lizard"] = value
*/
@@ -9,11 +9,11 @@
/datum/preference/choiced/moth_antennae/init_possible_values()
var/list/values = list()
var/icon/moth_head = icon('icons/mob/human_parts.dmi', "moth_head_m")
var/icon/moth_head = icon('icons/mob/species/moth/bodyparts.dmi', "moth_head")
moth_head.Blend(icon('icons/mob/human_face.dmi', "motheyes"), ICON_OVERLAY)
for (var/antennae_name in GLOB.sprite_accessories["moth_antennae"]) //SKYRAT EDIT
var/datum/sprite_accessory/antennae = GLOB.sprite_accessories["moth_antennae"][antennae_name] //SKYRAT EDIT
for (var/antennae_name in GLOB.moth_antennae_list)
var/datum/sprite_accessory/antennae = GLOB.moth_antennae_list[antennae_name]
var/icon/icon_with_antennae = new(moth_head)
icon_with_antennae.Blend(icon(antennae.icon, "m_moth_antennae_[antennae.icon_state]_FRONT"), ICON_OVERLAY)
@@ -43,20 +43,20 @@
moth_body.Blend(icon('icons/mob/moth_wings.dmi', "m_moth_wings_plain_BEHIND"), ICON_OVERLAY)
var/list/body_parts = list(
BODY_ZONE_HEAD,
BODY_ZONE_CHEST,
BODY_ZONE_L_ARM,
BODY_ZONE_R_ARM,
/obj/item/bodypart/head/moth,
/obj/item/bodypart/chest/moth,
/obj/item/bodypart/l_arm/moth,
/obj/item/bodypart/r_arm/moth,
)
for (var/body_part in body_parts)
var/gender = (body_part == "chest" || body_part == "head") ? "_m" : ""
moth_body.Blend(icon('icons/mob/human_parts.dmi', "moth_[body_part][gender]"), ICON_OVERLAY)
for (var/obj/item/bodypart/body_part in body_parts)
var/gender = (initial(body_part.is_dimorphic)) ? "_m" : ""
moth_body.Blend(icon('icons/mob/species/moth/bodyparts.dmi', "moth_[body_part][gender]"), ICON_OVERLAY)
moth_body.Blend(icon('icons/mob/human_face.dmi', "motheyes"), ICON_OVERLAY)
for (var/markings_name in GLOB.sprite_accessories["moth_markings"]) //SKYRAT EDIT
var/datum/sprite_accessory/markings = GLOB.sprite_accessories["moth_markings"][markings_name] //SKYRAT EDIT
for (var/markings_name in GLOB.moth_markings_list)
var/datum/sprite_accessory/markings = GLOB.moth_markings_list[markings_name]
var/icon/icon_with_markings = new(moth_body)
if (markings_name != "None")
@@ -79,7 +79,6 @@
/datum/preference/choiced/moth_markings/apply_to_human(mob/living/carbon/human/target, value)
target.dna.features["moth_markings"] = value
/datum/preference/choiced/moth_wings
savefile_key = "feature_moth_wings"
savefile_identifier = PREFERENCE_CHARACTER
@@ -88,7 +87,11 @@
should_generate_icons = TRUE
/datum/preference/choiced/moth_wings/init_possible_values()
var/list/icon/values = possible_values_for_sprite_accessory_list_for_body_part(GLOB.sprite_accessories["moth_wings"]) //SKYRAT EDIT
var/list/icon/values = possible_values_for_sprite_accessory_list_for_body_part(
GLOB.moth_wings_list,
"moth_wings",
list("BEHIND", "FRONT"),
)
// Moth wings are in a stupid dimension
for (var/name in values)
@@ -98,4 +101,5 @@
/datum/preference/choiced/moth_wings/apply_to_human(mob/living/carbon/human/target, value)
target.dna.features["moth_wings"] = value
*/
@@ -8,7 +8,7 @@
/datum/preference/choiced/pod_hair/init_possible_values()
var/list/values = list()
var/icon/pod_head = icon('icons/mob/human_parts.dmi', "pod_head_m")
var/icon/pod_head = icon('icons/mob/human_parts_greyscale.dmi', "pod_head_m")
for (var/pod_name in GLOB.pod_hair_list)
var/datum/sprite_accessory/pod_hair = GLOB.pod_hair_list[pod_name]
@@ -20,6 +20,7 @@
icon_with_hair.Blend(icon_adj, ICON_OVERLAY)
icon_with_hair.Scale(64, 64)
icon_with_hair.Crop(15, 64, 15 + 31, 64 - 31)
icon_with_hair.Blend(COLOR_GREEN, ICON_MULTIPLY)
values[pod_hair.name] = icon_with_hair
+3 -3
View File
@@ -176,7 +176,7 @@
/obj/item/clothing/proc/take_damage_zone(def_zone, damage_amount, damage_type, armour_penetration)
if(!def_zone || !limb_integrity || (initial(body_parts_covered) in GLOB.bitflags)) // the second check sees if we only cover one bodypart anyway and don't need to bother with this
return
var/list/covered_limbs = body_parts_covered2organ_names(body_parts_covered) // what do we actually cover?
var/list/covered_limbs = cover_flags2body_zones(body_parts_covered) // what do we actually cover?
if(!(def_zone in covered_limbs))
return
@@ -198,7 +198,7 @@
* * damage_type: Only really relevant for the verb for describing the breaking, and maybe atom_destruction()
*/
/obj/item/clothing/proc/disable_zone(def_zone, damage_type)
var/list/covered_limbs = body_parts_covered2organ_names(body_parts_covered)
var/list/covered_limbs = cover_flags2body_zones(body_parts_covered)
if(!(def_zone in covered_limbs))
return
@@ -211,7 +211,7 @@
RegisterSignal(C, COMSIG_MOVABLE_MOVED, .proc/bristle, override = TRUE)
zones_disabled++
for(var/i in zone2body_parts_covered(def_zone))
for(var/i in body_zone2cover_flags(def_zone))
body_parts_covered &= ~i
if(body_parts_covered == NONE) // if there are no more parts to break then the whole thing is kaput
+1 -1
View File
@@ -186,7 +186,7 @@
flags_inv = 0
armor = list(MELEE = 30, BULLET = 15, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50)
strip_delay = (8 SECONDS)
mutant_variants = NONE //SKYRAT EDIT lets anthros wear the hat
supports_variations_flags = CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON //SKYRAT EDIT lets anthros wear the hat
/obj/item/clothing/head/human_leather
name = "human skin hat"
+2 -2
View File
@@ -12,9 +12,9 @@
adjustmask(user)
//SKYRAT EDIT START: BANDANA HATS FOR MUTANTS
if(slot_flags & ITEM_SLOT_HEAD)
mutant_variants = NONE
supports_variations_flags = NONE
if(slot_flags & ITEM_SLOT_MASK)
mutant_variants = initial(mutant_variants)
supports_variations_flags = initial(supports_variations_flags)
//SKYRAT EDIT END
/obj/item/clothing/mask/bandana/AltClick(mob/user)
+2 -2
View File
@@ -116,7 +116,7 @@
RESKIN_ICON_STATE = "peacekeeper_trench_hos",
RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi',
RESKIN_WORN_ICON_STATE = "peacekeeper_trench_hos",
RESKIN_MUTANT_VARIANTS = NONE
RESKIN_supports_variations_flags = NONE
)
)
/// SKYRAT EDIT ADDITION END
@@ -172,7 +172,7 @@
RESKIN_ICON_STATE = "peacekeeper_trench_warden",
RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi',
RESKIN_WORN_ICON_STATE = "peacekeeper_trench_warden",
RESKIN_MUTANT_VARIANTS = NONE
RESKIN_supports_variations_flags = NONE
)
)
/// SKYRAT EDIT ADDITION END
+12 -1
View File
@@ -470,6 +470,7 @@
icon_state = "MajimaJacket"
inhand_icon_state = "MajimaJacket"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/dutch
name = "dutch's jacket"
@@ -478,6 +479,7 @@
inhand_icon_state = "DutchJacket"
body_parts_covered = ARMS
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/driscoll
name = "driscoll poncho"
@@ -485,6 +487,7 @@
icon_state = "driscoll_suit"
inhand_icon_state = "driscoll_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/irs
name = "internal revenue service jacket"
@@ -492,6 +495,7 @@
icon_state = "irs_suit"
inhand_icon_state = "irs_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/osi
name = "\improper O.S.I. body armor"
@@ -499,6 +503,7 @@
icon_state = "osi_suit"
inhand_icon_state = "osi_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/tmc
name = "\improper Lost M.C. cut"
@@ -506,6 +511,7 @@
icon_state = "tmc_suit"
inhand_icon_state = "tmc_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/pg
name = "powder ganger jacket"
@@ -513,6 +519,7 @@
icon_state = "pg_suit"
inhand_icon_state = "pg_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/deckers
name = "decker hoodie"
@@ -520,6 +527,7 @@
icon_state = "decker_suit"
inhand_icon_state = "decker_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/morningstar
name = "morningstar coat"
@@ -527,6 +535,7 @@
icon_state = "morningstar_suit"
inhand_icon_state = "morningstar_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/saints
name = "Third Street Saints fur coat"
@@ -536,6 +545,7 @@
body_parts_covered = CHEST|GROIN|LEGS|ARMS
cold_protection = CHEST|GROIN|LEGS|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/phantom
name = "phantom thief coat"
@@ -543,6 +553,7 @@
icon_state = "phantom_suit"
inhand_icon_state = "phantom_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/allies
name = "allies body armor"
@@ -550,6 +561,7 @@
icon_state = "allies_armor"
inhand_icon_state = "allies_armor"
body_parts_covered = CHEST|GROIN
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/suit/soviet
name = "soviet armored coat"
@@ -578,4 +590,3 @@
icon_state = "football_armor_red"
inhand_icon_state = "football_armor_red"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
+1
View File
@@ -25,3 +25,4 @@
body_parts_covered = CHEST|GROIN|ARMS|LEGS
cold_protection = CHEST|GROIN|ARMS|LEGS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+3 -4
View File
@@ -20,7 +20,6 @@
var/alt_covers_chest = FALSE // for adjusted/rolled-down jumpsuits, FALSE = exposes chest and arms, TRUE = exposes arms only
var/obj/item/clothing/accessory/attached_accessory
var/mutable_appearance/accessory_overlay
var/mutantrace_variation = NO_MUTANTRACE_VARIATION //Are there special sprites for specific situations? Don't use this unless you need to.
var/freshly_laundered = FALSE
/obj/item/clothing/under/Initialize(mapload)
@@ -102,9 +101,9 @@
if(!alt_covers_chest)
body_parts_covered |= CHEST
if(mutantrace_variation && ishuman(user))
if((supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION) && ishuman(user))
var/mob/living/carbon/human/H = user
if(DIGITIGRADE in H.dna.species.species_traits)
if(H.dna.species.bodytype & BODYTYPE_DIGITIGRADE)
adjusted = DIGITIGRADE_STYLE
H.update_inv_w_uniform()
@@ -327,7 +326,7 @@
return adjusted
for(var/zone in list(BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) // ugly check to make sure we don't reenable protection on a disabled part
if(damage_by_parts[zone] > limb_integrity)
for(var/part in zone2body_parts_covered(zone))
for(var/part in body_zone2cover_flags(zone))
body_parts_covered &= part
return adjusted
+2 -1
View File
@@ -19,7 +19,8 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
icon_state = "jumpskirt"
greyscale_config_worn_digi = null
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
greyscale_config_worn_digi = null // SKYRAT EDIT ADDITION
/// Returns a random, acceptable jumpsuit typepath
/proc/get_random_jumpsuit()
+2
View File
@@ -98,6 +98,7 @@
inhand_icon_state = "gladiator"
body_parts_covered = CHEST|GROIN|ARMS
female_sprite_flags = NO_FEMALE_UNIFORM
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
can_adjust = FALSE
resistance_flags = NONE
@@ -112,6 +113,7 @@
inhand_icon_state = "maid"
body_parts_covered = CHEST|GROIN
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
can_adjust = FALSE
/obj/item/clothing/under/costume/maid/Initialize(mapload)
+4 -2
View File
@@ -16,6 +16,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/cargo/tech
name = "cargo technician's jumpsuit"
@@ -23,16 +24,17 @@
icon_state = "cargotech"
inhand_icon_state = "lb_suit"
body_parts_covered = CHEST|GROIN|ARMS
mutantrace_variation = MUTANTRACE_VARIATION
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION
alt_covers_chest = TRUE
/obj/item/clothing/under/rank/cargo/tech/skirt
name = "cargo technician's jumpskirt"
desc = "Skiiiiirts! They're comfy and easy to wear!"
icon_state = "cargo_skirt"
inhand_icon_state = "lb_suit"
body_parts_covered = CHEST|GROIN|ARMS
mutantrace_variation = NO_MUTANTRACE_VARIATION
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
@@ -34,6 +34,7 @@
alt_covers_chest = TRUE
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
body_parts_covered = CHEST|GROIN|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/centcom/officer_skirt/replica
name = "\improper CentCom turtleneck skirt replica"
@@ -46,6 +47,7 @@
inhand_icon_state = "dg_suit"
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
body_parts_covered = CHEST|GROIN|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/centcom/military
name = "tactical combat uniform"
@@ -25,6 +25,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/chaplain
desc = "It's a black jumpsuit, often worn by religious folk."
@@ -41,6 +42,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/chef
name = "cook's suit"
@@ -55,6 +57,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/head_of_personnel
desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"."
@@ -70,6 +73,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/head_of_personnel/suit
name = "head of personnel's suit"
@@ -86,6 +90,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/hydroponics
desc = "It's a jumpsuit designed to protect against minor plant-related hazards."
@@ -102,6 +107,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/janitor
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
@@ -116,6 +122,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/janitor/maid
name = "maid uniform"
@@ -148,6 +155,7 @@
inhand_icon_state = "lawyer_black"
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/lawyer/beige
name = "good lawyer's suit"
@@ -164,6 +172,7 @@
worn_icon = 'icons/mob/clothing/under/suits.dmi'
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/lawyer/red
name = "lawyer red suit"
@@ -176,6 +185,7 @@
inhand_icon_state = "lawyer_red"
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/lawyer/blue
name = "lawyer blue suit"
@@ -188,6 +198,7 @@
inhand_icon_state = "lawyer_blue"
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/lawyer/bluesuit
name = "blue suit"
@@ -205,6 +216,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/lawyer/purpsuit
name = "purple suit"
@@ -221,6 +233,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/lawyer/galaxy
worn_icon = 'icons/mob/clothing/under/lawyer_galaxy.dmi'
@@ -13,6 +13,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/mime/sexy
name = "sexy mime outfit"
@@ -18,6 +18,7 @@
can_adjust = FALSE
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/civilian/curator/treasure_hunter
name = "treasure hunter uniform"
@@ -33,6 +33,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/captain/parade
name = "captain's formal uniform"
@@ -21,6 +21,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/engineering/atmospheric_technician
desc = "It's a jumpsuit worn by atmospheric technicians. Made from fire resistant materials."
@@ -36,6 +37,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/engineering/engineer
desc = "It's an orange high visibility jumpsuit worn by engineers. Made from fire resistant materials."
@@ -59,3 +61,4 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
@@ -18,6 +18,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/medical/chief_medical_officer
desc = "It's a jumpsuit worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection."
@@ -33,6 +34,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/medical/chief_medical_officer/turtleneck
name = "chief medical officer's turtleneck"
@@ -51,6 +53,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/medical/virologist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it."
@@ -66,6 +69,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/medical/scrubs
name = "medical scrubs"
@@ -98,6 +102,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/medical/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."
@@ -116,6 +121,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/medical/doctor/nurse
desc = "It's a jumpsuit commonly worn by nursing staff in the medical department."
+6
View File
@@ -23,6 +23,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/rnd/research_director/alt
desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants."
@@ -40,6 +41,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/rnd/research_director/turtleneck
desc = "A dark purple turtleneck and tan khakis, for a director with a superior sense of style."
@@ -57,6 +59,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/rnd/scientist
desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist."
@@ -73,6 +76,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/rnd/roboticist
desc = "It's a slimming black with reinforced seams; great for industrial work."
@@ -89,6 +93,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/rnd/geneticist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
@@ -106,3 +111,4 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
@@ -37,6 +37,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/security/officer/blueshirt
name = "blue shirt and tie"
@@ -81,6 +82,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/security/warden/formal
desc = "The insignia on this uniform tells you that this uniform belongs to the Warden."
@@ -108,6 +110,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
alt_covers_chest = TRUE
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/security/detective/noir
name = "noir suit"
@@ -125,6 +128,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
alt_covers_chest = TRUE
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/*
* Head of Security
@@ -145,6 +149,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/security/head_of_security/grey
name = "head of security's grey jumpsuit"
@@ -168,6 +173,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
alt_covers_chest = TRUE
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/security/head_of_security/parade
name = "head of security's parade uniform"
@@ -230,6 +236,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/rank/security/officer/beatcop
name = "space police uniform"
+1 -1
View File
@@ -4,7 +4,7 @@
gender = PLURAL
body_parts_covered = GROIN
female_sprite_flags = NO_FEMALE_UNIFORM
mutantrace_variation = MUTANTRACE_VARIATION
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION
can_adjust = FALSE
icon = 'icons/obj/clothing/under/shorts_pants.dmi'
worn_icon = 'icons/mob/clothing/under/shorts_pants.dmi'
@@ -2,6 +2,7 @@
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
can_adjust = FALSE
body_parts_covered = CHEST|GROIN
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
icon = 'icons/obj/clothing/under/dress.dmi'
worn_icon = 'icons/mob/clothing/under/dress.dmi'
+3
View File
@@ -18,6 +18,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY|FEMALE_UNIFORM_NO_BREASTS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/suit/sl
desc = "It's a very amish looking suit."
@@ -53,6 +54,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY|FEMALE_UNIFORM_NO_BREASTS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/suit/black_really
name = "executive suit"
@@ -68,6 +70,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY|FEMALE_UNIFORM_NO_BREASTS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/suit/green
name = "green suit"
+2
View File
@@ -19,6 +19,7 @@
alt_covers_chest = TRUE
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
dying_key = DYE_REGISTRY_JUMPSKIRT
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/syndicate/bloodred
name = "blood-red sneaksuit"
@@ -51,6 +52,7 @@
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40)
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
dying_key = DYE_REGISTRY_JUMPSKIRT
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
/obj/item/clothing/under/syndicate/sniper
name = "tactical turtleneck suit"
+11 -10
View File
@@ -13,13 +13,14 @@
cards += generate_card("[card]")
/obj/item/toy/cards/deck/wizoff/examine_more(mob/user)
var/list/msg = list(span_notice("Remember the rules of Wiz-Off!"))
msg += "\t[span_info("Each player draws 5 cards.")]"
msg += "\t[span_info("There are five rounds. Each round, a player selects a card to play, and the winner is selected based on the following rules:")]"
msg += "\t[span_info("Defensive beats Offensive!")]"
msg += "\t[span_info("Offensive beats Utility!")]"
msg += "\t[span_info("Utility beats Defensive!")]"
msg += "\t[span_info("If both players play the same type of spell, the higher number wins!")]"
msg += "\t[span_info("The player who wins the most of the 5 rounds wins the game!")]"
msg += "\t[span_notice("Now get ready to battle for the fate of the universe: Wiz-Off!")]"
return msg
. = ..()
. += span_notice("Remember the rules of Wiz-Off!")
. += "\t[span_info("Each player draws 5 cards.")]"
. += "\t[span_info("There are five rounds. Each round, a player selects a card to play, and the winner is selected based on the following rules:")]"
. += "\t[span_info("Defensive beats Offensive!")]"
. += "\t[span_info("Offensive beats Utility!")]"
. += "\t[span_info("Utility beats Defensive!")]"
. += "\t[span_info("If both players play the same type of spell, the higher number wins!")]"
. += "\t[span_info("The player who wins the most of the 5 rounds wins the game!")]"
. += "\t[span_notice("Now get ready to battle for the fate of the universe: Wiz-Off!")]"
return .
+1 -1
View File
@@ -455,7 +455,7 @@
if(require_human)
player_client.prefs.randomise["species"] = FALSE
player_client.prefs.safe_transfer_prefs_to(src, TRUE, is_antag)
if (require_human && !ishumanbasic(src))
if(require_human && !ishumanbasic(src))
set_species(/datum/species/human)
dna.species.roundstart_changed = TRUE
apply_pref_name(/datum/preference/name/backup_human, player_client)
@@ -205,7 +205,7 @@
worn_icon_state = "[base_icon_state]_impregnated"
var/obj/item/bodypart/chest/LC = target.get_bodypart(BODY_ZONE_CHEST)
if((!LC || LC.status != BODYPART_ROBOTIC) && !target.getorgan(/obj/item/organ/body_egg/alien_embryo))
if((!LC || IS_ORGANIC_LIMB(LC)) && !target.getorgan(/obj/item/organ/body_egg/alien_embryo))
new /obj/item/organ/body_egg/alien_embryo(target)
var/turf/T = get_turf(target)
log_game("[key_name(target)] was impregnated by a facehugger at [loc_name(T)]")
+34 -26
View File
@@ -1,7 +1,6 @@
/mob/living/carbon/Initialize(mapload)
. = ..()
create_reagents(1000, REAGENT_HOLDER_ALIVE)
assign_bodypart_ownership()
update_body_parts() //to update the carbon's new bodyparts appearance
register_context()
@@ -356,7 +355,7 @@
return FALSE
visible_message(span_danger("[src] manages to [cuff_break ? "break" : "remove"] [I]!"))
to_chat(src, span_notice("You successfully [cuff_break ? "break" : "remove"] [I]."))
if(cuff_break)
. = !((I == handcuffed) || (I == legcuffed))
qdel(I)
@@ -1013,6 +1012,7 @@
///Proc to hook behavior on bodypart additions.
/mob/living/carbon/proc/add_bodypart(obj/item/bodypart/new_bodypart)
bodyparts += new_bodypart
new_bodypart.owner = src
switch(new_bodypart.body_part)
if(LEG_LEFT, LEG_RIGHT)
@@ -1028,7 +1028,6 @@
///Proc to hook behavior on bodypart removals.
/mob/living/carbon/proc/remove_bodypart(obj/item/bodypart/old_bodypart)
bodyparts -= old_bodypart
switch(old_bodypart.body_part)
if(LEG_LEFT, LEG_RIGHT)
set_num_legs(num_legs - 1)
@@ -1062,43 +1061,52 @@
if(href_list[VV_HK_MODIFY_BODYPART])
if(!check_rights(R_SPAWN))
return
var/edit_action = input(usr, "What would you like to do?","Modify Body Part") as null|anything in list("add","remove", "augment")
var/edit_action = input(usr, "What would you like to do?","Modify Body Part") as null|anything in list("replace","remove")
if(!edit_action)
return
var/list/limb_list = list()
if(edit_action == "remove" || edit_action == "augment")
for(var/obj/item/bodypart/B in bodyparts)
if(edit_action == "remove")
for(var/obj/item/bodypart/B as anything in bodyparts)
limb_list += B.body_zone
if(edit_action == "remove")
limb_list -= BODY_ZONE_CHEST
else
limb_list = list(BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
for(var/obj/item/bodypart/B in bodyparts)
limb_list -= B.body_zone
var/result = input(usr, "Please choose which body part to [edit_action]","[capitalize(edit_action)] Body Part") as null|anything in sort_list(limb_list)
limb_list = list(BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_CHEST)
var/result = input(usr, "Please choose which bodypart to [edit_action]","[capitalize(edit_action)] Bodypart") as null|anything in sort_list(limb_list)
if(result)
var/obj/item/bodypart/BP = get_bodypart(result)
var/list/limbtypes = list()
switch(result)
if(BODY_ZONE_CHEST)
limbtypes = typesof(/obj/item/bodypart/chest)
if(BODY_ZONE_R_ARM)
limbtypes = typesof(/obj/item/bodypart/r_arm)
if(BODY_ZONE_L_ARM)
limbtypes = typesof(/obj/item/bodypart/l_arm)
if(BODY_ZONE_HEAD)
limbtypes = typesof(/obj/item/bodypart/head)
if(BODY_ZONE_L_LEG)
limbtypes = typesof(/obj/item/bodypart/l_leg)
if(BODY_ZONE_R_LEG)
limbtypes = typesof(/obj/item/bodypart/r_leg)
switch(edit_action)
if("remove")
if(BP)
BP.drop_limb()
BP.drop_limb(special = TRUE)
admin_ticket_log("[key_name_admin(usr)] has removed [src]'s [parse_zone(BP.body_zone)]")
else
to_chat(usr, span_boldwarning("[src] doesn't have such bodypart."))
if("add")
if(BP)
to_chat(usr, span_boldwarning("[src] already has such bodypart."))
admin_ticket_log("[key_name_admin(usr)] has attempted to modify the bodyparts of [src]")
if("replace")
var/limb2add = input(usr, "Select a bodypart type to add", "Add/Replace Bodypart") as null|anything in sort_list(limbtypes)
var/obj/item/bodypart/new_bp = new limb2add()
if(new_bp.replace_limb(src, special = TRUE))
admin_ticket_log("key_name_admin(usr)] has replaced [src]'s [BP.type] with [new_bp.type]")
qdel(BP)
else
if(!regenerate_limb(result))
to_chat(usr, span_boldwarning("[src] cannot have such bodypart."))
if("augment")
if(ishuman(src))
if(BP)
BP.change_bodypart_status(BODYPART_ROBOTIC, TRUE, TRUE)
else
to_chat(usr, span_boldwarning("[src] doesn't have such bodypart."))
else
to_chat(usr, span_boldwarning("Only humans can be augmented."))
admin_ticket_log("[key_name_admin(usr)] has modified the bodyparts of [src]")
to_chat(usr, "Failed to replace bodypart! They might be incompatible.")
admin_ticket_log("[key_name_admin(usr)] has attempted to modify the bodyparts of [src]")
if(href_list[VV_HK_MAKE_AI])
if(!check_rights(R_SPAWN))
return
@@ -84,11 +84,11 @@
if(!affecting) //missing limb? we select the first bodypart (you can never have zero, because of chest)
affecting = bodyparts[1]
SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting)
send_item_attack_message(I, user, affecting.name, affecting)
send_item_attack_message(I, user, parse_zone(affecting.body_zone), affecting)
if(I.force)
var/attack_direction = get_dir(user, src)
apply_damage(I.force, I.damtype, affecting, wound_bonus = I.wound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness(), attack_direction = attack_direction)
if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC)
if(I.damtype == BRUTE && IS_ORGANIC_LIMB(affecting))
if(prob(33))
I.add_mob_blood(src)
var/turf/location = get_turf(src)
@@ -721,7 +721,7 @@
. = health
for (var/_limb in bodyparts)
var/obj/item/bodypart/limb = _limb
if (limb.status != BODYPART_ORGANIC)
if (!IS_ORGANIC_LIMB(limb))
. += (limb.brute_dam * limb.body_damage_coeff) + (limb.burn_dam * limb.body_damage_coeff)
/mob/living/carbon/grabbedby(mob/living/carbon/user, supress_message = FALSE)
@@ -74,7 +74,8 @@
/// A collection of arms (or actually whatever the fug /bodyparts you monsters use to wreck my systems)
var/list/hand_bodyparts = list()
var/icon_render_key = ""
///A cache of bodypart = icon to prevent excessive icon creation.
var/list/icon_render_keys = list()
var/static/list/limb_icon_cache = list()
//halucination vars

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