mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
I hate radiation and stupid things, new admin button to fix it and cleanable overhaul (#10544)
* REEEEEE 6 Hours * EEEE * Runtime1 * Linter brr * e * LINTER * Creamy Goodness * REEEE
This commit is contained in:
@@ -1,18 +1,19 @@
|
||||
//Cleaning tool strength
|
||||
// 1 is also a valid cleaning strength but completely unused so left undefined
|
||||
#define CLEAN_WEAK 2
|
||||
/// Acceptable tools
|
||||
#define CLEAN_MEDIUM 3
|
||||
/// Industrial strength
|
||||
#define CLEAN_STRONG 4
|
||||
/// Cleaning strong enough your granny would be proud
|
||||
#define CLEAN_IMPRESSIVE 5
|
||||
/// Cleans things spotless down to the atomic structure
|
||||
#define CLEAN_GOD 6
|
||||
/// Never cleaned
|
||||
#define CLEAN_NEVER 7
|
||||
// Cleaning flags
|
||||
|
||||
//How strong things have to be to wipe forensic evidence...
|
||||
#define CLEAN_STRENGTH_FINGERPRINTS CLEAN_IMPRESSIVE
|
||||
#define CLEAN_STRENGTH_BLOOD CLEAN_WEAK
|
||||
#define CLEAN_STRENGTH_FIBERS CLEAN_IMPRESSIVE
|
||||
// Different kinds of things that can be cleaned.
|
||||
// Use these when overriding the wash proc or registering for the clean signals to check if your thing should be cleaned
|
||||
#define CLEAN_TYPE_BLOOD (1 << 0)
|
||||
#define CLEAN_TYPE_RUNES (1 << 1)
|
||||
#define CLEAN_TYPE_FINGERPRINTS (1 << 2)
|
||||
#define CLEAN_TYPE_FIBERS (1 << 3)
|
||||
#define CLEAN_TYPE_RADIATION (1 << 4)
|
||||
#define CLEAN_TYPE_DISEASE (1 << 5)
|
||||
#define CLEAN_TYPE_WEAK (1 << 6) // Special type, add this flag to make some cleaning processes non-instant. Currently only used for showers when removing radiation.
|
||||
#define CLEAN_TYPE_PAINT (1 << 7)
|
||||
|
||||
// Different cleaning methods.
|
||||
// Use these when calling the wash proc for your cleaning apparatus
|
||||
#define CLEAN_WASH (CLEAN_TYPE_BLOOD | CLEAN_TYPE_RUNES | CLEAN_TYPE_DISEASE)
|
||||
#define CLEAN_SCRUB (CLEAN_WASH | CLEAN_TYPE_FINGERPRINTS | CLEAN_TYPE_FIBERS | CLEAN_TYPE_PAINT)
|
||||
#define CLEAN_RAD CLEAN_TYPE_RADIATION
|
||||
#define CLEAN_ALL (ALL & ~CLEAN_TYPE_WEAK)
|
||||
|
||||
@@ -306,6 +306,11 @@
|
||||
#define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool.
|
||||
#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength)
|
||||
|
||||
//Creamed
|
||||
|
||||
///called when you wash your face at a sink: (num/strength)
|
||||
#define COMSIG_COMPONENT_CLEAN_FACE_ACT "clean_face_act"
|
||||
|
||||
//Food
|
||||
#define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder)
|
||||
|
||||
|
||||
@@ -45,6 +45,10 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
|
||||
#define ADMIN_SPAWNED_1 (1<<15)
|
||||
/// should not get harmed if this gets caught by an explosion?
|
||||
#define PREVENT_CONTENTS_EXPLOSION_1 (1<<16)
|
||||
/// should the contents of this atom be acted upon
|
||||
#define RAD_PROTECT_CONTENTS_1 (1 << 17)
|
||||
/// should this object be allowed to be contaminated
|
||||
#define RAD_NO_CONTAMINATE_1 (1 << 18)
|
||||
|
||||
//turf-only flags
|
||||
#define NOJAUNT_1 (1<<0)
|
||||
@@ -128,10 +132,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
|
||||
#define MOBILITY_FLAGS_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_PICKUP | MOBILITY_USE | MOBILITY_UI | MOBILITY_STORAGE | MOBILITY_PULL)
|
||||
#define MOBILITY_FLAGS_INTERACTION (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_UI | MOBILITY_STORAGE)
|
||||
|
||||
// radiation
|
||||
#define RAD_PROTECT_CONTENTS (1<<0)
|
||||
#define RAD_NO_CONTAMINATE (1<<1)
|
||||
|
||||
//alternate appearance flags
|
||||
#define AA_TARGET_SEE_APPEARANCE (1<<0)
|
||||
#define AA_MATCH_TARGET_OVERLAYS (1<<1)
|
||||
|
||||
@@ -214,7 +214,7 @@ GLOBAL_LIST_INIT(heavyfootmob, typecacheof(list(
|
||||
|
||||
#define ismecha(A) (istype(A, /obj/mecha))
|
||||
|
||||
#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable
|
||||
#define ismopable(A) (A.layer <= HIGH_SIGIL_LAYER) //If something can be cleaned by floor-cleaning devices such as mops or clean bots
|
||||
|
||||
#define isorgan(A) (istype(A, /obj/item/organ))
|
||||
|
||||
|
||||
@@ -91,6 +91,7 @@
|
||||
#define TRAIT_RESISTLOWPRESSURE "resist_low_pressure"
|
||||
#define TRAIT_BOMBIMMUNE "bomb_immunity"
|
||||
#define TRAIT_RADIMMUNE "rad_immunity"
|
||||
#define TRAIT_GENELESS "geneless"
|
||||
#define TRAIT_VIRUSIMMUNE "virus_immunity"
|
||||
#define TRAIT_PIERCEIMMUNE "pierce_immunity"
|
||||
#define TRAIT_NODISMEMBER "dismember_immunity"
|
||||
|
||||
@@ -19,3 +19,56 @@
|
||||
#define VV_RESTORE_DEFAULT "Restore to Default"
|
||||
#define VV_MARKED_DATUM "Marked Datum"
|
||||
#define VV_BITFIELD "Bitfield"
|
||||
#define VV_TEXT_LOCATE "Custom Reference Locate"
|
||||
#define VV_PROCCALL_RETVAL "Return Value of Proccall"
|
||||
#define VV_NORMAL_LIST_NO_EXPAND_THRESHOLD 50
|
||||
#define VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD 150
|
||||
//#define IS_VALID_ASSOC_KEY(V) (istext(V) || ispath(V) || isdatum(V) || islist(V))
|
||||
#define IS_VALID_ASSOC_KEY(V) (!isnum(V)) //hhmmm..
|
||||
//General helpers
|
||||
#define VV_HREF_TARGET_INTERNAL(target, href_key) "?_src_=vars;[HrefToken()];[href_key]=TRUE;[VV_HK_TARGET]=[REF(target)]"
|
||||
#define VV_HREF_TARGETREF_INTERNAL(targetref, href_key) "?_src_=vars;[HrefToken()];[href_key]=TRUE;[VV_HK_TARGET]=[targetref]"
|
||||
#define VV_HREF_TARGET(target, href_key, text) "<a href='[VV_HREF_TARGET_INTERNAL(target, href_key)]'>[text]</a>"
|
||||
#define VV_HREF_TARGETREF(targetref, href_key, text) "<a href='[VV_HREF_TARGETREF_INTERNAL(targetref, href_key)]'>[text]</a>"
|
||||
#define VV_HREF_TARGET_1V(target, href_key, text, varname) "<a href='[VV_HREF_TARGET_INTERNAL(target, href_key)];[VV_HK_VARNAME]=[varname]'>[text]</a>" //for stuff like basic varedits, one variable
|
||||
#define VV_HREF_TARGETREF_1V(targetref, href_key, text, varname) "<a href='[VV_HREF_TARGETREF_INTERNAL(targetref, href_key)];[VV_HK_VARNAME]=[varname]'>[text]</a>"
|
||||
#define GET_VV_TARGET locate(href_list[VV_HK_TARGET])
|
||||
#define GET_VV_VAR_TARGET href_list[VV_HK_VARNAME]
|
||||
//Helper for getting something to vv_do_topic in general
|
||||
#define VV_TOPIC_LINK(datum, href_key, text) "<a href='?_src_=vars;[HrefToken()];[href_key]=TRUE;target=[REF(datum)]'>text</a>"
|
||||
//Helpers for vv_get_dropdown()
|
||||
#define VV_DROPDOWN_OPTION(href_key, name) . += "<option value='?_src_=vars;[HrefToken()];[href_key]=TRUE;target=[REF(src)]'>[name]</option>"
|
||||
// VV HREF KEYS
|
||||
#define VV_HK_TARGET "target"
|
||||
#define VV_HK_VARNAME "targetvar" //name or index of var for 1 variable targetting hrefs.
|
||||
// vv_do_list() keys
|
||||
#define VV_HK_LIST_ADD "listadd"
|
||||
#define VV_HK_LIST_EDIT "listedit"
|
||||
#define VV_HK_LIST_CHANGE "listchange"
|
||||
#define VV_HK_LIST_REMOVE "listremove"
|
||||
#define VV_HK_LIST_ERASE_NULLS "listnulls"
|
||||
#define VV_HK_LIST_ERASE_DUPES "listdupes"
|
||||
#define VV_HK_LIST_SHUFFLE "listshuffle"
|
||||
#define VV_HK_LIST_SET_LENGTH "listlen"
|
||||
// vv_do_basic() keys
|
||||
#define VV_HK_BASIC_EDIT "datumedit"
|
||||
#define VV_HK_BASIC_CHANGE "datumchange"
|
||||
#define VV_HK_BASIC_MASSEDIT "massedit"
|
||||
// /datum
|
||||
#define VV_HK_DELETE "delete"
|
||||
#define VV_HK_EXPOSE "expose"
|
||||
#define VV_HK_CALLPROC "proc_call"
|
||||
#define VV_HK_MARK "mark"
|
||||
#define VV_HK_ADDCOMPONENT "addcomponent"
|
||||
#define VV_HK_MODIFY_TRAITS "modtraits"
|
||||
#define VV_HK_VIEW_REFERENCES "viewreferences"
|
||||
// /atom
|
||||
#define VV_HK_MODIFY_TRANSFORM "atom_transform"
|
||||
#define VV_HK_ADD_REAGENT "addreagent"
|
||||
#define VV_HK_TRIGGER_EMP "empulse"
|
||||
#define VV_HK_TRIGGER_EXPLOSION "explode"
|
||||
#define VV_HK_AUTO_RENAME "auto_rename"
|
||||
#define VV_HK_RADIATE "radiate"
|
||||
|
||||
// /obj
|
||||
#define VV_HK_OSAY "osay"
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
if(ignored_things[thing.type])
|
||||
continue
|
||||
. += thing
|
||||
if((thing.rad_flags & RAD_PROTECT_CONTENTS) || (SEND_SIGNAL(thing, COMSIG_ATOM_RAD_PROBE) & COMPONENT_BLOCK_RADIATION))
|
||||
if((thing.flags_1 & RAD_PROTECT_CONTENTS_1) || (SEND_SIGNAL(thing, COMSIG_ATOM_RAD_PROBE) & COMPONENT_BLOCK_RADIATION))
|
||||
continue
|
||||
processing_list += thing.contents
|
||||
|
||||
@@ -45,3 +45,14 @@
|
||||
var/turf/_source_T = isturf(source) ? source : get_turf(source)
|
||||
log_game("Radiation pulse with intensity: [intensity] and range modifier: [range_modifier] in [loc_name(_source_T)] ")
|
||||
return TRUE
|
||||
|
||||
/proc/get_rad_contamination(atom/location)
|
||||
var/rad_strength = 0
|
||||
for(var/i in get_rad_contents(location)) // Yes it's intentional that you can't detect radioactive things under rad protection. Gives traitors a way to hide their glowing green rocks.
|
||||
var/atom/thing = i
|
||||
if(!thing)
|
||||
continue
|
||||
var/datum/component/radioactive/radiation = thing.GetComponent(/datum/component/radioactive)
|
||||
if(radiation && rad_strength < radiation.strength)
|
||||
rad_strength = radiation.strength
|
||||
return rad_strength
|
||||
|
||||
@@ -138,6 +138,9 @@ GLOBAL_LIST_INIT(bitfields, list(
|
||||
"TESLA_IGNORE_1" = TESLA_IGNORE_1,
|
||||
"INITIALIZED_1" = INITIALIZED_1,
|
||||
"ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1,
|
||||
"PREVENT_CONTENTS_EXPLOSION_1" = PREVENT_CONTENTS_EXPLOSION_1,
|
||||
"RAD_PROTECT_CONTENTS_1" = RAD_PROTECT_CONTENTS_1,
|
||||
"RAD_NO_CONTAMINATE_1" = RAD_NO_CONTAMINATE_1,
|
||||
),
|
||||
"clothing_flags" = list(
|
||||
"LAVAPROTECT" = LAVAPROTECT,
|
||||
@@ -176,10 +179,6 @@ GLOBAL_LIST_INIT(bitfields, list(
|
||||
"STORAGE" = MOBILITY_STORAGE,
|
||||
"PULL" = MOBILITY_PULL,
|
||||
),
|
||||
"rad_flags" = list(
|
||||
"RAD_PROTECT_CONTENTS" = RAD_PROTECT_CONTENTS,
|
||||
"RAD_NO_CONTAMINATE" = RAD_NO_CONTAMINATE,
|
||||
),
|
||||
"disease_flags" = list (
|
||||
"CURABLE" = CURABLE,
|
||||
"CAN_CARRY" = CAN_CARRY,
|
||||
|
||||
@@ -6,34 +6,23 @@
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/Clean)
|
||||
|
||||
/datum/component/cleaning/proc/Clean()
|
||||
var/atom/movable/AM = parent
|
||||
/datum/component/cleaning/proc/Clean(datum/source)
|
||||
var/atom/movable/AM = source
|
||||
var/turf/tile = AM.loc
|
||||
if(!isturf(tile))
|
||||
return
|
||||
|
||||
SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
tile.wash(CLEAN_WASH)
|
||||
for(var/A in tile)
|
||||
if(is_cleanable(A))
|
||||
qdel(A)
|
||||
else if(istype(A, /obj/item))
|
||||
// Clean small items that are lying on the ground
|
||||
if(isitem(A))
|
||||
var/obj/item/I = A
|
||||
SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
if(ismob(I.loc))
|
||||
var/mob/M = I.loc
|
||||
M.regenerate_icons()
|
||||
if(I.w_class <= WEIGHT_CLASS_SMALL && !ismob(I.loc))
|
||||
I.wash(CLEAN_WASH)
|
||||
// Clean humans that are lying down
|
||||
else if(ishuman(A))
|
||||
var/mob/living/carbon/human/cleaned_human = A
|
||||
if(!(cleaned_human.mobility_flags & MOBILITY_STAND))
|
||||
if(cleaned_human.head)
|
||||
SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
if(cleaned_human.wear_suit)
|
||||
SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
else if(cleaned_human.w_uniform)
|
||||
SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
if(cleaned_human.shoes)
|
||||
SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
cleaned_human.wash_cream()
|
||||
cleaned_human.wash(CLEAN_WASH)
|
||||
cleaned_human.regenerate_icons()
|
||||
to_chat(cleaned_human, "<span class='danger'>[AM] cleans your face!</span>")
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
var/first_dir // This only stores the dir arg from init
|
||||
|
||||
/datum/component/decal/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_NEVER, _color, _layer=TURF_LAYER, _description, _alpha=255)
|
||||
/datum/component/decal/Initialize(_icon, _icon_state, _dir, _cleanable=FALSE, _color, _layer=TURF_LAYER, _description, _alpha=255)
|
||||
if(!isatom(parent) || !generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
first_dir = _dir
|
||||
@@ -19,7 +19,7 @@
|
||||
/datum/component/decal/RegisterWithParent()
|
||||
if(first_dir)
|
||||
RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react)
|
||||
if(cleanable != CLEAN_NEVER)
|
||||
if(cleanable != FALSE)
|
||||
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react)
|
||||
if(description)
|
||||
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
|
||||
@@ -67,9 +67,10 @@
|
||||
pic.dir = turn(pic.dir, dir2angle(old_dir) - dir2angle(new_dir))
|
||||
apply()
|
||||
|
||||
/datum/component/decal/proc/clean_react(datum/source, strength)
|
||||
if(strength >= cleanable)
|
||||
/datum/component/decal/proc/clean_react(datum/source, clean_types)
|
||||
if(clean_types & cleanable)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/datum/component/decal/proc/examine(datum/source, mob/user, list/examine_list)
|
||||
examine_list += description
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/component/decal/blood
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE
|
||||
|
||||
/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_STRENGTH_BLOOD, _color, _layer=ABOVE_OBJ_LAYER)
|
||||
/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_TYPE_BLOOD, _color, _layer=ABOVE_OBJ_LAYER)
|
||||
if(!isitem(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
. = ..()
|
||||
|
||||
@@ -51,13 +51,16 @@
|
||||
fibers = null
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/clean_act(datum/source, strength)
|
||||
if(strength >= CLEAN_STRENGTH_FINGERPRINTS)
|
||||
/datum/component/forensics/proc/clean_act(datum/source, clean_types)
|
||||
if(clean_types & CLEAN_TYPE_FINGERPRINTS)
|
||||
wipe_fingerprints()
|
||||
if(strength >= CLEAN_STRENGTH_BLOOD)
|
||||
. = TRUE
|
||||
if(clean_types & CLEAN_TYPE_BLOOD)
|
||||
wipe_blood_DNA()
|
||||
if(strength >= CLEAN_STRENGTH_FIBERS)
|
||||
. = TRUE
|
||||
if(clean_types & CLEAN_TYPE_FIBERS)
|
||||
wipe_fibers()
|
||||
. = TRUE
|
||||
|
||||
/datum/component/forensics/proc/add_fingerprint_list(list/_fingerprints) //list(text)
|
||||
if(!length(_fingerprints))
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
dupe_mode = COMPONENT_DUPE_ALLOWED
|
||||
var/list/datum/disease/diseases //make sure these are the static, non-processing versions!
|
||||
var/expire_time
|
||||
var/min_clean_strength = CLEAN_WEAK
|
||||
var/required_clean_types = CLEAN_TYPE_DISEASE
|
||||
|
||||
/datum/component/infective/Initialize(list/datum/disease/_diseases, expire_in)
|
||||
if(islist(_diseases))
|
||||
@@ -34,9 +34,10 @@
|
||||
eater.ForceContractDisease(V)
|
||||
try_infect(feeder, BODY_ZONE_L_ARM)
|
||||
|
||||
/datum/component/infective/proc/clean(datum/source, clean_strength)
|
||||
if(clean_strength >= min_clean_strength)
|
||||
/datum/component/infective/proc/clean(datum/source, clean_types)
|
||||
if(clean_types & required_clean_types)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/datum/component/infective/proc/try_infect_buckle(datum/source, mob/M, force)
|
||||
if(isliving(M))
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
|
||||
|
||||
var/source
|
||||
|
||||
var/hl3_release_date //the half-life measured in ticks
|
||||
var/strength
|
||||
var/can_contaminate
|
||||
@@ -17,18 +16,16 @@
|
||||
source = _source
|
||||
hl3_release_date = _half_life
|
||||
can_contaminate = _can_contaminate
|
||||
|
||||
if(istype(parent, /atom))
|
||||
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/rad_examine)
|
||||
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/rad_clean)
|
||||
if(istype(parent, /obj/item))
|
||||
RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/rad_attack)
|
||||
RegisterSignal(parent, COMSIG_ITEM_ATTACK_OBJ, .proc/rad_attack)
|
||||
else
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
if(strength > RAD_MINIMUM_CONTAMINATION)
|
||||
SSradiation.warn(src)
|
||||
|
||||
//Let's make er glow
|
||||
//This relies on parent not being a turf or something. IF YOU CHANGE THAT, CHANGE THIS
|
||||
var/atom/movable/master = parent
|
||||
@@ -46,11 +43,11 @@
|
||||
if(!prob(50))
|
||||
return
|
||||
radiation_pulse(parent, strength, RAD_DISTANCE_COEFFICIENT*2, FALSE, can_contaminate)
|
||||
|
||||
if(!hl3_release_date)
|
||||
return
|
||||
strength -= strength / hl3_release_date
|
||||
if(strength <= RAD_BACKGROUND_RADIATION)
|
||||
qdel(src)
|
||||
return PROCESS_KILL
|
||||
|
||||
/datum/component/radioactive/proc/glow_loop(atom/movable/master)
|
||||
@@ -70,21 +67,22 @@
|
||||
else
|
||||
strength = max(strength, arguments[1])
|
||||
|
||||
/datum/component/radioactive/proc/rad_examine(datum/source, mob/user, atom/thing) //Yogs -- Mirrored!!
|
||||
/datum/component/radioactive/proc/rad_examine(datum/source, mob/user, atom/thing)
|
||||
var/atom/master = parent
|
||||
var/list/out = list()
|
||||
if(get_dist(master, user) <= 1)
|
||||
out += "The air around [master] feels warm"
|
||||
switch(strength)
|
||||
if(RAD_AMOUNT_LOW to RAD_AMOUNT_MEDIUM)
|
||||
out += "[out ? " and it " : "[master] "]feels weird to look at."
|
||||
out += "[length(out) ? " and it " : "[master] "]feels weird to look at."
|
||||
if(RAD_AMOUNT_MEDIUM to RAD_AMOUNT_HIGH)
|
||||
out += "[out ? " and it " : "[master] "]seems to be glowing a bit."
|
||||
out += "[length(out) ? " and it " : "[master] "]seems to be glowing a bit."
|
||||
if(RAD_AMOUNT_HIGH to INFINITY) //At this level the object can contaminate other objects
|
||||
out += "[out ? " and it " : "[master] "]hurts to look at."
|
||||
else
|
||||
out += "[length(out) ? " and it " : "[master] "]hurts to look at."
|
||||
if(!LAZYLEN(out))
|
||||
return
|
||||
out += "."
|
||||
to_chat(user, out.Join())
|
||||
to_chat(user, "<span class ='warning'>[out.Join()]</span>")
|
||||
|
||||
/datum/component/radioactive/proc/rad_attack(datum/source, atom/movable/target, mob/living/user)
|
||||
radiation_pulse(parent, strength/20)
|
||||
@@ -93,6 +91,21 @@
|
||||
return
|
||||
strength -= strength / hl3_release_date
|
||||
|
||||
/datum/component/radioactive/proc/rad_clean(datum/source, clean_types)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
|
||||
if(!(clean_types & CLEAN_TYPE_RADIATION))
|
||||
return
|
||||
|
||||
if(!(clean_types & CLEAN_TYPE_WEAK))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
strength = max(0, (strength - (RAD_BACKGROUND_RADIATION * 2)))
|
||||
if(strength <= RAD_BACKGROUND_RADIATION)
|
||||
qdel(src)
|
||||
|
||||
#undef RAD_AMOUNT_LOW
|
||||
#undef RAD_AMOUNT_MEDIUM
|
||||
#undef RAD_AMOUNT_HIGH
|
||||
|
||||
@@ -71,6 +71,7 @@
|
||||
/datum/component/thermite/proc/clean_react(datum/source, strength)
|
||||
//Thermite is just some loose powder, you could probably clean it with your hands. << todo?
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/datum/component/thermite/proc/flame_react(datum/source, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > 1922) // This is roughly the real life requirement to ignite thermite
|
||||
|
||||
@@ -1033,6 +1033,12 @@
|
||||
|
||||
src.cmd_admin_explosion(A)
|
||||
|
||||
else if(href_list["radiate"] && check_rights(R_FUN))
|
||||
var/atom/A = locate(href_list["radiate"])
|
||||
var/strength = input(usr, "Choose the radiation strength.", "Choose the strength.") as num|null
|
||||
if(!isnull(strength))
|
||||
A.AddComponent(/datum/component/radioactive, strength, src)
|
||||
|
||||
else if(href_list["emp"])
|
||||
if(!check_rights(R_FUN))
|
||||
return
|
||||
|
||||
@@ -109,6 +109,8 @@
|
||||
))
|
||||
if(!can_contaminate || blacklisted[thing.type])
|
||||
continue
|
||||
if(thing.flags_1 & RAD_NO_CONTAMINATE_1 || SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION)
|
||||
continue
|
||||
if(prob(contamination_chance)) // Only stronk rads get to have little baby rads
|
||||
if(SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION)
|
||||
continue
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
if(prob(40))
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.dna && !HAS_TRAIT(H, TRAIT_RADIMMUNE))
|
||||
if(H.dna && !HAS_TRAIT(H, TRAIT_GENELESS))
|
||||
if(prob(max(0,100-resist)))
|
||||
H.randmuti()
|
||||
if(prob(50))
|
||||
|
||||
@@ -64,8 +64,6 @@
|
||||
//List of datums orbiting this atom
|
||||
var/datum/component/orbiter/orbiters
|
||||
|
||||
/// Will move to flags_1 when i can be arsed to (2019, has not done so)
|
||||
var/rad_flags = NONE
|
||||
/// Radiation insulation types
|
||||
var/rad_insulation = RAD_NO_INSULATION
|
||||
|
||||
@@ -603,6 +601,24 @@
|
||||
/atom/proc/wash_cream()
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* Wash this atom
|
||||
*
|
||||
* This will clean it off any temporary stuff like blood. Override this in your item to add custom cleaning behavior.
|
||||
* Returns true if any washing was necessary and thus performed
|
||||
* Arguments:
|
||||
* * clean_types: any of the CLEAN_ constants
|
||||
*/
|
||||
/atom/proc/wash(clean_types)
|
||||
. = FALSE
|
||||
if(SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, clean_types))
|
||||
. = TRUE
|
||||
|
||||
// Basically "if has washable coloration"
|
||||
if(length(atom_colours) >= WASHABLE_COLOUR_PRIORITY && atom_colours[WASHABLE_COLOUR_PRIORITY])
|
||||
remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
return TRUE
|
||||
|
||||
///Is this atom in space
|
||||
/atom/proc/isinspace()
|
||||
if(isspaceturf(get_turf(src)))
|
||||
@@ -819,8 +835,7 @@
|
||||
///Removes an instance of colour_type from the atom's atom_colours list
|
||||
/atom/proc/remove_atom_colour(colour_priority, coloration)
|
||||
if(!atom_colours)
|
||||
atom_colours = list()
|
||||
atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently.
|
||||
return
|
||||
if(colour_priority > atom_colours.len)
|
||||
return
|
||||
if(coloration && atom_colours[colour_priority] != coloration)
|
||||
@@ -828,13 +843,11 @@
|
||||
atom_colours[colour_priority] = null
|
||||
update_atom_colour()
|
||||
|
||||
|
||||
///Resets the atom's color to null, and then sets it to the highest priority colour available
|
||||
/atom/proc/update_atom_colour()
|
||||
if(!atom_colours)
|
||||
atom_colours = list()
|
||||
atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently.
|
||||
///Resets the atom's color to null, and then sets it to the highest priority colour available
|
||||
color = null
|
||||
if(!atom_colours)
|
||||
return
|
||||
for(var/C in atom_colours)
|
||||
if(islist(C))
|
||||
var/list/L = C
|
||||
@@ -879,6 +892,7 @@
|
||||
.["Add reagent"] = "?_src_=vars;[HrefToken()];addreagent=[REF(src)]"
|
||||
.["Trigger EM pulse"] = "?_src_=vars;[HrefToken()];emp=[REF(src)]"
|
||||
.["Trigger explosion"] = "?_src_=vars;[HrefToken()];explode=[REF(src)]"
|
||||
.["Radiate"] = "?_src_=vars;[HrefToken()];radiate=[REF(src)]"
|
||||
|
||||
///Where atoms should drop if taken from this atom
|
||||
/atom/proc/drop_location()
|
||||
@@ -1103,6 +1117,12 @@
|
||||
arguments -= "priority"
|
||||
filters += filter(arglist(arguments))
|
||||
|
||||
/obj/item/update_filters()
|
||||
. = ..()
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
/atom/movable/proc/get_filter(name)
|
||||
if(filter_data && filter_data[name])
|
||||
return filters[filter_data.Find(name)]
|
||||
|
||||
@@ -1493,7 +1493,7 @@
|
||||
// this DNA can not be bad
|
||||
// is done via radiation bursts, so radiation immune carbons are not viable
|
||||
// And the DNA Scanner itself must have a valid scan level
|
||||
if(scanner_occupant.has_dna() && !HAS_TRAIT(scanner_occupant, TRAIT_RADIMMUNE) && !HAS_TRAIT(scanner_occupant, TRAIT_BADDNA) || (connected_scanner.scan_level == 3))
|
||||
if(scanner_occupant.has_dna() && !HAS_TRAIT(scanner_occupant, TRAIT_GENELESS) && !HAS_TRAIT(scanner_occupant, TRAIT_BADDNA) || (connected_scanner.scan_level == 3))
|
||||
return TRUE
|
||||
|
||||
return FALSE
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
var/list/bolt_log //yogs - Who can it be bolting all my doors? Go away, don't come down here no more.
|
||||
var/list/shocking_log //yogs - who electrified this door.
|
||||
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
rad_insulation = RAD_MEDIUM_INSULATION
|
||||
|
||||
var/static/list/airlock_overlays = list()
|
||||
|
||||
@@ -272,11 +272,9 @@
|
||||
if(occupant)
|
||||
things_to_clear += occupant
|
||||
things_to_clear += occupant.GetAllContents()
|
||||
for(var/atom/movable/AM in things_to_clear) //Scorches away blood and forensic evidence, although the SSU itself is unaffected
|
||||
SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG)
|
||||
var/datum/component/radioactive/contamination = AM.GetComponent(/datum/component/radioactive)
|
||||
if(contamination)
|
||||
qdel(contamination)
|
||||
for(var/am in things_to_clear) //Scorches away blood and forensic evidence, although the SSU itself is unaffected
|
||||
var/atom/movable/dirty_movable = am
|
||||
dirty_movable.wash(CLEAN_ALL)
|
||||
open_machine(FALSE)
|
||||
if(occupant)
|
||||
dump_contents()
|
||||
|
||||
@@ -10,10 +10,6 @@
|
||||
var/obj/item/color_source
|
||||
var/max_wash_capacity = 5
|
||||
|
||||
/obj/machinery/washing_machine/ComponentInitialize()
|
||||
. = ..()
|
||||
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_blood)
|
||||
|
||||
/obj/machinery/washing_machine/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>Alt-click it to start a wash cycle.</span>"
|
||||
@@ -56,15 +52,17 @@
|
||||
M.Translate(rand(-3, 3), rand(-1, 3))
|
||||
animate(src, transform=M, time=2)
|
||||
|
||||
/obj/machinery/washing_machine/proc/clean_blood()
|
||||
if(!busy)
|
||||
/obj/machinery/washing_machine/wash(clean_types)
|
||||
. = ..()
|
||||
if(!busy && bloody_mess && (clean_types & CLEAN_TYPE_BLOOD))
|
||||
bloody_mess = FALSE
|
||||
update_icon()
|
||||
. = TRUE
|
||||
|
||||
/obj/machinery/washing_machine/proc/wash_cycle()
|
||||
for(var/X in contents)
|
||||
var/atom/movable/AM = X
|
||||
SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
AM.wash(CLEAN_WASH)
|
||||
AM.machine_wash(src)
|
||||
|
||||
busy = FALSE
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
return TRUE
|
||||
|
||||
/obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food/drinks))
|
||||
if((istype(W, /obj/item/reagent_containers/glass) && !istype(W, /obj/item/reagent_containers/glass/rag)) || istype(W, /obj/item/reagent_containers/food/drinks))
|
||||
if(src.reagents && W.reagents)
|
||||
. = 1 //so the containers don't splash their content on the src while scooping.
|
||||
if(!src.reagents.total_volume)
|
||||
@@ -99,3 +99,8 @@
|
||||
return bloodiness
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/effect/decal/cleanable/wash(clean_types)
|
||||
..()
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
@@ -45,4 +45,4 @@
|
||||
var/turf/T = loc
|
||||
if(!istype(T)) //you know this will happen somehow
|
||||
CRASH("Turf decal initialized in an object/nullspace")
|
||||
T.AddComponent(/datum/component/decal, icon, icon_state, dir, CLEAN_NEVER, color, null, null, alpha)
|
||||
T.AddComponent(/datum/component/decal, icon, icon_state, dir, FALSE, color, null, null, alpha)
|
||||
|
||||
@@ -815,3 +815,11 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
///Returns the temperature of src. If you want to know if an item is hot use this proc.
|
||||
/obj/item/proc/get_temperature()
|
||||
return heat
|
||||
|
||||
// Update icons if this is being carried by a mob
|
||||
/obj/item/wash(clean_types)
|
||||
. = ..()
|
||||
|
||||
if(ismob(loc))
|
||||
var/mob/mob_loc = loc
|
||||
mob_loc.regenerate_icons()
|
||||
|
||||
@@ -118,10 +118,8 @@
|
||||
user.visible_message("[user] begins to clean \the [target.name] with [src]...", "<span class='notice'>You begin to clean \the [target.name] with [src]...</span>")
|
||||
if(do_after(user, src.cleanspeed, target = target))
|
||||
to_chat(user, "<span class='notice'>You clean \the [target.name].</span>")
|
||||
for(var/obj/effect/decal/cleanable/C in target)
|
||||
qdel(C)
|
||||
target.wash(CLEAN_SCRUB)
|
||||
target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
SEND_SIGNAL(target, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
|
||||
target.wash_cream()
|
||||
decreaseUses(user)
|
||||
return
|
||||
|
||||
@@ -144,14 +144,7 @@
|
||||
return TRUE
|
||||
|
||||
/obj/item/geiger_counter/proc/scan(atom/A, mob/user)
|
||||
var/rad_strength = 0
|
||||
for(var/i in get_rad_contents(A)) // Yes it's intentional that you can't detect radioactive things under rad protection. Gives traitors a way to hide their glowing green rocks.
|
||||
var/atom/thing = i
|
||||
if(!thing)
|
||||
continue
|
||||
var/datum/component/radioactive/radiation = thing.GetComponent(/datum/component/radioactive)
|
||||
if(radiation)
|
||||
rad_strength += radiation.strength
|
||||
var/rad_strength = get_rad_contamination(A)
|
||||
|
||||
if(isliving(A))
|
||||
var/mob/living/M = A
|
||||
|
||||
@@ -708,7 +708,7 @@ GENE SCANNER
|
||||
|
||||
/obj/item/sequence_scanner/attack(mob/living/M, mob/living/carbon/human/user)
|
||||
add_fingerprint(user)
|
||||
if (!HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M, TRAIT_BADDNA)) //no scanning if its a husk or DNA-less Species
|
||||
if (!HAS_TRAIT(M, TRAIT_GENELESS) && !HAS_TRAIT(M, TRAIT_BADDNA)) //no scanning if its a husk or DNA-less Species
|
||||
user.visible_message("<span class='notice'>[user] has analyzed [M]'s genetic sequence.</span>")
|
||||
gene_scan(M, user)
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/item/dnainjector/proc/inject(mob/living/carbon/M, mob/user)
|
||||
if(M.has_dna() && !HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M, TRAIT_BADDNA))
|
||||
if(M.has_dna() && !HAS_TRAIT(M, TRAIT_GENELESS) && !HAS_TRAIT(M, TRAIT_BADDNA))
|
||||
M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2))
|
||||
var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]"
|
||||
for(var/HM in remove_mutations)
|
||||
@@ -515,7 +515,7 @@
|
||||
var/filled = FALSE
|
||||
|
||||
/obj/item/dnainjector/activator/inject(mob/living/carbon/M, mob/user)
|
||||
if(M.has_dna() && !HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M, TRAIT_BADDNA))
|
||||
if(M.has_dna() && !HAS_TRAIT(M, TRAIT_GENELESS) && !HAS_TRAIT(M, TRAIT_BADDNA))
|
||||
M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2))
|
||||
var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]"
|
||||
for(var/mutation in add_mutations)
|
||||
|
||||
@@ -26,10 +26,7 @@
|
||||
|
||||
/obj/item/mop/proc/clean(turf/A)
|
||||
if(reagents.has_reagent(/datum/reagent/water, 1) || reagents.has_reagent(/datum/reagent/water/holywater, 1) || reagents.has_reagent(/datum/reagent/consumable/ethanol/vodka, 1) || reagents.has_reagent(/datum/reagent/space_cleaner, 1))
|
||||
SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
|
||||
for(var/obj/effect/O in A)
|
||||
if(is_cleanable(O))
|
||||
qdel(O)
|
||||
A.wash(CLEAN_SCRUB)
|
||||
reagents.reaction(A, TOUCH, 10) //Needed for proper floor wetting.
|
||||
reagents.remove_any(1) //reaction() doesn't use up the reagents
|
||||
|
||||
|
||||
@@ -353,7 +353,7 @@
|
||||
icon_state = "dualsaber[item_color][wielded]"
|
||||
else
|
||||
icon_state = "dualsaber0"
|
||||
SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_TYPE_BLOOD)
|
||||
|
||||
/obj/item/twohanded/dualsaber/attack(mob/target, mob/living/carbon/human/user)
|
||||
if(user.has_dna())
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
smooth = SMOOTH_TRUE
|
||||
can_be_unanchored = FALSE
|
||||
CanAtmosPass = ATMOS_PASS_DENSITY
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
rad_insulation = RAD_MEDIUM_INSULATION
|
||||
var/mineral = /obj/item/stack/sheet/metal
|
||||
var/mineral_amount = 2
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
var/girderpasschance = 20 // percentage chance that a projectile passes through the girder.
|
||||
var/can_displace = TRUE //If the girder can be moved around by wrenching it
|
||||
max_integrity = 200
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
rad_insulation = RAD_VERY_LIGHT_INSULATION
|
||||
|
||||
/obj/structure/girder/examine(mob/user)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
icon_state = "grille"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
flags_1 = CONDUCT_1
|
||||
flags_1 = CONDUCT_1 | RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
pressure_resistance = 5*ONE_ATMOSPHERE
|
||||
armor = list("melee" = 50, "bullet" = 70, "laser" = 70, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0)
|
||||
max_integrity = 50
|
||||
@@ -20,7 +20,6 @@
|
||||
var/rods_broken = TRUE
|
||||
var/grille_type = null
|
||||
var/broken_type = null
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
FASTDMM_PROP(\
|
||||
pipe_astar_cost = 1\
|
||||
)
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
|
||||
/obj/structure/holosign/barrier/engineering
|
||||
icon_state = "holosign_engi"
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
rad_insulation = RAD_LIGHT_INSULATION
|
||||
|
||||
/obj/structure/holosign/barrier/atmos
|
||||
@@ -101,7 +101,7 @@
|
||||
anchored = TRUE
|
||||
CanAtmosPass = ATMOS_PASS_NO
|
||||
alpha = 150
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
rad_insulation = RAD_LIGHT_INSULATION
|
||||
|
||||
/obj/structure/holosign/barrier/atmos/Initialize()
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
max_integrity = 200
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 50, "acid" = 50)
|
||||
CanAtmosPass = ATMOS_PASS_DENSITY
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
rad_insulation = RAD_MEDIUM_INSULATION
|
||||
|
||||
var/door_opened = FALSE //if it's open or not.
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/shower/wrench_act(mob/living/user, obj/item/I)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>You begin to adjust the temperature valve with \the [I]...</span>")
|
||||
if(I.use_tool(src, user, 50))
|
||||
switch(current_temperature)
|
||||
@@ -64,10 +65,9 @@
|
||||
handle_mist()
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/machinery/shower/update_icon()
|
||||
. = ..()
|
||||
cut_overlays()
|
||||
|
||||
if(on)
|
||||
add_overlay(mutable_appearance('icons/obj/watercloset.dmi', "water", ABOVE_MOB_LAYER))
|
||||
|
||||
@@ -98,109 +98,21 @@
|
||||
wash_atom(AM)
|
||||
|
||||
/obj/machinery/shower/proc/wash_atom(atom/A)
|
||||
SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
A.wash(CLEAN_RAD | CLEAN_TYPE_WEAK) // Clean radiation non-instantly
|
||||
A.wash(CLEAN_WASH)
|
||||
SEND_SIGNAL(A, COMSIG_ADD_MOOD_EVENT, "shower", /datum/mood_event/nice_shower)
|
||||
reagents.reaction(A, TOUCH, reaction_volume)
|
||||
|
||||
if(isobj(A))
|
||||
wash_obj(A)
|
||||
else if(isturf(A))
|
||||
wash_turf(A)
|
||||
else if(isliving(A))
|
||||
wash_mob(A)
|
||||
if(isliving(A))
|
||||
check_heat(A)
|
||||
|
||||
contamination_cleanse(A)
|
||||
|
||||
/obj/machinery/shower/proc/wash_obj(obj/O)
|
||||
. = SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
|
||||
|
||||
/obj/machinery/shower/proc/wash_turf(turf/tile)
|
||||
SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
tile.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
for(var/obj/effect/E in tile)
|
||||
if(is_cleanable(E))
|
||||
qdel(E)
|
||||
|
||||
|
||||
/obj/machinery/shower/proc/wash_mob(mob/living/L)
|
||||
SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
L.wash_cream()
|
||||
L.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "shower", /datum/mood_event/nice_shower)
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/M = L
|
||||
. = TRUE
|
||||
for(var/I in M.held_items)
|
||||
if(isobj(I))
|
||||
wash_obj(I)
|
||||
|
||||
if(M.back && wash_obj(M.back))
|
||||
M.update_inv_back(0)
|
||||
|
||||
var/list/obscured = M.check_obscured_slots()
|
||||
|
||||
if(M.head && wash_obj(M.head))
|
||||
M.update_inv_head()
|
||||
|
||||
if(M.glasses && !(SLOT_GLASSES in obscured) && wash_obj(M.glasses))
|
||||
M.update_inv_glasses()
|
||||
|
||||
if(M.wear_mask && !(SLOT_WEAR_MASK in obscured) && wash_obj(M.wear_mask))
|
||||
M.update_inv_wear_mask()
|
||||
|
||||
if(M.ears && !(HIDEEARS in obscured) && wash_obj(M.ears))
|
||||
M.update_inv_ears()
|
||||
|
||||
if(M.wear_neck && !(SLOT_NECK in obscured) && wash_obj(M.wear_neck))
|
||||
M.update_inv_neck()
|
||||
|
||||
if(M.shoes && !(HIDESHOES in obscured) && wash_obj(M.shoes))
|
||||
M.update_inv_shoes()
|
||||
|
||||
var/washgloves = FALSE
|
||||
if(M.gloves && !(HIDEGLOVES in obscured))
|
||||
washgloves = TRUE
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
|
||||
if(H.wear_suit && wash_obj(H.wear_suit))
|
||||
H.update_inv_wear_suit()
|
||||
else if(H.w_uniform && wash_obj(H.w_uniform))
|
||||
H.update_inv_w_uniform()
|
||||
|
||||
if(washgloves)
|
||||
SEND_SIGNAL(H, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
|
||||
if(!H.is_mouth_covered())
|
||||
H.lip_style = null
|
||||
H.update_body()
|
||||
|
||||
if(H.belt && wash_obj(H.belt))
|
||||
H.update_inv_belt()
|
||||
else
|
||||
SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
else
|
||||
SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
|
||||
/obj/machinery/shower/proc/contamination_cleanse(atom/thing)
|
||||
var/datum/component/radioactive/healthy_green_glow = thing.GetComponent(/datum/component/radioactive)
|
||||
if(!healthy_green_glow || QDELETED(healthy_green_glow))
|
||||
return
|
||||
var/strength = healthy_green_glow.strength
|
||||
if(strength <= RAD_BACKGROUND_RADIATION)
|
||||
qdel(healthy_green_glow)
|
||||
return
|
||||
healthy_green_glow.strength -= max(0, (healthy_green_glow.strength - (RAD_BACKGROUND_RADIATION * 2)) * 0.2)
|
||||
|
||||
/obj/machinery/shower/process()
|
||||
if(on)
|
||||
wash_atom(loc)
|
||||
for(var/AM in loc)
|
||||
wash_atom(AM)
|
||||
for(var/am in loc)
|
||||
var/atom/movable/movable_content = am
|
||||
if(!ismopable(movable_content)) // Mopables will be cleaned anyways by the turf wash above
|
||||
wash_atom(movable_content)
|
||||
else
|
||||
return PROCESS_KILL
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
max_integrity = 100
|
||||
armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
var/buildable_sign = 1 //unwrenchable and modifiable
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
|
||||
/obj/structure/sign/basic
|
||||
name = "blank sign"
|
||||
|
||||
@@ -252,18 +252,20 @@
|
||||
|
||||
busy = FALSE
|
||||
|
||||
user.visible_message("<span class='notice'>[user] washes [user.p_their()] [washing_face ? "face" : "hands"] using [src].</span>", \
|
||||
"<span class='notice'>You wash your [washing_face ? "face" : "hands"] using [src].</span>")
|
||||
if(washing_face)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.lip_style = null //Washes off lipstick
|
||||
H.lip_color = initial(H.lip_color)
|
||||
H.wash_cream()
|
||||
H.regenerate_icons()
|
||||
SEND_SIGNAL(user, COMSIG_COMPONENT_CLEAN_FACE_ACT, CLEAN_WASH)
|
||||
user.drowsyness = max(user.drowsyness - rand(2,3), 0) //Washing your face wakes you up if you're falling asleep
|
||||
else if(ishuman(user))
|
||||
var/mob/living/carbon/human/human_user = user
|
||||
if(!human_user.wash_hands(CLEAN_WASH))
|
||||
to_chat(user, "<span class='warning'>Your hands are covered by something!</span>")
|
||||
return
|
||||
else
|
||||
SEND_SIGNAL(user, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
user.wash(CLEAN_WASH)
|
||||
|
||||
user.visible_message("<span class='notice'>[user] washes [user.p_their()] [washing_face ? "face" : "hands"] using [src].</span>", \
|
||||
"<span class='notice'>You wash your [washing_face ? "face" : "hands"] using [src].</span>")
|
||||
|
||||
/obj/structure/sink/attackby(obj/item/O, mob/living/user, params)
|
||||
if(busy)
|
||||
@@ -310,7 +312,7 @@
|
||||
//yogs start - BANDAGES
|
||||
if(istype(O, /obj/item/medical/bandage/))
|
||||
var/obj/item/medical/bandage/B = O
|
||||
B.wash(O, user)
|
||||
B.wash2(O, user)
|
||||
return
|
||||
//yogs end
|
||||
|
||||
@@ -326,7 +328,7 @@
|
||||
busy = FALSE
|
||||
return 1
|
||||
busy = FALSE
|
||||
SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
O.wash(CLEAN_WASH)
|
||||
O.acid_level = 0
|
||||
create_reagents(5)
|
||||
reagents.add_reagent(dispensedreagent, 5)
|
||||
|
||||
@@ -6,14 +6,13 @@
|
||||
layer = ABOVE_OBJ_LAYER //Just above doors
|
||||
pressure_resistance = 4*ONE_ATMOSPHERE
|
||||
anchored = TRUE //initially is 0 for tile smoothing
|
||||
flags_1 = ON_BORDER_1
|
||||
flags_1 = ON_BORDER_1 | RAD_PROTECT_CONTENTS_1
|
||||
max_integrity = 25
|
||||
can_be_unanchored = TRUE
|
||||
resistance_flags = ACID_PROOF
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
|
||||
CanAtmosPass = ATMOS_PASS_PROC
|
||||
rad_insulation = RAD_VERY_LIGHT_INSULATION
|
||||
rad_flags = RAD_PROTECT_CONTENTS
|
||||
var/ini_dir = null
|
||||
var/state = WINDOW_SCREWED_TO_FRAME
|
||||
var/reinf = FALSE
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
opacity = 1
|
||||
density = TRUE
|
||||
blocks_air = TRUE
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
rad_insulation = RAD_MEDIUM_INSULATION
|
||||
|
||||
/turf/closed/Initialize()
|
||||
|
||||
@@ -331,10 +331,12 @@
|
||||
for(var/mob/living/simple_animal/slime/M in src)
|
||||
M.apply_water()
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
for(var/obj/effect/O in src)
|
||||
if(is_cleanable(O))
|
||||
qdel(O)
|
||||
wash(CLEAN_WASH)
|
||||
for(var/am in src)
|
||||
var/atom/movable/movable_content = am
|
||||
if(ismopable(movable_content)) // Will have already been washed by the wash call above at this point.
|
||||
continue
|
||||
movable_content.wash(CLEAN_WASH)
|
||||
return TRUE
|
||||
|
||||
/turf/open/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube, paralyze_amount, force_drop)
|
||||
|
||||
@@ -553,3 +553,17 @@ GLOBAL_LIST_EMPTY(station_turfs)
|
||||
. = ..()
|
||||
if(. != BULLET_ACT_FORCE_PIERCE)
|
||||
. = BULLET_ACT_TURF
|
||||
|
||||
/**
|
||||
* Called when this turf is being washed. Washing a turf will also wash any mopable floor decals
|
||||
*/
|
||||
/turf/wash(clean_types)
|
||||
. = ..()
|
||||
|
||||
for(var/am in src)
|
||||
if(am == src)
|
||||
continue
|
||||
var/atom/movable/movable_content = am
|
||||
if(!ismopable(movable_content))
|
||||
continue
|
||||
movable_content.wash(clean_types)
|
||||
|
||||
@@ -94,6 +94,7 @@ GLOBAL_PROTECT(admin_verbs_admin)
|
||||
/client/proc/give_antag_token,
|
||||
/client/proc/show_redeemable_antag_tokens,
|
||||
/datum/admins/proc/cmd_create_centcom,
|
||||
/datum/admins/proc/cmd_admin_fuckrads,
|
||||
/client/proc/admincryo
|
||||
)
|
||||
GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/ban_panel, /client/proc/stickybanpanel))
|
||||
|
||||
@@ -1276,3 +1276,15 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
var/msg = "[key_name_admin(usr)] has spawned in at centcom [ADMIN_VERBOSEJMP(usr)]."
|
||||
message_admins(msg)
|
||||
log_admin(msg)
|
||||
|
||||
/datum/admins/proc/cmd_admin_fuckrads()
|
||||
set category = "Admin.Round Interaction"
|
||||
set name = "Delete All Rads"
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
for(var/datum/a in SSradiation.processing)
|
||||
qdel(a)
|
||||
message_admins("[key_name_admin(usr)] has cleared all radiation.")
|
||||
log_admin("[key_name_admin(usr)] has cleared all radiation.")
|
||||
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
required_atoms = list(/mob/living/carbon/human)
|
||||
cost = 3
|
||||
route = PATH_ASH
|
||||
var/list/trait_list = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_BOMBIMMUNE)
|
||||
var/list/trait_list = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_BOMBIMMUNE)
|
||||
|
||||
/datum/eldritch_knowledge/final/ash_final/on_finished_recipe(mob/living/user, list/atoms, loc)
|
||||
priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear The Blaze, for Ashbringer [user.real_name] has come! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", 'sound/ai/spanomalies.ogg')
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
unique_name = TRUE
|
||||
hud_possible = list(ANTAG_HUD)
|
||||
hud_type = /datum/hud/revenant
|
||||
flags_1 = RAD_NO_CONTAMINATE_1
|
||||
|
||||
var/essence = 75 //The resource, and health, of revenants.
|
||||
var/essence_regen_cap = 75 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount.
|
||||
|
||||
@@ -11,12 +11,14 @@
|
||||
strip_delay = 20
|
||||
equip_delay_other = 40
|
||||
|
||||
/obj/item/clothing/gloves/ComponentInitialize()
|
||||
/obj/item/clothing/gloves/wash(clean_types)
|
||||
. = ..()
|
||||
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_blood)
|
||||
if((clean_types & CLEAN_TYPE_BLOOD) && transfer_blood > 0)
|
||||
transfer_blood = 0
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/gloves/proc/clean_blood(datum/source, strength)
|
||||
if(strength < CLEAN_STRENGTH_BLOOD)
|
||||
if(strength < CLEAN_TYPE_BLOOD)
|
||||
return
|
||||
transfer_blood = 0
|
||||
|
||||
|
||||
@@ -16,10 +16,6 @@
|
||||
var/equipped_before_drop = FALSE
|
||||
var/can_be_bloody = TRUE
|
||||
|
||||
/obj/item/clothing/shoes/ComponentInitialize()
|
||||
. = ..()
|
||||
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_blood)
|
||||
|
||||
/obj/item/clothing/shoes/suicide_act(mob/living/carbon/user)
|
||||
if(rand(2)>1)
|
||||
user.visible_message("<span class='suicide'>[user] begins tying \the [src] up waaay too tightly! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
@@ -77,14 +73,16 @@
|
||||
var/mob/M = loc
|
||||
M.update_inv_shoes()
|
||||
|
||||
/obj/item/clothing/shoes/proc/clean_blood(datum/source, strength)
|
||||
if(strength < CLEAN_STRENGTH_BLOOD)
|
||||
/obj/item/clothing/shoes/wash(clean_types)
|
||||
. = ..()
|
||||
if(!(clean_types & CLEAN_TYPE_BLOOD) || blood_state == BLOOD_STATE_NOT_BLOODY)
|
||||
return
|
||||
bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
|
||||
blood_state = BLOOD_STATE_NOT_BLOODY
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.update_inv_shoes()
|
||||
return TRUE
|
||||
|
||||
/obj/item/proc/negates_gravity()
|
||||
return FALSE
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
equip_delay_other = 60
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
resistance_flags = NONE
|
||||
rad_flags = RAD_PROTECT_CONTENTS
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1
|
||||
|
||||
/obj/item/clothing/suit/radiation
|
||||
name = "radiation suit"
|
||||
@@ -146,4 +146,4 @@
|
||||
equip_delay_other = 60
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
resistance_flags = NONE
|
||||
rad_flags = RAD_PROTECT_CONTENTS
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1
|
||||
|
||||
@@ -46,10 +46,10 @@
|
||||
if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects
|
||||
if(add_blood_DNA(G.return_blood_DNA()) && length(G.return_blood_DNA()) > old) //only reduces the bloodiness of our gloves if the item wasn't already bloody
|
||||
G.transfer_blood--
|
||||
else if(M.bloody_hands > 1)
|
||||
else if(M.blood_in_hands > 1)
|
||||
old = length(M.return_blood_DNA())
|
||||
if(add_blood_DNA(M.return_blood_DNA()) && length(M.return_blood_DNA()) > old)
|
||||
M.bloody_hands--
|
||||
M.blood_in_hands--
|
||||
var/datum/component/forensics/D = AddComponent(/datum/component/forensics)
|
||||
. = D.add_fibers(M)
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
G.add_blood_DNA(blood_dna)
|
||||
else if(length(blood_dna))
|
||||
AddComponent(/datum/component/forensics, null, null, blood_dna)
|
||||
bloody_hands = rand(2, 4)
|
||||
blood_in_hands = rand(2, 4)
|
||||
update_inv_gloves() //handles bloody hands overlays and updating
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
|
||||
/mob
|
||||
var/bloody_hands = 0
|
||||
|
||||
/obj/item/clothing/gloves
|
||||
var/transfer_blood = 0
|
||||
|
||||
|
||||
/obj/item/reagent_containers/glass/rag
|
||||
name = "damp rag"
|
||||
desc = "For cleaning up messes, you suppose."
|
||||
@@ -46,6 +41,4 @@
|
||||
user.visible_message("[user] starts to wipe down [A] with [src]!", "<span class='notice'>You start to wipe down [A] with [src]...</span>")
|
||||
if(do_after(user,30, target = A))
|
||||
user.visible_message("[user] finishes wiping off [A]!", "<span class='notice'>You finish wiping off [A].</span>")
|
||||
if(is_cleanable(A))
|
||||
qdel(A)
|
||||
SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
A.wash(CLEAN_SCRUB)
|
||||
|
||||
@@ -145,6 +145,9 @@
|
||||
/atom/movable/lighting_object/onTransitZ()
|
||||
return
|
||||
|
||||
/atom/movable/lighting_object/wash(clean_types)
|
||||
return
|
||||
|
||||
// Override here to prevent things accidentally moving around overlays.
|
||||
/atom/movable/lighting_object/forceMove(atom/destination, var/no_tp=FALSE, var/harderforce = FALSE)
|
||||
if(harderforce)
|
||||
|
||||
@@ -972,3 +972,39 @@
|
||||
/// Returns if the carbon is wearing shock proof gloves
|
||||
/mob/living/carbon/proc/wearing_shock_proof_gloves()
|
||||
return gloves?.siemens_coefficient == 0
|
||||
|
||||
/mob/living/carbon/wash(clean_types)
|
||||
. = ..()
|
||||
// Wash equipped stuff that cannot be covered
|
||||
for(var/i in held_items)
|
||||
var/obj/item/held_thing = i
|
||||
if(held_thing.wash(clean_types))
|
||||
. = TRUE
|
||||
if(back?.wash(clean_types))
|
||||
update_inv_back(0)
|
||||
. = TRUE
|
||||
if(head?.wash(clean_types))
|
||||
update_inv_head()
|
||||
. = TRUE
|
||||
// Check and wash stuff that can be covered
|
||||
var/list/obscured = check_obscured_slots()
|
||||
|
||||
// If the eyes are covered by anything but glasses, that thing will be covering any potential glasses as well.
|
||||
if(glasses && is_eyes_covered(FALSE, TRUE, TRUE) && glasses.wash(clean_types))
|
||||
update_inv_glasses()
|
||||
. = TRUE
|
||||
if(wear_mask && !(ITEM_SLOT_MASK in obscured) && wear_mask.wash(clean_types))
|
||||
update_inv_wear_mask()
|
||||
. = TRUE
|
||||
if(ears && !(ITEM_SLOT_EARS in obscured) && ears.wash(clean_types))
|
||||
update_inv_ears()
|
||||
. = TRUE
|
||||
if(wear_neck && !(ITEM_SLOT_NECK in obscured) && wear_neck.wash(clean_types))
|
||||
update_inv_neck()
|
||||
. = TRUE
|
||||
if(shoes && !(ITEM_SLOT_FEET in obscured) && shoes.wash(clean_types))
|
||||
update_inv_shoes()
|
||||
. = TRUE
|
||||
if(gloves && !(ITEM_SLOT_GLOVES in obscured) && gloves.wash(clean_types))
|
||||
update_inv_gloves()
|
||||
. = TRUE
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
. = ..()
|
||||
|
||||
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_blood)
|
||||
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_FACE_ACT, .proc/clean_face)
|
||||
AddComponent(/datum/component/personal_crafting)
|
||||
|
||||
/mob/living/carbon/human/proc/setup_human_dna()
|
||||
@@ -670,17 +670,83 @@
|
||||
if(..())
|
||||
dropItemToGround(I)
|
||||
|
||||
/mob/living/carbon/human/proc/clean_blood(datum/source, strength)
|
||||
if(strength < CLEAN_STRENGTH_BLOOD)
|
||||
return
|
||||
/**
|
||||
* Wash the hands, cleaning either the gloves if equipped and not obscured, otherwise the hands themselves if they're not obscured.
|
||||
*
|
||||
* Returns false if we couldn't wash our hands due to them being obscured, otherwise true
|
||||
*/
|
||||
/mob/living/carbon/human/proc/wash_hands(clean_types)
|
||||
var/list/obscured = check_obscured_slots()
|
||||
if(ITEM_SLOT_GLOVES in obscured)
|
||||
return FALSE
|
||||
if(gloves)
|
||||
if(SEND_SIGNAL(gloves, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
|
||||
if(gloves.wash(clean_types))
|
||||
update_inv_gloves()
|
||||
else
|
||||
if(bloody_hands)
|
||||
bloody_hands = 0
|
||||
else if((clean_types & CLEAN_TYPE_BLOOD) && blood_in_hands > 0)
|
||||
blood_in_hands = 0
|
||||
update_inv_gloves()
|
||||
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* Cleans the lips of any lipstick. Returns TRUE if the lips had any lipstick and was thus cleaned
|
||||
*/
|
||||
/mob/living/carbon/human/proc/clean_lips()
|
||||
if(isnull(lip_style) && lip_color == initial(lip_color))
|
||||
return FALSE
|
||||
lip_style = null
|
||||
lip_color = initial(lip_color)
|
||||
update_body()
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* Called on the COMSIG_COMPONENT_CLEAN_FACE_ACT signal
|
||||
*/
|
||||
/mob/living/carbon/human/proc/clean_face(datum/source, clean_types)
|
||||
if(!is_mouth_covered() && clean_lips())
|
||||
. = TRUE
|
||||
|
||||
if(glasses && is_eyes_covered(FALSE, TRUE, TRUE) && glasses.wash(clean_types))
|
||||
update_inv_glasses()
|
||||
. = TRUE
|
||||
|
||||
var/list/obscured = check_obscured_slots()
|
||||
if(wear_mask && !(ITEM_SLOT_MASK in obscured) && wear_mask.wash(clean_types))
|
||||
update_inv_wear_mask()
|
||||
. = TRUE
|
||||
|
||||
/**
|
||||
* Called when this human should be washed
|
||||
*/
|
||||
/mob/living/carbon/human/wash(clean_types)
|
||||
. = ..()
|
||||
|
||||
// Wash equipped stuff that cannot be covered
|
||||
if(wear_suit?.wash(clean_types))
|
||||
update_inv_wear_suit()
|
||||
. = TRUE
|
||||
|
||||
if(belt?.wash(clean_types))
|
||||
update_inv_belt()
|
||||
. = TRUE
|
||||
|
||||
// Check and wash stuff that can be covered
|
||||
var/list/obscured = check_obscured_slots()
|
||||
|
||||
if(w_uniform && !(ITEM_SLOT_ICLOTHING in obscured) && w_uniform.wash(clean_types))
|
||||
update_inv_w_uniform()
|
||||
. = TRUE
|
||||
|
||||
if(!is_mouth_covered() && clean_lips())
|
||||
. = TRUE
|
||||
|
||||
// Wash hands if exposed
|
||||
if(!gloves && (clean_types & CLEAN_TYPE_BLOOD) && blood_in_hands > 0 && !(ITEM_SLOT_GLOVES in obscured))
|
||||
blood_in_hands = 0
|
||||
update_inv_gloves()
|
||||
. = TRUE
|
||||
wash_cream()
|
||||
|
||||
/mob/living/carbon/human/wash_cream()
|
||||
if(creamed) //clean both to prevent a rare bug
|
||||
cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_lizard"))
|
||||
|
||||
@@ -56,3 +56,4 @@
|
||||
var/last_fire_update
|
||||
var/account_id
|
||||
var/xylophone = 0 //For the spoooooooky xylophone cooldown
|
||||
var/blood_in_hands = 0
|
||||
|
||||
@@ -1176,13 +1176,13 @@ GLOBAL_LIST_EMPTY(mentor_races)
|
||||
return 0
|
||||
|
||||
/datum/species/proc/handle_mutations_and_radiation(mob/living/carbon/human/H)
|
||||
if(HAS_TRAIT(H, TRAIT_RADIMMUNE))
|
||||
H.radiation = 0
|
||||
return TRUE
|
||||
|
||||
. = FALSE
|
||||
var/radiation = H.radiation
|
||||
|
||||
if(HAS_TRAIT(H, TRAIT_RADIMMUNE))
|
||||
radiation = 0
|
||||
return TRUE
|
||||
|
||||
if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB))
|
||||
if(!H.IsParalyzed())
|
||||
H.emote("collapse")
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
id = "android"
|
||||
say_mod = "states"
|
||||
species_traits = list(NOBLOOD)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT)
|
||||
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
|
||||
meat = null
|
||||
damage_overlay_type = "synth"
|
||||
|
||||
@@ -15,6 +15,6 @@
|
||||
attack_sound = 'sound/weapons/resonator_blast.ogg'
|
||||
use_skintones = 0
|
||||
species_traits = list(NOBLOOD,EYECOLOR)
|
||||
inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER)
|
||||
inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER)
|
||||
sexes = 0
|
||||
changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
name = "Golem"
|
||||
id = "iron golem"
|
||||
species_traits = list(NOBLOOD,MUTCOLORS,NO_UNDERWEAR)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) // yogs - Gives golems NOHUNGER
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOGUNS)
|
||||
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
|
||||
mutant_organs = list(/obj/item/organ/adamantine_resonator)
|
||||
speedmod = 2
|
||||
@@ -86,7 +86,7 @@
|
||||
fixed_mut_color = "a3d"
|
||||
meat = /obj/item/stack/ore/plasma
|
||||
//Can burn and takes damage from heat
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) //no RESISTHEAT, NOFIRE
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) //no RESISTHEAT, NOFIRE
|
||||
info_text = "As a <span class='danger'>Plasma Golem</span>, you burn easily. Be careful, if you get hot enough while burning, you'll blow up!"
|
||||
heatmod = 0 //fine until they blow up
|
||||
prefix = "Plasma"
|
||||
@@ -275,7 +275,7 @@
|
||||
fixed_mut_color = "9E704B"
|
||||
meat = /obj/item/stack/sheet/mineral/wood
|
||||
//Can burn and take damage from heat
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
armor = 30
|
||||
burnmod = 1.25
|
||||
heatmod = 1.5
|
||||
@@ -701,7 +701,7 @@
|
||||
info_text = "As a <span class='danger'>Cloth Golem</span>, you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable. \
|
||||
Being made of cloth, your body is magic resistant and faster than that of other golems, but weaker and less resilient."
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR) //no mutcolors, and can burn
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOGUNS)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOGUNS)
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
armor = 15 //feels no pain, but not too resistant
|
||||
burnmod = 2 // don't get burned
|
||||
@@ -903,7 +903,7 @@
|
||||
prefix = "Snow"
|
||||
special_names = list("Flake", "Blizzard", "Storm", "Frosty")
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) //no mutcolors, no eye sprites
|
||||
inherent_traits = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
inherent_traits = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
|
||||
var/obj/effect/proc_holder/spell/targeted/conjure_item/snowball/ball
|
||||
var/obj/effect/proc_holder/spell/aimed/cryo/cryo
|
||||
@@ -950,7 +950,7 @@
|
||||
special_names = list("Box")
|
||||
info_text = "As a <span class='danger'>Cardboard Golem</span>, you aren't very strong, but you are a bit quicker and can easily create more brethren by using cardboard on yourself."
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH)
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
limbs_id = "c_golem" //special sprites
|
||||
attack_verb = "whips"
|
||||
attack_sound = 'sound/weapons/whip.ogg'
|
||||
@@ -995,7 +995,7 @@
|
||||
name = "Leather Golem"
|
||||
id = "leather golem"
|
||||
special_names = list("Face", "Man", "Belt") //Ah dude 4 strength 4 stam leather belt AHHH
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_STRONG_GRABBER)
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_STRONG_GRABBER)
|
||||
prefix = "Leather"
|
||||
fixed_mut_color = "624a2e"
|
||||
info_text = "As a <span class='danger'>Leather Golem</span>, you are flammable, but you can grab things with incredible ease, allowing all your grabs to start at a strong level."
|
||||
@@ -1010,7 +1010,7 @@
|
||||
special_names = list("Boll","Weave")
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH)
|
||||
fixed_mut_color = null
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
info_text = "As a <span class='danger'>Durathread Golem</span>, your strikes will cause those your targets to start choking, but your woven body won't withstand fire as well."
|
||||
|
||||
/datum/species/golem/durathread/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
@@ -1031,7 +1031,7 @@
|
||||
mutanttongue = /obj/item/organ/tongue/bone
|
||||
sexes = FALSE
|
||||
fixed_mut_color = null
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH,TRAIT_CALCIUM_HEALER)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH,TRAIT_CALCIUM_HEALER)
|
||||
info_text = "As a <span class='danger'>Bone Golem</span>, You have a powerful spell that lets you chill your enemies with fear, and milk heals you! Just make sure to watch our for bone-hurting juice."
|
||||
var/datum/action/innate/bonechill/bonechill
|
||||
|
||||
@@ -1090,7 +1090,7 @@
|
||||
special_names = list("John D. Rockefeller","Rich Uncle Pennybags","Commodore Vanderbilt","Entrepreneur","Mr. Moneybags", "Adam Smith")
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH)
|
||||
fixed_mut_color = null
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
info_text = "As a <span class='danger'>Capitalist Golem</span>, your fist spreads the powerful industrializing light of capitalism."
|
||||
changesource_flags = MIRROR_BADMIN
|
||||
random_eligible = FALSE
|
||||
@@ -1138,7 +1138,7 @@
|
||||
special_names = list("John D. Rockefeller","Rich Uncle Pennybags","Commodore Vanderbilt","Entrepreneur","Mr. Moneybags", "Adam Smith")
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES)
|
||||
fixed_mut_color = null
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
info_text = "As a <span class='danger'>Churchgoing Capitalist Golem</span>, your god-given right is to make fat stacks of money!"
|
||||
changesource_flags = MIRROR_BADMIN
|
||||
random_eligible = FALSE
|
||||
@@ -1160,7 +1160,7 @@
|
||||
special_names = list("Stalin","Lenin","Trotsky","Marx","Comrade") //comrade comrade
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH)
|
||||
fixed_mut_color = null
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
info_text = "As a <span class='danger'>Soviet Golem</span>, your fist spreads the bright soviet light of communism."
|
||||
changesource_flags = MIRROR_BADMIN
|
||||
random_eligible = FALSE
|
||||
@@ -1203,7 +1203,7 @@
|
||||
id = "cheese golem"
|
||||
fixed_mut_color = "F1D127"
|
||||
meat = /obj/item/stack/sheet/cheese
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
armor = 10
|
||||
burnmod = 1.25
|
||||
heatmod = 1.5
|
||||
@@ -1237,7 +1237,7 @@
|
||||
info_text = "As a <span class='danger'>Metallic Hydrogen Golem</span>, you were forged in the highest pressures and the highest heats. Your unique mineral makeup makes you immune to most types of damages."
|
||||
prefix = "Metallic Hydrogen"
|
||||
special_names = null
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_NODISMEMBER)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_NODISMEMBER)
|
||||
|
||||
/datum/species/golem/mhydrogen/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
. = ..()
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
sexes = 0
|
||||
meat = /obj/item/stack/sheet/mineral/plasma
|
||||
species_traits = list(NOBLOOD,NOTRANSSTING)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER,TRAIT_CALCIUM_HEALER,TRAIT_ALWAYS_CLEAN)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_NOHUNGER,TRAIT_CALCIUM_HEALER,TRAIT_ALWAYS_CLEAN)
|
||||
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
|
||||
mutantlungs = /obj/item/organ/lungs/plasmaman
|
||||
mutanttongue = /obj/item/organ/tongue/bone/plasmaman
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
sexes = 0
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
|
||||
species_traits = list(NOBLOOD)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
mutanttongue = /obj/item/organ/tongue/bone
|
||||
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
|
||||
|
||||
@@ -176,7 +176,7 @@ There are several things that need to be remembered:
|
||||
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES]
|
||||
inv.update_icon()
|
||||
|
||||
if(!gloves && bloody_hands)
|
||||
if(!gloves && blood_in_hands)
|
||||
var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER)
|
||||
if(get_num_arms(FALSE) < 2)
|
||||
if(has_left_hand(FALSE))
|
||||
|
||||
@@ -80,10 +80,10 @@
|
||||
|
||||
|
||||
|
||||
/mob/living/proc/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE)
|
||||
/mob/living/proc/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = 0)
|
||||
var/hit_percent = (100-blocked)/100
|
||||
if(!effect || (hit_percent <= 0))
|
||||
return 0
|
||||
return FALSE
|
||||
switch(effecttype)
|
||||
if(EFFECT_STUN)
|
||||
Stun(effect * hit_percent)
|
||||
@@ -96,6 +96,7 @@
|
||||
if(EFFECT_UNCONSCIOUS)
|
||||
Unconscious(effect * hit_percent)
|
||||
if(EFFECT_IRRADIATE)
|
||||
if(!HAS_TRAIT(src, TRAIT_RADIMMUNE))
|
||||
radiation += max(effect * hit_percent, 0)
|
||||
if(EFFECT_SLUR)
|
||||
slurring = max(slurring,(effect * hit_percent))
|
||||
@@ -113,12 +114,12 @@
|
||||
Paralyze(effect * hit_percent)
|
||||
if(EFFECT_IMMOBILIZE)
|
||||
Immobilize(effect * hit_percent)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0, paralyze = 0, immobilize = 0)
|
||||
/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = 0, stamina = 0, jitter = 0, paralyze = 0, immobilize = 0)
|
||||
if(blocked >= 100)
|
||||
return BULLET_ACT_BLOCK
|
||||
return FALSE
|
||||
if(stun)
|
||||
apply_effect(stun, EFFECT_STUN, blocked)
|
||||
if(knockdown)
|
||||
@@ -143,7 +144,7 @@
|
||||
apply_damage(stamina, STAMINA, null, blocked)
|
||||
if(jitter)
|
||||
apply_effect(jitter, EFFECT_JITTER, blocked)
|
||||
return BULLET_ACT_HIT
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/proc/getBruteLoss()
|
||||
|
||||
@@ -11,10 +11,9 @@
|
||||
weather_immunities = list("ash")
|
||||
possible_a_intents = list(INTENT_HELP, INTENT_HARM)
|
||||
mob_biotypes = list(MOB_ROBOTIC)
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
deathsound = 'sound/voice/borg_deathsound.ogg'
|
||||
speech_span = SPAN_ROBOT
|
||||
flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1
|
||||
flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1 | RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
|
||||
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
|
||||
var/last_lawchange_announce = 0
|
||||
|
||||
@@ -209,18 +209,14 @@
|
||||
target_types = typecacheof(target_types)
|
||||
|
||||
/mob/living/simple_animal/bot/cleanbot/UnarmedAttack(atom/A)
|
||||
if(is_cleanable(A))
|
||||
if(ismopable(A))
|
||||
icon_state = "cleanbot-c"
|
||||
mode = BOT_CLEANING
|
||||
|
||||
var/turf/T = get_turf(A)
|
||||
if(do_after(src, 1, target = T))
|
||||
SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
|
||||
T.wash(CLEAN_WASH)
|
||||
visible_message("<span class='notice'>[src] cleans \the [T].</span>")
|
||||
for(var/atom/dirtything in T)
|
||||
if(is_cleanable(dirtything))
|
||||
qdel(dirtything)
|
||||
|
||||
target = null
|
||||
|
||||
mode = BOT_IDLE
|
||||
|
||||
@@ -172,11 +172,9 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/alien/maid/AttackingTarget()
|
||||
if(ismovable(target))
|
||||
target.wash(CLEAN_WASH)
|
||||
if(istype(target, /obj/effect/decal/cleanable))
|
||||
visible_message("[src] cleans up \the [target].")
|
||||
qdel(target)
|
||||
return TRUE
|
||||
var/atom/movable/M = target
|
||||
SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
visible_message("[src] polishes \the [target].")
|
||||
else
|
||||
visible_message("<span class='notice'>[src] polishes \the [target].</span>")
|
||||
return TRUE
|
||||
|
||||
@@ -992,56 +992,26 @@
|
||||
var/toxpwr = 1
|
||||
taste_description = "sourness"
|
||||
reagent_weight = 0.6 //so it sprays further
|
||||
var/clean_types = CLEAN_WASH
|
||||
|
||||
/datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume)
|
||||
if(istype(O, /obj/effect/decal/cleanable))
|
||||
qdel(O)
|
||||
else
|
||||
if(O)
|
||||
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
O?.wash(clean_types)
|
||||
|
||||
/datum/reagent/space_cleaner/reaction_turf(turf/T, reac_volume)
|
||||
if(reac_volume >= 1)
|
||||
T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
for(var/obj/effect/decal/cleanable/C in T)
|
||||
qdel(C)
|
||||
T.wash(clean_types)
|
||||
for(var/am in T)
|
||||
var/atom/movable/movable_content
|
||||
if(ismopable(movable_content)) // Mopables will be cleaned anyways by the turf wash
|
||||
continue
|
||||
movable_content.wash(clean_types)
|
||||
|
||||
for(var/mob/living/simple_animal/slime/M in T)
|
||||
M.adjustToxLoss(rand(5,10))
|
||||
|
||||
/datum/reagent/space_cleaner/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
if(method == TOUCH || method == VAPOR)
|
||||
M.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.lip_style)
|
||||
H.lip_style = null
|
||||
H.update_body()
|
||||
for(var/obj/item/I in C.held_items)
|
||||
SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
if(C.wear_mask)
|
||||
if(SEND_SIGNAL(C.wear_mask, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
|
||||
C.update_inv_wear_mask()
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(H.head)
|
||||
if(SEND_SIGNAL(H.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
|
||||
H.update_inv_head()
|
||||
if(H.wear_suit)
|
||||
if(SEND_SIGNAL(H.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
|
||||
H.update_inv_wear_suit()
|
||||
else if(H.w_uniform)
|
||||
if(SEND_SIGNAL(H.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
|
||||
H.update_inv_w_uniform()
|
||||
if(H.shoes)
|
||||
if(SEND_SIGNAL(H.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
|
||||
H.update_inv_shoes()
|
||||
H.wash_cream()
|
||||
SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
M.wash(clean_types)
|
||||
|
||||
/datum/reagent/space_cleaner/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustToxLoss(toxpwr*REM, 0)
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
/datum/reagent/toxin/mutagen/reaction_mob(mob/living/carbon/M, method=TOUCH, reac_volume)
|
||||
if(!..())
|
||||
return
|
||||
if(!M.has_dna() || HAS_TRAIT(M, TRAIT_RADIMMUNE) || HAS_TRAIT(M, TRAIT_BADDNA))
|
||||
if(!M.has_dna() || HAS_TRAIT(M, TRAIT_GENELESS) || HAS_TRAIT(M, TRAIT_BADDNA))
|
||||
return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
|
||||
if((method==VAPOR && prob(min(33, reac_volume))) || method==INGEST || method==PATCH || method==INJECT)
|
||||
M.randmuti()
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
resistance_flags = FIRE_PROOF
|
||||
interaction_flags_machine = INTERACT_MACHINE_OPEN | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON
|
||||
obj_flags = CAN_BE_HIT | USES_TGUI
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
var/datum/gas_mixture/air_contents // internal reservoir
|
||||
var/full_pressure = FALSE
|
||||
var/pressure_charging = TRUE
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
invisibility = INVISIBILITY_MAXIMUM
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
dir = NONE
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
var/datum/gas_mixture/gas // gas used to flush, will appear at exit point
|
||||
var/active = FALSE // true if the holder is moving, otherwise inactive
|
||||
var/count = 1000 // can travel 1000 steps before going inactive (in case of loops)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
icon_state = "outlet"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
var/active = FALSE
|
||||
var/turf/target // this will be where the output objects are 'thrown' to.
|
||||
var/obj/structure/disposalpipe/trunk/trunk // the attached pipe trunk
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
max_integrity = 200
|
||||
armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30)
|
||||
layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
||||
var/dpdir = NONE // bitmask of pipe directions
|
||||
var/initialize_dirs = NONE // bitflags of pipe directions added on init, see \code\_DEFINES\pipe_construction.dm
|
||||
var/flip_type // If set, the pipe is flippable and becomes this type when flipped
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
to_chat(user, "This doesn't look like it'll work.")
|
||||
return FALSE
|
||||
|
||||
/obj/item/medical/bandage/proc/wash(obj/O, mob/user)
|
||||
/obj/item/medical/bandage/proc/wash2(obj/O, mob/user)
|
||||
if (src.used)
|
||||
to_chat(user, "You clean [src] fastidiously washing away as much of the detritus and residue as you can. The bandage can probably be used again now.")
|
||||
name = "reused bandages"
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
return FALSE
|
||||
if(istype(I, /obj/item/clothing))
|
||||
if(charges)
|
||||
SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
I.wash(CLEAN_WASH)
|
||||
playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
|
||||
to_chat(user, "You've successfully cleaned [I] with [src]")
|
||||
charges --
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_light)
|
||||
|
||||
/obj/machinery/light/proc/clean_light(O,strength)
|
||||
if(strength < CLEAN_STRENGTH_BLOOD)
|
||||
if(strength < CLEAN_TYPE_BLOOD)
|
||||
return
|
||||
bulb_colour = initial(bulb_colour)
|
||||
update()
|
||||
|
||||
Reference in New Issue
Block a user