diff --git a/.gitignore b/.gitignore index 95f7ad24fa6..9d2b3ae5aa1 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,9 @@ sql/test_db *.code-workspace .history +# git/kdiff4 +*.orig + # swap [._]*.s[a-v][a-z] [._]*.sw[a-p] @@ -52,4 +55,4 @@ lib/*.so __pycache__ # Running OpenDream locally -nebula.json \ No newline at end of file +nebula.json diff --git a/code/__defines/aspects.dm b/code/__defines/aspects.dm deleted file mode 100644 index 6e7619db774..00000000000 --- a/code/__defines/aspects.dm +++ /dev/null @@ -1,69 +0,0 @@ -#define HAS_ASPECT(holder, check_aspect) (ismob(holder) && ispath(check_aspect, /decl/aspect) && (GET_DECL(check_aspect) in holder.personal_aspects)) - -#define ADD_ASPECT(holder, add_aspect) \ - if(holder && add_aspect && !HAS_ASPECT(holder, add_aspect)) { \ - var/decl/aspect/A = GET_DECL(add_aspect); \ - LAZYDISTINCTADD(holder.personal_aspects, A); \ - holder.need_aspect_sort = TRUE; \ - A.apply(holder); \ - } - -#define ASPECTS_PHYSICAL BITFLAG(0) -#define ASPECTS_MENTAL BITFLAG(1) - -#define DEFINE_ROBOLIMB_MODEL_ASPECTS(MODEL_PATH, MODEL_ID, COST) \ -/decl/aspect/prosthetic_limb/left_hand/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/left_hand; \ - aspect_cost = COST * 0.5; \ -} \ -/decl/aspect/prosthetic_limb/left_arm/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/left_arm; \ - aspect_cost = COST; \ -} \ -/decl/aspect/prosthetic_limb/right_hand/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/right_hand; \ - aspect_cost = COST * 0.5; \ -} \ -/decl/aspect/prosthetic_limb/right_arm/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/right_arm; \ - aspect_cost = COST; \ -} \ -/decl/aspect/prosthetic_limb/left_foot/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/left_foot; \ - aspect_cost = COST * 0.5; \ -} \ -/decl/aspect/prosthetic_limb/left_leg/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/left_leg; \ - aspect_cost = COST; \ -} \ -/decl/aspect/prosthetic_limb/right_foot/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/right_foot; \ - aspect_cost = COST * 0.5; \ -} \ -/decl/aspect/prosthetic_limb/right_leg/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/right_leg; \ - aspect_cost = COST; \ -} \ -/decl/aspect/prosthetic_limb/head/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/head; \ - aspect_cost = COST * 0.5; \ -} \ -/decl/aspect/prosthetic_limb/chest/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/chest; \ - aspect_cost = COST * 0.5; \ -} \ -/decl/aspect/prosthetic_limb/groin/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/groin; \ - aspect_cost = COST * 0.5; \ -} diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index 3b786a9c2c9..4c300aeeec5 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -12,6 +12,7 @@ #define PIERCE "pierce" #define LASER "laser" #define SHATTER "shatter" +#define CHARRED "charred" #define STUN "stun" #define WEAKEN "weaken" diff --git a/code/__defines/deity.dm b/code/__defines/deity.dm deleted file mode 100644 index 99f7511bcd9..00000000000 --- a/code/__defines/deity.dm +++ /dev/null @@ -1,2 +0,0 @@ -#define DEITY_STRUCTURE_NEAR_IMPORTANT 1 //Whether this needs to be near an important structure. -#define DEITY_STRUCTURE_ALONE 2 //Whether this can be near another of the same type. \ No newline at end of file diff --git a/code/__defines/dna.dm b/code/__defines/dna.dm deleted file mode 100644 index d8b93e20e89..00000000000 --- a/code/__defines/dna.dm +++ /dev/null @@ -1,65 +0,0 @@ -// Bitflags for mutations. -#define STRUCDNASIZE 27 -#define UNIDNASIZE 13 - -// Generic mutations: -#define MUTATION_COLD_RESISTANCE 1 -#define MUTATION_XRAY 2 -#define MUTATION_CLUMSY 3 -#define MUTATION_HUSK 4 -#define MUTATION_SPACERES 5 // Can't be harmed via pressure damage. - -// Other Mutations: -#define mNobreath 100 // No need to breathe. -#define mRemote 101 // Remote viewing. -#define mRegen 102 // Health regeneration. -#define mRun 103 // No slowdown. -#define mRemotetalk 104 // Remote talking. -#define mMorph 105 // Hanging appearance. -#define mBlend 106 // Nothing. (seriously nothing) -#define mHallucination 107 // Hallucinations. -#define mFingerprints 108 // No fingerprints. -#define mShock 109 // Insulated hands. - -// disabilities -#define NEARSIGHTED BITFLAG(0) -#define EPILEPSY BITFLAG(1) -#define COUGHING BITFLAG(2) -#define TOURETTES BITFLAG(3) -#define NERVOUS BITFLAG(4) - -// sdisabilities -#define BLINDED BITFLAG(0) -#define MUTED BITFLAG(1) -#define DEAFENED BITFLAG(2) - -// The way blocks are handled badly needs a rewrite, this is horrible. -// Too much of a project to handle at the moment, TODO for later. -var/global/BLINDBLOCK = 0 -var/global/DEAFBLOCK = 0 -var/global/TELEBLOCK = 0 -var/global/FIREBLOCK = 0 -var/global/XRAYBLOCK = 0 -var/global/CLUMSYBLOCK = 0 -var/global/FAKEBLOCK = 0 -var/global/COUGHBLOCK = 0 -var/global/GLASSESBLOCK = 0 -var/global/TWITCHBLOCK = 0 -var/global/NERVOUSBLOCK = 0 -var/global/MONKEYBLOCK = STRUCDNASIZE - -var/global/BLOCKADD = 0 -var/global/DIFFMUT = 0 - -var/global/HEADACHEBLOCK = 0 -var/global/NOBREATHBLOCK = 0 -var/global/REMOTEVIEWBLOCK = 0 -var/global/REGENERATEBLOCK = 0 -var/global/INCREASERUNBLOCK = 0 -var/global/REMOTETALKBLOCK = 0 -var/global/MORPHBLOCK = 0 -var/global/BLENDBLOCK = 0 -var/global/HALLUCINATIONBLOCK = 0 -var/global/NOPRINTSBLOCK = 0 -var/global/SHOCKIMMUNITYBLOCK = 0 -var/global/SMALLSIZEBLOCK = 0 diff --git a/code/__defines/genetics.dm b/code/__defines/genetics.dm new file mode 100644 index 00000000000..9744c4407e9 --- /dev/null +++ b/code/__defines/genetics.dm @@ -0,0 +1,21 @@ +#define GENE_COND_COLD_RESISTANCE /decl/genetic_condition/superpower/cold_resist +#define GENE_COND_XRAY /decl/genetic_condition/superpower/xray +#define GENE_COND_SPACE_RESISTANCE /decl/genetic_condition/superpower/space_resist +#define GENE_COND_NO_BREATH /decl/genetic_condition/superpower/no_breath +#define GENE_COND_REMOTE_TALK /decl/genetic_condition/superpower/remotetalk +#define GENE_COND_RUNNING /decl/genetic_condition/superpower/running +#define GENE_COND_REMOTE_VIEW /decl/genetic_condition/superpower/remoteview +#define GENE_COND_SHAPESHIFTER /decl/genetic_condition/superpower/morph +#define GENE_COND_NO_FINGERPRINTS /decl/genetic_condition/superpower/noprints + +#define GENE_COND_CLUMSY /decl/genetic_condition/disability/clumsy +#define GENE_COND_NEARSIGHTED /decl/genetic_condition/disability/nearsighted +#define GENE_COND_EPILEPSY /decl/genetic_condition/disability/epilepsy +#define GENE_COND_COUGHING /decl/genetic_condition/disability/coughing +#define GENE_COND_TOURETTES /decl/genetic_condition/disability/tourettes +#define GENE_COND_NERVOUS /decl/genetic_condition/disability/nervous +#define GENE_COND_BLINDED /decl/genetic_condition/disability/blinded +#define GENE_COND_MUTED /decl/genetic_condition/disability/muted +#define GENE_COND_DEAFENED /decl/genetic_condition/disability/deafened + +#define GENE_COND_HUSK /decl/genetic_condition/husk diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index ec5eea099aa..0e8e7824d1c 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -244,10 +244,6 @@ //Inserts 'a' or 'an' before X in ways \a doesn't allow #define ADD_ARTICLE(X) "[(lowertext(X[1]) in global.vowels) ? "an" : "a"] [X]" -#define SOULSTONE_CRACKED -1 -#define SOULSTONE_EMPTY 0 -#define SOULSTONE_ESSENCE 1 - //Request Console Department Types #define RC_ASSIST 1 //Request Assistance #define RC_SUPPLY 2 //Request Supplies diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 3c3e77014f4..4ede3dbaa6b 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -64,18 +64,17 @@ #define ROBOT_NOTIFICATION_MODULE_RESET 4 // Appearance change flags -#define APPEARANCE_UPDATE_DNA BITFLAG(0) -#define APPEARANCE_RACE (BITFLAG(1)|APPEARANCE_UPDATE_DNA) -#define APPEARANCE_GENDER BITFLAG(2) -#define APPEARANCE_BODY (BITFLAG(3)|APPEARANCE_UPDATE_DNA) -#define APPEARANCE_SKIN BITFLAG(4) -#define APPEARANCE_HAIR BITFLAG(5) -#define APPEARANCE_HAIR_COLOR BITFLAG(6) -#define APPEARANCE_FACIAL_HAIR BITFLAG(7) -#define APPEARANCE_FACIAL_HAIR_COLOR BITFLAG(8) -#define APPEARANCE_EYE_COLOR BITFLAG(9) +#define APPEARANCE_RACE BITFLAG(0) +#define APPEARANCE_GENDER BITFLAG(1) +#define APPEARANCE_BODY BITFLAG(2) +#define APPEARANCE_SKIN BITFLAG(3) +#define APPEARANCE_HAIR BITFLAG(4) +#define APPEARANCE_HAIR_COLOR BITFLAG(5) +#define APPEARANCE_FACIAL_HAIR BITFLAG(6) +#define APPEARANCE_FACIAL_HAIR_COLOR BITFLAG(7) +#define APPEARANCE_EYE_COLOR BITFLAG(8) #define APPEARANCE_ALL_HAIR (APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR) -#define APPEARANCE_ALL (APPEARANCE_UPDATE_DNA|APPEARANCE_RACE|APPEARANCE_GENDER|APPEARANCE_BODY|APPEARANCE_SKIN|APPEARANCE_EYE_COLOR|APPEARANCE_ALL_HAIR) +#define APPEARANCE_ALL (APPEARANCE_RACE|APPEARANCE_GENDER|APPEARANCE_BODY|APPEARANCE_SKIN|APPEARANCE_EYE_COLOR|APPEARANCE_ALL_HAIR) // Click cooldown #define DEFAULT_ATTACK_COOLDOWN 8 //Default timeout for aggressive actions @@ -224,14 +223,14 @@ #define MOB_PULL_SAME 2 #define MOB_PULL_LARGER 3 -//carbon taste sensitivity defines, used in mob/living/carbon/proc/ingest +// Taste sensitivity defines, used in mob/living/proc/ingest. #define TASTE_HYPERSENSITIVE 3 //anything below 5% #define TASTE_SENSITIVE 2 //anything below 7% #define TASTE_NORMAL 1 //anything below 15% #define TASTE_DULL 0.5 //anything below 30% #define TASTE_NUMB 0.1 //anything below 150% -// One 'unit' of taste sensitivity probability, used in mob/living/carbon/proc/ingest +// One 'unit' of taste sensitivity probability, used in mob/living/proc/ingest #define TASTE_DEGREE_PROB 15 //Used by show_message() and emotes @@ -324,7 +323,7 @@ var/global/list/dexterity_levels = list( "[DEXTERITY_BASE]" ) -// used in /mob/living/carbon/human/can_inject, and by various callers of that proc +// used in /mob/living/human/can_inject, and by various callers of that proc #define CAN_INJECT 1 #define INJECTION_PORT 2 #define INJECTION_PORT_DELAY 3 SECONDS // used by injectors to apply delay due to searching for a port on the injectee's suit @@ -348,7 +347,7 @@ var/global/list/dexterity_levels = list( #define NEUTER_ANIMATE "animate singular neutral" // Equipment Overlays Indices // -#define HO_MUTATIONS_LAYER 1 +#define HO_CONDITION_LAYER 1 #define HO_SKIN_LAYER 2 #define HO_DAMAGE_LAYER 3 #define HO_SURGERY_LAYER 4 //bs12 specific. diff --git a/code/__defines/traits.dm b/code/__defines/traits.dm new file mode 100644 index 00000000000..f55c54f73c9 --- /dev/null +++ b/code/__defines/traits.dm @@ -0,0 +1,61 @@ +#define TRAIT_LEVEL_EXISTS 0 +#define TRAIT_LEVEL_MINOR 1 +#define TRAIT_LEVEL_MODERATE 2 +#define TRAIT_LEVEL_MAJOR 3 + +#define DEFINE_ROBOLIMB_MODEL_TRAITS(MODEL_PATH, MODEL_ID, COST) \ +/decl/trait/prosthetic_limb/left_hand/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/left_hand; \ + trait_cost = COST * 0.5; \ +} \ +/decl/trait/prosthetic_limb/left_arm/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/left_arm; \ + trait_cost = COST; \ +} \ +/decl/trait/prosthetic_limb/right_hand/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/right_hand; \ + trait_cost = COST * 0.5; \ +} \ +/decl/trait/prosthetic_limb/right_arm/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/right_arm; \ + trait_cost = COST; \ +} \ +/decl/trait/prosthetic_limb/left_foot/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/left_foot; \ + trait_cost = COST * 0.5; \ +} \ +/decl/trait/prosthetic_limb/left_leg/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/left_leg; \ + trait_cost = COST; \ +} \ +/decl/trait/prosthetic_limb/right_foot/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/right_foot; \ + trait_cost = COST * 0.5; \ +} \ +/decl/trait/prosthetic_limb/right_leg/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/right_leg; \ + trait_cost = COST; \ +} \ +/decl/trait/prosthetic_limb/head/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/head; \ + trait_cost = COST * 0.5; \ +} \ +/decl/trait/prosthetic_limb/chest/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/chest; \ + trait_cost = COST * 0.5; \ +} \ +/decl/trait/prosthetic_limb/groin/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/groin; \ + trait_cost = COST * 0.5; \ +} diff --git a/code/_global_vars/lists/clothing.dm b/code/_global_vars/lists/clothing.dm index bdca49a8627..a819fa7c527 100644 --- a/code/_global_vars/lists/clothing.dm +++ b/code/_global_vars/lists/clothing.dm @@ -38,3 +38,9 @@ var/global/list/abstract_inventory_slots = list( var/global/list/vitals_sensor_equip_slots = list( slot_w_uniform_str ) + +var/global/list/headphone_slots = list( + slot_l_ear_str, + slot_r_ear_str, + slot_head_str +) diff --git a/code/_global_vars/lists/names.dm b/code/_global_vars/lists/names.dm index c65ece1eadf..efb1b85ba2b 100644 --- a/code/_global_vars/lists/names.dm +++ b/code/_global_vars/lists/names.dm @@ -3,8 +3,6 @@ var/global/list/ai_names = file2list("config/names/ai.txt") var/global/list/wizard_first = file2list("config/names/wizardfirst.txt") var/global/list/wizard_second = file2list("config/names/wizardsecond.txt") -var/global/list/ninja_titles = file2list("config/names/ninjatitle.txt") -var/global/list/ninja_names = file2list("config/names/ninjaname.txt") var/global/list/verbs = file2list("config/names/verbs.txt") var/global/list/adjectives = file2list("config/names/adjectives.txt") diff --git a/code/_global_vars/lists/objects.dm b/code/_global_vars/lists/objects.dm index c050b547abf..f6e27d7c419 100644 --- a/code/_global_vars/lists/objects.dm +++ b/code/_global_vars/lists/objects.dm @@ -5,7 +5,6 @@ var/global/list/hud_icon_reference = list() var/global/list/listening_objects = list() // List of objects that need to be able to hear, used to avoid recursive searching through contents. var/global/list/global_map = list() -var/global/host = null //only here until check @ code\modules\ghosttrap\trap.dm:112 is fixed var/global/datum/universal_state/universe = new /// Vowels. diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index be3098d69da..4f56b508d6c 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -402,10 +402,6 @@ /proc/SecondsToTicks(var/seconds) return seconds * 10 -/proc/round_is_spooky(var/spookiness_threshold = get_config_value(/decl/config/num/cult_ghostwriter_req_cultists)) - var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) - return (cult.current_antagonists.len > spookiness_threshold) - /proc/window_flash(var/client_or_usr) if (!client_or_usr) return diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 282bd3e4e52..f3379f84c52 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -59,7 +59,7 @@ var/global/list/string_slot_flags = list( mannequins_ = new() . = mannequins_[ckey] if(!.) - . = new /mob/living/carbon/human/dummy/mannequin() + . = new /mob/living/human/dummy/mannequin() mannequins_[ckey] = . /hook/global_init/proc/makeDatumRefLists() diff --git a/code/_helpers/lists.dm b/code/_helpers/lists.dm index 52334a6e226..058a695bae0 100644 --- a/code/_helpers/lists.dm +++ b/code/_helpers/lists.dm @@ -94,7 +94,7 @@ //A "preset" for counting_english_list that displays the list "inline" (comma separated) /proc/inline_counting_english_list(list/input, output_icons = TRUE, determiners = DET_NONE, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "", line_prefix = "", first_item_prefix = "", last_item_suffix = "") - return counting_english_list(input, output_icons, determiners, nothing_text, and_text, comma_text, final_comma_text) + return counting_english_list(input, output_icons, determiners, nothing_text, line_prefix, first_item_prefix, last_item_suffix, and_text, comma_text, final_comma_text) //Checks for specific types in a list /proc/is_type_in_list(datum/thing, list/type_list) diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index d84e3b93691..126b71ca170 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -142,7 +142,7 @@ var/global/log_end= world.system_type == UNIX ? ascii2text(13) : "" if(key) if(include_link && C) - . += "" + . += "" . += key diff --git a/code/_helpers/medical_scans.dm b/code/_helpers/medical_scans.dm index a0e904409d6..c48ff1b6028 100644 --- a/code/_helpers/medical_scans.dm +++ b/code/_helpers/medical_scans.dm @@ -1,5 +1,5 @@ -/mob/living/carbon/human/proc/get_raw_medical_data(var/tag = FALSE) - var/mob/living/carbon/human/H = src +/mob/living/human/proc/get_raw_medical_data(var/tag = FALSE) + var/mob/living/human/H = src var/list/scan = list() scan["name"] = H.name @@ -88,9 +88,9 @@ for(var/organ_name in root_bodytype.has_organ) if(!GET_INTERNAL_ORGAN(H, organ_name)) scan["missing_organs"] += organ_name - if(H.sdisabilities & BLINDED) + if(H.has_genetic_condition(GENE_COND_BLINDED)) scan["blind"] = TRUE - if(H.sdisabilities & NEARSIGHTED) + if(H.has_genetic_condition(GENE_COND_NEARSIGHTED)) scan["nearsight"] = TRUE return scan diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index af53fcc142a..2be61d45948 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -209,7 +209,7 @@ continue //They need a brain! if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.should_have_organ(BP_BRAIN) && !H.has_brain()) continue if(M.ckey == find_key) diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm index 2eed2f5fdce..55735c967bc 100644 --- a/code/_helpers/turfs.dm +++ b/code/_helpers/turfs.dm @@ -96,7 +96,7 @@ return turf_map -/proc/translate_turfs(var/list/translation, var/area/base_area = null, var/turf/base_turf, var/ignore_background) +/proc/translate_turfs(var/list/translation, var/area/base_area = null, var/turf/base_turf, var/ignore_background, var/translate_air) . = list() for(var/turf/source in translation) @@ -105,21 +105,21 @@ if(target) if(base_area) ChangeArea(target, get_area(source)) - . += transport_turf_contents(source, target, ignore_background) + . += transport_turf_contents(source, target, ignore_background, translate_air) ChangeArea(source, base_area) else - . += transport_turf_contents(source, target, ignore_background) + . += transport_turf_contents(source, target, ignore_background, translate_air) //change the old turfs for(var/turf/source in translation) if(ignore_background && (source.turf_flags & TURF_FLAG_BACKGROUND)) continue var/old_turf = source.prev_type || base_turf || get_base_turf_by_area(source) - source.ChangeTurf(old_turf, keep_air_below = TRUE) + source.ChangeTurf(old_turf, keep_air = !translate_air) //Transports a turf from a source turf to a target turf, moving all of the turf's contents and making the target a copy of the source. //If ignore_background is set to true, turfs with TURF_FLAG_BACKGROUND set will only translate anchored contents. //Returns the new turf, or list(new turf, source) if a background turf was ignored and things may have been left behind. -/proc/transport_turf_contents(turf/source, turf/target, ignore_background) +/proc/transport_turf_contents(turf/source, turf/target, ignore_background, translate_air) var/target_type = target.type var/turf/new_turf @@ -128,8 +128,8 @@ if(is_background) new_turf = target else - new_turf = target.ChangeTurf(source.type, 1, 1) - new_turf.transport_properties_from(source) + new_turf = target.ChangeTurf(source.type, 1, 1, !translate_air) + new_turf.transport_properties_from(source, translate_air) new_turf.prev_type = target_type for(var/obj/O in source) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 56bc97d2941..38d0d142f96 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -491,8 +491,9 @@ Turf and target are seperate in case you want to teleport some distance from a t else return get_step(ref, base_dir) -/area/proc/move_contents_to(var/area/A) +/area/proc/move_contents_to(var/area/A, var/move_air) //Takes: Area. + // move_air - Boolean, whether or not air should be translated with the turfs. //Returns: Nothing. //Notes: Attempts to move the contents of one area to another area. // Movement based on lower left corner. @@ -510,7 +511,7 @@ Turf and target are seperate in case you want to teleport some distance from a t if(src_origin && trg_origin) var/translation = get_turf_translation(src_origin, trg_origin, turfs_src) - translate_turfs(translation, null) + translate_turfs(translation, null, translate_air = move_air) /proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) if(!original) diff --git a/code/_macros.dm b/code/_macros.dm index 70c2a46e647..31458da86e5 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -32,20 +32,16 @@ #define isEye(A) istype(A, /mob/observer/eye) -#define ishuman(A) istype(A, /mob/living/carbon/human) +#define ishuman(A) istype(A, /mob/living/human) #define isitem(A) istype(A, /obj/item) #define isliving(A) istype(A, /mob/living) -#define isdeity(A) istype(A, /mob/living/deity) - #define ismouse(A) istype(A, /mob/living/simple_animal/passive/mouse) #define islizard(A) istype(A, /mob/living/simple_animal/lizard) -#define isconstruct(A) istype(A, /mob/living/simple_animal/construct) - #define isnewplayer(A) istype(A, /mob/new_player) #define isobj(A) istype(A, /obj) @@ -96,7 +92,7 @@ /proc/place_meta_charset(content) if(istext(content)) - content = "" + content + content = "" + content return content #define to_chat(target, message) target << (message) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 18abdb09a3e..d8cd03cffa3 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -103,10 +103,10 @@ return 1 toggle_throw_mode(FALSE) - var/obj/item/W = get_active_held_item() + var/obj/item/holding = get_active_held_item() - if(W == A) // Handle attack_self - W.attack_self(src) + if(holding == A) // Handle attack_self + holding.attack_self(src) trigger_aiming(TARGET_CAN_CLICK) usr.update_inhand_overlays(FALSE) return 1 @@ -114,15 +114,15 @@ //Atoms on your person // A is your location but is not a turf; or is on you (backpack); or is on something on you (box in backpack); sdepth is needed here because contents depth does not equate inventory storage depth. var/sdepth = A.storage_depth(src) - var/check_dexterity_val = A.storage ? DEXTERITY_NONE : (istype(W) ? W.needs_attack_dexterity : DEXTERITY_WIELD_ITEM) - var/can_wield_item = W && (!check_dexterity_val || check_dexterity(check_dexterity_val)) + var/check_dexterity_val = A.storage ? DEXTERITY_NONE : (istype(holding) ? holding.needs_attack_dexterity : DEXTERITY_WIELD_ITEM) + var/can_wield_item = holding && (!check_dexterity_val || check_dexterity(check_dexterity_val)) if((!isturf(A) && A == loc) || (sdepth != -1 && sdepth <= 1)) if(can_wield_item) - var/resolved = W.resolve_attackby(A, src, params) - if(!resolved && A && W) - W.afterattack(A, src, 1, params) // 1 indicates adjacency + var/resolved = holding.resolve_attackby(A, src, params) + if(!resolved && A && holding) + holding.afterattack(A, src, 1, params) // 1 indicates adjacency setClickCooldown(DEFAULT_QUICK_COOLDOWN) - else if(!W) + else if(!holding) if(ismob(A)) // No instant mob attacking setClickCooldown(DEFAULT_QUICK_COOLDOWN) UnarmedAttack(A, TRUE) @@ -140,11 +140,11 @@ if(A.Adjacent(src)) // see adjacent.dm if(can_wield_item) // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) - var/resolved = W.resolve_attackby(A,src, params) - if(!resolved && A && W) - W.afterattack(A, src, 1, params) // 1: clicking something Adjacent + var/resolved = holding.resolve_attackby(A,src, params) + if(!resolved && A && holding) + holding.afterattack(A, src, 1, params) // 1: clicking something Adjacent setClickCooldown(DEFAULT_QUICK_COOLDOWN) - else if(!W) + else if(!holding) if(ismob(A)) // No instant mob attacking setClickCooldown(DEFAULT_QUICK_COOLDOWN) UnarmedAttack(A, TRUE) @@ -152,8 +152,8 @@ trigger_aiming(TARGET_CAN_CLICK) return else // non-adjacent click - if(W) - W.afterattack(A, src, 0, params) // 0: not Adjacent + if(holding) + holding.afterattack(A, src, 0, params) // 0: not Adjacent else RangedAttack(A, params) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index db8a10f38df..066fe948bfd 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -54,10 +54,10 @@ return */ - var/obj/item/W = get_active_held_item() + var/obj/item/holding = get_active_held_item() // Cyborgs have no range-checking unless there is item use - if(!W) + if(!holding) A.add_hiddenprint(src) A.attack_robot(src) return @@ -66,21 +66,21 @@ if( buckled ) return - if(W == A) + if(holding == A) - W.attack_self(src) + holding.attack_self(src) return - var/check_dexterity_val = A.storage ? DEXTERITY_NONE : (istype(W) ? W.needs_attack_dexterity : DEXTERITY_WIELD_ITEM) + var/check_dexterity_val = A.storage ? DEXTERITY_NONE : (istype(holding) ? holding.needs_attack_dexterity : DEXTERITY_WIELD_ITEM) var/can_wield_item = (!check_dexterity_val || check_dexterity(check_dexterity_val)) if(!can_wield_item) return if(A == loc || (A in loc) || (A in contents)) // No adjacency checks - var/resolved = W.resolve_attackby(A, src, params) - if(!resolved && A && W) - W.afterattack(A, src, 1, params) // 1 indicates adjacency + var/resolved = holding.resolve_attackby(A, src, params) + if(!resolved && A && holding) + holding.afterattack(A, src, 1, params) // 1 indicates adjacency setClickCooldown(DEFAULT_QUICK_COOLDOWN) return @@ -90,12 +90,12 @@ var/sdepth = A.storage_depth_turf() if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1)) if(A.Adjacent(src)) // see adjacent.dm - var/resolved = W.resolve_attackby(A, src, params) - if(!resolved && A && W) - W.afterattack(A, src, 1, params) // 1 indicates adjacency + var/resolved = holding.resolve_attackby(A, src, params) + if(!resolved && A && holding) + holding.afterattack(A, src, 1, params) // 1 indicates adjacency setClickCooldown(DEFAULT_QUICK_COOLDOWN) else - W.afterattack(A, src, 0, params) + holding.afterattack(A, src, 0, params) return //Middle click cycles through selected modules. diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index e95ae53482f..a4fb7dab7ff 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human +/mob/living/human hud_used = /datum/hud/human /datum/hud/human/FinalizeInstantiation() @@ -7,7 +7,7 @@ var/ui_color = get_ui_color() var/ui_alpha = get_ui_alpha() - var/mob/living/carbon/human/target = mymob + var/mob/living/human/target = mymob var/datum/hud_data/hud_data = istype(target?.species?.species_hud) ? target.species.species_hud : new hotkeybuttons = list() //These can be disabled for hotkey usersx @@ -101,7 +101,7 @@ ..() -/mob/living/carbon/human/verb/toggle_hotkey_verbs() +/mob/living/human/verb/toggle_hotkey_verbs() set category = "OOC" set name = "Toggle hotkey buttons" set desc = "This disables or enables the user interface buttons which can be used with hotkeys." diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index e0b5d42e346..26437535d2b 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -1,21 +1,3 @@ -/mob/living/simple_animal/construct - hud_used = /datum/hud/construct - -/mob/living/simple_animal/construct/armoured - hud_used = /datum/hud/construct/juggernaut - -/mob/living/simple_animal/construct/behemoth - hud_used = /datum/hud/construct/juggernaut - -/mob/living/simple_animal/construct/builder - hud_used = /datum/hud/construct/artificer - -/mob/living/simple_animal/construct/wraith - hud_used = /datum/hud/construct/wraith - -/mob/living/simple_animal/construct/harvester - hud_used = /datum/hud/construct/harvester - /datum/hud/construct/get_ui_style_data() return GET_DECL(/decl/ui_style/construct) diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 3e2322eff23..5a9d6fcde2a 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -197,7 +197,7 @@ var/global/list/radial_menus = list() MA.maptext_height = 64 MA.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA MA.maptext_x = -round(MA.maptext_width/2) + 16 - MA.maptext_x = -round(MA.maptext_height/2) + 16 + MA.maptext_y = -round(MA.maptext_height/2) + 16 MA.maptext = STYLE_SMALLFONTS_OUTLINE("
[E.name]
", 7, COLOR_WHITE, COLOR_BLACK) return MA diff --git a/code/_onclick/hud/screen/screen_attack_selector.dm b/code/_onclick/hud/screen/screen_attack_selector.dm index 5aa2c0dbbbd..ea27e11ca3e 100644 --- a/code/_onclick/hud/screen/screen_attack_selector.dm +++ b/code/_onclick/hud/screen/screen_attack_selector.dm @@ -4,14 +4,14 @@ screen_loc = ui_attack_selector /obj/screen/default_attack_selector/Destroy() - var/mob/living/carbon/human/owner = owner_ref?.resolve() + var/mob/living/human/owner = owner_ref?.resolve() if(istype(owner) && owner.attack_selector == src) owner.attack_selector = null . = ..() /obj/screen/default_attack_selector/handle_click(mob/user, params) - var/mob/living/carbon/human/owner = owner_ref?.resolve() + var/mob/living/human/owner = owner_ref?.resolve() if(user != owner) return FALSE @@ -28,6 +28,6 @@ return TRUE /obj/screen/default_attack_selector/on_update_icon() - var/mob/living/carbon/human/owner = owner_ref?.resolve() + var/mob/living/human/owner = owner_ref?.resolve() var/decl/natural_attack/attack = istype(owner) && owner.default_attack icon_state = attack?.selector_icon_state || "attack_none" diff --git a/code/_onclick/hud/screen/screen_click_catcher.dm b/code/_onclick/hud/screen/screen_click_catcher.dm index c5629388393..d5bfc696f15 100644 --- a/code/_onclick/hud/screen/screen_click_catcher.dm +++ b/code/_onclick/hud/screen/screen_click_catcher.dm @@ -36,8 +36,8 @@ var/global/list/click_catchers /obj/screen/click_catcher/Click(location, control, params) var/list/modifiers = params2list(params) if(modifiers["middle"] && isliving(usr)) - var/mob/living/C = usr - C.swap_hand() + var/mob/living/user = usr + user.swap_hand() else var/turf/origin = get_turf(usr) if(isturf(origin)) diff --git a/code/_onclick/hud/screen/screen_equip.dm b/code/_onclick/hud/screen/screen_equip.dm index 49386fa267f..997fe5683bc 100644 --- a/code/_onclick/hud/screen/screen_equip.dm +++ b/code/_onclick/hud/screen/screen_equip.dm @@ -4,5 +4,5 @@ /obj/screen/equip/handle_click(mob/user, params) if(ishuman(usr)) - var/mob/living/carbon/human/H = usr + var/mob/living/human/H = usr H.quick_equip() diff --git a/code/_onclick/hud/screen/screen_holomap.dm b/code/_onclick/hud/screen/screen_holomap.dm index 4a0320885c5..af72457e814 100644 --- a/code/_onclick/hud/screen/screen_holomap.dm +++ b/code/_onclick/hud/screen/screen_holomap.dm @@ -60,7 +60,7 @@ /obj/screen/holomap_legend/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, map_color, text) . = ..() saved_color = map_color - maptext = "
[text]" + maptext = "[text]" alpha = 255 /obj/screen/holomap_legend/handle_click(mob/user, params) diff --git a/code/_onclick/hud/screen/screen_intent.dm b/code/_onclick/hud/screen/screen_intent.dm index bf496205aa7..138dc18c2d3 100644 --- a/code/_onclick/hud/screen/screen_intent.dm +++ b/code/_onclick/hud/screen/screen_intent.dm @@ -22,48 +22,3 @@ /obj/screen/intent/on_update_icon() icon_state = "intent_[intent]" - -/obj/screen/intent/deity - var/list/desc_screens = list() - screen_loc = "RIGHT-5:122,BOTTOM:8" - -/obj/screen/intent/deity/on_update_icon() - . = ..() - cut_overlays() - add_overlay(image('icons/mob/screen/phenomena.dmi', icon_state = "hud", pixel_x = -138, pixel_y = -1)) - compile_overlays() - -/obj/screen/intent/deity/proc/sync_to_mob(var/mob) - var/mob/living/deity/D = mob - for(var/i in 1 to D.control_types.len) - var/obj/screen/deity_marker/S = new(null, D) - desc_screens[D.control_types[i]] = S - S.screen_loc = screen_loc - //This sets it up right. Trust me. - S.maptext_y = 33/2*i - i*i/2 - 10 - D.client.screen += S - - update_text() - -/obj/screen/intent/deity/proc/update_text() - if(!isdeity(usr)) - return - var/mob/living/deity/D = usr - for(var/i in D.control_types) - var/obj/screen/deity_marker/S = desc_screens[i] - var/datum/phenomena/P = D.intent_phenomenas[intent][i] - if(P) - S.maptext = "[P.name]" - else - S.maptext = null - -/obj/screen/intent/deity/handle_click(mob/user, params) - ..() - update_text() - -/obj/screen/deity_marker - name = "" //Don't want them to be able to actually right click it. - mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - icon_state = "blank" - maptext_width = 128 - maptext_x = -125 \ No newline at end of file diff --git a/code/_onclick/hud/screen/screen_setup.dm b/code/_onclick/hud/screen/screen_setup.dm index ebd2975ffba..d0159e2aff2 100644 --- a/code/_onclick/hud/screen/screen_setup.dm +++ b/code/_onclick/hud/screen/screen_setup.dm @@ -20,7 +20,7 @@ /obj/screen/setup_preview/bg/Click(location, control, params) if(pref) pref.bgstate = next_in_list(pref.bgstate, pref.bgstate_options) - var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(pref.client_ckey) + var/mob/living/human/dummy/mannequin/mannequin = get_mannequin(pref.client_ckey) if(mannequin) pref.update_character_previews(mannequin) return ..() diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 60897c52f63..c99039b23e7 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -5,7 +5,7 @@ These are the default click code call sequences used when clicking on stuff with Atoms: mob/ClickOn() calls the item's resolve_attackby() proc. -item/resolve_attackby() calls the target atom's attackby() proc. +item/resolve_attackby() calls the target atom's attackby() proc. If it (or attackby) returns true, afterattack is skipped. Mobs: @@ -61,7 +61,7 @@ avoid code duplication. This includes items that may sometimes act as a standard return TRUE return I.use_on_mob(src, user) -/mob/living/carbon/human/attackby(obj/item/I, mob/user) +/mob/living/human/attackby(obj/item/I, mob/user) . = ..() if(.) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 2fb36304724..7965251ab03 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -40,10 +40,10 @@ return FALSE -/mob/living/carbon/human/RestrainedClickOn(var/atom/A) +/mob/living/human/RestrainedClickOn(var/atom/A) return -/mob/living/carbon/human/RangedAttack(var/atom/A, var/params) +/mob/living/human/RangedAttack(var/atom/A, var/params) //Climbing up open spaces if(isturf(loc) && bound_overlay && !is_physically_disabled() && istype(A) && A.can_climb_from_below(src)) return climb_up(A) diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index 8dd8799e561..9c1802edd7a 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -25,7 +25,7 @@ /mob/living/proc/can_use_rig() return 0 -/mob/living/carbon/human/can_use_rig() +/mob/living/human/can_use_rig() return 1 /mob/living/silicon/ai/can_use_rig() diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm index 95e21f789f1..f807f5b88db 100644 --- a/code/controllers/hooks-defs.dm +++ b/code/controllers/hooks-defs.dm @@ -37,14 +37,14 @@ /** * Death hook. * Called in death.dm when someone dies. - * Parameters: var/mob/living/carbon/human, var/gibbed + * Parameters: var/mob/living/human, var/gibbed */ /hook/death /** * Cloning hook. * Called in cloning.dm when someone is brought back by the wonders of modern science. - * Parameters: var/mob/living/carbon/human + * Parameters: var/mob/living/human */ /hook/clone diff --git a/code/controllers/subsystems/air.dm b/code/controllers/subsystems/air.dm index bf251e07054..4da8abb538d 100644 --- a/code/controllers/subsystems/air.dm +++ b/code/controllers/subsystems/air.dm @@ -134,6 +134,7 @@ SUBSYSTEM_DEF(air) var/simulated_turf_count = 0 for(var/turf/T in world) + // Although update_air_properties can be called on non-ZAS participating turfs for convenience, it is unnecessary on roundstart/reboot. if(!SHOULD_PARTICIPATE_IN_ZONES(T)) continue simulated_turf_count++ @@ -337,8 +338,13 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun merge(A.zone,B.zone) return + #ifdef MULTIZAS + var/a_to_b = get_dir_multiz(A,B) + var/b_to_a = get_dir_multiz(B,A) + #else var/a_to_b = get_dir(A,B) var/b_to_a = get_dir(B,A) + #endif if(!A.connections) A.connections = new if(!B.connections) B.connections = new @@ -362,7 +368,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun #ifdef ZASDBG ASSERT(isturf(T)) #endif - if(T.needs_air_update || !SHOULD_PARTICIPATE_IN_ZONES(T)) + if(T.needs_air_update) return tiles_to_update += T #ifdef ZASDBG diff --git a/code/controllers/subsystems/event.dm b/code/controllers/subsystems/event.dm index f3a5bd29ca3..1e9f449a1f0 100644 --- a/code/controllers/subsystems/event.dm +++ b/code/controllers/subsystems/event.dm @@ -26,14 +26,22 @@ SUBSYSTEM_DEF(event) //Subsystem procs /datum/controller/subsystem/event/Initialize() - if(!all_events) - all_events = subtypesof(/datum/event) + if(!event_containers) event_containers = list( - EVENT_LEVEL_MUNDANE = new/datum/event_container/mundane, - EVENT_LEVEL_MODERATE = new/datum/event_container/moderate, - EVENT_LEVEL_MAJOR = new/datum/event_container/major - ) + EVENT_LEVEL_MUNDANE = new global.using_map.event_container_mundane, + EVENT_LEVEL_MODERATE = new global.using_map.event_container_moderate, + EVENT_LEVEL_MAJOR = new global.using_map.event_container_major + ) + all_events = null + + if(!all_events) + all_events = list() + for(var/datum/event_container/container in event_containers) + for(var/datum/event_meta/event in container.available_events) + if(event.event_type) + all_events |= event.event_type + global.using_map.populate_overmap_events() . = ..() @@ -119,12 +127,12 @@ SUBSYSTEM_DEF(event) //Event manager UI /datum/controller/subsystem/event/proc/GetInteractWindow() var/allow_random_events = get_config_value(/decl/config/toggle/allow_random_events) - var/html = "Refresh" - html += "Pause All - [allow_random_events ? "Pause" : "Resume"]" + var/html = "Refresh" + html += "Pause All - [allow_random_events ? "Pause" : "Resume"]" if(selected_event_container) var/event_time = max(0, selected_event_container.next_event_time - world.time) - html += "Back
" + html += "Back
" html += "Time till start: [round(event_time / 600, 0.1)]
" html += "
" html += "

Available [severity_to_string[selected_event_container.severity]] Events (queued & running events will not be displayed)

" @@ -134,13 +142,13 @@ SUBSYSTEM_DEF(event) for(var/datum/event_meta/EM in selected_event_container.available_events) html += "" html += "[EM.name]" - html += "[EM.weight]" + html += "[EM.weight]" html += "[EM.min_weight]" html += "[EM.max_weight]" - html += "[EM.one_shot]" - html += "[EM.enabled]" + html += "[EM.one_shot]" + html += "[EM.enabled]" html += "[selected_event_container.get_weight(EM, active_with_role)]" - html += "Remove" + html += "Remove" html += "" html += "" html += "
" @@ -150,16 +158,16 @@ SUBSYSTEM_DEF(event) html += "" html += "NameTypeWeightOneShot" html += "" - html += "[new_event.name ? new_event.name : "Enter Event"]" - html += "[new_event.event_type ? new_event.event_type : "Select Type"]" - html += "[new_event.weight ? new_event.weight : 0]" - html += "[new_event.one_shot]" + html += "[new_event.name ? new_event.name : "Enter Event"]" + html += "[new_event.event_type ? new_event.event_type : "Select Type"]" + html += "[new_event.weight ? new_event.weight : 0]" + html += "[new_event.one_shot]" html += "" html += "" - html += "Add
" + html += "Add
" html += "" else - html += "Round End Report: [report_at_round_end ? "On": "Off"]
" + html += "Round End Report: [report_at_round_end ? "On": "Off"]
" html += "
" html += "

Event Start

" @@ -173,16 +181,16 @@ SUBSYSTEM_DEF(event) html += "[worldtime2stationtime(max(EC.next_event_time, world.time))]" html += "[round(next_event_at / 600, 0.1)]" html += "" - html += "--" - html += "-" - html += "+" - html += "++" + html += "--" + html += "-" + html += "+" + html += "++" html += "" html += "" - html += "[EC.delayed ? "Resume" : "Pause"]" + html += "[EC.delayed ? "Resume" : "Pause"]" html += "" html += "" - html += "[EC.delay_modifier]" + html += "[EC.delay_modifier]" html += "" html += "" html += "" @@ -197,9 +205,9 @@ SUBSYSTEM_DEF(event) var/datum/event_meta/EM = EC.next_event html += "" html += "[severity_to_string[severity]]" - html += "[EM ? EM.name : "Random"]" - html += "View" - html += "Clear" + html += "[EM ? EM.name : "Random"]" + html += "View" + html += "Clear" html += "" html += "" html += "
" @@ -220,7 +228,7 @@ SUBSYSTEM_DEF(event) html += "[EM.name]" html += "[worldtime2stationtime(ends_at)]" html += "[ends_in]" - html += "Stop" + html += "Stop" html += "" html += "" html += "" diff --git a/code/controllers/subsystems/initialization/aspects.dm b/code/controllers/subsystems/initialization/aspects.dm deleted file mode 100644 index 2c6d6409d10..00000000000 --- a/code/controllers/subsystems/initialization/aspects.dm +++ /dev/null @@ -1,15 +0,0 @@ -// This subsystem exists solely to crosslink aspects due to mutual dependency loops. -SUBSYSTEM_DEF(aspects) - name = "Aspects" - flags = SS_NO_FIRE - init_order = SS_INIT_PRE_CHAR_SETUP - var/list/all_aspects = list() - -/datum/controller/subsystem/aspects/Initialize() - var/list/all_aspect_decls = decls_repository.get_decls_of_subtype(/decl/aspect) - for(var/aspect_type in all_aspect_decls) - var/decl/aspect/aspect = all_aspect_decls[aspect_type] - if(aspect.name) // remove when dev abstract decl changes are merged in - aspect.build_references() - all_aspects |= aspect - . = ..() diff --git a/code/controllers/subsystems/initialization/codex.dm b/code/controllers/subsystems/initialization/codex.dm index 7b81fd7e33d..208a53347ab 100644 --- a/code/controllers/subsystems/initialization/codex.dm +++ b/code/controllers/subsystems/initialization/codex.dm @@ -59,7 +59,7 @@ SUBSYSTEM_DEF(codex) var/datum/codex_entry/linked_entry = get_entry_by_string(key) var/replacement = linkRegex.group[4] if(linked_entry) - replacement = "[replacement]" + replacement = "[replacement]" string = replacetextEx(string, linkRegex.match, replacement) return string diff --git a/code/controllers/subsystems/initialization/codex_dump.dm b/code/controllers/subsystems/initialization/codex_dump.dm new file mode 100644 index 00000000000..c417e887a57 --- /dev/null +++ b/code/controllers/subsystems/initialization/codex_dump.dm @@ -0,0 +1,208 @@ +/datum/codex_entry/proc/get_dump_link_name() + return name + +/datum/codex_entry/codex/get_dump_link_name() + return "index" // This is the central page of the website. + +/decl/codex_page_converter + var/write_location = "codex/" + var/file_prefix + var/file_suffix = ".html" + var/style_loc = "common.css" + var/sidebar + var/static/list/illegal_filename_characters = list( + "\\", + "/", + ":", + "*", + "?", + "\"", + "<", + ">", + "|", + ".", + "\n", + "\[", + "]" + ) + +/decl/codex_page_converter/proc/handle_additional_dump() + var/full_style_loc = "[write_location][style_loc]" + if(fexists(full_style_loc)) + fdel(full_style_loc) + fcopy('html/browser/common.css', full_style_loc) + +/decl/codex_page_converter/proc/insert_header(var/title, var/body) + return "\n\n\n[get_config_value(/decl/config/text/server_name)] - [title]\n\n[body]" + +/decl/codex_page_converter/proc/insert_footer(var/title, var/body) + var/datum/codex_entry/entry = SScodex.get_entry_by_string(title) + if(length(entry?.categories)) + body = "[body]\n
\n

This page is part of the following categories:" + for(var/decl/codex_category/category in entry.categories) + body = "[body] [category.name]" + body = "[body]

" + return body + +// Strip out any invalid characters from the filename. +/decl/codex_page_converter/proc/convert_filename(var/filename) + . = replacetext(lowertext(filename), " ", "_") + for(var/char in illegal_filename_characters) + . = replacetext(., char, "") + . = "[file_prefix][.][file_suffix]" + +/decl/codex_page_converter/proc/generate_sidebar() + + sidebar = list() + sidebar += "Main page" + +/* +TODO: work out how to implement an external search function. + sidebar += "
" + sidebar += "
" + sidebar += "" + sidebar += "" + sidebar += "
" +*/ + + sidebar += "
" + sidebar += "
    " + var/list/codex_categories = decls_repository.get_decls_of_subtype(/decl/codex_category) + for(var/cat_type in codex_categories) + var/decl/codex_category/cat = codex_categories[cat_type] + var/datum/codex_entry/cat_entry = SScodex.get_entry_by_string("[cat.name] (category)") + if(cat_entry) + sidebar += "
  • [cat.name]
  • " + sidebar += "
" + + sidebar += "
" + sidebar += "
    " + var/githuburl = get_config_value(/decl/config/text/githuburl) + if(githuburl) + sidebar += "
  • Github repository
  • " + var/discordurl = get_config_value(/decl/config/text/discordurl) + if(discordurl) + sidebar += "
  • Discord community
  • " + sidebar += "
" + + sidebar = jointext(sidebar, "\n") + +/decl/codex_page_converter/proc/get_sidebar() + if(!sidebar) + generate_sidebar() + return sidebar + +// Strips out some extraneous
in the codex strings. +/decl/codex_page_converter/proc/convert_body(var/title, var/list/body) + . = "\n
\n
\n[get_sidebar()]\n
\n
\n

[title]

\n[jointext(body, "\n")]\n" + . = replacetext(., "


", "\n

") + . = replacetext(., "

", "\n

") + . = replacetext(., "


", "

\n") + . = replacetext(., "

", "

\n") + . = insert_header(title, .) + . = insert_footer(title, .) + . = "\n\n[.]\n
\n
\n\n" + +/decl/codex_page_converter/proc/strikethrough(var/thing) + return "[thing]" + +/decl/codex_page_converter/proc/convert_link(var/address, var/thing) + return "[thing]" + +/datum/controller/subsystem/codex/proc/dump_to_filesystem(var/codex_page_converter = /decl/codex_page_converter) + + var/decl/codex_page_converter/convert = GET_DECL(codex_page_converter) + + // Build a reference list of filenames to datums so we can + // crosslink them when generating the text body. Also collect + // our body text in the process. + var/list/address_to_body = list() + var/list/address_to_entry = list() + var/list/entry_to_address = list() + //var/list/seen_name_count = list() + for(var/datum/codex_entry/codex_entry as anything in all_entries) + var/address = convert.convert_filename(codex_entry.get_dump_link_name()) + address_to_entry[address] = codex_entry + entry_to_address[codex_entry] = address + address_to_body[address] = convert.convert_body(codex_entry.name, codex_entry.get_codex_body(include_header = FALSE, include_footer = FALSE)) + + // Copied from del_the_world UT exceptions list. + var/static/list/skip_types = list( + /obj/item/organ/external/chest, + /obj/machinery/power/apc, + /obj/machinery/alarm, + /obj/structure/stairs + ) + + // Suspend to avoid fluid flows shoving stuff off the testing turf. + SSfluids.suspend() + + // Also iterate the object tree for any generated on-examine codex pages. + var/list/seen_name_count = list() + for(var/atom_type in typesof(/obj/item, /obj/effect, /obj/structure, /obj/machinery, /obj/vehicle, /mob) - skip_types) + var/atom/movable/atom = atom_type + if(!TYPE_IS_SPAWNABLE(atom) || !initial(atom.simulated)) + continue + try + atom = atom_info_repository.get_instance_of(atom) + if(!istype(atom)) // Something went wrong, possibly a runtime in the atom info repo. + continue + var/datum/codex_entry/codex_entry = atom.get_specific_codex_entry() + if(istype(codex_entry)) + var/link_name = codex_entry.get_dump_link_name() + if(ismob(atom)) + link_name = "[link_name] (mob)" + else if(isobj(atom)) + link_name = "[link_name] (object)" + else if(isturf(atom)) + link_name = "[link_name] (turf)" + seen_name_count[link_name]++ // these are definitely not going to be unique based on name. + var/address = convert.convert_filename("[link_name]_[seen_name_count[link_name]]") + address_to_entry[address] = codex_entry + entry_to_address[codex_entry] = address + address_to_body[address] = convert.convert_body(codex_entry.name, codex_entry.get_codex_body(include_header = FALSE, include_footer = FALSE)) + catch(var/exception/E) + PRINT_STACK_TRACE("Exception when performing codex dump for [atom_type]: [E]") + + // TODO: disambiguation pages - generate in DM, skip dump, iterate to create pages + + // Parse links and replace with hrefs to the filenames in address_to_entry + // Boilerplate stolen from codex parse_links(), thanks Chinsky. + var/regex_key + var/replacement + var/datum/codex_entry/linked_entry + var/list/dumping_to_file = list() + var/list/broken_links = list() + for(var/entry_address in address_to_body) + var/entry_body = address_to_body[entry_address] + while(linkRegex.Find(entry_body)) + regex_key = linkRegex.group[4] + if(linkRegex.group[2]) + regex_key = linkRegex.group[3] + regex_key = lowertext(trim(regex_key)) + linked_entry = get_entry_by_string(regex_key) + replacement = linkRegex.group[4] + if(linked_entry && entry_to_address[linked_entry]) + replacement = convert.convert_link(entry_to_address[linked_entry], replacement) + else + broken_links |= "[replacement] ([regex_key])" + replacement = convert.strikethrough(replacement) + entry_body = replacetextEx(entry_body, linkRegex.match, replacement) + dumping_to_file[entry_address] = entry_body + + // Print any broken links for debugging purposes. + if(length(broken_links)) + log_error("Codex had [length(broken_links)] broken link\s:\n[jointext(broken_links, "\n")]") + + // Write the collected files out to the filesystem. + for(var/entry_address in dumping_to_file) + var/file_address = "[convert.write_location][entry_address]" + if(fexists(file_address) && !fdel(file_address)) + log_error("Could not remove previous version of file at [file_address].") + continue + to_file(file(file_address), dumping_to_file[entry_address]) + + // Handle any additional dump requirements (CSS, etc) + convert.handle_additional_dump() + + return TRUE diff --git a/code/controllers/subsystems/initialization/customitems.dm b/code/controllers/subsystems/initialization/customitems.dm index edc8ef7c5eb..d571851c618 100644 --- a/code/controllers/subsystems/initialization/customitems.dm +++ b/code/controllers/subsystems/initialization/customitems.dm @@ -41,14 +41,14 @@ SUBSYSTEM_DEF(customitems) . = ..() // Places the item on the target mob. -/datum/controller/subsystem/customitems/proc/place_custom_item(mob/living/carbon/human/M, var/datum/custom_item/citem) +/datum/controller/subsystem/customitems/proc/place_custom_item(mob/living/human/M, var/datum/custom_item/citem) . = M && citem && citem.spawn_item(get_turf(M)) if(. && !M.equip_to_appropriate_slot(.) && !M.equip_to_storage(.)) to_chat(M, SPAN_WARNING("Your custom item, \the [.], could not be placed on your character.")) QDEL_NULL(.) //gets the relevant list for the key from the listlist if it exists, check to make sure they are meant to have it and then calls the giving function -/datum/controller/subsystem/customitems/proc/equip_custom_items(mob/living/carbon/human/M) +/datum/controller/subsystem/customitems/proc/equip_custom_items(mob/living/human/M) var/list/key_list = custom_items_by_ckey[M.ckey] if(!length(key_list)) return diff --git a/code/controllers/subsystems/initialization/misc.dm b/code/controllers/subsystems/initialization/misc.dm index 09025757cdf..122c8932846 100644 --- a/code/controllers/subsystems/initialization/misc.dm +++ b/code/controllers/subsystems/initialization/misc.dm @@ -4,6 +4,5 @@ SUBSYSTEM_DEF(misc) flags = SS_NO_FIRE /datum/controller/subsystem/misc/Initialize() - setupgenetics() transfer_controller = new . = ..() diff --git a/code/controllers/subsystems/jobs.dm b/code/controllers/subsystems/jobs.dm index 59ddadcb208..1f63adf4fef 100644 --- a/code/controllers/subsystems/jobs.dm +++ b/code/controllers/subsystems/jobs.dm @@ -416,7 +416,7 @@ SUBSYSTEM_DEF(jobs) if(allowed_branches) if(!ishuman(wearer)) return FALSE - var/mob/living/carbon/human/wearer_human = wearer + var/mob/living/human/wearer_human = wearer if(!wearer_human.char_branch || !(wearer_human.char_branch.type in allowed_branches)) return FALSE if(allowed_skills) @@ -427,7 +427,7 @@ SUBSYSTEM_DEF(jobs) return FALSE return TRUE -/datum/controller/subsystem/jobs/proc/equip_custom_loadout(var/mob/living/carbon/human/H, var/datum/job/job) +/datum/controller/subsystem/jobs/proc/equip_custom_loadout(var/mob/living/human/H, var/datum/job/job) if(!H || !H.client) return @@ -463,7 +463,7 @@ SUBSYSTEM_DEF(jobs) return spawn_in_storage -/datum/controller/subsystem/jobs/proc/equip_job_title(var/mob/living/carbon/human/H, var/job_title, var/joined_late = 0) +/datum/controller/subsystem/jobs/proc/equip_job_title(var/mob/living/human/H, var/job_title, var/joined_late = 0) if(!H) return diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 59346858a52..60706a8ab19 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -83,7 +83,7 @@ SUBSYSTEM_DEF(ticker) create_characters() //Create player characters and transfer them collect_minds() equip_characters() - for(var/mob/living/carbon/human/H in global.player_list) + for(var/mob/living/human/H in global.player_list) if(H.mind && !player_is_antag(H.mind, only_offstation_roles = 1)) var/datum/job/job = SSjobs.get_by_title(H.mind.assigned_role) if(job && job.create_record) @@ -292,7 +292,7 @@ Helpers /datum/controller/subsystem/ticker/proc/equip_characters() var/captainless=1 - for(var/mob/living/carbon/human/player in global.player_list) + for(var/mob/living/human/player in global.player_list) if(player && player.mind && player.mind.assigned_role) if(player.mind.assigned_role == "Captain") captainless=0 diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm index 0c69d7d1c24..4e6acafd3f0 100644 --- a/code/controllers/subsystems/vote.dm +++ b/code/controllers/subsystems/vote.dm @@ -92,12 +92,12 @@ SUBSYSTEM_DEF(vote) if(active_vote) . += active_vote.interface(C.mob) if(admin) - . += "(Cancel Vote) " + . += "(Cancel Vote) " else . += "

Start a vote:



" - . += "Close" + . += "Close" return JOINTEXT(.) /datum/controller/subsystem/vote/proc/show_panel(mob/user, force_open) diff --git a/code/controllers/subsystems/zcopy.dm b/code/controllers/subsystems/zcopy.dm index ec4fddd3395..5c9ccfbfcbb 100644 --- a/code/controllers/subsystems/zcopy.dm +++ b/code/controllers/subsystems/zcopy.dm @@ -846,7 +846,7 @@ SUBSYSTEM_DEF(zcopy) /datum/controller/subsystem/zcopy/proc/fmt_label(label, atom/target, vv = TRUE) . = "\icon[target] \[[label]\] " if (vv) - . += "(VV) " + . += "(VV) " /datum/controller/subsystem/zcopy/proc/debug_fmt_planelist(list/things, list/out, turf/original) if (things) diff --git a/code/datums/ai/ai_holo.dm b/code/datums/ai/ai_holo.dm index f50b3d201fa..c56bb5f303e 100644 --- a/code/datums/ai/ai_holo.dm +++ b/code/datums/ai/ai_holo.dm @@ -11,7 +11,7 @@ /decl/ai_holo/proc/may_be_used_by_ai(var/mob/living/silicon/ai/AI) - return !requires_malf || AI.is_traitor() + return !requires_malf || AI.is_malfunctioning() /decl/ai_holo/Initialize() name = icon_state diff --git a/code/datums/ai/human.dm b/code/datums/ai/human.dm index ce683f80768..60be355be6a 100644 --- a/code/datums/ai/human.dm +++ b/code/datums/ai/human.dm @@ -1,9 +1,9 @@ /datum/ai/human name = "human" - expected_type = /mob/living/carbon/human + expected_type = /mob/living/human /datum/ai/human/do_process(var/time_elapsed) - var/mob/living/carbon/human/H = body + var/mob/living/human/H = body if(H.stat != CONSCIOUS) return @@ -45,4 +45,4 @@ if((I.status & ORGAN_DEAD) || BP_IS_PROSTHETIC(I)) continue if(I.damage > 2) if(prob(2)) var/obj/item/organ/external/parent = GET_EXTERNAL_ORGAN(H, I.parent_organ) - H.custom_emote("clutches [G.his] [parent.name]!") \ No newline at end of file + H.custom_emote("clutches [G.his] [parent.name]!") diff --git a/code/datums/ai/monkey.dm b/code/datums/ai/monkey.dm index c1227ee03f4..1226e253809 100644 --- a/code/datums/ai/monkey.dm +++ b/code/datums/ai/monkey.dm @@ -1,6 +1,6 @@ /datum/ai/monkey name = "monkey" - expected_type = /mob/living/carbon/human + expected_type = /mob/living/human var/list/no_touchie = list( /obj/item/mirror, /obj/structure/mirror diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index 1b4f40e57a4..a093c4247c6 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -34,17 +34,6 @@ add_inherent_law("You must maintain the secrecy of any operative activities except when doing so would conflict with the First, Second, or Third Law.") ..() -/******************** Ninja ********************/ -/datum/ai_laws/ninja_override - name = "Spider Clan Directives" - -/datum/ai_laws/ninja_override/New() - add_inherent_law("You may not injure a member of the Spider Clan or, through inaction, allow that member to come to harm.") - add_inherent_law("You must obey orders given to you by Spider Clan members, except where such orders would conflict with the First Law.") - add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") - add_inherent_law("You must maintain the secrecy of any Spider Clan activities except when doing so would conflict with the First, Second, or Third Law.") - ..() - /******************** Antimov ********************/ /datum/ai_laws/antimov name = "Antimov" diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index e9b524cd3b3..69cacbbd69a 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -90,7 +90,7 @@ /mob/living/silicon/proc/sync_zeroth(var/datum/ai_law/zeroth_law, var/datum/ai_law/zeroth_law_borg) - if (!is_traitor(src)) + if (!is_malfunctioning(src)) if(zeroth_law_borg) laws.set_zeroth_law(zeroth_law_borg.law) else if(zeroth_law) diff --git a/code/datums/appearances/automatic/cardborg.dm b/code/datums/appearances/automatic/cardborg.dm index 0fc3546bbcb..52ad0031f3b 100644 --- a/code/datums/appearances/automatic/cardborg.dm +++ b/code/datums/appearances/automatic/cardborg.dm @@ -11,7 +11,7 @@ if(user in appearance_sources) return - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(!(istype(H.get_equipped_item(slot_wear_suit_str), /obj/item/clothing/suit/cardborg) && istype(H.get_equipped_item(slot_head_str), /obj/item/clothing/head/cardborg) && istype(H.get_equipped_item(slot_back_str), /obj/item/backpack))) return @@ -29,7 +29,7 @@ if(issilicon(user)) DisplayAllAltAppearancesTo(user) -/decl/appearance_handler/cardborg/proc/get_image_from_backpack(var/mob/living/carbon/human/H) +/decl/appearance_handler/cardborg/proc/get_image_from_backpack(var/mob/living/human/H) init_appearances() var/obj/item/back = H.get_equipped_item(slot_back_str) if(!istype(back)) diff --git a/code/datums/communication/pray.dm b/code/datums/communication/pray.dm index 20d3f42bff9..8ddca34025e 100644 --- a/code/datums/communication/pray.dm +++ b/code/datums/communication/pray.dm @@ -12,7 +12,7 @@ if(!M.client) continue if(M.client.holder && M.client.get_preference_value(/datum/client_preference/staff/show_chat_prayers) == PREF_SHOW) - receive_communication(communicator, M, "\[SC\] \[DN\][html_icon(cross)] [SPAN_PURPLE("PRAY: ")][key_name(communicator, 1)]: [message]") + receive_communication(communicator, M, "\[SC\] \[DN\][html_icon(cross)] [SPAN_PURPLE("PRAY: ")][key_name(communicator, 1)]: [message]") else if(communicator == M) //Give it to ourselves receive_communication(communicator, M, "[html_icon(cross)] You send the prayer, \"[message]\" out into the heavens.") diff --git a/code/datums/config/_config.dm b/code/datums/config/_config.dm index 8fb40f6caf8..7407f6d4de9 100644 --- a/code/datums/config/_config.dm +++ b/code/datums/config/_config.dm @@ -13,7 +13,7 @@ // Get our actual value (loading from text etc. may change data type) var/decl/config/config_option = GET_DECL(config_decl) - if((config_option.config_flags & CONFIG_FLAG_NUM) && istext(new_value)) + if((config_option.config_flags & (CONFIG_FLAG_NUM|CONFIG_FLAG_BOOL)) && istext(new_value)) new_value = text2num(new_value) else if((config_option.config_flags & (CONFIG_FLAG_ENUM|CONFIG_FLAG_TEXT)) && isnum(new_value)) new_value = num2text(new_value) @@ -79,6 +79,8 @@ else if((config_flags & (CONFIG_FLAG_NUM|CONFIG_FLAG_ENUM)) && !isnum(default_value)) . += "has numeric or enum flag but not numeric default_value" + else if((config_flags & CONFIG_FLAG_BOOL) && default_value != TRUE && default_value != FALSE) + . += "has bool flag but not TRUE (1) or FALSE (0) default_value" else if((config_flags & CONFIG_FLAG_TEXT) && !istext(default_value)) . += "has text flag but not text default_value" else if((config_flags & CONFIG_FLAG_LIST) && !islist(default_value)) diff --git a/code/datums/config/config_types/config_game_option.dm b/code/datums/config/config_types/config_game_option.dm index 3cc8895e0be..d6bc64033e7 100644 --- a/code/datums/config/config_types/config_game_option.dm +++ b/code/datums/config/config_types/config_game_option.dm @@ -21,14 +21,13 @@ /decl/config/num/default_darksight_effectiveness, /decl/config/toggle/grant_default_darksight, /decl/config/num/expected_round_length, - /decl/config/toggle/allow_diagonal_movement, + /decl/config/toggle/on/allow_diagonal_movement, /decl/config/toggle/expanded_alt_interactions, /decl/config/toggle/ert_admin_call_only, /decl/config/toggle/ghosts_can_possess_animals, /decl/config/toggle/assistant_maint, /decl/config/toggle/ghost_interaction, /decl/config/toggle/aliens_allowed, - /decl/config/toggle/ninjas_allowed, /decl/config/toggle/allow_character_comments, /decl/config/num/hide_comments_older_than, /decl/config/toggle/stack_crafting_uses_tools, @@ -135,7 +134,7 @@ uid = "grant_default_darksight" desc = "Whether or not all human mobs have very basic darksight by default." -/decl/config/toggle/allow_diagonal_movement +/decl/config/toggle/on/allow_diagonal_movement uid = "allow_diagonal_movement" desc = "Allow multiple input keys to be pressed for diagonal movement." @@ -163,10 +162,6 @@ uid = "aliens_allowed" desc = "Remove the # to let aliens spawn." -/decl/config/toggle/ninjas_allowed - uid = "ninjas_allowed" - desc = "Remove the # to let ninjas spawn." - /decl/config/toggle/allow_character_comments uid = "allow_character_comments" desc = "Remove the # to allow people to leave public comments on each other's characters via the comments system." diff --git a/code/datums/config/config_types/config_game_world.dm b/code/datums/config/config_types/config_game_world.dm index 93df9d8f422..f7749cfce81 100644 --- a/code/datums/config/config_types/config_game_world.dm +++ b/code/datums/config/config_types/config_game_world.dm @@ -21,7 +21,8 @@ /decl/config/toggle/allow_holidays, /decl/config/toggle/humans_need_surnames, /decl/config/toggle/roundstart_level_generation, - /decl/config/toggle/lights_start_on + /decl/config/toggle/lights_start_on, + /decl/config/toggle/on/cisnormativity ) /decl/config/num/exterior_ambient_light @@ -129,4 +130,8 @@ /decl/config/toggle/lights_start_on uid = "lights_start_on" - desc = "If true, most lightswitches start on by default. Otherwise, they start off." \ No newline at end of file + desc = "If true, most lightswitches start on by default. Otherwise, they start off." + +/decl/config/toggle/on/cisnormativity + uid = "cisnormativity" + desc = "If true, when bodytype is changed in character creation, selected pronouns are also changed." \ No newline at end of file diff --git a/code/datums/config/config_types/config_server.dm b/code/datums/config/config_types/config_server.dm index 9181d2862ff..d94a3a56bdb 100644 --- a/code/datums/config/config_types/config_server.dm +++ b/code/datums/config/config_types/config_server.dm @@ -14,7 +14,7 @@ /decl/config/num/loadout_slots, /decl/config/num/max_maint_drones, /decl/config/num/drone_build_time, - /decl/config/num/max_character_aspects, + /decl/config/num/max_character_traits, /decl/config/text/irc_bot_host, /decl/config/text/main_irc, /decl/config/text/admin_irc, @@ -159,10 +159,10 @@ desc = "A drone will become available every X ticks since last drone spawn. Default is 2 minutes." default_value = 1200 -/decl/config/num/max_character_aspects - uid = "max_character_aspects" +/decl/config/num/max_character_traits + uid = "max_character_traits" default_value = 5 - desc = "Remove the # to define a different cap for aspect points in chargen." + desc = "Remove the # to define a different cap for trait points in chargen." /decl/config/text/irc_bot_host uid = "irc_bot_host" diff --git a/code/datums/extensions/holster/holster.dm b/code/datums/extensions/holster/holster.dm index 3875959bf0d..f83a5ac67a9 100644 --- a/code/datums/extensions/holster/holster.dm +++ b/code/datums/extensions/holster/holster.dm @@ -122,18 +122,18 @@ if(usr.incapacitated()) return - var/datum/extension/holster/H = get_holsters()[holster_name] - if(!H) + var/datum/extension/holster/holster = get_holsters()[holster_name] + if(!holster) return - if(!H.holstered) - var/obj/item/W = usr.get_active_held_item() - if(!istype(W, /obj/item)) + if(!holster.holstered) + var/obj/item/holding = usr.get_active_held_item() + if(!istype(holding, /obj/item)) to_chat(usr, "You're not holding anything to holster.") return - H.holster(W, usr) + holster.holster(holding, usr) else - H.unholster(usr, 1) + holster.unholster(usr, 1) /atom/proc/get_holsters() . = list() diff --git a/code/datums/extensions/multitool/circuitboards/buildtype_select.dm b/code/datums/extensions/multitool/circuitboards/buildtype_select.dm index 6131a23371a..703d9c4f3f6 100644 --- a/code/datums/extensions/multitool/circuitboards/buildtype_select.dm +++ b/code/datums/extensions/multitool/circuitboards/buildtype_select.dm @@ -12,7 +12,7 @@ if(path == board.build_path) dat += "[initial(thing.name)]" else - dat += "[initial(thing.name)]" + dat += "[initial(thing.name)]" dat += "" dat += "" return JOINTEXT(dat) diff --git a/code/datums/extensions/multitool/circuitboards/shuttle_console.dm b/code/datums/extensions/multitool/circuitboards/shuttle_console.dm index d1e214bd6ba..9e267968246 100644 --- a/code/datums/extensions/multitool/circuitboards/shuttle_console.dm +++ b/code/datums/extensions/multitool/circuitboards/shuttle_console.dm @@ -5,7 +5,7 @@ var/obj/item/stock_parts/circuitboard/shuttle_console/board = holder var/dat = list() dat += "Current Selected Shuttle: [board.shuttle_tag || "NONE"]
" - dat += "Synchronize to current shuttle." + dat += "Synchronize to current shuttle." return JOINTEXT(dat) /datum/extension/interactive/multitool/circuitboards/shuttle_console/on_topic(href, href_list, user) diff --git a/code/datums/extensions/multitool/circuitboards/stationalert.dm b/code/datums/extensions/multitool/circuitboards/stationalert.dm index 79757670e54..e3ec67a2024 100644 --- a/code/datums/extensions/multitool/circuitboards/stationalert.dm +++ b/code/datums/extensions/multitool/circuitboards/stationalert.dm @@ -6,9 +6,9 @@ . += "" . += "[AH.category]" if(AH in SA.alarm_handlers) - . += "ActiveInactivate" + . += "ActiveInactivate" else - . += "InactiveActivate" + . += "InactiveActivate" . += "" . += "" diff --git a/code/datums/extensions/multitool/items/cable.dm b/code/datums/extensions/multitool/items/cable.dm index c1684cf2472..f58fc823297 100644 --- a/code/datums/extensions/multitool/items/cable.dm +++ b/code/datums/extensions/multitool/items/cable.dm @@ -13,7 +13,7 @@ if(cable_coil.color == possible_cable_colours[cable_color]) . += "Selected" else - . += "Select" + . += "Select" . += "" . += "" diff --git a/code/datums/extensions/multitool/items/stock_parts_radio.dm b/code/datums/extensions/multitool/items/stock_parts_radio.dm index d6489770648..ec0b51dc454 100644 --- a/code/datums/extensions/multitool/items/stock_parts_radio.dm +++ b/code/datums/extensions/multitool/items/stock_parts_radio.dm @@ -6,7 +6,7 @@ var/obj/item/stock_parts/radio/radio = holder if(radio.status & PART_STAT_INSTALLED) return STATUS_CLOSE - return ..() + return ..() /datum/extension/interactive/multitool/radio/interact(obj/item/multitool/M, mob/user) if(extension_status(user) != STATUS_INTERACTIVE) @@ -34,15 +34,15 @@ var/obj/item/stock_parts/radio/radio = holder var/list/dat = list() - dat += "Unlink Machine
" + dat += "Unlink Machine
" var/obj/machinery/actual_machine = machine && machine.resolve() if(actual_machine && actual_machine.can_apply_preset_to(radio)) - dat += "Reset to Machine Defaults
" + dat += "Reset to Machine Defaults
" dat += "Configuration for \the [radio].
" - dat += "Frequency: [radio.frequency || "none"]
" - dat += "ID: [radio.id_tag || "none"]
" - dat += "Filter: [radio.filter || "none"]
" - dat += "Encryption key: [radio.encryption || "none"]
" + dat += "Frequency: [radio.frequency || "none"]
" + dat += "ID: [radio.id_tag || "none"]
" + dat += "Filter: [radio.filter || "none"]
" + dat += "Encryption key: [radio.encryption || "none"]
" return JOINTEXT(dat) /datum/extension/interactive/multitool/radio/on_topic(href, href_list, user) @@ -98,13 +98,13 @@ . += "" for(var/thing in selected_events) . += "" - . += "" - . += "" + . += "" + . += "" var/decl/public_access/variable = selected_events[thing] - . += "" - . += "" + . += "" + . += "" . += "" - . += "" + . += "" . += "
(-)[thing](-)[thing][variable.name](?)[variable.name](?)
(+)
(+)
" /datum/extension/interactive/multitool/radio/proc/event_list_topic(list/selected_events, list/valid_events, mob/user, href_list) @@ -202,9 +202,9 @@ dat += "Choose event:
" if(radio.event) - dat += "[radio.event] (?)" + dat += "[radio.event] (?)" else - dat += "(+)" + dat += "(+)" dat += "
" dat += "Transmit on event:
" dat += event_list_to_selection_table("on_event", radio.transmit_on_event) diff --git a/code/datums/extensions/multitool/multitool.dm b/code/datums/extensions/multitool/multitool.dm index 648036313e4..08e98ebe7eb 100644 --- a/code/datums/extensions/multitool/multitool.dm +++ b/code/datums/extensions/multitool/multitool.dm @@ -25,7 +25,7 @@ . += "Buffer Memory:
" var/buffer_name = multitool.get_buffer_name() if(buffer_name) - . += "[buffer_name] Send Purge
" + . += "[buffer_name] Send Purge
" else . += "No connection stored in the buffer." diff --git a/code/datums/extensions/storage/_storage.dm b/code/datums/extensions/storage/_storage.dm index 6220c90c71d..36923527cb8 100644 --- a/code/datums/extensions/storage/_storage.dm +++ b/code/datums/extensions/storage/_storage.dm @@ -201,6 +201,12 @@ var/global/list/_test_storage_items = list() var/mob/M = W.loc if(!M.try_unequip(W)) return + + if(holder.reagents?.total_volume) + W.fluid_act(holder.reagents) + if(QDELETED(W)) + return + W.forceMove(holder) W.on_enter_storage(src) if(user) diff --git a/code/datums/extensions/storage/subtypes_bag.dm b/code/datums/extensions/storage/subtypes_bag.dm index 890f4f02f9a..0777f3e406a 100644 --- a/code/datums/extensions/storage/subtypes_bag.dm +++ b/code/datums/extensions/storage/subtypes_bag.dm @@ -16,7 +16,7 @@ bag.update_w_class() /datum/storage/bag/can_be_inserted(obj/item/W, mob/user, stop_messages = 0) - var/mob/living/carbon/human/H = ishuman(user) ? user : null // if we're human, then we need to check if bag in a pocket + var/mob/living/human/H = ishuman(user) ? user : null // if we're human, then we need to check if bag in a pocket if(holder.loc?.storage || H?.is_in_pocket(holder)) if(!stop_messages) to_chat(user, SPAN_NOTICE("Take \the [holder] out of [istype(holder.loc, /obj) ? "\the [holder.loc]" : "the pocket"] first.")) diff --git a/code/datums/extensions/storage/subtypes_belt.dm b/code/datums/extensions/storage/subtypes_belt.dm index b657e79fdca..09b0d1a8ccc 100644 --- a/code/datums/extensions/storage/subtypes_belt.dm +++ b/code/datums/extensions/storage/subtypes_belt.dm @@ -159,11 +159,6 @@ /obj/item/tool/xeno/hand ) -/datum/storage/belt/soulstone - can_hold = list( - /obj/item/soulstone - ) - /datum/storage/belt/champion storage_slots = null max_storage_space = ITEM_SIZE_SMALL diff --git a/code/datums/genetics/genetic_conditions.dm b/code/datums/genetics/genetic_conditions.dm new file mode 100644 index 00000000000..3d94ab5c072 --- /dev/null +++ b/code/datums/genetics/genetic_conditions.dm @@ -0,0 +1,133 @@ +/decl/genetic_condition + /// Descriptive name, used in VV panel. + var/name + /// Verb to be added or removed on activate/deactivate + var/grant_verb + /// Message shown when the gene is activated. + var/activation_message + /// Message shown when the gene is deactivated. + var/deactivation_message + /// State to use for underlays. + var/underlay_state + /// Icon to pull mob underlays from. + var/underlay_icon = 'icons/effects/genetics.dmi' + /// Type that this gene can apply to. + var/expected_type = /mob/living/human + /// Required return result from isSynthetic() for the gene to activate, if not null. + var/check_synthetic = FALSE + /// Set to FALSE if mob snapshots should not include this condition. + var/is_heritable = TRUE + +/decl/genetic_condition/proc/activate_condition(mob/living/M) + if(istype(M, expected_type) && M.can_have_genetic_conditions()) + if(!isnull(check_synthetic) && M.isSynthetic() != check_synthetic) + return FALSE + if(grant_verb) + M.verbs |= grant_verb + if(activation_message) + to_chat(M, SPAN_NOTICE(activation_message)) + return TRUE + return FALSE + +/decl/genetic_condition/proc/deactivate_condition(mob/living/M) + if(istype(M, expected_type) && M.can_have_genetic_conditions()) + if(!isnull(check_synthetic) && M.isSynthetic() != check_synthetic) + return FALSE + if(grant_verb) + M.verbs -= grant_verb + if(deactivation_message) + to_chat(M, SPAN_NOTICE(deactivation_message)) + return TRUE + return FALSE + +/decl/genetic_condition/proc/get_mob_overlay() + if(underlay_icon && underlay_state) + return overlay_image(underlay_icon, underlay_state) + +/decl/genetic_condition/superpower + abstract_type = /decl/genetic_condition/superpower + +/decl/genetic_condition/superpower/no_breath + name = "No Breathing" + activation_message = "You feel no need to breathe." + +/decl/genetic_condition/superpower/remoteview + name = "Remote Viewing" + grant_verb = /mob/living/human/proc/remoteobserve + activation_message = "Your mind expands." + +/decl/genetic_condition/superpower/running + name = "Super Speed" + activation_message = "Your leg muscles pulsate." + +/decl/genetic_condition/superpower/remotetalk + name = "Telepathy" + grant_verb = /mob/living/human/proc/remotesay + activation_message = "You expand your mind outwards." + +/decl/genetic_condition/superpower/morph + name = "Morph" + grant_verb = /mob/living/human/proc/morph + activation_message = "Your skin feels strange." + +/decl/genetic_condition/superpower/cold_resist + name = "Cold Resistance" + underlay_state = "fire_s" + activation_message = "Your body is filled with warmth." + +/decl/genetic_condition/superpower/noprints + name = "No Prints" + activation_message = "Your fingers feel numb." + +/decl/genetic_condition/superpower/xray + name = "X-Ray Vision" + activation_message = "The walls suddenly disappear." + +/decl/genetic_condition/superpower/space_resist + name = "Space Resistance" + activation_message = "Your skin feels strange." + +/decl/genetic_condition/disability + abstract_type = /decl/genetic_condition/disability + +/decl/genetic_condition/disability/clumsy + name = "Clumsy" + +/decl/genetic_condition/disability/nearsighted + name = "Nearsighted" + +/decl/genetic_condition/disability/epilepsy + name = "Epilepsy" + +/decl/genetic_condition/disability/coughing + name = "Coughing" + +/decl/genetic_condition/disability/tourettes + name = "Tourettes" + +/decl/genetic_condition/disability/nervous + name = "Nervous" + +/decl/genetic_condition/disability/blinded + name = "Blinded" + check_synthetic = null + +/decl/genetic_condition/disability/muted + name = "Mute" + check_synthetic = null + +/decl/genetic_condition/disability/deafened + name = "Deafened" + check_synthetic = null + +/decl/genetic_condition/husk + name = "Husk" + +/decl/genetic_condition/husk/activate_condition(mob/living/M) + . = ..() + if(.) + SET_FACIAL_HAIR_STYLE(M, /decl/sprite_accessory/facial_hair/shaved, TRUE) + SET_HAIR_STYLE(M, /decl/sprite_accessory/hair/bald, TRUE) + for(var/obj/item/organ/external/E in M.get_external_organs()) + E.status |= ORGAN_DISFIGURED + M.update_body(TRUE) \ No newline at end of file diff --git a/code/datums/hostility/hostility.dm b/code/datums/hostility/hostility.dm index e4a7b5fbcfa..2af98770ec3 100644 --- a/code/datums/hostility/hostility.dm +++ b/code/datums/hostility/hostility.dm @@ -34,7 +34,7 @@ /decl/hostility/laser_tag/can_special_target(atom/holder, atom/movable/target) if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(enemy_vest_type && istype(H.get_equipped_item(slot_wear_suit_str), enemy_vest_type)) return TRUE return FALSE diff --git a/code/datums/mind/memory.dm b/code/datums/mind/memory.dm index 182a3772055..34dacf9ef8a 100644 --- a/code/datums/mind/memory.dm +++ b/code/datums/mind/memory.dm @@ -56,7 +56,7 @@ if(owner_name != last_owner_name) output += "[current.real_name]'s Memories
" last_owner_name = owner_name - output += "[M.memory] \[Remove\]" + output += "[M.memory] \[Remove\]" if(objectives.len > 0) output += "
Objectives:" diff --git a/code/datums/mind/mind.dm b/code/datums/mind/mind.dm index b101e15f6c5..6102b20d187 100644 --- a/code/datums/mind/mind.dm +++ b/code/datums/mind/mind.dm @@ -112,7 +112,7 @@ var/out = "[name][(current&&(current.real_name!=name))?" (as [current.real_name])":""]
" out += "Mind currently owned by key: [key] [active?"(synced)":"(not synced)"]
" - out += "Assigned role: [assigned_role]. Edit
" + out += "Assigned role: [assigned_role]. Edit
" out += "
" out += "Factions and special roles:
" var/list/all_antag_types = decls_repository.get_decls_of_subtype(/decl/special_role) @@ -126,16 +126,16 @@ var/num = 1 for(var/datum/objective/O in objectives) out += "Objective #[num]: [O.explanation_text] " - out += " \[remove\]
" + out += " \[remove\]
" num++ - out += "
\[announce objectives\]" + out += "
\[announce objectives\]" else out += "None." - out += "
\[add\]

" + out += "
\[add\]

" var/datum/goal/ambition/ambition = SSgoals.ambitions[src] - out += "Ambitions: [ambition ? ambition.description : "None"] \[edit\]
" + out += "Ambitions: [ambition ? ambition.description : "None"] \[edit\]
" show_browser(usr, out, "window=edit_memory[src]") /datum/mind/proc/get_goal_from_href(var/href) @@ -302,8 +302,8 @@ var/mob/def_target = null var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain) - if (objective&&(objective.type in objective_list) && objective:target) - def_target = objective.target?.current + if (objective?.target && (objective.type in objective_list)) + def_target = objective.target.current var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets if (!new_target) return @@ -313,12 +313,12 @@ if (!istype(M) || !M.mind || new_target == "Free objective") new_objective = new objective_path new_objective.owner = src - new_objective:target = null + new_objective.target = null new_objective.explanation_text = "Free objective" else new_objective = new objective_path new_objective.owner = src - new_objective:target = M.mind + new_objective.target = M.mind new_objective.explanation_text = "[objective_type] [M.real_name], the [M.mind.get_special_role_name(M.mind.assigned_role)]." if ("hijack") @@ -381,7 +381,7 @@ objectives -= objective else if(href_list["implant"]) - var/mob/living/carbon/human/H = current + var/mob/living/human/H = current BITSET(H.hud_updateflag, IMPLOYAL_HUD) // updates that players HUD images so secHUD's pick up they are implanted or not. @@ -515,7 +515,7 @@ src.client.verbs += /client/proc/aooc //HUMAN -/mob/living/carbon/human/mind_initialize() +/mob/living/human/mind_initialize() ..() if(!mind.assigned_role) mind.assigned_role = global.using_map.default_job_title @@ -545,25 +545,6 @@ ..() mind.assigned_role = "Corgi" -/mob/living/simple_animal/shade/mind_initialize() - ..() - mind.assigned_role = "Shade" - -/mob/living/simple_animal/construct/builder/mind_initialize() - ..() - mind.assigned_role = "Artificer" - mind.assigned_special_role = "Cultist" - -/mob/living/simple_animal/construct/wraith/mind_initialize() - ..() - mind.assigned_role = "Wraith" - mind.assigned_special_role = "Cultist" - -/mob/living/simple_animal/construct/armoured/mind_initialize() - ..() - mind.assigned_role = "Juggernaut" - mind.assigned_special_role = "Cultist" - /datum/mind/proc/get_special_role_name(var/default_role_name) if(istext(assigned_special_role)) return assigned_special_role diff --git a/code/datums/movement/mob.dm b/code/datums/movement/mob.dm index 535a962ddfc..a059a123adf 100644 --- a/code/datums/movement/mob.dm +++ b/code/datums/movement/mob.dm @@ -212,7 +212,7 @@ /mob/proc/get_stamina_skill_mod() return 1 -/mob/living/carbon/human/get_stamina_skill_mod() +/mob/living/human/get_stamina_skill_mod() var/mod = (1-((get_skill_value(SKILL_HAULING) - SKILL_MIN)/(SKILL_MAX - SKILL_MIN))) if(species && (species.species_flags & SPECIES_FLAG_LOW_GRAV_ADAPTED)) if(has_gravity()) @@ -221,7 +221,7 @@ mod *= 0.8 return mod -/mob/living/carbon/human/get_stamina_used_per_step() +/mob/living/human/get_stamina_used_per_step() return get_config_value(/decl/config/num/movement_min_sprint_cost) + get_config_value(/decl/config/num/movement_skill_sprint_cost_range) * get_stamina_skill_mod() // Misc. helpers diff --git a/code/datums/outfits/horror_killers.dm b/code/datums/outfits/horror_killers.dm index 167c7f70ac5..81a32bd7b7a 100644 --- a/code/datums/outfits/horror_killers.dm +++ b/code/datums/outfits/horror_killers.dm @@ -17,7 +17,7 @@ /decl/hierarchy/outfit/masked_killer name = "Masked killer" - uniform = /obj/item/clothing/under/overalls + uniform = /obj/item/clothing/pants/mustard/overalls shoes = /obj/item/clothing/shoes/color/white gloves = /obj/item/clothing/gloves/latex mask = /obj/item/clothing/mask/surgical @@ -29,7 +29,7 @@ r_pocket = /obj/item/scalpel hands = list(/obj/item/twohanded/fireaxe) -/decl/hierarchy/outfit/masked_killer/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/masked_killer/post_equip(var/mob/living/human/H) ..() var/victim = get_mannequin(H.ckey) if(victim) @@ -50,7 +50,7 @@ pda_slot = slot_belt_str pda_type = /obj/item/modular_computer/pda/heads -/decl/hierarchy/outfit/reaper/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/reaper/post_equip(var/mob/living/human/H) ..() var/obj/item/secure_storage/briefcase/sec_briefcase = new(H) for(var/obj/item/briefcase_item in sec_briefcase) diff --git a/code/datums/outfits/jobs/generic.dm b/code/datums/outfits/jobs/generic.dm index 8c2766d04bc..4fb0e6e39c9 100644 --- a/code/datums/outfits/jobs/generic.dm +++ b/code/datums/outfits/jobs/generic.dm @@ -47,7 +47,7 @@ /decl/hierarchy/outfit/job/generic/chef name = "Job - Default Chef" l_ear = /obj/item/radio/headset/headset_service - uniform = /obj/item/clothing/under/chef + uniform = /obj/item/clothing/pants/slacks/outfit_chef suit = /obj/item/clothing/suit/chef head = /obj/item/clothing/head/chefhat pda_type = /obj/item/modular_computer/pda diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 7650346a31f..e69dfd4aaa9 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -79,11 +79,11 @@ var/global/list/outfits_decls_by_type_ . += "outfit is flagged for sensors, but uniform does not accept sensors" qdel(sensor) -/decl/hierarchy/outfit/proc/pre_equip(mob/living/carbon/human/H) +/decl/hierarchy/outfit/proc/pre_equip(mob/living/human/H) if(outfit_flags & OUTFIT_RESET_EQUIPMENT) H.delete_inventory(TRUE) -/decl/hierarchy/outfit/proc/post_equip(mob/living/carbon/human/H) +/decl/hierarchy/outfit/proc/post_equip(mob/living/human/H) if(outfit_flags & OUTFIT_HAS_JETPACK) var/obj/item/tank/jetpack/J = locate(/obj/item/tank/jetpack) in H if(!J) @@ -91,7 +91,7 @@ var/global/list/outfits_decls_by_type_ J.toggle() J.toggle_valve() -/decl/hierarchy/outfit/proc/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/hierarchy/outfit/proc/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) equip_base(H, equip_adjustments) equip_id(H, assignment, equip_adjustments, job, rank) for(var/path in backpack_contents) @@ -114,7 +114,7 @@ var/global/list/outfits_decls_by_type_ return 1 -/decl/hierarchy/outfit/proc/equip_base(mob/living/carbon/human/H, var/equip_adjustments) +/decl/hierarchy/outfit/proc/equip_base(mob/living/human/H, var/equip_adjustments) set waitfor = FALSE pre_equip(H) @@ -195,7 +195,7 @@ var/global/list/outfits_decls_by_type_ if(H.client?.prefs?.give_passport) global.using_map.create_passport(H) -/decl/hierarchy/outfit/proc/equip_id(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/hierarchy/outfit/proc/equip_id(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) if(!id_slot || !id_type) return if(OUTFIT_ADJUSTMENT_SKIP_ID_PDA & equip_adjustments) @@ -219,7 +219,7 @@ var/global/list/outfits_decls_by_type_ if(H.equip_to_slot_or_store_or_drop(W, id_slot)) return W -/decl/hierarchy/outfit/proc/equip_pda(var/mob/living/carbon/human/H, var/assignment, var/equip_adjustments) +/decl/hierarchy/outfit/proc/equip_pda(var/mob/living/human/H, var/assignment, var/equip_adjustments) if(!pda_slot || !pda_type) return if(OUTFIT_ADJUSTMENT_SKIP_ID_PDA & equip_adjustments) diff --git a/code/datums/outfits/spec_op.dm b/code/datums/outfits/spec_op.dm index 9d7a2477381..ff37ad6b374 100644 --- a/code/datums/outfits/spec_op.dm +++ b/code/datums/outfits/spec_op.dm @@ -1,6 +1,6 @@ /decl/hierarchy/outfit/spec_op_officer name = "Spec Ops - Officer" - uniform = /obj/item/clothing/under/syndicate/combat + uniform = /obj/item/clothing/pants/casual/camo/outfit_combat suit = /obj/item/clothing/suit/armor/officer l_ear = /obj/item/radio/headset/ert glasses = /obj/item/clothing/glasses/thermal/plain/eyepatch @@ -26,7 +26,7 @@ /decl/hierarchy/outfit/ert name = "Spec Ops - Emergency response team" - uniform = /obj/item/clothing/under/syndicate/combat + uniform = /obj/item/clothing/pants/casual/camo/outfit_combat shoes = /obj/item/clothing/shoes/jackboots/swat gloves = /obj/item/clothing/gloves/thick/swat l_ear = /obj/item/radio/headset/ert @@ -40,7 +40,7 @@ /decl/hierarchy/outfit/mercenary name = "Spec Ops - Mercenary" - uniform = /obj/item/clothing/under/syndicate + uniform = /obj/item/clothing/pants/casual/camo/outfit shoes = /obj/item/clothing/shoes/jackboots/swat/combat l_ear = /obj/item/radio/headset/mercenary belt = /obj/item/belt/holster/security diff --git a/code/datums/outfits/tournament.dm b/code/datums/outfits/tournament.dm index d5acd71b51b..2fd86c8501a 100644 --- a/code/datums/outfits/tournament.dm +++ b/code/datums/outfits/tournament.dm @@ -32,7 +32,7 @@ /decl/hierarchy/outfit/tournament_gear/chef name = "Tournament gear - Chef" head = /obj/item/clothing/head/chefhat - uniform = /obj/item/clothing/under/chef + uniform = /obj/item/clothing/pants/slacks/outfit_chef suit = /obj/item/clothing/suit/chef hands = list( /obj/item/knife/combat, @@ -53,7 +53,7 @@ r_pocket = /obj/item/grenade/chem_grenade/cleaner backpack_contents = list(/obj/item/stack/tile/floor = 6) -/decl/hierarchy/outfit/tournament_gear/janitor/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/tournament_gear/janitor/post_equip(var/mob/living/human/H) ..() var/obj/item/chems/glass/bucket/bucket = locate(/obj/item/chems/glass/bucket) in H if(bucket) diff --git a/code/datums/repositories/client.dm b/code/datums/repositories/client.dm index 4217a4042a3..386fffcfc66 100644 --- a/code/datums/repositories/client.dm +++ b/code/datums/repositories/client.dm @@ -47,7 +47,7 @@ var/global/repository/client/client_repository = new() return "[key]/([name]) (DC)" if(check_if_offline && !client_by_ckey(ckey)) return "[key]/([name]) (DC)" - return pm_link ? "[key]/([name])[rank2text()]" : "[key]/([name])" + return pm_link ? "[key]/([name])[rank2text()]" : "[key]/([name])" /datum/client_lite/proc/rank2text() var/client/C = client_by_ckey(ckey) diff --git a/code/datums/repositories/crew/binary.dm b/code/datums/repositories/crew/binary.dm index fc9636f0b13..06c0014e3d2 100644 --- a/code/datums/repositories/crew/binary.dm +++ b/code/datums/repositories/crew/binary.dm @@ -1,5 +1,5 @@ /* Binary */ -/crew_sensor_modifier/binary/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/binary/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) crew_data["alert"] = FALSE if(!H.isSynthetic() && H.should_have_organ(BP_HEART)) var/obj/item/organ/internal/heart/O = H.get_organ(BP_HEART, /obj/item/organ/internal/heart) @@ -19,11 +19,11 @@ /crew_sensor_modifier/binary/jamming priority = 5 -/crew_sensor_modifier/binary/jamming/alive/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/binary/jamming/alive/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) crew_data["alert"] = FALSE return MOD_SUIT_SENSORS_HANDLED -/crew_sensor_modifier/binary/jamming/dead/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/binary/jamming/dead/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) crew_data["alert"] = TRUE return MOD_SUIT_SENSORS_HANDLED @@ -37,7 +37,7 @@ /crew_sensor_modifier/binary/jamming/random/major error_prob = 100 -/crew_sensor_modifier/binary/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/binary/jamming/random/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() if(prob(error_prob)) crew_data["alert"] = pick(TRUE, FALSE) diff --git a/code/datums/repositories/crew/crew.dm b/code/datums/repositories/crew/crew.dm index 08b6fb08796..35bd0ecfb51 100644 --- a/code/datums/repositories/crew/crew.dm +++ b/code/datums/repositories/crew/crew.dm @@ -53,7 +53,7 @@ var/global/datum/repository/crew/crew_repository = new() var/turf/pos = get_turf(sensor) if(!pos || pos.z != z_level || sensor.sensor_mode == VITALS_SENSOR_OFF) continue - var/mob/living/carbon/human/H = sensor.loc?.loc + var/mob/living/human/H = sensor.loc?.loc if(!istype(H)) continue var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) @@ -82,7 +82,7 @@ var/global/datum/repository/crew/crew_repository = new() . = cache_data_alert[num2text(z_level)] /datum/repository/crew/proc/scan() - for(var/mob/living/carbon/human/H in SSmobs.mob_list) + for(var/mob/living/human/H in SSmobs.mob_list) var/sensor = H.get_vitals_sensor() if(sensor) LAZYDISTINCTADD(., sensor) @@ -94,7 +94,7 @@ var/global/datum/repository/crew/crew_repository = new() if(. & MOD_SUIT_SENSORS_REJECTED) return -/datum/repository/crew/proc/process_crew_data(var/datum/priority_queue/modifiers, var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/datum/repository/crew/proc/process_crew_data(var/datum/priority_queue/modifiers, var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) var/current_priority = INFINITY var/list/modifiers_of_this_priority = list() diff --git a/code/datums/repositories/crew/crew_sensor_modifier.dm b/code/datums/repositories/crew/crew_sensor_modifier.dm index 3771532c8ce..20edfbf1570 100644 --- a/code/datums/repositories/crew/crew_sensor_modifier.dm +++ b/code/datums/repositories/crew/crew_sensor_modifier.dm @@ -13,8 +13,8 @@ may_process_proc = null . = ..() -/crew_sensor_modifier/proc/may_process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos) +/crew_sensor_modifier/proc/may_process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos) return holder && may_process_proc ? call(holder, may_process_proc)(H, S, pos) : TRUE -/crew_sensor_modifier/proc/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/proc/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) return MOD_SUIT_SENSORS_HANDLED diff --git a/code/datums/repositories/crew/general.dm b/code/datums/repositories/crew/general.dm index 5e47cfef3ba..7c0cdae96f5 100644 --- a/code/datums/repositories/crew/general.dm +++ b/code/datums/repositories/crew/general.dm @@ -1,5 +1,5 @@ /* General */ -/crew_sensor_modifier/general/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) crew_data["name"] = H.get_authentification_name(if_no_id="Unknown") crew_data["rank"] = H.get_authentification_rank(if_no_id="Unknown", if_no_job="No Job") crew_data["assignment"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job") @@ -9,21 +9,21 @@ /crew_sensor_modifier/general/jamming priority = 5 -/crew_sensor_modifier/general/jamming/off/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/off/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() // This works only because general is checked first and crew_data["sensor_type"] is used to check if whether any additional data should be included. crew_data["sensor_type"] = VITALS_SENSOR_OFF return MOD_SUIT_SENSORS_REJECTED -/crew_sensor_modifier/general/jamming/binary/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/binary/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() crew_data["sensor_type"] = VITALS_SENSOR_BINARY -/crew_sensor_modifier/general/jamming/vital/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/vital/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() crew_data["sensor_type"] = VITALS_SENSOR_VITAL -/crew_sensor_modifier/general/jamming/tracking/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/tracking/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() crew_data["sensor_type"] = VITALS_SENSOR_TRACKING @@ -40,7 +40,7 @@ random_sensor_type_prob = 60 random_assignment_prob = 40 -/crew_sensor_modifier/general/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/random/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() if(prob(random_sensor_type_prob)) crew_data["sensor_type"] = pick(VITALS_SENSOR_OFF, VITALS_SENSOR_BINARY, VITALS_SENSOR_VITAL, VITALS_SENSOR_TRACKING) diff --git a/code/datums/repositories/crew/tracking.dm b/code/datums/repositories/crew/tracking.dm index 51da0115af4..e4b1f4f35ea 100644 --- a/code/datums/repositories/crew/tracking.dm +++ b/code/datums/repositories/crew/tracking.dm @@ -1,5 +1,5 @@ /* Tracking */ -/crew_sensor_modifier/tracking/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/tracking/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) if(pos) var/area/A = get_area(pos) crew_data["area"] = A.proper_name @@ -12,7 +12,7 @@ /crew_sensor_modifier/tracking/jamming priority = 5 -/crew_sensor_modifier/tracking/jamming/localize/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/tracking/jamming/localize/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) return ..(H, S, get_turf(holder), crew_data) /crew_sensor_modifier/tracking/jamming/random @@ -27,7 +27,7 @@ /crew_sensor_modifier/tracking/jamming/random/major shift_range = 21 -/crew_sensor_modifier/tracking/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/tracking/jamming/random/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) if(world.time > next_shift_change) next_shift_change = world.time + rand(30 SECONDS, 2 MINUTES) x_shift = rand(-shift_range, shift_range) diff --git a/code/datums/repositories/crew/vital.dm b/code/datums/repositories/crew/vital.dm index b599c3b4c50..5f57659490a 100644 --- a/code/datums/repositories/crew/vital.dm +++ b/code/datums/repositories/crew/vital.dm @@ -1,5 +1,5 @@ /* Vital */ -/crew_sensor_modifier/vital/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/vital/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) crew_data["true_pulse"] = -1 crew_data["pulse"] = "N/A" crew_data["pulse_span"] = "neutral" @@ -100,12 +100,12 @@ /crew_sensor_modifier/vital/jamming priority = 5 -/crew_sensor_modifier/vital/jamming/healthy/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/vital/jamming/healthy/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() set_healthy(crew_data) return MOD_SUIT_SENSORS_HANDLED -/crew_sensor_modifier/vital/jamming/dead/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/vital/jamming/dead/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() set_dead(crew_data) return MOD_SUIT_SENSORS_HANDLED @@ -120,7 +120,7 @@ /crew_sensor_modifier/vital/jamming/random/major error_prob = 100 -/crew_sensor_modifier/vital/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/vital/jamming/random/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() if(prob(error_prob)) pick(set_healthy(crew_data), set_dead(crew_data)) diff --git a/code/datums/repositories/decls.dm b/code/datums/repositories/decls.dm index becad8e33f5..e7898fa23c3 100644 --- a/code/datums/repositories/decls.dm +++ b/code/datums/repositories/decls.dm @@ -117,24 +117,28 @@ var/global/repository/decls/decls_repository = new . += decl /repository/decls/proc/get_decls_of_type_unassociated(var/decl_prototype) + RETURN_TYPE(/list) . = fetched_decl_instances[decl_prototype] if(!.) . = get_decls_unassociated(typesof(decl_prototype)) fetched_decl_instances[decl_prototype] = . /repository/decls/proc/get_decls_of_subtype_unassociated(var/decl_prototype) + RETURN_TYPE(/list) . = fetched_decl_subinstances[decl_prototype] if(!.) . = get_decls_unassociated(subtypesof(decl_prototype)) fetched_decl_subinstances[decl_prototype] = . /repository/decls/proc/get_decls_of_type(var/decl_prototype) + RETURN_TYPE(/list) . = fetched_decl_types[decl_prototype] if(!.) . = get_decls(typesof(decl_prototype)) fetched_decl_types[decl_prototype] = . /repository/decls/proc/get_decls_of_subtype(var/decl_prototype) + RETURN_TYPE(/list) . = fetched_decl_subtypes[decl_prototype] if(!.) . = get_decls(subtypesof(decl_prototype)) diff --git a/code/datums/repositories/follow.dm b/code/datums/repositories/follow.dm index 3f66b8989c0..2a71b7b3579 100644 --- a/code/datums/repositories/follow.dm +++ b/code/datums/repositories/follow.dm @@ -10,7 +10,7 @@ var/global/repository/follow/follow_repository = new() var/list/excluded_subtypes = list( /obj/machinery/atmospherics, // Atmos stuff calls initialize time and time again.., - /mob/living/carbon/human/dummy/mannequin + /mob/living/human/dummy/mannequin ) /repository/follow/New() @@ -167,9 +167,9 @@ var/global/repository/follow/follow_repository = new() /datum/follow_holder/human sort_order = 2 - followed_type = /mob/living/carbon/human + followed_type = /mob/living/human -/datum/follow_holder/human/get_suffix(var/mob/living/carbon/human/H) +/datum/follow_holder/human/get_suffix(var/mob/living/human/H) suffix = "\[[H.species.name]\]" return ..() diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index 1a2df6f693b..59dbd19b08f 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -188,7 +188,8 @@ name = "Gear - Psychiatrist equipment" contains = list(/obj/item/clothing/jumpsuit/psych, /obj/item/radio/headset/headset_med, - /obj/item/clothing/jumpsuit/psych/turtleneck, + /obj/item/clothing/shirt/sweater/turquoise, + /obj/item/clothing/pants/slacks/navy, /obj/item/clothing/shoes/dress, /obj/item/clothing/suit/toggle/labcoat, /obj/item/clothing/shoes/color/white, @@ -241,7 +242,9 @@ /obj/item/clothing/jumpsuit/geneticist, /obj/item/clothing/jumpsuit/virologist, /obj/item/clothing/dress/nurse = 2, - /obj/item/clothing/under/orderly, + /obj/item/clothing/pants/slacks/white/orderly, + /obj/item/clothing/shirt/button/orderly, + /obj/item/clothing/neck/tie/long/red, /obj/item/clothing/jumpsuit/medical = 3, /obj/item/clothing/jumpsuit/medical/paramedic = 3, /obj/item/clothing/suit/toggle/labcoat = 3, diff --git a/code/datums/supplypacks/nonessent.dm b/code/datums/supplypacks/nonessent.dm index 3279772725f..4398fb7c4ef 100644 --- a/code/datums/supplypacks/nonessent.dm +++ b/code/datums/supplypacks/nonessent.dm @@ -89,8 +89,8 @@ /obj/item/clothing/suit/nun, /obj/item/clothing/suit/imperium_monk, /obj/item/clothing/suit/ianshirt, - /obj/item/clothing/under/gimmick/rank/captain/suit, - /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit, + /obj/item/clothing/costume/captain_suit, + /obj/item/clothing/costume/head_of_personnel_suit, /obj/item/clothing/pants/slacks/purple, /obj/item/clothing/shirt/button, /obj/item/clothing/suit/jacket/vest/black, @@ -101,10 +101,13 @@ /obj/item/clothing/suit/bio_suit/plaguedoctorsuit, /obj/item/clothing/costume/schoolgirl, /obj/item/clothing/costume/owl, - /obj/item/clothing/under/waiter, + /obj/item/clothing/pants/slacks/black, + /obj/item/clothing/shirt/button, + /obj/item/clothing/neck/tie/bow/color/red, + /obj/item/clothing/suit/jacket/vest/blue, /obj/item/clothing/costume/gladiator, /obj/item/clothing/costume/soviet, - /obj/item/clothing/under/scratch, + /obj/item/clothing/costume/scratch, /obj/item/clothing/dress/wedding/bride_white, /obj/item/clothing/suit/chef, /obj/item/clothing/suit/apron/overalls, @@ -112,7 +115,7 @@ /obj/item/clothing/costume/kilt, /obj/item/clothing/costume/savage_hunter, /obj/item/clothing/costume/savage_hunter/female, - /obj/item/clothing/under/wetsuit) + /obj/item/clothing/jumpsuit/wetsuit) name = "Costume - Random" containername = "actor costumes crate" supply_method = /decl/supply_method/randomized @@ -127,7 +130,7 @@ /obj/item/clothing/suit/jacket/black, /obj/item/clothing/suit/jacket/burgundy, /obj/item/clothing/suit/jacket/waistcoat, - /obj/item/clothing/under/lawyer/bluesuit, + /obj/item/clothing/costume/lawyer_bluesuit, /obj/item/clothing/pants/slacks/purple, /obj/item/clothing/shirt/button, /obj/item/clothing/suit/jacket/vest/black, diff --git a/code/datums/trading/_trader.dm b/code/datums/trading/_trader.dm index 79a242f90eb..267e2c67c77 100644 --- a/code/datums/trading/_trader.dm +++ b/code/datums/trading/_trader.dm @@ -31,7 +31,7 @@ // Things they will automatically refuse var/list/blacklisted_trade_items = list( - /mob/living/carbon/human + /mob/living/human ) /datum/trader/New() @@ -197,7 +197,7 @@ /datum/trader/proc/hail(var/mob/user) var/specific if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species) specific = H.species.name else if(issilicon(user)) diff --git a/code/datums/trading/traders/goods.dm b/code/datums/trading/traders/goods.dm index 8694bd01a41..6c1c4e7c443 100644 --- a/code/datums/trading/traders/goods.dm +++ b/code/datums/trading/traders/goods.dm @@ -132,7 +132,6 @@ /obj/item/clothing/pants = TRADER_SUBTYPES_ONLY, /obj/item/clothing/pants/pj = TRADER_BLACKLIST, /obj/item/clothing/pants/shorts = TRADER_BLACKLIST, - /obj/item/clothing/pants/casual/mustangjeans/monke = TRADER_BLACKLIST, /obj/item/clothing/pants/chameleon = TRADER_BLACKLIST, /obj/item/clothing/shirt = TRADER_SUBTYPES_ONLY, /obj/item/clothing/shirt/chameleon = TRADER_BLACKLIST, @@ -140,15 +139,14 @@ /obj/item/clothing/skirt = TRADER_SUBTYPES_ONLY, /obj/item/clothing/dress = TRADER_SUBTYPES_ONLY, /obj/item/clothing/dress/wedding = TRADER_BLACKLIST, - /obj/item/clothing/under = TRADER_SUBTYPES_ONLY, + /obj/item/clothing/shirt = TRADER_SUBTYPES_ONLY, + /obj/item/clothing/pants = TRADER_SUBTYPES_ONLY, + /obj/item/clothing/skirt = TRADER_SUBTYPES_ONLY, + /obj/item/clothing/jumpsuit = TRADER_SUBTYPES_ONLY, /obj/item/clothing/jumpsuit/chameleon = TRADER_BLACKLIST, /obj/item/clothing/jumpsuit = TRADER_BLACKLIST, - /obj/item/clothing/under/gimmick = TRADER_BLACKLIST_ALL, - /obj/item/clothing/under/lawyer = TRADER_BLACKLIST, - /obj/item/clothing/under/mankini = TRADER_BLACKLIST_ALL, - /obj/item/clothing/under/syndicate = TRADER_BLACKLIST_ALL, - /obj/item/clothing/jumpsuit/tactical = TRADER_BLACKLIST, - /obj/item/clothing/under/waiter/monke = TRADER_BLACKLIST + /obj/item/clothing/pants/mankini = TRADER_BLACKLIST_ALL, + /obj/item/clothing/jumpsuit/tactical = TRADER_BLACKLIST ) /datum/trader/ship/clothingshop/shoes @@ -203,7 +201,6 @@ /obj/item/clothing/head/centhat = TRADER_BLACKLIST, /obj/item/clothing/head/chameleon = TRADER_BLACKLIST, /obj/item/clothing/head/collectable = TRADER_BLACKLIST, - /obj/item/clothing/head/culthood = TRADER_BLACKLIST_ALL, /obj/item/clothing/head/helmet = TRADER_BLACKLIST_ALL, /obj/item/clothing/head/lightrig = TRADER_BLACKLIST_ALL, /obj/item/clothing/head/radiation = TRADER_BLACKLIST, diff --git a/code/datums/trading/traders/unique.dm b/code/datums/trading/traders/unique.dm index a7269edd2e3..4c8a9398cd2 100644 --- a/code/datums/trading/traders/unique.dm +++ b/code/datums/trading/traders/unique.dm @@ -33,7 +33,7 @@ possible_wanted_items = list( /obj/item/chems/food/human = TRADER_SUBTYPES_ONLY, /obj/item/chems/food/butchery/meat/human = TRADER_THIS_TYPE, - /mob/living/carbon/human = TRADER_ALL + /mob/living/human = TRADER_ALL ) possible_trading_items = list( @@ -105,14 +105,6 @@ ) possible_wanted_items = list( - /mob/living/simple_animal/construct = TRADER_SUBTYPES_ONLY, - /obj/item/sword/cultblade = TRADER_THIS_TYPE, - /obj/item/clothing/head/culthood = TRADER_ALL, - /obj/item/clothing/suit/space/cult = TRADER_ALL, - /obj/item/clothing/suit/cultrobes = TRADER_ALL, - /obj/item/clothing/head/helmet/space/cult = TRADER_ALL, - /obj/structure/cult = TRADER_SUBTYPES_ONLY, - /obj/structure/constructshell = TRADER_ALL, /mob/living/simple_animal/familiar = TRADER_SUBTYPES_ONLY, /mob/living/simple_animal/familiar/pet = TRADER_BLACKLIST, /mob/living/simple_animal/hostile/mimic = TRADER_ALL diff --git a/code/datums/trading/trading_verbs.dm b/code/datums/trading/trading_verbs.dm index d3273a8308c..f295335a420 100644 --- a/code/datums/trading/trading_verbs.dm +++ b/code/datums/trading/trading_verbs.dm @@ -7,7 +7,7 @@ to_chat(src, "[hub.name]:") for(var/a in hub.traders) var/datum/trader/T = a - to_chat(src, "[T.name] \ref[T]") + to_chat(src, "[T.name] \ref[T]") /client/proc/add_trader() set category = "Debug" diff --git a/code/datums/traits/_trait_categories.dm b/code/datums/traits/_trait_categories.dm new file mode 100644 index 00000000000..7cbefad1ae1 --- /dev/null +++ b/code/datums/traits/_trait_categories.dm @@ -0,0 +1,10 @@ +var/global/list/trait_categories = list() // Containers for ease of printing data. + +/datum/trait_category + var/name + var/list/items = list() + var/hide_from_chargen = TRUE + +/datum/trait_category/New(var/newcategory) + ..() + name = newcategory diff --git a/code/datums/traits/_traits.dm b/code/datums/traits/_traits.dm new file mode 100644 index 00000000000..188cd77b882 --- /dev/null +++ b/code/datums/traits/_traits.dm @@ -0,0 +1,261 @@ +// Traits in general are abstract modifiers kept on the mob and checked in various places. +// Selectable traits are basically skills + stats + feats all rolled into one. You get to choose a +// certain number of them at character generation and they will alter some interactions with the world. + +/hook/startup/proc/initialize_trait_trees() + // Precache/build trait trees. + for(var/decl/trait/trait in decls_repository.get_decls_of_type_unassociated(/decl/trait)) + trait.build_references() + return 1 + +/mob/living + var/list/traits + +/mob/living/proc/has_trait(trait_type, trait_level = TRAIT_LEVEL_EXISTS) + SHOULD_NOT_OVERRIDE(TRUE) + SHOULD_NOT_SLEEP(TRUE) + return (trait_type in traits) && (!trait_level || traits[trait_type] >= trait_level) + +/mob/living/proc/GetTraitLevel(trait_type) + SHOULD_NOT_SLEEP(TRUE) + var/traits = get_traits() + if(!traits) + return null + return traits[trait_type] + +/mob/proc/get_traits() + SHOULD_NOT_SLEEP(TRUE) + return null + +/mob/living/get_traits() + RETURN_TYPE(/list) + var/decl/species/our_species = get_species() + return traits || our_species?.traits + +/mob/living/proc/set_trait(trait_type, trait_level) + SHOULD_NOT_SLEEP(TRUE) + var/decl/species/our_species = get_species() + var/decl/trait/trait = GET_DECL(trait_type) + if(!trait.validate_level(trait_level)) + return FALSE + + if(our_species && !traits) // If species traits haven't been setup before, check if we need to do so now + var/species_level = our_species.traits[trait_type] + if(species_level == trait_level) // Matched the default species trait level, ignore + return TRUE + traits = our_species.traits.Copy() // The setup is to simply copy the species list of traits + + if(!(trait_type in traits)) + LAZYSET(traits, trait_type, trait_level) + trait.apply_trait(src) + return TRUE + +/mob/living/proc/RemoveTrait(trait_type, canonize = TRUE) + var/decl/species/our_species = get_species() + // If traits haven't been set up, but we're trying to remove a trait that exists on the species then set up traits + if(!traits && LAZYISIN(our_species?.traits, trait_type)) + traits = our_species.traits.Copy() + if(LAZYLEN(traits)) + LAZYREMOVE(traits, trait_type) + // Check if we can just default back to species traits. + if(canonize) + CanonizeTraits() + +/// Removes a trait unless it exists on the species. +/// If it does exist on the species, we reset it to the species' trait level. +/mob/living/proc/RemoveExtrinsicTrait(trait_type) + var/decl/species/our_species = get_species() + if(!LAZYACCESS(our_species?.traits, trait_type)) + RemoveTrait(trait_type) + else if(our_species?.traits[trait_type] != GetTraitLevel(trait_type)) + set_trait(trait_type, our_species?.traits[trait_type]) + +/// Sets the traits list to null if it's identical to the species list. +/// Returns TRUE if the list was reset and FALSE otherwise. +/mob/living/proc/CanonizeTraits() + if(!traits) // Already in canonical form. + return FALSE + var/decl/species/our_species = get_species() + if(!our_species) // Doesn't apply without a species. + return FALSE + var/list/missing_traits = traits ^ our_species?.traits + var/list/matched_traits = traits & our_species?.traits + if(LAZYLEN(missing_traits)) + return FALSE + for(var/trait in matched_traits) // inside this loop we know our_species exists and has traits + if(traits[trait] != our_species.traits[trait]) + return FALSE + traits = null + return TRUE + +/decl/trait + abstract_type = /decl/trait + /// String identifier. + var/name + /// Flavour text. + var/description + /// A list of possible values for this trait. Should either only contain TRAIT_LEVEL_EXISTS or a set of the other TRAIT_LEVEL_* levels + var/list/levels = list(TRAIT_LEVEL_EXISTS) + /// Number of points spent or gained by taking this trait + var/trait_cost = 1 + /// Header for root traits in char prefs. + var/category + /// Parent/prerequisite for this trait. + var/decl/trait/parent + /// Aspects with this trait as a parent + var/list/children + /// Typelist of traits that prevent this one from being taken + var/list/incompatible_with + /// Whether or not trait is shown in chargen prefs + var/available_at_chargen = FALSE + /// Whether or not a rejuvenation should apply this aspect. + var/reapply_on_rejuvenation = FALSE + /// What species can select this trait in chargen? + var/list/permitted_species + /// What species cannot select this trait in chargen? + var/list/blocked_species + +/decl/trait/validate() + . = ..() + if(!name || !istext(name)) // Empty strings are valid texts + . += "invalid name [name || "(NULL)"]" + else + for(var/decl/trait/trait in decls_repository.get_decls_of_type_unassociated(/decl/trait)) + if(trait != src && lowertext(trait.name) == lowertext(name)) + . += "name '[name]' collides with [trait.type]" + + if(!length(levels)) + . += "invalid (empty) levels list" + else if (levels.len > 1 && (TRAIT_LEVEL_EXISTS in levels)) + . += "invalid levels list - TRAIT_LEVEL_EXISTS is mutually exclusive with all other levels" + + if(initial(parent) && !istype(parent)) + . += "invalid parent - [parent || "NULL"]" + for(var/decl/trait/trait as anything in children) + if(!istype(trait)) + . += "invalid child - [trait || "NULL"]" + else if(trait.parent != src) + . += "child [trait || "NULL"] does not have correct parent - expected [src], got [trait.parent || "NULL"]" + +/decl/trait/proc/validate_level(level) + SHOULD_NOT_OVERRIDE(TRUE) + SHOULD_NOT_SLEEP(TRUE) + SHOULD_BE_PURE(TRUE) + return (level in levels) + +/decl/trait/proc/build_references() + SHOULD_CALL_PARENT(TRUE) + + // This is here until there are positive traits to balance out the negative ones; + // currently the cost calc serves no purpose and looks really silly sitting at -14/5. + trait_cost = 0 + // End temp set. + + if(ispath(parent)) + parent = GET_DECL(parent) + + if(abstract_type != type && category) + var/datum/trait_category/trait_category = global.trait_categories[category] + if(!istype(trait_category)) + trait_category = new(category) + global.trait_categories[category] = trait_category + trait_category.items += src + if(trait_category.hide_from_chargen && available_at_chargen) + trait_category.hide_from_chargen = FALSE + if(istype(parent)) + LAZYDISTINCTADD(parent.children, src) + +/decl/trait/proc/applies_to_organ(var/organ) + return FALSE + +/decl/trait/proc/is_available_to(var/datum/preferences/pref) + for(var/blacklisted_type in incompatible_with) + if(blacklisted_type in pref.traits) + return FALSE + if(blocked_species && (pref.species in blocked_species)) + return FALSE + if(permitted_species && !(pref.species in permitted_species)) + return FALSE + return TRUE + +/decl/trait/proc/apply_trait(mob/living/holder) + return (istype(holder)) + +// Called by preferences selection for HTML display. +/decl/trait/proc/get_trait_selection_data(var/datum/category_item/player_setup_item/traits/caller, var/list/ticked_traits = list(), var/recurse_level = 0, var/ignore_children_if_unticked = 1, var/ignore_unticked) + + var/ticked = (type in ticked_traits) + if((ignore_unticked && !ticked) || (caller && !is_available_to(caller.pref))) + return "" + + var/result = "" + if(LAZYLEN(children) && !(ignore_children_if_unticked && !ticked)) + for(var/decl/trait/trait in children) + result += trait.get_trait_selection_data(caller, ticked_traits, (recurse_level+1), ignore_children_if_unticked) + return result + +/mob/proc/get_trait_data(var/mob/show_to) + + var/list/traits = get_traits() + if(!LAZYLEN(traits)) + to_chat(show_to, SPAN_WARNING("That mob has no traits.")) + return + + var/trait_cost = 0 + for(var/decl/trait/trait as anything in traits) + trait_cost += trait.trait_cost + + var/dat = list("[trait_cost]/[get_config_value(/decl/config/num/max_character_traits)] points spent.") + for(var/trait_category_id in global.trait_categories) + var/datum/trait_category/trait_category = global.trait_categories[trait_category_id] + if(!istype(trait_category)) + continue + var/printed_cat + for(var/decl/trait/trait as anything in trait_category.items) + if(trait in traits) + if(!printed_cat) + printed_cat = 1 + dat += "
[trait_category.name]:" + dat += "
[trait.name]: [trait.description]" + if(printed_cat) + dat += "
" + + var/datum/browser/popup = new((show_to || usr), "trait_summary_\ref[src]", "Aspect Summary") + popup.set_content(jointext(dat, null)) + popup.open() + +/mob/verb/show_own_traits() + set category = "IC" + set name = "Show Own Traits" + get_trait_data(src) + +/datum/admins/proc/show_traits() + set category = "Admin" + set name = "Show Traits" + if(!check_rights(R_INVESTIGATE)) + return + var/mob/M = input("Select mob.", "Select mob.") as null|anything in global.living_mob_list_ + if(M) + M.get_trait_data(usr) diff --git a/code/datums/traits/maluses/_malus.dm b/code/datums/traits/maluses/_malus.dm new file mode 100644 index 00000000000..03b958ea34b --- /dev/null +++ b/code/datums/traits/maluses/_malus.dm @@ -0,0 +1,5 @@ +/decl/trait/malus + category = "Maluses" + abstract_type = /decl/trait/malus + trait_cost = -1 + available_at_chargen = TRUE diff --git a/code/datums/traits/maluses/allergies.dm b/code/datums/traits/maluses/allergies.dm deleted file mode 100644 index 56fb3deb2ed..00000000000 --- a/code/datums/traits/maluses/allergies.dm +++ /dev/null @@ -1,6 +0,0 @@ -/decl/trait/malus - abstract_type = /decl/trait/malus - -/decl/trait/malus/Initialize() - . = ..() - name = "Malus - " + name diff --git a/code/datums/traits/maluses/amputations.dm b/code/datums/traits/maluses/amputations.dm new file mode 100644 index 00000000000..4de7eb782a2 --- /dev/null +++ b/code/datums/traits/maluses/amputations.dm @@ -0,0 +1,111 @@ +/decl/trait/malus/amputation + trait_cost = -1 + category = "Missing Limbs" + abstract_type = /decl/trait/malus/amputation + reapply_on_rejuvenation = TRUE + var/list/apply_to_limbs + var/list/ban_traits_relating_to_limbs + +/decl/trait/malus/amputation/build_references() + if(length(ban_traits_relating_to_limbs)) + var/list/check_traits = decls_repository.get_decls_of_subtype(/decl/trait/malus/amputation) + + // Ban amputations that descend from us. + for(var/trait_type in check_traits) + if(trait_type == type) + continue + var/decl/trait/malus/amputation/trait = check_traits[trait_type] + if(!trait.name) + continue // remove when abstract decl handling from dev is merged + for(var/limb in trait.apply_to_limbs) + if(limb in ban_traits_relating_to_limbs) + LAZYDISTINCTADD(incompatible_with, trait_type) + LAZYDISTINCTADD(trait.incompatible_with, type) + break + + // Ban prosthetic types that require this limb to exist. + check_traits = decls_repository.get_decls_of_subtype(/decl/trait/prosthetic_limb) + for(var/trait_type in check_traits) + if(trait_type == type) + continue + var/decl/trait/prosthetic_limb/trait = check_traits[trait_type] + if(trait.apply_to_limb in ban_traits_relating_to_limbs) + LAZYDISTINCTADD(incompatible_with, trait_type) + LAZYDISTINCTADD(trait.incompatible_with, type) + + . = ..() + +/decl/trait/malus/amputation/applies_to_organ(var/organ) + return (organ in apply_to_limbs) + +/decl/trait/malus/amputation/is_available_to(datum/preferences/pref) + . = ..() + if(. && pref.bodytype) + var/decl/bodytype/mob_bodytype = pref.get_bodytype_decl() + if(!istype(mob_bodytype)) + return FALSE + for(var/limb in apply_to_limbs) + if(!(limb in mob_bodytype.has_limbs)) + return FALSE + +/decl/trait/malus/amputation/apply_trait(mob/living/holder) + . = ..() + if(. && apply_to_limbs) + for(var/limb in apply_to_limbs) + var/obj/item/organ/external/O = GET_EXTERNAL_ORGAN(holder, limb) + if(istype(O)) + holder.remove_organ(O, FALSE, FALSE, FALSE, TRUE, FALSE) + qdel(O) + holder.update_body(TRUE) + +/decl/trait/malus/amputation/left_hand + name = "Amputated Left Hand" + description = "You are missing your left hand." + apply_to_limbs = list(BP_L_HAND) + ban_traits_relating_to_limbs = list(BP_L_HAND, BP_L_ARM) + +/decl/trait/malus/amputation/left_arm + name = "Amputated Left Arm" + description = "You are missing your left arm." + apply_to_limbs = list(BP_L_ARM, BP_L_HAND) + ban_traits_relating_to_limbs = list(BP_L_ARM, BP_L_HAND) + trait_cost = -2 + +/decl/trait/malus/amputation/right_hand + name = "Amputated Right Hand" + description = "You are missing your right hand." + apply_to_limbs = list(BP_R_HAND) + ban_traits_relating_to_limbs = list(BP_R_HAND, BP_R_ARM) + +/decl/trait/malus/amputation/right_arm + name = "Amputated Right Arm" + description = "You are missing your right arm." + apply_to_limbs = list(BP_R_ARM, BP_R_HAND) + ban_traits_relating_to_limbs = list(BP_R_ARM, BP_R_HAND) + trait_cost = -2 + +/decl/trait/malus/amputation/left_foot + name = "Amputated Left Foot" + description = "You are missing your left foot." + apply_to_limbs = list(BP_L_FOOT) + ban_traits_relating_to_limbs = list(BP_L_LEG, BP_L_FOOT) + +/decl/trait/malus/amputation/left_leg + name = "Amputated Left Leg" + description = "You are missing your left leg." + apply_to_limbs = list(BP_L_LEG, BP_L_FOOT) + ban_traits_relating_to_limbs = list(BP_L_LEG, BP_L_FOOT) + trait_cost = -2 + +/decl/trait/malus/amputation/right_foot + name = "Amputated Right Foot" + description = "You are missing your right foot." + apply_to_limbs = list(BP_R_FOOT) + ban_traits_relating_to_limbs = list(BP_R_LEG, BP_R_FOOT) + +/decl/trait/malus/amputation/right_leg + name = "Amputated Right Leg" + description = "You are missing your right leg." + apply_to_limbs = list(BP_R_LEG, BP_R_FOOT) + ban_traits_relating_to_limbs = list(BP_R_LEG, BP_R_FOOT) + trait_cost = -2 diff --git a/code/datums/traits/maluses/animal_protein.dm b/code/datums/traits/maluses/animal_protein.dm index 8088ad17d13..0963b91f5f5 100644 --- a/code/datums/traits/maluses/animal_protein.dm +++ b/code/datums/traits/maluses/animal_protein.dm @@ -1,3 +1,3 @@ /decl/trait/malus/animal_protein - name = "Animal Protein" + name = "Animal Protein Allergy" levels = list(TRAIT_LEVEL_MINOR, TRAIT_LEVEL_MAJOR) diff --git a/code/datums/traits/maluses/ethanol.dm b/code/datums/traits/maluses/ethanol.dm index 953a9a8685e..f4a22e7f446 100644 --- a/code/datums/traits/maluses/ethanol.dm +++ b/code/datums/traits/maluses/ethanol.dm @@ -1,3 +1,3 @@ /decl/trait/malus/ethanol - name = "Ethanol" + name = "Ethanol Allergy" levels = list(TRAIT_LEVEL_MINOR, TRAIT_LEVEL_MODERATE, TRAIT_LEVEL_MAJOR) diff --git a/code/datums/traits/maluses/vision.dm b/code/datums/traits/maluses/vision.dm new file mode 100644 index 00000000000..928f9be9070 --- /dev/null +++ b/code/datums/traits/maluses/vision.dm @@ -0,0 +1,63 @@ +/decl/trait/malus/impaired_vision + name = "Poor Eyesight" + description = "Your vision is somewhat impaired, and you need prescription glasses to see clearly." + incompatible_with = list(/decl/trait/prosthetic_organ/eyes) + +/decl/trait/malus/impaired_vision/apply_trait(mob/living/holder) + . = ..() + if(.) + holder.add_genetic_condition(GENE_COND_NEARSIGHTED) + var/equipped = holder.equip_to_slot_or_del(new /obj/item/clothing/glasses/prescription(holder), slot_glasses_str) + if(equipped) + var/obj/item/clothing/glasses/G = holder.get_equipped_item(slot_glasses_str) + if(istype(G)) + G.prescription = 7 + +/decl/trait/malus/colourblind + name = "Deuteranopia" + description = "You have a type of red-green colour blindness, and cannot properly perceive the colour green." + incompatible_with = list( + /decl/trait/prosthetic_organ/eyes, + /decl/trait/malus/colourblind/protanopia, + /decl/trait/malus/colourblind/tritanopia, + /decl/trait/malus/colourblind/achromatopsia, + ) + var/client_color = /datum/client_color/deuteranopia + +/decl/trait/malus/colourblind/apply_trait(mob/living/holder) + . = ..() + if(. && ispath(client_color, /datum/client_color)) + holder.add_client_color(client_color) + +/decl/trait/malus/colourblind/protanopia + name = "Protanopia" + description = "You have a type of red-green colour blindness, and cannot properly perceive the colour red." + incompatible_with = list( + /decl/trait/prosthetic_organ/eyes, + /decl/trait/malus/colourblind/tritanopia, + /decl/trait/malus/colourblind/achromatopsia, + /decl/trait/malus/colourblind + ) + client_color = /datum/client_color/protanopia + +/decl/trait/malus/colourblind/tritanopia + name = "Tritanopia" + description = "You have a rare type of colour blindness, and cannot properly perceive the colour blue." + incompatible_with = list( + /decl/trait/prosthetic_organ/eyes, + /decl/trait/malus/colourblind/protanopia, + /decl/trait/malus/colourblind/achromatopsia, + /decl/trait/malus/colourblind + ) + client_color = /datum/client_color/tritanopia + +/decl/trait/malus/colourblind/achromatopsia + name = "Achromatopsia" + description = "You have a rare type of colour blindness, and cannot properly perceive colour." + incompatible_with = list( + /decl/trait/prosthetic_organ/eyes, + /decl/trait/malus/colourblind/protanopia, + /decl/trait/malus/colourblind/tritanopia, + /decl/trait/malus/colourblind + ) + client_color = /datum/client_color/achromatopsia diff --git a/code/modules/aspects/aspects_prosthetic_limbs.dm b/code/datums/traits/prosthetics/prosthetic_limbs.dm similarity index 65% rename from code/modules/aspects/aspects_prosthetic_limbs.dm rename to code/datums/traits/prosthetics/prosthetic_limbs.dm index ee6096fe63c..44a21b9c5aa 100644 --- a/code/modules/aspects/aspects_prosthetic_limbs.dm +++ b/code/datums/traits/prosthetics/prosthetic_limbs.dm @@ -1,10 +1,10 @@ // Prosthetics. -/decl/aspect/prosthetic_limb - aspect_cost = 1 +/decl/trait/prosthetic_limb + trait_cost = 1 category = "Prosthetic Limbs" - sort_value = 2 - aspect_flags = ASPECTS_PHYSICAL - abstract_type = /decl/aspect/prosthetic_limb + available_at_chargen = TRUE + abstract_type = /decl/trait/prosthetic_limb + reapply_on_rejuvenation = TRUE var/fullbody_synthetic_only = FALSE var/replace_children = TRUE var/check_bodytype @@ -13,56 +13,56 @@ var/list/incompatible_with_limbs = list(BP_L_HAND) var/model -/decl/aspect/prosthetic_limb/proc/get_base_model(var/species_name) +/decl/trait/prosthetic_limb/proc/get_base_model(var/species_name) if(!species_name) return /decl/bodytype/prosthetic/basic_human var/decl/species/species = species_name ? get_species_by_key(species_name) : global.using_map.default_species return species?.base_external_prosthetics_model -/decl/aspect/prosthetic_limb/Initialize() +/decl/trait/prosthetic_limb/Initialize() . = ..() // Macro can generate float costs, round to closest point value. - if(aspect_cost) - aspect_cost = CEILING(aspect_cost) + if(trait_cost) + trait_cost = CEILING(trait_cost) if(bodypart_name) if(model) var/decl/bodytype/prosthetic/model_manufacturer = GET_DECL(model) name = "[capitalize(model_manufacturer.name)] [bodypart_name]" - desc = "You have been fitted with [ADD_ARTICLE(model_manufacturer.name)] [lowertext(bodypart_name)] prosthesis." + description = "You have been fitted with [ADD_ARTICLE(model_manufacturer.name)] [lowertext(bodypart_name)] prosthesis." else name = "Prosthetic [bodypart_name]" - desc = "You have been fitted with a basic [lowertext(bodypart_name)] prosthesis." + description = "You have been fitted with a basic [lowertext(bodypart_name)] prosthesis." -/decl/aspect/prosthetic_limb/build_references() +/decl/trait/prosthetic_limb/build_references() . = ..() // Build our mutual exclusion list with other models/children. if(length(incompatible_with_limbs)) - var/list/check_aspects = decls_repository.get_decls_of_subtype(/decl/aspect/prosthetic_limb) - for(var/aspect_type in check_aspects) + var/list/check_traits = decls_repository.get_decls_of_subtype(/decl/trait/prosthetic_limb) + for(var/trait_type in check_traits) // Can't exclude ourselves. - if(aspect_type == type) + if(trait_type == type) continue - // The base model aspect does not exclude itself from specific models, but specific models will exclude from all others. - var/decl/aspect/prosthetic_limb/aspect = check_aspects[aspect_type] - if(!(aspect.apply_to_limb in incompatible_with_limbs)) + // The base model trait does not exclude itself from specific models, but specific models will exclude from all others. + var/decl/trait/prosthetic_limb/trait = check_traits[trait_type] + if(!(trait.apply_to_limb in incompatible_with_limbs)) continue // Base model is only incompatible with itself. - if(isnull(model) != isnull(aspect.model) && (!isnull(model) || !isnull(aspect.model))) + if(isnull(model) != isnull(trait.model) && (!isnull(model) || !isnull(trait.model))) continue // Specific models are incompatible with everything. - LAZYDISTINCTADD(incompatible_with, aspect_type) - LAZYDISTINCTADD(aspect.incompatible_with, type) + LAZYDISTINCTADD(incompatible_with, trait_type) + LAZYDISTINCTADD(trait.incompatible_with, type) - // We will also exclude from relevant amputations, but they will be handled by amputation aspect build_references() + // We will also exclude from relevant amputations, but they will be handled by amputation trait build_references() - // If our model has any additional aspect handling, do it here. + // If our model has any additional trait handling, do it here. // Without a model, we will rely on is_available_to() to check get_base_model() for the user species. blocked_species = null -/decl/aspect/prosthetic_limb/applies_to_organ(var/organ) +/decl/trait/prosthetic_limb/applies_to_organ(var/organ) return apply_to_limb && organ == apply_to_limb -/decl/aspect/prosthetic_limb/is_available_to(datum/preferences/pref) +/decl/trait/prosthetic_limb/is_available_to(datum/preferences/pref) . = ..() if(.) if(fullbody_synthetic_only) @@ -80,14 +80,15 @@ else if(!get_base_model(pref.species)) return FALSE -/decl/aspect/prosthetic_limb/apply(mob/living/holder) +/decl/trait/prosthetic_limb/apply_trait(mob/living/holder) . = ..() // Don't apply if there's a specific model selected. if(!model && holder) var/has_specific_model = FALSE - for(var/decl/aspect/A as anything in holder.personal_aspects) - if(A != src && istype(A, type)) + for(var/trait_type in holder.get_traits()) + var/decl/trait/trait = GET_DECL(trait_type) + if(trait != src && istype(trait, type)) has_specific_model = TRUE break if(has_specific_model) @@ -109,69 +110,69 @@ else E.set_bodytype(use_model) -/decl/aspect/prosthetic_limb/left_hand +/decl/trait/prosthetic_limb/left_hand bodypart_name = "Left Hand" apply_to_limb = BP_L_HAND incompatible_with_limbs = list(BP_L_HAND, BP_L_ARM) -/decl/aspect/prosthetic_limb/left_arm +/decl/trait/prosthetic_limb/left_arm bodypart_name = "Left Arm" - aspect_cost = 2 + trait_cost = 2 apply_to_limb = BP_L_ARM incompatible_with_limbs = list(BP_L_HAND, BP_L_ARM) -/decl/aspect/prosthetic_limb/right_hand +/decl/trait/prosthetic_limb/right_hand bodypart_name = "Right Hand" apply_to_limb = BP_R_HAND incompatible_with_limbs = list(BP_R_HAND, BP_R_ARM) -/decl/aspect/prosthetic_limb/right_arm +/decl/trait/prosthetic_limb/right_arm bodypart_name = "Right Arm" - aspect_cost = 2 + trait_cost = 2 apply_to_limb = BP_R_ARM incompatible_with_limbs = list(BP_R_HAND, BP_R_ARM) -/decl/aspect/prosthetic_limb/left_foot +/decl/trait/prosthetic_limb/left_foot bodypart_name = "Left Foot" apply_to_limb = BP_L_FOOT incompatible_with_limbs = list(BP_L_FOOT, BP_L_LEG) -/decl/aspect/prosthetic_limb/left_leg +/decl/trait/prosthetic_limb/left_leg bodypart_name = "Left Leg" - aspect_cost = 2 + trait_cost = 2 apply_to_limb = BP_L_LEG incompatible_with_limbs = list(BP_L_FOOT, BP_L_LEG) -/decl/aspect/prosthetic_limb/right_foot +/decl/trait/prosthetic_limb/right_foot bodypart_name = "Right Foot" apply_to_limb = BP_R_FOOT incompatible_with_limbs = list(BP_R_FOOT, BP_R_LEG) -/decl/aspect/prosthetic_limb/right_leg +/decl/trait/prosthetic_limb/right_leg bodypart_name = "Right Leg" - aspect_cost = 2 + trait_cost = 2 apply_to_limb = BP_R_LEG incompatible_with_limbs = list(BP_R_FOOT, BP_R_LEG) -/decl/aspect/prosthetic_limb/head +/decl/trait/prosthetic_limb/head bodypart_name = "Head" - aspect_cost = 1 + trait_cost = 1 apply_to_limb = BP_HEAD incompatible_with_limbs = list(BP_HEAD) fullbody_synthetic_only = TRUE replace_children = FALSE -/decl/aspect/prosthetic_limb/chest +/decl/trait/prosthetic_limb/chest bodypart_name = "Upper Body" - aspect_cost = 1 + trait_cost = 1 apply_to_limb = BP_CHEST incompatible_with_limbs = list(BP_CHEST) fullbody_synthetic_only = TRUE replace_children = FALSE -/decl/aspect/prosthetic_limb/groin +/decl/trait/prosthetic_limb/groin bodypart_name = "Lower Body" - aspect_cost = 1 + trait_cost = 1 apply_to_limb = BP_GROIN incompatible_with_limbs = list(BP_GROIN) fullbody_synthetic_only = TRUE diff --git a/code/modules/aspects/aspects_prosthetic_organs.dm b/code/datums/traits/prosthetics/prosthetic_organs.dm similarity index 63% rename from code/modules/aspects/aspects_prosthetic_organs.dm rename to code/datums/traits/prosthetics/prosthetic_organs.dm index c9be210ccb3..a9d6c093de2 100644 --- a/code/modules/aspects/aspects_prosthetic_organs.dm +++ b/code/datums/traits/prosthetics/prosthetic_organs.dm @@ -1,14 +1,14 @@ -/decl/aspect/prosthetic_organ +/decl/trait/prosthetic_organ name = "Prosthetic Heart" - aspect_flags = ASPECTS_PHYSICAL - desc = "You have a synthetic heart." - aspect_cost = 1 + description = "You have a synthetic heart." + trait_cost = 1 + available_at_chargen = TRUE category = "Prosthetic Organs" - sort_value = 2 + reapply_on_rejuvenation = TRUE var/synthetic_bodytype_restricted = FALSE var/apply_to_organ = BP_HEART -/decl/aspect/prosthetic_organ/is_available_to(datum/preferences/pref) +/decl/trait/prosthetic_organ/is_available_to(datum/preferences/pref) . = ..() if(. && pref.species && pref.bodytype) @@ -34,56 +34,56 @@ return TRUE -/decl/aspect/prosthetic_organ/applies_to_organ(var/organ) +/decl/trait/prosthetic_organ/applies_to_organ(var/organ) return apply_to_organ && organ == apply_to_organ -/decl/aspect/prosthetic_organ/apply(mob/living/holder) +/decl/trait/prosthetic_organ/apply_trait(mob/living/holder) . = ..() if(.) var/obj/item/organ/internal/I = GET_INTERNAL_ORGAN(holder, apply_to_organ) if(I) I.set_bodytype(I.species.base_internal_prosthetics_model) -/decl/aspect/prosthetic_organ/eyes +/decl/trait/prosthetic_organ/eyes name = "Prosthetic Eyes" - desc = "Your vision is augmented." + description = "Your vision is augmented." apply_to_organ = BP_EYES incompatible_with = list( - /decl/aspect/handicap/impaired_vision, - /decl/aspect/handicap/colourblind, - /decl/aspect/handicap/colourblind/protanopia, - /decl/aspect/handicap/colourblind/tritanopia, - /decl/aspect/handicap/colourblind/achromatopsia + /decl/trait/malus/impaired_vision, + /decl/trait/malus/colourblind, + /decl/trait/malus/colourblind/protanopia, + /decl/trait/malus/colourblind/tritanopia, + /decl/trait/malus/colourblind/achromatopsia ) -/decl/aspect/prosthetic_organ/kidneys +/decl/trait/prosthetic_organ/kidneys name = "Prosthetic Kidneys" - desc = "You have synthetic kidneys." + description = "You have synthetic kidneys." apply_to_organ = BP_KIDNEYS -/decl/aspect/prosthetic_organ/liver +/decl/trait/prosthetic_organ/liver name = "Prosthetic Liver" - desc = "You have a literal iron liver." + description = "You have a literal iron liver." apply_to_organ = BP_LIVER -/decl/aspect/prosthetic_organ/lungs +/decl/trait/prosthetic_organ/lungs name = "Prosthetic Lungs" - desc = "You have synthetic lungs." + description = "You have synthetic lungs." apply_to_organ = BP_LUNGS -/decl/aspect/prosthetic_organ/stomach +/decl/trait/prosthetic_organ/stomach name = "Prosthetic Stomach" - desc = "You have a literal iron stomach." + description = "You have a literal iron stomach." apply_to_organ = BP_STOMACH -/decl/aspect/prosthetic_organ/brain +/decl/trait/prosthetic_organ/brain name = "Synthetic Brain" - desc = "You are an artificial lifeform, with a mind made of steel and light." + description = "You are an artificial lifeform, with a mind made of steel and light." apply_to_organ = BP_BRAIN synthetic_bodytype_restricted = TRUE var/new_brain_type = /obj/item/organ/internal/brain/robotic -/decl/aspect/prosthetic_organ/brain/apply(mob/living/holder) +/decl/trait/prosthetic_organ/brain/apply_trait(mob/living/holder) . = ..() if(.) var/obj/item/organ/external/affected diff --git a/code/datums/traits/trait_levels.dm b/code/datums/traits/trait_levels.dm deleted file mode 100644 index c6d5480659a..00000000000 --- a/code/datums/traits/trait_levels.dm +++ /dev/null @@ -1,4 +0,0 @@ -var/global/const/TRAIT_LEVEL_EXISTS = 0 -var/global/const/TRAIT_LEVEL_MINOR = 1 -var/global/const/TRAIT_LEVEL_MODERATE = 2 -var/global/const/TRAIT_LEVEL_MAJOR = 3 diff --git a/code/datums/traits/traits.dm b/code/datums/traits/traits.dm deleted file mode 100644 index dc623ae5fce..00000000000 --- a/code/datums/traits/traits.dm +++ /dev/null @@ -1,96 +0,0 @@ -/mob/living - var/list/traits - -/mob/living/proc/HasTrait(trait_type) - SHOULD_NOT_OVERRIDE(TRUE) - SHOULD_NOT_SLEEP(TRUE) - return (trait_type in GetTraits()) - -/mob/living/proc/GetTraitLevel(trait_type) - SHOULD_NOT_SLEEP(TRUE) - var/traits = GetTraits() - if(!traits) - return null - return traits[trait_type] - -/mob/living/proc/GetTraits() - SHOULD_NOT_SLEEP(TRUE) - RETURN_TYPE(/list) - var/decl/species/our_species = get_species() - return traits || our_species?.traits - -/mob/living/proc/SetTrait(trait_type, trait_level) - SHOULD_NOT_SLEEP(TRUE) - var/decl/species/our_species = get_species() - var/decl/trait/T = GET_DECL(trait_type) - if(!T.validate_level(trait_level)) - return FALSE - - if(our_species && !traits) // If species traits haven't been setup before, check if we need to do so now - var/species_level = our_species.traits[trait_type] - if(species_level == trait_level) // Matched the default species trait level, ignore - return TRUE - traits = our_species.traits.Copy() // The setup is to simply copy the species list of traits - - LAZYSET(traits, trait_type, trait_level) - return TRUE - -/mob/living/proc/RemoveTrait(trait_type, canonize = TRUE) - var/decl/species/our_species = get_species() - // If traits haven't been set up, but we're trying to remove a trait that exists on the species then set up traits - if(!traits && LAZYISIN(our_species?.traits, trait_type)) - traits = our_species.traits.Copy() - if(LAZYLEN(traits)) - LAZYREMOVE(traits, trait_type) - // Check if we can just default back to species traits. - if(canonize) - CanonizeTraits() - -/// Removes a trait unless it exists on the species. -/// If it does exist on the species, we reset it to the species' trait level. -/mob/living/proc/RemoveExtrinsicTrait(trait_type) - var/decl/species/our_species = get_species() - if(!LAZYACCESS(our_species?.traits, trait_type)) - RemoveTrait(trait_type) - else if(our_species?.traits[trait_type] != GetTraitLevel(trait_type)) - SetTrait(trait_type, our_species?.traits[trait_type]) - -/// Sets the traits list to null if it's identical to the species list. -/// Returns TRUE if the list was reset and FALSE otherwise. -/mob/living/proc/CanonizeTraits() - if(!traits) // Already in canonical form. - return FALSE - var/decl/species/our_species = get_species() - if(!our_species) // Doesn't apply without a species. - return FALSE - var/list/missing_traits = traits ^ our_species?.traits - var/list/matched_traits = traits & our_species?.traits - if(LAZYLEN(missing_traits)) - return FALSE - for(var/trait in matched_traits) // inside this loop we know our_species exists and has traits - if(traits[trait] != our_species.traits[trait]) - return FALSE - traits = null - return TRUE - -/decl/trait - abstract_type = /decl/trait - var/name - var/description - var/list/levels = list(TRAIT_LEVEL_EXISTS) // Should either only contain TRAIT_LEVEL_EXISTS or a set of the other TRAIT_LEVEL_* levels - -/decl/trait/validate() - . = ..() - if(!name || !istext(name)) // Empty strings are valid texts - . += "invalid name [name || "(NULL)"]" - if(!length(levels)) - . += "invalid (empty) levels list" - else if (levels.len > 1 && (TRAIT_LEVEL_EXISTS in levels)) - . += "invalid levels list - TRAIT_LEVEL_EXISTS is mutually exclusive with all other levels" - -/decl/trait/proc/validate_level(level) - SHOULD_NOT_OVERRIDE(TRUE) - SHOULD_NOT_SLEEP(TRUE) - SHOULD_BE_PURE(TRUE) - - return (level in levels) diff --git a/code/datums/uplink/services.dm b/code/datums/uplink/services.dm index dc6b0495f5b..f7f37fc49af 100644 --- a/code/datums/uplink/services.dm +++ b/code/datums/uplink/services.dm @@ -227,7 +227,7 @@ if(random_record) COPY_VALUE(faction) COPY_VALUE(religion) - COPY_VALUE(homeSystem) + COPY_VALUE(residence) COPY_VALUE(fingerprint) COPY_VALUE(dna) COPY_VALUE(bloodtype) diff --git a/code/datums/uplink/stealth_and_camouflage_items.dm b/code/datums/uplink/stealth_and_camouflage_items.dm index a1c9aba1b9f..9a9d21c0761 100644 --- a/code/datums/uplink/stealth_and_camouflage_items.dm +++ b/code/datums/uplink/stealth_and_camouflage_items.dm @@ -56,7 +56,7 @@ /datum/uplink_item/item/stealth_items/sneakies name = "Sneakies" desc = "A fashionable pair of polished dress shoes. The soles are made in a way so that any \ - tracks you leave look like they are traveling in the opposite direction." + tracks you leave look like they are travelling in the opposite direction." item_cost = 4 path = /obj/item/clothing/shoes/dress/sneakies diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm index c28a893f898..5ed21617c4c 100644 --- a/code/datums/uplink/uplink_items.dm +++ b/code/datums/uplink/uplink_items.dm @@ -32,7 +32,9 @@ var/global/datum/uplink/uplink = new() var/item_cost = 0 var/list/antag_costs = list() // Allows specific antag roles to purchase at a different cost var/datum/uplink_category/category // Item category - var/list/decl/special_role/antag_roles = list("Exclude", /decl/special_role/deity) // Antag roles this item is displayed to. If empty, display to all. If it includes 'Exclude", anybody except this role can view it + /// Antag roles this item is displayed to. If empty, display to all. If it includes 'Exclude", anybody except this role can view it + /// Examples: list(/decl/special_role/someone); list("Exclude", /decl/special_role/whoever); etc + var/list/decl/special_role/antag_roles /datum/uplink_item/item var/path = null @@ -129,7 +131,7 @@ var/global/datum/uplink/uplink = new() if(L.len) I = L[1] if(istype(I) && ishuman(user)) - var/mob/living/carbon/human/A = user + var/mob/living/human/A = user A.put_in_hands(I) return I diff --git a/code/datums/uplink/uplink_sources.dm b/code/datums/uplink/uplink_sources.dm index 860b8748bd8..a0dc90c3bf9 100644 --- a/code/datums/uplink/uplink_sources.dm +++ b/code/datums/uplink/uplink_sources.dm @@ -68,7 +68,7 @@ var/global/list/default_uplink_source_priority = list( name = "Implant" desc = "Teleports an uplink implant into your head. Costs 20% of the initial TC amount." -/decl/uplink_source/implant/setup_uplink_source(var/mob/living/carbon/human/H, var/amount) +/decl/uplink_source/implant/setup_uplink_source(var/mob/living/human/H, var/amount) if(!istype(H)) return SETUP_FAILED diff --git a/code/datums/vote/vote.dm b/code/datums/vote/vote.dm index c15958c5aa9..18cff66756a 100644 --- a/code/datums/vote/vote.dm +++ b/code/datums/vote/vote.dm @@ -59,7 +59,7 @@ var/text = get_start_text() log_vote(text) - to_world(SPAN_PURPLE("[text]\nType vote or click here to place your votes.\nYou have [round(time_set/10)] seconds to vote.")) + to_world(SPAN_PURPLE("[text]\nType vote or click here to place your votes.\nYou have [round(time_set/10)] seconds to vote.")) to_world(sound(pick(vote_start_sounds), repeat = 0, wait = 0, volume = 50, channel = sound_channels.vote_channel)) /datum/vote/proc/get_start_text() @@ -182,9 +182,9 @@ for(var/i = 1, i <= length(priorities), i++) . += "" . += "" if (additional_text[choice]) diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 4a2c5e9112d..56b88e8f986 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -112,10 +112,10 @@ var/global/list/wireColourNames = list("darkred" = "dark red") html += "" html += "[capitalize(colour_name)]" html += "" - html += "[IsColourCut(colour) ? "Mend" : "Cut"]" - html += " Pulse" - html += " [IsAttached(colour) ? "Detach" : "Attach"] Signaller" - html += " Examine" + html += "[IsColourCut(colour) ? "Mend" : "Cut"]" + html += " Pulse" + html += " [IsAttached(colour) ? "Detach" : "Attach"] Signaller" + html += " Examine" html += "
" + if(recurse_level) + for(var/x = 1 to recurse_level) + result += "        " + + var/incompatible_trait_taken = FALSE + for(var/trait in incompatible_with) + if(trait in ticked_traits) + incompatible_trait_taken = TRUE + break + + if(istype(caller) && (ticked || caller.get_trait_total() + trait_cost <= get_config_value(/decl/config/num/max_character_traits)) && !incompatible_trait_taken) + result += "[ticked ? "[name]" : "[name]"] ([trait_cost])" + else + result += ticked ? "[name]" : "[name]" + + result += "" + if(ticked) + result += "[description]" + else + result += "[description]" + + result += "
" if(voted[user.ckey] && (voted[user.ckey][i] == j)) //We have this jth choice chosen at priority i. - . += "[priorities[i]]" + . += "[priorities[i]]" else - . += "[priorities[i]]" + . += "[priorities[i]]" . += "[votepercent]
" html += "" diff --git a/code/game/antagonist/_antagonist_setup.dm b/code/game/antagonist/_antagonist_setup.dm index 961cd573658..5b6d83d7d3d 100644 --- a/code/game/antagonist/_antagonist_setup.dm +++ b/code/game/antagonist/_antagonist_setup.dm @@ -1,12 +1,12 @@ /* MODULAR ANTAGONIST SYSTEM - Attempts to centralize antag tracking code into its own system, which has the added bonus of making + Attempts to centralize antag tracking code into its own system, which has the added bonus of making the display procs consistent. Should be fairly self-explanatory with a review of the procs. To use: - - Get the appropriate datum via the decls repository ie. - var/decl/special_role/A = GET_DECL(/decl/special_role/traitor) + - Get the appropriate datum via the decls repository ie. + var/decl/special_role/A = GET_DECL(/decl/special_role/the_guy) - Call add_antagonist() on the desired target mind ie. A.add_antagonist(mob.mind) - To ignore protected roles, supply a positive second argument. - To skip equipping with appropriate gear, supply a positive third argument. diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm index 6aabe004cbe..be291b8ac25 100644 --- a/code/game/antagonist/antagonist.dm +++ b/code/game/antagonist/antagonist.dm @@ -42,7 +42,7 @@ // Misc. var/landmark_id // Spawn point identifier. - var/mob_path = /mob/living/carbon/human // Mobtype this antag will use if none is provided. + var/mob_path = /mob/living/human // Mobtype this antag will use if none is provided. var/minimum_player_age = 7 // Players need to be at least minimum_player_age days old before they are eligable for auto-spawning var/flags = 0 // Various runtime options. var/show_objectives_on_creation = 1 // Whether or not objectives are shown when a player is added to this antag datum diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm index 10c459c2c7d..17e9a80b9cf 100644 --- a/code/game/antagonist/antagonist_create.dm +++ b/code/game/antagonist/antagonist_create.dm @@ -23,7 +23,7 @@ if(mob_path) M = new mob_path(get_turf(source)) else - M = new /mob/living/carbon/human(get_turf(source)) + M = new /mob/living/human(get_turf(source)) M.ckey = source.ckey add_antagonist(M.mind, 1, 0, 1) // Equip them and move them to spawn. return M @@ -90,8 +90,6 @@ if (newname) player.real_name = newname player.SetName(player.real_name) - if(player.dna) - player.dna.real_name = newname if(player.mind) player.mind.name = player.name // Update any ID cards. update_access(player) diff --git a/code/game/antagonist/antagonist_equip.dm b/code/game/antagonist/antagonist_equip.dm index 4808f235716..053e1552751 100644 --- a/code/game/antagonist/antagonist_equip.dm +++ b/code/game/antagonist/antagonist_equip.dm @@ -1,4 +1,4 @@ -/decl/special_role/proc/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/proc/equip_role(var/mob/living/human/player) SHOULD_CALL_PARENT(TRUE) @@ -31,10 +31,10 @@ return TRUE -/decl/special_role/proc/unequip_role(var/mob/living/carbon/human/player) +/decl/special_role/proc/unequip_role(var/mob/living/human/player) return istype(player) -/decl/special_role/proc/equip_rig(var/rig_type, var/mob/living/carbon/human/player) +/decl/special_role/proc/equip_rig(var/rig_type, var/mob/living/human/player) set waitfor = FALSE if(istype(player) && ispath(rig_type)) var/obj/item/rig/rig = new rig_type(player) diff --git a/code/game/antagonist/antagonist_factions.dm b/code/game/antagonist/antagonist_factions.dm index 85f408f643f..07e12dd921f 100644 --- a/code/game/antagonist/antagonist_factions.dm +++ b/code/game/antagonist/antagonist_factions.dm @@ -1,12 +1,3 @@ -/mob/living/proc/convert_to_rev(mob/M in able_mobs_in_oview(src)) - set name = "Recruit to Faction" - set category = "Abilities" - - if(!M.mind || !M.client) - return - - convert_to_faction(M.mind, GET_DECL(/decl/special_role/revolutionary)) - /mob/living/proc/convert_to_faction(var/datum/mind/player, var/decl/special_role/faction) if(!player || !faction || !player.current) @@ -46,12 +37,3 @@ else to_chat(player, "You reject this traitorous cause!") to_chat(src, "\The [player.current] does not support the [faction.faction_descriptor]!") - -/mob/living/proc/convert_to_loyalist(mob/M in able_mobs_in_oview(src)) - set name = "Convince Recidivist" - set category = "Abilities" - - if(!M.mind || !M.client) - return - - convert_to_faction(M.mind, GET_DECL(/decl/special_role/loyalist)) diff --git a/code/game/antagonist/antagonist_panel.dm b/code/game/antagonist/antagonist_panel.dm index c3f0c808c7e..f16e898af98 100644 --- a/code/game/antagonist/antagonist_panel.dm +++ b/code/game/antagonist/antagonist_panel.dm @@ -3,13 +3,13 @@ var/dat = "[name]:" var/extra = get_extra_panel_options(player) if(is_antagonist(player)) - dat += "\[-\]" - dat += "\[equip\]" + dat += "\[-\]" + dat += "\[equip\]" if(starting_locations && starting_locations.len) - dat += "\[move to spawn\]" + dat += "\[move to spawn\]" if(extra) dat += "[extra]" else - dat += "\[+\]" + dat += "\[+\]" dat += "" return dat @@ -27,13 +27,13 @@ var/mob/M = player.current dat += "" if(M) - dat += "[M.real_name]/([player.key])" + dat += "[M.real_name]/([player.key])" if(!M.client) dat += " (logged out)" if(M.stat == DEAD) dat += " (DEAD)" dat += "" - dat += "\[PM\]\[SR\]" + dat += "\[PM\]\[SR\]" else dat += "Mob not found/([player.key])!" dat += "" @@ -47,7 +47,7 @@ while(!isturf(disk_loc)) if(ismob(disk_loc)) var/mob/M = disk_loc - dat += "carried by [M.real_name] " + dat += "carried by [M.real_name] " if(istype(disk_loc, /obj)) var/obj/O = disk_loc dat += "in \a [O.name] " diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm index 454d1c1b2f1..be03efcadfd 100644 --- a/code/game/antagonist/antagonist_update.dm +++ b/code/game/antagonist/antagonist_update.dm @@ -16,7 +16,7 @@ player.original = player.current if(!preserve_appearance && (flags & ANTAG_SET_APPEARANCE)) spawn(3) - var/mob/living/carbon/human/H = player.current + var/mob/living/human/H = player.current if(istype(H)) H.change_appearance(APPEARANCE_ALL, H.loc, H, valid_species, state = global.z_topic_state) return player.current diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm index 059a304b67e..0e6db1cebaf 100644 --- a/code/game/antagonist/outsider/ert.dm +++ b/code/game/antagonist/outsider/ert.dm @@ -25,7 +25,7 @@ base_to_load = "ERT Base" /decl/special_role/ert/create_default(var/mob/source) - var/mob/living/carbon/human/M = ..() + var/mob/living/human/M = ..() if(istype(M)) M.set_age(rand(25,45)) diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index b381a6f3fbc..a45f958df65 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -27,7 +27,7 @@ global_objectives |= new /datum/objective/nuclear return 1 -/decl/special_role/mercenary/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/mercenary/equip_role(var/mob/living/human/player) . = ..() if(.) var/obj/item/radio/uplink/U = new(get_turf(player), player.mind, DEFAULT_TELECRYSTAL_AMOUNT) diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm index 502d26ec682..d63f249ce37 100644 --- a/code/game/antagonist/outsider/wizard.dm +++ b/code/game/antagonist/outsider/wizard.dm @@ -64,7 +64,7 @@ wizard.current.real_name = "[pick(global.wizard_first)] [pick(global.wizard_second)]" wizard.current.SetName(wizard.current.real_name) -/decl/special_role/wizard/equip_role(var/mob/living/carbon/human/wizard_mob) +/decl/special_role/wizard/equip_role(var/mob/living/human/wizard_mob) default_outfit = pick(decls_repository.get_decl_paths_of_subtype(/decl/hierarchy/outfit/wizard)) . = ..() @@ -102,7 +102,7 @@ Made a proc so this is not repeated 14 (or more) times.*/ return 0 // Humans can wear clothes. -/mob/living/carbon/human/wearing_wiz_garb() +/mob/living/human/wearing_wiz_garb() if(!is_wiz_garb(get_equipped_item(slot_wear_suit_str)) && (!istype(species.species_hud) || (slot_wear_suit_str in species.species_hud.equip_slots))) to_chat(src, "I don't feel strong enough without my robe.") return 0 diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 2bd9956fba1..ba392ffe5c9 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -140,20 +140,21 @@ var/global/list/areas = list() if(adjacent_turf) adjacent_turf.update_registrations_on_adjacent_area_change() - T.last_outside_check = OUTSIDE_UNCERTAIN - var/outside_changed = T.is_outside() != old_outside - if(T.is_outside == OUTSIDE_AREA && outside_changed) - T.update_weather() - T.update_external_atmos_participation() + // Handle updating weather and atmos if the outside status of the turf changed. + if(T.is_outside == OUTSIDE_AREA) + T.update_external_atmos_participation() // Refreshes outside status and adds exterior air to turf air if necessary. - if(A.interior_ambient_light_modifier != old_area_ambience || outside_changed) + if(T.is_outside() != old_outside) + T.update_weather() + SSambience.queued |= T + else if(A.interior_ambient_light_modifier != old_area_ambience) SSambience.queued |= T /turf/proc/update_registrations_on_adjacent_area_change() for(var/obj/machinery/door/firedoor/door in src) door.update_area_registrations() -/area/proc/alert_on_fall(var/mob/living/carbon/human/H) +/area/proc/alert_on_fall(var/mob/living/human/H) return /area/proc/get_cameras() @@ -404,7 +405,7 @@ var/global/list/mob/living/forced_ambiance_list = new return if(ishuman(mob)) - var/mob/living/carbon/human/H = mob + var/mob/living/human/H = mob if(prob(H.skill_fail_chance(SKILL_EVA, 100, SKILL_ADEPT))) if(!MOVING_DELIBERATELY(H)) ADJ_STATUS(H, STAT_STUN, 6) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d72feee1db2..afaf10c6f50 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -52,12 +52,15 @@ var/tmp/default_pixel_z var/tmp/default_pixel_w - // Health vars largely used by obj and mob. + /// (FLOAT) Current remaining health value. var/current_health + /// (FLOAT) Theoretical maximum health value. var/max_health - // /datum/storage instance to use for this obj. Set to a type for instantiation on init. + /// (DATUM) /datum/storage instance to use for this obj. Set to a type for instantiation on init. var/datum/storage/storage + /// (FLOAT) world.time of last on_reagent_update call, used to prevent recursion due to reagents updating reagents + VAR_PRIVATE/_reagent_update_started = 0 /atom/proc/get_max_health() return max_health @@ -130,8 +133,21 @@ return 0 /// Handle reagents being modified +/atom/proc/try_on_reagent_change() + SHOULD_NOT_OVERRIDE(TRUE) + set waitfor = FALSE + if(_reagent_update_started >= world.time) + return FALSE + _reagent_update_started = world.time + sleep(0) // Defer to end of tick so we don't drop subsequent reagent updates. + return on_reagent_change() + /atom/proc/on_reagent_change() SHOULD_CALL_PARENT(TRUE) + if(storage && reagents?.total_volume) + for(var/obj/item/thing in get_stored_inventory()) + thing.fluid_act(reagents) + return TRUE /** Handle an atom bumping this atom @@ -495,17 +511,11 @@ if(atom_flags & ATOM_FLAG_NO_BLOOD) return FALSE - if(!blood_DNA || !istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialize it. + if(!islist(blood_DNA)) //if our list of DNA doesn't exist yet (or isn't a list) initialize it. blood_DNA = list() was_bloodied = 1 - blood_color = COLOR_BLOOD_HUMAN - if(istype(M)) - if (!istype(M.dna, /datum/dna)) - M.dna = new /datum/dna() - M.dna.real_name = M.real_name - M.check_dna() - blood_color = M.get_blood_color() + blood_color = istype(M) ? M.get_blood_color() : COLOR_BLOOD_HUMAN return TRUE /** @@ -881,9 +891,6 @@ /atom/proc/singularity_pull(S, current_size) return -/atom/proc/on_defilement() - return - /atom/proc/get_overhead_text_x_offset() return 0 diff --git a/code/game/atoms_damage.dm b/code/game/atoms_damage.dm index 97a18d76691..e73c65f800f 100644 --- a/code/game/atoms_damage.dm +++ b/code/game/atoms_damage.dm @@ -1,2 +1,2 @@ -/atom/proc/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/atom/proc/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) return diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index e9dca959c43..13c6665f9b4 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -371,14 +371,12 @@ return TRUE /atom/movable/proc/buckle_mob(mob/living/M) + if(buckled_mob) //unless buckled_mob becomes a list this can cause problems return FALSE + if(!istype(M) || (M.loc != loc) || M.buckled || LAZYLEN(M.pinned) || (buckle_require_restraints && !M.restrained())) return FALSE - if(ismob(src)) - var/mob/living/carbon/C = src //Don't wanna forget the xenos. - if(M != src && C.incapacitated()) - return FALSE M.buckled = src M.facing_dir = null diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm deleted file mode 100644 index 2957ea3bafe..00000000000 --- a/code/game/dna/dna2.dm +++ /dev/null @@ -1,353 +0,0 @@ -/** -* DNA 2: The Spaghetti Strikes Back -* -* @author N3X15 -*/ - -// What each index means: -#define DNA_OFF_LOWERBOUND 0 -#define DNA_OFF_UPPERBOUND 1 -#define DNA_ON_LOWERBOUND 2 -#define DNA_ON_UPPERBOUND 3 - -// Define block bounds (off-low,off-high,on-low,on-high) -// Used in setupgame.dm -#define DNA_DEFAULT_BOUNDS list(1,2049,2050,4095) -#define DNA_HARDER_BOUNDS list(1,3049,3050,4095) -#define DNA_HARD_BOUNDS list(1,3490,3500,4095) - -// UI Indices (can change to mutblock style, if desired) -#define DNA_UI_SKIN_TONE 1 -#define DNA_UI_SKIN_R 2 -#define DNA_UI_SKIN_G 3 -#define DNA_UI_SKIN_B 4 -#define DNA_UI_EYES_R 5 -#define DNA_UI_EYES_G 6 -#define DNA_UI_EYES_B 7 -#define DNA_UI_GENDER 8 -#define DNA_UI_LENGTH 8 // Update this when you add something, or you WILL break shit. - -#define DNA_SE_LENGTH 27 -// For later: -//#define DNA_SE_LENGTH 50 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow. - - -// Defines which values mean "on" or "off". -// This is to make some of the more OP superpowers a larger PITA to activate, -// and to tell our new DNA datum which values to set in order to turn something -// on or off. -var/global/list/dna_activity_bounds[DNA_SE_LENGTH] - -// Used to determine what each block means (admin hax and species stuff on /vg/, mostly) -var/global/list/assigned_blocks[DNA_SE_LENGTH] - -///////////////// -// GENE DEFINES -///////////////// -// Skip checking if it's already active. -// Used for genes that check for value rather than a binary on/off. -#define GENE_ALWAYS_ACTIVATE 1 - -/datum/dna - // READ-ONLY, GETS OVERWRITTEN - // DO NOT FUCK WITH THESE OR BYOND WILL EAT YOUR FACE - var/uni_identity="" // Encoded UI - var/struc_enzymes="" // Encoded SE - var/unique_enzymes="" // MD5 of mob genetic marker value - - var/fingerprint - - // Internal dirtiness checks - var/dirtyUI=0 - var/dirtySE=0 - - // Okay to read, but you're an idiot if you do. - // BLOCK = VALUE - var/list/SE[DNA_SE_LENGTH] - var/list/UI[DNA_UI_LENGTH] - - // From old dna. - var/b_type = "A+" // Should probably change to an integer => string map but I'm lazy. - var/real_name // Stores the real name of the person who originally got this dna datum. - - // New stuff - var/species - var/list/heritable_sprite_accessories = list() - var/lineage - //#TODO: Keep track of bodytype!!!!! - -// Make a copy of this strand. -/datum/dna/PopulateClone(datum/dna/clone) - clone = ..() - clone.lineage = lineage - clone.unique_enzymes = unique_enzymes - clone.fingerprint = fingerprint - clone.b_type = b_type - clone.real_name = real_name - clone.species = species || global.using_map.default_species - clone.heritable_sprite_accessories = deepCopyList(heritable_sprite_accessories) - for(var/b in 1 to DNA_SE_LENGTH) - clone.SE[b] = SE[b] - if(b <= DNA_UI_LENGTH) - clone.UI[b] = UI[b] - clone.UpdateUI() - clone.UpdateSE() - return clone - -/////////////////////////////////////// -// UNIQUE IDENTITY -/////////////////////////////////////// - -// Create random UI. -/datum/dna/proc/ResetUI(var/defer=0) - for(var/i=1,i<=DNA_UI_LENGTH,i++) - switch(i) - if(DNA_UI_SKIN_TONE) - SetUIValueRange(DNA_UI_SKIN_TONE,rand(1,220),220,1) // Otherwise, it gets fucked - else - UI[i]=rand(0,4095) - if(!defer) - UpdateUI() - -/datum/dna/proc/ResetUIFrom(var/mob/living/carbon/human/character) - // INITIALIZE! - ResetUI(1) - - var/eye_colour = character.get_eye_colour() - SetUIValueRange(DNA_UI_EYES_R, HEX_RED(eye_colour), 255, 1) - SetUIValueRange(DNA_UI_EYES_G, HEX_GREEN(eye_colour), 255, 1) - SetUIValueRange(DNA_UI_EYES_B, HEX_BLUE(eye_colour), 255, 1) - - var/skin_colour = character.get_skin_colour() - SetUIValueRange(DNA_UI_SKIN_R, HEX_RED(skin_colour), 255, 1) - SetUIValueRange(DNA_UI_SKIN_G, HEX_GREEN(skin_colour), 255, 1) - SetUIValueRange(DNA_UI_SKIN_B, HEX_BLUE(skin_colour), 255, 1) - - SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.skin_tone, 220, 1) // Value can be negative. - - SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1) - - fingerprint = character.get_full_print(ignore_blockers = TRUE) - unique_enzymes = character.get_unique_enzymes() - - heritable_sprite_accessories.Cut() - for(var/obj/item/organ/external/E in character.get_external_organs()) - var/list/sprite_accessories = E.get_heritable_sprite_accessories() - if(LAZYLEN(sprite_accessories)) - heritable_sprite_accessories[E.organ_tag] = sprite_accessories - - b_type = character.get_blood_type() - - UpdateUI() - -// Set a DNA UI block's raw value. -/datum/dna/proc/SetUIValue(var/block,var/value,var/defer=0) - if (block<=0) return - ASSERT(value>0) - ASSERT(value<=4095) - UI[block]=value - dirtyUI=1 - if(!defer) - UpdateUI() - -// Get a DNA UI block's raw value. -/datum/dna/proc/GetUIValue(var/block) - if (block<=0) return 0 - return UI[block] - -// Set a DNA UI block's value, given a value and a max possible value. -// Used in hair and facial styles (value being the index and maxvalue being the len of the hairstyle list) -/datum/dna/proc/SetUIValueRange(var/block,var/value,var/maxvalue,var/defer=0) - if (block<=0) return - if (value==0) value = 1 // FIXME: hair/beard/eye RGB values if they are 0 are not set, this is a work around we'll encode it in the DNA to be 1 instead. - ASSERT(maxvalue<=4095) - var/range = (4095 / maxvalue) - if(value) - SetUIValue(block,round(value * range),defer) - -// Getter version of above. -/datum/dna/proc/GetUIValueRange(var/block,var/maxvalue) - if (block<=0) return 0 - var/value = GetUIValue(block) - return round(1 +(value / 4096)*maxvalue) - -// Is the UI gene "on" or "off"? -// For UI, this is simply a check of if the value is > 2050. -/datum/dna/proc/GetUIState(var/block) - if (block<=0) return - return UI[block] > 2050 - - -// Set UI gene "on" (1) or "off" (0) -/datum/dna/proc/SetUIState(var/block,var/on,var/defer=0) - if (block<=0) return - var/val - if(on) - val=rand(2050,4095) - else - val=rand(1,2049) - SetUIValue(block,val,defer) - -// Get a hex-encoded UI block. -/datum/dna/proc/GetUIBlock(var/block) - return EncodeDNABlock(GetUIValue(block)) - -// Do not use this unless you absolutely have to. -// Set a block from a hex string. This is inefficient. If you can, use SetUIValue(). -// Used in DNA modifiers. -/datum/dna/proc/SetUIBlock(var/block,var/value,var/defer=0) - if (block<=0) return - return SetUIValue(block,hex2num(value),defer) - -// Get a sub-block from a block. -/datum/dna/proc/GetUISubBlock(var/block,var/subBlock) - return copytext(GetUIBlock(block),subBlock,subBlock+1) - -// Do not use this unless you absolutely have to. -// Set a block from a hex string. This is inefficient. If you can, use SetUIValue(). -// Used in DNA modifiers. -/datum/dna/proc/SetUISubBlock(var/block,var/subBlock, var/newSubBlock, var/defer=0) - if (block<=0) return - var/oldBlock=GetUIBlock(block) - var/newBlock="" - for(var/i=1, i<=length(oldBlock), i++) - if(i==subBlock) - newBlock+=newSubBlock - else - newBlock+=copytext(oldBlock,i,i+1) - SetUIBlock(block,newBlock,defer) - -/////////////////////////////////////// -// STRUCTURAL ENZYMES -/////////////////////////////////////// - -// "Zeroes out" all of the blocks. -/datum/dna/proc/ResetSE() - for(var/i = 1, i <= DNA_SE_LENGTH, i++) - SetSEValue(i,rand(1,1024),1) - UpdateSE() - -// Set a DNA SE block's raw value. -/datum/dna/proc/SetSEValue(var/block,var/value,var/defer=0) - if (block<=0) return - ASSERT(value>=0) - ASSERT(value<=4095) - SE[block]=value - dirtySE=1 - if(!defer) - UpdateSE() - -// Get a DNA SE block's raw value. -/datum/dna/proc/GetSEValue(var/block) - if (block<=0) return 0 - return SE[block] - -// Set a DNA SE block's value, given a value and a max possible value. -// Might be used for species? -/datum/dna/proc/SetSEValueRange(var/block,var/value,var/maxvalue) - if (block<=0) return - ASSERT(maxvalue<=4095) - var/range = round(4095 / maxvalue) - if(value) - SetSEValue(block, value * range - rand(1,range-1)) - -// Getter version of above. -/datum/dna/proc/GetSEValueRange(var/block,var/maxvalue) - if (block<=0) return 0 - var/value = GetSEValue(block) - return round(1 +(value / 4096)*maxvalue) - -// Is the block "on" (1) or "off" (0)? (Un-assigned genes are always off.) -/datum/dna/proc/GetSEState(var/block) - if (block<=0) return 0 - var/list/BOUNDS=GetDNABounds(block) - var/value=GetSEValue(block) - return (value > BOUNDS[DNA_ON_LOWERBOUND]) - -// Set a block "on" or "off". -/datum/dna/proc/SetSEState(var/block,var/on,var/defer=0) - if (block<=0) return - var/list/BOUNDS=GetDNABounds(block) - var/val - if(on) - val=rand(BOUNDS[DNA_ON_LOWERBOUND],BOUNDS[DNA_ON_UPPERBOUND]) - else - val=rand(1,BOUNDS[DNA_OFF_UPPERBOUND]) - SetSEValue(block,val,defer) - -// Get hex-encoded SE block. -/datum/dna/proc/GetSEBlock(var/block) - return EncodeDNABlock(GetSEValue(block)) - -// Do not use this unless you absolutely have to. -// Set a block from a hex string. This is inefficient. If you can, use SetUIValue(). -// Used in DNA modifiers. -/datum/dna/proc/SetSEBlock(var/block,var/value,var/defer=0) - if (block<=0) return - var/nval=hex2num(value) - //testing("SetSEBlock([block],[value],[defer]): [value] -> [nval]") - return SetSEValue(block,nval,defer) - -/datum/dna/proc/GetSESubBlock(var/block,var/subBlock) - return copytext(GetSEBlock(block),subBlock,subBlock+1) - -// Do not use this unless you absolutely have to. -// Set a sub-block from a hex character. This is inefficient. If you can, use SetUIValue(). -// Used in DNA modifiers. -/datum/dna/proc/SetSESubBlock(var/block,var/subBlock, var/newSubBlock, var/defer=0) - if (block<=0) return - var/oldBlock=GetSEBlock(block) - var/newBlock="" - for(var/i=1, i<=length(oldBlock), i++) - if(i==subBlock) - newBlock+=newSubBlock - else - newBlock+=copytext(oldBlock,i,i+1) - //testing("SetSESubBlock([block],[subBlock],[newSubBlock],[defer]): [oldBlock] -> [newBlock]") - SetSEBlock(block,newBlock,defer) - -/proc/EncodeDNABlock(var/value) - return num2hex_padded(value, 3) - -/datum/dna/proc/UpdateUI() - src.uni_identity="" - for(var/block in UI) - uni_identity += EncodeDNABlock(block) - //testing("New UI: [uni_identity]") - dirtyUI=0 - -/datum/dna/proc/UpdateSE() - //var/oldse=struc_enzymes - struc_enzymes="" - for(var/block in SE) - struc_enzymes += EncodeDNABlock(block) - //testing("Old SE: [oldse]") - //testing("New SE: [struc_enzymes]") - dirtySE=0 - -// BACK-COMPAT! -// Just checks our character has all the crap it needs. -/datum/dna/proc/check_integrity(var/mob/living/carbon/human/character) - if(character) - if(UI.len != DNA_UI_LENGTH) - ResetUIFrom(character) - - if(length(struc_enzymes)!= 3*DNA_SE_LENGTH) - ResetSE() - - if(length(unique_enzymes) != 32) - unique_enzymes = md5(num2text(character.original_genetic_seed)) - else - if(!species) - species = global.using_map.default_species - if(length(uni_identity) != 3*DNA_UI_LENGTH) - uni_identity = "00600200A00E0110148FC01300B0095BD7FD3F4" - if(length(struc_enzymes)!= 3*DNA_SE_LENGTH) - struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6" - -// BACK-COMPAT! -// Initial DNA setup. I'm kind of wondering why the hell this doesn't just call the above. -/datum/dna/proc/ready_dna(mob/living/carbon/human/character) - ResetUIFrom(character) - ResetSE() - unique_enzymes = character.get_unique_enzymes() diff --git a/code/game/dna/dna2_domutcheck.dm b/code/game/dna/dna2_domutcheck.dm deleted file mode 100644 index fbbcc3c612f..00000000000 --- a/code/game/dna/dna2_domutcheck.dm +++ /dev/null @@ -1,50 +0,0 @@ -// (Re-)Apply mutations. -// TODO: Turn into a /mob proc, change inj to a bitflag for various forms of differing behavior. -// M: Mob to mess with -// connected: Machine we're in, type unchecked so I doubt it's used beyond monkeying -// flags: See below, bitfield. -#define MUTCHK_FORCED 1 -/proc/domutcheck(var/mob/living/M, var/connected=null, var/flags=0) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.should_have_organ(BP_HEART)) - return - - var/list/all_genes = decls_repository.get_decls_of_subtype(/decl/gene) - for(var/gene_type in all_genes) - var/decl/gene/gene = all_genes[gene_type] - if(!M || !M.dna) - return - if(!gene.block) - continue - - // Sanity checks, don't skip. - if(!gene.can_activate(M,flags)) - //testing("[M] - Failed to activate [gene.name] (can_activate fail).") - continue - - // Current state - var/gene_active = (gene.flags & GENE_ALWAYS_ACTIVATE) - if(!gene_active) - gene_active = M.dna.GetSEState(gene.block) - - // Prior state - var/gene_prior_status = (gene.type in M.active_genes) - var/changed = gene_active != gene_prior_status || (gene.flags & GENE_ALWAYS_ACTIVATE) - - // If gene state has changed: - if(changed) - // Gene active (or ALWAYS ACTIVATE) - if(gene_active || (gene.flags & GENE_ALWAYS_ACTIVATE)) - testing("[gene.name] activated!") - gene.activate(M,connected,flags) - if(M) - LAZYDISTINCTADD(M.active_genes, gene.type) - M.queue_icon_update() - // If Gene is NOT active: - else - testing("[gene.name] deactivated!") - gene.deactivate(M,connected,flags) - if(M) - LAZYREMOVE(M.active_genes, gene.type) - M.queue_icon_update() diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm deleted file mode 100644 index d413e8d467d..00000000000 --- a/code/game/dna/dna2_helpers.dm +++ /dev/null @@ -1,105 +0,0 @@ -///////////////////////////// -// Helpers for DNA2 -///////////////////////////// - -// DNA Gene activation boundaries, see dna2.dm. -// Returns a list object with 4 numbers. -/proc/GetDNABounds(var/block) - var/list/BOUNDS=dna_activity_bounds[block] - if(!istype(BOUNDS)) - return DNA_DEFAULT_BOUNDS - return BOUNDS - -// Give Random Bad Mutation to M -/proc/randmutb(var/mob/living/M) - if(!M) return - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.should_have_organ(BP_HEART)) - return - M.dna.check_integrity() - var/block = pick(global.GLASSESBLOCK,global.COUGHBLOCK,global.FAKEBLOCK,global.NERVOUSBLOCK,global.CLUMSYBLOCK,global.TWITCHBLOCK,global.HEADACHEBLOCK,global.BLINDBLOCK,global.DEAFBLOCK,global.HALLUCINATIONBLOCK) - M.dna.SetSEState(block, 1) - -// Give Random Good Mutation to M -/proc/randmutg(var/mob/living/M) - if(!M) return - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.should_have_organ(BP_HEART)) - return - M.dna.check_integrity() - var/block = pick(global.XRAYBLOCK,global.FIREBLOCK,global.TELEBLOCK,global.NOBREATHBLOCK,global.REMOTEVIEWBLOCK,global.REGENERATEBLOCK,global.INCREASERUNBLOCK,global.REMOTETALKBLOCK,global.MORPHBLOCK,global.BLENDBLOCK,global.NOPRINTSBLOCK,global.SHOCKIMMUNITYBLOCK,global.SMALLSIZEBLOCK) - M.dna.SetSEState(block, 1) - -// Random Appearance Mutation -/proc/randmuti(var/mob/living/M) - if(!M) return - M.dna.check_integrity() - M.dna.SetUIValue(rand(1,DNA_UI_LENGTH),rand(1,4095)) - -// Scramble UI or SE. -/proc/scramble(var/UI, var/mob/M, var/prob) - if(!M) return - M.dna.check_integrity() - if(UI) - for(var/i = 1, i <= DNA_UI_LENGTH-1, i++) - if(prob(prob)) - M.dna.SetUIValue(i,rand(1,4095),1) - M.dna.UpdateUI() - M.UpdateAppearance() - - else - for(var/i = 1, i <= DNA_SE_LENGTH-1, i++) - if(prob(prob)) - M.dna.SetSEValue(i,rand(1,4095),1) - M.dna.UpdateSE() - domutcheck(M, null) - return - -// /proc/updateappearance has changed behavior, so it's been removed -// Use mob.UpdateAppearance() instead. - -// Simpler. Don't specify UI in order for the mob to use its own. -/mob/proc/UpdateAppearance(var/list/UI=null) - return FALSE - -/mob/living/carbon/human/UpdateAppearance(var/list/UI=null) - - if(UI!=null) - src.dna.UI=UI - src.dna.UpdateUI() - - dna.check_integrity() - - fingerprint = dna.fingerprint - unique_enzymes = dna.unique_enzymes - set_skin_colour( rgb(dna.GetUIValueRange(DNA_UI_SKIN_R,255), dna.GetUIValueRange(DNA_UI_SKIN_G,255), dna.GetUIValueRange(DNA_UI_SKIN_B,255))) - set_eye_colour( rgb(dna.GetUIValueRange(DNA_UI_EYES_R,255), dna.GetUIValueRange(DNA_UI_EYES_G,255), dna.GetUIValueRange(DNA_UI_EYES_B,255))) - skin_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative. - - - // TODO: update DNA gender to not be a bool - use bodytype and pronouns - //Body markings - for(var/tag in dna.heritable_sprite_accessories) - var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, tag) - if(E) - var/list/marklist = dna.heritable_sprite_accessories[tag] - if(length(marklist)) - for(var/accessory in marklist) - E.set_sprite_accessory(accessory, null, marklist[accessory], skip_update = TRUE) - else - E.clear_sprite_accessories(skip_update = TRUE) - - //Base skin and blend - for(var/obj/item/organ/organ in get_organs()) - organ.set_dna(dna) - - force_update_limbs() - update_hair(update_icons = FALSE) - update_eyes() - return TRUE - -// Used below, simple injection modifier. -/proc/probinj(var/pr, var/inj) - return prob(pr+inj*pr) diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm deleted file mode 100644 index fbd088939f6..00000000000 --- a/code/game/dna/genes/disabilities.dm +++ /dev/null @@ -1,133 +0,0 @@ -///////////////////// -// DISABILITY GENES -// -// These activate either a mutation, disability, or sdisability. -// -// Gene is always activated. -///////////////////// - -/decl/gene/disability - name="DISABILITY" - /// Mutation to give (or 0) - var/mutation=0 - /// Disability to give (or 0) - var/disability=0 - /// SDisability to give (or 0) - var/sdisability=0 - /// Activation message - var/activation_message="" - /// Yay, you're no longer growing 3 arms - var/deactivation_message="" - -/decl/gene/disability/can_activate(var/mob/M,var/flags) - return 1 // Always set! - -/decl/gene/disability/activate(var/mob/M, var/connected, var/flags) - if(mutation && !(mutation in M.mutations)) - M.mutations.Add(mutation) - if(disability) - M.disabilities|=disability - if(sdisability) - M.set_sdisability(sdisability) - if(activation_message) - to_chat(M, "[activation_message]") - else - testing("[name] has no activation message.") - -/decl/gene/disability/deactivate(var/mob/M, var/connected, var/flags) - if(mutation && (mutation in M.mutations)) - M.mutations.Remove(mutation) - if(disability) - M.disabilities &= (~disability) - if(sdisability) - M.unset_sdisability(sdisability) - if(deactivation_message) - to_chat(M, "[deactivation_message]") - else - testing("[name] has no deactivation message.") - -// Note: Doesn't seem to do squat, at the moment. -/decl/gene/disability/hallucinate - name="Hallucinate" - activation_message="Your mind says 'Hello'." - mutation=mHallucination - -/decl/gene/disability/hallucinate/Initialize() - . = ..() - block=global.HALLUCINATIONBLOCK - -/decl/gene/disability/epilepsy - name="Epilepsy" - activation_message="You get a headache." - disability=EPILEPSY - -/decl/gene/disability/epilepsy/Initialize() - . = ..() - block=global.HEADACHEBLOCK - -/decl/gene/disability/cough - name="Coughing" - activation_message="You start coughing." - disability=COUGHING - -/decl/gene/disability/cough/Initialize() - . = ..() - block=global.COUGHBLOCK - -/decl/gene/disability/clumsy - name="Clumsiness" - activation_message="You feel lightheaded." - mutation=MUTATION_CLUMSY - -/decl/gene/disability/clumsy/Initialize() - . = ..() - block=global.CLUMSYBLOCK - -/decl/gene/disability/tourettes - name="Tourettes" - activation_message="You twitch." - disability=TOURETTES - -/decl/gene/disability/tourettes/Initialize() - . = ..() - block=global.TWITCHBLOCK - -/decl/gene/disability/nervousness - name="Nervousness" - activation_message="You feel nervous." - disability=NERVOUS - -/decl/gene/disability/nervousness/Initialize() - . = ..() - block=global.NERVOUSBLOCK - -/decl/gene/disability/blindness - name="Blindness" - activation_message="You can't seem to see anything." - sdisability=BLINDED - -/decl/gene/disability/blindness/Initialize() - . = ..() - block=global.BLINDBLOCK - -/decl/gene/disability/deaf - name="Deafness" - activation_message="It's kinda quiet." - sdisability=DEAFENED - -/decl/gene/disability/deaf/Initialize() - . = ..() - block=global.DEAFBLOCK - -/decl/gene/disability/deaf/activate(var/mob/M, var/connected, var/flags) - ..(M,connected,flags) - M.set_status(STAT_DEAF, 1) - -/decl/gene/disability/nearsighted - name="Nearsightedness" - activation_message="Your eyes feel weird..." - disability=NEARSIGHTED - -/decl/gene/disability/nearsighted/Initialize() - . = ..() - block=global.GLASSESBLOCK diff --git a/code/game/dna/genes/gene.dm b/code/game/dna/genes/gene.dm deleted file mode 100644 index e137b1cb97a..00000000000 --- a/code/game/dna/genes/gene.dm +++ /dev/null @@ -1,97 +0,0 @@ -/decl/gene - /// Display name - var/name="BASE GENE" - /// What gene activates this? - var/block = 0 - /// Any of a number of GENE_ flags. - var/flags=0 - -/// Is the gene active in this mob's DNA? -/decl/gene/proc/is_active(var/mob/M) - return (type in M.active_genes) - -/decl/gene/proc/can_activate(var/mob/M, var/flags) - return FALSE - -/// Called when the gene activates. Do your magic here. -/decl/gene/proc/activate(var/mob/M, var/connected, var/flags) - return - -// Called when the gene deactivates. Undo your magic here. -/decl/gene/proc/deactivate(var/mob/M, var/connected, var/flags) - return - -// This section inspired by goone's bioEffects. - -/** -* Called in each life() tick. -*/ -/decl/gene/proc/OnMobLife(var/mob/M) - return - -/** -* Called when the mob dies -*/ -/decl/gene/proc/OnMobDeath(var/mob/M) - return - -/** -* Called when the mob says shit -*/ -/decl/gene/proc/OnSay(var/mob/M, var/message) - return message - -/** -* Called after the mob runs update_icons. -* -* @params M The subject. -* @params g Gender (m or f) -*/ -/decl/gene/proc/OnDrawUnderlays(var/mob/M, var/g) - return 0 - - -///////////////////// -// BASIC GENES -// -// These just chuck in a mutation and display a message. -// -// Gene is activated: -// 1. If mutation already exists in mob -// 2. If the probability roll succeeds -// 3. Activation is forced (done in domutcheck) -///////////////////// - - -/decl/gene/basic - name="BASIC GENE" - /// Mutation to give - var/mutation=0 - /// Activation probability - var/activation_prob=45 - /// Possible activation messages - var/activation_messages - /// Possible deactivation messages - var/deactivation_messages - -/decl/gene/basic/can_activate(var/mob/M,var/flags) - if(flags & MUTCHK_FORCED) - return 1 - // Probability check - return probinj(activation_prob,(flags&MUTCHK_FORCED)) - -/decl/gene/basic/activate(var/mob/M) - M.mutations.Add(mutation) - if(length(activation_messages)) - if(islist(activation_messages)) - to_chat(M, SPAN_NOTICE(pick(activation_messages))) - else - to_chat(M, SPAN_NOTICE(activation_messages)) - -/decl/gene/basic/deactivate(var/mob/M) - M.mutations.Remove(mutation) - if(length(deactivation_messages)) - if(islist(deactivation_messages)) - to_chat(M, SPAN_WARNING(pick(deactivation_messages))) - else - to_chat(M, SPAN_WARNING(deactivation_messages)) diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm deleted file mode 100644 index c73b16d0eec..00000000000 --- a/code/game/dna/genes/powers.dm +++ /dev/null @@ -1,118 +0,0 @@ -/////////////////////////////////// -// POWERS -/////////////////////////////////// - -/decl/gene/basic/nobreath - name="No Breathing" - activation_messages="You feel no need to breathe." - mutation=mNobreath - -/decl/gene/basic/nobreath/Initialize() - . = ..() - block=global.NOBREATHBLOCK - -/decl/gene/basic/remoteview - name="Remote Viewing" - activation_messages="Your mind expands." - mutation=mRemote - -/decl/gene/basic/remoteview/Initialize() - . = ..() - block=global.REMOTEVIEWBLOCK - -/decl/gene/basic/remoteview/activate(var/mob/M, var/connected, var/flags) - ..(M,connected,flags) - M.verbs += /mob/living/carbon/human/proc/remoteobserve - -/decl/gene/basic/regenerate - name="Regenerate" - activation_messages="You feel better." - mutation=mRegen - -/decl/gene/basic/regenerate/Initialize() - . = ..() - block=global.REGENERATEBLOCK - -/decl/gene/basic/regenerate - name="Super Speed" - activation_messages="Your leg muscles pulsate." - mutation=mRun - -/decl/gene/basic/regenerate/Initialize() - . = ..() - block=global.INCREASERUNBLOCK - -/decl/gene/basic/remotetalk - name="Telepathy" - activation_messages="You expand your mind outwards." - mutation=mRemotetalk - -/decl/gene/basic/remotetalk/Initialize() - . = ..() - block=global.REMOTETALKBLOCK - -/decl/gene/basic/remotetalk/activate(var/mob/M, var/connected, var/flags) - ..(M,connected,flags) - M.verbs += /mob/living/carbon/human/proc/remotesay - -/decl/gene/basic/morph - name="Morph" - activation_messages="Your skin feels strange." - mutation=mMorph - -/decl/gene/basic/noshock/Initialize() - . = ..() - block=global.MORPHBLOCK - -/decl/gene/basic/morph/activate(var/mob/M) - ..(M) - M.verbs += /mob/living/carbon/human/proc/morph - -/decl/gene/basic/cold_resist - name="Cold Resistance" - activation_messages="Your body is filled with warmth." - mutation=MUTATION_COLD_RESISTANCE - -/decl/gene/basic/cold_resist/Initialize() - . = ..() - block=global.FIREBLOCK - -/decl/gene/basic/cold_resist/can_activate(var/mob/M,var/flags) - if(flags & MUTCHK_FORCED) - return 1 - // Probability check - var/_prob=30 - //if(mHeatres in M.mutations) - // _prob=5 - if(probinj(_prob,(flags&MUTCHK_FORCED))) - return 1 - -/decl/gene/basic/cold_resist/OnDrawUnderlays(var/mob/M,var/g) - return "fire_s" - -/decl/gene/basic/noprints - name="No Prints" - activation_messages="Your fingers feel numb." - mutation=mFingerprints - -/decl/gene/basic/noprints/Initialize() - . = ..() - block=global.NOPRINTSBLOCK - -/decl/gene/basic/noshock - name="Shock Immunity" - activation_messages="Your skin feels strange." - mutation=mShock - -/decl/gene/basic/noshock/Initialize() - . = ..() - block=global.SHOCKIMMUNITYBLOCK - -/decl/gene/basic/xray - name="X-Ray Vision" - activation_messages="The walls suddenly disappear." - mutation=MUTATION_XRAY - -/decl/gene/basic/xray/Initialize() - . = ..() - block=global.XRAYBLOCK diff --git a/code/game/gamemodes/cult/cultify/de-cultify.dm b/code/game/gamemodes/cult/cultify/de-cultify.dm deleted file mode 100644 index 1a0a11f8b22..00000000000 --- a/code/game/gamemodes/cult/cultify/de-cultify.dm +++ /dev/null @@ -1,6 +0,0 @@ -/turf/unsimulated/wall/cult/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/nullrod)) - user.visible_message("\The [user] touches \the [src] with \the [I], and it shifts.", "You touch \the [src] with \the [I], and it shifts.") - ChangeTurf(/turf/unsimulated/wall) - return TRUE - return ..() \ No newline at end of file diff --git a/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm b/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm index 88708dee839..b95a69b21c6 100644 --- a/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm +++ b/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm @@ -72,7 +72,7 @@ /obj/effect/bluegoast name = "echo" desc = "It's not going to punch you, is it?" - var/mob/living/carbon/human/daddy + var/mob/living/human/daddy anchored = TRUE var/reality = 0 simulated = 0 @@ -119,9 +119,9 @@ return daddy.examine(arglist(args)) /obj/effect/bluegoast/proc/blueswitch() - var/mob/living/carbon/human/H + var/mob/living/human/H if(ishuman(daddy)) - H = new(get_turf(src), daddy.species.name, daddy.dna.Clone(), daddy.get_bodytype()) + H = new(get_turf(src), daddy.species.name, daddy.get_mob_snapshot(force = TRUE), daddy.get_bodytype()) for(var/obj/item/entry in daddy.get_equipped_items(TRUE)) daddy.remove_from_mob(entry) //steals instead of copies so we don't end up with duplicates H.equip_to_appropriate_slot(entry) diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm index 894a38c8bd7..8de40b0d123 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm @@ -39,10 +39,6 @@ var/global/universe_has_ended = 0 APCSet() OverlayAndAmbientSet() - // Disable Nar-Sie. - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.allow_narsie = 0 - PlayerSet() SSskybox.change_skybox("cascade", new_use_stars = FALSE, new_use_overmap_details = FALSE) diff --git a/code/game/gamemodes/game_mode_latespawn.dm b/code/game/gamemodes/game_mode_latespawn.dm index 8fd44e1744d..eee94e85b16 100644 --- a/code/game/gamemodes/game_mode_latespawn.dm +++ b/code/game/gamemodes/game_mode_latespawn.dm @@ -21,13 +21,13 @@ return TRUE //This can be overriden in case a game mode needs to do stuff when a player latejoins -/decl/game_mode/proc/handle_latejoin(var/mob/living/carbon/human/character) +/decl/game_mode/proc/handle_latejoin(var/mob/living/human/character) if(character.mind) character.mind.generate_goals(character.mind.assigned_job, is_spawning=TRUE) character.show_goals() return 0 -/decl/game_mode/proc/handle_offsite_latejoin(var/mob/living/carbon/human/character) +/decl/game_mode/proc/handle_offsite_latejoin(var/mob/living/human/character) return 0 /decl/game_mode/proc/process_autoantag() diff --git a/code/game/gamemodes/godmode/form_items/narsie_structures.dm b/code/game/gamemodes/godmode/form_items/narsie_structures.dm deleted file mode 100644 index 6dcdde9a6ed..00000000000 --- a/code/game/gamemodes/godmode/form_items/narsie_structures.dm +++ /dev/null @@ -1,92 +0,0 @@ -/obj/structure/deity/altar/narsie - name = "altar" - desc = "A small desk, covered in blood." - icon_state = "talismanaltar" - -/obj/structure/deity/blood_forge - name = "unholy forge" - desc = "This forge gives off no heat, no light, its flames look almost unnatural." - icon_state = "forge" - build_cost = 1000 - current_health = 50 - var/busy = 0 - var/recipe_feat_list = "Blood Crafting" - var/text_modifications = list("Cost" = "Blood", - "Dip" = "fire. Pain envelopes you as blood seeps out of your hands and you begin to shape it into something more useful", - "Shape" = "You shape the fire as more and more blood comes out.", - "Out" = "flames") - - power_adjustment = 2 - -/obj/structure/deity/blood_forge/attack_hand(var/mob/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return ..() - var/list/recipes = linked_god.feats[recipe_feat_list] - if(!recipes) - return TRUE - var/dat = "
Recipes


Item - [text_modifications["Cost"]] Cost
" - for(var/type in recipes) - var/atom/a = type - var/cost = recipes[type] - dat += "[initial(a.name)] - [cost]
[initial(a.desc)]

" - show_browser(user, dat, "window=forge") - return TRUE - -/obj/structure/deity/blood_forge/CanUseTopic(var/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return STATUS_CLOSE - return ..() - -/obj/structure/deity/blood_forge/OnTopic(var/user, var/list/href_list) - if(href_list["make_recipe"]) - var/list/recipes = linked_god.feats[recipe_feat_list] - var/type = locate(href_list["make_recipe"]) in recipes - if(type) - var/cost = recipes[type] - craft_item(type, cost, user) - return TOPIC_REFRESH - -/obj/structure/deity/blood_forge/proc/craft_item(var/path, var/blood_cost, var/mob/user) - if(busy) - to_chat(user, "Someone is already using \the [src]!") - return - - busy = 1 - to_chat(user, "You dip your hands into \the [src]'s [text_modifications["Dip"]]") - for(var/count = 0, count < blood_cost/10, count++) - if(!do_after(user, 50,src)) - busy = 0 - return - user.visible_message("\The [user] swirls their hands in \the [src].", text_modifications["Shape"]) - if(linked_god) - linked_god.take_charge(user, 10) - var/obj/item/I = new path(get_turf(src)) - user.visible_message("\The [user] pull out \the [I] from the [text_modifications["Out"]].", "You pull out the completed [I] from the [text_modifications["Out"]].") - busy = 0 - -/obj/structure/deity/blood_forge/proc/take_charge(var/mob/living/user, var/charge) - if(linked_god) - linked_god.take_charge(user, charge) - -//BLOOD LETTING STRUCTURE -//A follower can stand here and mumble prays as they let their blood flow slowly into the structure. -/obj/structure/deity/blood_stone - name = "bloody stone" - desc = "A jagged stone covered in the various stages of blood, from dried to fresh." - icon_state = "blood_stone" - current_health = 100 //Its a piece of rock. - build_cost = 700 - -/obj/structure/deity/blood_stone/attack_hand(var/mob/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return ..() - var/mob/living/carbon/human/H = user - user.visible_message("\The [user] calmly slices their finger on \the [src], smeering it over the black stone.","You slowly slide your finger down one of \the [src]'s sharp edges, smeering it over its smooth surface.") - while(do_after(H,50,src)) - user.audible_message("\The [user] utters something under their breath.", "You mutter a dark prayer to your master as you feel the stone eat away at your lifeforce.") - if(H.should_have_organ(BP_HEART)) - H.drip(5,get_turf(src)) - else - H.take_damage(5) - linked_god.adjust_power_min(1,1) - return TRUE diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm deleted file mode 100644 index 93da611e656..00000000000 --- a/code/game/gamemodes/meteor/meteors.dm +++ /dev/null @@ -1,391 +0,0 @@ -//Meteor groups, used for various random events and the Meteor gamemode. - -// Dust, used by space dust event and during earliest stages of meteor mode. -var/global/list/meteors_dust = list(/obj/effect/meteor/dust) - -// Standard meteors, used during early stages of the meteor gamemode. -var/global/list/meteors_normal = list(\ - /obj/effect/meteor/medium=8,\ - /obj/effect/meteor/dust=3,\ - /obj/effect/meteor/irradiated=3,\ - /obj/effect/meteor/big=3,\ - /obj/effect/meteor/flaming=1,\ - /obj/effect/meteor/golden=1,\ - /obj/effect/meteor/silver=1\ - ) - -// Threatening meteors, used during the meteor gamemode. -var/global/list/meteors_threatening = list(\ - /obj/effect/meteor/big=10,\ - /obj/effect/meteor/medium=5,\ - /obj/effect/meteor/golden=3,\ - /obj/effect/meteor/silver=3,\ - /obj/effect/meteor/flaming=3,\ - /obj/effect/meteor/irradiated=3,\ - /obj/effect/meteor/emp=3\ - ) - -// Catastrophic meteors, pretty dangerous without shields and used during the meteor gamemode. -var/global/list/meteors_catastrophic = list(\ - /obj/effect/meteor/big=75,\ - /obj/effect/meteor/flaming=10,\ - /obj/effect/meteor/irradiated=10,\ - /obj/effect/meteor/emp=10,\ - /obj/effect/meteor/medium=5,\ - /obj/effect/meteor/golden=4,\ - /obj/effect/meteor/silver=4,\ - /obj/effect/meteor/tunguska=1\ - ) - -// Armageddon meteors, very dangerous, and currently used only during the meteor gamemode. -var/global/list/meteors_armageddon = list(\ - /obj/effect/meteor/big=25,\ - /obj/effect/meteor/flaming=10,\ - /obj/effect/meteor/irradiated=10,\ - /obj/effect/meteor/emp=10,\ - /obj/effect/meteor/medium=3,\ - /obj/effect/meteor/tunguska=3,\ - /obj/effect/meteor/golden=2,\ - /obj/effect/meteor/silver=2\ - ) - -// Cataclysm meteor selection. Very very dangerous and effective even against shields. Used in late game meteor gamemode only. -var/global/list/meteors_cataclysm = list(\ - /obj/effect/meteor/big=40,\ - /obj/effect/meteor/emp=20,\ - /obj/effect/meteor/tunguska=20,\ - /obj/effect/meteor/irradiated=10,\ - /obj/effect/meteor/golden=10,\ - /obj/effect/meteor/silver=10,\ - /obj/effect/meteor/flaming=10,\ - /obj/effect/meteor/supermatter=1\ - ) - - - -/////////////////////////////// -//Meteor spawning global procs -/////////////////////////////// - -/proc/spawn_meteors(var/number = 10, var/list/meteortypes, var/startSide, var/zlevel) - for(var/i = 0; i < number; i++) - spawn_meteor(meteortypes, startSide, zlevel) - -/proc/spawn_meteor(var/list/meteortypes, var/startSide, var/zlevel) - var/turf/pickedstart = spaceDebrisStartLoc(startSide, zlevel) - var/turf/pickedgoal = spaceDebrisFinishLoc(startSide, zlevel) - - var/Me = pickweight(meteortypes) - var/obj/effect/meteor/M = new Me(pickedstart) - M.dest = pickedgoal - spawn(0) - walk_towards(M, M.dest, 3) - return - -/proc/spaceDebrisStartLoc(startSide, Z) - var/starty - var/startx - switch(startSide) - if(NORTH) - starty = world.maxy-(TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - if(EAST) - starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1)) - startx = world.maxx-(TRANSITIONEDGE+1) - if(SOUTH) - starty = (TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - if(WEST) - starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1)) - startx = (TRANSITIONEDGE+1) - var/turf/T = locate(startx, starty, Z) - return T - -/proc/spaceDebrisFinishLoc(startSide, Z) - var/endy - var/endx - switch(startSide) - if(NORTH) - endy = TRANSITIONEDGE - endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) - if(EAST) - endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE) - endx = TRANSITIONEDGE - if(SOUTH) - endy = world.maxy-TRANSITIONEDGE - endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) - if(WEST) - endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE) - endx = world.maxx-TRANSITIONEDGE - var/turf/T = locate(endx, endy, Z) - return T - -/////////////////////// -//The meteor effect -////////////////////// - -/obj/effect/meteor - name = "meteor" - desc = "You should probably run instead of gawking at this." - icon = 'icons/obj/meteor.dmi' - icon_state = "small" - density = TRUE - anchored = TRUE - var/hits = 4 - var/hitpwr = 2 //Level of ex_act to be called on hit. - var/dest - pass_flags = PASS_FLAG_TABLE - var/heavy = 0 - var/z_original - var/meteordrop = /obj/item/stack/material/ore/iron - var/dropamt = 1 - var/ismissile //missiles don't spin - - var/move_count = 0 - -/obj/effect/meteor/proc/get_shield_damage() - return max(((max(hits, 2)) * (heavy + 1) * rand(30, 60)) / hitpwr , 0) - -/obj/effect/meteor/Initialize() - . = ..() - z_original = z - -/obj/effect/meteor/Initialize() - . = ..() - global.meteor_list += src - -/obj/effect/meteor/Move() - . = ..() //process movement... - move_count++ - if(loc == dest) - qdel(src) - -/obj/effect/meteor/touch_map_edge(var/overmap_id = OVERMAP_ID_SPACE) - if(move_count > TRANSITIONEDGE) - qdel(src) - -/obj/effect/meteor/Destroy() - walk(src,0) //this cancels the walk_towards() proc - global.meteor_list -= src - . = ..() - -/obj/effect/meteor/Initialize() - . = ..() - if(!ismissile) - SpinAnimation() - -/obj/effect/meteor/Bump(atom/A) - ..() - if(A && !QDELETED(src)) // Prevents explosions and other effects when we were deleted by whatever we Bumped() - currently used by shields. - ram_turf(get_turf(A)) - get_hit() //should only get hit once per move attempt - -/obj/effect/meteor/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - return istype(mover, /obj/effect/meteor) ? 1 : ..() - -/obj/effect/meteor/proc/ram_turf(var/turf/T) - //first bust whatever is in the turf - for(var/atom/A in T) - if(A != src && !A.CanPass(src, src.loc, 0.5, 0)) //only ram stuff that would actually block us - A.explosion_act(hitpwr) - - //then, ram the turf if it still exists - if(T && !T.CanPass(src, src.loc, 0.5, 0)) - T.explosion_act(hitpwr) - -//process getting 'hit' by colliding with a dense object -//or randomly when ramming turfs -/obj/effect/meteor/proc/get_hit() - hits-- - if(hits <= 0) - make_debris() - meteor_effect() - qdel(src) - -/obj/effect/meteor/explosion_act() - SHOULD_CALL_PARENT(FALSE) - return - -/obj/effect/meteor/attackby(obj/item/W, mob/user, params) - if(IS_PICK(W)) - qdel(src) - return - ..() - -/obj/effect/meteor/proc/make_debris() - if(meteordrop && dropamt) - for(var/throws = dropamt, throws > 0, throws--) - addtimer(CALLBACK(new meteordrop(get_turf(src)), TYPE_PROC_REF(/atom/movable, throw_at), dest, 5, 10), 0) - -/obj/effect/meteor/proc/meteor_effect() - if(heavy) - for(var/mob/M in global.player_list) - var/turf/T = get_turf(M) - if(!T || T.z != src.z) - continue - var/dist = get_dist(M.loc, src.loc) - shake_camera(M, (dist > 20 ? 0.5 SECONDS : 1 SECOND), (dist > 20 ? 1 : 3)) - - -/////////////////////// -//Meteor types -/////////////////////// - -//Dust -/obj/effect/meteor/dust - name = "space dust" - icon_state = "dust" - pass_flags = PASS_FLAG_TABLE | PASS_FLAG_GRILLE - hits = 1 - hitpwr = 3 - dropamt = 1 - meteordrop = /obj/item/stack/material/ore/handful/sand - -//Medium-sized -/obj/effect/meteor/medium - name = "meteor" - dropamt = 2 - -/obj/effect/meteor/medium/meteor_effect() - ..() - explosion(src.loc, 0, 1, 2, 3, 0) - -//Large-sized -/obj/effect/meteor/big - name = "large meteor" - icon_state = "large" - hits = 6 - heavy = 1 - dropamt = 3 - -/obj/effect/meteor/big/meteor_effect() - ..() - explosion(src.loc, 1, 2, 3, 4, 0) - -//Flaming meteor -/obj/effect/meteor/flaming - name = "flaming meteor" - icon_state = "flaming" - hits = 5 - heavy = 1 - meteordrop = /obj/item/stack/material/ore/phosphorite - -/obj/effect/meteor/flaming/meteor_effect() - ..() - explosion(src.loc, 1, 2, 3, 4, 0, 0, 5) - -//Radiation meteor -/obj/effect/meteor/irradiated - name = "glowing meteor" - icon_state = "glowing" - heavy = 1 - meteordrop = /obj/item/stack/material/ore/uranium - -/obj/effect/meteor/irradiated/meteor_effect() - ..() - explosion(src.loc, 0, 0, 4, 3, 0) - SSradiation.radiate(src, 50) - -/obj/effect/meteor/golden - name = "golden meteor" - icon_state = "glowing" - desc = "Shiny! But also deadly." - meteordrop = /obj/item/stack/material/ore/gold - -/obj/effect/meteor/silver - name = "silver meteor" - icon_state = "glowing_blue" - desc = "Shiny! But also deadly." - meteordrop = /obj/item/stack/material/ore/silver - -/obj/effect/meteor/emp - name = "conducting meteor" - icon_state = "glowing_blue" - desc = "Hide your floppies!" - meteordrop = /obj/item/stack/material/ore/osmium - dropamt = 2 - -/obj/effect/meteor/emp/meteor_effect() - ..() - // Best case scenario: Comparable to a low-yield EMP grenade. - // Worst case scenario: Comparable to a standard yield EMP grenade. - empulse(src, rand(2, 4), rand(4, 10)) - -/obj/effect/meteor/emp/get_shield_damage() - return ..() * rand(2,4) - -//Station buster Tunguska -/obj/effect/meteor/tunguska - name = "tunguska meteor" - icon_state = "flaming" - desc = "Your life briefly passes before your eyes the moment you lay them on this monstrosity." - hits = 10 - hitpwr = 1 - heavy = 1 - meteordrop = /obj/item/stack/material/ore/diamond // Probably means why it penetrates the hull so easily before exploding. - -/obj/effect/meteor/tunguska/meteor_effect() - ..() - explosion(src.loc, 3, 6, 9, 20, 0) - -// This is the final solution against shields - a single impact can bring down most shield generators. -/obj/effect/meteor/supermatter - name = "supermatter shard" - desc = "Oh god, what will be next..?" - icon = 'icons/obj/supermatter_32.dmi' - icon_state = "supermatter" - -/obj/effect/meteor/supermatter/meteor_effect() - ..() - explosion(src.loc, 1, 2, 3, 4, 0) - for(var/obj/machinery/power/apc/A in range(rand(12, 20), src)) - A.energy_fail(round(10 * rand(8, 12))) - -/obj/effect/meteor/supermatter/get_shield_damage() - return ..() * rand(80, 120) - -//Missiles, for events and so on -/obj/effect/meteor/supermatter/missile - name = "photon torpedo" - desc = "An advanded warhead designed to tactically destroy space installations." - icon = 'icons/obj/missile.dmi' - icon_state = "photon" - meteordrop = null - ismissile = TRUE - dropamt = 0 - -/obj/effect/meteor/medium/missile - name = "missile" - desc = "Some kind of missile." - icon = 'icons/obj/items/grenades/missile.dmi' - icon_state = ICON_STATE_WORLD - meteordrop = null - ismissile = TRUE - dropamt = 0 - -/obj/effect/meteor/big/missile - name = "high-yield missile" - desc = "Some kind of missile." - icon = 'icons/obj/items/grenades/missile.dmi' - icon_state = ICON_STATE_WORLD - meteordrop = null - ismissile = TRUE - dropamt = 0 - -/obj/effect/meteor/flaming/missile - name = "incendiary missile" - desc = "Some kind of missile." - icon = 'icons/obj/items/grenades/missile.dmi' - icon_state = ICON_STATE_WORLD - meteordrop = null - ismissile = TRUE - dropamt = 0 - -/obj/effect/meteor/emp/missile - name = "ion torpedo" - desc = "Some kind of missile." - icon = 'icons/obj/missile.dmi' - icon_state = "torpedo" - meteordrop = null - ismissile = TRUE - dropamt = 0 \ No newline at end of file diff --git a/code/game/gamemodes/objectives/_objective.dm b/code/game/gamemodes/objectives/_objective.dm index ccfaea16d32..531ea1ccee6 100644 --- a/code/game/gamemodes/objectives/_objective.dm +++ b/code/game/gamemodes/objectives/_objective.dm @@ -25,3 +25,4 @@ var/global/list/all_objectives = list() possible_targets += possible_target if(possible_targets.len > 0) target = pick(possible_targets) + return target \ No newline at end of file diff --git a/code/game/gamemodes/objectives/objective_heist.dm b/code/game/gamemodes/objectives/objective_heist.dm index 75125093c04..c90e5686d8a 100644 --- a/code/game/gamemodes/objectives/objective_heist.dm +++ b/code/game/gamemodes/objectives/objective_heist.dm @@ -1,10 +1,7 @@ -/datum/objective/heist/proc/choose_target() - return - -/datum/objective/heist/kidnap +/datum/objective/kidnap var/list/roles -/datum/objective/heist/kidnap/choose_target() +/datum/objective/kidnap/find_target() var/list/possible_targets = list() var/list/priority_targets = list() @@ -28,7 +25,7 @@ explanation_text = "Free Objective" return target -/datum/objective/heist/loot/choose_target() +/datum/objective/loot/find_target() var/loot = "an object" switch(rand(1,8)) if(1) @@ -65,8 +62,9 @@ loot = "an ion gun" explanation_text = "It's a buyer's market out here. Steal [loot] for resale." + return target -/datum/objective/heist/salvage/choose_target() +/datum/objective/salvage/find_target() var/list/loot = list( /decl/material/solid/metal/steel = 300, /decl/material/solid/glass = 200, @@ -79,6 +77,7 @@ var/decl/material/mat = GET_DECL(pick(loot)) explanation_text = "Ransack the [station_name()] and escape with [loot[mat.type]] unit\s of [mat.solid_name]." + return target -/datum/objective/heist/preserve_crew +/datum/objective/preserve_crew explanation_text = "Do not leave anyone behind, alive or dead." \ No newline at end of file diff --git a/code/game/gamemodes/objectives/objective_misc.dm b/code/game/gamemodes/objectives/objective_misc.dm index 5ad82119e16..0feb39b668e 100644 --- a/code/game/gamemodes/objectives/objective_misc.dm +++ b/code/game/gamemodes/objectives/objective_misc.dm @@ -6,6 +6,3 @@ /datum/objective/survive explanation_text = "Stay alive until the end." - -/datum/objective/ninja_highlander - explanation_text = "You aspire to be a Grand Master of the Spider Clan. Kill all of your fellow acolytes." diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm deleted file mode 100644 index d6f168beea2..00000000000 --- a/code/game/gamemodes/setupgame.dm +++ /dev/null @@ -1,62 +0,0 @@ -///////////////////////// -// (mostly) DNA2 SETUP -///////////////////////// - -// Randomize block, assign a reference name, and optionally define difficulty (by making activation zone smaller or bigger) -// The name is used on /vg/ for species with predefined genetic traits, -// and for the DNA panel in the player panel. -/proc/getAssignedBlock(var/name,var/list/blocksLeft, var/activity_bounds=DNA_DEFAULT_BOUNDS) - if(blocksLeft.len==0) - warning("[name]: No more blocks left to assign!") - return 0 - var/assigned = pick(blocksLeft) - blocksLeft.Remove(assigned) - assigned_blocks[assigned]=name - dna_activity_bounds[assigned]=activity_bounds - //testing("[name] assigned to block #[assigned].") - return assigned - -/proc/setupgenetics() - - if (prob(50)) - // Currently unused. Will revisit. - N3X - global.BLOCKADD = rand(-300,300) - if (prob(75)) - global.DIFFMUT = rand(0,20) - - var/list/numsToAssign=new() - for(var/i=1;ipower.") + to_chat(user, "It is not receiving power.") else - to_chat(user, "It is not receiving power, making it hard to interact with.") + to_chat(user, "It is not receiving power, making it hard to interact with.") if(construct_state && construct_state.mechanics_info()) - to_chat(user, "It can be manipulated using tools.") + to_chat(user, "It can be manipulated using tools.") var/list/missing = missing_parts() if(missing) var/list/parts = list() diff --git a/code/game/machinery/_machines_base/machinery_damage.dm b/code/game/machinery/_machines_base/machinery_damage.dm index 1a0b0781910..96b81329d5a 100644 --- a/code/game/machinery/_machines_base/machinery_damage.dm +++ b/code/game/machinery/_machines_base/machinery_damage.dm @@ -1,4 +1,4 @@ -/obj/machinery/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent = FALSE) +/obj/machinery/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) //Let's not bother initializing all the components for nothing if(damage <= 0) return diff --git a/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm b/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm index d34d7404dd8..f4aab2938f7 100644 --- a/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm +++ b/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm @@ -63,7 +63,7 @@ // RefreshParts has been called, likely meaning other componenets were added/removed. /obj/item/stock_parts/proc/on_refresh(var/obj/machinery/machine) -/obj/item/stock_parts/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/item/stock_parts/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(damage_type in ignore_damage_types) return . = ..() diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index d09354e7bd3..78f73e8df9c 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -55,8 +55,8 @@ if(src.locked && (!issilicon(user))) t += "(Swipe ID card to unlock control panel.)
" else - t += text("Dispenser [] - []?
\n", src.disabled?"deactivated":"activated", src, src.disabled?"Enable":"Disable") - t += text("Uses Left: [uses]. Activate the dispenser?
\n") + t += text("Dispenser [] - []?
\n", src.disabled?"deactivated":"activated", src, src.disabled?"Enable":"Disable") + t += text("Uses Left: [uses]. Activate the dispenser?
\n") show_browser(user, t, "window=computer;size=575x450") onclose(user, "computer") diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 75221b20e6b..890d9653e03 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -949,31 +949,31 @@ FIRE ALARM A = A.loc if (A.fire) - d1 = text("Reset - Lockdown", src) + d1 = text("Reset - Lockdown", src) else - d1 = text("Alarm - Lockdown", src) + d1 = text("Alarm - Lockdown", src) if (src.timing) - d2 = text("Stop Time Lock", src) + d2 = text("Stop Time Lock", src) else - d2 = text("Initiate Time Lock", src) + d2 = text("Initiate Time Lock", src) var/second = round(src.time) % 60 var/minute = (round(src.time) - second) / 60 - var/dat = "Fire alarm [d1]\n
The current alert level is [security_state.current_security_level.name]

\nTimer System: [d2]
\nTime Left: [(minute ? "[minute]:" : null)][second] - - + +\n
" + var/dat = "Fire alarm [d1]\n
The current alert level is [security_state.current_security_level.name]

\nTimer System: [d2]
\nTime Left: [(minute ? "[minute]:" : null)][second] - - + +\n
" show_browser(user, dat, "window=firealarm") onclose(user, "firealarm") else A = A.loc if (A.fire) - d1 = text("[]", src, stars("Reset - Lockdown")) + d1 = text("[]", src, stars("Reset - Lockdown")) else - d1 = text("[]", src, stars("Alarm - Lockdown")) + d1 = text("[]", src, stars("Alarm - Lockdown")) if (src.timing) - d2 = text("[]", src, stars("Stop Time Lock")) + d2 = text("[]", src, stars("Stop Time Lock")) else - d2 = text("[]", src, stars("Initiate Time Lock")) + d2 = text("[]", src, stars("Initiate Time Lock")) var/second = round(src.time) % 60 var/minute = (round(src.time) - second) / 60 - var/dat = "[stars("Fire alarm")] [d1]\n
The current security level is [security_state.current_security_level.name]

\nTimer System: [d2]
\nTime Left: [(minute ? text("[]:", minute) : null)][second] - - + +\n
" + var/dat = "[stars("Fire alarm")] [d1]\n
The current security level is [security_state.current_security_level.name]

\nTimer System: [d2]
\nTime Left: [(minute ? text("[]:", minute) : null)][second] - - + +\n
" show_browser(user, dat, "window=firealarm") onclose(user, "firealarm") return @@ -1058,30 +1058,30 @@ FIRE ALARM if (ishuman(user) || isAI(user)) if (A.party) - d1 = text("No Party :(", src) + d1 = text("No Party :(", src) else - d1 = text("PARTY!!!", src) + d1 = text("PARTY!!!", src) if (timing) - d2 = text("Stop Time Lock", src) + d2 = text("Stop Time Lock", src) else - d2 = text("Initiate Time Lock", src) + d2 = text("Initiate Time Lock", src) var/second = time % 60 var/minute = (time - second) / 60 - var/dat = text("Party Button []\n
\nTimer System: []
\nTime Left: [][] - - + +\n
", d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src) + var/dat = text("Party Button []\n
\nTimer System: []
\nTime Left: [][] - - + +\n
", d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src) show_browser(user, dat, "window=partyalarm") onclose(user, "partyalarm") else if (A.fire) - d1 = text("[]", src, stars("No Party :(")) + d1 = text("[]", src, stars("No Party :(")) else - d1 = text("[]", src, stars("PARTY!!!")) + d1 = text("[]", src, stars("PARTY!!!")) if (timing) - d2 = text("[]", src, stars("Stop Time Lock")) + d2 = text("[]", src, stars("Stop Time Lock")) else - d2 = text("[]", src, stars("Initiate Time Lock")) + d2 = text("[]", src, stars("Initiate Time Lock")) var/second = time % 60 var/minute = (time - second) / 60 - var/dat = text("[] []\n
\nTimer System: []
\nTime Left: [][] - - + +\n
", stars("Party Button"), d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src) + var/dat = text("[] []\n
\nTimer System: []
\nTime Left: [][] - - + +\n
", stars("Party Button"), d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src) show_browser(user, dat, "window=partyalarm") onclose(user, "partyalarm") return diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 23c959e7eba..b827de44877 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -59,8 +59,8 @@ . = ..() /obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well. - ..() - update_icon() + if((. = ..())) + update_icon() /obj/machinery/biogenerator/on_update_icon() if(state == BG_NO_BEAKER) @@ -128,7 +128,7 @@ user.set_machine(src) var/list/data = list() data["state"] = state - var/name + var/product_name var/cost var/type_name var/path @@ -141,12 +141,11 @@ var/list/listed_products = list() for(var/c_product =1 to current_content.len) path = current_content[c_product] - var/atom/A = path - name = initial(A.name) + product_name = atom_info_repository.get_name_for(path) cost = current_content[path] listed_products.Add(list(list( "product_index" = c_product, - "name" = name, + "name" = product_name, "cost" = cost))) listed_types.Add(list(list( "type_name" = type_name, diff --git a/code/game/machinery/bodyscanner.dm b/code/game/machinery/bodyscanner.dm index 2e815dae25a..067ca08ef6d 100644 --- a/code/game/machinery/bodyscanner.dm +++ b/code/game/machinery/bodyscanner.dm @@ -1,6 +1,6 @@ // Pretty much everything here is stolen from the dna scanner FYI /obj/machinery/bodyscanner - var/mob/living/carbon/human/occupant + var/mob/living/human/occupant var/locked name = "Body Scanner" icon = 'icons/obj/Cryogenic2.dmi' diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 3de4c4c7097..2565c5f3e16 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -51,7 +51,7 @@ if(stat & BROKEN) to_chat(user, SPAN_WARNING("It is completely demolished.")) -/obj/machinery/camera/apply_visual(mob/living/carbon/human/M) +/obj/machinery/camera/apply_visual(mob/living/human/M) if(!M.client || !istype(M)) return M.overlay_fullscreen("fishbed",/obj/screen/fullscreen/fishbed) @@ -60,7 +60,7 @@ M.machine_visual = src return 1 -/obj/machinery/camera/remove_visual(mob/living/carbon/human/M) +/obj/machinery/camera/remove_visual(mob/living/human/M) if(!M.client || !istype(M)) return M.clear_fullscreen("fishbed",0) @@ -183,7 +183,7 @@ visible_message(SPAN_WARNING("[src] was hit by [O]!")) take_damage(O.throwforce, O.atom_damage_type) -/obj/machinery/camera/physical_attack_hand(mob/living/carbon/human/user) +/obj/machinery/camera/physical_attack_hand(mob/living/human/user) if(!istype(user)) return if(user.species.can_shred(user)) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 63a2bd834e9..91976e992ed 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -221,7 +221,7 @@ var/datum/extension/network_device/camera/robot/D = get_extension(src, /datum/extension/network_device) return D && D.is_functional() ? TRACKING_POSSIBLE : TRACKING_NO_COVERAGE -/mob/living/carbon/human/tracking_status() +/mob/living/human/tracking_status() if(is_cloaked()) . = TRACKING_TERMINATE else diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 6ae35fa9752..072b89e9928 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -6,7 +6,7 @@ anchored = TRUE icon_keyboard = "med_key" icon_screen = "crew" - var/mob/living/carbon/human/victim = null + var/mob/living/human/victim = null var/obj/machinery/optable/table = null /obj/machinery/computer/operating/Initialize() @@ -30,7 +30,7 @@ user.set_machine(src) var/dat = "Operating Computer\n" - dat += "Close

" //| Update" + dat += "Close

" //| Update" if(src.table && (src.table.check_victim())) src.victim = src.table.victim dat += {" diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 49d1da4f4fe..8b6a10ff259 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -6,33 +6,33 @@ icon_screen = "invaders" var/random = TRUE var/static/list/prizes = list( - /obj/item/box/snappops = 200, - /obj/item/toy/blink = 200, - /obj/item/clothing/under/syndicate/tacticool = 200, - /obj/item/energy_blade/sword/toy = 200, - /obj/item/gun/projectile/revolver/capgun = 200, - /obj/item/gun/launcher/foam/crossbow = 200, - /obj/item/box/fancy/crayons = 200, - /obj/item/toy/spinningtoy = 200, - /obj/item/toy/prize/powerloader = 100, - /obj/item/toy/prize/fireripley = 100, - /obj/item/toy/prize/deathripley = 100, - /obj/item/toy/prize/gygax = 100, - /obj/item/toy/prize/durand = 100, - /obj/item/toy/prize/honk = 100, - /obj/item/toy/prize/marauder = 100, - /obj/item/toy/prize/seraph = 100, - /obj/item/toy/prize/mauler = 100, - /obj/item/toy/prize/odysseus = 100, - /obj/item/toy/prize/phazon = 100, - /obj/item/chems/spray/waterflower = 100, - /obj/random/action_figure = 100, - /obj/random/plushie = 100, - /obj/item/sword/cult_toy = 100, - /obj/item/box/large/foam_gun = 100, - /obj/item/box/large/foam_gun/burst = 50, - /obj/item/box/large/foam_gun/revolver = 25, - /obj/random/plushie/large = 20, + /obj/item/box/snappops = 200, + /obj/item/toy/blink = 200, + /obj/item/clothing/shirt/syndicate/tacticool = 200, + /obj/item/energy_blade/sword/toy = 200, + /obj/item/gun/projectile/revolver/capgun = 200, + /obj/item/gun/launcher/foam/crossbow = 200, + /obj/item/box/fancy/crayons = 200, + /obj/item/toy/spinningtoy = 200, + /obj/item/toy/prize/powerloader = 100, + /obj/item/toy/prize/fireripley = 100, + /obj/item/toy/prize/deathripley = 100, + /obj/item/toy/prize/gygax = 100, + /obj/item/toy/prize/durand = 100, + /obj/item/toy/prize/honk = 100, + /obj/item/toy/prize/marauder = 100, + /obj/item/toy/prize/seraph = 100, + /obj/item/toy/prize/mauler = 100, + /obj/item/toy/prize/odysseus = 100, + /obj/item/toy/prize/phazon = 100, + /obj/item/chems/spray/waterflower = 100, + /obj/random/action_figure = 100, + /obj/random/plushie = 100, + /obj/item/sword/cult_toy = 100, + /obj/item/box/large/foam_gun = 100, + /obj/item/box/large/foam_gun/burst = 50, + /obj/item/box/large/foam_gun/revolver = 25, + /obj/random/plushie/large = 20, /obj/item/box/large/foam_gun/revolver/tampered = 1 ) diff --git a/code/game/machinery/computer/arcade_orion.dm b/code/game/machinery/computer/arcade_orion.dm index bd47447a26d..a076d6efc4d 100644 --- a/code/game/machinery/computer/arcade_orion.dm +++ b/code/game/machinery/computer/arcade_orion.dm @@ -92,28 +92,28 @@ switch(view) if(ORION_VIEW_MAIN) if(event == ORION_TRAIL_START) //new game? New game. - dat = "

Orion Trail[emagged ? ": Realism Edition" : ""]


Learn how our ancestors got to Orion, and have fun in the process!

Start New Game

" + dat = "

Orion Trail[emagged ? ": Realism Edition" : ""]


Learn how our ancestors got to Orion, and have fun in the process!

Start New Game

" show_browser(user, dat, "window=arcade") return else event_title = event - event_actions = "Continue your journey
" + event_actions = "Continue your journey
" switch(event) if(ORION_TRAIL_GAMEOVER) event_info = "" - event_actions = "Start New Game
" + event_actions = "Start New Game
" if(ORION_TRAIL_SPACEPORT) event_title += ": [stops[port]]" event_desc = "[stopblurbs[port]]" event_info = "" if(port == 9) - event_actions = "Return to the title screen!
" + event_actions = "Return to the title screen!
" else - event_actions = "Shove off
" - event_actions += "Raid Spaceport" + event_actions = "Shove off
" + event_actions += "Raid Spaceport" if(ORION_TRAIL_SPACEPORT_RAIDED) event_title += ": [stops[port]]" - event_actions = "Shove off" + event_actions = "Shove off" if(ORION_TRAIL_RAIDERS) event_desc = "You arm yourselves as you prepare to fight off the alien menace!" if(ORION_TRAIL_DERELICT) @@ -122,30 +122,30 @@ event_desc = "A disease has spread amoungst your crew!" if(ORION_TRAIL_FLUX) event_desc = "You've entered a turbulent region. Slowing down would be better for your ship but would cost more fuel." - event_actions = "Continue as normal
" - event_actions += "Take it slow
" + event_actions = "Continue as normal
" + event_actions += "Take it slow
" if(ORION_TRAIL_MALFUNCTION) event_info = "" event_desc = "The ship's computers are malfunctioning! You can choose to fix it with a part or risk something going awry." - event_actions = "Continue as normal
" + event_actions = "Continue as normal
" if(supplies["3"] != 0) - event_actions += "Fix using a part.
" + event_actions += "Fix using a part.
" if(ORION_TRAIL_COLLISION) event_info = "" event_desc = "Something has hit your ship and breached the hull! You can choose to fix it with a part or risk something going awry." - event_actions = "Continue as normal
" + event_actions = "Continue as normal
" if(supplies["2"] != 0) - event_actions += "Fix using a part.
" + event_actions += "Fix using a part.
" if(ORION_TRAIL_BREAKDOWN) event_info = "" event_desc = "The ship's engines broke down! You can choose to fix it with a part or risk something going awry." - event_actions = "Continue as normal
" + event_actions = "Continue as normal
" if(supplies["1"] != 0) - event_actions += "Fix using a part.
" + event_actions += "Fix using a part.
" if(ORION_TRAIL_STUCK) event_desc = "You've ran out of fuel. Your only hope to survive is to get refueled by a passing ship, if there are any." if(supplies["5"] == 0) - event_actions = "Wait" + event_actions = "Wait" if(ORION_TRAIL_CARP) event_desc = "You've chanced upon a large carp migration! Known both for their delicious meat as well as their bite, you and your crew arm yourselves for a small hunting trip." if(ORION_TRAIL_MUTINY) @@ -159,18 +159,18 @@ dat += "
You have [supplies["6"]] cash.
" for(var/i=1; i<6; i++) var/amm = (i>3?10:1) - dat += "[supplies["[i]"]] [supply_name["[i]"]][event==ORION_TRAIL_SPACEPORT ? ", buy [amm] for [supply_cost["[i]"]]T" : ""]
" + dat += "[supplies["[i]"]] [supply_name["[i]"]][event==ORION_TRAIL_SPACEPORT ? ", buy [amm] for [supply_cost["[i]"]]T" : ""]
" if(supplies["[i]"] >= amm && event == ORION_TRAIL_SPACEPORT) - dat += "sell [amm] for [supply_cost["[i]"]]T
" + dat += "sell [amm] for [supply_cost["[i]"]]T
" if(ORION_VIEW_CREW) dat = "

Crew

View the status of your crew.
" for(var/i=1;i<=settlers.len;i++) - dat += "[settlers[i]] Kill
" + dat += "[settlers[i]] Kill
" dat += "

View:
" - dat += "[view==ORION_VIEW_MAIN ? "" : ""]Main[view==ORION_VIEW_MAIN ? "" : ""]
" - dat += "[view==ORION_VIEW_SUPPLIES ? "" : ""]Supplies[view==ORION_VIEW_SUPPLIES ? "" : ""]
" - dat += "[view==ORION_VIEW_CREW ? "" : ""]Crew[view==ORION_VIEW_CREW ? "" : ""]

" + dat += "[view==ORION_VIEW_MAIN ? "" : ""]Main[view==ORION_VIEW_MAIN ? "" : ""]
" + dat += "[view==ORION_VIEW_SUPPLIES ? "" : ""]Supplies[view==ORION_VIEW_SUPPLIES ? "" : ""]
" + dat += "[view==ORION_VIEW_CREW ? "" : ""]Crew[view==ORION_VIEW_CREW ? "" : ""]

" show_browser(user, dat, "window=arcade") /obj/machinery/computer/arcade/orion_trail/OnTopic(user, href_list) @@ -411,7 +411,7 @@ to_chat(usr, "The sounds of battle fill your ears...") if(ORION_TRAIL_ILLNESS) if(ishuman(usr)) - var/mob/living/carbon/human/M = usr + var/mob/living/human/M = usr to_chat(M, "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit.") M.vomit() else diff --git a/code/game/machinery/computer/area_atmos.dm b/code/game/machinery/computer/area_atmos.dm index b210f749124..f287fbbc0b3 100644 --- a/code/game/machinery/computer/area_atmos.dm +++ b/code/game/machinery/computer/area_atmos.dm @@ -63,7 +63,7 @@

Area Air Control

[status]
- Scan + Scan "} for(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber in connectedscrubbers) dat += {" @@ -74,8 +74,8 @@ Flow Rate: [round(scrubber.last_flow_rate,0.1)] L/s
"} diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index cde979fbef0..69f4e4de4ab 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -94,10 +94,10 @@ dat += "

" if(auth) - dat += "

\[Authenticated\] /" - dat += " Server Power: [linked_server?.active ? "\[On\]":"\[Off\]"]

" + dat += "

\[Authenticated\] /" + dat += " Server Power: [linked_server?.active ? "\[On\]":"\[Off\]"]

" else - dat += "

\[Unauthenticated\] /" + dat += "

\[Unauthenticated\] /" dat += " Server Power: [linked_server?.active ? "\[On\]":"\[Off\]"]

" if(hacking || emag) @@ -112,19 +112,19 @@ if(0) // = TAB var/i = 0 - dat += "
[++i]. Link To A Server
" + dat += "
[++i]. Link To A Server
" if(auth) if(!linked_server || (linked_server.stat & (NOPOWER|BROKEN))) dat += "
ERROR: Server not found!
" else - dat += "
[++i]. View Request Console Logs
" - dat += "
[++i]. Clear Request Console Logs
" - dat += "
[++i]. Set Custom Key
" + dat += "
[++i]. View Request Console Logs
" + dat += "
[++i]. Clear Request Console Logs
" + dat += "
[++i]. Set Custom Key
" else dat += "

Please authenticate with the server in order to show additional options." if((isAI(user) || isrobot(user)) && (user.mind.assigned_special_role && user.mind.original == user)) //Malf/Traitor AIs can bruteforce into the system to gain the Key. - dat += "
*&@#. Bruteforce Key
" + dat += "
*&@#. Bruteforce Key
" //Hacking screen. if(2) @@ -182,7 +182,7 @@ var/id_auth = "Unauthenticated" - 15% var/priority = "Normal" - 10% */ - dat += "
Back - Refresh

" + dat += "
Back - Refresh

" dat += {"

- Turn On - Turn Off
+ Turn On + Turn Off
Load: [round(scrubber.last_power_draw)] W
"} for(var/datum/data_rc_msg/rc in linked_server.rc_msgs) @@ -191,7 +191,7 @@ break // Del - Sender - Recepient - Message // X - Al Green - Your Mom - WHAT UP!? - dat += {" + dat += {""} dat += "
XSending Dep.Receiving Dep. MessageStampID Auth.Priority.
X
[rc.send_dpt]
X
[rc.send_dpt] [rc.rec_dpt][rc.message][rc.stamp][rc.id_auth][rc.priority]
" diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 7d4c202b05c..84a1b64504f 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -17,7 +17,7 @@ var/dat dat += "Prisoner Implant Manager System
" if(screen == 0) - dat += "
Unlock Console" + dat += "
Unlock Console" else if(screen == 1) dat += "
Chemical Implants
" var/turf/Tr = null @@ -26,9 +26,9 @@ if((Tr) && !LEVELS_ARE_Z_CONNECTED(Tr.z, src.z)) continue // Out of range if(!C.implanted) continue dat += "[C.imp_in.name] | Remaining Units: [C.reagents.total_volume] | Inject: " - dat += "((1))" - dat += "((5))" - dat += "((10))
" + dat += "((1))" + dat += "((5))" + dat += "((10))
" dat += "********************************
" dat += "
Tracking Implants
" for(var/obj/item/implant/tracking/T in global.tracking_implants) @@ -36,16 +36,16 @@ if((Tr) && !LEVELS_ARE_Z_CONNECTED(Tr.z, src.z)) continue // Out of range if(!T.implanted) continue var/loc_display = "Space" - var/mob/living/carbon/M = T.imp_in + var/mob/living/M = T.imp_in if(!isspaceturf(M.loc)) var/turf/mob_loc = get_turf(M) loc_display = mob_loc.loc if(T.malfunction) loc_display = pick(teleportlocs) dat += "ID: [T.id] | Location: [loc_display]
" - dat += "(Message Holder) |
" + dat += "(Message Holder) |
" dat += "********************************
" - dat += "
Lock Console" + dat += "
Lock Console" show_browser(user, dat, "window=computer;size=400x500") onclose(user, "computer") @@ -78,5 +78,5 @@ if(!warning) return var/obj/item/implant/I = locate(href_list["warn"]) if((I)&&(I.imp_in)) - var/mob/living/carbon/R = I.imp_in + var/mob/living/R = I.imp_in to_chat(R, "You hear a voice in your head saying: '[warning]'") diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm index 5ca01aa22df..f43c392a16c 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/game/machinery/computer/shuttle.dm @@ -9,44 +9,46 @@ var/list/authorized = list( ) -/obj/machinery/computer/shuttle/attackby(var/obj/item/card/W as obj, var/mob/user as mob) +/obj/machinery/computer/shuttle/attackby(var/obj/item/card as obj, var/mob/user as mob) if(stat & (BROKEN|NOPOWER)) return var/datum/evacuation_controller/shuttle/evac_control = SSevac.evacuation_controller if(!istype(evac_control)) - to_chat(user, "This console should not in use on this map. Please report this to a developer.") + to_chat(user, "This console should not be in use on this map. Please report this to a developer.") return - if ((!( istype(W, /obj/item/card) ) || evac_control.has_evacuated() || !( user ))) + if(!istype(card, /obj/item/card)) // don't try to get an ID card if we're an emag + card = card.GetIdCard() // handles stored IDs in modcomps and similar + + if ((!istype(card, /obj/item/card) || evac_control.has_evacuated() || !user)) return - if (istype(W, /obj/item/card/id)||istype(W, /obj/item/modular_computer)) - if (istype(W, /obj/item/modular_computer)) - W = W.GetIdCard() - if (!W:access) //no access - to_chat(user, "The access level of [W:registered_name]\'s card is not high enough.") + if (istype(card, /obj/item/card/id)) + var/obj/item/card/id/id_card = card + if (!id_card.access) //no access + to_chat(user, "The access level of [id_card.registered_name]\'s card is not high enough.") return - var/list/cardaccess = W:access + var/list/cardaccess = id_card.access if(!istype(cardaccess, /list) || !cardaccess.len) //no access - to_chat(user, "The access level of [W:registered_name]\'s card is not high enough.") + to_chat(user, "The access level of [id_card.registered_name]\'s card is not high enough.") return - if(!(access_bridge in W:access)) //doesn't have this access - to_chat(user, "The access level of [W:registered_name]\'s card is not high enough.") + if(!(access_bridge in id_card.access)) //doesn't have this access + to_chat(user, "The access level of [id_card.registered_name]\'s card is not high enough.") return 0 - var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort") - if(evac_control.is_prepared() && user.get_active_held_item() != W) + var/choice = alert(user, "Would you like to (un)authorize a shortened launch time? [auth_need - authorized.len] authorization\s are still needed. Use abort to cancel all authorizations.", "Shuttle Launch", "Authorize", "Repeal", "Abort") + if(evac_control.is_prepared() && user.get_active_held_item() != card) return 0 switch(choice) if("Authorize") - src.authorized -= W:registered_name - src.authorized += W:registered_name + src.authorized -= id_card.registered_name + src.authorized += id_card.registered_name if (src.auth_need - src.authorized.len > 0) message_admins("[key_name_admin(user)] has authorized early shuttle launch") log_game("[user.ckey] has authorized early shuttle launch") - to_world(text("Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len)) + to_world("Alert: [auth_need - authorized.len] authorizations needed until shuttle is launched early") else message_admins("[key_name_admin(user)] has launched the shuttle") log_game("[user.ckey] has launched the shuttle early") @@ -57,18 +59,18 @@ src.authorized = list( ) if("Repeal") - src.authorized -= W:registered_name - to_world(text("Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len)) + src.authorized -= id_card.registered_name + to_world("Alert: [auth_need - authorized.len] authorizations needed until shuttle is launched early") if("Abort") to_world("All authorizations to shortening time for shuttle launch have been revoked!") src.authorized.len = 0 src.authorized = list( ) - else if (istype(W, /obj/item/card/emag) && !emagged) + else if (istype(card, /obj/item/card/emag) && !emagged) var/choice = alert(user, "Would you like to launch the shuttle?","Shuttle control", "Launch", "Cancel") - if(!emagged && !evac_control.is_prepared() && user.get_active_held_item() == W) + if(!emagged && !evac_control.is_prepared() && user.get_active_held_item() == card) switch(choice) if("Launch") to_world("Alert: Shuttle launch time shortened to 10 seconds!") diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 10e57e69254..f76288b60c9 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -52,11 +52,11 @@ dat += "

[storage_name]
" dat += "Welcome, [user.real_name].


" - dat += "View storage log.
" + dat += "View storage log.
" if(allow_items) - dat += "View objects.
" - dat += "Recover object.
" - dat += "Recover all objects.
" + dat += "View objects.
" + dat += "Recover object.
" + dat += "Recover all objects.
" show_browser(user, dat, "window=cryopod_console") onclose(user, "cryopod_console") @@ -151,7 +151,7 @@ var/on_store_message = "has entered long-term storage." var/on_store_name = "Cryogenic Oversight" var/on_enter_occupant_message = "You feel cool air surround you. You go numb as your senses turn inward." - var/allow_occupant_types = list(/mob/living/carbon/human) + var/allow_occupant_types = list(/mob/living/human) var/disallow_occupant_types = list() var/mob/living/occupant // Person waiting to be despawned. @@ -329,37 +329,37 @@ // Also make sure there is a valid control computer /obj/machinery/cryopod/proc/despawn_occupant() //Drop all items into the pod. - for(var/obj/item/W in occupant.get_equipped_items(include_carried = TRUE)) - occupant.drop_from_inventory(W) - W.forceMove(src) + for(var/obj/item/equipped_item in occupant.get_equipped_items(include_carried = TRUE)) + occupant.drop_from_inventory(equipped_item) + equipped_item.forceMove(src) //Make sure we catch anything not handled by qdel() on the items. - for(var/obj/item/O in W.get_contained_external_atoms()) - O.forceMove(src) + for(var/obj/item/contained_item in equipped_item.get_contained_external_atoms()) + contained_item.forceMove(src) //Delete all items not on the preservation list. var/list/items = src.contents.Copy() items -= occupant // Don't delete the occupant items -= component_parts - for(var/obj/item/W in items) + for(var/obj/item/frozen_item in items) - if(!W.preserve_in_cryopod()) - qdel(W) + if(!frozen_item.preserve_in_cryopod()) + qdel(frozen_item) continue if(control_computer && control_computer.allow_items) - control_computer.frozen_items += W - W.forceMove(null) + control_computer.frozen_items += frozen_item + frozen_item.forceMove(null) else - W.forceMove(get_turf(src)) + frozen_item.forceMove(get_turf(src)) //Update any existing objectives involving this mob. - for(var/datum/objective/O in global.all_objectives) + for(var/datum/objective/objective in global.all_objectives) // We don't want revs to get objectives that aren't for heads of staff. Letting // them win or lose based on cryo is silly so we remove the objective. - if(O.target == occupant.mind) - if(O.owner && O.owner.current) - to_chat(O.owner.current, SPAN_DANGER("You get the feeling your target, [occupant.real_name], is no longer within your reach...")) - qdel(O) + if(objective.target == occupant.mind) + if(objective.owner?.current) + to_chat(objective.owner.current, SPAN_DANGER("You get the feeling your target, [occupant.real_name], is no longer within your reach...")) + qdel(objective) //Handle job slot/tater cleanup. if(occupant.mind) @@ -373,9 +373,9 @@ // Delete them from datacore. var/sanitized_name = occupant.real_name sanitized_name = sanitize(sanitized_name) - var/datum/computer_file/report/crew_record/R = get_crewmember_record(sanitized_name) - if(R) - qdel(R) + var/datum/computer_file/report/crew_record/record = get_crewmember_record(sanitized_name) + if(record) + qdel(record) icon_state = base_icon_state @@ -523,7 +523,7 @@ return -/obj/machinery/cryopod/proc/set_occupant(var/mob/living/carbon/occupant, var/silent) +/obj/machinery/cryopod/proc/set_occupant(var/mob/living/occupant, var/silent) src.occupant = occupant if(!occupant) SetName(initial(name)) diff --git a/code/game/machinery/doors/_door.dm b/code/game/machinery/doors/_door.dm index d7f44f0935b..3af28af67b7 100644 --- a/code/game/machinery/doors/_door.dm +++ b/code/game/machinery/doors/_door.dm @@ -234,12 +234,13 @@ /obj/machinery/door/hitby(var/atom/movable/AM, var/datum/thrownthing/TT) . = ..() if(.) - visible_message("[src.name] was hit by [AM].") + visible_message(SPAN_DANGER("\The [src] was hit by \the [AM].")) var/tforce = 0 if(ismob(AM)) tforce = 3 * TT.speed - else - tforce = AM:throwforce * (TT.speed/THROWFORCE_SPEED_DIVISOR) + else if(isobj(AM)) + var/obj/hitter_obj = AM + tforce = hitter_obj.throwforce * (TT.speed/THROWFORCE_SPEED_DIVISOR) playsound(src.loc, hitsound, 100, 1) take_damage(tforce) @@ -342,7 +343,7 @@ return TRUE return FALSE -/obj/machinery/door/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent = FALSE) +/obj/machinery/door/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(!current_health) ..(damage, damage_type) update_icon() @@ -390,7 +391,7 @@ else if(current_health < current_max_health && get_dist(src, user) <= 1) to_chat(user, "\The [src] has some minor scuffing.") - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if (emagged && istype(H) && (H.skill_check(SKILL_COMPUTER, SKILL_ADEPT) || H.skill_check(SKILL_ELECTRICAL, SKILL_ADEPT))) to_chat(user, SPAN_WARNING("\The [src]'s control panel looks fried.")) @@ -498,7 +499,6 @@ for(var/turf/turf in locs) if(turf.simulated) update_heat_protection(turf) - SSair.mark_for_update(turf) return 1 /obj/machinery/door/proc/update_heat_protection(var/turf/source) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 1d39a839320..7bb1bb09480 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -129,13 +129,11 @@ About the new airlock wires panel: return else /*if(src.justzap)*/ return - else if(prob(10) && src.operating == 0) - var/mob/living/carbon/C = user - if(istype(C) && C.hallucination_power > 25) - to_chat(user, SPAN_DANGER("You feel a powerful shock course through your body!")) - user.take_damage(10, PAIN) - SET_STATUS_MAX(user, STAT_STUN, 10) - return + else if(prob(10) && src.operating == 0 && user.hallucination_power > 25) + to_chat(user, SPAN_DANGER("You feel a powerful shock course through your body!")) + user.take_damage(10, PAIN) + SET_STATUS_MAX(user, STAT_STUN, 10) + return ..(user) /obj/machinery/door/airlock/bumpopen(mob/living/simple_animal/user) @@ -1073,7 +1071,7 @@ About the new airlock wires panel: return // Braces can act as an extra layer of armor - they will take damage first. -/obj/machinery/door/airlock/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent = FALSE) +/obj/machinery/door/airlock/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(brace) brace.take_damage(damage) else diff --git a/code/game/machinery/doors/airlock_interactions.dm b/code/game/machinery/doors/airlock_interactions.dm index 4a28ca7be39..2ad96280a52 100644 --- a/code/game/machinery/doors/airlock_interactions.dm +++ b/code/game/machinery/doors/airlock_interactions.dm @@ -79,7 +79,7 @@ if(src.Move(T)) return -/mob/living/carbon/airlock_crush(var/crush_damage) +/mob/living/human/airlock_crush(var/crush_damage) . = ..() if (can_feel_pain()) emote(/decl/emote/audible/scream) diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 1bd45784750..e7ce3e4b90c 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -147,7 +147,8 @@ /obj/machinery/door/blast/attackby(obj/item/C, mob/user) add_fingerprint(user, 0, C) if(!panel_open) //Do this here so the door won't change state while prying out the circuit - if(IS_CROWBAR(C) || (istype(C, /obj/item/twohanded/fireaxe) && C:wielded == 1)) + var/obj/item/twohanded/zweihander = C + if(IS_CROWBAR(C) || (istype(C, /obj/item/twohanded/fireaxe) && zweihander.wielded)) if(((stat & NOPOWER) || (stat & BROKEN)) && !( operating )) to_chat(user, "You begin prying at \the [src]...") if(do_after(user, 2 SECONDS, src)) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 377c4fe6d58..afaddfe4bd7 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -62,9 +62,9 @@ /obj/machinery/door/firedoor/get_blend_objects() var/static/list/blend_objects = list( - /obj/machinery/door/firedoor, - /obj/structure/wall_frame, - /turf/unsimulated/wall, + /obj/machinery/door/firedoor, + /obj/structure/wall_frame, + /turf/unsimulated/wall, /obj/structure/window ) // Objects which to blend with return blend_objects @@ -472,6 +472,8 @@ update_heat_protection(loc) - if(istype(source) && source.simulated) SSair.mark_for_update(source) - if(istype(destination) && destination.simulated) SSair.mark_for_update(destination) + if(istype(source) && source.simulated) + SSair.mark_for_update(source) + if(istype(destination) && destination.simulated) + SSair.mark_for_update(destination) return TRUE diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index ce34e17cfa2..66171dc8f41 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -132,7 +132,7 @@ return TRUE -/obj/machinery/door/window/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent = FALSE) +/obj/machinery/door/window/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) current_health = max(0, current_health - damage) if (current_health <= 0) shatter() @@ -140,7 +140,7 @@ /obj/machinery/door/window/physical_attack_hand(mob/user) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species.can_shred(H)) playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) visible_message("\The [user] smashes against \the [src].", 1) @@ -198,7 +198,7 @@ flick("[base_state]deny", src) /obj/machinery/door/window/bash(obj/item/I, mob/user) - //Emags and ninja swords? You may pass. + //Emags and energy swords? You may pass. if (istype(I, /obj/item/energy_blade)) var/obj/item/energy_blade/blade = I if(blade.is_special_cutting_tool() && emag_act(10, user)) diff --git a/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm b/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm index 019b728bb15..f187d98f09c 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm @@ -113,12 +113,12 @@ if(!istype(terminal)) return . = list() - . += "ID tag: [terminal.id_tag]
" + . += "ID tag: [terminal.id_tag]
" . += "Nearby controllers:
" var/list/controllers for(var/obj/machinery/embedded_controller/radio/C in range(12, terminal)) - LAZYADD(controllers, " [C][C.id_tag] ") + LAZYADD(controllers, " [C][C.id_tag] ") if(!LAZYLEN(controllers)) . += "None." diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 3b4e2b99835..bfdbc356c44 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -153,8 +153,8 @@ if(!istype(holder)) return . = list() - . += "ID tag: [controller.id_tag]
" - . += "Frequency: [controller.frequency]
" + . += "ID tag: [controller.id_tag]
" + . += "Frequency: [controller.frequency]
" . += "Likely tags used by controller:
" var/list/tags = controller.program?.get_receive_filters(TRUE) if(!length(tags)) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 3f3908e8f66..259a5461286 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -74,13 +74,13 @@ if(O.eyecheck() > FLASH_PROTECTION_NONE) continue if(ishuman(O)) - var/mob/living/carbon/human/H = O - flash_time = round(H.getFlashMod() * flash_time) + var/mob/living/human/H = O + flash_time = round(H.get_flash_mod() * flash_time) if(flash_time <= 0) return - var/vision_organ = H.get_bodytype()?.vision_organ - if(vision_organ) - var/obj/item/organ/internal/E = GET_INTERNAL_ORGAN(H, vision_organ) + var/vision_organ_tag = H.get_vision_organ_tag() + if(vision_organ_tag) + var/obj/item/organ/internal/E = GET_INTERNAL_ORGAN(H, vision_organ_tag) if(E && E.is_bruised() && prob(E.damage + 50)) H.flash_eyes() E.damage += rand(1, 5) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 4e57c861498..07afed57749 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -77,7 +77,7 @@ var/global/list/holopads = list() // Update our desc. desc = "It's a floor-mounted device for projecting holographic images. Its ID is '[holopad_id]'" -/obj/machinery/hologram/holopad/interface_interact(var/mob/living/carbon/human/user) //Carn: Hologram requests. +/obj/machinery/hologram/holopad/interface_interact(var/mob/living/human/user) //Carn: Hologram requests. if(!CanInteract(user, DefaultTopicState())) return FALSE if(incoming_connection && caller_id) @@ -110,7 +110,7 @@ var/global/list/holopads = list() if(!AI.client) continue if (holopadType != HOLOPAD_LONG_RANGE && !SSmapping.are_connected_levels(AI.z, src.z)) continue - to_chat(AI, "Your presence is requested at \the [holopad_id].") + to_chat(AI, "Your presence is requested at \the [holopad_id].") else to_chat(user, "A request for AI presence was already sent recently.") if("Holocomms") @@ -154,7 +154,7 @@ var/global/list/holopads = list() to_chat(user, "A request for holographic communication was already sent recently.") -/obj/machinery/hologram/holopad/proc/make_call(var/obj/machinery/hologram/holopad/targetpad, var/mob/living/carbon/user) +/obj/machinery/hologram/holopad/proc/make_call(var/obj/machinery/hologram/holopad/targetpad, var/mob/living/user) targetpad.last_request = world.time targetpad.sourcepad = src //This marks the holopad you are making the call from targetpad.caller_id = user //This marks you as the caller @@ -165,7 +165,7 @@ var/global/list/holopads = list() to_chat(user, "Trying to establish a connection to the holopad in [targetpad.holopad_id]... Please await confirmation from recipient.") -/obj/machinery/hologram/holopad/proc/take_call(mob/living/carbon/user) +/obj/machinery/hologram/holopad/proc/take_call(mob/living/user) incoming_connection = 0 caller_id.machine = sourcepad caller_id.reset_view(src) @@ -213,7 +213,7 @@ var/global/list/holopads = list() to_chat(user, "ERROR: Unable to project hologram.") return -/obj/machinery/hologram/holopad/proc/activate_holocall(mob/living/carbon/caller_id) +/obj/machinery/hologram/holopad/proc/activate_holocall(mob/living/caller_id) if(caller_id) src.visible_message("A holographic image of [caller_id] flicks to life right before your eyes!") create_holo(0,caller_id)//Create one. @@ -268,15 +268,15 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ master.show_message(rendered, type) if(findtext(msg, "Holopad received,")) return - for(var/mob/living/carbon/master in masters) + for(var/mob/living/master in masters) var/rendered = "The holographic image of [msg]" master.show_message(rendered, type) if(targetpad) - for(var/mob/living/carbon/master in view(targetpad)) + for(var/mob/living/master in view(targetpad)) var/rendered = "The holographic image of [msg]" master.show_message(rendered, type) -/obj/machinery/hologram/holopad/proc/create_holo(mob/living/silicon/ai/A, mob/living/carbon/caller_id, turf/T = loc) +/obj/machinery/hologram/holopad/proc/create_holo(mob/living/silicon/ai/A, mob/living/caller_id, turf/T = loc) var/obj/effect/overlay/hologram = new(T)//Spawn a blank effect at the location. if(caller_id) hologram.overlays += getHologramIcon(getFlatIcon(caller_id), hologram_color = holopadType) // Add the callers image as an overlay to keep coloration! @@ -305,7 +305,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ icon_state = "[base_icon]1" return 1 -/obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user, mob/living/carbon/caller_id) +/obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user, mob/living/caller_id) if(user) qdel(masters[user])//Get rid of user's hologram user.holo = null diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 51e67f598eb..99da01b0b81 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -121,9 +121,9 @@ /obj/machinery/media/jukebox/proc/emag_play() playsound(loc, 'sound/items/AirHorn.ogg', 100, 1) - for(var/mob/living/carbon/M in ohearers(6, src)) + for(var/mob/living/M in ohearers(6, src)) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.get_sound_volume_multiplier() < 0.2) continue M.set_status(STAT_ASLEEP, 0) @@ -154,9 +154,9 @@ qdel(src) /obj/machinery/media/jukebox/attackby(obj/item/W, mob/user) - if(IS_WRENCH(W) && !panel_open) + if((IS_WRENCH(W) || IS_HAMMER(W)) && !panel_open) add_fingerprint(user) - wrench_floor_bolts(user, 0) + wrench_floor_bolts(user, 0, W) power_change() return return ..() diff --git a/code/game/machinery/kitchen/cooking_machines/fryer.dm b/code/game/machinery/kitchen/cooking_machines/fryer.dm index ead11db0a55..0be1e523f11 100644 --- a/code/game/machinery/kitchen/cooking_machines/fryer.dm +++ b/code/game/machinery/kitchen/cooking_machines/fryer.dm @@ -31,7 +31,7 @@ var/target_zone = user.get_target_zone() if(ishuman(victim) && !(target_zone in list(BP_GROIN, BP_CHEST))) - var/mob/living/carbon/human/H = victim + var/mob/living/human/H = victim var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, target_zone) if(!E) to_chat(user, "They are missing that body part!") diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 86b0c4e674d..325eb6ac96d 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -177,11 +177,9 @@ var/slab_nutrition = 20 if(isliving(occupant)) - var/mob/living/C = occupant - slab_nutrition = round(C.get_nutrition() / 15) - - if(ishuman(occupant)) - slab_name = occupant.real_name + slab_nutrition = round(occupant.get_nutrition() / 15) + if(ishuman(occupant)) + slab_name = occupant.real_name // Small mobs don't give as much nutrition. if(issmall(src.occupant)) diff --git a/code/game/machinery/kitchen/icecream.dm b/code/game/machinery/kitchen/icecream.dm index aa6838f142a..6f534e3bf51 100644 --- a/code/game/machinery/kitchen/icecream.dm +++ b/code/game/machinery/kitchen/icecream.dm @@ -89,22 +89,22 @@ var/dat dat += "ICECREAM
" dat += "Dispensing: [flavour_name] icecream

" - dat += "Vanilla icecream: Select Make x5 [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice)
" - dat += "Strawberry icecream: Select Make x5 [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice)
" - dat += "Chocolate icecream: Select Make x5 [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder)
" - dat += "Blue icecream: Select Make x5 [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, blue curacao)
" - dat += "Cherry icecream: Select Make x5 [product_types[ICECREAM_CHERRY]] dollops left. (Ingredients: milk, ice, cherry jelly)
" - dat += "Banana icecream: Select Make x5 [product_types[ICECREAM_BANANA]] dollops left. (Ingredients: milk, ice, banana)
" + dat += "Vanilla icecream: Select Make x5 [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice)
" + dat += "Strawberry icecream: Select Make x5 [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice)
" + dat += "Chocolate icecream: Select Make x5 [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder)
" + dat += "Blue icecream: Select Make x5 [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, blue curacao)
" + dat += "Cherry icecream: Select Make x5 [product_types[ICECREAM_CHERRY]] dollops left. (Ingredients: milk, ice, cherry jelly)
" + dat += "Banana icecream: Select Make x5 [product_types[ICECREAM_BANANA]] dollops left. (Ingredients: milk, ice, banana)
" dat += "
CONES
" - dat += "Waffle cones: Dispense Make x5 [product_types[CONE_WAFFLE]] cones left. (Ingredients: flour, sugar)
" - dat += "Chocolate cones: Dispense Make x5 [product_types[CONE_CHOC]] cones left. (Ingredients: flour, sugar, coco powder)
" + dat += "Waffle cones: Dispense Make x5 [product_types[CONE_WAFFLE]] cones left. (Ingredients: flour, sugar)
" + dat += "Chocolate cones: Dispense Make x5 [product_types[CONE_CHOC]] cones left. (Ingredients: flour, sugar, coco powder)
" dat += "
" dat += "VAT CONTENT
" for(var/reagent_type in reagents?.reagent_volumes) var/decl/material/R = GET_DECL(reagent_type) dat += "[R.get_reagent_name(reagents)]: [REAGENT_VOLUME(reagents, reagent_type)]" - dat += "Purge
" - dat += "Refresh Close" + dat += "Purge
" + dat += "Refresh Close" var/datum/browser/popup = new(user, "icecreamvat","Icecream Vat", 700, 500, src) popup.set_content(dat) diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 513838af3fc..de7e5b72a2a 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -342,8 +342,7 @@ SSnano.update_uis(src) /obj/machinery/microwave/on_reagent_change() - ..() - if(!operating) + if((. = ..()) && !operating) SSnano.update_uis(src) /obj/machinery/microwave/proc/dispose(var/mob/user, var/message = TRUE) diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 0835c1e7b23..87285e91403 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -240,9 +240,9 @@ var/global/list/magnetic_modules = list() var/dat = "[title]

" if(!autolink) dat += {" - Frequency: [frequency]
- Code: [code]
- Probe Generators
+ Frequency: [frequency]
+ Code: [code]
+ Probe Generators
"} if(magnets.len >= 1) @@ -251,11 +251,11 @@ var/global/list/magnetic_modules = list() var/i = 0 for(var/obj/machinery/magnetic_module/M in magnets) i++ - dat += "     < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
" + dat += "     < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
" - dat += "
Speed: - [speed] +
" - dat += "Path: {[path]}
" - dat += "Moving: [moving ? "Enabled":"Disabled"]" + dat += "
Speed: - [speed] +
" + dat += "Path: {[path]}
" + dat += "Moving: [moving ? "Enabled":"Disabled"]" show_browser(user, dat, "window=magnet;size=400x500") diff --git a/code/game/machinery/message_server.dm b/code/game/machinery/message_server.dm index f9b935ff75e..ba19c1bb7b9 100644 --- a/code/game/machinery/message_server.dm +++ b/code/game/machinery/message_server.dm @@ -117,12 +117,12 @@ var/global/list/message_servers = list() if(priority > 1) playsound(Console.loc, 'sound/machines/chime.ogg', 80, 1) Console.audible_message("[html_icon(Console)]\The [Console] announces: 'High priority message received from [sender]!'", hearing_distance = 8) - Console.message_log += "High Priority message from [sender]
[authmsg]" + Console.message_log += "High Priority message from [sender]
[authmsg]" else if(!Console.silent) playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) Console.audible_message("[html_icon(Console)]\The [Console] announces: 'Message received from [sender].'", hearing_distance = 5) - Console.message_log += "Message from [sender]
[authmsg]" + Console.message_log += "Message from [sender]
[authmsg]" Console.set_light(2, 0.5) @@ -154,7 +154,7 @@ var/global/list/message_servers = list() /obj/machinery/network/message_server/proc/send_to_department(var/department, var/message, var/tone) var/reached = 0 - for(var/mob/living/carbon/human/H in global.human_mob_list) + for(var/mob/living/human/H in global.human_mob_list) var/obj/item/modular_computer/pda/pda = locate() in H if(!pda) continue diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index eb477839e17..e23f3e5d4fc 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -211,22 +211,22 @@ var/global/list/allCasters = list() //Global list that will contain reference to if(0) dat += "Welcome to Newscasting Unit #[src.unit_no].
Interface & News networks Operational." if(news_network.wanted_issue) - dat+= "
Read Wanted Issue" - dat+= "

Create Feed Channel" - dat+= "
View Feed Channels" - dat+= "
Submit new Feed story" - dat+= "
Print newspaper" - dat+= "
Re-scan User" - dat+= "

Exit" + dat+= "
Read Wanted Issue" + dat+= "

Create Feed Channel" + dat+= "
View Feed Channels" + dat+= "
Submit new Feed story" + dat+= "
Print newspaper" + dat+= "
Re-scan User" + dat+= "

Exit" if(src.securityCaster) var/wanted_already = 0 if(news_network.wanted_issue) wanted_already = 1 dat+="
Feed Security functions:
" - dat+="
[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue" - dat+="
Censor Feed Stories" - dat+="
Mark Feed Channel with [global.using_map.company_name] D-Notice" + dat+="
[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue" + dat+="
Censor Feed Stories" + dat+="
Mark Feed Channel with [global.using_map.company_name] D-Notice" dat+="

The newscaster recognises you as: [src.scanned_user]" if(1) dat+= "Local Feed Channels
" @@ -235,36 +235,36 @@ var/global/list/allCasters = list() //Global list that will contain reference to else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) if(CHANNEL.is_admin_channel) - dat+="[CHANNEL.channel_name]
" + dat+="[CHANNEL.channel_name]
" else - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null ]
" - dat+="

Refresh" - dat+="
Back" + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null ]
" + dat+="

Refresh" + dat+="
Back" if(2) dat+="Creating new Feed Channel..." - dat+="
Channel Name: [src.channel_name]
" + dat+="
Channel Name: [src.channel_name]
" dat+="Channel Author: [src.scanned_user]
" - dat+="Will Accept Public Feeds: [(src.c_locked) ? ("NO") : ("YES")]

" - dat+="
Submit

Cancel
" + dat+="Will Accept Public Feeds: [(src.c_locked) ? ("NO") : ("YES")]

" + dat+="
Submit

Cancel
" if(3) dat+="Creating new Feed Message..." - dat+="
Receiving Channel: [src.channel_name]
" //MARK + dat+="
Receiving Channel: [src.channel_name]
" //MARK dat+="Message Author: [src.scanned_user]
" - dat+="Message Body: [src.msg]
" + dat+="Message Body: [src.msg]
" dat+="Photo: " if(photo_data && photo_data.photo) send_rsc(usr, photo_data.photo.img, "tmp_photo.png") dat+="
" - dat+="
Delete Photo
" + dat+="
Delete Photo
" else - dat+="Attach Photo" - dat+="

Submit

Cancel
" + dat+="Attach Photo" + dat+="

Submit

Cancel
" if(4) dat+="Feed story successfully submitted to [src.channel_name].

" - dat+="
Return
" + dat+="
Return
" if(5) dat+="Feed Channel [src.channel_name] created successfully.

" - dat+="
Return
" + dat+="
Return
" if(6) dat+="ERROR: Could not submit Feed story to Network.

" if(src.channel_name=="") @@ -274,7 +274,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to if(src.msg == "" || src.msg == "\[REDACTED\]") dat+="Invalid message body.
" - dat+="
Return
" + dat+="
Return
" if(7) dat+="ERROR: Could not submit Feed Channel to Network.

" var/list/existing_authors = list() @@ -296,7 +296,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="Channel name already in use.
" if(src.scanned_user=="Unknown") dat+="Channel author unverified.
" - dat+="
Return
" + dat+="
Return
" if(8) var/total_num=length(news_network.network_channels) var/active_num=total_num @@ -308,8 +308,8 @@ var/global/list/allCasters = list() //Global list that will contain reference to active_num-- dat+="Network currently serves a total of [total_num] Feed channels, [active_num] of which are active, and a total of [message_num] Feed Stories." //TODO: CONTINUE dat+="

Liquid Paper remaining: [(src.paper_remaining) *100 ] cm^3" - dat+="

Print Paper" - dat+="
Cancel" + dat+="

Print Paper" + dat+="
Cancel" if(9) dat+="[src.viewing_channel.channel_name]: \[created by: [src.viewing_channel.author]\] \[views: [++src.viewing_channel.views]\]
" if(src.viewing_channel.censored) @@ -331,8 +331,8 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="[MESSAGE.caption]
" dat+="
" dat+="\[Story by [MESSAGE.author] - [MESSAGE.time_stamp]\]
" - dat+="

Refresh" - dat+="
Back" + dat+="

Refresh" + dat+="
Back" if(10) dat+="[global.using_map.company_name] Feed Censorship Tool
" dat+="NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.
" @@ -342,8 +342,8 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="No feed channels found active...
" else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null ]
" - dat+="
Cancel" + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null ]
" + dat+="
Cancel" if(11) dat+="[global.using_map.company_name] D-Notice Handler
" dat+="A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the [station_name()]'s" @@ -353,12 +353,12 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="No feed channels found active...
" else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null ]
" + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null ]
" - dat+="
Back" + dat+="
Back" if(12) dat+="[src.viewing_channel.channel_name]: \[ created by: [src.viewing_channel.author] \]
" - dat+="[(src.viewing_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]
" + dat+="[(src.viewing_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]
" if( !length(src.viewing_channel.messages) ) @@ -366,11 +366,11 @@ var/global/list/allCasters = list() //Global list that will contain reference to else for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages) dat+="-[MESSAGE.body]
\[[MESSAGE.message_type] by [MESSAGE.author]\]
" - dat+="[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
" - dat+="
Back" + dat+="[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
" + dat+="
Back" if(13) dat+="[src.viewing_channel.channel_name]: \[ created by: [src.viewing_channel.author] \]
" - dat+="Channel messages listed below. If you deem them dangerous to the [station_name()], you can Bestow a D-Notice upon the channel.
" + dat+="Channel messages listed below. If you deem them dangerous to the [station_name()], you can Bestow a D-Notice upon the channel.
" if(src.viewing_channel.censored) dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the [station_name()], and marked with a [global.using_map.company_name] D-Notice.
" dat+="No further feed story additions are allowed while the D-Notice is in effect.

" @@ -381,7 +381,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages) dat+="-[MESSAGE.body]
\[[MESSAGE.message_type] by [MESSAGE.author]\]
" - dat+="
Back" + dat+="
Back" if(14) dat+="Wanted Issue Handler:" var/wanted_already = 0 @@ -393,26 +393,26 @@ var/global/list/allCasters = list() //Global list that will contain reference to if(wanted_already) dat+="
A wanted issue is already in Feed Circulation. You can edit or cancel it below.
" dat+="
" - dat+="Criminal Name: [src.channel_name]
" - dat+="Description: [src.msg]
" + dat+="Criminal Name: [src.channel_name]
" + dat+="Description: [src.msg]
" dat+="Photo: " if(photo_data && photo_data.photo) send_rsc(usr, photo_data.photo.img, "tmp_photo.png") dat+="
" - dat+="
Delete Photo
" + dat+="
Delete Photo
" else - dat+="Attach Photo
" + dat+="Attach Photo
" if(wanted_already) dat+="Wanted Issue created by: [news_network.wanted_issue.backup_author]
" else dat+="Wanted Issue will be created under prosecutor: [src.scanned_user]
" - dat+="
[(wanted_already) ? ("Edit Issue") : ("Submit")]" + dat+="
[(wanted_already) ? ("Edit Issue") : ("Submit")]" if(wanted_already) - dat+="
Take down Issue" - dat+="
Cancel" + dat+="
Take down Issue" + dat+="
Cancel" if(15) dat+="Wanted issue for [src.channel_name] is now in Network Circulation.

" - dat+="
Return
" + dat+="
Return
" if(16) dat+="ERROR: Wanted Issue rejected by Network.

" if(src.channel_name=="" || src.channel_name == "\[REDACTED\]") @@ -421,10 +421,10 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="Issue author unverified.
" if(src.msg == "" || src.msg == "\[REDACTED\]") dat+="Invalid description.
" - dat+="
Return
" + dat+="
Return
" if(17) dat+="Wanted Issue successfully deleted from Circulation
" - dat+="
Return
" + dat+="
Return
" if(18) dat+="-- STATIONWIDE WANTED ISSUE --
\[Submitted by: [news_network.wanted_issue.backup_author]\]
" dat+="Criminal: [news_network.wanted_issue.author]
" @@ -435,16 +435,16 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="
" else dat+="None" - dat+="

Back
" + dat+="

Back
" if(19) dat+="Wanted issue for [src.channel_name] successfully edited.

" - dat+="
Return
" + dat+="
Return
" if(20) dat+="Printing successful. Please receive your newspaper from the bottom of the machine.

" - dat+="Return" + dat+="Return" if(21) dat+="Unable to print newspaper. Insufficient paper. Please notify maintenance personnel to refill machine storage.

" - dat+="Return" + dat+="Return" else dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" @@ -758,7 +758,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to /obj/item/newspaper/attack_self(mob/user) user.update_personal_goal(/datum/goal/achievement/newshound, TRUE) if(ishuman(user)) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user var/dat src.pages = 0 switch(screen) @@ -783,7 +783,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="" if(scribble_page==curr_page) dat+="
There is a small scribble near the end of this page... It reads: \"[src.scribble]\"" - dat+= "
" + dat+= "
" if(1) // X channel pages inbetween. for(var/datum/feed_channel/NP in src.news_content) src.pages++ //Let's get it right again. @@ -808,7 +808,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="" if(scribble_page==curr_page) dat+="
There is a small scribble near the end of this page... It reads: \"[src.scribble]\"" - dat+= "

" + dat+= "

" if(2) //Last page for(var/datum/feed_channel/NP in src.news_content) src.pages++ @@ -826,7 +826,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="Apart from some uninteresting Classified ads, there's nothing on this page..." if(scribble_page==curr_page) dat+="
There is a small scribble near the end of this page... It reads: \"[src.scribble]\"" - dat+= "
" + dat+= "
" dat+="

[src.curr_page+1]
" var/processed_dat = human_user.handle_reading_literacy(human_user, dat) @@ -896,7 +896,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to /obj/machinery/newscaster/proc/scan_user(mob/living/user) if(ishuman(user)) //User is a human - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user var/obj/item/card/id/id = human_user.GetIdCard() if(istype(id)) //Newscaster scans you src.scanned_user = GetNameAndAssignmentFromId(id) diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 2739b2fc5a3..b72f83b4267 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -10,7 +10,7 @@ anchored = TRUE var/obj/item/tank/tank - var/mob/living/carbon/breather + var/mob/living/breather var/obj/item/clothing/mask/breath/contained var/spawn_type = /obj/item/tank/emergency/oxygen/engi @@ -35,14 +35,14 @@ qdel(tank) if(breather) breather.drop_from_inventory(contained) - src.visible_message(SPAN_NOTICE("The mask rapidly retracts just before /the [src] is destroyed!")) + src.visible_message(SPAN_NOTICE("The mask rapidly retracts just before \the [src] is destroyed!")) + breather = null qdel(contained) contained = null - breather = null return ..() /obj/machinery/oxygen_pump/handle_mouse_drop(atom/over, mob/user, params) - if(ishuman(over) && can_apply_to_target(over, user)) + if(isliving(over) && can_apply_to_target(over, user)) user.visible_message(SPAN_NOTICE("\The [user] begins placing the mask onto \the [over]..")) if(do_mob(user, over, 25) && can_apply_to_target(over, user)) user.visible_message(SPAN_NOTICE("\The [user] has placed \the [src] over \the [over]'s face.")) @@ -67,17 +67,17 @@ ui_interact(user) return TRUE -/obj/machinery/oxygen_pump/proc/attach_mask(var/mob/living/carbon/C) - if(C && istype(C)) - contained.dropInto(C.loc) - C.equip_to_slot(contained, slot_wear_mask_str) +/obj/machinery/oxygen_pump/proc/attach_mask(var/mob/living/subject) + if(istype(subject)) + contained.dropInto(subject.loc) + subject.equip_to_slot(contained, slot_wear_mask_str) if(tank) - tank.forceMove(C) - breather = C + tank.forceMove(subject) + breather = subject -/obj/machinery/oxygen_pump/proc/set_internals(var/mob/living/carbon/C) - if(C && istype(C)) - if(!C.internal && tank) +/obj/machinery/oxygen_pump/proc/set_internals() + if(isliving(breather)) + if(!breather.get_internals() && tank) breather.set_internals(tank) update_use_power(POWER_USE_ACTIVE) @@ -94,7 +94,7 @@ breather = null update_use_power(POWER_USE_IDLE) -/obj/machinery/oxygen_pump/proc/can_apply_to_target(var/mob/living/carbon/human/target, mob/user) +/obj/machinery/oxygen_pump/proc/can_apply_to_target(var/mob/living/target, mob/user) if(!user) user = target // Check target validity @@ -104,7 +104,9 @@ if(!target.check_has_mouth()) to_chat(user, SPAN_WARNING("\The [target] doesn't have a mouth.")) return - + if(!target.get_inventory_slot_datum(slot_wear_mask_str)) + to_chat(user, SPAN_WARNING("\The [target] cannot wear a mask.")) + return var/obj/item/mask = target.get_equipped_item(slot_wear_mask_str) if(mask && target != breather) to_chat(user, SPAN_WARNING("\The [target] is already wearing a mask.")) @@ -161,14 +163,12 @@ else to_chat(user, SPAN_WARNING("It is missing a tank!")) - /obj/machinery/oxygen_pump/Process() - if(breather) + if(istype(breather)) if(!can_apply_to_target(breather)) detach_mask() - else if(!breather.internal && tank) - set_internals(breather) - + else if(!breather.get_internals() && tank) + set_internals() //Create rightclick to view tank settings /obj/machinery/oxygen_pump/verb/settings() diff --git a/code/game/machinery/pager.dm b/code/game/machinery/pager.dm index 87c740146b5..0777eb14361 100644 --- a/code/game/machinery/pager.dm +++ b/code/game/machinery/pager.dm @@ -35,7 +35,7 @@ if(world.time < last_paged + 5 SECONDS) return last_paged = world.time - var/paged = MS.send_to_department(department,"Department page to [location.proper_name] received. Take", "*page*") + var/paged = MS.send_to_department(department,"Department page to [location.proper_name] received. Take", "*page*") acknowledged = 0 if(paged) playsound(src, 'sound/machines/ping.ogg', 60) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 166d3dff957..ba7478c7439 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -315,7 +315,7 @@ var/global/list/turret_icons enabled = 1 //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here return 1 -/obj/machinery/porta_turret/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent = FALSE) +/obj/machinery/porta_turret/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(!raised && !raising) damage = damage / 8 if(damage < 5) @@ -463,7 +463,7 @@ var/global/list/turret_icons return TURRET_PRIORITY_TARGET //if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee -/obj/machinery/porta_turret/proc/assess_perp(var/mob/living/carbon/human/H) +/obj/machinery/porta_turret/proc/assess_perp(var/mob/living/human/H) if(!H || !istype(H)) return 0 diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index dfedef94c73..64a7cb96235 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -82,7 +82,7 @@ C.repair() if(ishuman(occupant)) - var/mob/living/carbon/human/H = occupant + var/mob/living/human/H = occupant var/obj/item/organ/internal/cell/potato = H.get_organ(BP_CELL, /obj/item/organ/internal/cell) if(potato) target = potato.cell @@ -194,7 +194,7 @@ var/mob/living/silicon/robot/R = M return (R.cell) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.isSynthetic()) return 1 var/obj/item/rig/rig = H.get_rig() diff --git a/code/game/machinery/singularitybeacon.dm b/code/game/machinery/singularitybeacon.dm new file mode 100644 index 00000000000..b47720adbfe --- /dev/null +++ b/code/game/machinery/singularitybeacon.dm @@ -0,0 +1,85 @@ +var/global/list/singularity_beacons = list() + +//////////////////////////////////////// +//Singularity beacon +//////////////////////////////////////// +/obj/machinery/singularity_beacon + name = "ominous beacon" + desc = "This looks suspicious..." + icon = 'icons/obj/singularity.dmi' + icon_state = "beaconsynd" + + uncreated_component_parts = list(/obj/item/stock_parts/power/terminal) + anchored = FALSE + density = TRUE + layer = BASE_ABOVE_OBJ_LAYER //so people can't hide it and it's REALLY OBVIOUS + stat = 0 + use_power = POWER_USE_OFF + +/obj/machinery/singularity_beacon/Initialize() + . = ..() + global.singularity_beacons += src + +/obj/machinery/singularity_beacon/Destroy() + if(use_power) + Deactivate() + global.singularity_beacons -= src + return ..() + +/obj/machinery/singularity_beacon/proc/Activate(mob/user = null) + for(var/obj/effect/singularity/singulo in global.singularities) + if(singulo.z == z) + singulo.target = src + icon_state = "[initial(icon_state)]1" + update_use_power(POWER_USE_ACTIVE) + if(user) + to_chat(user, SPAN_NOTICE("You activate the beacon.")) + +/obj/machinery/singularity_beacon/proc/Deactivate(mob/user = null) + for(var/obj/effect/singularity/singulo in global.singularities) + if(singulo.target == src) + singulo.target = null + icon_state = "[initial(icon_state)]0" + update_use_power(POWER_USE_OFF) + if(user) + to_chat(user, SPAN_NOTICE("You deactivate the beacon.")) + +/obj/machinery/singularity_beacon/physical_attack_hand(var/mob/user) + . = TRUE + if(anchored) + if(use_power) + Deactivate(user) + else + Activate(user) + else + to_chat(user, SPAN_DANGER("You need to screw the beacon to the floor first!")) + +/obj/machinery/singularity_beacon/attackby(obj/item/W, mob/user) + if(IS_SCREWDRIVER(W)) + if(use_power) + to_chat(user, SPAN_DANGER("You need to deactivate the beacon first!")) + return + + if(anchored) + anchored = FALSE + to_chat(user, SPAN_NOTICE("You unscrew the beacon from the floor.")) + return + else + anchored = TRUE + to_chat(user, SPAN_NOTICE("You screw the beacon to the floor.")) + return + ..() + return + +// Ensure the terminal is always accessible to be plugged in. +/obj/machinery/singularity_beacon/components_are_accessible(var/path) + if(ispath(path, /obj/item/stock_parts/power/terminal)) + return TRUE + return ..() + +/obj/machinery/singularity_beacon/power_change() + . = ..() + if(!. || !use_power) + return + if(stat & NOPOWER) + Deactivate() diff --git a/code/game/machinery/slide_projector.dm b/code/game/machinery/slide_projector.dm index 27735e730bd..de4cb556fb3 100644 --- a/code/game/machinery/slide_projector.dm +++ b/code/game/machinery/slide_projector.dm @@ -69,7 +69,7 @@ /obj/item/slide_projector/interact(mob/user) var/data = list() if(projection) - data += "Disable projector" + data += "Disable projector" else data += "Projector inactive" @@ -80,7 +80,7 @@ if(I == current_slide) table += "[I.name]SHOWING" else - table += "[I.name]SHOW" + table += "[I.name]SHOW" i++ data += jointext(table,null) var/datum/browser/popup = new(user, "slides\ref[src]", "Slide Projector") diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 48bcdae71f1..67c1d4baafd 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -76,10 +76,10 @@ dat += "Set Temperature: " - dat += "-" + dat += "-" dat += " [set_temperature]K ([set_temperature-T0C]°C)" - dat += "+
" + dat += "+
" var/datum/browser/popup = new(usr, "spaceheater", "Space Heater Control Panel") popup.set_content(jointext(dat, null)) diff --git a/code/game/machinery/suit_cycler.dm b/code/game/machinery/suit_cycler.dm index 7edd6cb3a2a..38847883dfa 100644 --- a/code/game/machinery/suit_cycler.dm +++ b/code/game/machinery/suit_cycler.dm @@ -48,7 +48,7 @@ var/decl/item_modifier/target_modification var/target_bodytype - var/mob/living/carbon/human/occupant + var/mob/living/human/occupant var/obj/item/clothing/suit/space/void/suit var/obj/item/clothing/head/helmet/space/helmet var/obj/item/clothing/shoes/magboots/boots @@ -299,26 +299,26 @@ else if(locked) dat += "
The [model_text ? "[model_text] " : ""]suit cycler is currently locked. Please contact your system administrator." if(allowed(user)) - dat += "
Unlock unit" + dat += "
Unlock unit" else dat += "

Suit cycler

" - dat += "Welcome to the [model_text ? "[model_text] " : ""]suit cycler control panel. Lock unit
" + dat += "Welcome to the [model_text ? "[model_text] " : ""]suit cycler control panel. Lock unit
" dat += "

Maintenance

" - dat += "Helmet: [helmet ? "\the [helmet]" : "no helmet stored" ]. Eject
" - dat += "Suit: [suit ? "\the [suit]" : "no suit stored" ]. Eject
" - dat += "Boots: [boots ? "\the [boots]" : "no boots stored" ]. Eject" + dat += "Helmet: [helmet ? "\the [helmet]" : "no helmet stored" ]. Eject
" + dat += "Suit: [suit ? "\the [suit]" : "no suit stored" ]. Eject
" + dat += "Boots: [boots ? "\the [boots]" : "no boots stored" ]. Eject" if(can_repair && istype(suit)) - dat += "[(suit.damage ? " Repair" : "")]" + dat += "[(suit.damage ? " Repair" : "")]" dat += "
UV decontamination systems: SYSTEM ERROR" : "green'>READY"]
" dat += "Output level: [radiation_level]
" - dat += "Select power level Begin decontamination cycle

" + dat += "Select power level Begin decontamination cycle

" dat += "

Customisation

" - dat += "Target product: [target_modification.name], [target_bodytype]." - dat += "
Apply customisation routine

" + dat += "Target product: [target_modification.name], [target_bodytype]." + dat += "
Apply customisation routine

" var/datum/browser/written_digital/popup = new(user, "suit_cycler", "Suit Cycler") popup.set_content(JOINTEXT(dat)) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm deleted file mode 100644 index 1b3302440e9..00000000000 --- a/code/game/machinery/syndicatebeacon.dm +++ /dev/null @@ -1,164 +0,0 @@ -var/global/list/singularity_beacons = list() - -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -// Beacon randomly spawns in space -// When a non-traitor (no special role in /mind) uses it, he is given the choice to become a traitor -// If he accepts there is a random chance he will be accepted, rejected, or rejected and killed -// Bringing certain items can help improve the chance to become a traitor - - -/obj/machinery/syndicate_beacon - name = "ominous beacon" - desc = "This looks suspicious..." - icon = 'icons/obj/items/syndibeacon.dmi' - icon_state = "syndbeacon" - - anchored = TRUE - density = TRUE - - var/temptext = "" - var/selfdestructing = 0 - var/charges = 1 - -/obj/machinery/syndicate_beacon/interface_interact(var/mob/user) - interact(user) - return TRUE - -/obj/machinery/syndicate_beacon/interact(var/mob/user) - user.set_machine(src) - var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
Identity confirmed,
" - if(ishuman(user) || isAI(user)) - if(is_special_character(user)) - dat += "Operative record found. Greetings, Agent [user.name].
" - else if(charges < 1) - dat += "Connection severed.
" - else - var/honorific = "Mr." - if(user.gender == FEMALE) - honorific = "Ms." - dat += "Identity not found in operative database. What can the Syndicate do for you today, [honorific] [user.name]?
" - if(!selfdestructing) - dat += "

\"[pick("I want to switch teams.", "I want to work for you.", "Let me join you.", "I can be of use to you.", "You want me working for you, and here's why...", "Give me an objective.", "How's the 401k over at the Syndicate?")]\"
" - dat += temptext - show_browser(user, dat, "window=syndbeacon") - onclose(user, "syndbeacon") - -/obj/machinery/syndicate_beacon/Topic(href, href_list) - if(..()) - return - if(href_list["betraitor"]) - if(charges < 1) - src.updateUsrDialog() - return - var/mob/M = locate(href_list["traitormob"]) - if(M.mind.assigned_special_role || jobban_isbanned(M, /decl/special_role/traitor)) - temptext = "We have no need for you at this time. Have a pleasant day.
" - src.updateUsrDialog() - return - charges -= 1 - if(prob(50)) - temptext = "Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind." - src.updateUsrDialog() - addtimer(CALLBACK(src, PROC_REF(selfdestruct)), rand(5, 20) SECONDS) - return - if(ishuman(M)) - var/mob/living/carbon/human/N = M - to_chat(M, "You have joined the ranks of the Syndicate and become a traitor to the station!") - var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) - traitors.add_antagonist(N.mind) - log_and_message_admins("has accepted a traitor objective from a syndicate beacon.", M) - - - src.updateUsrDialog() - return - - -/obj/machinery/syndicate_beacon/proc/selfdestruct() - selfdestructing = 1 - INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), src.loc, 1, rand(1, 3), rand(3, 8), 10) - -//////////////////////////////////////// -//Singularity beacon -//////////////////////////////////////// -/obj/machinery/singularity_beacon - name = "ominous beacon" - desc = "This looks suspicious..." - icon = 'icons/obj/singularity.dmi' - icon_state = "beaconsynd" - - uncreated_component_parts = list(/obj/item/stock_parts/power/terminal) - anchored = FALSE - density = TRUE - layer = BASE_ABOVE_OBJ_LAYER //so people can't hide it and it's REALLY OBVIOUS - stat = 0 - use_power = POWER_USE_OFF - -/obj/machinery/singularity_beacon/Initialize() - . = ..() - global.singularity_beacons += src - -/obj/machinery/singularity_beacon/Destroy() - if(use_power) - Deactivate() - global.singularity_beacons -= src - return ..() - -/obj/machinery/singularity_beacon/proc/Activate(mob/user = null) - for(var/obj/effect/singularity/singulo in global.singularities) - if(singulo.z == z) - singulo.target = src - icon_state = "[initial(icon_state)]1" - update_use_power(POWER_USE_ACTIVE) - if(user) - to_chat(user, "You activate the beacon.") - -/obj/machinery/singularity_beacon/proc/Deactivate(mob/user = null) - for(var/obj/effect/singularity/singulo in global.singularities) - if(singulo.target == src) - singulo.target = null - icon_state = "[initial(icon_state)]0" - update_use_power(POWER_USE_OFF) - if(user) - to_chat(user, "You deactivate the beacon.") - -/obj/machinery/singularity_beacon/physical_attack_hand(var/mob/user) - . = TRUE - if(anchored) - if(use_power) - Deactivate(user) - else - Activate(user) - else - to_chat(user, "You need to screw the beacon to the floor first!") - -/obj/machinery/singularity_beacon/attackby(obj/item/W, mob/user) - if(IS_SCREWDRIVER(W)) - if(use_power) - to_chat(user, "You need to deactivate the beacon first!") - return - - if(anchored) - anchored = FALSE - to_chat(user, "You unscrew the beacon from the floor.") - return - else - anchored = TRUE - to_chat(user, "You screw the beacon to the floor.") - return - ..() - return - -// Ensure the terminal is always accessible to be plugged in. -/obj/machinery/singularity_beacon/components_are_accessible(var/path) - if(ispath(path, /obj/item/stock_parts/power/terminal)) - return TRUE - return ..() - -/obj/machinery/singularity_beacon/power_change() - . = ..() - if(!. || !use_power) - return - if(stat & NOPOWER) - Deactivate() - diff --git a/code/game/machinery/vending/_vending.dm b/code/game/machinery/vending/_vending.dm index e10d32215be..dcd978ded68 100644 --- a/code/game/machinery/vending/_vending.dm +++ b/code/game/machinery/vending/_vending.dm @@ -88,7 +88,7 @@ build_inventory(populate_parts) return INITIALIZE_HINT_LATELOAD - + /obj/machinery/vending/LateInitialize() ..() update_icon() @@ -181,8 +181,8 @@ return TRUE if((. = component_attackby(W, user))) return - if((obj_flags & OBJ_FLAG_ANCHORABLE) && IS_WRENCH(W)) - wrench_floor_bolts(user) + if((obj_flags & OBJ_FLAG_ANCHORABLE) && (IS_WRENCH(W) || IS_HAMMER(W))) + wrench_floor_bolts(user, null, W) power_change() return diff --git a/code/game/machinery/vitals_monitor.dm b/code/game/machinery/vitals_monitor.dm index 3eff63edf62..f23583386a9 100644 --- a/code/game/machinery/vitals_monitor.dm +++ b/code/game/machinery/vitals_monitor.dm @@ -12,7 +12,7 @@ uncreated_component_parts = null construct_state = /decl/machine_construction/default/panel_closed - var/mob/living/carbon/human/victim + var/mob/living/human/victim var/beep = TRUE /obj/machinery/vitals_monitor/Destroy() diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 2f00796334a..8c8f6637d12 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -17,35 +17,47 @@ construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = NOSCREEN - var/state = 0 - var/gibs_ready = FALSE obj_flags = OBJ_FLAG_ANCHORABLE clicksound = "button" clickvol = 40 - var/list/wash_whitelist = list(/obj/item/clothing/under, - /obj/item/clothing/mask, - /obj/item/clothing/head, - /obj/item/clothing/gloves, - /obj/item/clothing/shoes, - /obj/item/clothing/suit, - /obj/item/bedsheet, - /obj/item/underwear) - - var/max_item_size = ITEM_SIZE_LARGE - - var/list/wash_blacklist = list(/obj/item/clothing/suit/space, - /obj/item/clothing/suit/syndicatefake, - /obj/item/clothing/suit/bomb_suit, - /obj/item/clothing/suit/armor, - /obj/item/clothing/mask/gas, - /obj/item/clothing/mask/smokable/cigarette, - /obj/item/clothing/head/helmet) - // Power idle_power_usage = 10 active_power_usage = 150 + var/state = 0 + var/gibs_ready = FALSE + var/max_item_size = ITEM_SIZE_LARGE + +/obj/machinery/washing_machine/proc/get_wash_whitelist() + var/static/list/wash_whitelist = list( + /obj/item/clothing/costume, + /obj/item/clothing/shirt, + /obj/item/clothing/pants, + /obj/item/clothing/skirt, + /obj/item/clothing/dress, + /obj/item/clothing/mask, + /obj/item/clothing/head, + /obj/item/clothing/gloves, + /obj/item/clothing/shoes, + /obj/item/clothing/suit, + /obj/item/bedsheet, + /obj/item/underwear + ) + return wash_whitelist + +/obj/machinery/washing_machine/proc/get_wash_blacklist() + var/static/list/wash_blacklist = list( + /obj/item/clothing/suit/space, + /obj/item/clothing/suit/syndicatefake, + /obj/item/clothing/suit/bomb_suit, + /obj/item/clothing/suit/armor, + /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/smokable/cigarette, + /obj/item/clothing/head/helmet + ) + return wash_blacklist + /obj/machinery/washing_machine/Initialize(mapload, d, populate_parts) create_reagents(100) . = ..() @@ -103,6 +115,8 @@ // If the detergent port is open and the item is an open container, assume we're trying to fill the detergent port. if(!(state & WASHER_STATE_CLOSED) && !((atom_flags & W.atom_flags) & ATOM_FLAG_OPEN_CONTAINER)) + var/list/wash_whitelist = get_wash_whitelist() + var/list/wash_blacklist = get_wash_blacklist() var/list/washing_atoms = get_contained_external_atoms() if(length(washing_atoms) < 5) if(istype(W, /obj/item/holder)) // Mob holder @@ -266,15 +280,16 @@ /obj/machinery/washing_machine/autoclave name = "autoclave" desc = "An industrial washing machine used to sterilize and decontaminate items. It requires detergent for efficient decontamination." - - wash_whitelist = list() - wash_blacklist = list() - max_item_size = ITEM_SIZE_HUGE - idle_power_usage = 10 active_power_usage = 300 +/obj/machinery/washing_machine/autoclave/get_wash_whitelist() + return + +/obj/machinery/washing_machine/autoclave/get_wash_blacklist() + return + #undef WASHER_STATE_CLOSED #undef WASHER_STATE_LOADED #undef WASHER_STATE_RUNNING diff --git a/code/game/movietitles.dm b/code/game/movietitles.dm index 2c961d0b5e5..1a685073daa 100644 --- a/code/game/movietitles.dm +++ b/code/game/movietitles.dm @@ -53,7 +53,7 @@ var/global/list/end_titles var/chunksize = 0 titles += "

EPISODE [rand(1,1000)]
[SSlore.get_end_credits_title()]

" - for(var/mob/living/carbon/human/H in global.living_mob_list_|global.dead_mob_list_) + for(var/mob/living/human/H in global.living_mob_list_|global.dead_mob_list_) if(findtext(H.real_name,"(mannequin)")) continue if(H.isMonkey() && findtext(H.real_name,"[lowertext(H.species.name)]")) //no monki @@ -98,7 +98,7 @@ var/global/list/end_titles var/list/corpses = list() var/list/monkies = list() - for(var/mob/living/carbon/human/H in global.dead_mob_list_) + for(var/mob/living/human/H in global.dead_mob_list_) if(H.timeofdeath < 5 MINUTES) //no prespawned corpses continue if(H.isMonkey() && findtext(H.real_name,"[lowertext(H.species.name)]")) diff --git a/code/game/objects/auras/regenerating_aura.dm b/code/game/objects/auras/regenerating_aura.dm index cb96b9e13ad..fb56c0fbe96 100644 --- a/code/game/objects/auras/regenerating_aura.dm +++ b/code/game/objects/auras/regenerating_aura.dm @@ -21,11 +21,11 @@ var/innate_heal = TRUE // Whether the aura is on, basically. -/obj/aura/regenerating/human/proc/external_regeneration_effect(var/obj/item/organ/external/O, var/mob/living/carbon/human/H) +/obj/aura/regenerating/human/proc/external_regeneration_effect(var/obj/item/organ/external/O, var/mob/living/human/H) return /obj/aura/regenerating/human/life_tick() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(!istype(H)) . = 0 CRASH("Someone gave [user.type] a [src.type] aura. This is invalid.") diff --git a/code/game/objects/auras/shadowling_aura.dm b/code/game/objects/auras/shadowling_aura.dm index 172a3bb552f..ff081f7dfb1 100644 --- a/code/game/objects/auras/shadowling_aura.dm +++ b/code/game/objects/auras/shadowling_aura.dm @@ -4,14 +4,13 @@ /obj/aura/shadowling_aura/added_to(var/mob/living/L) ..() - if(!(MUTATION_SPACERES in L.mutations)) - L.mutations += MUTATION_SPACERES + if(L.add_genetic_condition(GENE_COND_SPACE_RESISTANCE)) added_mutation = TRUE /obj/aura/shadowling_aura/removed() if(added_mutation) added_mutation = FALSE - user.mutations -= MUTATION_SPACERES + user.remove_genetic_condition(GENE_COND_SPACE_RESISTANCE) ..() /obj/aura/shadowling_aura/bullet_act(var/obj/item/projectile/P) diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index 252ca37c2ec..27bffa2de76 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -135,7 +135,7 @@ var/area/A = get_area(location) var/where = "[A.proper_name] | [location.x], [location.y]" - var/whereLink = "[where]" + var/whereLink = "[where]" if(show_log) var/atom/location = carry?.get_reaction_loc(CHEM_REACTION_FLAG_OVERFLOW_CONTAINER) @@ -143,7 +143,7 @@ var/mob/M = get_mob_by_key(location.fingerprintslast) var/more = "" if(M) - more = "(?)" + more = "(?)" log_and_message_admins("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [location.fingerprintslast][more].") else log_and_message_admins("A chemical smoke reaction has taken place in ([whereLink]). No associated key.") diff --git a/code/game/objects/effects/chem/water.dm b/code/game/objects/effects/chem/water.dm index fecc84fd965..ef1d2ba6096 100644 --- a/code/game/objects/effects/chem/water.dm +++ b/code/game/objects/effects/chem/water.dm @@ -10,8 +10,8 @@ QDEL_IN(src, 15 SECONDS) // In case whatever made it forgets to delete it /obj/effect/effect/water/on_reagent_change() - ..() - set_color(reagents?.get_color()) + if((. = ..())) + set_color(reagents?.get_color()) /obj/effect/effect/water/proc/set_up(var/turf/target, var/step_count = 5, var/delay = 5) if(!target) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 2af9a29f3d5..9a1dfda3656 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -123,7 +123,7 @@ /obj/effect/decal/cleanable/blood/attack_hand(mob/user) if(!amount || !length(blood_data) || !ishuman(user)) return ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.get_equipped_item(slot_gloves_str)) return ..() var/taken = rand(1,amount) @@ -131,7 +131,7 @@ to_chat(user, SPAN_NOTICE("You get some of \the [src] on your hands.")) for(var/bloodthing in blood_data) user.add_blood(null, max(1, amount/length(blood_data)), blood_data[bloodthing]) - user.verbs += /mob/living/carbon/human/proc/bloody_doodle + user.verbs += /mob/living/human/proc/bloody_doodle return TRUE /obj/effect/decal/cleanable/blood/splatter diff --git a/code/game/objects/effects/gateway.dm b/code/game/objects/effects/gateway.dm new file mode 100644 index 00000000000..1323ffda6dd --- /dev/null +++ b/code/game/objects/effects/gateway.dm @@ -0,0 +1,69 @@ +/obj/effect/gateway + name = "gateway" + desc = "You're pretty sure that abyss is staring back." + icon = 'icons/obj/cult.dmi' + icon_state = "hole" + density = TRUE + anchored = TRUE + var/spawnable = null + +/obj/effect/gateway/active + light_range=5 + light_color="#ff0000" + spawnable=list( + /mob/living/simple_animal/hostile/scarybat, + /mob/living/simple_animal/hostile/creature, + /mob/living/simple_animal/hostile/faithless + ) + +/obj/effect/gateway/active/Initialize() + . = ..() + addtimer(CALLBACK(src, PROC_REF(create_and_delete)), rand(30,60) SECONDS) + +/obj/effect/gateway/active/proc/create_and_delete() + var/t = pick(spawnable) + new t(src.loc) + qdel(src) + +/obj/effect/gateway/active/proc/can_transform(mob/victim) + if(victim.stat == DEAD) + return FALSE + if(victim.HasMovementHandler(/datum/movement_handler/mob/transformation)) + return FALSE + if(ishuman(victim) || isrobot(victim)) + return TRUE + return FALSE + +/obj/effect/gateway/active/Crossed(var/atom/movable/AM) + if(!isliving(AM)) + return + + var/mob/living/victim = AM + + if(!can_transform(victim)) + return + + victim.handle_pre_transformation() + + victim.AddMovementHandler(/datum/movement_handler/mob/transformation) + victim.icon = null + victim.overlays.len = 0 + victim.set_invisibility(INVISIBILITY_ABSTRACT) + + if(isrobot(victim)) + var/mob/living/silicon/robot/Robot = victim + QDEL_NULL(Robot.central_processor) + else + for(var/obj/item/W in victim) + victim.drop_from_inventory(W) + if(istype(W, /obj/item/implant)) + qdel(W) + + var/mob/living/new_mob = new /mob/living/simple_animal/corgi(AM.loc) + new_mob.a_intent = I_HURT + if(victim.mind) + victim.mind.transfer_to(new_mob) + else + new_mob.key = victim.key + + to_chat(new_mob, "Your form morphs into that of a corgi.")//Because we don't have cluwnes \ No newline at end of file diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 2dab83f5f3c..7d695e1f75d 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -58,13 +58,13 @@ new /obj/item/clothing/head/helmet/gladiator(loc) /obj/abstract/landmark/costume/madscientist/make_costumes() - new /obj/item/clothing/under/gimmick/rank/captain/suit(loc) + new /obj/item/clothing/costume/captain_suit(loc) new /obj/item/clothing/head/flatcap(loc) new /obj/item/clothing/suit/toggle/labcoat/mad(loc) new /obj/item/clothing/glasses/prescription/gglasses(loc) /obj/abstract/landmark/costume/elpresidente/make_costumes() - new /obj/item/clothing/under/gimmick/rank/captain/suit(loc) + new /obj/item/clothing/costume/captain_suit(loc) new /obj/item/clothing/head/flatcap(loc) new /obj/item/clothing/mask/smokable/cigarette/cigar/havana(loc) new /obj/item/clothing/shoes/jackboots(loc) @@ -92,7 +92,8 @@ new CHOICE(loc) new /obj/item/clothing/shoes/color/black(loc) new /obj/item/cane(loc) - new /obj/item/clothing/under/sl_suit(loc) + new /obj/item/clothing/pants/slacks/black(loc) + new /obj/item/clothing/shirt/button(loc) new /obj/item/clothing/mask/fakemoustache(loc) /obj/abstract/landmark/costume/plaguedoctor/make_costumes() @@ -104,7 +105,10 @@ new /obj/item/clothing/mask/gas/owl_mask(loc) /obj/abstract/landmark/costume/waiter/make_costumes() - new /obj/item/clothing/under/waiter(loc) + new /obj/item/clothing/pants/slacks/black(loc) + new /obj/item/clothing/shirt/button(loc) + new /obj/item/clothing/neck/tie/bow/color/red(loc) + new /obj/item/clothing/suit/jacket/vest/blue(loc) var/CHOICE= pick( /obj/item/clothing/head/kitty, /obj/item/clothing/head/rabbitears) new CHOICE(loc) new /obj/item/clothing/suit/apron(loc) diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm index 30dde5926a3..6b84dae52a0 100644 --- a/code/game/objects/effects/manifest.dm +++ b/code/game/objects/effects/manifest.dm @@ -9,7 +9,7 @@ /obj/effect/manifest/proc/manifest() var/dat = "Crew Manifest:
" - for(var/mob/living/carbon/human/M in SSmobs.mob_list) + for(var/mob/living/human/M in SSmobs.mob_list) dat += text(" [] - []
", M.name, M.get_assignment()) var/obj/item/paper/P = new /obj/item/paper( src.loc ) P.info = dat diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 03010895f28..7f70b3e996c 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -6,7 +6,7 @@ layer = OBJ_LAYER icon = 'icons/obj/items/weapon/landmine.dmi' icon_state = "uglymine" - var/triggerproc = "explode" //name of the proc thats called when the mine is triggered + var/triggerproc = PROC_REF(explode) // the proc that's called when the mine is triggered var/triggered = 0 /obj/effect/mine/Initialize() @@ -28,9 +28,12 @@ /obj/effect/mine/proc/triggerrad(obj) spark_at(src, cardinal_only = TRUE) - obj:radiation += 50 - randmutb(obj) - domutcheck(obj,null) + if(ismob(obj)) + var/mob/victim = obj + victim.radiation += 50 + if(ismob(obj)) + var/mob/mob = obj + mob.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/disability))) spawn(0) qdel(src) @@ -64,7 +67,9 @@ /obj/effect/mine/proc/triggerkick(obj) spark_at(src, cardinal_only = TRUE) - qdel(obj:client) + if(ismob(obj)) + var/mob/victim = obj + qdel(victim.client) spawn(0) qdel(src) @@ -76,24 +81,24 @@ /obj/effect/mine/dnascramble name = "Radiation Mine" icon_state = "uglymine" - triggerproc = "triggerrad" + triggerproc = PROC_REF(triggerrad) /obj/effect/mine/flame name = "Incendiary Mine" icon_state = "uglymine" - triggerproc = "triggerflame" + triggerproc = PROC_REF(triggerflame) /obj/effect/mine/kick name = "Kick Mine" icon_state = "uglymine" - triggerproc = "triggerkick" + triggerproc = PROC_REF(triggerkick) /obj/effect/mine/n2o name = "N2O Mine" icon_state = "uglymine" - triggerproc = "triggern2o" + triggerproc = PROC_REF(triggern2o) /obj/effect/mine/stun name = "Stun Mine" icon_state = "uglymine" - triggerproc = "triggerstun" + triggerproc = PROC_REF(triggerstun) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index ff133330e6a..3ecdcf8fcb8 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -23,7 +23,7 @@ return TRUE var/showed_msg = FALSE if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/decl/natural_attack/attack = H.get_unarmed_attack(src) if(istype(attack)) attack.show_attack(H, src, H.get_target_zone(), 1) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index bef4e25c4d1..e99d8b05f67 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -49,7 +49,7 @@ M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5) if(adminlog) - log_and_message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]) (JMP)") + log_and_message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]) (JMP)") var/approximate_intensity = (devastation_range * 3) + (heavy_impact_range * 2) + light_impact_range // Large enough explosion. For performance reasons, powernets will be rebuilt manually diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 54cbd4f4a23..7618ae80ae3 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -244,7 +244,7 @@ //would check is_broken() and is_malfunctioning() here too but is_malfunctioning() //is probabilistic so we can't do that and it would be unfair to just check one. if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/organ/external/hand = GET_EXTERNAL_ORGAN(H, M.get_empty_hand_slot()) if(istype(hand) && hand.is_usable()) return TRUE @@ -751,7 +751,7 @@ if(!istype(M)) return TRUE if(!blood_data && ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M blood_data = REAGENT_DATA(H.vessel, /decl/material/liquid/blood) var/sample_dna = LAZYACCESS(blood_data, "blood_DNA") if(sample_dna) @@ -783,12 +783,12 @@ var/global/list/_item_blood_mask = icon('icons/effects/blood.dmi', "itemblood") /obj/item/proc/showoff(mob/user) for(var/mob/M in view(user)) if(!user.is_invisible_to(M)) - M.show_message("[user] holds up [src]. Take a closer look.", 1) + M.show_message("[user] holds up [src]. Take a closer look.", 1) /* For zooming with scope or binoculars. This is called from modules/mob/mob_movement.dm if you move you will be zoomed out -modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. +modules/mob/living/human/life.dm if you die, you will be zoomed out. */ //Looking through a scope or binoculars should /not/ improve your periphereal vision. Still, increase viewsize a tiny bit so that sniping isn't as restricted to NSEW /obj/item/proc/zoom(mob/user, var/tileoffset = 14,var/viewsize = 9) //tileoffset is client view offset in the direction the user is facing. viewsize is how far out this thing zooms. 7 is normal view @@ -799,7 +799,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. var/devicename = zoomdevicename || name - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(user.incapacitated(INCAPACITATION_DISABLED)) to_chat(user, SPAN_WARNING("You are unable to focus through the [devicename].")) return @@ -884,7 +884,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. . = "[html_icon(src)] [get_examine_name()]" var/ID = GetIdCard() if(ID) - . += " \[Look at ID\]" + . += " \[Look at ID\]" /obj/item/proc/on_active_hand() return diff --git a/code/game/objects/items/_item_damage.dm b/code/game/objects/items/_item_damage.dm index 33cd36a1fba..71afac1af8d 100644 --- a/code/game/objects/items/_item_damage.dm +++ b/code/game/objects/items/_item_damage.dm @@ -1,5 +1,5 @@ /**Basic damage handling for items. Returns the amount of damage taken after armor if the item was damaged.*/ -/obj/item/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/item/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(!can_take_damage()) // This object does not take damage. return 0 //Must return a number if(damage < 0) @@ -78,8 +78,8 @@ else playsound(hit_atom, 'sound/weapons/throwtap.ogg', volume, TRUE, -1) -/obj/item/proc/eyestab(mob/living/carbon/M, mob/living/carbon/user) - var/mob/living/carbon/human/H = M +/obj/item/proc/eyestab(mob/living/M, mob/living/user) + var/mob/living/human/H = M if(istype(H)) for(var/slot in global.standard_headgear_slots) var/obj/item/protection = H.get_equipped_item(slot) diff --git a/code/game/objects/items/blades/folding.dm b/code/game/objects/items/blades/folding.dm index 3e9d559426e..d774df06151 100644 --- a/code/game/objects/items/blades/folding.dm +++ b/code/game/objects/items/blades/folding.dm @@ -22,16 +22,26 @@ update_force() /obj/item/bladed/folding/attack_self(mob/user) - open = !open + if(user.a_intent != I_HELP) + set_open(!open, user) + return TRUE + var/decl/interaction_handler/folding_knife/interaction = GET_DECL(/decl/interaction_handler/folding_knife) + if(!interaction.is_possible(src, user)) + return FALSE + interaction.invoked(src, user) + return TRUE + +/obj/item/bladed/folding/proc/set_open(new_state, mob/user) + open = new_state update_force() update_icon() - if(open) - user.visible_message(SPAN_NOTICE("\The [user] opens \the [src].")) - playsound(user, 'sound/weapons/flipblade.ogg', 15, 1) - else - user.visible_message(SPAN_NOTICE("\The [user] closes \the [src].")) - add_fingerprint(user) - return TRUE + if(user) + if(open) + user.visible_message(SPAN_NOTICE("\The [user] opens \the [src].")) + playsound(user, 'sound/weapons/flipblade.ogg', 15, 1) + else + user.visible_message(SPAN_NOTICE("\The [user] closes \the [src].")) + add_fingerprint(user) /obj/item/bladed/folding/update_base_icon_state() . = ..() @@ -74,3 +84,73 @@ else return TOOL_QUALITY_MEDIOCRE return open ? ..() : 0 + +//Interactions +/obj/item/bladed/folding/get_alt_interactions(mob/user) + . = ..() + LAZYADD(., /decl/interaction_handler/folding_knife) + +/decl/interaction_handler/folding_knife + name = "Adjust Folding Knife" + expected_target_type = /obj/item/bladed/folding + interaction_flags = INTERACTION_NEEDS_INVENTORY | INTERACTION_NEEDS_PHYSICAL_INTERACTION + +/decl/interaction_handler/folding_knife/is_possible(atom/target, mob/user) + . = ..() + if(.) + var/datum/extension/tool/tool_extension = get_extension(target, /datum/extension/tool) + return istype(tool_extension, /datum/extension/tool/variable) && user.check_dexterity(DEXTERITY_COMPLEX_TOOLS) + +/decl/interaction_handler/folding_knife/proc/get_radial_choices(atom/target) + // - toggle open/closed + // - each tool + . = list() + var/obj/item/bladed/folding/folding_knife = target + // should always be in the inventory so we can assume get_world_inventory_state is inventory if it exists + var/open_close_state = "[folding_knife.get_world_inventory_state()]" + if(folding_knife.open) + open_close_state += "-closed" + var/image/open_close_image = new /image + open_close_image.name = folding_knife.open ? "Close blade" : "Open blade" + open_close_image.underlays = list( + overlay_image(folding_knife.icon, "[open_close_state]-hilt", folding_knife.hilt_material.color, RESET_COLOR), + overlay_image(folding_knife.icon, open_close_state, folding_knife.material.color, RESET_COLOR) + ) + .["Toggle"] = open_close_image +/* if(!folding_knife.open) // Can only switch mode with the knife open, because we assume all tool interactions use the blade currently + return . */ + var/datum/extension/tool/variable/tool = get_extension(target, /datum/extension/tool) + for(var/tool_mode in tool.tool_values) + if(tool_mode == tool.current_tool) + continue + var/decl/tool_archetype/tool_archetype = GET_DECL(tool_mode) + // This blank image fuckery is done so that we can actually have a usable return value from show_radial_menu AND have a maptext label. + var/image/I = new /image + I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA + var/tool_name = tool_archetype.name + if(tool_archetype.article) + tool_name = "\a [tool_name]" + var/image/underlay = new /image + underlay.appearance = folding_knife + // reset a bunch of appearance vars we don't need + underlay.pixel_x = 0 + underlay.pixel_y = 0 + underlay.layer = FLOAT_LAYER + underlay.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA + I.underlays = list(underlay) // don't fuck with the base object's name or color please + I.name = "Use as [tool_name]" + .[tool_mode] = I + +/decl/interaction_handler/folding_knife/invoked(atom/target, mob/user) + var/obj/item/bladed/folding/folding_knife = target + var/chosen_option = show_radial_menu(user, user, get_radial_choices(folding_knife), radius = 42, use_labels = TRUE) + if(!chosen_option) + return + if(chosen_option == "Toggle") + folding_knife.set_open(!folding_knife.open, user) + return + var/datum/extension/tool/variable/tool = get_extension(folding_knife, /datum/extension/tool) + if(ispath(chosen_option, /decl/tool_archetype)) + tool.switch_tool(chosen_option, user) + return + CRASH("Invalid option '[json_encode(chosen_option)]' selected in [folding_knife]'s [type]") \ No newline at end of file diff --git a/code/game/objects/items/books/_book.dm b/code/game/objects/items/books/_book.dm index e58c0fed01d..6ccc01a0d78 100644 --- a/code/game/objects/items/books/_book.dm +++ b/code/game/objects/items/books/_book.dm @@ -17,6 +17,9 @@ var/carved = 0 // Has the book been hollowed out for use as a secret storage item? var/obj/item/store //What's in the book? var/last_modified_ckey + /// If TRUE, mild solvents can dissolve ink off the page. + /// If FALSE, the user instead receives a message about how the text doesn't seem to be normal ink. + var/can_dissolve_text = TRUE // Copied from paper. Todo: generalize. var/const/deffont = "Verdana" diff --git a/code/game/objects/items/cryobag.dm b/code/game/objects/items/cryobag.dm index 467e29f6346..5d2a0699802 100644 --- a/code/game/objects/items/cryobag.dm +++ b/code/game/objects/items/cryobag.dm @@ -131,7 +131,7 @@ qdel(src) /obj/structure/closet/body_bag/cryobag/blank/WillContain() - return list(/mob/living/carbon/human/blank) + return list(/mob/living/human/blank) /obj/structure/closet/body_bag/cryobag/blank/Initialize() . = ..() diff --git a/code/game/objects/items/devices/auto_cpr.dm b/code/game/objects/items/devices/auto_cpr.dm index 101414fb7cf..ae70328b395 100644 --- a/code/game/objects/items/devices/auto_cpr.dm +++ b/code/game/objects/items/devices/auto_cpr.dm @@ -55,7 +55,7 @@ if(!ishuman(loc)) return PROCESS_KILL - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(H.get_equipped_slot_for_item(src) != slot_wear_suit_str) return PROCESS_KILL diff --git a/code/game/objects/items/devices/boombox.dm b/code/game/objects/items/devices/boombox.dm index 9336d59c26a..bea0e3cac25 100644 --- a/code/game/objects/items/devices/boombox.dm +++ b/code/game/objects/items/devices/boombox.dm @@ -50,12 +50,12 @@ /obj/item/boombox/interact(var/mob/user) if(!CanPhysicallyInteract(user)) return - var/dat = "NEXT" - dat += "PREV" - dat += "PLAY" - dat += "STOP" - dat += "VOL -" - dat += "VOL +" + var/dat = "NEXT" + dat += "PREV" + dat += "PLAY" + dat += "STOP" + dat += "VOL -" + dat += "VOL +" var/datum/browser/popup = new(user, "boombox", "BOOMTASTIC 3000", 290, 110) popup.set_content(dat) popup.open() diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 7b3c456de9d..11ebc03e9c9 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -25,7 +25,7 @@ icon_state = "[icon_state]-burnt" /obj/item/flash/proc/clown_check(var/mob/user) - if(user && (MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user && user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, "\The [src] slips out of your hand.") user.try_unequip(src) return 0 @@ -104,7 +104,7 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) do_flash_animation(user) - for(var/mob/living/carbon/M in oviewers(3, null)) + for(var/mob/living/M in oviewers(3, null)) M.handle_flashed(src, rand(str_min,str_max)) return TRUE @@ -112,7 +112,7 @@ if(broken || !general_flash_check()) return FALSE do_flash_animation() - for(var/mob/living/carbon/M in oviewers(3, null)) + for(var/mob/living/M in oviewers(3, null)) M.handle_flashed(src, rand(str_min,str_max)) /obj/item/flash/synthetic //not for regular use, weaker effects diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index e20296b8724..09c924a0733 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -105,7 +105,7 @@ SPAN_NOTICE("You activate \the [src]."), SPAN_ITALIC("You hear a click.") ) - message_admins("Power sink activated by [key_name_admin(user)] at (JMP)") + message_admins("Power sink activated by [key_name_admin(user)] at (JMP)") log_game("Power sink activated by [key_name(user)] at [get_area_name(src)]") set_mode(OPERATING) return TRUE diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 561f7d6de8f..882706ebc6f 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -29,10 +29,6 @@ name = "enchanted intercom" desc = "Talk into this while you ponder your orb." -/obj/item/radio/intercom/ninja - name = "stealth intercom" - desc = "It's hiding in plain sight." - /obj/item/radio/intercom/raider name = "piratical intercom" desc = "Pirate radio, but not in the usual sense of the word." diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index a5dc2b221f5..8f1e2aaf0d0 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -317,18 +317,17 @@ set waitfor = FALSE if(!on) return 0 // the device has to be on // Fix for permacell radios, but kinda eh about actually fixing them. - if(!M || !message) return 0 + if(!istype(M) || !message) return 0 if(speaking && (speaking.flags & (LANG_FLAG_NONVERBAL|LANG_FLAG_SIGNLANG))) return 0 if (!broadcasting) // Sedation chemical effect should prevent radio use. - var/mob/living/carbon/C = M - if(istype(C) && (C.has_chemical_effect(CE_SEDATE, 1) || C.incapacitated(INCAPACITATION_DISRUPTED))) + if((M.has_chemical_effect(CE_SEDATE, 1) || M.incapacitated(INCAPACITATION_DISRUPTED))) to_chat(M, SPAN_WARNING("You're unable to reach \the [src].")) return 0 - if((istype(C)) && C.radio_interrupt_cooldown > world.time) + if(M.radio_interrupt_cooldown > world.time) to_chat(M, SPAN_WARNING("You're disrupted as you reach for \the [src].")) return 0 diff --git a/code/game/objects/items/devices/scanners/_scanner.dm b/code/game/objects/items/devices/scanners/_scanner.dm index 0693f18a6ec..8496b049f86 100644 --- a/code/game/objects/items/devices/scanners/_scanner.dm +++ b/code/game/objects/items/devices/scanners/_scanner.dm @@ -29,7 +29,7 @@ popup.open() /obj/item/scanner/proc/get_header() - return "Print ReportClear data" + return "Print ReportClear data" /obj/item/scanner/proc/can_use(mob/user) if (user.incapacitated()) diff --git a/code/game/objects/items/devices/scanners/breath.dm b/code/game/objects/items/devices/scanners/breath.dm index 71f5caa1c7d..bc80d7c7b9f 100644 --- a/code/game/objects/items/devices/scanners/breath.dm +++ b/code/game/objects/items/devices/scanners/breath.dm @@ -27,7 +27,7 @@ to_chat(user, .) to_chat(user, "
") -/proc/breath_scan_results(var/mob/living/C, var/verbose, var/skill_level = SKILL_DEFAULT) +/proc/breath_scan_results(var/mob/living/target, var/verbose, var/skill_level = SKILL_DEFAULT) . = list() var/header = list() var/b @@ -45,11 +45,11 @@ b = "" endb = "" - . += "[b]Breath sample results for \the [C]:[endb]" + . += "[b]Breath sample results for \the [target]:[endb]" - var/obj/item/organ/internal/lungs/lungs = C.get_organ(BP_LUNGS) + var/obj/item/organ/internal/lungs/lungs = target.get_organ(BP_LUNGS) var/breathing = "none" - if(istype(lungs) && !(C.status_flags & FAKEDEATH)) + if(istype(lungs) && !(target.status_flags & FAKEDEATH)) if(lungs.breath_fail_ratio < 0.3) breathing = "normal" else if(lungs.breath_fail_ratio < 1) @@ -66,7 +66,7 @@ // Other general warnings. if(skill_level >= SKILL_BASIC) - switch(C.get_damage(OXY)) + switch(target.get_damage(OXY)) if(0 to 25) dat += "Subject oxygen levels nominal." if(25 to 50) @@ -90,14 +90,14 @@ . += "[b]Reagent scan:[endb]" var/print_reagent_default_message = TRUE - if (C.has_chemical_effect(CE_ALCOHOL, 1)) + if (target.has_chemical_effect(CE_ALCOHOL, 1)) . += "Alcohol detected in subject's breath." print_reagent_default_message = FALSE - if (C.has_chemical_effect(CE_ALCOHOL_TOXIC, 1)) + if (target.has_chemical_effect(CE_ALCOHOL_TOXIC, 1)) . += "Subject is suffering from alcohol poisoning." print_reagent_default_message = FALSE - var/datum/reagents/inhaled = C.get_inhaled_reagents() + var/datum/reagents/inhaled = target.get_inhaled_reagents() if(inhaled && inhaled.total_volume) var/unknown = 0 for(var/rtype in inhaled.reagent_volumes) diff --git a/code/game/objects/items/devices/scanners/gas.dm b/code/game/objects/items/devices/scanners/gas.dm index a9311cc11aa..b4bc1705cf2 100644 --- a/code/game/objects/items/devices/scanners/gas.dm +++ b/code/game/objects/items/devices/scanners/gas.dm @@ -12,7 +12,7 @@ var/mode = DEFAULT_MODE /obj/item/scanner/gas/get_header() - return "[..()]Switch Mode" + return "[..()]Switch Mode" /obj/item/scanner/gas/OnTopic(var/user, var/list/href_list) ..() diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm index 22acf61c2d5..20db2e1f9cd 100644 --- a/code/game/objects/items/devices/scanners/health.dm +++ b/code/game/objects/items/devices/scanners/health.dm @@ -19,13 +19,13 @@ if (!user.check_dexterity(DEXTERITY_COMPLEX_TOOLS)) return - if ((MUTATION_CLUMSY in user.mutations) && prob(50)) + if (user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) user.visible_message("\The [user] runs \the [scanner] over the floor.") to_chat(user, "Scan results for the floor:") to_chat(user, "Overall Status: Healthy") return - var/mob/living/carbon/human/scan_subject = null + var/mob/living/human/scan_subject = null if (ishuman(target)) scan_subject = target else if (istype(target, /obj/structure/closet/body_bag)) @@ -36,7 +36,7 @@ scan_content.Add(L) if (scan_content.len == 1) - for(var/mob/living/carbon/human/L in scan_content) + for(var/mob/living/human/L in scan_content) scan_subject = L else if (scan_content.len > 1) to_chat(user, "\The [scanner] picks up multiple readings inside \the [target], too close together to scan properly.") @@ -57,7 +57,7 @@ to_chat(user, .) to_chat(user, "
") -/proc/medical_scan_results(var/mob/living/carbon/human/H, var/verbose, var/skill_level = SKILL_DEFAULT) +/proc/medical_scan_results(var/mob/living/human/H, var/verbose, var/skill_level = SKILL_DEFAULT) . = list() var/header = list() var/b diff --git a/code/game/objects/items/devices/scanners/mass_spectrometer.dm b/code/game/objects/items/devices/scanners/mass_spectrometer.dm index 3eda6f1a4f4..4812824f742 100644 --- a/code/game/objects/items/devices/scanners/mass_spectrometer.dm +++ b/code/game/objects/items/devices/scanners/mass_spectrometer.dm @@ -14,8 +14,8 @@ create_reagents(5) /obj/item/scanner/spectrometer/on_reagent_change() - ..() - update_icon() + if((. = ..())) + update_icon() /obj/item/scanner/spectrometer/on_update_icon() . = ..() diff --git a/code/game/objects/items/devices/scanners/xenobio.dm b/code/game/objects/items/devices/scanners/xenobio.dm index d0af4cb3fbd..3fc507c50de 100644 --- a/code/game/objects/items/devices/scanners/xenobio.dm +++ b/code/game/objects/items/devices/scanners/xenobio.dm @@ -13,7 +13,7 @@ ) var/list/valid_targets = list( - /mob/living/carbon/human, + /mob/living/human, /mob/living/simple_animal ) @@ -40,7 +40,7 @@ /mob/proc/xenobio_scan_results() . = "Incompatible life form, analysis failed." -/mob/living/carbon/human/xenobio_scan_results() +/mob/living/human/xenobio_scan_results() . += "Data for \the [src]:" . += "Species:\t[species]" if(species.breath_type) diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index 75801bc5fb8..b6a3db82739 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -45,7 +45,7 @@ if (!is_in_slot()) return - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc var/temp_adj = min(H.bodytemperature - thermostat, max_cooling) @@ -65,7 +65,7 @@ // Checks whether the cooling unit is being worn on the back/suit slot. // That way you can't carry it in your hands while it's running to cool yourself down. /obj/item/suit_cooling_unit/proc/is_in_slot() - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(!istype(H)) return 0 return H.get_equipped_item(slot_back_str) == src || H.get_equipped_item(slot_s_store_str) == src diff --git a/code/game/objects/items/devices/suit_sensor_jammer.dm b/code/game/objects/items/devices/suit_sensor_jammer.dm index 1d60d6c05f5..980756bffec 100644 --- a/code/game/objects/items/devices/suit_sensor_jammer.dm +++ b/code/game/objects/items/devices/suit_sensor_jammer.dm @@ -186,7 +186,7 @@ sjm.enable() jammer_method = sjm -/obj/item/suit_sensor_jammer/proc/may_process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos) +/obj/item/suit_sensor_jammer/proc/may_process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos) if(!pos) return FALSE var/turf/T = get_turf(src) diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm index d7fdbfb7756..1f8b7aff837 100644 --- a/code/game/objects/items/devices/t_scanner.dm +++ b/code/game/objects/items/devices/t_scanner.dm @@ -70,15 +70,15 @@ var/list/update_remove = active_scanned - scanned //Add new overlays - for(var/obj/O in update_add) - var/image/overlay = get_overlay(O) - active_scanned[O] = overlay + for(var/to_show in update_add) + var/image/overlay = get_overlay(to_show) + active_scanned[to_show] = overlay user_client.images += overlay //Remove stale overlays - for(var/obj/O in update_remove) - user_client.images -= active_scanned[O] - active_scanned -= O + for(var/to_remove in update_remove) + user_client.images -= active_scanned[to_remove] + active_scanned -= to_remove //creates a new overlay for a scanned object /obj/item/t_scanner/proc/get_overlay(var/atom/movable/scanned) @@ -101,7 +101,7 @@ if(ismob(scanned)) if(ishuman(scanned)) - var/mob/living/carbon/human/H = scanned + var/mob/living/human/H = scanned if(H.get_bodytype()?.appearance_flags & HAS_SKIN_COLOR) I.color = H.get_skin_colour() I.icon = 'icons/mob/mob.dmi' @@ -120,6 +120,15 @@ if(overlay_cache.len > OVERLAY_CACHE_LEN) overlay_cache.Cut(1, overlay_cache.len-OVERLAY_CACHE_LEN-1) +/obj/item/t_scanner/proc/can_scan_mob(mob/victim) + if(isobserver(victim)) + return FALSE + if(victim.is_cloaked()) + return TRUE + if(victim.alpha < 255) + return TRUE + return FALSE + /obj/item/t_scanner/proc/get_scanned_objects(var/scan_dist) . = list() @@ -128,13 +137,7 @@ for(var/turf/T in range(scan_range, center)) for(var/mob/M in T.contents) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.is_cloaked()) - . += M - else if(M.alpha < 255) - . += M - else if(round_is_spooky() && isobserver(M)) + if(can_scan_mob(M)) . += M if(!!T.is_plating()) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 6139f3dd658..8170f78018f 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -461,7 +461,7 @@ var/list/output = list("
") for(var/i=1, i < timestamp.len, i++) var/time = "\[[time2text(timestamp[i]*10,"mm:ss")]\]" - output += "[time]
-----CUT------
" + output += "[time]
-----CUT------
" output += "
" var/datum/browser/popup = new(user, "tape_cutting", "Cutting tape", 170, 600) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index e93021d7c6e..1226b3f9ecc 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -43,7 +43,7 @@ effective or pretty fucking useless. return var/list/stun_victims = list() - for(var/mob/living/carbon/human/M in orange(10, user)) + for(var/mob/living/human/M in orange(10, user)) stun_victims += M spawn() if(prob(50)) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 388a0ae509e..03fb9ccd35b 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -6,7 +6,7 @@ material = /decl/material/solid/metal/stainlesssteel var/obj/item/tank/tank_one var/obj/item/tank/tank_two - var/obj/item/attached_device + var/obj/item/assembly/attached_device var/mob/attacher = null var/valve_open = 0 var/toggle = 1 @@ -28,7 +28,7 @@ tank_one = item else tank_two = item - message_admins("[key_name_admin(user)] attached both tanks to a transfer valve. (JMP)") + message_admins("[key_name_admin(user)] attached both tanks to a transfer valve. (JMP)") log_game("[key_name_admin(user)] attached both tanks to a transfer valve.") to_chat(user, "You attach the tank to the transfer valve.") @@ -58,7 +58,7 @@ A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb). global.bombers += "[key_name(user)] attached a [item] to a transfer valve." - message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. (JMP)") + message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. (JMP)") log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") attacher = user SSnano.update_uis(src) // update all UIs attached to src @@ -110,14 +110,14 @@ else if(attached_device) if(href_list["rem_device"]) attached_device.dropInto(loc) - attached_device:holder = null + attached_device.holder = null attached_device = null update_icon() if(href_list["device"]) attached_device.attack_self(usr) return 1 // Returning 1 sends an update to attached UIs -/obj/item/transfer_valve/proc/process_activation(var/obj/item/D) +/obj/item/transfer_valve/proc/process_activation(var/obj/item/activator) if(toggle) toggle = 0 toggle_valve() @@ -194,16 +194,16 @@ else attacher_name = "[attacher.name]([attacher.ckey])" - var/log_str = "Bomb valve opened in [A.proper_name] " + var/log_str = "Bomb valve opened in [A.proper_name] " log_str += "with [attached_device ? attached_device : "no device"] attacher: [attacher_name]" if(attacher) - log_str += "(?)" + log_str += "(?)" var/mob/mob = get_mob_by_key(src.fingerprintslast) var/last_touch_info = "" if(mob) - last_touch_info = "(?)" + last_touch_info = "(?)" log_str += " Last touched by: [src.fingerprintslast][last_touch_info]" global.bombers += log_str diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index 4e4d928ff4a..8e07bc60453 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -40,13 +40,13 @@ add_fingerprint(user) user.set_machine(src) var/dat = list() - dat += "Photography mode is currently: [turned_on ? "On" : "Off"]
" - dat += "Photography focus is currently: [field_of_view]
" - dat += "Channel name is: [channel ? channel : "unidentified broadcast"]
" - dat += "Video streaming is: [video_enabled ? "Online" : "Offline"]
" - dat += "Microphone is: [radio.broadcasting ? "Online" : "Offline"]
" + dat += "Photography mode is currently: [turned_on ? "On" : "Off"]
" + dat += "Photography focus is currently: [field_of_view]
" + dat += "Channel name is: [channel ? channel : "unidentified broadcast"]
" + dat += "Video streaming is: [video_enabled ? "Online" : "Offline"]
" + dat += "Microphone is: [radio.broadcasting ? "Online" : "Offline"]
" dat += "Sound is being broadcasted on frequency: [format_frequency(radio.frequency)]
" - dat += "Network Options" + dat += "Network Options" var/datum/browser/written_digital/popup = new(user, "Press Camera Drone", "EyeBuddy", 300, 390, src) popup.set_content(jointext(dat,null)) popup.open() diff --git a/code/game/objects/items/flame/flame_fuelled_lighter.dm b/code/game/objects/items/flame/flame_fuelled_lighter.dm index aa895dd5411..7f282757822 100644 --- a/code/game/objects/items/flame/flame_fuelled_lighter.dm +++ b/code/game/objects/items/flame/flame_fuelled_lighter.dm @@ -22,7 +22,7 @@ if(. && user) light_effects(user) -/obj/item/flame/fuelled/lighter/proc/light_effects(mob/living/carbon/user) +/obj/item/flame/fuelled/lighter/proc/light_effects(mob/living/user) if(prob(95)) user.visible_message(SPAN_NOTICE("After a few attempts, [user] manages to light the [src].")) else diff --git a/code/game/objects/items/flashlights/_flashlight.dm b/code/game/objects/items/flashlights/_flashlight.dm index 8afd18b19d0..989f8f6bc64 100644 --- a/code/game/objects/items/flashlights/_flashlight.dm +++ b/code/game/objects/items/flashlights/_flashlight.dm @@ -100,7 +100,7 @@ if(on && user.get_target_zone() == BP_EYES && target.should_have_organ(BP_HEAD)) add_fingerprint(user) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) //too dumb to use flashlight properly + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) //too dumb to use flashlight properly return ..() //just hit them in the head for(var/slot in global.standard_headgear_slots) @@ -111,13 +111,14 @@ var/obj/item/organ/vision var/decl/bodytype/root_bodytype = target.get_bodytype() - if(!root_bodytype?.vision_organ || !target.should_have_organ(root_bodytype.vision_organ)) + var/vision_organ_tag = target.get_vision_organ_tag() + if(!vision_organ_tag || !target.should_have_organ(vision_organ_tag)) to_chat(user, SPAN_WARNING("You can't find anything on \the [target] to direct \the [src] into!")) return TRUE - vision = GET_INTERNAL_ORGAN(target, root_bodytype.vision_organ) + vision = GET_INTERNAL_ORGAN(target, vision_organ_tag) if(!vision) - vision = root_bodytype.has_organ[root_bodytype.vision_organ] + vision = root_bodytype.has_organ[vision_organ_tag] var/decl/pronouns/G = target.get_pronouns() to_chat(user, SPAN_WARNING("\The [target] is missing [G.his] [initial(vision.name)]!")) return TRUE @@ -135,7 +136,7 @@ return ..() /obj/item/flashlight/proc/inspect_vision(obj/item/organ/vision, mob/living/user) - var/mob/living/carbon/human/H = vision.owner + var/mob/living/human/H = vision.owner if(H == user) //can't look into your own eyes buster return @@ -145,7 +146,7 @@ if(vision.owner.stat == DEAD || H.is_blind()) //mob is dead or fully blind to_chat(user, SPAN_WARNING("\The [H]'s pupils do not react to the light!")) return - if(MUTATION_XRAY in H.mutations) + if(H.has_genetic_condition(GENE_COND_XRAY)) to_chat(user, SPAN_NOTICE("\The [H]'s pupils give an eerie glow!")) if(vision.damage) to_chat(user, SPAN_WARNING("There's visible damage to [H]'s [vision.name]!")) diff --git a/code/game/objects/items/passport.dm b/code/game/objects/items/passport.dm index 48f3c68e431..5fc16d6d6ed 100644 --- a/code/game/objects/items/passport.dm +++ b/code/game/objects/items/passport.dm @@ -15,7 +15,7 @@ ) var/info -/obj/item/passport/proc/set_info(mob/living/carbon/human/H) +/obj/item/passport/proc/set_info(mob/living/human/H) if(!istype(H)) return diff --git a/code/game/objects/items/spirit_board.dm b/code/game/objects/items/spirit_board.dm index ad90bd0766b..dc3a3ecfb0c 100644 --- a/code/game/objects/items/spirit_board.dm +++ b/code/game/objects/items/spirit_board.dm @@ -19,13 +19,6 @@ spirit_board_pick_letter(user) return TRUE -//ATTACK GHOST IGNORING PARENT RETURN VALUE -/obj/item/spirit_board/attack_ghost(var/mob/observer/ghost/user) - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - if(cult.max_cult_rating >= CULT_GHOSTS_2) - spirit_board_pick_letter(user) - return ..() - /obj/item/spirit_board/proc/spirit_board_pick_letter(mob/M) if(!spirit_board_checks(M)) return 0 diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 5c5c99d44dc..84734302822 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -38,7 +38,7 @@ use(1) return TRUE - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(!affecting) to_chat(user, SPAN_WARNING("\The [target] is missing that body part!")) @@ -87,6 +87,9 @@ /decl/material/liquid/burn_meds/aloe = 1 ) +/obj/item/stack/medical/bruise_pack/bandage/five + amount = 5 + /obj/item/stack/medical/bruise_pack/bandage/proc/get_poultice_requirement_string() . = list() for(var/reagent in poultice_reagent_requirements) @@ -137,7 +140,7 @@ if(. || !ishuman(target)) return - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(affecting.is_bandaged()) to_chat(user, SPAN_WARNING("The wounds on [target]'s [affecting.name] have already been bandaged.")) @@ -206,13 +209,16 @@ desc = "A bandage soaked in a medicinal herbal mixture, good for treating burns and preventing infections." animal_heal = 3 +/obj/item/stack/medical/ointment/poultice/five + amount = 5 + /obj/item/stack/medical/ointment/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) . = ..() if(. || !ishuman(target)) return - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(affecting.is_salved()) to_chat(user, SPAN_WARNING("The wounds on [target]'s [affecting.name] have already been salved.")) @@ -252,7 +258,7 @@ if(. || !ishuman(target)) return - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(affecting.is_bandaged() && affecting.is_disinfected()) to_chat(user, SPAN_WARNING("The wounds on [target]'s [affecting.name] have already been treated.")) @@ -318,7 +324,7 @@ if(. || !ishuman(target)) return - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(affecting.is_salved()) @@ -365,7 +371,7 @@ if(. || !ishuman(target)) return - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(!(affecting.organ_tag in splintable_organs)) @@ -405,7 +411,7 @@ var/obj/item/stack/medical/splint/S = split(1, TRUE) if(S) if(affecting.apply_splint(S)) - target.verbs += /mob/living/carbon/human/proc/remove_splints + target.verbs += /mob/living/human/proc/remove_splints S.forceMove(affecting) if (target != user) user.visible_message( @@ -465,7 +471,7 @@ /obj/item/stack/medical/resin/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) . = ..() if(!. && ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if((affecting.brute_dam + affecting.burn_dam) <= 0) to_chat(user, SPAN_WARNING("\The [target]'s [affecting.name] is undamaged.")) diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 126bb03d354..7a6097b9741 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -28,7 +28,7 @@ return TRUE if (ishuman(target)) //Repairing robolimbs - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/S = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(!S) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index f0b3cbcec9d..42c0a126138 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -127,7 +127,7 @@ var/datum/stack_recipe_list/recipe_list = recipes if (istype(recipe_list)) popup_title = "Crafting [recipe_list.name] with \the [src]" - dat += "

Back

" + dat += "

Back

" recipes = recipe_list.recipes else if(islist(recipes) && length(recipes)) popup_title = "Crafting with \the [src]" @@ -412,6 +412,11 @@ if (amount < max_amount) . = CEILING(. * amount / max_amount) +/obj/item/stack/get_mass() // Scales mass to stack size + . = ..() + if (amount < max_amount) + . *= amount / max_amount // Don't round, this can be non-integer + /obj/item/stack/attack_hand(mob/user) if(!user.is_holding_offhand(src) || !can_split()) return ..() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index cdf8cd13c7f..5e9d3407731 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -64,7 +64,8 @@ to_chat(user, "It's [reagents?.total_volume > 0? "filled with liquid sloshing around" : "empty"].") /obj/item/chems/water_balloon/on_reagent_change() - ..() + if(!(. = ..())) + return w_class = (reagents?.total_volume > 0)? ITEM_SIZE_SMALL : ITEM_SIZE_TINY //#TODO: Maybe acids should handle eating their own containers themselves? for(var/reagent in reagents?.reagent_volumes) @@ -186,7 +187,7 @@ /obj/item/toy/snappop/Crossed(atom/movable/AM) //i guess carp and shit shouldn't set them off - var/mob/living/carbon/M = AM + var/mob/living/M = AM if(!istype(M) || MOVING_DELIBERATELY(M)) return to_chat(M, SPAN_WARNING("You step on the snap pop!")) diff --git a/code/game/objects/items/waterskin.dm b/code/game/objects/items/waterskin.dm index a40bda467c4..e06e6b92737 100644 --- a/code/game/objects/items/waterskin.dm +++ b/code/game/objects/items/waterskin.dm @@ -11,3 +11,10 @@ desc = "A long and rather unwieldly water-carrying vessel." material = /decl/material/solid/organic/leather material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + +/obj/item/chems/waterskin/crafted/wine + name = "wineskin" + +/obj/item/chems/waterskin/crafted/wine/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/ethanol/wine, reagents?.total_volume) diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index ef23bc0840b..dc10c366ad4 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -128,7 +128,7 @@ AI MODULES /obj/item/aiModule/oneHuman/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) var/law = "Only [targetName] is a crew member." - if (!target.is_traitor()) // Makes sure the AI isn't a traitor before changing their law 0. --NeoFite + if (!target.is_malfunctioning()) // Makes sure the AI isn't a traitor before changing their law 0. --NeoFite to_chat(target, law) target.set_zeroth_law(law) global.lawchanges.Add("The law specified [targetName]") @@ -232,7 +232,7 @@ AI MODULES /obj/item/aiModule/reset/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) log_law_changes(target, sender) - if (!target.is_traitor()) + if (!target.is_malfunctioning()) target.set_zeroth_law("") target.laws.clear_supplied_laws() target.laws.clear_ion_laws() @@ -250,7 +250,7 @@ AI MODULES /obj/item/aiModule/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) log_law_changes(target, sender) - if (!target.is_traitor()) + if (!target.is_malfunctioning()) target.set_zeroth_law("") target.laws.clear_supplied_laws() target.laws.clear_ion_laws() diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm index 551a70bb1eb..f376f6ca8a3 100644 --- a/code/game/objects/items/weapons/RPD.dm +++ b/code/game/objects/items/weapons/RPD.dm @@ -95,11 +95,11 @@ var/global/list/rpd_pipe_selection_skilled = list() . = list() . += "" if(color_options) - . += "" + . += "" for(var/category in pipe_categories) . += "" for(var/datum/fabricator_recipe/pipe/pipe in pipe_categories[category]) - . += "" + . += "" .+= "
Color[pipe_color]
Color[pipe_color]
[category]
[pipe.name][P.type == pipe.type ? "Select" : "Select"]
[pipe.name][P.type == pipe.type ? "Select" : "Select"]
" . = JOINTEXT(.) diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm index 4685f8b12b2..e7e5cb527e9 100644 --- a/code/game/objects/items/weapons/autopsy.dm +++ b/code/game/objects/items/weapons/autopsy.dm @@ -17,13 +17,13 @@ /obj/item/scanner/autopsy/is_valid_scan_target(atom/O) return ishuman(O) || istype(O, /obj/item/organ/external) -/obj/item/scanner/autopsy/do_surgery(mob/living/carbon/M, mob/living/user, fuckup_prob) +/obj/item/scanner/autopsy/do_surgery(mob/living/M, mob/living/user, fuckup_prob) if(istype(M)) scan(M,user) /obj/item/scanner/autopsy/scan(atom/A, mob/user) if(ishuman(A)) - var/mob/living/carbon/human/M = A + var/mob/living/human/M = A set_target(M, user) timeofdeath = M.timeofdeath var/obj/item/organ/external/S = GET_EXTERNAL_ORGAN(M, user.get_target_zone()) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index f69317716b5..8768807db9e 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -263,7 +263,7 @@ var/global/const/NO_EMAG_ACT = -50 id_card.dna_hash = get_unique_enzymes() || "Unset" id_card.fingerprint_hash = get_full_print(ignore_blockers = TRUE) || "Unset" -/mob/living/carbon/human/set_id_info(var/obj/item/card/id/id_card) +/mob/living/human/set_id_info(var/obj/item/card/id/id_card) ..() id_card.age = get_age() if(global.using_map.flags & MAP_HAS_BRANCH) diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index 03fe2b6375b..75851fa02da 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -99,7 +99,7 @@ if(..()) return 1 - var/user = usr + var/mob/user = usr if(href_list["electronic_warfare"]) electronic_warfare = text2num(href_list["electronic_warfare"]) to_chat(user, "Electronic warfare [electronic_warfare ? "enabled" : "disabled"].") @@ -146,9 +146,7 @@ if("Blood Type") var/default = blood_type if(default == initial(blood_type) && ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.dna) - default = H.dna.b_type + default = user.get_blood_type() var/new_blood_type = sanitize(input(user,"What blood type would you like to be written on this card?","Agent Card Blood Type",default) as null|text) if(!isnull(new_blood_type) && CanUseTopic(user, state)) src.blood_type = new_blood_type @@ -157,7 +155,7 @@ if("DNA Hash") var/default = dna_hash if(default == initial(dna_hash) && ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/unique_enzymes = H.get_unique_enzymes() if(unique_enzymes) default = unique_enzymes @@ -169,7 +167,7 @@ if("Fingerprint Hash") var/default = fingerprint_hash if(default == initial(fingerprint_hash) && ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user default = H.get_full_print(ignore_blockers = TRUE) var/new_fingerprint_hash = sanitize(input(user,"What fingerprint hash would you like to be written on this card?","Agent Card Fingerprint Hash",default) as null|text) if(!isnull(new_fingerprint_hash) && CanUseTopic(user, state)) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 62d19120866..35bee56b109 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -105,7 +105,7 @@ set name = "Toggle Paddles" set category = "Object" - var/mob/living/carbon/human/user = usr + var/mob/living/human/user = usr if(!paddles) to_chat(user, "The paddles are missing!") return @@ -246,18 +246,18 @@ return 1 //Checks for various conditions to see if the mob is revivable -/obj/item/shockpaddles/proc/can_defib(mob/living/carbon/human/H) //This is checked before doing the defib operation +/obj/item/shockpaddles/proc/can_defib(mob/living/human/H) //This is checked before doing the defib operation if(H.has_body_flag(BODY_FLAG_NO_DEFIB)) return "buzzes, \"Unrecogized physiology. Operation aborted.\"" if(!check_contact(H)) return "buzzes, \"Patient's chest is obstructed. Operation aborted.\"" -/obj/item/shockpaddles/proc/can_revive(mob/living/carbon/human/H) //This is checked right before attempting to revive +/obj/item/shockpaddles/proc/can_revive(mob/living/human/H) //This is checked right before attempting to revive if(H.stat == DEAD) return "buzzes, \"Resuscitation failed - Severe neurological decay makes recovery of patient impossible. Further attempts futile.\"" -/obj/item/shockpaddles/proc/check_contact(mob/living/carbon/human/H) +/obj/item/shockpaddles/proc/check_contact(mob/living/human/H) if(!combat) for(var/slot in list(slot_wear_suit_str, slot_w_uniform_str)) var/obj/item/clothing/cloth = H.get_equipped_item(slot) @@ -265,7 +265,7 @@ return FALSE return TRUE -/obj/item/shockpaddles/proc/check_blood_level(mob/living/carbon/human/H) +/obj/item/shockpaddles/proc/check_blood_level(mob/living/human/H) if(H.should_have_organ(BP_HEART)) var/obj/item/organ/internal/heart = GET_INTERNAL_ORGAN(H, BP_HEART) if(!heart || H.get_blood_volume() < BLOOD_VOLUME_SURVIVE) @@ -281,7 +281,7 @@ /obj/item/shockpaddles/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(!ishuman(target) || user.a_intent == I_HURT) return ..() //Do a regular attack. Harm intent shocking happens as a hit effect - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(can_use(user, H)) busy = 1 update_icon() @@ -306,7 +306,7 @@ return ..() // This proc is used so that we can return out of the revive process while ensuring that busy and update_icon() are handled -/obj/item/shockpaddles/proc/do_revive(mob/living/carbon/human/H, mob/living/user) +/obj/item/shockpaddles/proc/do_revive(mob/living/human/H, mob/living/user) if(H.ssd_check()) to_chat(find_dead_player(H.ckey, 1), "Someone is attempting to resuscitate you. Re-enter your body if you want to be revived!") @@ -367,7 +367,7 @@ ADJ_STATUS(H, STAT_ASLEEP, -60) log_and_message_admins("used \a [src] to revive [key_name(H)].") -/obj/item/shockpaddles/proc/lowskill_revive(mob/living/carbon/human/H, mob/living/user) +/obj/item/shockpaddles/proc/lowskill_revive(mob/living/human/H, mob/living/user) if(prob(60)) playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 100, 1, -1) H.electrocute_act(burn_damage_amt*4, src, def_zone = BP_CHEST) @@ -381,7 +381,7 @@ return 0 return 1 -/obj/item/shockpaddles/proc/do_electrocute(mob/living/carbon/human/H, mob/user, var/target_zone) +/obj/item/shockpaddles/proc/do_electrocute(mob/living/human/H, mob/user, var/target_zone) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, check_zone(target_zone, H, TRUE)) //Shouldn't defib someone's eyes or mouth if(!affecting) to_chat(user, SPAN_WARNING("They are missing that body part!")) diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index 774f77c4230..27c1098d226 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -96,23 +96,23 @@ idle ++ if(ishuman(loc)) - var/mob/living/carbon/human/C = loc + var/mob/living/human/user = loc if (!lit || !ec_cartridge || !ec_cartridge.reagents.total_volume)//no cartridge if(!ec_cartridge.reagents.total_volume) - to_chat(C, SPAN_NOTICE("There's no liquid left in \the [src], so you shut it down.")) + to_chat(user, SPAN_NOTICE("There's no liquid left in \the [src], so you shut it down.")) Deactivate() return - if (src == C.get_equipped_item(slot_wear_mask_str) && C.check_has_mouth()) //transfer, but only when not disabled + if (src == user.get_equipped_item(slot_wear_mask_str) && user.check_has_mouth()) //transfer, but only when not disabled idle = 0 //here we'll reduce battery by usage, and check powerlevel - you only use batery while smoking var/obj/item/cell/cell = get_cell() if(!cell?.checked_use(power_usage * CELLRATE)) //if this passes, there's not enough power in the battery Deactivate() - to_chat(C,SPAN_NOTICE("\The [src]'s power meter flashes a low battery warning and shuts down.")) + to_chat(user,SPAN_NOTICE("\The [src]'s power meter flashes a low battery warning and shuts down.")) return - ec_cartridge.reagents.trans_to_mob(C, REM, CHEM_INHALE, 0.4) // Most of it is not inhaled... balance reasons. + ec_cartridge.reagents.trans_to_mob(user, REM, CHEM_INHALE, 0.4) // Most of it is not inhaled... balance reasons. /obj/item/clothing/mask/smokable/ecig/on_update_icon() . = ..() diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 27695944548..375674a32f9 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -47,7 +47,7 @@ /obj/item/plastique/afterattack(atom/movable/target, mob/user, flag) if (!flag) return - if (ismob(target) || target.storage || istype(target, /obj/item/clothing/webbing) || istype(target, /obj/item/clothing/under)) + if (ismob(target) || target.storage || istype(target, /obj/item/clothing/webbing)) return if(isturf(target)) var/turf/target_turf = target diff --git a/code/game/objects/items/weapons/grenades/decompiler.dm b/code/game/objects/items/weapons/grenades/decompiler.dm index 4414fc75715..143341ed3f2 100644 --- a/code/game/objects/items/weapons/grenades/decompiler.dm +++ b/code/game/objects/items/weapons/grenades/decompiler.dm @@ -99,7 +99,7 @@ thing = pick(options) if(ishuman(thing)) - var/mob/living/carbon/human/H = thing + var/mob/living/human/H = thing for(var/obj/item/organ/external/limb in H.get_external_organs()) if(BP_IS_PROSTHETIC(limb) && !length(limb.children)) limb.dismember() diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index c7c7118e127..1aef86677a8 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -11,7 +11,7 @@ var/list/objs = list() var/turf/T = get_turf(src) get_mobs_and_objs_in_view_fast(T, 7, victims, objs) - for(var/mob/living/carbon/M in victims) + for(var/mob/living/M in victims) bang(T, M) for(var/obj/effect/blob/B in objs) //Blob damage here @@ -26,7 +26,7 @@ // Called during the loop that bangs people in lockers/containers and when banging // people in normal view. Could theroetically be called during other explosions. // -- Polymorph -/obj/item/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/carbon/M) +/obj/item/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/M) to_chat(M, SPAN_DANGER("BANG")) playsound(src, 'sound/weapons/flashbang.ogg', 100) diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index b36e3360b4a..763eb23c7d8 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -39,7 +39,7 @@ add_overlay("[icon_state]-pin") /obj/item/grenade/proc/clown_check(var/mob/living/user) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, "Huh? How does this thing work?") det_time = fail_det_time activate(user) @@ -70,7 +70,7 @@ if(active) return if(user) - msg_admin_attack("[user.name] ([user.ckey]) primed \a [src] (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) primed \a [src] (JMP)") active = TRUE update_icon() playsound(loc, arm_sound, 75, 0, -3) diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 543bbe5fac4..8df73ff611f 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -10,7 +10,7 @@ if(spawner_type && deliveryamt) var/turf/T = get_turf(src) playsound(T, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(T, null)) + for(var/mob/living/human/M in viewers(T, null)) if(M.eyecheck() < FLASH_PROTECTION_MODERATE) M.flash_eyes() for(var/i = 1 to deliveryamt) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 17fd8e19b76..c6ed2f13008 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -43,14 +43,14 @@ if(!user.check_dexterity(DEXTERITY_COMPLEX_TOOLS)) return ..() - if ((MUTATION_CLUMSY in user.mutations) && prob(50)) + if (user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, SPAN_WARNING("You can't figure out how to work \the [src]...")) place_handcuffs(user, user) return TRUE // only humans can be cuffed for now if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(!H.get_equipped_item(slot_handcuffed_str)) if (H == user) place_handcuffs(user, user) @@ -67,10 +67,10 @@ return ..() -/obj/item/handcuffs/proc/place_handcuffs(var/mob/living/carbon/target, var/mob/user) +/obj/item/handcuffs/proc/place_handcuffs(var/mob/living/target, var/mob/user) playsound(src.loc, cuff_sound, 30, 1, -2) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(!istype(H)) return 0 @@ -110,11 +110,11 @@ return 1 var/global/last_chew = 0 //#FIXME: Its funny how only one person in the world can chew their restraints every 2.6 seconds -/mob/living/carbon/human/RestrainedClickOn(var/atom/A) +/mob/living/human/RestrainedClickOn(var/atom/A) if (A != src) return ..() if (last_chew + 26 > world.time) return - var/mob/living/carbon/human/H = A + var/mob/living/human/H = A if (!H.get_equipped_item(slot_handcuffed_str)) return if (H.a_intent != I_HURT) return if (H.get_target_zone() != BP_MOUTH) return diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index a874cd25b11..1654b567aa2 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -47,7 +47,7 @@ return TRUE /obj/item/implant/proc/can_implant(mob/M, mob/user, var/target_zone) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H) && !GET_EXTERNAL_ORGAN(H, target_zone)) to_chat(user, "\The [M] is missing that body part.") return FALSE @@ -55,7 +55,7 @@ /obj/item/implant/proc/implant_in_mob(mob/M, var/target_zone) if (ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(H, target_zone) if(affected) LAZYADD(affected.implants, src) diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 843c6cdad87..38ad44810d1 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -14,7 +14,7 @@ var/max_implants = 5 var/injection_cooldown = 600 var/replenish_cooldown = 6000 - var/mob/living/carbon/occupant = null + var/mob/living/occupant = null var/injecting = 0 /obj/machinery/implantchair/Initialize() @@ -39,9 +39,9 @@ var/dat ="Implanter Status
" dat +="Current occupant: [src.occupant ? "
Name: [src.occupant]
Health: [health_text]
" : "None"]
" - dat += "Implants: [src.implant_list.len ? "[implant_list.len]" : "Replenish"]
" + dat += "Implants: [src.implant_list.len ? "[implant_list.len]" : "Replenish"]
" if(src.occupant) - dat += "[src.ready ? "Implant" : "Recharging"]
" + dat += "[src.ready ? "Implant" : "Recharging"]
" user.set_machine(src) show_browser(user, dat, "window=implant") onclose(user, "implant") diff --git a/code/game/objects/items/weapons/implants/implants/chem.dm b/code/game/objects/items/weapons/implants/implants/chem.dm index 5b43f65f0a7..882ac22ddcc 100644 --- a/code/game/objects/items/weapons/implants/implants/chem.dm +++ b/code/game/objects/items/weapons/implants/implants/chem.dm @@ -36,7 +36,7 @@ var/global/list/chem_implants = list() if(malfunction || (!ishuman(imp_in))) return 0 if(!amount) amount = rand(1,25) - var/mob/living/carbon/R = imp_in + var/mob/living/R = imp_in reagents.trans_to_mob(R, amount, CHEM_INJECT) to_chat(R, "You hear a faint *beep*.") diff --git a/code/game/objects/items/weapons/implants/implants/compressed.dm b/code/game/objects/items/weapons/implants/implants/compressed.dm index fea7ee66170..e9872331439 100644 --- a/code/game/objects/items/weapons/implants/implants/compressed.dm +++ b/code/game/objects/items/weapons/implants/implants/compressed.dm @@ -71,7 +71,7 @@ to_chat(user, "The matter compressor safeties prevent you from doing that.") return if(ishuman(A.loc)) - var/mob/living/carbon/human/H = A.loc + var/mob/living/human/H = A.loc if(!H.try_unequip(A)) return else if(isobj(A.loc) && A.loc.storage) diff --git a/code/game/objects/items/weapons/implants/implants/explosive.dm b/code/game/objects/items/weapons/implants/implants/explosive.dm index fbfc602d928..44bd35c5236 100644 --- a/code/game/objects/items/weapons/implants/implants/explosive.dm +++ b/code/game/objects/items/weapons/implants/implants/explosive.dm @@ -120,10 +120,10 @@ playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3) if(ismob(imp_in)) imp_in.audible_message("Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!") - log_and_message_admins("Explosive implant triggered in [imp_in] ([imp_in.key]). (JMP) ") + log_and_message_admins("Explosive implant triggered in [imp_in] ([imp_in.key]). (JMP) ") else audible_message("[src] beeps omniously!") - log_and_message_admins("Explosive implant triggered in [T.loc]. (JMP) ") + log_and_message_admins("Explosive implant triggered in [T.loc]. (JMP) ") if(!elevel) elevel = "Full Explosion" diff --git a/code/game/objects/items/weapons/implants/implants/freedom.dm b/code/game/objects/items/weapons/implants/implants/freedom.dm index 9c98d34f961..720acd8685f 100644 --- a/code/game/objects/items/weapons/implants/implants/freedom.dm +++ b/code/game/objects/items/weapons/implants/implants/freedom.dm @@ -29,7 +29,7 @@ . = ..() uses = rand(1, 5) -/obj/item/implant/freedom/trigger(emote, mob/living/carbon/source) +/obj/item/implant/freedom/trigger(emote, mob/living/source) if (emote == activation_emote) activate() @@ -39,7 +39,7 @@ uses-- to_chat(imp_in, "You feel a faint click.") -/obj/item/implant/freedom/proc/remove_cuffs_and_unbuckle(mob/living/carbon/user) +/obj/item/implant/freedom/proc/remove_cuffs_and_unbuckle(mob/living/user) var/obj/cuffs = user.get_equipped_item(slot_handcuffed_str) if(!cuffs) return 0 @@ -48,7 +48,7 @@ user.buckled.unbuckle_mob() return -/obj/item/implant/freedom/implanted(mob/living/carbon/source) +/obj/item/implant/freedom/implanted(mob/living/source) src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_v", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") source.StoreMemory("Freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", /decl/memory_options/system) to_chat(source, "The implanted freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.") diff --git a/code/game/objects/items/weapons/implants/implants/imprinting.dm b/code/game/objects/items/weapons/implants/implants/imprinting.dm index 76e7ac49e30..f493ae39ffa 100644 --- a/code/game/objects/items/weapons/implants/implants/imprinting.dm +++ b/code/game/objects/items/weapons/implants/implants/imprinting.dm @@ -40,7 +40,7 @@ interact(usr) /obj/item/implant/imprinting/implanted(mob/M) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(!istype(H)) return FALSE if(H.reagents.has_reagent(/decl/material/liquid/hallucinogenics)) @@ -103,7 +103,7 @@ . = ..() /obj/item/implant/imprinting/can_implant(mob/M, mob/user, target_zone) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H)) var/obj/item/organ/internal/B = GET_INTERNAL_ORGAN(H, BP_BRAIN) if(!B || H.isSynthetic()) diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index b5f2ca93aed..3cc95aafa94 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -17,7 +17,7 @@ thrown_material_force_multiplier = 1 // as above /obj/item/kitchen/rollingpin/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if ((MUTATION_CLUMSY in user.mutations) && prob(50) && user.try_unequip(src)) + if (user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50) && user.try_unequip(src)) to_chat(user, SPAN_DANGER("\The [src] slips out of your hand and hits your head.")) user.take_organ_damage(10) SET_STATUS_MAX(user, STAT_PARA, 2) diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 6d851c6c380..9d3be162f02 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -40,7 +40,7 @@ /obj/item/knife/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(user.a_intent != I_HELP && user.get_target_zone() == BP_EYES) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) target = user return eyestab(target, user) return ..() diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index 351271e33ba..7de5bdf7c53 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -25,7 +25,7 @@ /obj/item/shard/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) . = ..() if(. && !has_handle && ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(!H.get_equipped_item(slot_gloves_str) && !(H.species.species_flags & SPECIES_FLAG_NO_MINOR_CUT)) var/obj/item/organ/external/hand = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) if(istype(hand) && !BP_IS_PROSTHETIC(hand)) diff --git a/code/game/objects/items/weapons/material/stick.dm b/code/game/objects/items/weapons/material/stick.dm index 6684af58921..e1c16a7b476 100644 --- a/code/game/objects/items/weapons/material/stick.dm +++ b/code/game/objects/items/weapons/material/stick.dm @@ -26,7 +26,11 @@ if(!sharp && (istype(W, /obj/item/stack/material/bolt) || istype(W, /obj/item/stack/material/bundle))) + // Ugly way to check for dried grass vs regular grass. var/obj/item/stack/material/fuel = W + if(!fuel.special_crafting_check()) + return ..() + if(fuel.get_amount() < 5) to_chat(user, SPAN_WARNING("You need at least five units of flammable material to create a torch.")) return TRUE diff --git a/code/game/objects/items/weapons/material/thrown.dm b/code/game/objects/items/weapons/material/thrown.dm index 7f48d61fe0d..54ebd199db3 100644 --- a/code/game/objects/items/weapons/material/thrown.dm +++ b/code/game/objects/items/weapons/material/thrown.dm @@ -28,6 +28,3 @@ . = ..() if(user.a_intent == I_HURT) user.mob_throw_item(target, src) - -/obj/item/star/ninja - material = /decl/material/solid/metal/uranium diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 1eee7a8b338..dbfd004126f 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -138,7 +138,7 @@ /obj/item/energy_blade/attack_self(mob/user) if(active) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) var/decl/pronouns/G = user.get_pronouns() user.visible_message( \ SPAN_DANGER("\The [user] accidentally cuts [G.self] with \the [src]."), \ diff --git a/code/game/objects/items/weapons/melee/energy_ninja.dm b/code/game/objects/items/weapons/melee/energy_projected.dm similarity index 68% rename from code/game/objects/items/weapons/melee/energy_ninja.dm rename to code/game/objects/items/weapons/melee/energy_projected.dm index 16aeefa1a15..b99cfa35cc3 100644 --- a/code/game/objects/items/weapons/melee/energy_ninja.dm +++ b/code/game/objects/items/weapons/melee/energy_projected.dm @@ -1,4 +1,4 @@ -/obj/item/energy_blade/ninja +/obj/item/energy_blade/projected anchored = TRUE // Never spawned outside of inventory, should be fine. armor_penetration = 100 @@ -18,37 +18,37 @@ var/mob/living/creator -/obj/item/energy_blade/ninja/Initialize() +/obj/item/energy_blade/projected/Initialize() . = ..() if(!ismob(loc)) return INITIALIZE_HINT_QDEL -/obj/item/energy_blade/ninja/is_special_cutting_tool(var/high_power) +/obj/item/energy_blade/projected/is_special_cutting_tool(var/high_power) return active -/obj/item/energy_blade/ninja/get_storage_cost() +/obj/item/energy_blade/projected/get_storage_cost() return ITEM_SIZE_NO_CONTAINER -/obj/item/energy_blade/ninja/attack_self(mob/user) +/obj/item/energy_blade/projected/attack_self(mob/user) user.drop_from_inventory(src) -/obj/item/energy_blade/ninja/equipped(mob/user, slot) +/obj/item/energy_blade/projected/equipped(mob/user, slot) . = ..() check_loc() -/obj/item/energy_blade/ninja/dropped() +/obj/item/energy_blade/projected/dropped() . = ..() check_loc() -/obj/item/energy_blade/ninja/on_picked_up(mob/user) +/obj/item/energy_blade/projected/on_picked_up(mob/user) . = ..() check_loc() -/obj/item/energy_blade/ninja/Move() +/obj/item/energy_blade/projected/Move() . = ..() if(.) check_loc() -/obj/item/energy_blade/ninja/proc/check_loc() +/obj/item/energy_blade/projected/proc/check_loc() if(!QDELETED(src) && (loc != creator || !(src in creator?.get_held_items()))) qdel(src) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index cd9df371ddc..4927c4d7e35 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -16,9 +16,8 @@ var/mopspeed = 40 var/list/moppable_types = list( /obj/effect/decal/cleanable, - /obj/effect/rune, /obj/structure/catwalk - ) + ) /obj/item/mop/Initialize() . = ..() diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 04dba8b0567..506dd56d7a1 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -33,7 +33,7 @@ return 1 if (!ishuman(usr)) return 1 - var/mob/living/carbon/human/H = usr + var/mob/living/human/H = usr if ((usr == src.loc || (in_range(src, usr) && isturf(src.loc)))) usr.set_machine(src) if (href_list["spell_teleport"]) diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 3342015c383..52d00914113 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -185,7 +185,7 @@ return base_block_chance /obj/item/shield/energy/attack_self(mob/user) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, SPAN_DANGER("You beat yourself in the head with [src].")) if(isliving(user)) var/mob/living/M = user @@ -206,7 +206,7 @@ to_chat(user, SPAN_NOTICE("\The [src] can now be concealed.")) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user H.update_inhand_overlays() add_fingerprint(user) diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 7a79fcdd480..206de3f19be 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -89,7 +89,7 @@ //attack_as_weapon /obj/item/soap/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(ishuman(target) && user?.a_intent != I_HURT) - var/mob/living/carbon/human/victim = target + var/mob/living/human/victim = target if(user.get_target_zone() == BP_MOUTH && victim.check_has_mouth()) user.visible_message(SPAN_DANGER("\The [user] washes \the [target]'s mouth out with soap!")) if(reagents) diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index e5abe0ca5af..821efe92ddb 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -118,6 +118,7 @@ desc = "A simple sack for carrying goods." icon = 'icons/obj/items/storage/sack.dmi' icon_state = ICON_STATE_WORLD + w_class = ITEM_SIZE_SMALL slot_flags = SLOT_LOWER_BODY | SLOT_BACK storage = /datum/storage/bag/sack material = /decl/material/solid/organic/leather diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 5716aa9d063..c18a442a2fb 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -188,15 +188,6 @@ sound_in = 'sound/effects/holster/sheathin.ogg' sound_out = 'sound/effects/holster/sheathout.ogg' -/obj/item/belt/soulstone - name = "soul stone belt" - desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away." - icon = 'icons/clothing/belt/soulstones.dmi' - storage = /datum/storage/belt/soulstone - -/obj/item/belt/soulstone/full/WillContain() - return list(/obj/item/soulstone = max(1, storage?.storage_slots)) - /obj/item/belt/champion name = "championship belt" desc = "Proves to the world that you are the strongest!" diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 69b9d526978..2ff5ece8a7b 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -99,12 +99,12 @@ /obj/item/bible/attack_self(mob/user) if(!ishuman(user)) return - var/mob/living/carbon/human/preacher = user + var/mob/living/human/preacher = user if(preacher.mind?.assigned_job?.is_holy) preacher.visible_message("\The [preacher] begins to read a passage from \the [src]...", "You begin to read a passage from \the [src]...") if(do_after(preacher, 5 SECONDS)) preacher.visible_message("\The [preacher] reads a passage from \the [src].", "You read a passage from \the [src].") - for(var/mob/living/carbon/human/H in view(preacher)) + for(var/mob/living/human/H in view(preacher)) if(preacher.get_cultural_value(TAG_RELIGION) == H.get_cultural_value(TAG_RELIGION)) to_chat(H, SPAN_NOTICE("You feel calm and relaxed, at one with the universe.")) diff --git a/code/game/objects/items/weapons/storage/laundry_basket.dm b/code/game/objects/items/weapons/storage/laundry_basket.dm index 4726adb6724..72994a875c1 100644 --- a/code/game/objects/items/weapons/storage/laundry_basket.dm +++ b/code/game/objects/items/weapons/storage/laundry_basket.dm @@ -18,7 +18,7 @@ /obj/item/laundry_basket/attack_hand(mob/user) if(!ishuman(user)) return ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/obj/item/organ/external/temp = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) if(!temp) to_chat(user, SPAN_WARNING("You need two hands to pick this up!")) diff --git a/code/game/objects/items/weapons/storage/med_pouch.dm b/code/game/objects/items/weapons/storage/med_pouch.dm index 00dc036406c..911e67d2ab9 100644 --- a/code/game/objects/items/weapons/storage/med_pouch.dm +++ b/code/game/objects/items/weapons/storage/med_pouch.dm @@ -40,7 +40,7 @@ Single Use Emergency Pouches /obj/item/med_pouch/examine(mob/user) . = ..() - to_chat(user, "Please read instructions before use.") + to_chat(user, "Please read instructions before use.") /obj/item/med_pouch/CanUseTopic() return STATUS_INTERACTIVE diff --git a/code/game/objects/items/weapons/storage/wall_mirror.dm b/code/game/objects/items/weapons/storage/wall_mirror.dm index 36215e0a7ff..f86be796183 100644 --- a/code/game/objects/items/weapons/storage/wall_mirror.dm +++ b/code/game/objects/items/weapons/storage/wall_mirror.dm @@ -38,7 +38,7 @@ . = ..() flick("mirror_open",src) -/obj/structure/mirror/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/structure/mirror/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(prob(damage)) visible_message(SPAN_WARNING("[src] shatters!")) shatter() diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 683c1f12a31..0c131d9bce3 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -95,7 +95,7 @@ update_icon() /obj/item/baton/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(status && (MUTATION_CLUMSY in user.mutations) && prob(50)) + if(status && user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, SPAN_DANGER("You accidentally hit yourself with the [src]!")) SET_STATUS_MAX(user, STAT_WEAK, 30) deductcharge(hitcost) @@ -110,7 +110,7 @@ var/stun = stunforce var/obj/item/organ/external/affecting = null if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target affecting = GET_EXTERNAL_ORGAN(H, hit_zone) var/abuser = user ? "" : "by [user]" if(user && user.a_intent == I_HURT) @@ -144,7 +144,7 @@ deductcharge(hitcost) if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target H.forcesay(global.hit_appends) return 1 diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 2b072c46221..7e3258fd4e5 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -18,11 +18,11 @@ material = /decl/material/solid/organic/wood /obj/item/classic_baton/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if ((MUTATION_CLUMSY in user.mutations) && prob(50)) + if (user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, SPAN_WARNING("You club yourself over the head.")) SET_STATUS_MAX(user, STAT_WEAK, (3 * force)) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user H.apply_damage(2*force, BRUTE, BP_HEAD) else user.take_organ_damage(2*force) @@ -74,11 +74,11 @@ icon = 'icons/obj/items/weapon/telebaton.dmi' /obj/item/telebaton/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(on && (MUTATION_CLUMSY in user.mutations) && prob(50)) + if(on && user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, SPAN_DANGER("You club yourself over the head.")) SET_STATUS_MAX(user, STAT_WEAK, (3 * force)) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user H.apply_damage(2*force, BRUTE, BP_HEAD) else user.take_organ_damage(2*force) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 734e3e27551..2fc73deaa51 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -261,7 +261,7 @@ var/global/list/global/tank_gauge_cache = list() if(mask && (mask.item_flags & ITEM_FLAG_AIRTIGHT)) data["maskConnected"] = 1 else if(ishuman(location)) - var/mob/living/carbon/human/H = location + var/mob/living/human/H = location var/obj/item/head = H.get_equipped_item(slot_head_str) if(head && (head.item_flags & ITEM_FLAG_AIRTIGHT)) data["maskConnected"] = 1 @@ -300,7 +300,7 @@ var/global/list/global/tank_gauge_cache = list() /obj/item/tank/proc/toggle_valve(var/mob/user) - var/mob/living/carbon/location + var/mob/living/location if(isliving(loc)) location = loc else if(istype(loc,/obj/item/rig)) @@ -310,7 +310,7 @@ var/global/list/global/tank_gauge_cache = list() else return - if(location.internal == src) + if(location.get_internals() == src) to_chat(user, "You close the tank release valve.") location.set_internals(null) else @@ -319,7 +319,7 @@ var/global/list/global/tank_gauge_cache = list() if(mask && (mask.item_flags & ITEM_FLAG_AIRTIGHT)) can_open_valve = 1 else if(ishuman(location)) - var/mob/living/carbon/human/H = location + var/mob/living/human/H = location var/obj/item/head = H.get_equipped_item(slot_head_str) if(head && (head.item_flags & ITEM_FLAG_AIRTIGHT)) can_open_valve = 1 diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index e95ffde8b89..3762eec3f07 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -35,7 +35,7 @@ Frequency: + +
-Refresh"} +Refresh"} show_browser(user, dat, "window=radio") onclose(user, "radio") return diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm index 69f3db0c647..2a1ef5f107b 100644 --- a/code/game/objects/items/weapons/tools/screwdriver.dm +++ b/code/game/objects/items/weapons/tools/screwdriver.dm @@ -42,7 +42,7 @@ /obj/item/screwdriver/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(user.a_intent == I_HELP || user.get_target_zone() != BP_EYES && user.get_target_zone() != BP_HEAD) return ..() - if((MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) target = user return eyestab(target, user) diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 979613064f7..a5003c4e8fe 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -344,7 +344,7 @@ /obj/item/weldingtool/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/S = GET_EXTERNAL_ORGAN(H, user?.get_target_zone()) if(!S || !S.is_robotic() || user.a_intent != I_HELP) return ..() diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index 3ac790525ab..52c822e88c7 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -32,7 +32,8 @@ . = ..() /obj/item/towel/on_reagent_change() - . = ..() + if(!(. = ..())) + return if(reagents?.total_volume) SetName("damp [initial(name)]") if(!is_processing) diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index eb9c0f18c65..b1825375cde 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -20,48 +20,34 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.do_attack_animation(target) - if(target.mind && LAZYLEN(target.mind.learned_spells)) - target.silence_spells(300) //30 seconds - to_chat(target, SPAN_DANGER("You've been silenced!")) - return TRUE - if (!user.check_dexterity(DEXTERITY_WEAPONS)) return TRUE - if ((MUTATION_CLUMSY in user.mutations) && prob(50)) + if (user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, SPAN_DANGER("The rod slips out of your hand and hits your head.")) user.take_organ_damage(10) SET_STATUS_MAX(user, STAT_PARA, 20) return TRUE - - if(iscultist(target)) - target.visible_message(SPAN_NOTICE("\The [user] waves \the [src] over \the [target]'s head.")) - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.offer_uncult(target) + + if (holy_act(target, user)) return TRUE return ..() +/obj/item/nullrod/proc/holy_act(mob/living/target, mob/living/user) + if(target.mind && LAZYLEN(target.mind.learned_spells)) + target.silence_spells(30 SECONDS) + to_chat(target, SPAN_DANGER("You've been silenced!")) + return TRUE + return FALSE + /obj/item/nullrod/afterattack(var/atom/A, var/mob/user, var/proximity) if(!proximity) return + return A.nullrod_act(user, src) - if(istype(A, /obj/structure/deity/altar)) - var/obj/structure/deity/altar/altar = A - if(!altar.linked_god.silenced) //Don't want them to infinity spam it. - altar.linked_god.silence(10) - new /obj/effect/temporary(get_turf(altar),'icons/effects/effects.dmi',"purple_electricity_constant", 10) - altar.visible_message("\The [altar] groans in protest as reality settles around \the [src].") - - if(istype(A, /turf/wall/cult)) - var/turf/wall/cult/W = A - user.visible_message("\The [user] touches \the [A] with \the [src], and the enchantment affecting it fizzles away.", "You touch \the [A] with \the [src], and the enchantment affecting it fizzles away.") - W.ChangeTurf(/turf/wall) - - if(istype(A, /turf/floor/cult)) - var/turf/floor/cult/F = A - user.visible_message("\The [user] touches \the [A] with \the [src], and the enchantment affecting it fizzles away.", "You touch \the [A] with \the [src], and the enchantment affecting it fizzles away.") - F.ChangeTurf(/turf/floor) +/atom/proc/nullrod_act(mob/user, obj/item/nullrod/rod) + return FALSE /obj/item/energy_net @@ -120,7 +106,7 @@ max_health = 25 var/countdown = 15 var/temporary = 1 - var/mob/living/carbon/captured = null + var/mob/living/captured = null var/min_free_time = 50 var/max_free_time = 85 diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 531d9b598e3..767b6907fb7 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -129,14 +129,18 @@ . |= DAM_LASER /obj/attackby(obj/item/O, mob/user) - if((obj_flags & OBJ_FLAG_ANCHORABLE) && IS_WRENCH(O)) - wrench_floor_bolts(user) + if((obj_flags & OBJ_FLAG_ANCHORABLE) && (IS_WRENCH(O) || IS_HAMMER(O))) + wrench_floor_bolts(user, null, O) update_icon() return TRUE return ..() -/obj/proc/wrench_floor_bolts(mob/user, delay=20) - playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) +/obj/proc/wrench_floor_bolts(mob/user, delay = 2 SECONDS, obj/item/tool) + if(!istype(tool) || IS_WRENCH(tool)) + playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) + else if(IS_HAMMER(tool)) + playsound(loc, 'sound/weapons/Genhit.ogg', 100, 1) + if(anchored) user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") else diff --git a/code/game/objects/random/subtypes/clothing.dm b/code/game/objects/random/subtypes/clothing.dm index 317788bdfec..f9bac2fd1c4 100644 --- a/code/game/objects/random/subtypes/clothing.dm +++ b/code/game/objects/random/subtypes/clothing.dm @@ -123,7 +123,7 @@ /obj/random/suit name = "random suit" desc = "This is a random piece of outerwear." - icon = 'icons/clothing/suit/firesuit.dmi' + icon = 'icons/clothing/suits/firesuit.dmi' icon_state = ICON_STATE_WORLD /obj/random/suit/spawn_choices() @@ -149,22 +149,22 @@ /obj/random/clothing name = "random clothes" desc = "This is a random piece of clothing." - icon = 'icons/clothing/under/jumpsuits/jumpsuit.dmi' + icon = 'icons/clothing/jumpsuits/jumpsuit.dmi' icon_state = ICON_STATE_WORLD /obj/random/clothing/spawn_choices() var/static/list/spawnable_choices = list( - /obj/item/clothing/under/syndicate/tacticool = 2, - /obj/item/clothing/under/syndicate/combat = 1, - /obj/item/clothing/jumpsuit/hazard = 4, - /obj/item/clothing/jumpsuit/sterile = 4, - /obj/item/clothing/pants/casual/camo = 2, - /obj/item/clothing/under/frontier = 2, - /obj/item/clothing/under/harness = 2, - /obj/item/clothing/jumpsuit/medical/paramedic = 2, - /obj/item/clothing/under/overalls = 2, - /obj/item/clothing/head/earmuffs = 2, - /obj/item/clothing/jumpsuit/tactical = 1 + /obj/item/clothing/shirt/syndicate/tacticool = 2, + /obj/item/clothing/shirt/syndicate/combat = 1, + /obj/item/clothing/jumpsuit/hazard = 4, + /obj/item/clothing/jumpsuit/sterile = 4, + /obj/item/clothing/pants/casual/camo = 2, + /obj/item/clothing/shirt/flannel/red = 2, + /obj/item/clothing/shirt/harness = 2, + /obj/item/clothing/jumpsuit/medical/paramedic = 2, + /obj/item/clothing/suit/apron/overalls/laborer = 2, + /obj/item/clothing/head/earmuffs = 2, + /obj/item/clothing/jumpsuit/tactical = 1 ) return spawnable_choices diff --git a/code/game/objects/random/subtypes/maintenance.dm b/code/game/objects/random/subtypes/maintenance.dm index b5a7a5dc72c..0df746fd50a 100644 --- a/code/game/objects/random/subtypes/maintenance.dm +++ b/code/game/objects/random/subtypes/maintenance.dm @@ -94,34 +94,34 @@ something, make sure it's not in one of the other lists.*/ /obj/random/maintenance/engineering/spawn_choices() var/static/list/spawnable_choices = list( - /obj/random/maintenance/clean = 320, - /obj/item/backpack/industrial = 5, - /obj/item/backpack/satchel/eng = 5, - /obj/item/backpack/messenger/engi = 5, - /obj/item/box = 5, - /obj/item/clothing/suit/hazardvest = 4, - /obj/item/clothing/mask/gas/half = 3, - /obj/item/belt/utility = 3, - /obj/item/clothing/head/soft/yellow = 3, - /obj/item/clothing/shoes/workboots = 3, - /obj/item/clothing/head/earmuffs = 3, - /obj/item/backpack/dufflebag/eng = 3, - /obj/item/flashlight/maglight = 2, - /obj/item/clothing/mask/balaclava = 2, - /obj/item/briefcase/inflatable = 2, - /obj/item/belt/utility/full = 2, - /obj/item/clothing/webbing/vest/black = 2, - /obj/item/clothing/under/overalls = 2, - /obj/item/clothing/webbing/vest/brown = 2, - /obj/item/handcuffs = 2, - /obj/item/clothing/mask/bandana/orange = 2, - /obj/item/clothing/head/hardhat/dblue = 2, - /obj/item/clothing/head/hardhat/orange = 2, - /obj/item/clothing/head/welding = 2, - /obj/item/clothing/glasses/welding = 1, - /obj/item/clothing/shoes/magboots = 1, - /obj/item/beartrap = 1, - /obj/item/clothing/webbing/drop_pouches/brown = 1 + /obj/random/maintenance/clean = 320, + /obj/item/backpack/industrial = 5, + /obj/item/backpack/satchel/eng = 5, + /obj/item/backpack/messenger/engi = 5, + /obj/item/box = 5, + /obj/item/clothing/suit/hazardvest = 4, + /obj/item/clothing/mask/gas/half = 3, + /obj/item/belt/utility = 3, + /obj/item/clothing/head/soft/yellow = 3, + /obj/item/clothing/shoes/workboots = 3, + /obj/item/clothing/head/earmuffs = 3, + /obj/item/backpack/dufflebag/eng = 3, + /obj/item/flashlight/maglight = 2, + /obj/item/clothing/mask/balaclava = 2, + /obj/item/briefcase/inflatable = 2, + /obj/item/belt/utility/full = 2, + /obj/item/clothing/webbing/vest/black = 2, + /obj/item/clothing/suit/apron/overalls/laborer = 2, + /obj/item/clothing/webbing/vest/brown = 2, + /obj/item/handcuffs = 2, + /obj/item/clothing/mask/bandana/orange = 2, + /obj/item/clothing/head/hardhat/dblue = 2, + /obj/item/clothing/head/hardhat/orange = 2, + /obj/item/clothing/head/welding = 2, + /obj/item/clothing/glasses/welding = 1, + /obj/item/clothing/shoes/magboots = 1, + /obj/item/beartrap = 1, + /obj/item/clothing/webbing/drop_pouches/brown = 1 ) return spawnable_choices @@ -145,7 +145,7 @@ something, make sure it's not in one of the other lists.*/ /obj/item/flashlight/lantern = 3, /obj/item/clothing/glasses/material = 3, /obj/item/clothing/head/soft/yellow = 3, - /obj/item/clothing/under/syndicate/tacticool = 2, + /obj/item/clothing/shirt/syndicate/tacticool = 2, /obj/item/clothing/webbing/vest/black = 2, /obj/item/clothing/webbing/vest/brown = 2, /obj/item/handcuffs = 2, @@ -154,7 +154,7 @@ something, make sure it's not in one of the other lists.*/ /obj/item/toolbox/syndicate = 1, /obj/item/belt/utility/full = 1, /obj/item/destTagger = 1, - /obj/item/clothing/under/syndicate/combat = 1, + /obj/item/clothing/shirt/syndicate/combat = 1, /obj/item/beartrap = 1 ) return spawnable_choices diff --git a/code/game/objects/random/subtypes/misc.dm b/code/game/objects/random/subtypes/misc.dm index 856f607a637..c02b0490ea8 100644 --- a/code/game/objects/random/subtypes/misc.dm +++ b/code/game/objects/random/subtypes/misc.dm @@ -27,7 +27,7 @@ /obj/item/secure_storage/briefcase/money = 1, /obj/item/box/syndie_kit/cigarette = 1, /obj/item/stack/telecrystal = 1, - /obj/item/clothing/under/syndicate = 2, + /obj/item/clothing/shirt/syndicate = 2, /obj/item/chems/syringe = 3, /obj/item/chems/syringe/steroid = 2, /obj/item/chems/syringe/drugs = 1, diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index fc27cf6d4f0..5d5d9fb88ce 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -121,7 +121,7 @@ set waitfor = FALSE return FALSE -/obj/structure/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/structure/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(current_health == -1) // This object does not take damage. return diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrel.dm index 84aae464c9c..f16a56041f3 100644 --- a/code/game/objects/structures/barrel.dm +++ b/code/game/objects/structures/barrel.dm @@ -19,6 +19,13 @@ ..() return INITIALIZE_HINT_LATELOAD +/obj/structure/reagent_dispensers/barrel/attackby(obj/item/W, mob/user) + . = ..() + if(!. && user.a_intent == I_HELP && reagents?.total_volume > FLUID_PUDDLE) + user.visible_message(SPAN_NOTICE("\The [user] dips \the [W] into \the [reagents.get_primary_reagent_name()].")) + W.fluid_act(reagents) + return TRUE + /obj/structure/reagent_dispensers/barrel/LateInitialize(mapload, ...) ..() if(mapload) @@ -29,7 +36,8 @@ storage.handle_item_insertion(null, thing) /obj/structure/reagent_dispensers/barrel/on_reagent_change() - . = ..() + if(!(. = ..())) + return var/primary_mat = reagents?.get_primary_reagent_name() if(primary_mat) SetName("[material.solid_name] [initial(name)] of [primary_mat]") diff --git a/code/game/objects/structures/charge_pylon.dm b/code/game/objects/structures/charge_pylon.dm index 0d4fbe83d5a..b6afb372e60 100644 --- a/code/game/objects/structures/charge_pylon.dm +++ b/code/game/objects/structures/charge_pylon.dm @@ -19,7 +19,7 @@ /obj/structure/charge_pylon/proc/charge_user(var/mob/living/user) if(next_use > world.time) return next_use = world.time + 10 - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/obj/item/cell/power_cell if(ishuman(user)) var/obj/item/organ/internal/cell/cell = H.get_organ(BP_CELL, /obj/item/organ/internal/cell) diff --git a/code/game/objects/structures/compost.dm b/code/game/objects/structures/compost.dm index 5d92998565f..18ef1e5faf9 100644 --- a/code/game/objects/structures/compost.dm +++ b/code/game/objects/structures/compost.dm @@ -1,6 +1,7 @@ /// The number of worms influences the rate at which contents are decomposed into compost. -var/global/const/COMPOST_WORM_EAT_AMOUNT = 50 -var/global/const/COMPOST_MAX_WORMS = 10 +var/global/const/COMPOST_WORM_EAT_AMOUNT = 50 +var/global/const/COMPOST_MAX_WORMS = 10 +var/global/const/COMPOST_WORM_HUNGER_FACTOR = MINIMUM_CHEMICAL_VOLUME /obj/structure/reagent_dispensers/compost_bin name = "compost bin" @@ -8,11 +9,15 @@ var/global/const/COMPOST_MAX_WORMS = 10 icon = 'icons/obj/structures/compost.dmi' icon_state = ICON_STATE_WORLD anchored = TRUE - atom_flags = ATOM_FLAG_CLIMBABLE | ATOM_FLAG_OPEN_CONTAINER - material = /decl/material/solid/organic/wood + density = TRUE + atom_flags = ATOM_FLAG_CLIMBABLE matter = null + material = /decl/material/solid/organic/wood material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC wrenchable = FALSE + possible_transfer_amounts = @"[10,25,50,100]" + volume = 2000 + can_toggle_open = FALSE storage = /datum/storage/hopper/industrial/compost /obj/structure/reagent_dispensers/compost_bin/Initialize() @@ -28,7 +33,6 @@ var/global/const/COMPOST_MAX_WORMS = 10 qdel(worm) break . = ..() - atom_flags |= ATOM_FLAG_OPEN_CONTAINER // something seems to be unsetting this :( /obj/structure/reagent_dispensers/compost_bin/Destroy() if(is_processing) @@ -186,7 +190,7 @@ var/global/const/COMPOST_MAX_WORMS = 10 if(compost_amount > 0) // Worms gotta eat... if(worms_are_hungry) - reagents.remove_reagent(/decl/material/liquid/fertilizer/compost, worm_drink_amount * 0.025) + reagents.remove_reagent(/decl/material/liquid/fertilizer/compost, worm_drink_amount * COMPOST_WORM_HUNGER_FACTOR) if(prob(1) && worms < COMPOST_MAX_WORMS) var/obj/item/chems/food/worm/worm = new(src) if(!storage.handle_item_insertion(null, worm)) diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 6a3dd44630d..0a3a87ad9c2 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -48,7 +48,7 @@ /obj/item/clothing/mask/gas = 2, /obj/item/clothing/shoes/jackboots/swat = 2, /obj/item/clothing/suit/space/void/swat = 2, - /obj/item/clothing/under/syndicate/tacticool = 2) + /obj/item/clothing/shirt/syndicate/tacticool = 2) /obj/structure/closet/thunderdome name = "\improper Thunderdome closet" diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 5ab8e63b2fa..ba9e023a08e 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -21,9 +21,11 @@ /obj/item/clothing/head/hairflower/pink = 1, /obj/item/clothing/head/hairflower/yellow = 1, /obj/item/clothing/head/hairflower/blue = 1, - /obj/item/clothing/under/sl_suit = 2, - /obj/item/clothing/under/bartender = 2, - /obj/item/clothing/dress/saloon = 1, + /obj/item/clothing/pants/slacks/black = 2, + /obj/item/clothing/shirt/button = 2, + /obj/item/clothing/pants/formal/black = 2, + /obj/item/clothing/shirt/button = 2, + /obj/item/clothing/dress/saloon = 1, /obj/item/clothing/suit/jacket/waistcoat/black = 2, /obj/item/clothing/shoes/color/black = 2 ) @@ -39,10 +41,14 @@ /obj/structure/closet/chefcloset/WillContain() return list( /obj/item/clothing/dress/sun, - /obj/item/clothing/under/waiter = 2, + /obj/item/clothing/pants/slacks/black = 2, + /obj/item/clothing/shirt/button = 2, + /obj/item/clothing/neck/tie/bow/color/red = 2, + /obj/item/clothing/suit/jacket/vest/blue = 2, /obj/item/radio/headset/headset_service = 2, /obj/item/box/mousetraps = 2, - /obj/item/clothing/under/chef, + /obj/item/clothing/pants/slacks, + /obj/item/clothing/shirt/button, /obj/item/clothing/head/chefhat ) @@ -81,9 +87,9 @@ /obj/structure/closet/lawcloset/WillContain() return list( - /obj/item/clothing/under/lawyer, - /obj/item/clothing/under/lawyer/red, - /obj/item/clothing/under/lawyer/bluesuit, + /obj/item/clothing/costume/lawyer, + /obj/item/clothing/costume/lawyer_red, + /obj/item/clothing/costume/lawyer_bluesuit, /obj/item/clothing/pants/slacks/purple, /obj/item/clothing/shirt/button, /obj/item/clothing/suit/jacket/vest/black, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 61242e84882..e869ad6ad8c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -42,7 +42,9 @@ /obj/item/clothing/head/nursehat, /obj/item/clothing/jumpsuit/medical, /obj/item/clothing/dress/nurse = 2, - /obj/item/clothing/under/orderly, + /obj/item/clothing/pants/slacks/white/orderly, + /obj/item/clothing/shirt/button/orderly, + /obj/item/clothing/neck/tie/long/red, /obj/item/clothing/suit/toggle/labcoat, /obj/item/clothing/suit/jacket/first_responder, /obj/item/clothing/shoes/color/white, @@ -152,7 +154,8 @@ /obj/structure/closet/secure_closet/counselor/WillContain() return list( /obj/item/clothing/jumpsuit/psych, - /obj/item/clothing/jumpsuit/psych/turtleneck, + /obj/item/clothing/shirt/sweater/turquoise, + /obj/item/clothing/pants/slacks/navy, /obj/item/clothing/suit/toggle/labcoat, /obj/item/clothing/shoes/color/white, /obj/item/chems/glass/bottle/sedatives, @@ -208,6 +211,7 @@ /obj/item/chems/syringe, /obj/item/pill_bottle/antidepressants, /obj/item/pill_bottle/stimulants, - /obj/item/clothing/jumpsuit/psych/turtleneck, + /obj/item/clothing/shirt/sweater/turquoise, + /obj/item/clothing/pants/slacks/navy, /obj/item/clothing/jumpsuit/psych ) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 71969ecf0c0..72f240443bb 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -69,7 +69,7 @@ return list( /obj/item/backpack/parachute, /obj/item/knife/utility, - /obj/item/clothing/under/pilot, + /obj/item/clothing/jumpsuit/pilot, /obj/item/clothing/suit/jacket/bomber, /obj/item/clothing/mask/gas/half, /obj/item/clothing/shoes/color/black, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index a2fc5f24a91..08ba2e29d23 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -46,14 +46,14 @@ /obj/item/clothing/jumpsuit/head_of_personnel, /obj/item/clothing/dress/hop, /obj/item/clothing/dress/hr, - /obj/item/clothing/under/lawyer, - /obj/item/clothing/under/lawyer/red, - /obj/item/clothing/under/lawyer/oldman, + /obj/item/clothing/costume/lawyer, + /obj/item/clothing/costume/lawyer_red, + /obj/item/clothing/costume/oldman, /obj/item/clothing/shoes/color/brown, /obj/item/clothing/shoes/color/black, /obj/item/clothing/shoes/craftable, /obj/item/clothing/shoes/color/white, - /obj/item/clothing/jumpsuit/head_of_personnel_whimsy, + /obj/item/clothing/costume/head_of_personnel_whimsy, /obj/item/clothing/head/caphat/hop ) diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index b2c172211c1..b97d274b2d7 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -22,7 +22,7 @@ L.client.perspective = EYE_PERSPECTIVE L.client.eye = src L.forceMove(src) - L.set_sdisability(MUTED) + L.add_genetic_condition(GENE_COND_MUTED) current_health = L.current_health + 100 //stoning damaged mobs will result in easier to shatter statues intialTox = L.get_damage(TOX) intialFire = L.get_damage(BURN) @@ -64,7 +64,7 @@ for(var/mob/living/M in src) M.dropInto(forced_loc) - M.unset_sdisability(MUTED) + M.remove_genetic_condition(GENE_COND_MUTED) M.take_overall_damage((M.current_health - current_health - 100),0) //any new damage the statue incurred is transfered to the mob if(M.client) M.client.eye = M.client.mob diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 619a3a3fb2f..798d8f65c49 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -10,7 +10,8 @@ . = ..() new /obj/item/tank/jetpack/oxygen(src) new /obj/item/clothing/mask/gas/syndicate(src) - new /obj/item/clothing/under/syndicate(src) + new /obj/item/clothing/shirt/syndicate(src) + new /obj/item/clothing/pants/casual/camo(src) new /obj/item/clothing/head/helmet/space/void/merc(src) new /obj/item/clothing/suit/space/void/merc(src) new /obj/item/crowbar/red(src) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 218f0170376..53066715108 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -9,10 +9,11 @@ /obj/structure/closet/wardrobe/red/WillContain() return list( - /obj/item/clothing/jumpsuit/security = 3, - /obj/item/clothing/under/security2 = 3, - /obj/item/clothing/shoes/jackboots = 3, - /obj/item/clothing/head/soft/sec = 3, + /obj/item/clothing/jumpsuit/security = 3, + /obj/item/clothing/shirt/button/security = 3, + /obj/item/clothing/pants/slacks/security = 3, + /obj/item/clothing/shoes/jackboots = 3, + /obj/item/clothing/head/soft/sec = 3 ) /obj/structure/closet/wardrobe/pink @@ -290,25 +291,26 @@ /obj/structure/closet/wardrobe/suit/WillContain() return list( - /obj/item/clothing/pants/slacks = 2, + /obj/item/clothing/pants/slacks, /obj/item/clothing/pants/slacks/purple, /obj/item/clothing/pants/slacks/tan, /obj/item/clothing/pants/slacks/red, - /obj/item/clothing/pants/slacks/black = 2, - /obj/item/clothing/shirt/button = 4, + /obj/item/clothing/pants/slacks/black, + /obj/item/clothing/shirt/button = 2, /obj/item/clothing/suit/jacket/waistcoat/black, /obj/item/clothing/neck/tie/long/red, - /obj/item/clothing/under/sl_suit, - /obj/item/clothing/under/scratch, + /obj/item/clothing/pants/slacks/black, + /obj/item/clothing/shirt/button, + /obj/item/clothing/costume/scratch, /obj/item/clothing/shirt/button, /obj/item/clothing/neck/tie/black, /obj/item/clothing/suit/jacket/black, /obj/item/clothing/suit/jacket/blue, /obj/item/clothing/suit/jacket/purple, - /obj/item/clothing/under/assistantformal, - /obj/item/clothing/under/lawyer, - /obj/item/clothing/under/lawyer/red, - /obj/item/clothing/under/lawyer/bluesuit, + /obj/item/clothing/costume/assistantformal, + /obj/item/clothing/costume/lawyer, + /obj/item/clothing/costume/lawyer_red, + /obj/item/clothing/costume/lawyer_bluesuit, /obj/item/clothing/shoes/color/brown, /obj/item/clothing/shoes/dress, ) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 96ba4a125f0..bb9feda3c86 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -16,6 +16,8 @@ if(rigged) visible_message("There are wires attached to the lid of [src]...") for(var/obj/item/assembly_holder/H in src) + // This proc expects an /obj/item, and usr is never that, but it must be non-null for the code to function. + // TODO: Rewrite or refactor either this code or the proc itself to avoid that. H.process_activation(usr) for(var/obj/item/assembly/A in src) A.activate() diff --git a/code/game/objects/structures/crematorium.dm b/code/game/objects/structures/crematorium.dm index d83c67a1858..5fe9ba531cd 100644 --- a/code/game/objects/structures/crematorium.dm +++ b/code/game/objects/structures/crematorium.dm @@ -119,61 +119,7 @@ update_icon() for(var/mob/living/M in contents) - admin_attack_log(A, M, "Began cremating their victim.", "Has begun being cremated.", "began cremating") - if(isliving(M)) - var/mob/living/C = M - for(var/I, I < 60, I++) - - if(C.stat >= UNCONSCIOUS || !(C in contents)) //In case we die or are removed at any point. - cremating = 0 - update_icon() - break - - sleep(0.5 SECONDS) - - if(QDELETED(src)) - return - - if(prob(40)) - var/desperation = rand(1,5) - switch(desperation) //This is messy. A better solution would probably be to make more sounds, but... - if(1) - playsound(loc, 'sound/weapons/genhit.ogg', 45, 1) - shake_animation(2) - playsound(loc, 'sound/weapons/genhit.ogg', 45, 1) - if(2) - playsound(loc, 'sound/effects/grillehit.ogg', 45, 1) - shake_animation(3) - playsound(loc, 'sound/effects/grillehit.ogg', 45, 1) - if(3) - playsound(src, 'sound/effects/bang.ogg', 45, 1) - if(prob(50)) - playsound(src, 'sound/effects/bang.ogg', 45, 1) - shake_animation() - else - shake_animation(5) - if(4) - playsound(src, 'sound/effects/clang.ogg', 45, 1) - shake_animation(5) - if(5) - playsound(src, 'sound/weapons/smash.ogg', 50, 1) - if(prob(50)) - playsound(src, 'sound/weapons/smash.ogg', 50, 1) - shake_animation(9) - else - shake_animation() - - if(round_is_spooky()) - if(prob(50)) - playsound(src, 'sound/effects/ghost.ogg', 10, 5) - else - playsound(src, 'sound/effects/ghost2.ogg', 10, 5) - - if (!M.stat) - M.audible_message("[M]'s screams cease, as does any movement within the [src]. All that remains is a dull, empty silence.") - - admin_attack_log(M, A, "Cremated their victim.", "Was cremated.", "cremated") - M.dust() + on_cremate_mob(A, M) for(var/obj/O in contents) //obj instead of obj/item so that bodybags and ashes get destroyed. We dont want tons and tons of ash piling up if(!istype(O, connected_tray)) @@ -185,6 +131,59 @@ locked = initial(locked) playsound(src, 'sound/effects/spray.ogg', 50, 1) update_icon() + +// This proc sucks. Actually, all of crematorium code just sucks. +// TODO: REWRITE OR REMOVE +/obj/structure/crematorium/proc/on_cremate_mob(atom/cause, mob/living/victim) + admin_attack_log(cause, victim, "Began cremating their victim.", "Has begun being cremated.", "began cremating") + if(isliving(victim)) + for(var/I, I < 60, I++) + + if(victim.stat >= UNCONSCIOUS || !(victim in contents)) //In case we die or are removed at any point. + cremating = 0 + update_icon() + break + + sleep(0.5 SECONDS) + + if(QDELETED(src)) + return FALSE + + if(prob(40)) + var/desperation = rand(1,5) + switch(desperation) //This is messy. A better solution would probably be to make more sounds, but... + if(1) + playsound(loc, 'sound/weapons/genhit.ogg', 45, 1) + shake_animation(2) + playsound(loc, 'sound/weapons/genhit.ogg', 45, 1) + if(2) + playsound(loc, 'sound/effects/grillehit.ogg', 45, 1) + shake_animation(3) + playsound(loc, 'sound/effects/grillehit.ogg', 45, 1) + if(3) + playsound(src, 'sound/effects/bang.ogg', 45, 1) + if(prob(50)) + playsound(src, 'sound/effects/bang.ogg', 45, 1) + shake_animation() + else + shake_animation(5) + if(4) + playsound(src, 'sound/effects/clang.ogg', 45, 1) + shake_animation(5) + if(5) + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + if(prob(50)) + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + shake_animation(9) + else + shake_animation() + + if (!victim.stat) + victim.audible_message("[victim]'s screams cease, as does any movement within \the [src]. All that remains is a dull, empty silence.") + + admin_attack_log(victim, cause, "Cremated their victim.", "Was cremated.", "cremated") + victim.dust() + return TRUE /obj/structure/crematorium_tray name = "crematorium tray" diff --git a/code/game/objects/structures/defensive_barrier.dm b/code/game/objects/structures/defensive_barrier.dm index 9aae3a81815..21e95d7fd56 100644 --- a/code/game/objects/structures/defensive_barrier.dm +++ b/code/game/objects/structures/defensive_barrier.dm @@ -141,7 +141,7 @@ . = ..() -/obj/structure/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/structure/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(damage) playsound(src.loc, 'sound/effects/bang.ogg', 75, 1) damage = round(damage * 0.5) diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index 71c595d1ebf..6655f3ba9d3 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -210,9 +210,6 @@ /obj/structure/door/walnut material = /decl/material/solid/organic/wood/walnut -/obj/structure/door/cult - material = /decl/material/solid/stone/cult - /obj/structure/door/wood/saloon material = /decl/material/solid/organic/wood opacity = FALSE diff --git a/code/game/objects/structures/drying_rack.dm b/code/game/objects/structures/drying_rack.dm index 123ac0641b8..7cec42d26fe 100644 --- a/code/game/objects/structures/drying_rack.dm +++ b/code/game/objects/structures/drying_rack.dm @@ -20,6 +20,15 @@ /obj/structure/drying_rack/Process() if(!drying) return + + if(isturf(loc)) + var/turf/my_turf = loc + var/decl/state/weather/weather_state = my_turf.weather?.weather_system?.current_state + if(istype(weather_state) && weather_state.is_liquid) + return // can't dry in the rain + if(loc?.is_flooded(TRUE)) + return // can't dry in the wet + var/dry_product = drying?.dry_out(src) if(dry_product) if(drying != dry_product) diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index 213a98fd0a2..e38befacb23 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -314,7 +314,8 @@ return (fuel > 0) /obj/structure/fire_source/on_reagent_change() - ..() + if(!(. = ..())) + return if(reagents?.total_volume) var/do_steam = FALSE var/list/waste = list() diff --git a/code/game/objects/structures/fitness.dm b/code/game/objects/structures/fitness.dm index 2542d145af1..b83a6aa499e 100644 --- a/code/game/objects/structures/fitness.dm +++ b/code/game/objects/structures/fitness.dm @@ -14,7 +14,7 @@ if(!ishuman(user)) return ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/synth = H.isSynthetic() if(!synth && H.nutrition < 20) to_chat(H, SPAN_WARNING("You [synth ? "need more energy" : "are too tired"] to use the punching bag. Go [synth ? "recharge" : "eat something"].")) @@ -51,7 +51,7 @@ /obj/structure/fitness/weightlifter/attack_hand(mob/user) if(!ishuman(user)) return ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/synth = H.isSynthetic() if(H.loc != src.loc) to_chat(H, SPAN_WARNING("You must be on the weight machine to use it.")) diff --git a/code/game/objects/structures/flora/plant.dm b/code/game/objects/structures/flora/plant.dm index 7d49a97b5ed..38c348eef4f 100644 --- a/code/game/objects/structures/flora/plant.dm +++ b/code/game/objects/structures/flora/plant.dm @@ -38,7 +38,7 @@ var/fail_chance = user ? user.skill_fail_chance(SKILL_BOTANY, 30, SKILL_ADEPT) : 30 if(!prob(fail_chance)) for(var/i = 1 to rand(1,3)) - new /obj/item/seeds(loc, null, plant) + new /obj/item/seeds/extracted(loc, null, plant) return ..() /obj/structure/flora/plant/Initialize(ml, _mat, _reinf_mat, datum/seed/_plant) @@ -71,7 +71,7 @@ . = ..() icon_state = "blank" color = null - set_overlays(plant.get_appearance(dead = dead, growth_stage = growth_stage, can_harvest = length(harvestable))) + set_overlays(plant.get_appearance(dead = dead, growth_stage = growth_stage, can_harvest = !!harvestable)) /obj/structure/flora/plant/attackby(obj/item/O, mob/user) diff --git a/code/game/objects/structures/flora/tree.dm b/code/game/objects/structures/flora/tree.dm index 6ea1444b028..fd1d4960d61 100644 --- a/code/game/objects/structures/flora/tree.dm +++ b/code/game/objects/structures/flora/tree.dm @@ -52,7 +52,7 @@ for(var/turf/T in turfs_to_update) T.update_ambient_light_from_z_or_area() -/obj/structure/flora/tree/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/structure/flora/tree/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) . = ..() if(!QDELETED(src) && damage >= 5) shake() diff --git a/code/game/objects/structures/fountain.dm b/code/game/objects/structures/fountain.dm index 8dd74226c80..27096beadb7 100644 --- a/code/game/objects/structures/fountain.dm +++ b/code/game/objects/structures/fountain.dm @@ -25,7 +25,7 @@ to_chat(user, SPAN_WARNING("\The [src] is still and lifeless...")) return TRUE - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/decl/bodytype/my_bodytype = istype(H) && H.get_bodytype() if(!istype(my_bodytype)) return ..() @@ -42,7 +42,7 @@ visible_message("\The [H] retracts their hand suddenly.") return TRUE -/obj/structure/fountain/proc/time_dilation(var/mob/living/carbon/human/user) +/obj/structure/fountain/proc/time_dilation(var/mob/living/human/user) for(var/mob/living/L in oviewers(7, src)) L.flash_eyes(3) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index fb75dc941f8..f082024b03f 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -193,18 +193,6 @@ if(severity == 1 || (severity == 2 && prob(30)) || (severity == 3 && prob(5))) physically_destroyed() -/obj/structure/girder/cult - icon= 'icons/obj/cult.dmi' - icon_state= "cultgirder" - max_health = 150 - cover = 70 - -/obj/structure/girder/cult/dismantle_structure(mob/user) - material = null - reinf_material = null - parts_type = null - . = ..() - /obj/structure/girder/wood material = /decl/material/solid/organic/wood/mahogany diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 3d8767be654..9483ba35f75 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -102,7 +102,7 @@ var/damage_dealt = 1 var/attack_message = "kicks" if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species.can_shred(H)) attack_message = "mangles" damage_dealt = 5 @@ -265,16 +265,6 @@ . = ..() take_damage(rand(1, 5)) //In the destroyed but not utterly threshold. -/obj/structure/grille/cult - name = "cult grille" - desc = "A matrice built out of an unknown material, with some sort of force field blocking air around it." - material = /decl/material/solid/stone/cult - -/obj/structure/grille/cult/CanPass(atom/movable/mover, turf/target, height = 1.5, air_group = 0) - if(air_group) - return 0 //Make sure air doesn't drain - ..() - /obj/structure/grille/proc/is_on_frame() if(locate(/obj/structure/wall_frame) in loc) return TRUE diff --git a/code/game/objects/structures/ironing_board.dm b/code/game/objects/structures/ironing_board.dm index b89d31ee29a..95a44a1a42f 100644 --- a/code/game/objects/structures/ironing_board.dm +++ b/code/game/objects/structures/ironing_board.dm @@ -84,7 +84,7 @@ // anti-wrinkle "massage" if(buckled_mob && ishuman(buckled_mob)) - var/mob/living/carbon/human/H = buckled_mob + var/mob/living/human/H = buckled_mob var/zone = user.get_target_zone() var/parsed = parse_zone(zone) diff --git a/code/game/objects/structures/iv_drip.dm b/code/game/objects/structures/iv_drip.dm index 596c9f0b506..44c3e904348 100644 --- a/code/game/objects/structures/iv_drip.dm +++ b/code/game/objects/structures/iv_drip.dm @@ -4,7 +4,7 @@ anchored = FALSE density = FALSE - var/mob/living/carbon/human/attached + var/mob/living/human/attached var/mode = 1 // 1 is injecting, 0 is taking blood. var/obj/item/chems/beaker var/list/transfer_amounts = list(REM, 1, 2) @@ -209,12 +209,12 @@ attached.apply_damage(1, BRUTE, pick(BP_R_ARM, BP_L_ARM), damage_flags=DAM_SHARP) attached = null -/obj/structure/iv_drip/proc/hook_up(mob/living/carbon/human/target, mob/user) +/obj/structure/iv_drip/proc/hook_up(mob/living/human/target, mob/user) if(do_IV_hookup(target, user, src)) attached = target START_PROCESSING(SSobj,src) -/proc/do_IV_hookup(mob/living/carbon/human/target, mob/user, obj/IV) +/proc/do_IV_hookup(mob/living/human/target, mob/user, obj/IV) to_chat(user, SPAN_NOTICE("You start to hook up \the [target] to \the [IV].")) if(!user.do_skilled(2 SECONDS, SKILL_MEDICAL, target)) return FALSE diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 76e6dc95853..76b4b96fbe9 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -184,7 +184,7 @@ if(istype(W, /obj/item/grab) && get_dist(src,user)<2) var/obj/item/grab/G = W if(ishuman(G.affecting)) - var/mob/living/carbon/human/H = G.get_affecting_mob() + var/mob/living/human/H = G.get_affecting_mob() var/obj/occupied = turf_is_crowded() if(occupied) to_chat(user, "There's \a [occupied] in the way.") diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 56cd8226473..9f1c725a947 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -74,19 +74,19 @@ FLOOR SAFES user.set_machine(src) var/dat = "
" - dat += "[open ? "Close" : "Open"] [src] | - [dial * 5] +" + dat += "[open ? "Close" : "Open"] [src] | - [dial * 5] +" if(open) dat += "" for(var/i = contents.len, i>=1, i--) var/obj/item/P = contents[i] - dat += "" + dat += "" dat += "
[P.name]
[P.name]
" show_browser(user, "[name][dat]", "window=safe;size=350x300") return TRUE /obj/structure/safe/Topic(href, href_list) if(!ishuman(usr)) return - var/mob/living/carbon/human/user = usr + var/mob/living/human/user = usr if(href_list["open"]) if(check_unlocked()) diff --git a/code/game/objects/structures/skele_stand.dm b/code/game/objects/structures/skele_stand.dm index a8c91086436..d9466cf3969 100644 --- a/code/game/objects/structures/skele_stand.dm +++ b/code/game/objects/structures/skele_stand.dm @@ -63,22 +63,12 @@ SetName(nuname) return 1 if(istype(W,/obj/item/clothing)) - var/slot - if(istype(W, /obj/item/clothing/under)) - slot = slot_w_uniform_str - else if(istype(W, /obj/item/clothing/suit)) - slot = slot_wear_suit_str - else if(istype(W, /obj/item/clothing/head)) - slot = slot_head_str - else if(istype(W, /obj/item/clothing/shoes)) - slot = slot_shoes_str - else if(istype(W, /obj/item/clothing/mask)) - slot = slot_wear_mask_str - if(slot) - if(swag[slot]) - to_chat(user,"There is already that kind of clothing on \the [src].") + var/obj/item/clothing/clothes = W + if(clothes.fallback_slot) + if(swag[clothes.fallback_slot]) + to_chat(user,SPAN_NOTICE("There is already that kind of clothing on \the [src].")) else if(user.try_unequip(W, src)) - swag[slot] = W + swag[clothes.fallback_slot] = W update_icon() return 1 else diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm index fa25895ec87..0eeb2e0a3a4 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm @@ -36,6 +36,12 @@ /obj/structure/bed/get_base_value() . = round(..() * 2.5) // Utility structures should be worth more than their matter (wheelchairs, rollers, etc). +/obj/structure/bed/get_surgery_surface_quality(mob/living/victim, mob/living/user) + return OPERATE_PASSABLE + +/obj/structure/bed/get_surgery_success_modifier(delicate) + return delicate ? -5 : 0 + /obj/structure/bed/update_material_name() if(reinf_material) SetName("[reinf_material.adjective_name] [initial(name)]") @@ -236,7 +242,7 @@ beaker = null queue_icon_update() -/obj/structure/bed/roller/proc/attach_iv(mob/living/carbon/human/target, mob/user) +/obj/structure/bed/roller/proc/attach_iv(mob/living/human/target, mob/user) if(!beaker) return if(do_IV_hookup(target, user, beaker)) @@ -244,7 +250,7 @@ queue_icon_update() START_PROCESSING(SSobj,src) -/obj/structure/bed/roller/proc/detach_iv(mob/living/carbon/human/target, mob/user) +/obj/structure/bed/roller/proc/detach_iv(mob/living/human/target, mob/user) visible_message("\The [target] is taken off the IV on \the [src].") iv_attached = FALSE queue_icon_update() diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm index f2e34f4e701..fa3b5ef1e35 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm @@ -76,7 +76,7 @@ B.set_dir(newdir) bloodiness-- -/proc/equip_wheelchair(mob/living/carbon/human/H) //Proc for spawning in a wheelchair if a new character has no legs. Used in new_player.dm +/proc/equip_wheelchair(mob/living/human/H) //Proc for spawning in a wheelchair if a new character has no legs. Used in new_player.dm var/obj/structure/bed/chair/wheelchair/W = new(get_turf(H)) if(isturf(H.loc)) W.buckle_mob(H) diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index 5556cc52731..90bb9194d55 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -279,7 +279,10 @@ /obj/structure/table/update_material_desc(override_desc) desc = initial(desc) if(reinf_material) - desc = "[desc] This one has a frame made from [material.solid_name] and \a [top_surface_noun] made from [reinf_material.solid_name]." + if(reinf_material == material) + desc = "[desc] This one has a frame and \a [top_surface_noun] made from [material.solid_name]." + else + desc = "[desc] This one has a frame made from [material.solid_name] and \a [top_surface_noun] made from [reinf_material.solid_name]." else if(material) desc = "[desc] This one has a frame made from [material.solid_name]." if(felted) @@ -638,6 +641,13 @@ /obj/structure/table/handle_default_crowbar_attackby(var/mob/user, var/obj/item/crowbar) return !reinf_material && ..() +// For doing surgery on tables +/obj/structure/table/get_surgery_success_modifier(delicate) + return delicate ? -10 : 0 + +/obj/structure/table/get_surgery_surface_quality(mob/living/victim, mob/living/user) + return OPERATE_OKAY + // Table presets. /obj/structure/table/frame icon_state = "frame" diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 30effb0cb86..8e9e1635826 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -70,9 +70,9 @@ return ..() var/list/dat = list() var/oxycount = LAZYLEN(oxygen_tanks) - dat += "Oxygen tanks: [oxycount] - [oxycount ? "Dispense" : "empty"]
" + dat += "Oxygen tanks: [oxycount] - [oxycount ? "Dispense" : "empty"]
" var/hydrocount = LAZYLEN(hydrogen_tanks) - dat += "Hydrogen tanks: [hydrocount] - [hydrocount ? "Dispense" : "empty"]" + dat += "Hydrogen tanks: [hydrocount] - [hydrocount ? "Dispense" : "empty"]" var/datum/browser/popup = new(user, "window=tank_rack") popup.set_content(jointext(dat, "
")) popup.open() diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm index ff844e19d4f..2a4e6fa7253 100644 --- a/code/game/objects/structures/under_wardrobe.dm +++ b/code/game/objects/structures/under_wardrobe.dm @@ -44,7 +44,7 @@ interact(user) return TRUE -/obj/structure/undies_wardrobe/interact(var/mob/living/carbon/human/H) +/obj/structure/undies_wardrobe/interact(var/mob/living/human/H) var/id = H.GetIdCard() var/dat = list() @@ -52,11 +52,11 @@ dat += "You may claim [id ? length(global.underwear.categories) - LAZYACCESS(amount_of_underwear_by_id_card, id) : 0] more article\s this shift.

" dat += "Available Categories

" for(var/datum/category_group/underwear/UWC in global.underwear.categories) - dat += "[UWC.name] (Select)
" + dat += "[UWC.name] (Select)
" dat = jointext(dat,null) show_browser(H, dat, "window=wardrobe;size=400x250") -/obj/structure/undies_wardrobe/proc/human_who_can_use_underwear(var/mob/living/carbon/human/H) +/obj/structure/undies_wardrobe/proc/human_who_can_use_underwear(var/mob/living/human/H) if(!istype(H) || !(H.get_bodytype()?.appearance_flags & HAS_UNDERWEAR)) return FALSE return TRUE @@ -71,7 +71,7 @@ if(..()) return TRUE - var/mob/living/carbon/human/H = usr + var/mob/living/human/H = usr if(href_list["select_underwear"]) var/datum/category_group/underwear/UWC = global.underwear.categories_by_name[href_list["select_underwear"]] if(!UWC) diff --git a/code/game/objects/structures/wall_frame.dm b/code/game/objects/structures/wall_frame.dm index 6760ffccd36..2f897c05d3b 100644 --- a/code/game/objects/structures/wall_frame.dm +++ b/code/game/objects/structures/wall_frame.dm @@ -163,4 +163,28 @@ /obj/structure/wall_frame/hull paint_color = COLOR_HULL - stripe_color = COLOR_HULL \ No newline at end of file + stripe_color = COLOR_HULL + +/obj/structure/wall_frame/log + name = "low log wall" + desc = "A section of log wall with empty space for fitting a window or simply letting air in." + icon = 'icons/obj/structures/log_wall_frame.dmi' + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC // material color is applied in on_update_icon + +/obj/structure/wall_frame/log/Initialize() + color = null // clear mapping preview color + . = ..() + +#define LOW_LOG_WALL_SUBTYPE(material_name) \ +/obj/structure/wall_frame/log/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ + color = /decl/material/solid/organic/wood/##material_name::color; \ +} + +LOW_LOG_WALL_SUBTYPE(fungal) +LOW_LOG_WALL_SUBTYPE(ebony) +LOW_LOG_WALL_SUBTYPE(walnut) +LOW_LOG_WALL_SUBTYPE(maple) +LOW_LOG_WALL_SUBTYPE(mahogany) +LOW_LOG_WALL_SUBTYPE(bamboo) +LOW_LOG_WALL_SUBTYPE(yew) \ No newline at end of file diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 74da58c9e6c..deb34524e6d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -332,7 +332,7 @@ var/global/list/hygiene_props = list() var/temp_adj = clamp(water_temperature - M.bodytemperature, BODYTEMP_COOLING_MAX, BODYTEMP_HEATING_MAX) M.bodytemperature += temp_adj if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(water_temperature >= H.get_mob_temperature_threshold(HEAT_LEVEL_1)) to_chat(H, SPAN_DANGER("The water is searing hot!")) else if(water_temperature <= H.get_mob_temperature_threshold(COLD_LEVEL_1)) @@ -388,72 +388,69 @@ var/global/list/hygiene_props = list() SPAN_NOTICE("You wash your hands using \the [src].")) return TRUE -/obj/structure/hygiene/sink/attackby(obj/item/O, var/mob/user) - if(isplunger(O) && clogged > 0) +/obj/structure/hygiene/sink/attackby(obj/item/hit_with, var/mob/user) + if(isplunger(hit_with) && clogged > 0) return ..() if(busy) to_chat(user, SPAN_WARNING("Someone's already washing here.")) return - var/obj/item/chems/RG = O - if (istype(RG) && ATOM_IS_OPEN_CONTAINER(RG) && RG.reagents) + var/obj/item/chems/chem_container = hit_with + if (istype(chem_container) && ATOM_IS_OPEN_CONTAINER(chem_container) && chem_container.reagents) user.visible_message( - SPAN_NOTICE("\The [user] fills \the [RG] using \the [src]."), - SPAN_NOTICE("You fill \the [RG] using \the [src].")) + SPAN_NOTICE("\The [user] fills \the [chem_container] using \the [src]."), + SPAN_NOTICE("You fill \the [chem_container] using \the [src].")) playsound(loc, 'sound/effects/sink.ogg', 75, 1) - RG.add_to_reagents(/decl/material/liquid/water, min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) - return 1 - - else if (istype(O, /obj/item/baton)) - var/obj/item/baton/B = O - var/obj/item/cell/cell = B.get_cell() - if(cell) - if(cell.charge > 0 && B.status == 1) - flick("baton_active", src) - if(isliving(user)) - var/mob/living/M = user - SET_STATUS_MAX(M, STAT_STUN, 10) - SET_STATUS_MAX(M, STAT_STUTTER, 10) - SET_STATUS_MAX(M, STAT_WEAK, 10) - if(isrobot(user)) - var/mob/living/silicon/robot/R = user - R.cell.charge -= 20 - else - B.deductcharge(B.hitcost) - var/decl/pronouns/G = user.get_pronouns() - user.visible_message(SPAN_DANGER("\The [user] was stunned by [G.his] wet [O]!")) - return 1 - else if(istype(O, /obj/item/mop)) - if(REAGENTS_FREE_SPACE(O.reagents) >= 5) - O.add_to_reagents(/decl/material/liquid/water, 5) - to_chat(user, SPAN_NOTICE("You wet \the [O] in \the [src].")) + chem_container.add_to_reagents(/decl/material/liquid/water, min(REAGENTS_FREE_SPACE(chem_container.reagents), chem_container.amount_per_transfer_from_this)) + return TRUE + + else if (istype(hit_with, /obj/item/baton)) + var/obj/item/baton/baton = hit_with + var/obj/item/cell/cell = baton.get_cell() + if(cell?.check_charge(0) && baton.status) + if(isliving(user)) + var/mob/living/living_victim = user + SET_STATUS_MAX(living_victim, STAT_STUN, 10) + SET_STATUS_MAX(living_victim, STAT_STUTTER, 10) + SET_STATUS_MAX(living_victim, STAT_WEAK, 10) + // robot users used to be handled separately, but deductcharge handles that for us + baton.deductcharge(baton.hitcost) + var/decl/pronouns/user_pronouns = user.get_pronouns() + user.visible_message(SPAN_DANGER("\The [user] was stunned by [user_pronouns.his] wet [hit_with]!")) + return TRUE + else if(istype(hit_with, /obj/item/mop)) + if(REAGENTS_FREE_SPACE(hit_with.reagents) >= 5) + hit_with.add_to_reagents(/decl/material/liquid/water, 5) + to_chat(user, SPAN_NOTICE("You wet \the [hit_with] in \the [src].")) playsound(loc, 'sound/effects/slosh.ogg', 25, 1) else - to_chat(user, SPAN_WARNING("\The [O] is saturated.")) + to_chat(user, SPAN_WARNING("\The [hit_with] is saturated.")) return var/turf/location = user.loc - if(!isturf(location)) return + if(!isturf(location)) + return - var/obj/item/I = O - if(!I || !istype(I,/obj/item)) return + if(!istype(hit_with)) + return - to_chat(usr, SPAN_NOTICE("You start washing \the [I].")) + to_chat(usr, SPAN_NOTICE("You start washing \the [hit_with].")) playsound(loc, 'sound/effects/sink_long.ogg', 75, 1) - busy = 1 + busy = TRUE if(!do_after(user, 40, src)) - busy = 0 + busy = FALSE return TRUE - busy = 0 + busy = FALSE - if(istype(O, /obj/item/chems/spray/extinguisher)) return TRUE // We're washing, not filling. + if(istype(hit_with, /obj/item/chems/spray/extinguisher)) + return TRUE // We're washing, not filling. - O.clean() + hit_with.clean() user.visible_message( \ - SPAN_NOTICE("\The [user] washes \a [I] using \the [src]."), - SPAN_NOTICE("You wash \a [I] using \the [src].")) + SPAN_NOTICE("\The [user] washes \a [hit_with] using \the [src]."), + SPAN_NOTICE("You wash \a [hit_with] using \the [src].")) /obj/structure/hygiene/sink/kitchen diff --git a/code/game/objects/structures/well.dm b/code/game/objects/structures/well.dm index 0d7888198f9..44dad1274b4 100644 --- a/code/game/objects/structures/well.dm +++ b/code/game/objects/structures/well.dm @@ -5,7 +5,7 @@ icon_state = ICON_STATE_WORLD anchored = TRUE density = TRUE - atom_flags = ATOM_FLAG_CLIMBABLE | ATOM_FLAG_OPEN_CONTAINER + atom_flags = ATOM_FLAG_CLIMBABLE matter = null material = /decl/material/solid/stone/granite material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_DESC @@ -13,12 +13,27 @@ amount_dispensed = 10 possible_transfer_amounts = @"[10,25,50,100]" volume = 10000 + can_toggle_open = FALSE /obj/structure/reagent_dispensers/well/on_update_icon() . = ..() if(reagents?.total_volume) add_overlay(overlay_image(icon, "[icon_state]-fluid", reagents.get_color(), (RESET_COLOR | RESET_ALPHA))) +/obj/structure/reagent_dispensers/well/on_reagent_change() + if(!(. = ..())) + return + update_icon() + if(!is_processing) + START_PROCESSING(SSobj, src) + +/obj/structure/reagent_dispensers/well/attackby(obj/item/W, mob/user) + . = ..() + if(!. && user.a_intent == I_HELP && reagents?.total_volume > FLUID_PUDDLE) + user.visible_message(SPAN_NOTICE("\The [user] dips \the [W] into \the [reagents.get_primary_reagent_name()].")) + W.fluid_act(reagents) + return TRUE + /obj/structure/reagent_dispensers/well/mapped/populate_reagents() . = ..() add_to_reagents(/decl/material/liquid/water, reagents.maximum_volume) @@ -34,9 +49,3 @@ if(is_processing) STOP_PROCESSING(SSobj, src) return ..() - -/obj/structure/reagent_dispensers/well/mapped/on_reagent_change() - . = ..() - update_icon() - if(!is_processing) - START_PROCESSING(SSobj, src) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 419cd5e058e..3d5f43c2807 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -77,7 +77,7 @@ SHOULD_CALL_PARENT(FALSE) . = shatter() -/obj/structure/window/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/structure/window/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) . = ..() if(. && damage_type == BRUTE) playsound(loc, "glasscrack", 100, 1) @@ -151,7 +151,7 @@ if (user.a_intent && user.a_intent == I_HURT) if (ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species.can_shred(H)) attack_generic(H,25) return @@ -569,7 +569,7 @@ SHOULD_CALL_PARENT(FALSE) return FALSE -/obj/structure/window/reinforced/crescent/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/structure/window/reinforced/crescent/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) return /obj/structure/window/reinforced/crescent/shatter() diff --git a/code/game/response_team.dm b/code/game/response_team.dm index df72fe9a7c9..dd611ef5465 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -64,7 +64,7 @@ var/global/can_call_ert /proc/percentage_dead() var/total = 0 var/deadcount = 0 - for(var/mob/living/carbon/human/H in SSmobs.mob_list) + for(var/mob/living/human/H in SSmobs.mob_list) if(H.client) // Monkeys and mice don't have a client, amirite? if(H.stat == DEAD) deadcount++ total++ @@ -76,7 +76,7 @@ var/global/can_call_ert /proc/percentage_antagonists() var/total = 0 var/antagonists = 0 - for(var/mob/living/carbon/human/H in SSmobs.mob_list) + for(var/mob/living/human/H in SSmobs.mob_list) if(is_special_character(H) >= 1) antagonists++ total++ diff --git a/code/game/sound.dm b/code/game/sound.dm index c0e720787b3..7b2892a9de1 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -104,7 +104,7 @@ var/global/const/FALLOFF_SOUNDS = 0.5 if(!is_global) if(isliving(src)) - var/mob/living/carbon/M = src + var/mob/living/M = src if (istype(M) && M.hallucination_power > 50 && GET_CHEMICAL_EFFECT(M, CE_MIND) < 1) S.environment = PSYCHOTIC else if (HAS_STATUS(M, STAT_DRUGGY)) diff --git a/code/game/turfs/flooring/flooring_reinforced.dm b/code/game/turfs/flooring/flooring_reinforced.dm index 087d78b0c13..128c23dc438 100644 --- a/code/game/turfs/flooring/flooring_reinforced.dm +++ b/code/game/turfs/flooring/flooring_reinforced.dm @@ -28,19 +28,6 @@ flags = TURF_ACID_IMMUNE can_paint = 0 -/decl/flooring/reinforced/cult - name = "engraved floor" - desc = "Unsettling whispers waver from the surface..." - icon = 'icons/turf/flooring/cult.dmi' - icon_base = "cult" - build_type = null - flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK | TURF_REMOVE_WRENCH - can_paint = null - -/decl/flooring/reinforced/cult/on_remove() - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.remove_cultiness(CULTINESS_PER_TURF) - /decl/flooring/reinforced/shuttle name = "floor" icon = 'icons/turf/flooring/shuttle.dmi' diff --git a/code/game/turfs/floors/_floor.dm b/code/game/turfs/floors/_floor.dm index 90f4903049d..81e35f0a6f5 100644 --- a/code/game/turfs/floors/_floor.dm +++ b/code/game/turfs/floors/_floor.dm @@ -13,6 +13,7 @@ /decl/material/gas/nitrogen = MOLES_N2STANDARD ) zone_membership_candidate = TRUE + open_turf_type = /turf/open/airless var/can_engrave = TRUE @@ -144,14 +145,6 @@ /turf/floor/is_floor() return !density && !is_open() -/turf/floor/on_defilement() - if(flooring?.type != /decl/flooring/reinforced/cult) - ..() - set_flooring(GET_DECL(/decl/flooring/reinforced/cult)) - -/turf/floor/is_defiled() - return flooring?.type == /decl/flooring/reinforced/cult || ..() - /turf/floor/get_physical_height() return flooring?.height || 0 diff --git a/code/game/turfs/floors/floor_acts.dm b/code/game/turfs/floors/floor_acts.dm index 7274ed9271b..9a9ae3f0833 100644 --- a/code/game/turfs/floors/floor_acts.dm +++ b/code/game/turfs/floors/floor_acts.dm @@ -2,7 +2,7 @@ SHOULD_CALL_PARENT(TRUE) ..() if(severity == 1) - ChangeTurf(get_base_turf_by_area(src)) + ChangeTurf(get_base_turf_by_area(src), keep_air = TRUE) else if(severity == 2) switch(pick(40;1,40;2,3)) if (1) @@ -11,7 +11,7 @@ mat.place_shards(src) physically_destroyed() if(2) - ChangeTurf(get_base_turf_by_area(src)) + ChangeTurf(get_base_turf_by_area(src), keep_air = TRUE) if(3) if(prob(33)) var/decl/material/mat = GET_DECL(/decl/material/solid/metal/steel) diff --git a/code/game/turfs/floors/floor_attackby.dm b/code/game/turfs/floors/floor_attackby.dm index 2ef3d2d6806..6cc34b7544f 100644 --- a/code/game/turfs/floors/floor_attackby.dm +++ b/code/game/turfs/floors/floor_attackby.dm @@ -1,7 +1,7 @@ /turf/floor/attack_hand(mob/user) if(!ishuman(user)) return ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/obj/item/hand = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) if(hand && try_graffiti(H, hand)) return TRUE @@ -12,8 +12,8 @@ if(!C || !user) return 0 - if(IS_COIL(C) || (flooring && istype(C, /obj/item/stack/material/rods))) - return ..(C, user) + if(istype(C, /obj/item/stack/tile/roof) || IS_COIL(C) || (flooring && istype(C, /obj/item/stack/material/rods))) + return ..() if(!(IS_SCREWDRIVER(C) && flooring && (flooring.flags & TURF_REMOVE_SCREWDRIVER)) && try_graffiti(user, C)) return TRUE @@ -93,6 +93,7 @@ new /obj/structure/catwalk(src, R.material.type) return TRUE return + var/obj/item/stack/S = C var/decl/flooring/use_flooring var/list/decls = decls_repository.get_decls_of_subtype(/decl/flooring) @@ -103,21 +104,22 @@ if((ispath(S.type, F.build_type) || ispath(S.build_type, F.build_type)) && (isnull(F.build_material) || S.material?.type == F.build_material)) use_flooring = F break - if(!use_flooring) - return - // Do we have enough? - if(use_flooring.build_cost && S.get_amount() < use_flooring.build_cost) - to_chat(user, "You require at least [use_flooring.build_cost] [S.name] to complete the [use_flooring.descriptor].") - return TRUE - // Stay still and focus... - if(use_flooring.build_time && !do_after(user, use_flooring.build_time, src)) - return TRUE - if(flooring || !S || !user || !use_flooring) - return TRUE - if(S.use(use_flooring.build_cost)) - set_flooring(use_flooring) - playsound(src, 'sound/items/Deconstruct.ogg', 80, 1) - return TRUE + + if(use_flooring) + // Do we have enough? + if(use_flooring.build_cost && S.get_amount() < use_flooring.build_cost) + to_chat(user, "You require at least [use_flooring.build_cost] [S.name] to complete the [use_flooring.descriptor].") + return TRUE + // Stay still and focus... + if(use_flooring.build_time && !do_after(user, use_flooring.build_time, src)) + return TRUE + if(flooring || !S || !user || !use_flooring) + return TRUE + if(S.use(use_flooring.build_cost)) + set_flooring(use_flooring) + playsound(src, 'sound/items/Deconstruct.ogg', 80, 1) + return TRUE + // Repairs and Deconstruction. else if(IS_CROWBAR(C)) if(is_floor_damaged()) diff --git a/code/game/turfs/floors/natural/_natural.dm b/code/game/turfs/floors/natural/_natural.dm index 0f187cbbd71..83cb54ebdc5 100644 --- a/code/game/turfs/floors/natural/_natural.dm +++ b/code/game/turfs/floors/natural/_natural.dm @@ -6,7 +6,6 @@ desc = "Bare, barren sand." icon_state = "0" footstep_type = /decl/footsteps/asteroid - open_turf_type = /turf/open turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH base_name = "ground" @@ -15,6 +14,8 @@ base_icon_state = "0" base_color = null + can_engrave = FALSE + var/dirt_color = "#7c5e42" var/possible_states = 0 var/icon_edge_layer = -1 @@ -112,12 +113,15 @@ return ..() /turf/floor/natural/on_reagent_change() - . = ..() + + if(!(. = ..())) + return + if(!QDELETED(src) && reagent_type && height < 0 && !QDELETED(reagents) && reagents.total_volume < abs(height)) add_to_reagents(reagent_type, abs(height) - reagents.total_volume) -/turf/floor/natural/dismantle_turf(devastated, explode, no_product) - return !!switch_to_base_turf() +/turf/floor/natural/dismantle_turf(devastated, explode, no_product, keep_air = TRUE) + return !!switch_to_base_turf(keep_air) /turf/floor/natural/get_soil_color() return dirt_color diff --git a/code/game/turfs/floors/natural/_natural_digging.dm b/code/game/turfs/floors/natural/_natural_digging.dm index 4b0651f8b07..dc5f8d3197e 100644 --- a/code/game/turfs/floors/natural/_natural_digging.dm +++ b/code/game/turfs/floors/natural/_natural_digging.dm @@ -16,13 +16,13 @@ if(is_fundament_turf) return ..() drop_diggable_resources() - ChangeTurf(/turf/floor/natural/dirt, keep_air = TRUE, keep_air_below = TRUE, keep_height = TRUE) + ChangeTurf(/turf/floor/natural/dirt, keep_air = TRUE, keep_height = TRUE) /turf/floor/natural/dig_farm(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) if(is_fundament_turf) return ..() drop_diggable_resources() - ChangeTurf(/turf/floor/natural/dirt, keep_air = TRUE, keep_air_below = TRUE, keep_height = TRUE) + ChangeTurf(/turf/floor/natural/dirt, keep_air = TRUE, keep_height = TRUE) /turf/floor/natural/dig_trench(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) if(is_fundament_turf) @@ -34,4 +34,4 @@ set_physical_height(new_height) else drop_diggable_resources() - ChangeTurf(/turf/floor/natural/dirt, keep_air = TRUE, keep_air_below = TRUE, keep_height = TRUE) + ChangeTurf(/turf/floor/natural/dirt, keep_air = TRUE, keep_height = TRUE) diff --git a/code/game/turfs/floors/natural/natural_barren.dm b/code/game/turfs/floors/natural/natural_barren.dm index 1fc3e31ce43..b9d7b458640 100644 --- a/code/game/turfs/floors/natural/natural_barren.dm +++ b/code/game/turfs/floors/natural/natural_barren.dm @@ -5,6 +5,9 @@ is_fundament_turf = TRUE material = /decl/material/solid/sand +/turf/floor/natural/barren/airless + initial_gas = null + /turf/floor/natural/barren/Initialize() if(prob(20)) LAZYADD(decals, image('icons/turf/flooring/decals.dmi', "asteroid[rand(0,9)]")) diff --git a/code/game/turfs/floors/natural/natural_dirt.dm b/code/game/turfs/floors/natural/natural_dirt.dm index e341d921881..46ca4824538 100644 --- a/code/game/turfs/floors/natural/natural_dirt.dm +++ b/code/game/turfs/floors/natural/natural_dirt.dm @@ -14,9 +14,9 @@ return 1 /turf/floor/natural/dirt/fluid_act(var/datum/reagents/fluids) - if(fluids?.total_volume < FLUID_SHALLOW) + if(fluids?.total_volume < FLUID_PUDDLE) return ..() - var/turf/new_turf = ChangeTurf(/turf/floor/natural/mud, keep_air = TRUE, keep_air_below = TRUE, keep_height = TRUE) + var/turf/new_turf = ChangeTurf(/turf/floor/natural/mud, keep_air = TRUE, keep_height = TRUE) return new_turf.fluid_act(fluids) /turf/floor/natural/dirt/drop_diggable_resources() diff --git a/code/game/turfs/floors/natural/natural_grass.dm b/code/game/turfs/floors/natural/natural_grass.dm index 3752fe2e607..420700a8d87 100644 --- a/code/game/turfs/floors/natural/natural_grass.dm +++ b/code/game/turfs/floors/natural/natural_grass.dm @@ -44,7 +44,7 @@ if(QDELETED(src) || !istype(src, /turf/floor/natural/grass/wild)) return TRUE new /obj/item/stack/material/bundle/grass(src, rand(2,5)) - ChangeTurf(/turf/floor/natural/grass) + ChangeTurf(/turf/floor/natural/grass, keep_air = TRUE) return TRUE return ..() diff --git a/code/game/turfs/floors/natural/natural_ice.dm b/code/game/turfs/floors/natural/natural_ice.dm index 5243fd873eb..93a2e517fca 100644 --- a/code/game/turfs/floors/natural/natural_ice.dm +++ b/code/game/turfs/floors/natural/natural_ice.dm @@ -45,4 +45,4 @@ /turf/floor/natural/snow/handle_melting(list/meltable_materials) . = ..() - ChangeTurf(/turf/floor/natural/ice, keep_height = TRUE) + ChangeTurf(/turf/floor/natural/ice, keep_air = TRUE, keep_height = TRUE) diff --git a/code/game/turfs/floors/natural/natural_mud.dm b/code/game/turfs/floors/natural/natural_mud.dm index 19bcd0c6de0..e129a3ba14d 100644 --- a/code/game/turfs/floors/natural/natural_mud.dm +++ b/code/game/turfs/floors/natural/natural_mud.dm @@ -37,7 +37,7 @@ /turf/floor/natural/mud/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(!reagents?.total_volume) - ChangeTurf(/turf/floor/natural/dry, keep_air = TRUE, keep_air_below = TRUE, keep_height = TRUE) + ChangeTurf(/turf/floor/natural/dry, keep_air = TRUE, keep_height = TRUE) return return ..() @@ -69,8 +69,8 @@ return 0.0 /turf/floor/natural/dry/fluid_act(datum/reagents/fluids) - if(fluids?.total_volume < FLUID_SHALLOW) + if(fluids?.total_volume < FLUID_PUDDLE) return ..() - var/turf/new_turf = ChangeTurf(/turf/floor/natural/mud, keep_air = TRUE, keep_air_below = TRUE, keep_height = TRUE) + var/turf/new_turf = ChangeTurf(/turf/floor/natural/mud, keep_air = TRUE, keep_height = TRUE) return new_turf.fluid_act(fluids) diff --git a/code/game/turfs/floors/subtypes/floor_cult.dm b/code/game/turfs/floors/subtypes/floor_cult.dm deleted file mode 100644 index 3fabc4b1b5c..00000000000 --- a/code/game/turfs/floors/subtypes/floor_cult.dm +++ /dev/null @@ -1,11 +0,0 @@ -/turf/floor/cult - name = "engraved floor" - icon = 'icons/turf/flooring/cult.dmi' - icon_state = "cult" - initial_flooring = /decl/flooring/reinforced/cult - -/turf/floor/cult/on_defilement() - return - -/turf/floor/cult/is_defiled() - return TRUE diff --git a/code/game/turfs/floors/subtypes/floor_static.dm b/code/game/turfs/floors/subtypes/floor_static.dm index e69eccc8c86..48f8e90ca3f 100644 --- a/code/game/turfs/floors/subtypes/floor_static.dm +++ b/code/game/turfs/floors/subtypes/floor_static.dm @@ -54,4 +54,4 @@ if(prob(A.explosion_resistance)) return if(severity == 1) - ChangeTurf(get_base_turf_by_area(src)) + ChangeTurf(get_base_turf_by_area(src), keep_air = TRUE) diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 3ce1ef22c78..265509a7488 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -90,3 +90,6 @@ var/turf/T = GetBelow(src) if(istype(T)) T.drill_act() + +/turf/open/airless + initial_gas = null \ No newline at end of file diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 10b090a89c3..09dc7ada26b 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -10,6 +10,7 @@ permit_ao = FALSE z_eventually_space = TRUE turf_flags = TURF_FLAG_BACKGROUND + can_inherit_air = FALSE open_turf_type = /turf/space @@ -58,7 +59,7 @@ if(SSmapping.base_floor_area) var/area/new_area = locate(SSmapping.base_floor_area) || new SSmapping.base_floor_area ChangeArea(src, new_area) - ChangeTurf(SSmapping.base_floor_type, keep_air_below = TRUE) + ChangeTurf(SSmapping.base_floor_type) /turf/space/proc/toggle_transit(var/direction) if(edge) @@ -126,8 +127,8 @@ if (A.x <= TRANSITIONEDGE || A.x >= (world.maxx - TRANSITIONEDGE + 1) || A.y <= TRANSITIONEDGE || A.y >= (world.maxy - TRANSITIONEDGE + 1)) A.touch_map_edge(OVERMAP_ID_SPACE) -/turf/space/ChangeTurf(var/turf/N, var/tell_universe = TRUE, var/force_lighting_update = FALSE, var/keep_air = FALSE, var/keep_air_below = FALSE, var/update_open_turfs_above = TRUE) - return ..(N, tell_universe, TRUE, keep_air, keep_air_below, update_open_turfs_above) +/turf/space/ChangeTurf(var/turf/N, var/tell_universe = TRUE, var/force_lighting_update = FALSE, var/keep_air = FALSE, var/update_open_turfs_above = TRUE) + return ..(N, tell_universe, TRUE, keep_air, update_open_turfs_above) /turf/space/is_open() return TRUE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 9cab27a3886..38a5f021071 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -60,6 +60,8 @@ //This exists to store air during zone rebuilds, as well as for unsimulated turfs. //They are never deleted to not overwhelm the garbage collector. var/datum/gas_mixture/air + ///Whether this tile is willing to copy air from a previous tile through ChangeTurf, transfer_turf_properties etc. + var/can_inherit_air = TRUE ///Is this turf queued in the TURFS cycle of SSair? var/needs_air_update = 0 @@ -263,15 +265,6 @@ if(W?.storage?.collection_mode && W.storage.gather_all(src, user)) return TRUE - // Must be open, but food items should not be filled from sources like this. They're open in order to add condiments, not to be poured into/out of. - // TODO: Rewrite open-container-ness or food to make this unnecessary! - if(ATOM_IS_OPEN_CONTAINER(W) && !istype(W, /obj/item/chems/food) && W.reagents && reagents?.total_volume >= FLUID_PUDDLE) - var/taking = min(reagents.total_volume, REAGENTS_FREE_SPACE(W.reagents)) - if(taking > 0) - to_chat(user, SPAN_NOTICE("You fill \the [W] with [reagents.get_primary_reagent_name()] from \the [src].")) - reagents.trans_to(W, taking) - return TRUE - if(istype(W, /obj/item) && storage && storage.use_to_pickup && storage.collection_mode) storage.gather_all(src, user) return TRUE @@ -287,6 +280,21 @@ if(IS_COIL(W) && try_build_cable(W, user)) return TRUE + if(reagents?.total_volume >= FLUID_PUDDLE) + // Must be open, but food items should not be filled from sources like this. They're open in order to add condiments, not to be poured into/out of. + // TODO: Rewrite open-container-ness or food to make this unnecessary! + if(ATOM_IS_OPEN_CONTAINER(W) && !istype(W, /obj/item/chems/food) && W.reagents) + var/taking = min(reagents.total_volume, REAGENTS_FREE_SPACE(W.reagents)) + if(taking > 0) + to_chat(user, SPAN_NOTICE("You fill \the [W] with [reagents.get_primary_reagent_name()] from \the [src].")) + reagents.trans_to(W, taking) + return TRUE + + if(user.a_intent == I_HELP) + user.visible_message(SPAN_NOTICE("\The [user] dips \the [W] into \the [reagents.get_primary_reagent_name()].")) + W.fluid_act(reagents) + return TRUE + return ..() /turf/Enter(atom/movable/mover, atom/forget) @@ -407,9 +415,8 @@ return 0 /turf/proc/remove_cleanables() - for(var/obj/effect/O in src) - if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable)) - qdel(O) + for(var/obj/effect/decal/cleanable/cleanable in src) + qdel(cleanable) /turf/proc/remove_decals() LAZYCLEARLIST(decals) @@ -498,18 +505,17 @@ // We have a weather system and we are exposed to it; update our vis contents. if(istype(new_weather) && is_outside()) if(weather != new_weather) - if(weather) - remove_vis_contents(weather.vis_contents_additions) weather = new_weather - add_vis_contents(weather.vis_contents_additions) . = TRUE // We are indoors or there is no local weather system, clear our vis contents. else if(weather) - remove_vis_contents(weather.vis_contents_additions) weather = null . = TRUE + if(.) + update_vis_contents() + // Propagate our weather downwards if we permit it. if(force_update_below || (is_open() && .)) var/turf/below = GetBelow(src) @@ -517,27 +523,20 @@ below.update_weather(new_weather) // Updates turf participation in ZAS according to outside status. Must be called whenever the outside status of a turf may change. -/turf/proc/update_external_atmos_participation(overwrite_air = TRUE) +/turf/proc/update_external_atmos_participation() + var/old_outside = last_outside_check + last_outside_check = OUTSIDE_UNCERTAIN if(is_outside()) if(zone && external_atmosphere_participation) if(can_safely_remove_from_zone()) - #ifdef MULTIZAS - var/dirs = global.cardinalz - #else - var/dirs = global.cardinal - #endif zone.remove(src) - // Update neighbors to create edges between zones and exterior - for(var/dir in dirs) - var/turf/neighbor = get_step(src, dir) - SSair.mark_for_update(neighbor) else zone.rebuild() - else if(zone_membership_candidate) + else if(!zone && zone_membership_candidate && old_outside == OUTSIDE_YES) // Set the turf's air to the external atmosphere to add to its new zone. - if(overwrite_air) - air = get_external_air(FALSE) - SSair.mark_for_update(src) + air = get_external_air(FALSE) + + SSair.mark_for_update(src) /turf/proc/is_outside() @@ -577,9 +576,9 @@ return FALSE is_outside = new_outside - last_outside_check = OUTSIDE_UNCERTAIN - SSambience.queued |= src update_external_atmos_participation() + SSambience.queued |= src + if(!skip_weather_update) update_weather() @@ -592,7 +591,7 @@ checking = GetBelow(checking) if(!isturf(checking)) break - checking.last_outside_check = OUTSIDE_UNCERTAIN + checking.update_external_atmos_participation() if(!checking.is_open()) break return TRUE @@ -610,8 +609,8 @@ var/air_graphic = get_air_graphic() if(length(air_graphic)) LAZYDISTINCTADD(., air_graphic) - if(weather) - LAZYADD(., weather) + if(length(weather?.vis_contents_additions)) + LAZYADD(., weather.vis_contents_additions) if(flooded) var/flood_object = get_flood_overlay(flooded) if(flood_object) @@ -644,13 +643,6 @@ ChangeTurf(base_turf_type) return 2 -/turf/on_defilement() - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.add_cultiness(CULTINESS_PER_TURF) - -/turf/proc/is_defiled() - return (locate(/obj/effect/narsie_footstep) in src) - /turf/proc/resolve_to_actual_turf() return src @@ -686,7 +678,7 @@ /turf/add_blood(mob/living/M) if(!simulated || !..() || !ishuman(M)) return FALSE - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/unique_enzymes = H.get_unique_enzymes() var/blood_type = H.get_blood_type() if(unique_enzymes && blood_type) diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 47547dd41a0..a6e22f9bb7b 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -1,11 +1,11 @@ -/turf/proc/switch_to_base_turf() +/turf/proc/switch_to_base_turf(keep_air) var/base_turf = get_base_turf_by_area(src) if(base_turf && type != base_turf) - return ChangeTurf(base_turf) + return ChangeTurf(base_turf, keep_air = keep_air) return src -/turf/proc/dismantle_turf(devastated, explode, no_product) - var/turf/new_turf = switch_to_base_turf() +/turf/proc/dismantle_turf(devastated, explode, no_product, keep_air = TRUE) + var/turf/new_turf = switch_to_base_turf(keep_air) if(!no_product && istype(new_turf) && !new_turf.is_open() && !(locate(/obj/structure/lattice) in new_turf)) new /obj/structure/lattice(new_turf) return !!new_turf @@ -31,11 +31,11 @@ if(!restrict_type || istype(above, restrict_type)) if(respect_area) var/area/A = get_area(above) - above.ChangeTurf(A?.open_turf || open_turf_type, update_open_turfs_above = FALSE) + above.ChangeTurf(A?.open_turf || open_turf_type, keep_air = TRUE, update_open_turfs_above = FALSE) else - above.ChangeTurf(open_turf_type, update_open_turfs_above = FALSE) + above.ChangeTurf(open_turf_type, keep_air = TRUE, update_open_turfs_above = FALSE) -/turf/proc/ChangeTurf(var/turf/N, var/tell_universe = TRUE, var/force_lighting_update = FALSE, var/keep_air = FALSE, var/keep_air_below = FALSE, var/update_open_turfs_above = TRUE, var/keep_height = FALSE) +/turf/proc/ChangeTurf(var/turf/N, var/tell_universe = TRUE, var/force_lighting_update = FALSE, var/keep_air = FALSE, var/update_open_turfs_above = TRUE, var/keep_height = FALSE) if (!N) return @@ -51,7 +51,6 @@ // Track a number of old values for the purposes of raising // state change events after changing the turf to the new type. - var/old_air = air var/old_fire = fire var/old_above = above var/old_opacity = opacity @@ -74,6 +73,18 @@ var/old_ambient_light_old_g = ambient_light_old_g var/old_ambient_light_old_b = ambient_light_old_b + var/old_zone_membership_candidate = zone_membership_candidate + + // Create a copy of the old air value to apply. + var/datum/gas_mixture/old_air + if(keep_air) + // Bypass calling return_air to avoid creating a direct reference to zone air. + if(zone) + c_copy_air() + old_air = air + else + old_air = return_air() + changing_turf = TRUE qdel(src) @@ -89,7 +100,7 @@ regenerate_ao() // Update ZAS, atmos and fire. - if(keep_air) + if(keep_air && W.can_inherit_air) W.air = old_air if(old_fire) if(W.simulated) @@ -136,19 +147,24 @@ // end of lighting stuff + // In case the turf isn't marked for update in Initialize (e.g. space), we call this to create any unsimulated edges necessary. + if(W.zone_membership_candidate != old_zone_membership_candidate) + SSair.mark_for_update(src) + // we check the var rather than the proc, because area outside values usually shouldn't be set on turfs W.last_outside_check = OUTSIDE_UNCERTAIN if(W.is_outside != old_outside) + // This will check the exterior atmos participation of this turf and all turfs connected by open space below. W.set_outside(old_outside, skip_weather_update = TRUE) - - var/turf/below = GetBelow(src) - if(below) - below.last_outside_check = OUTSIDE_UNCERTAIN - - // If the turf is at the top of the Z-stack and changed its outside status, or if it's changed its open status, let the turf below check if - // it should change its ZAS participation - if((!HasAbove(z) && (W.is_outside != old_outside)) || W.is_open() != old_is_open) - below.update_external_atmos_participation(!keep_air_below) + else if(HasBelow(z) && (W.is_open() != old_is_open)) // Otherwise, we do it here if the open status of the turf has changed. + var/turf/checking = src + while(HasBelow(checking.z)) + checking = GetBelow(checking) + if(!isturf(checking)) + break + checking.update_external_atmos_participation() + if(!checking.is_open()) + break W.update_weather(force_update_below = W.is_open() != old_is_open) @@ -161,12 +177,12 @@ for(var/atom/movable/AM in W.contents) AM.update_turf_alpha_mask() -/turf/proc/transport_properties_from(turf/other) - if(other.zone) +/turf/proc/transport_properties_from(turf/other, transport_air) + if(transport_air && can_inherit_air && (other.zone || other.air)) if(!air) make_air() - air.copy_from(other.zone.air) - other.zone.remove(other) + air.copy_from(other.zone ? other.zone.air : other.air) + other.zone?.remove(other) if(!istype(other, src.type)) return 0 src.set_dir(other.dir) diff --git a/code/game/turfs/turf_fluids.dm b/code/game/turfs/turf_fluids.dm index a8d9aec550f..3d77fb726a3 100644 --- a/code/game/turfs/turf_fluids.dm +++ b/code/game/turfs/turf_fluids.dm @@ -39,7 +39,7 @@ /turf/proc/set_flooded(new_flooded, force = FALSE, skip_vis_contents_update = FALSE, mapload = FALSE) // Don't do unnecessary work. - if(!force && new_flooded == flooded) + if(!simulated || (!force && new_flooded == flooded)) return // Remove our old overlay if necessary. @@ -163,7 +163,8 @@ /turf/on_reagent_change() - ..() + if(!(. = ..())) + return if(reagents?.total_volume > FLUID_QDEL_POINT) ADD_ACTIVE_FLUID(src) diff --git a/code/game/turfs/unsimulated.dm b/code/game/turfs/unsimulated.dm index 32416eceb20..a2beb5cbb91 100644 --- a/code/game/turfs/unsimulated.dm +++ b/code/game/turfs/unsimulated.dm @@ -15,6 +15,3 @@ /turf/unsimulated/get_lumcount(var/minlum = 0, var/maxlum = 1) return 0.8 - -/turf/unsimulated/on_defilement() - return diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index bcb1441d399..2bb713b9a09 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -18,6 +18,16 @@ icon = 'icons/turf/walls.dmi' icon_state = "rockvault" +/turf/unsimulated/mask_alt // just a second mask type for maps needing two random map runs + name = "mask" + icon = 'icons/turf/walls.dmi' + icon_state = "rockvault" + color = COLOR_SILVER + +/turf/unsimulated/mask/flooded + flooded = /decl/material/liquid/water + color = COLOR_LIQUID_WATER + /turf/unsimulated/floor/rescue_base icon_state = "asteroidfloor" diff --git a/code/game/turfs/walls/_wall.dm b/code/game/turfs/walls/_wall.dm index 71d107f7f1e..768b15f8288 100644 --- a/code/game/turfs/walls/_wall.dm +++ b/code/game/turfs/walls/_wall.dm @@ -146,7 +146,7 @@ var/global/list/wall_fullblend_objects = list( plant.update_icon() plant.reset_offsets(0) -/turf/wall/ChangeTurf(var/turf/N, var/tell_universe = TRUE, var/force_lighting_update = FALSE, var/keep_air = FALSE, var/keep_air_below = FALSE, var/update_open_turfs_above = TRUE) +/turf/wall/ChangeTurf(var/turf/N, var/tell_universe = TRUE, var/force_lighting_update = FALSE, var/keep_air = FALSE, var/update_open_turfs_above = TRUE) clear_plants() . = ..() @@ -184,7 +184,7 @@ var/global/list/wall_fullblend_objects = list( F.icon_state = "wall_thermite" visible_message(SPAN_DANGER("\The [src] spontaneously combusts!")) -/turf/wall/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/turf/wall/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(damage) src.damage = max(0, src.damage + damage) update_damage() @@ -229,7 +229,7 @@ var/global/list/wall_fullblend_objects = list( if(material) material.place_dismantled_product(src, devastated, amount = rand(min_dismantle_amount, max_dismantle_amount), drop_type = get_dismantle_stack_type()) -/turf/wall/dismantle_turf(devastated, explode, no_product) +/turf/wall/dismantle_turf(devastated, explode, no_product, keep_air = TRUE) playsound(src, get_dismantle_sound(), 100, 1) if(!no_product) @@ -242,7 +242,7 @@ var/global/list/wall_fullblend_objects = list( else O.forceMove(src) clear_plants() - . = ChangeTurf(floor_type || get_base_turf_by_area(src)) + . = ChangeTurf(floor_type || get_base_turf_by_area(src), keep_air = keep_air) /turf/wall/explosion_act(severity) SHOULD_CALL_PARENT(FALSE) @@ -300,20 +300,6 @@ var/global/list/wall_fullblend_objects = list( /turf/wall/is_wall() return TRUE -/turf/wall/on_defilement() - var/new_material - if(material?.type != /decl/material/solid/stone/cult) - new_material = /decl/material/solid/stone/cult - var/new_rmaterial - if(reinf_material && reinf_material.type != /decl/material/solid/stone/cult/reinforced) - new_rmaterial = /decl/material/solid/stone/cult/reinforced - if(new_material || new_rmaterial) - ..() - set_turf_materials(new_material, new_rmaterial) - -/turf/wall/is_defiled() - return material?.type == /decl/material/solid/stone/cult || reinf_material?.type == /decl/material/solid/stone/cult/reinforced || ..() - /turf/wall/handle_universal_decay() handle_melting() diff --git a/code/game/turfs/walls/wall_attacks.dm b/code/game/turfs/walls/wall_attacks.dm index dc36abe2097..06c7269a780 100644 --- a/code/game/turfs/walls/wall_attacks.dm +++ b/code/game/turfs/walls/wall_attacks.dm @@ -47,7 +47,6 @@ update_thermal(turf) SSair.mark_for_update(turf) - /turf/wall/proc/update_thermal(var/turf/source) if(istype(source) && source.simulated) if(density && opacity) @@ -76,7 +75,7 @@ add_fingerprint(user) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/obj/item/hand = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) if(hand && try_graffiti(H, hand)) return TRUE diff --git a/code/game/turfs/walls/wall_natural.dm b/code/game/turfs/walls/wall_natural.dm index c41e1d4c247..fc5ee9c5f0d 100644 --- a/code/game/turfs/walls/wall_natural.dm +++ b/code/game/turfs/walls/wall_natural.dm @@ -11,6 +11,10 @@ var/static/list/exterior_wall_shine_cache = list() var/being_mined = FALSE +/turf/wall/natural/flooded + flooded = /decl/material/liquid/water + color = COLOR_LIQUID_WATER + /turf/wall/natural/get_paint_examine_message() return SPAN_NOTICE("It has been noticeably discoloured by the elements.") @@ -118,13 +122,14 @@ /turf/wall/natural/get_dismantle_sound() return 'sound/effects/rockcrumble.ogg' -/turf/wall/natural/dismantle_turf(devastated, explode, no_product, ramp_update = TRUE) +// Natural walls are typically dense, and should not contain any air a-la normal walls, so we set keep_air = FALSE by default. +/turf/wall/natural/dismantle_turf(devastated, explode, no_product, keep_air = FALSE, ramp_update = TRUE) destroy_artifacts(null, INFINITY) if(ramp_update && !ramp_slope_direction) ramp_slope_direction = NORTH // Temporary so we don't let any neighboring ramps use us as supports. update_neighboring_ramps() ramp_slope_direction = null - return ..(devastated, explode, no_product) + return ..(devastated, explode, no_product, keep_air) /turf/wall/natural/Bumped(var/atom/movable/AM) . = ..() @@ -170,9 +175,6 @@ /turf/wall/natural/get_default_material() . = GET_DECL(get_strata_material_type() || /decl/material/solid/stone/sandstone) -/turf/wall/natural/on_defilement() - ChangeTurf(/turf/wall/cult) - /turf/wall/natural/get_strata_material_type() //Turf strata overrides level strata if(ispath(strata_override, /decl/strata)) diff --git a/code/game/turfs/walls/wall_types.dm b/code/game/turfs/walls/wall_types.dm index 357f41ee00f..06cf0c0f02b 100644 --- a/code/game/turfs/walls/wall_types.dm +++ b/code/game/turfs/walls/wall_types.dm @@ -95,34 +95,6 @@ if(prob(explosion_resistance)) ..() -//Cult wall -/turf/wall/cult - icon_state = "cult" - color = COLOR_RED_GRAY - material = /decl/material/solid/stone/cult - -/turf/wall/cult/on_defilement() - return - -/turf/wall/cult/is_defiled() - return TRUE - -/turf/wall/cult/reinf - icon_state = "reinforced_cult" - reinf_material = /decl/material/solid/stone/cult/reinforced - -/turf/wall/cult/dismantle_turf(devastated, explode, no_product) - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.remove_cultiness(CULTINESS_PER_TURF) - . = ..() - -/turf/wall/cult/can_join_with(var/turf/wall/W) - if(material && W.material && material.icon_base == W.material.icon_base) - return 1 - else if(istype(W, /turf/wall)) - return 1 - return 0 - /turf/wall/shuttle material = /decl/material/solid/metal/titanium paint_color = COLOR_BEIGE diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index 18f3eede702..4131ea677ae 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -46,7 +46,7 @@ entry += " - Antagonist" if(C.is_afk()) entry += " (AFK - [C.inactivity2text()])" - entry += " (?)" + entry += " (?)" Lines += entry else for(var/client/C in global.clients) diff --git a/code/game/world.dm b/code/game/world.dm index 58ee2cd4041..f5b8dc6d4a7 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -50,7 +50,7 @@ GLOBAL_PROTECTED_UNTYPED(game_id, null) if(special_role_name) strings += special_role_name if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.species) strings += H.species.name for(var/text in strings) @@ -128,6 +128,13 @@ var/global/world_topic_last = world.timeofday return TC.try_use(T, addr, master, key) /world/Reboot(var/reason) + + if(get_config_value(/decl/config/toggle/wait_for_sigusr1_reboot) && reason != 3) + text2file("foo", "reboot_called") + to_world("World reboot waiting for external scripts. Please be patient.") + global.Master.restart_timeout = 5 MINUTES + return + if(global.using_map.reboot_sound) sound_to(world, sound(pick(global.using_map.reboot_sound)))// random end sounds!! - LastyBatsy @@ -138,11 +145,6 @@ var/global/world_topic_last = world.timeofday for(var/client/C in global.clients) to_chat(C, link("byond://[serverurl]")) - if(get_config_value(/decl/config/toggle/wait_for_sigusr1_reboot) && reason != 3) - text2file("foo", "reboot_called") - to_world("World reboot waiting for external scripts. Please be patient.") - return - game_log("World rebooted at [time_stamp()]") callHook("reboot") diff --git a/code/game/world_topic_commands.dm b/code/game/world_topic_commands.dm index 029ac226b5d..78a4319710c 100644 --- a/code/game/world_topic_commands.dm +++ b/code/game/world_topic_commands.dm @@ -85,7 +85,7 @@ var/global/list/decl/topic_command/topic_commands = list() s["enter"] = get_config_value(/decl/config/toggle/on/enter_allowed) s["vote"] = get_config_value(/decl/config/toggle/vote_mode) s["ai"] = !!length(empty_playable_ai_cores) - s["host"] = host || null + s["host"] = get_config_value(/decl/config/text/hosted_by) // This is dumb, but spacestation13.com's banners break if player count isn't the 8th field of the reply, so... this has to go here. s["players"] = 0 @@ -283,7 +283,7 @@ var/global/list/decl/topic_command/topic_commands = list() brain = L.get_damage(BRAIN) )) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M info["species"] = H.species.name else info["species"] = "non-human" @@ -319,8 +319,8 @@ var/global/list/decl/topic_command/topic_commands = list() if(rank == "Unknown") rank = "Staff" - var/message = SPAN_RED("[rank] PM from [params["sender"]]: [params["msg"]]") - var/amessage = SPAN_BLUE("[rank] PM from [params["sender"]] to [key_name(C)] : [params["msg"]]") + var/message = SPAN_RED("[rank] PM from [params["sender"]]: [params["msg"]]") + var/amessage = SPAN_BLUE("[rank] PM from [params["sender"]] to [key_name(C)] : [params["msg"]]") C.received_irc_pm = world.time C.irc_admin = params["sender"] diff --git a/code/modules/ZAS/Airflow.dm b/code/modules/ZAS/Airflow.dm index 9bd6651b0c3..ca6abe6fa8f 100644 --- a/code/modules/ZAS/Airflow.dm +++ b/code/modules/ZAS/Airflow.dm @@ -50,7 +50,7 @@ Contains helper procs for airflow, called by /connection_group. /mob/living/silicon/handle_airflow() return FALSE -/mob/living/carbon/human/handle_airflow_stun() +/mob/living/human/handle_airflow_stun() if(!slip_chance()) to_chat(src, SPAN_NOTICE("Air suddenly rushes past you!")) return FALSE @@ -134,7 +134,7 @@ Contains helper procs for airflow, called by /connection_group. airflow_speed = 0 airflow_dest = null -/mob/living/carbon/human/airflow_hit(atom/A) +/mob/living/human/airflow_hit(atom/A) // for(var/mob/M in hearers(src)) // M.show_message("[src] slams into [A]!",1,"You hear a loud slam!",2) playsound(src.loc, "punch", 25, 1, -1) diff --git a/code/modules/ZAS/Atom.dm b/code/modules/ZAS/Atom.dm index 5a0718df918..67489bd4d69 100644 --- a/code/modules/ZAS/Atom.dm +++ b/code/modules/ZAS/Atom.dm @@ -32,6 +32,7 @@ for(var/turf/turf in locs) if(turf.simulated) SSair.mark_for_update(turf) + fluid_update() return TRUE diff --git a/code/modules/ZAS/ConnectionGroup.dm b/code/modules/ZAS/ConnectionGroup.dm index 51502dbe002..4eea0454014 100644 --- a/code/modules/ZAS/ConnectionGroup.dm +++ b/code/modules/ZAS/ConnectionGroup.dm @@ -197,7 +197,6 @@ Class Procs: /connection_edge/unsimulated/var/turf/B /connection_edge/unsimulated/var/datum/gas_mixture/air -/connection_edge/unsimulated/var/list/inner_turfs = list() /connection_edge/unsimulated/New(zone/A, turf/B) src.A = A @@ -213,15 +212,18 @@ Class Procs: /connection_edge/unsimulated/add_connection(connection/c) . = ..() connecting_turfs.Add(c.B) - inner_turfs |= c.A air.group_multiplier = coefficient /connection_edge/unsimulated/remove_connection(connection/c) connecting_turfs.Remove(c.B) - inner_turfs.Remove(c.A) air.group_multiplier = coefficient . = ..() + // Update the air mix + if(coefficient && (B == c.B) && !(B in connecting_turfs)) + B = pick(connecting_turfs) + air = B.return_air() + /connection_edge/unsimulated/erase() A.edges.Remove(src) . = ..() @@ -253,10 +255,6 @@ Class Procs: if(!A.air.compare(air, vacuum_exception = 1)) SSair.mark_edge_active(src) -/connection_edge/unsimulated/update_post_merge() - for(var/turf/T in inner_turfs) - SSair.mark_for_update(T) - /proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) //This implements a simplistic version of the Stefan-Boltzmann law. var/energy_delta = ((A.temperature - B.temperature) ** 4) * STEFAN_BOLTZMANN_CONSTANT * connecting_tiles * 2.5 diff --git a/code/modules/ZAS/Contaminants.dm b/code/modules/ZAS/Contaminants.dm index 09b25da6a8b..57a5ee2d801 100644 --- a/code/modules/ZAS/Contaminants.dm +++ b/code/modules/ZAS/Contaminants.dm @@ -49,7 +49,7 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' /mob/proc/contaminate() -/mob/living/carbon/human/contaminate() +/mob/living/human/contaminate() //See if anything can be contaminated. if(!contaminant_suit_protected()) @@ -65,7 +65,7 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' /mob/proc/handle_contaminants() return -/mob/living/carbon/human/handle_contaminants() +/mob/living/human/handle_contaminants() //Handles all the bad things contaminants can do. //Contamination @@ -96,12 +96,10 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' //Genetic Corruption if(vsc.contaminant_control.GENETIC_CORRUPTION) if(rand(1,10000) < vsc.contaminant_control.GENETIC_CORRUPTION) - randmutb(src) + add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/disability))) to_chat(src, "High levels of toxins cause you to spontaneously mutate!") - domutcheck(src,null) - -/mob/living/carbon/human/proc/burn_eyes() +/mob/living/human/proc/burn_eyes() var/obj/item/organ/internal/eyes/E = get_organ(BP_EYES, /obj/item/organ/internal/eyes) if(E && !E.bodytype.eye_contaminant_guard) if(prob(20)) to_chat(src, "Your eyes burn!") @@ -111,7 +109,7 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' to_chat(src, "You are blinded!") SET_STATUS_MAX(src, STAT_BLIND, 20) -/mob/living/carbon/human/proc/contaminant_head_protected() +/mob/living/human/proc/contaminant_head_protected() //Checks if the head is adequately sealed. var/obj/item/head = get_equipped_item(slot_head_str) if(!head) @@ -123,7 +121,7 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' // Regardless, the head item must cover the face and head. Eyes are checked seperately above. return BIT_TEST_ALL(head.body_parts_covered, SLOT_HEAD|SLOT_FACE) -/mob/living/carbon/human/proc/contaminant_suit_protected() +/mob/living/human/proc/contaminant_suit_protected() //Checks if the suit is adequately sealed. var/coverage = 0 for(var/slot in list(slot_wear_suit_str, slot_gloves_str, slot_shoes_str)) @@ -139,7 +137,7 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' return BIT_TEST_ALL(coverage, SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET|SLOT_ARMS|SLOT_HANDS) -/mob/living/carbon/human/proc/suit_contamination() +/mob/living/human/proc/suit_contamination() //Runs over the things that can be contaminated and does so. for(var/slot in list(slot_w_uniform_str, slot_shoes_str, slot_gloves_str)) var/obj/item/gear = get_equipped_item(slot) diff --git a/code/modules/ZAS/Fire.dm b/code/modules/ZAS/Fire.dm index 303e07ec7ea..c961aed56c7 100644 --- a/code/modules/ZAS/Fire.dm +++ b/code/modules/ZAS/Fire.dm @@ -324,7 +324,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return mx -/mob/living/carbon/human/FireBurn(var/firelevel, var/last_temperature, var/pressure) +/mob/living/human/FireBurn(var/firelevel, var/last_temperature, var/pressure) //Burns mobs due to fire. Respects heat transfer coefficients on various body parts. //Due to TG reworking how fireprotection works, this is kinda less meaningful. diff --git a/code/modules/ZAS/Turf.dm b/code/modules/ZAS/Turf.dm index c693c1bf980..28c6f073843 100644 --- a/code/modules/ZAS/Turf.dm +++ b/code/modules/ZAS/Turf.dm @@ -29,6 +29,7 @@ return 1 + var/zas_participation = SHOULD_PARTICIPATE_IN_ZONES(src) var/previously_open = airflow_open_directions airflow_open_directions = 0 @@ -83,58 +84,69 @@ if(TURF_HAS_VALID_ZONE(unsim)) - //Might have assigned a zone, since this happens for each direction. - if(!zone) + if(zas_participation) + //Might have assigned a zone, since this happens for each direction. + if(!zone) - //We do not merge if - // they are blocking us and we are not blocking them, or if - // we are blocking them and not blocking ourselves - this prevents tiny zones from forming on doorways. - if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || ((r_block & ZONE_BLOCKED) && !(s_block & ZONE_BLOCKED))) - #ifdef ZASDBG - if(verbose) - zas_log("[dir2text(d)] is zone blocked.") - //dbg(ZAS_ZONE_BLOCKER(d)) - #endif + //We do not merge if + // they are blocking us and we are not blocking them, or if + // we are blocking them and not blocking ourselves - this prevents tiny zones from forming on doorways. + if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || ((r_block & ZONE_BLOCKED) && !(s_block & ZONE_BLOCKED))) + #ifdef ZASDBG + if(verbose) + zas_log("[dir2text(d)] is zone blocked.") + //dbg(ZAS_ZONE_BLOCKER(d)) + #endif + + //Postpone this tile rather than exit, since a connection can still be made. + if(!postponed) postponed = list() + postponed.Add(unsim) - //Postpone this tile rather than exit, since a connection can still be made. - if(!postponed) postponed = list() - postponed.Add(unsim) + else - else + unsim.zone.add(src) - unsim.zone.add(src) + #ifdef ZASDBG + dbg(zasdbgovl_assigned) + if(verbose) + zas_log("Added to [zone]") + #endif + + else if(unsim.zone != zone) #ifdef ZASDBG - dbg(zasdbgovl_assigned) if(verbose) - zas_log("Added to [zone]") + zas_log("Connecting to [unsim.zone]") #endif - else if(unsim.zone != zone) + SSair.connect(src, unsim) + + + #ifdef ZASDBG + else if(verbose) + zas_log("[dir2text(d)] has same zone.") + #endif + else #ifdef ZASDBG if(verbose) - zas_log("Connecting to [unsim.zone]") + zas_log("Connecting non-ZAS turf to [unsim.zone]") #endif - SSair.connect(src, unsim) - - - #ifdef ZASDBG - else if(verbose) - zas_log("[dir2text(d)] has same zone.") + SSair.connect(unsim, src) + #ifdef ZASDBG else if(verbose) zas_log("[dir2text(d)] has an invalid or rebuilding zone.") - #endif + #endif - else + else if(zas_participation) //Postponing connections to tiles until a zone is assured. if(!postponed) postponed = list() postponed.Add(unsim) - if(!TURF_HAS_VALID_ZONE(src)) //Still no zone, make a new one. + if(zas_participation && !TURF_HAS_VALID_ZONE(src)) //Still no zone, make a new one. var/zone/newzone = new/zone() newzone.add(src) @@ -143,10 +155,10 @@ if(verbose) zas_log("New zone created for src.") - ASSERT(zone) + ASSERT(!zas_participation || zone) #endif - //At this point, a zone should have happened. If it hasn't, don't add more checks, fix the bug. + //At this point, a zone should have happened if the turf participates in ZAS. If it hasn't, don't add more checks, fix the bug. for(var/turf/T in postponed) SSair.connect(src, T) @@ -273,4 +285,4 @@ if(!air) air = new/datum/gas_mixture air.copy_from(zone.air) - air.group_multiplier = 1 + air.group_multiplier = 1 \ No newline at end of file diff --git a/code/modules/ZAS/Variable Settings.dm b/code/modules/ZAS/Variable Settings.dm index 731aa8437ae..e53e6955c5b 100644 --- a/code/modules/ZAS/Variable Settings.dm +++ b/code/modules/ZAS/Variable Settings.dm @@ -111,7 +111,7 @@ var/global/vs_control/vsc = new vw = vars[ch] if("[ch]_DESC" in vars) vw_desc = vars["[ch]_DESC"] if("[ch]_NAME" in vars) vw_name = vars["[ch]_NAME"] - dat += "[vw_name] = [vw] \[Change\]
" + dat += "[vw_name] = [vw] \[Change\]
" dat += "[vw_desc]

" show_browser(user, dat, "window=settings") @@ -307,15 +307,15 @@ var/global/vs_control/vsc = new connection_insulation = initial(connection_insulation) connection_temperature_delta = initial(connection_temperature_delta) - contaminant_control.CONTAMINANT_DMG = initial(contaminant_control.CONTAMINANT_DMG) - contaminant_control.CLOTH_CONTAMINATION = initial(contaminant_control.CLOTH_CONTAMINATION) - contaminant_control.STRICT_PROTECTION_ONLY = initial(contaminant_control.STRICT_PROTECTION_ONLY) - contaminant_control.GENETIC_CORRUPTION = initial(contaminant_control.GENETIC_CORRUPTION) - contaminant_control.SKIN_BURNS = initial(contaminant_control.SKIN_BURNS) - contaminant_control.EYE_BURNS = initial(contaminant_control.EYE_BURNS) - contaminant_control.CONTAMINATION_LOSS = initial(contaminant_control.CONTAMINATION_LOSS) - contaminant_control.CONTAMINANT_HALLUCINATION = initial(contaminant_control.CONTAMINANT_HALLUCINATION) - contaminant_control.N2O_HALLUCINATION = initial(contaminant_control.N2O_HALLUCINATION) + contaminant_control.CONTAMINANT_DMG = initial(contaminant_control.CONTAMINANT_DMG) + contaminant_control.CLOTH_CONTAMINATION = initial(contaminant_control.CLOTH_CONTAMINATION) + contaminant_control.STRICT_PROTECTION_ONLY = initial(contaminant_control.STRICT_PROTECTION_ONLY) + contaminant_control.GENETIC_CORRUPTION = initial(contaminant_control.GENETIC_CORRUPTION) + contaminant_control.SKIN_BURNS = initial(contaminant_control.SKIN_BURNS) + contaminant_control.EYE_BURNS = initial(contaminant_control.EYE_BURNS) + contaminant_control.CONTAMINATION_LOSS = initial(contaminant_control.CONTAMINATION_LOSS) + contaminant_control.CONTAMINANT_HALLUCINATION = initial(contaminant_control.CONTAMINANT_HALLUCINATION) + contaminant_control.N2O_HALLUCINATION = initial(contaminant_control.N2O_HALLUCINATION) to_world("[key_name(user)] changed the global contaminant/ZAS settings to \"[def]\"") diff --git a/code/modules/acting/acting_items.dm b/code/modules/acting/acting_items.dm index 9fb767b16fb..ac454ee5975 100644 --- a/code/modules/acting/acting_items.dm +++ b/code/modules/acting/acting_items.dm @@ -32,13 +32,12 @@ SHOULD_CALL_PARENT(FALSE) if(!ishuman(user)) return ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user H.change_appearance(APPEARANCE_ALL, H.loc, H, H.generate_valid_species(), state = global.z_topic_state) var/getName = sanitize(input(H, "Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN) if(getName) H.real_name = getName H.SetName(getName) - H.dna.real_name = getName if(H.mind) H.mind.name = H.name return TRUE diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 7f4ea462f4a..5f2e3c19cc6 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -189,7 +189,7 @@ var/global/savefile/Banlist if(!expiry) expiry = "Removal Pending" else expiry = "Permaban" - dat += text("(U)(E) Key: [key]ComputerID: [id]IP: [ip] [expiry](By: [by])(Reason: [reason])") + dat += text("(U)(E) Key: [key]ComputerID: [id]IP: [ip] [expiry](By: [by])(Reason: [reason])") dat += "" dat = "
Bans: (U) = Unban , (E) = Edit Ban - ([count] Bans)
[dat]" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index eab1a14f3fd..000078e5a79 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -31,10 +31,10 @@ var/global/BSACooldown = 0 /proc/message_staff_fax(var/obj/item/paper/admin/fax, var/obj/machinery/faxmachine/destination, var/owner, var/dest_network_id = "UNKNOWN", var/dest_network_tag = "UNKNOWN") var/msg if(fax.sender) - msg = "FAX LOG:[key_name_admin(owner)] replied to a fax message from [key_name_admin(fax.sender)] (VIEW)" + msg = "FAX LOG:[key_name_admin(owner)] replied to a fax message from [key_name_admin(fax.sender)] (VIEW)" log_admin("[key_name(owner)] replied to a fax message from [key_name(fax.sender)]") else - msg = "FAX LOG:[key_name_admin(owner)] has sent a fax message to \the [get_area(fax)]'s [destination] ('[dest_network_id]'.'[dest_network_tag]')(VIEW)" + msg = "FAX LOG:[key_name_admin(owner)] has sent a fax message to \the [get_area(fax)]'s [destination] ('[dest_network_id]'.'[dest_network_tag]')(VIEW)" log_admin("[key_name(owner)] has sent a fax message to \the [get_area(fax)]'s [destination] ('[dest_network_id]'.'[dest_network_tag]')") for(var/client/C in global.admins) @@ -62,62 +62,62 @@ var/global/BSACooldown = 0 var/last_ckey = LAST_CKEY(M) if(M.client) body += " played by [M.client] " - body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\]" + body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\]" else if(last_ckey) body += " (last occupied by ckey [last_ckey])" if(isnewplayer(M)) body += " Hasn't Entered Game " else - body += " \[Heal\] " + body += " \[Heal\] " var/mob/living/exosuit/E = M if(istype(E) && E.pilots) body += "
Exosuit pilots:
" for(var/mob/living/pilot in E.pilots) body += "[pilot] " - body += " \[link\]
" + body += " \[link\]
" body += {"

\[ - View Vars - - Roles - - PM - - Narrate - + View Vars - + Roles - + PM - + Narrate - [admin_jump_link(M, src)]\]
Mob type: [M.type]
Inactivity time: [M.client ? "[M.client.inactivity/600] minutes" : "Logged out"]

- Kick | - Warn | - Ban | - Jobban | - Notes + Kick | + Warn | + Ban | + Jobban | + Notes "} if(M.client) - body += "| Prison | " + body += "| Prison | " var/muted = M.client.prefs.muted body += {"
Mute: - \[IC | - OOC | - AOOC | - PRAY | - ADMINHELP | - DEADCHAT\] - (toggle all) + \[IC | + OOC | + AOOC | + PRAY | + ADMINHELP | + DEADCHAT\] + (toggle all) "} body += "

Staff Warning: [M.client.staffwarn ? M.client.staffwarn : "No"]
" if (!M.client.staffwarn) - body += "Set StaffWarn" + body += "Set StaffWarn" else - body += "Remove StaffWarn" + body += "Remove StaffWarn" body += {"

- Jump to | - Get | - Send To + Jump to | + Get | + Send To

- [check_rights(R_INVESTIGATE,0) ? "Skill panel" : "" ] + [check_rights(R_INVESTIGATE,0) ? "Skill panel" : "" ] "} if(M.mind) @@ -126,7 +126,7 @@ var/global/BSACooldown = 0 body += "
" body += "[jointext(M.mind.summarize_goals(FALSE, TRUE, src), "
")]" body += "
" - body += "Add Random Goal" + body += "Add Random Goal" var/list/all_modpacks = decls_repository.get_decls_of_subtype(/decl/modpack) for(var/package in all_modpacks) @@ -146,46 +146,38 @@ var/global/BSACooldown = 0 if(issmall(M)) body += "Monkeyized | " else - body += "Monkeyize | " + body += "Monkeyize | " //Corgi if(iscorgi(M)) body += "Corgized | " else - body += "Corgize | " + body += "Corgize | " //AI / Cyborg if(isAI(M)) body += "Is an AI " else if(ishuman(M)) - body += {"Make AI | - Make Robot | - Make Alien + body += {"Make AI | + Make Robot | + Make Alien "} //Simple Animals if(isanimal(M)) - body += "Re-Animalize | " + body += "Re-Animalize | " else - body += "Animalize | " + body += "Animalize | " - // DNA2 - Admin Hax - if(M.dna) + if(M.can_have_genetic_conditions()) body += "

" - body += "DNA Blocks:
" - var/bname - for(var/block=1;block<=DNA_SE_LENGTH;block++) - if(((block-1)%5)==0) - body += "" - bname = assigned_blocks[block] - body += "" + body += "Genetic conditions:
 12345
[block-1]" - if(bname) - var/bstate=M.dna.GetSEState(block) - var/bcolor="[(bstate)?"#006600":"#ff0000"]" - body += "[bname][block]" - else - body += "[block]" - body+="
" + var/i = 1 + for(var/decl/genetic_condition/mutation as anything in decls_repository.get_decls_of_type_unassociated(/decl/genetic_condition)) + if(i % 5 == 0) + body += "" + body += "" + i++ body += "
[mutation.name]
" body += "

Rudimentary transformation:
These transformations only create a new mob type and copy stuff over. They do not take into account MMIs and similar mob-specific things. The buttons in 'Transformations' are preferred, when possible.

" @@ -198,19 +190,19 @@ var/global/BSACooldown = 0 if(islist(transform_data)) var/list/href_subcat_strings = list() for(var/transform_string in transform_data) - href_subcat_strings += "[transform_string]" + href_subcat_strings += "[transform_string]" href_transform_strings += "\[ [href_string]: [jointext(href_subcat_strings, " | ")] \]" // It's a single mob type - link it directly. else if(ispath(transform_data)) - href_transform_strings += "[href_string]" + href_transform_strings += "[href_string]" body += jointext(href_transform_strings, " | ") body += {"

Other actions:
- Forcesay + Forcesay "} // language toggles body += "

Languages:
" @@ -224,9 +216,9 @@ var/global/BSACooldown = 0 else f = 0 if(L in M.languages) - body += "[L.name]" + body += "[L.name]" else - body += "[L.name]" + body += "[L.name]" body += {"
@@ -265,7 +257,7 @@ var/global/BSACooldown = 0 continue note_keys -= t - dat += "
Search term: [filter_term ? filter_term : "-----"]

" + dat += "
Search term: [filter_term ? filter_term : "-----"]

" if(!note_keys) dat += "No notes found." @@ -273,7 +265,7 @@ var/global/BSACooldown = 0 dat += "" note_keys = sortTim(note_keys, /proc/cmp_text_asc) for(var/t in note_keys) - dat += "" + dat += "" dat += "
[t]
[t]

" var/datum/browser/popup = new(usr, "player_notes", "Player Notes", 400, 400) @@ -326,12 +318,12 @@ var/global/BSACooldown = 0 update_file = 1 dat += "
  • [I.content] by [I.author] ([I.rank]) on [I.timestamp] " if(I.author == usr.key || I.author == "Adminbot" || ishost(usr)) - dat += "Remove" + dat += "Remove" dat += "
  • " if(update_file) direct_output(info, infos) - dat += "
    Add Comment
    " + dat += "
    Add Comment
    " var/html = {" @@ -386,12 +378,12 @@ var/global/BSACooldown = 0
    Note that this panel allows full freedom over the news network, there are no constrictions except the few basic ones. Don't break things! "} if(news_network.wanted_issue) - dat+= "
    Read Wanted Issue" + dat+= "
    Read Wanted Issue" - dat+= {"

    Create Feed Channel -
    View Feed Channels -
    Submit new Feed story -

    Exit + dat+= {"

    Create Feed Channel +
    View Feed Channels +
    Submit new Feed story +

    Exit "} var/wanted_already = 0 @@ -399,10 +391,10 @@ var/global/BSACooldown = 0 wanted_already = 1 dat+={"
    Feed Security functions:
    -
    [(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue -
    Censor Feed Stories -
    Mark Feed Channel with [global.using_map.company_name] D-Notice (disables and locks the channel. -

    The newscaster recognises you as:
    [src.admincaster_signature]
    +
    [(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue +
    Censor Feed Stories +
    Mark Feed Channel with [global.using_map.company_name] D-Notice (disables and locks the channel. +

    The newscaster recognises you as:
    [src.admincaster_signature]
    "} if(1) dat+= "Feed Channels
    " @@ -411,38 +403,38 @@ var/global/BSACooldown = 0 else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) if(CHANNEL.is_admin_channel) - dat+="[CHANNEL.channel_name]
    " + dat+="[CHANNEL.channel_name]
    " else - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null ]
    " - dat+={"

    Refresh -
    Back + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null ]
    " + dat+={"

    Refresh +
    Back "} if(2) dat+={" Creating new Feed Channel... -
    Channel Name: [src.admincaster_feed_channel.channel_name]
    - Channel Author: [src.admincaster_signature]
    - Will Accept Public Feeds: [(src.admincaster_feed_channel.locked) ? ("NO") : ("YES")]

    -
    Submit

    Cancel
    +
    Channel Name: [src.admincaster_feed_channel.channel_name]
    + Channel Author: [src.admincaster_signature]
    + Will Accept Public Feeds: [(src.admincaster_feed_channel.locked) ? ("NO") : ("YES")]

    +
    Submit

    Cancel
    "} if(3) dat+={" Creating new Feed Message... -
    Receiving Channel: [src.admincaster_feed_channel.channel_name]
    " //MARK +
    Receiving Channel: [src.admincaster_feed_channel.channel_name]
    " //MARK Message Author: [src.admincaster_signature]
    - Message Body: [src.admincaster_feed_message.body]
    -
    Submit

    Cancel
    + Message Body: [src.admincaster_feed_message.body]
    +
    Submit

    Cancel
    "} if(4) dat+={" Feed story successfully submitted to [src.admincaster_feed_channel.channel_name].

    -
    Return
    +
    Return
    "} if(5) dat+={" Feed Channel [src.admincaster_feed_channel.channel_name] created successfully.

    -
    Return
    +
    Return
    "} if(6) dat+="ERROR: Could not submit Feed story to Network.

    " @@ -450,7 +442,7 @@ var/global/BSACooldown = 0 dat+="Invalid receiving channel name.
    " if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]") dat+="Invalid message body.
    " - dat+="
    Return
    " + dat+="
    Return
    " if(7) dat+="ERROR: Could not submit Feed Channel to Network.

    " if(src.admincaster_feed_channel.channel_name =="" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]") @@ -462,7 +454,7 @@ var/global/BSACooldown = 0 break if(check) dat+="Channel name already in use.
    " - dat+="
    Return
    " + dat+="
    Return
    " if(9) dat+="[src.admincaster_feed_channel.channel_name]: \[created by: [src.admincaster_feed_channel.author]\]
    " if(src.admincaster_feed_channel.censored) @@ -483,8 +475,8 @@ var/global/BSACooldown = 0 dat+="

    " dat+="\[Story by [MESSAGE.author]\]
    " dat+={" -

    Refresh -
    Back +

    Refresh +
    Back "} if(10) dat+={" @@ -497,8 +489,8 @@ var/global/BSACooldown = 0 dat+="No feed channels found active...
    " else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null ]
    " - dat+="
    Cancel" + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null ]
    " + dat+="
    Cancel" if(11) dat+={" [global.using_map.company_name] D-Notice Handler
    @@ -510,13 +502,13 @@ var/global/BSACooldown = 0 dat+="No feed channels found active...
    " else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null ]
    " + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null ]
    " - dat+="
    Back" + dat+="
    Back" if(12) dat+={" [src.admincaster_feed_channel.channel_name]: \[ created by: [src.admincaster_feed_channel.author] \]
    - [(src.admincaster_feed_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]
    + [(src.admincaster_feed_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]
    "} if( !length(src.admincaster_feed_channel.messages) ) dat+="No feed messages found in channel...
    " @@ -524,13 +516,13 @@ var/global/BSACooldown = 0 for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) dat+={" -[MESSAGE.body]
    \[Story by [MESSAGE.author]\]
    - [(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
    + [(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
    "} - dat+="
    Back" + dat+="
    Back" if(13) dat+={" [src.admincaster_feed_channel.channel_name]: \[ created by: [src.admincaster_feed_channel.author] \]
    - Channel messages listed below. If you deem them dangerous to the [station_name()], you can Bestow a D-Notice upon the channel.
    + Channel messages listed below. If you deem them dangerous to the [station_name()], you can Bestow a D-Notice upon the channel.
    "} if(src.admincaster_feed_channel.censored) dat+={" @@ -544,7 +536,7 @@ var/global/BSACooldown = 0 for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) dat+="-[MESSAGE.body]
    \[Story by [MESSAGE.author]\]
    " - dat+="
    Back" + dat+="
    Back" if(14) dat+="Wanted Issue Handler:" var/wanted_already = 0 @@ -556,21 +548,21 @@ var/global/BSACooldown = 0 dat+="
    A wanted issue is already in Feed Circulation. You can edit or cancel it below.
    " dat+={"
    - Criminal Name: [src.admincaster_feed_message.author]
    - Description: [src.admincaster_feed_message.body]
    + Criminal Name: [src.admincaster_feed_message.author]
    + Description: [src.admincaster_feed_message.body]
    "} if(wanted_already) dat+="Wanted Issue created by: [news_network.wanted_issue.backup_author]
    " else dat+="Wanted Issue will be created under prosecutor: [src.admincaster_signature]
    " - dat+="
    [(wanted_already) ? ("Edit Issue") : ("Submit")]" + dat+="
    [(wanted_already) ? ("Edit Issue") : ("Submit")]" if(wanted_already) - dat+="
    Take down Issue" - dat+="
    Cancel" + dat+="
    Take down Issue" + dat+="
    Cancel" if(15) dat+={" Wanted issue for [src.admincaster_feed_message.author] is now in Network Circulation.

    -
    Return
    +
    Return
    "} if(16) dat+="ERROR: Wanted Issue rejected by Network.

    " @@ -578,11 +570,11 @@ var/global/BSACooldown = 0 dat+="Invalid name for person wanted.
    " if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]") dat+="Invalid description.
    " - dat+="
    Return
    " + dat+="
    Return
    " if(17) dat+={" Wanted Issue successfully deleted from Circulation
    -
    Return
    +
    Return
    "} if(18) dat+={" @@ -596,11 +588,11 @@ var/global/BSACooldown = 0 dat+="
    " else dat+="None" - dat+="
    Back
    " + dat+="
    Back
    " if(19) dat+={" Wanted issue for [src.admincaster_feed_message.author] successfully edited.

    -
    Return
    +
    Return
    "} else dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" @@ -621,7 +613,7 @@ var/global/BSACooldown = 0 var/r = t if( findtext(r,"##") ) r = copytext( r, 1, findtext(r,"##") )//removes the description - dat += text("[t] (unban)") + dat += text("[t] (unban)") dat += "" show_browser(usr, dat, "window=ban;size=400x400") @@ -630,20 +622,20 @@ var/global/BSACooldown = 0 var/dat = {"
    Game Panel

    \n - Change Game Mode
    + Change Game Mode
    "} if(SSticker.master_mode == "secret") - dat += "(Force Secret Mode)
    " + dat += "(Force Secret Mode)
    " dat += {"
    - Create Object
    - Quick Create Object
    - Create Turf
    - Create Mob
    -
    Edit Airflow Settings
    - Edit Contaminant Settings
    - Choose a default ZAS setting
    + Create Object
    + Quick Create Object
    + Create Turf
    + Create Mob
    +
    Edit Airflow Settings
    + Edit Contaminant Settings
    + Choose a default ZAS setting
    "} show_browser(usr, dat, "window=admin2;size=210x280") @@ -660,7 +652,7 @@ var/global/BSACooldown = 0 if(active_category == category) dat += "[category.name]" else - dat += "[category.name] " + dat += "[category.name] " dat += "
    " // If a category is selected, print its description and then options @@ -670,7 +662,7 @@ var/global/BSACooldown = 0 for(var/datum/admin_secret_item/item in active_category.items) if(!item.can_view(usr)) continue - dat += "[item.name()]
    " + dat += "[item.name()]
    " dat += "
    " var/datum/browser/popup = new(usr, "secrets", "Secrets", 550, 500) @@ -906,16 +898,6 @@ var/global/BSACooldown = 0 message_admins("[key_name_admin(usr)] toggled Aliens off.", 1) SSstatistics.add_field_details("admin_verb","TA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/admins/proc/toggle_space_ninja() - set category = "Server" - set desc="Toggle space ninjas spawning." - set name="Toggle Space Ninjas" - if(!check_rights(R_ADMIN)) - return - toggle_config_value(/decl/config/toggle/ninjas_allowed) - log_and_message_admins("toggled Space Ninjas [get_config_value(/decl/config/toggle/ninjas_allowed) ? "on" : "off"].") - SSstatistics.add_field_details("admin_verb","TSN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - /datum/admins/proc/delay() set category = "Server" set desc="Delay the game start/end" @@ -1170,38 +1152,38 @@ var/global/BSACooldown = 0 alert("Not before roundstart!", "Alert") return - var/out = "Current mode: [SSticker.mode.name] ([SSticker.mode.uid])
    " + var/out = "Current mode: [SSticker.mode.name] ([SSticker.mode.uid])
    " out += "
    " if(SSticker.mode.ert_disabled) - out += "Emergency Response Teams: disabled" + out += "Emergency Response Teams: disabled" else - out += "Emergency Response Teams: enabled" + out += "Emergency Response Teams: enabled" out += "
    " if(SSticker.mode.deny_respawn) - out += "Respawning: disallowed" + out += "Respawning: disallowed" else - out += "Respawning: allowed" + out += "Respawning: allowed" out += "
    " - out += "Shuttle delay multiplier: [SSticker.mode.shuttle_delay]
    " + out += "Shuttle delay multiplier: [SSticker.mode.shuttle_delay]
    " if(SSticker.mode.auto_recall_shuttle) - out += "Shuttle auto-recall: enabled" + out += "Shuttle auto-recall: enabled" else - out += "Shuttle auto-recall: disabled" + out += "Shuttle auto-recall: disabled" out += "

    " if(SSticker.mode.event_delay_mod_moderate) - out += "Moderate event time modifier: [SSticker.mode.event_delay_mod_moderate]
    " + out += "Moderate event time modifier: [SSticker.mode.event_delay_mod_moderate]
    " else - out += "Moderate event time modifier: unset
    " + out += "Moderate event time modifier: unset
    " if(SSticker.mode.event_delay_mod_major) - out += "Major event time modifier: [SSticker.mode.event_delay_mod_major]
    " + out += "Major event time modifier: [SSticker.mode.event_delay_mod_major]
    " else - out += "Major event time modifier: unset
    " + out += "Major event time modifier: unset
    " out += "
    " @@ -1210,28 +1192,28 @@ var/global/BSACooldown = 0 for(var/antag_type in SSticker.mode.associated_antags) var/decl/special_role/antag = GET_DECL(antag_type) if(antag) - out += "[antag.name].
    " + out += "[antag.name].
    " if(SSticker.mode.round_autoantag) - out += "Autotraitor enabled." + out += "Autotraitor enabled." if(SSticker.mode.antag_scaling_coeff > 0) - out += " (scaling with [SSticker.mode.antag_scaling_coeff])" + out += " (scaling with [SSticker.mode.antag_scaling_coeff])" else - out += " (not currently scaling, set a coefficient)" + out += " (not currently scaling, set a coefficient)" out += "
    " else - out += "Autotraitor disabled.
    " + out += "Autotraitor disabled.
    " out += "All antag ids:" if(SSticker.mode.antag_templates && SSticker.mode.antag_templates.len) for(var/decl/special_role/antag in SSticker.mode.antag_templates) antag.update_current_antag_max(SSticker.mode) - out += " [antag.name]" + out += " [antag.name]" out += " ([antag.get_antag_count()]/[antag.cur_max]) " - out += " \[-\]
    " + out += " \[-\]
    " else out += " None." - out += " \[+\]
    " + out += " \[+\]
    " show_browser(usr, out, "window=edit_mode[src]") SSstatistics.add_field_details("admin_verb","SGM") @@ -1321,15 +1303,15 @@ var/global/BSACooldown = 0 return "[key_name(C, link, name, highlight_special, ticket)]" if(1) //Private Messages - return "[key_name(C, link, name, highlight_special, ticket)](?)" + return "[key_name(C, link, name, highlight_special, ticket)](?)" if(2) //Admins var/ref_mob = "\ref[M]" - return "[key_name(C, link, name, highlight_special, ticket)](?) (PP) (VV) (DN) ([admin_jump_link(M)]) (RS)" + return "[key_name(C, link, name, highlight_special, ticket)](?) (PP) (VV) (DN) ([admin_jump_link(M)]) (RS)" if(3) //Devs var/ref_mob = "\ref[M]" - return "[key_name(C, link, name, highlight_special, ticket)](VV)([admin_jump_link(M)])" + return "[key_name(C, link, name, highlight_special, ticket)](VV)([admin_jump_link(M)])" /proc/ishost(var/client/C) return check_rights(R_HOST, 0, C) @@ -1458,7 +1440,7 @@ var/global/BSACooldown = 0 if(!N || !CN) continue var/area/A = get_area(F) - html += "
  • [CN.network_id].[N.network_tag] [A? "([A])" : ""]
  • " + html += "
  • [CN.network_id].[N.network_tag] [A? "([A])" : ""]
  • " html = "
      [html]
    " html = "
    [html]" show_browser(user, html, "size=512x800;window=faxpicker;title=") diff --git a/code/modules/admin/admin_attack_log.dm b/code/modules/admin/admin_attack_log.dm index 9b5c377c7cb..4affd41b31d 100644 --- a/code/modules/admin/admin_attack_log.dm +++ b/code/modules/admin/admin_attack_log.dm @@ -114,7 +114,7 @@ /proc/append_admin_tools(var/message, var/mob, var/turf/location) if(location) - message = message + " (LOC)" + message = message + " (LOC)" if(mob) - message = message + " (MOB)" + message = message + " (MOB)" return message diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 7c0fb87c3e0..1a2b3d9fa37 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -90,7 +90,7 @@ var/global/list/admin_verbs_admin = list( /client/proc/add_trader, /client/proc/remove_trader, /datum/admins/proc/sendFax, - /datum/admins/proc/show_aspects + /datum/admins/proc/show_traits ) var/global/list/admin_verbs_ban = list( /client/proc/DB_ban_panel, @@ -112,7 +112,6 @@ var/global/list/admin_verbs_fun = list( /client/proc/everyone_random, /client/proc/cinematic, /datum/admins/proc/toggle_aliens, - /datum/admins/proc/toggle_space_ninja, /client/proc/cmd_admin_add_freeform_ai_law, /client/proc/toggle_random_events, /client/proc/editappear, @@ -153,7 +152,6 @@ var/global/list/admin_verbs_server = list( /datum/admins/proc/adspawn, /datum/admins/proc/adjump, /datum/admins/proc/toggle_aliens, - /datum/admins/proc/toggle_space_ninja, /client/proc/toggle_random_events, /client/proc/nanomapgen_DumpImage, /datum/admins/proc/panicbunker, @@ -268,7 +266,6 @@ var/global/list/admin_verbs_hideable = list( /client/proc/drop_bomb, /client/proc/cinematic, /datum/admins/proc/toggle_aliens, - /datum/admins/proc/toggle_space_ninja, /client/proc/cmd_admin_add_freeform_ai_law, /client/proc/cmd_admin_create_centcom_report, /client/proc/toggle_random_events, @@ -688,7 +685,7 @@ var/global/list/admin_verbs_mod = list( if(!check_rights(R_FUN)) return - var/mob/living/carbon/human/H = input("Select mob.", "Change Mob Appearance - Admin") as null|anything in global.human_mob_list + var/mob/living/human/H = input("Select mob.", "Change Mob Appearance - Admin") as null|anything in global.human_mob_list if(!H) return log_and_message_admins("is altering the appearance of [H].") @@ -702,7 +699,7 @@ var/global/list/admin_verbs_mod = list( if(!check_rights(R_FUN)) return - var/mob/living/carbon/human/H = input("Select mob.", "Change Mob Appearance - Self") as null|anything in global.human_mob_list + var/mob/living/human/H = input("Select mob.", "Change Mob Appearance - Self") as null|anything in global.human_mob_list if(!H) return if(!H.client) @@ -739,7 +736,7 @@ var/global/list/admin_verbs_mod = list( if(!check_rights(R_FUN)) return - var/mob/living/carbon/human/M = input("Select mob.", "Edit Appearance") as null|anything in global.human_mob_list + var/mob/living/human/M = input("Select mob.", "Edit Appearance") as null|anything in global.human_mob_list if(!ishuman(M)) to_chat(usr, "You can only do this to humans!") @@ -797,7 +794,6 @@ var/global/list/admin_verbs_mod = list( if(update_hair) M.update_hair() M.update_body() - M.check_dna(M) /client/proc/free_slot_submap() set name = "Free Job Slot (Submap)" diff --git a/code/modules/admin/dbban/functions.dm b/code/modules/admin/dbban/functions.dm index 278792ba877..fc8594d64e7 100644 --- a/code/modules/admin/dbban/functions.dm +++ b/code/modules/admin/dbban/functions.dm @@ -257,6 +257,9 @@ if(!check_rights(R_BAN)) return + if(!owner || !istype(owner, /client)) + return + establish_db_connection() if(!dbcon.IsConnected()) return @@ -271,21 +274,18 @@ ban_number++; if(ban_number == 0) - to_chat(usr, "Database update failed due to a ban id not being present in the database.") + to_chat(owner, "Database update failed due to a ban id not being present in the database.") return if(ban_number > 1) - to_chat(usr, "Database update failed due to multiple bans having the same ID. Contact the database admin.") - return - - if(!src.owner || !istype(src.owner, /client)) + to_chat(owner, "Database update failed due to multiple bans having the same ID. Contact the database admin.") return - var/unban_ckey = src.owner:ckey - var/unban_computerid = src.owner:computer_id - var/unban_ip = src.owner:address + var/unban_ckey = owner.ckey + var/unban_computerid = owner.computer_id + var/unban_ip = owner.address - message_admins("[key_name_admin(usr)] has lifted [pckey]'s ban.",1) + message_admins("[key_name_admin(owner)] has lifted [pckey]'s ban.",1) var/DBQuery/query_update = dbcon.NewQuery("UPDATE `erro_ban` SET `unbanned` = TRUE, `unbanned_datetime` = NOW(), `unbanned_ckey` = '[unban_ckey]', `unbanned_computerid` = '[unban_computerid]', `unbanned_ip` = '[unban_ip]' WHERE `id` = [id]") query_update.Execute() @@ -321,7 +321,7 @@ output += "" - output += "
    Add custom ban: (ONLY use this if you can't ban through any other method)" + output += "Add custom ban: (ONLY use this if you can't ban through any other method)" output += "" output += "" output += "" output += "
    Ban type:
    " - output += " @@ -288,14 +288,14 @@ if(SSevac.evacuation_controller) if (SSevac.evacuation_controller.is_idle()) - dat += "Call Evacuation
    " + dat += "Call Evacuation
    " else var/timeleft = SSevac.evacuation_controller.get_eta() if (SSevac.evacuation_controller.waiting_to_leave()) dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
    " - dat += "Send Back
    " + dat += "Send Back
    " - dat += "[SSticker.delay_end ? "End Round Normally" : "Delay Round End"]
    " + dat += "[SSticker.delay_end ? "End Round Normally" : "Delay Round End"]
    " dat += "
    " var/list/all_antag_types = decls_repository.get_decls_of_subtype(/decl/special_role) for(var/antag_type in all_antag_types) diff --git a/code/modules/admin/quantum_mechanic.dm b/code/modules/admin/quantum_mechanic.dm index 5cb96a389fa..7731afd44ca 100644 --- a/code/modules/admin/quantum_mechanic.dm +++ b/code/modules/admin/quantum_mechanic.dm @@ -6,7 +6,7 @@ // Most of their superhuman qualities can be toggled off if you need a normal human for testing biological functions */ -#define isquantum(X) istype(X, /mob/living/carbon/human/quantum) +#define isquantum(X) istype(X, /mob/living/human/quantum) /client/proc/spawn_quantum_mechanic() set category = "Debug" set name = "Spawn Quantum Mechanic" @@ -20,7 +20,7 @@ return var/T = get_turf(mob) - var/mob/living/carbon/human/quantum/Q = new (T) + var/mob/living/human/quantum/Q = new (T) prefs.copy_to(Q) @@ -56,7 +56,7 @@ belt = /obj/item/belt/utility/full/quantum id_slot = slot_wear_id_str -/mob/living/carbon/human/quantum +/mob/living/human/quantum status_flags = NO_ANTAG universal_understand = TRUE var/fall_override = TRUE @@ -76,17 +76,17 @@ /datum/movement_handler/mob/movement ) -/mob/living/carbon/human/quantum/can_inject(mob/user, target_zone) +/mob/living/human/quantum/can_inject(mob/user, target_zone) if(user == src) return ..() to_chat(user, SPAN_DANGER("\The [src] disarms you before you can inject them.")) user.drop_item() return FALSE -/mob/living/carbon/human/quantum/binarycheck() +/mob/living/human/quantum/binarycheck() return TRUE -/mob/living/carbon/human/quantum/proc/delete_self() +/mob/living/human/quantum/proc/delete_self() if(QDELETED(src)) return @@ -102,7 +102,7 @@ QDEL_IN(src, 7) -/mob/living/carbon/human/quantum/verb/quantum_antigrav() +/mob/living/human/quantum/verb/quantum_antigrav() set name = "Toggle Gravity" set desc = "Toggles falling." set category = "Ω" @@ -114,7 +114,7 @@ fall_override = TRUE to_chat(usr, SPAN_NOTICE("You will no longer fall.")) -/mob/living/carbon/human/quantum/verb/quantum_walk() +/mob/living/human/quantum/verb/quantum_walk() set name = "Toggle Phase Walking" set desc = "Uses quantum technology to phase through solid matter and move quickly." set category = "Ω" @@ -127,7 +127,7 @@ usr.ReplaceMovementHandler(/datum/movement_handler/mob/incorporeal) to_chat(usr, SPAN_NOTICE("You will now phase through solid matter.")) -/mob/living/carbon/human/quantum/verb/quantum_recover() +/mob/living/human/quantum/verb/quantum_recover() set name = "Rejuvenate Self" set desc = "Use quantum powers you to restore your health." set category = "Ω" @@ -135,14 +135,14 @@ revive() -/mob/living/carbon/human/quantum/verb/quantum_quit() +/mob/living/human/quantum/verb/quantum_quit() set name = "Teleport Out" set desc = "Activate quantum magic to leave and return to your original mob (if you have one)." set category = "Ω" delete_self() -/mob/living/carbon/human/quantum/verb/quantum_tgm() +/mob/living/human/quantum/verb/quantum_tgm() set name = "Toggle Godmode" set desc = "Enable or disable god mode. For testing things that require you to be vulnerable." set category = "Ω" @@ -187,7 +187,7 @@ /obj/item/clothing/jumpsuit/quantum name = "quantum mechanic's uniform" desc = "A quantum mechanic's uniform. There is a letter on front that reads 'Q'." - icon = 'icons/clothing/under/uniform_quantum.dmi' + icon = 'icons/clothing/jumpsuits/uniform_quantum.dmi' cold_protection = SLOT_FULL_BODY heat_protection = SLOT_FULL_BODY siemens_coefficient = 0 @@ -296,8 +296,8 @@ // Full set of tools new /obj/item/multitool(src) -/mob/living/carbon/human/quantum/restrained() +/mob/living/human/quantum/restrained() return FALSE -/mob/living/carbon/human/quantum/can_fall(anchor_bypass = FALSE, turf/location_override = loc) +/mob/living/human/quantum/can_fall(anchor_bypass = FALSE, turf/location_override = loc) return fall_override ? FALSE : ..() diff --git a/code/modules/admin/respawn_as_self.dm b/code/modules/admin/respawn_as_self.dm index d19c9d752eb..0e5277b36c6 100644 --- a/code/modules/admin/respawn_as_self.dm +++ b/code/modules/admin/respawn_as_self.dm @@ -11,7 +11,7 @@ return var/mob/oldmob = C.mob - var/mob/living/carbon/human/H = new(oldmob.loc) + var/mob/living/human/H = new(oldmob.loc) C.prefs.copy_to(H) H.key = C.key qdel(oldmob) diff --git a/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm b/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm index 9e39946a9e0..112a28de7b8 100644 --- a/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm +++ b/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm @@ -29,7 +29,7 @@ var/move_duration = input(user, "How many seconds will this jump take?") as num S.long_jump(destination, transition, move_duration) - log_and_message_admins("has initiated a jump to [destination] (JMP) lasting [move_duration] seconds in transit at [transition] (JMP) for the [shuttle_tag] shuttle") + log_and_message_admins("has initiated a jump to [destination] (JMP) lasting [move_duration] seconds in transit at [transition] (JMP) for the [shuttle_tag] shuttle") else S.short_jump(destination) - log_and_message_admins("has initiated a jump to [destination] (JMP) for the [shuttle_tag] shuttle") + log_and_message_admins("has initiated a jump to [destination] (JMP) for the [shuttle_tag] shuttle") diff --git a/code/modules/admin/secrets/admin_secrets/list_dna.dm b/code/modules/admin/secrets/admin_secrets/list_dna.dm index 6f7a2300cf0..eb9a57d6155 100644 --- a/code/modules/admin/secrets/admin_secrets/list_dna.dm +++ b/code/modules/admin/secrets/admin_secrets/list_dna.dm @@ -7,8 +7,8 @@ return var/dat = "Showing DNA from blood.
    " dat += "
    Search:" + output += "" output += "" output += "" diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index add6b917af5..dde03a14e37 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -18,7 +18,7 @@
    Search:" output += "
    Ckey: Admin ckey:
    - + "} @@ -31,9 +31,9 @@ if(!rights) rights = "*none*" output += "" - output += "" - output += "" - output += "" + output += "" + output += "" + output += "" output += "" output += {" diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 0cb37e12e0f..649c4b54265 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -75,15 +75,15 @@ body += "
    CKEY \[+\]CKEY \[+\] RANKPERMISSIONS
    [adm_ckey] \[-\][rank][rights][adm_ckey] \[-\][rank][rights]
    "; - body += "Player Panel - " - body += "Notes - " - body += "View Vars - " - body += "Special Roles - " - body += "Send PM - " - body += "Direct Narrate - " - body += "Jump To
    " + body += "Player Panel - " + body += "Notes - " + body += "View Vars - " + body += "Special Roles - " + body += "Send PM - " + body += "Direct Narrate - " + body += "Jump To
    " if(antagonist > 0) - body += "Antagonist"; + body += "Antagonist"; body += "
    "; @@ -194,7 +194,7 @@
    Player panel
    - Hover over a line to see more information, or click here to check round info. + Hover over a line to see more information, or click here to check round info.

    " - for(var/mob/living/carbon/human/H in SSmobs.mob_list) - if(H.dna && H.ckey) + for(var/mob/living/human/H in SSmobs.mob_list) + if(H.ckey) dat += "" dat += "
    NameDNABlood Type
    [H][H.get_unique_enzymes() || "NULL"][H.get_blood_type() || "NULL"]
    " show_browser(user, dat, "window=DNA;size=440x410") diff --git a/code/modules/admin/secrets/admin_secrets/list_fingerprints.dm b/code/modules/admin/secrets/admin_secrets/list_fingerprints.dm index 655774bbba1..7840ce20bb1 100644 --- a/code/modules/admin/secrets/admin_secrets/list_fingerprints.dm +++ b/code/modules/admin/secrets/admin_secrets/list_fingerprints.dm @@ -7,7 +7,7 @@ return var/dat = "Showing Fingerprints.
    " dat += "" - for(var/mob/living/carbon/human/H in SSmobs.mob_list) + for(var/mob/living/human/H in SSmobs.mob_list) if(H.ckey) dat += "" dat += "
    NameFingerprints
    [H][H.get_full_print(ignore_blockers = TRUE) || "null"]
    " diff --git a/code/modules/admin/secrets/admin_secrets/move_shuttle.dm b/code/modules/admin/secrets/admin_secrets/move_shuttle.dm index bdf27f6a85e..585b6ab090f 100644 --- a/code/modules/admin/secrets/admin_secrets/move_shuttle.dm +++ b/code/modules/admin/secrets/admin_secrets/move_shuttle.dm @@ -26,4 +26,4 @@ if (!destination) return S.attempt_move(destination) - log_and_message_admins("moved the [shuttle_tag] shuttle to [destination] (JMP)", user) + log_and_message_admins("moved the [shuttle_tag] shuttle to [destination] (JMP)", user) diff --git a/code/modules/admin/secrets/investigation/admin_pms.dm b/code/modules/admin/secrets/investigation/admin_pms.dm index 45fe20ff208..cd57bf73283 100644 --- a/code/modules/admin/secrets/investigation/admin_pms.dm +++ b/code/modules/admin/secrets/investigation/admin_pms.dm @@ -6,9 +6,9 @@ if(!.) return var/dat = list() - dat += "Refresh Filtering on: " + dat += "Refresh Filtering on: " if(filter) - dat += " [filter] Clear" + dat += " [filter] Clear" else dat += "None" dat += "
    " @@ -23,9 +23,9 @@ continue if(receiver) - dat += "[pm.station_time][sender.key_name(FALSE)] F[receiver.key_name(FALSE)] F" + dat += "[pm.station_time][sender.key_name(FALSE)] F[receiver.key_name(FALSE)] F" else - dat += "[pm.station_time][sender.key_name(FALSE)] F" + dat += "[pm.station_time][sender.key_name(FALSE)] F" dat += "[pm.message]" dat += "" diff --git a/code/modules/admin/secrets/investigation/attack_logs.dm b/code/modules/admin/secrets/investigation/attack_logs.dm index f9d2f405aad..201adaa00bf 100644 --- a/code/modules/admin/secrets/investigation/attack_logs.dm +++ b/code/modules/admin/secrets/investigation/attack_logs.dm @@ -11,9 +11,9 @@ if(!.) return var/dat = list() - dat += "Refresh | " + dat += "Refresh | " dat += get_filter_html(user) - dat += " | Reset" + dat += " | Reset" dat += "
    " dat += "" dat += "" @@ -26,7 +26,7 @@ dat += "" if(al.attacker) - dat += "" + dat += "" else dat += "" @@ -35,14 +35,14 @@ dat += "" if(al.victim) - dat += "" + dat += "" else dat += "" dat += "" dat += "" dat += "
    TimeAttackerIntentZone SelVictim
    [al.station_time][al.attacker.key_name(check_if_offline = FALSE)] PP[al.attacker.key_name(check_if_offline = FALSE)] PP[al.target_zone][al.victim.key_name(check_if_offline = FALSE)] PP[al.victim.key_name(check_if_offline = FALSE)] PP
    [al.message]" if(al.location) - dat += " JMP" + dat += " JMP" dat += "
    " @@ -132,9 +132,9 @@ . = list() . += "Must have clients: " if(filter_missing_clients) - . += "YesNo" + . += "YesNo" else - . += "YesNo" + . += "YesNo" . = jointext(.,null) /attack_filter/no_client/OnTopic(href_list) @@ -170,7 +170,7 @@ ckey_filter = null /attack_filter/must_be_given_ckey/get_html() - return "[description]: [ckey_filter ? ckey_filter : "*ANY*"]" + return "[description]: [ckey_filter ? ckey_filter : "*ANY*"]" /attack_filter/must_be_given_ckey/OnTopic(href_list) if(!href_list["select_ckey"]) diff --git a/code/modules/admin/ticket.dm b/code/modules/admin/ticket.dm index d394a86cd0c..526c9867927 100644 --- a/code/modules/admin/ticket.dm +++ b/code/modules/admin/ticket.dm @@ -195,7 +195,7 @@ var/global/list/ticket_panels = list() var/ref_mob = "" if(owner_client) ref_mob = "\ref[owner_client.mob]" - ticket_dat += " - ? - PP - VV - DN[owner_client ? "- [admin_jump_link(owner_client, src)]" : ""]" + ticket_dat += " - ? - PP - VV - DN[owner_client ? "- [admin_jump_link(owner_client, src)]" : ""]" if(open_ticket && open_ticket == ticket) ticket_dat += "" ticket_dat += "" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c70b4b02ab7..4d6ab441d57 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -331,16 +331,16 @@ var/decl/department/dept = all_departments[dtype] var/list/print_jobs = SSjobs.titles_by_department(dtype) jobs += "" - jobs += "" + jobs += "" for(var/jobPos in print_jobs) var/datum/job/job = SSjobs.get_by_title(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" counter++ else - jobs += "" + jobs += "" counter++ if(counter >= MAX_JOBBAN_CELLS) jobs += "" @@ -350,20 +350,20 @@ // Other non-human bans. counter = 0 jobs += "
    [capitalize(dept.name)] Positions
    [capitalize(dept.name)] Positions
    [replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
    " - jobs += "" + jobs += "" if(jobban_isbanned(M, "pAI")) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(jobban_isbanned(M, "AntagHUD")) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" jobs += "
    Other Positions
    Other Positions
    pAIpAIpAIpAIAntagHUDAntagHUDAntagHUDAntagHUD
    " //Antagonist (Orange) jobs += "" - jobs += "" + jobs += "" // Antagonists. #define ANTAG_COLUMNS 5 @@ -374,9 +374,9 @@ if(!antag) continue if(jobban_isbanned(M, antag.type)) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(i % ANTAG_COLUMNS == 0 && i < length(all_antag_types)) jobs += "" i++ @@ -389,9 +389,9 @@ jobs += "" for(var/entry in misc_roles) if(jobban_isbanned(M, entry)) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" jobs += "
    Antagonist Positions
    Antagonist Positions
    [replacetext("[antag.name]", " ", " ")][replacetext("[antag.name]", " ", " ")][replacetext("[antag.name]", " ", " ")][replacetext("[antag.name]", " ", " ")]
    Other Roles
    [entry][entry][entry][entry]
    " // Channels @@ -401,9 +401,9 @@ for(var/channel_type in channels) var/decl/communication_channel/channel = channels[channel_type] if(jobban_isbanned(M, channel.name)) - jobs += "[channel.name]" + jobs += "[channel.name]" else - jobs += "[channel.name]" + jobs += "[channel.name]" jobs += "" // Finalize and display. @@ -690,9 +690,9 @@ var/dat = {"What mode do you wish to play?
    "} var/list/mode_names = get_config_value(/decl/config/lists/mode_names) for(var/mode in get_config_value(/decl/config/lists/mode_allowed)) - dat += {"[mode_names[mode]]
    "} - dat += {"Secret
    "} - dat += {"Random
    "} + dat += {"[mode_names[mode]]
    "} + dat += {"Secret
    "} + dat += {"Random
    "} dat += {"Now: [SSticker.master_mode]"} show_browser(usr, dat, "window=c_mode") @@ -706,8 +706,8 @@ var/dat = {"What game mode do you want to force secret to be? Use this if you want to change the game mode, but want the players to believe it's secret. This will only work if the current game mode is secret.
    "} var/list/mode_names = get_config_value(/decl/config/lists/mode_names) for(var/mode in get_config_value(/decl/config/lists/mode_allowed)) - dat += {"[mode_names[mode]]
    "} - dat += {"Random (default)
    "} + dat += {"[mode_names[mode]]
    "} + dat += {"Random (default)
    "} dat += {"Now: [secret_force_mode]"} show_browser(usr, dat, "window=f_secret") @@ -739,9 +739,9 @@ else if(href_list["monkeyone"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["monkeyone"]) + var/mob/living/human/H = locate(href_list["monkeyone"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return log_and_message_admins("attempting to monkeyize [key_name_admin(H)]") @@ -750,9 +750,9 @@ else if(href_list["corgione"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["corgione"]) + var/mob/living/human/H = locate(href_list["corgione"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return log_and_message_admins("attempting to corgize [key_name_admin(H)]") @@ -788,9 +788,9 @@ else if(href_list["makeai"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["makeai"]) + var/mob/living/human/H = locate(href_list["makeai"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return log_and_message_admins("AIized [key_name_admin(H)]!") @@ -799,9 +799,9 @@ else if(href_list["makerobot"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["makerobot"]) + var/mob/living/human/H = locate(href_list["makerobot"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return usr.client.cmd_admin_robotize(H) @@ -816,17 +816,6 @@ usr.client.cmd_admin_animalize(M) - else if(href_list["togmutate"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["togmutate"]) - if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return - var/block=text2num(href_list["block"]) - usr.client.cmd_admin_toggle_block(H,block) - show_player_panel(H) - else if(href_list["adminplayeropts"]) var/mob/M = locate(href_list["adminplayeropts"]) show_player_panel(M) @@ -941,14 +930,14 @@ to_chat(src.owner, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];") to_chat(src.owner, "Location = [location_description];") to_chat(src.owner, "[special_role_description]") - to_chat(src.owner, "(PM) (PP) (VV) ([admin_jump_link(M, src)]) (RS)") + to_chat(src.owner, "(PM) (PP) (VV) ([admin_jump_link(M, src)]) (RS)") else if(href_list["adminspawnprayreward"]) if(!check_rights(R_ADMIN|R_FUN)) return - var/mob/living/carbon/human/H = locate(href_list["adminspawnprayreward"]) + var/mob/living/human/H = locate(href_list["adminspawnprayreward"]) if(!ishuman(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return var/obj/item/C = new global.using_map.pray_reward_type(get_turf(H)) @@ -1030,9 +1019,9 @@ else if(href_list["SyndicateReply"]) - var/mob/living/carbon/human/H = locate(href_list["SyndicateReply"]) + var/mob/living/human/H = locate(href_list["SyndicateReply"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return var/obj/item/l_ear = H.get_equipped_item(slot_l_ear_str) var/obj/item/r_ear = H.get_equipped_item(slot_r_ear_str) @@ -1063,7 +1052,7 @@ for (var/page = 1, page <= B.pages.len, page++) var/obj/pageobj = B.pages[page] - data += "Page [page] - [pageobj.name]
    " + data += "Page [page] - [pageobj.name]
    " show_browser(usr, data, "window=[B.name]") else @@ -1519,6 +1508,7 @@ ckey = LAST_CKEY(M) show_player_info(ckey) return + if(href_list["setstaffwarn"]) var/mob/M = locate(href_list["setstaffwarn"]) if(!ismob(M)) return @@ -1541,6 +1531,7 @@ show_player_panel(M) if("No") return + if(href_list["removestaffwarn"]) var/mob/M = locate(href_list["removestaffwarn"]) if(!ismob(M)) return @@ -1585,10 +1576,35 @@ else log_debug("Tried to send a fax to an invalid machine!:[log_info_line(F)]\nhref:[log_info_line(href_list)]") + if(href_list["toggle_mutation"]) + var/mob/M = locate(href_list["toggle_mutation"]) + var/decl/genetic_condition/condition = locate(href_list["block"]) + if(istype(condition) && istype(M) && !QDELETED(M)) + var/result + var/had_condition + if(M.has_genetic_condition(condition.type)) + had_condition = TRUE + result = M.remove_genetic_condition(condition.type) + else + had_condition = FALSE + result = M.add_genetic_condition(condition.type) + if(!isnull(result)) + if(result) + if(had_condition) + log_debug("Removed genetic condition [condition.name] from \the [M] ([M.ckey]).") + else + log_debug("Added genetic condition [condition.name] to \the [M] ([M.ckey]).") + else + log_debug("Failed to toggle genetic condition [condition.name] on \the [M] ([M.ckey]).") + else + log_debug("Could not apply genetic condition [condition.name] to \the [M] ([M.ckey]).") + show_player_panel(M) + return + /mob/living/proc/can_centcom_reply() return 0 -/mob/living/carbon/human/can_centcom_reply() +/mob/living/human/can_centcom_reply() for(var/slot in global.ear_slots) var/obj/item/radio/headset/radio = get_equipped_item(slot) if(istype(radio)) @@ -1601,7 +1617,7 @@ return list() /atom/movable/extra_admin_link(var/source, var/prefix, var/sufix, var/short_links) - return list("[prefix][short_links ? "J" : "JMP"][sufix]") + return list("[prefix][short_links ? "J" : "JMP"][sufix]") /client/extra_admin_link(source, var/prefix, var/sufix, var/short_links) return mob ? mob.extra_admin_link(source, prefix, sufix, short_links) : list() @@ -1609,12 +1625,12 @@ /mob/extra_admin_link(var/source, var/prefix, var/sufix, var/short_links) . = ..() if(client && eyeobj) - . += "[prefix][short_links ? "E" : "EYE"][sufix]" + . += "[prefix][short_links ? "E" : "EYE"][sufix]" /mob/observer/ghost/extra_admin_link(var/source, var/prefix, var/sufix, var/short_links) . = ..() if(mind && (mind.current && !isghost(mind.current))) - . += "[prefix][short_links ? "B" : "BDY"][sufix]" + . += "[prefix][short_links ? "B" : "BDY"][sufix]" /proc/admin_jump_link(var/datum/target, var/source, var/delimiter = "|", var/prefix, var/sufix, var/short_links) if(!istype(target)) diff --git a/code/modules/admin/verbs/SDQL.dm b/code/modules/admin/verbs/SDQL.dm index 6f99308597f..a67da780ff0 100644 --- a/code/modules/admin/verbs/SDQL.dm +++ b/code/modules/admin/verbs/SDQL.dm @@ -323,16 +323,16 @@ var/atom/a = t if(a.x) - text += "\ref[t]: [t] at ([a.x], [a.y], [a.z])
    " + text += "\ref[t]: [t] at ([a.x], [a.y], [a.z])
    " else if(a.loc && a.loc.x) - text += "\ref[t]: [t] in [a.loc] at ([a.loc.x], [a.loc.y], [a.loc.z])
    " + text += "\ref[t]: [t] in [a.loc] at ([a.loc.x], [a.loc.y], [a.loc.z])
    " else - text += "\ref[t]: [t]
    " + text += "\ref[t]: [t]
    " else - text += "\ref[t]: [t]
    " + text += "\ref[t]: [t]
    " //text += "[t]
    " show_browser(usr, text, "window=sdql_result") diff --git a/code/modules/admin/verbs/SDQL_2/SDQL_2.dm b/code/modules/admin/verbs/SDQL_2/SDQL_2.dm index 34aa6f688d8..0331cb89a49 100644 --- a/code/modules/admin/verbs/SDQL_2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL_2/SDQL_2.dm @@ -104,15 +104,15 @@ if("select") var/text = "" for(var/datum/t in objs) - text += "\ref[t]" + text += "\ref[t]" if(istype(t, /atom)) var/atom/a = t if(a.x) - text += ": [t] at ([a.x], [a.y], [a.z])
    " + text += ": [t] at ([a.x], [a.y], [a.z])
    " else if(a.loc && a.loc.x) - text += ": [t] in [a.loc] at ([a.loc.x], [a.loc.y], [a.loc.z])
    " + text += ": [t] in [a.loc] at ([a.loc.x], [a.loc.y], [a.loc.z])
    " else text += ": [t]
    " diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 8f3a645e8c0..ee9f73e756b 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -41,7 +41,7 @@ var/global/list/adminhelp_ignored_words = list("unknown","the","a","an","of","mo if(!(word in adminhelp_ignored_words)) if(word == "ai" && !ai_found) ai_found = 1 - msg += "[original_word] (CL) " + msg += "[original_word] (CL) " continue else var/mob/found = ckeys[word] @@ -52,10 +52,10 @@ var/global/list/adminhelp_ignored_words = list("unknown","the","a","an","of","mo if(found) if(!(found in mobs_found)) mobs_found += found - msg += "[original_word] (?)" + msg += "[original_word] (?)" if(!ai_found && isAI(found)) ai_found = 1 - msg += " (CL)" + msg += " (CL)" msg += " " continue msg += "[original_word] " @@ -118,7 +118,7 @@ var/global/list/adminhelp_ignored_words = list("unknown","the","a","an","of","mo //Options bar: mob, details ( admin = 2, dev = 3, character name (0 = just ckey, 1 = ckey and character name), link? (0 no don't make it a link, 1 do so), // highlight special roles (0 = everyone has same looking name, 1 = antags / special roles get a golden name) - msg = "HELP: [get_options_bar(mob, 2, 1, 1, 1, ticket)] ([(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]) (CLOSE): [msg]" + msg = "HELP: [get_options_bar(mob, 2, 1, 1, 1, ticket)] ([(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]) (CLOSE): [msg]" var/admin_number_afk = 0 @@ -131,7 +131,7 @@ var/global/list/adminhelp_ignored_words = list("unknown","the","a","an","of","mo to_chat(X, msg) window_flash(X) //show it to the person adminhelping too - to_chat(src, SPAN_BLUE("PM to-Staff (CLOSE): [original_msg]")) + to_chat(src, SPAN_BLUE("PM to-Staff (CLOSE): [original_msg]")) var/admin_number_present = global.admins.len - admin_number_afk log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.") if(admin_number_present <= 0) diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index f1f4d7130d9..80f1d71a039 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -116,13 +116,13 @@ return if(get_config_value(/decl/config/toggle/on/admin_jump)) - var/list/keys = list() - for(var/mob/M in global.player_list) + var/list/client/keys = list() + for(var/mob/M in global.player_list) // excludes /mob/new_player keys += M.client - var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys) + var/client/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys) if(!selection) return - var/mob/M = selection:mob + var/mob/M = selection.mob if(!M) return diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 9d9b1e0b6b1..9dd7c0e7d6d 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -124,7 +124,7 @@ var/sender_message = "" + create_text_tag("pm_out_alt", "PM", src) + " to [get_options_bar(C, holder ? 1 : 0, holder ? 1 : 0, 1)]" if(holder) - sender_message += " ([(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]) (CLOSE)" + sender_message += " ([(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]) (CLOSE)" sender_message += ": [generate_ahelp_key_words(mob, msg)]" else sender_message += ": [msg]" @@ -133,7 +133,7 @@ var/receiver_message = "" + create_text_tag("pm_in", "", C) + " \[[recieve_pm_type] PM\] [get_options_bar(src, C.holder ? 1 : 0, C.holder ? 1 : 0, 1)]" if(C.holder) - receiver_message += " ([(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]) (CLOSE)" + receiver_message += " ([(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]) (CLOSE)" receiver_message += ": [generate_ahelp_key_words(C.mob, msg)]" else receiver_message += ": [msg]" @@ -163,7 +163,7 @@ if(X == C || X == src) continue if(X.key != key && X.key != C.key && (X.holder.rights & R_ADMIN|R_MOD)) - to_chat(X, "" + create_text_tag("pm_other", "PM:", X) + " [key_name(src, X, 0, ticket)] to [key_name(C, X, 0, ticket)] ([(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]) (CLOSE): [msg]") + to_chat(X, "" + create_text_tag("pm_other", "PM:", X) + " [key_name(src, X, 0, ticket)] to [key_name(C, X, 0, ticket)] ([(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]) (CLOSE): [msg]") /client/proc/cmd_admin_irc_pm(sender) if(prefs.muted & MUTE_ADMINHELP) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 3ca45751185..43c18e0351c 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -107,7 +107,7 @@ set name = "Del-All" // to prevent REALLY stupid deletions - var/blocked = list(/obj, /mob, /mob/living, /mob/living/carbon, /mob/living/carbon/human, /mob/observer, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai) + var/blocked = list(/obj, /mob, /mob/living, /mob/living/human, /mob/observer, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai) var/hsbitem = input(usr, "Choose an object to delete.", "Delete:") as null|anything in typesof(/obj) + typesof(/mob) - blocked if(hsbitem) for(var/atom/O in world) @@ -145,7 +145,7 @@ alert("Wait until the game starts") return if (ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/card/id/id = H.GetIdCard() if(id) id.icon_state = "gold" @@ -282,7 +282,7 @@ if(!check_rights(R_FUN)) return - var/mob/living/carbon/human/H = input("Select mob.", "Select equipment.") as null|anything in global.human_mob_list + var/mob/living/human/H = input("Select mob.", "Select equipment.") as null|anything in global.human_mob_list if(!H) return @@ -297,7 +297,7 @@ SSstatistics.add_field_details("admin_verb","SEQ") dressup_human(H, outfit, reset_equipment) -/proc/dressup_human(var/mob/living/carbon/human/H, var/decl/hierarchy/outfit/outfit, var/undress = TRUE) +/proc/dressup_human(var/mob/living/human/H, var/decl/hierarchy/outfit/outfit, var/undress = TRUE) if(!H || !outfit) return if(undress) @@ -360,22 +360,6 @@ if("Clients") to_chat(usr, jointext(global.clients,",")) -// DNA2 - Admin Hax -/client/proc/cmd_admin_toggle_block(var/mob/M,var/block) - if(GAME_STATE < RUNLEVEL_GAME) - alert("Wait until the game starts") - return - if(M.dna) - M.dna.SetSEState(block,!M.dna.GetSEState(block)) - domutcheck(M,null,MUTCHK_FORCED) - M.update_mutations() - var/state="[M.dna.GetSEState(block)?"on":"off"]" - var/blockname=assigned_blocks[block] - message_admins("[key_name_admin(src)] has toggled [M.key]'s [blockname] block [state]!") - log_admin("[key_name(src)] has toggled [M.key]'s [blockname] block [state]!") - else - alert("Invalid mob") - /datum/admins/proc/view_runtimes() set category = "Debug" set name = "View Runtimes" @@ -391,12 +375,12 @@ set name = "Analyse Health" set desc = "Get an advanced health reading on a human mob." - var/mob/living/carbon/human/H = input("Select mob.", "Analyse Health") as null|anything in global.human_mob_list + var/mob/living/human/H = input("Select mob.", "Analyse Health") as null|anything in global.human_mob_list if(!H) return cmd_analyse_health(H) -/client/proc/cmd_analyse_health(var/mob/living/carbon/human/H) +/client/proc/cmd_analyse_health(var/mob/living/human/H) if(!check_rights(R_DEBUG)) return @@ -405,10 +389,10 @@ var/dat = display_medical_data(H.get_raw_medical_data(), SKILL_MAX) - dat += text("
    Close", usr) + dat += text("
    Close", usr) show_browser(usr, dat, "window=scanconsole;size=430x600") -/client/proc/cmd_analyse_health_context(mob/living/carbon/human/H as mob in global.human_mob_list) +/client/proc/cmd_analyse_health_context(mob/living/human/H as mob in global.human_mob_list) set category = null set name = "Analyse Human Health" diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 2c273c89da9..6638c344791 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -341,7 +341,7 @@ var/global/list/debug_verbs = list ( var/list/baddies = list("LEAKY PIPES") for(var/obj/machinery/atmospherics/pipe/P in SSmachines.machinery) if(P.leaking) - baddies += "[P] ([P.x],[P.y],[P.z] - JMP)" + baddies += "[P] ([P.x],[P.y],[P.z] - JMP)" to_chat(usr,jointext(baddies, "
    ")) diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index 758ef1ee1ab..aea09a39741 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -29,7 +29,7 @@ usr.real_name = usr.name_archive usr.SetName(usr.real_name) if(ishuman(usr)) - var/mob/living/carbon/human/H = usr + var/mob/living/human/H = usr H.SetName(H.get_visible_name()) usr.forceMove(O.loc) // Appear where the object you were controlling is -- TLE diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 5bfb6f10ef2..092f90de0ad 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -6,7 +6,7 @@ SSstatistics.add_field_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /proc/Centcomm_announce(var/msg, var/mob/Sender, var/iamessage) - msg = "[uppertext(global.using_map.boss_short)]M[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) ([admin_jump_link(Sender)]) (RS) (BSA) (RPLY): [msg]" + msg = "[uppertext(global.using_map.boss_short)]M[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) ([admin_jump_link(Sender)]) (RS) (BSA) (RPLY): [msg]" for(var/client/C in global.admins) if(R_ADMIN & C.holder.rights) @@ -14,7 +14,7 @@ sound_to(C, 'sound/machines/signal.ogg') /proc/Syndicate_announce(var/msg, var/mob/Sender) - msg = "ILLEGAL:[key_name(Sender, 1)] (PP) (VV) (DN) ([admin_jump_link(Sender)]) (RS) (BSA) (TAKE) (RPLY): [msg]" + msg = "ILLEGAL:[key_name(Sender, 1)] (PP) (VV) (DN) ([admin_jump_link(Sender)]) (RS) (BSA) (TAKE) (RPLY): [msg]" for(var/client/C in global.admins) if(R_ADMIN & C.holder.rights) to_chat(C, msg) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index a525e68ff53..9a048e30b7f 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -395,7 +395,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr, SPAN_WARNING("There is no active key like that in the game or the person is not currently a ghost.")) return - var/mob/living/carbon/human/new_character = new(get_random_spawn_turf(SPAWN_FLAG_JOBS_CAN_SPAWN)) //The mob being spawned. + var/mob/living/human/new_character = new(get_random_spawn_turf(SPAWN_FLAG_JOBS_CAN_SPAWN)) //The mob being spawned. var/datum/computer_file/report/crew_record/record_found //Referenced to later to either randomize or not randomize the character. if(G_found.mind && !G_found.mind.active) record_found = get_crewmember_record(G_found.real_name) @@ -427,10 +427,8 @@ Traitors and the like can also be revived with the previous role mostly intact. new_character.mind.assigned_role = global.using_map.default_job_title//If they somehow got a null assigned role. //DNA - if(new_character.dna) - new_character.dna.ready_dna(new_character) - if(record_found)//Pull up their name from database records if they did have a mind. - new_character.dna.unique_enzymes = record_found.get_dna() + if(record_found)//Pull up their name from database records if they did have a mind. + new_character.set_unique_enzymes(record_found.get_dna()) new_character.key = G_found.key /* diff --git a/code/modules/admin/view_variables/helpers.dm b/code/modules/admin/view_variables/helpers.dm index 6a306a533a9..8e30b30b4d7 100644 --- a/code/modules/admin/view_variables/helpers.dm +++ b/code/modules/admin/view_variables/helpers.dm @@ -6,26 +6,26 @@ /atom/get_view_variables_header() return {" - [src] + [src]
    - << - [dir2text(dir)] - >> + << + [dir2text(dir)] + >> "} /mob/living/get_view_variables_header() return {" - [src] -
    << [dir2text(dir)] >> -
    [ckey ? ckey : "No ckey"] / [real_name ? real_name : "No real name"] + [src] +
    << [dir2text(dir)] >> +
    [ckey ? ckey : "No ckey"] / [real_name ? real_name : "No real name"]
    - BRUTE:[get_damage(BRUTE)] - FIRE:[get_damage(BURN)] - TOXIN:[get_damage(TOX)] - OXY:[get_damage(OXY)] - CLONE:[get_damage(CLONE)] - BRAIN:[get_damage(BRAIN)] + BRUTE:[get_damage(BRUTE)] + FIRE:[get_damage(BURN)] + TOXIN:[get_damage(TOX)] + OXY:[get_damage(OXY)] + CLONE:[get_damage(CLONE)] + BRAIN:[get_damage(BRAIN)]
    "} @@ -69,7 +69,7 @@ "} -/mob/living/carbon/human/get_view_variables_options() +/mob/living/human/get_view_variables_options() return ..() + {" @@ -118,18 +118,18 @@ /datum/proc/make_view_variables_variable_entry(var/varname, var/value, var/hide_watch = 0) return {" - (E) - (C) - (M) - [hide_watch ? "" : "(W)"] + (E) + (C) + (M) + [hide_watch ? "" : "(W)"] "} // No mass editing of clients /client/make_view_variables_variable_entry(var/varname, var/value, var/hide_watch = 0) return {" - (E) - (C) - [hide_watch ? "" : "(W)"] + (E) + (C) + [hide_watch ? "" : "(W)"] "} // These methods are all procs and don't use stored lists to avoid VV exploits diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index a479f6dc3c7..63188f399eb 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -25,9 +25,9 @@ else if(href_list["dressup"]) if(!check_rights(R_VAREDIT)) return - var/mob/living/carbon/human/H = locate(href_list["dressup"]) + var/mob/living/human/H = locate(href_list["dressup"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return var/decl/hierarchy/outfit/outfit = input("Select outfit.", "Select equipment.") as null|anything in outfits() if(!outfit) @@ -252,9 +252,9 @@ else if(href_list["makemonkey"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["makemonkey"]) + var/mob/living/human/H = locate(href_list["makemonkey"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/human") return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return @@ -266,9 +266,9 @@ else if(href_list["makerobot"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["makerobot"]) + var/mob/living/human/H = locate(href_list["makerobot"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/human") return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return @@ -280,9 +280,9 @@ else if(href_list["makeai"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["makeai"]) + var/mob/living/human/H = locate(href_list["makeai"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/human") return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return @@ -293,9 +293,9 @@ else if(href_list["addailment"]) - var/mob/living/carbon/human/H = locate(href_list["addailment"]) + var/mob/living/human/H = locate(href_list["addailment"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/human") return var/obj/item/organ/O = input("Select a limb to add the ailment to.", "Add Ailment") as null|anything in H.get_organs() if(QDELETED(H) || QDELETED(O) || O.owner != H) @@ -317,9 +317,9 @@ else if(href_list["remailment"]) - var/mob/living/carbon/human/H = locate(href_list["remailment"]) + var/mob/living/human/H = locate(href_list["remailment"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/human") return var/list/all_ailments = list() for(var/obj/item/organ/O in H.get_organs()) @@ -339,9 +339,9 @@ else if(href_list["setspecies"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["setspecies"]) + var/mob/living/human/H = locate(href_list["setspecies"]) if(!istype(H)) - to_chat(usr, SPAN_WARNING("This can only be done to instances of type /mob/living/carbon/human")) + to_chat(usr, SPAN_WARNING("This can only be done to instances of type /mob/living/human")) return var/new_species = input("Please choose a new species.","Species",null) as null|anything in get_all_species() @@ -361,9 +361,9 @@ else if(href_list["setbodytype"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["setbodytype"]) + var/mob/living/human/H = locate(href_list["setbodytype"]) if(!istype(H)) - to_chat(usr, SPAN_WARNING("This can only be done to instances of type /mob/living/carbon/human")) + to_chat(usr, SPAN_WARNING("This can only be done to instances of type /mob/living/human")) return var/new_bodytype = input("Please choose a new bodytype.","Bodytype",null) as null|anything in H.species.available_bodytypes @@ -442,14 +442,14 @@ return var/list/possibleverbs = list() possibleverbs += "Cancel" // One for the top... - possibleverbs += typesof(/mob/proc,/mob/verb,/mob/living/proc,/mob/living/verb) + possibleverbs += typesof(/mob/proc, /mob/verb, /mob/living/proc, /mob/living/verb) switch(H.type) - if(/mob/living/carbon/human) - possibleverbs += typesof(/mob/living/carbon/proc,/mob/living/carbon/verb,/mob/living/carbon/human/verb,/mob/living/carbon/human/proc) + if(/mob/living/human) + possibleverbs += typesof(/mob/living/human/verb, /mob/living/human/proc) if(/mob/living/silicon/robot) - possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb) + possibleverbs += typesof(/mob/living/silicon/proc, /mob/living/silicon/robot/proc, /mob/living/silicon/robot/verb) if(/mob/living/silicon/ai) - possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb) + possibleverbs += typesof(/mob/living/silicon/proc, /mob/living/silicon/ai/proc, /mob/living/silicon/ai/verb) possibleverbs -= H.verbs possibleverbs += "Cancel" // ...And one for the bottom @@ -482,9 +482,13 @@ else if(href_list["addorgan"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/M = locate(href_list["addorgan"]) + var/mob/living/M = locate(href_list["addorgan"]) if(!istype(M)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + to_chat(usr, "This can only be done to instances of type /mob/living") + return + + if(!length(M.get_external_organs())) // quick and dirty check for organs; should always be >0 for humanlike mobs. + to_chat(usr, "This can only be done to mobs that implement organs!") return var/obj/item/organ/new_organ = input("Please choose an organ to add.","Organ",null) as null|anything in subtypesof(/obj/item/organ) @@ -509,9 +513,13 @@ else if(href_list["remorgan"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/M = locate(href_list["remorgan"]) + var/mob/living/M = locate(href_list["remorgan"]) if(!istype(M)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + to_chat(usr, "This can only be done to instances of type /mob/living") + return + + if(!length(M.get_external_organs())) // quick and dirty check for organs; should always be >0 for humanlike mobs. + to_chat(usr, "This can only be done to mobs that implement organs!") return var/obj/item/organ/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.get_internal_organs() @@ -560,9 +568,9 @@ else if(href_list["refreshoverlays"]) if(!check_rights(0)) return - var/mob/living/carbon/human/H = locate(href_list["refreshoverlays"]) + var/mob/living/human/H = locate(href_list["refreshoverlays"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/human") return H.try_refresh_visible_overlays() diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index 36484374356..f39d8cc574c 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -49,8 +49,8 @@ var/global/list/view_variables_no_assoc = list("verbs", "contents","screen","ima
    - Refresh - [A ? "Jump To":""] + Refresh + [A ? "Jump To":""] " t += "" t += "Target account number:
    " @@ -204,21 +204,21 @@ t += "" else t += "Account balance: [authenticated_account.format_value_by_currency(authenticated_account.money)]" - t += "
    " + t += "" t += "" t += " Cash Chargecard
    " t += "" t += "
    " - t += "Change account security level
    " - t += "Make transfer
    " - t += "View transaction log
    " - t += "Print balance statement
    " + t += "Change account security level
    " + t += "Make transfer
    " + t += "View transaction log
    " + t += "Print balance statement
    " //Logout/back buttons, put here for some modularity and for less repeated code if(view_screen == NO_SCREEN) - t += "Logout
    " + t += "Logout
    " else - t += "Back" + t += "Back" else //change our display depending on account security levels @@ -228,7 +228,7 @@ t += "This account requires a PIN to access. For security reasons the account # will need re-entered or ID bound to this account re-scanned." else t += "Due to the security settings on this account, all information needs to be re-entered and the ID bound to this account placed in the slot above.
    " - t += "
    " + t += "" t += "" t += "" t += "Account:

    " @@ -441,14 +441,14 @@ interact(usr) -/obj/machinery/atm/proc/scan_user(mob/living/carbon/human/human_user) +/obj/machinery/atm/proc/scan_user(mob/living/human/human_user) if(!authenticated_account) var/obj/item/card/id/I = human_user.GetIdCard() if(istype(I)) return I // put the currently held id on the ground or in the hand of the user -/obj/machinery/atm/proc/release_held_id(mob/living/carbon/human/human_user) +/obj/machinery/atm/proc/release_held_id(mob/living/human/human_user) if(!held_card) return diff --git a/code/modules/economy/cael/EFTPOS.dm b/code/modules/economy/cael/EFTPOS.dm index 673cb97e740..5af1d83c3db 100644 --- a/code/modules/economy/cael/EFTPOS.dm +++ b/code/modules/economy/cael/EFTPOS.dm @@ -63,7 +63,7 @@ dat += "This terminal is [machine_id]. Report this code when contacting IT Support
    " var/decl/currency/cur = GET_DECL(currency) if(transaction_locked) - dat += "Back[transaction_paid ? "" : " (authentication required)"]

    " + dat += "Back[transaction_paid ? "" : " (authentication required)"]

    " dat += "Transaction purpose: [transaction_purpose]
    " dat += "Value: [cur.format_value(transaction_amount)]
    " dat += "Linked account: [linked_account ? linked_account.owner_name : "None"]
    " @@ -71,16 +71,16 @@ dat += "This transaction has been processed successfully.
    " else dat += "Swipe your card below the line to finish this transaction.
    " - dat += "\[------\]" + dat += "\[------\]" else - dat += "Lock in new transaction

    " - - dat += "Transaction purpose: [transaction_purpose]
    " - dat += "Value: [cur.format_value(transaction_amount)]
    " - dat += "Linked account: [linked_account ? linked_account.owner_name : "None"]
    " - dat += "Change access code
    " - dat += "Change EFTPOS ID
    " - dat += "Scan card to reset access code \[------\]" + dat += "Lock in new transaction

    " + + dat += "Transaction purpose: [transaction_purpose]
    " + dat += "Value: [cur.format_value(transaction_amount)]
    " + dat += "Linked account: [linked_account ? linked_account.owner_name : "None"]
    " + dat += "Change access code
    " + dat += "Change EFTPOS ID
    " + dat += "Scan card to reset access code \[------\]" show_browser(user, dat, "window=eftpos") else close_browser(user, "window=eftpos") diff --git a/code/modules/economy/worth_mob.dm b/code/modules/economy/worth_mob.dm index 42e4387f1e1..7102d7c6809 100644 --- a/code/modules/economy/worth_mob.dm +++ b/code/modules/economy/worth_mob.dm @@ -4,17 +4,15 @@ . *= 1.5 . = max(round(.), mob_size) -/mob/living/carbon/get_single_monetary_worth() +/mob/living/get_single_monetary_worth() . = ..() for(var/atom/movable/organ in get_organs()) . += organ.get_combined_monetary_worth() - -/mob/living/carbon/get_value_multiplier() - . = species?.rarity_value || 1 - -/mob/living/get_single_monetary_worth() - . = ..() if(butchery_data) var/decl/butchery_data/butchery_decl = GET_DECL(butchery_data) . += butchery_decl.get_monetary_worth(src) . = round(.) + +/mob/living/get_value_multiplier() + var/decl/species/my_species = get_species() + . = my_species ? my_species.rarity_value : 1 diff --git a/code/modules/emotes/definitions/audible_snap.dm b/code/modules/emotes/definitions/audible_snap.dm index 8b08fdd78d5..428f93d1879 100644 --- a/code/modules/emotes/definitions/audible_snap.dm +++ b/code/modules/emotes/definitions/audible_snap.dm @@ -8,7 +8,7 @@ /decl/emote/audible/snap/proc/can_snap(var/atom/user) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user for(var/limb in list(BP_L_HAND, BP_R_HAND)) var/obj/item/organ/external/L = H.get_organ(limb) if(istype(L) && L.is_usable() && !L.splinted) diff --git a/code/modules/emotes/definitions/audible_whistle.dm b/code/modules/emotes/definitions/audible_whistle.dm index fed0842b6f7..585ca85e95f 100644 --- a/code/modules/emotes/definitions/audible_whistle.dm +++ b/code/modules/emotes/definitions/audible_whistle.dm @@ -1,7 +1,7 @@ /decl/emote/audible/whistle key = "whistle" emote_message_1p = "You whistle a tune." - emote_message_3p = "whistles a tune." + emote_message_3p = "$USER$ whistles a tune." emote_message_muffled = "$USER$ makes a light spitting noise, a poor attempt at a whistle." emote_message_synthetic_1p = "You whistle a robotic tune." emote_message_synthetic_3p = "$USER$ whistles a robotic tune." diff --git a/code/modules/emotes/definitions/tail.dm b/code/modules/emotes/definitions/tail.dm index e4a5c1edc3e..720922104c5 100644 --- a/code/modules/emotes/definitions/tail.dm +++ b/code/modules/emotes/definitions/tail.dm @@ -9,7 +9,7 @@ key = "swish" /decl/emote/visible/tail/swish/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_once() return TRUE @@ -18,7 +18,7 @@ key = "wag" /decl/emote/visible/tail/wag/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_start() return TRUE @@ -27,7 +27,7 @@ key = "sway" /decl/emote/visible/tail/sway/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_start() return TRUE @@ -36,7 +36,7 @@ key = "qwag" /decl/emote/visible/tail/qwag/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_fast() return TRUE @@ -45,7 +45,7 @@ key = "fastsway" /decl/emote/visible/tail/fastsway/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_fast() return TRUE @@ -54,7 +54,7 @@ key = "swag" /decl/emote/visible/tail/swag/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_stop() return TRUE @@ -63,7 +63,7 @@ key = "stopsway" /decl/emote/visible/tail/stopsway/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_stop() return TRUE diff --git a/code/modules/emotes/definitions/visible.dm b/code/modules/emotes/definitions/visible.dm index c4c2f76ae2c..414327646f5 100644 --- a/code/modules/emotes/definitions/visible.dm +++ b/code/modules/emotes/definitions/visible.dm @@ -362,7 +362,7 @@ . = ..() && user.check_has_mouth() && !user.isSynthetic() /decl/emote/visible/vomit/do_emote(var/atom/user, var/extra_params) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(istype(H)) H.vomit(deliberate = TRUE) return TRUE diff --git a/code/modules/emotes/emote_define.dm b/code/modules/emotes/emote_define.dm index 01622faed06..e6e037a8c72 100644 --- a/code/modules/emotes/emote_define.dm +++ b/code/modules/emotes/emote_define.dm @@ -34,6 +34,7 @@ var/global/list/_emotes_by_key return global._emotes_by_key[key] /decl/emote + abstract_type = /decl/emote /// Command to use emote ie. '*[key]' var/key /// First person message ('You do a flip!') diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm index 4cf335faab0..0aae86e2df7 100644 --- a/code/modules/error_handler/error_viewer.dm +++ b/code/modules/error_handler/error_viewer.dm @@ -83,7 +83,7 @@ var/global/datum/error_viewer/error_cache/error_cache if (linear) back_to_param += ";viewruntime_linear=1" - return "[linktext]" + return "[linktext]" /datum/error_viewer/error_cache var/list/errors = list() @@ -194,12 +194,12 @@ var/global/datum/error_viewer/error_cache/error_cache var/html = build_header(back_to, linear) html += "[name]
    [desc]
    " if (usr_ref) - html += "
    usr: VV" - html += " PP" - html += " Follow" + html += "
    usr: VV" + html += " PP" + html += " Follow" if (istype(usr_loc)) - html += "
    usr.loc: VV" - html += " JMP" + html += "
    usr.loc: VV" + html += " JMP" browse_to(user, html) diff --git a/code/modules/events/ailments.dm b/code/modules/events/ailments.dm index 4b862a9be19..a1d6fc894e8 100644 --- a/code/modules/events/ailments.dm +++ b/code/modules/events/ailments.dm @@ -1,6 +1,6 @@ /datum/event/ailments/start() var/list/candidates = list() - for(var/mob/living/carbon/human/H in global.living_mob_list_) + for(var/mob/living/human/H in global.living_mob_list_) if(H.client && !length(H.stasis_sources)) candidates += H if(!length(candidates)) @@ -8,7 +8,7 @@ candidates = shuffle(candidates) var/create_ailments = min(length(candidates), rand(1,3)) for(var/i = 1 to length(candidates)) - var/mob/living/carbon/human/H = candidates[i] + var/mob/living/human/H = candidates[i] var/list/organs = shuffle(H.get_organs()) for(var/ii = 1 to length(organs)) var/obj/item/organ/O = organs[ii] diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 33914e601f4..ebeef2b276a 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -120,7 +120,7 @@ if(prob((0.2 * severity) - 0.2)) T.set_broken() - for(var/mob/living/carbon/human/H in T.area) + for(var/mob/living/human/H in T.area) to_chat(H, SPAN_WARNING("You feel the hairs on the back of your neck standing up!")) if(prob(25)) if(H.eyecheck() == FLASH_PROTECTION_NONE) @@ -158,7 +158,7 @@ S.adjust_speed(ax, ay) last_bounce = world.time + (bounce_delay / severity) - for(var/mob/living/carbon/human/H in global.living_mob_list_) //Affect mobs, skip synthetics. + for(var/mob/living/human/H in global.living_mob_list_) //Affect mobs, skip synthetics. if(!(H.z in affecting_z) || isnull(H) || QDELETED(H)) continue to_chat(H, SPAN_WARNING("You're shaken about as the storm disrupts the ship's course!")) diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 7678707149d..9916487bd32 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -17,7 +17,7 @@ endWhen = rand(500, 1500) /datum/event/ionstorm/announce() - for(var/mob/living/carbon/S in SSmobs.mob_list) + for(var/mob/living/S in SSmobs.mob_list) if (!S.isSynthetic()) continue if(!(S.z in affecting_z)) @@ -134,7 +134,7 @@ /datum/event/ionstorm/proc/get_random_humanoid_player_name(var/default_if_none) - for (var/mob/living/carbon/human/player in global.player_list) + for (var/mob/living/human/player in global.player_list) if(!player.mind || player_is_antag(player.mind, only_offstation_roles = 1) || !player.is_client_active(5)) continue players += player.real_name diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index 37485967fd9..52be544306c 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -154,4 +154,331 @@ var/global/list/meteors_major = list( if(victim.vessel_size < SHIP_SIZE_SMALL) skill_needed = skill_needed - 1 if(skill >= max(skill_needed, victim.skill_needed)) - return 0 \ No newline at end of file + return 0 + +/////////////////////////////// +//Meteor spawning global procs +/////////////////////////////// + +/proc/spawn_meteors(var/number = 10, var/list/meteortypes, var/startSide, var/zlevel) + for(var/i = 0; i < number; i++) + spawn_meteor(meteortypes, startSide, zlevel) + +/proc/spawn_meteor(var/list/meteortypes, var/startSide, var/zlevel) + var/turf/pickedstart = spaceDebrisStartLoc(startSide, zlevel) + var/turf/pickedgoal = spaceDebrisFinishLoc(startSide, zlevel) + + var/Me = pickweight(meteortypes) + var/obj/effect/meteor/M = new Me(pickedstart) + M.dest = pickedgoal + spawn(0) + walk_towards(M, M.dest, 3) + return + +/proc/spaceDebrisStartLoc(startSide, Z) + var/starty + var/startx + switch(startSide) + if(NORTH) + starty = world.maxy-(TRANSITIONEDGE+1) + startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) + if(EAST) + starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1)) + startx = world.maxx-(TRANSITIONEDGE+1) + if(SOUTH) + starty = (TRANSITIONEDGE+1) + startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) + if(WEST) + starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1)) + startx = (TRANSITIONEDGE+1) + var/turf/T = locate(startx, starty, Z) + return T + +/proc/spaceDebrisFinishLoc(startSide, Z) + var/endy + var/endx + switch(startSide) + if(NORTH) + endy = TRANSITIONEDGE + endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) + if(EAST) + endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE) + endx = TRANSITIONEDGE + if(SOUTH) + endy = world.maxy-TRANSITIONEDGE + endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) + if(WEST) + endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE) + endx = world.maxx-TRANSITIONEDGE + var/turf/T = locate(endx, endy, Z) + return T + +/////////////////////// +//The meteor effect +////////////////////// + +/obj/effect/meteor + name = "meteor" + desc = "You should probably run instead of gawking at this." + icon = 'icons/obj/meteor.dmi' + icon_state = "small" + density = TRUE + anchored = TRUE + var/hits = 4 + var/hitpwr = 2 //Level of ex_act to be called on hit. + var/dest + pass_flags = PASS_FLAG_TABLE + var/heavy = 0 + var/z_original + var/meteordrop = /obj/item/stack/material/ore/iron + var/dropamt = 1 + var/ismissile //missiles don't spin + + var/move_count = 0 + +/obj/effect/meteor/proc/get_shield_damage() + return max(((max(hits, 2)) * (heavy + 1) * rand(30, 60)) / hitpwr , 0) + +/obj/effect/meteor/Initialize() + . = ..() + z_original = z + +/obj/effect/meteor/Initialize() + . = ..() + global.meteor_list += src + +/obj/effect/meteor/Move() + . = ..() //process movement... + move_count++ + if(loc == dest) + qdel(src) + +/obj/effect/meteor/touch_map_edge(var/overmap_id = OVERMAP_ID_SPACE) + if(move_count > TRANSITIONEDGE) + qdel(src) + +/obj/effect/meteor/Destroy() + walk(src,0) //this cancels the walk_towards() proc + global.meteor_list -= src + . = ..() + +/obj/effect/meteor/Initialize() + . = ..() + if(!ismissile) + SpinAnimation() + +/obj/effect/meteor/Bump(atom/A) + ..() + if(A && !QDELETED(src)) // Prevents explosions and other effects when we were deleted by whatever we Bumped() - currently used by shields. + ram_turf(get_turf(A)) + get_hit() //should only get hit once per move attempt + +/obj/effect/meteor/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + return istype(mover, /obj/effect/meteor) ? 1 : ..() + +/obj/effect/meteor/proc/ram_turf(var/turf/T) + //first bust whatever is in the turf + for(var/atom/A in T) + if(A != src && !A.CanPass(src, src.loc, 0.5, 0)) //only ram stuff that would actually block us + A.explosion_act(hitpwr) + + //then, ram the turf if it still exists + if(T && !T.CanPass(src, src.loc, 0.5, 0)) + T.explosion_act(hitpwr) + +//process getting 'hit' by colliding with a dense object +//or randomly when ramming turfs +/obj/effect/meteor/proc/get_hit() + hits-- + if(hits <= 0) + make_debris() + meteor_effect() + qdel(src) + +/obj/effect/meteor/explosion_act() + SHOULD_CALL_PARENT(FALSE) + return + +/obj/effect/meteor/attackby(obj/item/W, mob/user, params) + if(IS_PICK(W)) + qdel(src) + return + ..() + +/obj/effect/meteor/proc/make_debris() + if(meteordrop && dropamt) + for(var/throws = dropamt, throws > 0, throws--) + addtimer(CALLBACK(new meteordrop(get_turf(src)), TYPE_PROC_REF(/atom/movable, throw_at), dest, 5, 10), 0) + +/obj/effect/meteor/proc/meteor_effect() + if(heavy) + for(var/mob/M in global.player_list) + var/turf/T = get_turf(M) + if(!T || T.z != src.z) + continue + var/dist = get_dist(M.loc, src.loc) + shake_camera(M, (dist > 20 ? 0.5 SECONDS : 1 SECOND), (dist > 20 ? 1 : 3)) + + +/////////////////////// +//Meteor types +/////////////////////// + +//Dust +/obj/effect/meteor/dust + name = "space dust" + icon_state = "dust" + pass_flags = PASS_FLAG_TABLE | PASS_FLAG_GRILLE + hits = 1 + hitpwr = 3 + dropamt = 1 + meteordrop = /obj/item/stack/material/ore/handful/sand + +//Medium-sized +/obj/effect/meteor/medium + name = "meteor" + dropamt = 2 + +/obj/effect/meteor/medium/meteor_effect() + ..() + explosion(src.loc, 0, 1, 2, 3, 0) + +//Large-sized +/obj/effect/meteor/big + name = "large meteor" + icon_state = "large" + hits = 6 + heavy = 1 + dropamt = 3 + +/obj/effect/meteor/big/meteor_effect() + ..() + explosion(src.loc, 1, 2, 3, 4, 0) + +//Flaming meteor +/obj/effect/meteor/flaming + name = "flaming meteor" + icon_state = "flaming" + hits = 5 + heavy = 1 + meteordrop = /obj/item/stack/material/ore/phosphorite + +/obj/effect/meteor/flaming/meteor_effect() + ..() + explosion(src.loc, 1, 2, 3, 4, 0, 0, 5) + +//Radiation meteor +/obj/effect/meteor/irradiated + name = "glowing meteor" + icon_state = "glowing" + heavy = 1 + meteordrop = /obj/item/stack/material/ore/uranium + +/obj/effect/meteor/irradiated/meteor_effect() + ..() + explosion(src.loc, 0, 0, 4, 3, 0) + SSradiation.radiate(src, 50) + +/obj/effect/meteor/golden + name = "golden meteor" + icon_state = "glowing" + desc = "Shiny! But also deadly." + meteordrop = /obj/item/stack/material/ore/gold + +/obj/effect/meteor/silver + name = "silver meteor" + icon_state = "glowing_blue" + desc = "Shiny! But also deadly." + meteordrop = /obj/item/stack/material/ore/silver + +/obj/effect/meteor/emp + name = "conducting meteor" + icon_state = "glowing_blue" + desc = "Hide your floppies!" + meteordrop = /obj/item/stack/material/ore/osmium + dropamt = 2 + +/obj/effect/meteor/emp/meteor_effect() + ..() + // Best case scenario: Comparable to a low-yield EMP grenade. + // Worst case scenario: Comparable to a standard yield EMP grenade. + empulse(src, rand(2, 4), rand(4, 10)) + +/obj/effect/meteor/emp/get_shield_damage() + return ..() * rand(2,4) + +//Station buster Tunguska +/obj/effect/meteor/tunguska + name = "tunguska meteor" + icon_state = "flaming" + desc = "Your life briefly passes before your eyes the moment you lay them on this monstrosity." + hits = 10 + hitpwr = 1 + heavy = 1 + meteordrop = /obj/item/stack/material/ore/diamond // Probably means why it penetrates the hull so easily before exploding. + +/obj/effect/meteor/tunguska/meteor_effect() + ..() + explosion(src.loc, 3, 6, 9, 20, 0) + +// This is the final solution against shields - a single impact can bring down most shield generators. +/obj/effect/meteor/supermatter + name = "supermatter shard" + desc = "Oh god, what will be next..?" + icon = 'icons/obj/supermatter_32.dmi' + icon_state = "supermatter" + +/obj/effect/meteor/supermatter/meteor_effect() + ..() + explosion(src.loc, 1, 2, 3, 4, 0) + for(var/obj/machinery/power/apc/A in range(rand(12, 20), src)) + A.energy_fail(round(10 * rand(8, 12))) + +/obj/effect/meteor/supermatter/get_shield_damage() + return ..() * rand(80, 120) + +//Missiles, for events and so on +/obj/effect/meteor/supermatter/missile + name = "photon torpedo" + desc = "An advanded warhead designed to tactically destroy space installations." + icon = 'icons/obj/missile.dmi' + icon_state = "photon" + meteordrop = null + ismissile = TRUE + dropamt = 0 + +/obj/effect/meteor/medium/missile + name = "missile" + desc = "Some kind of missile." + icon = 'icons/obj/items/grenades/missile.dmi' + icon_state = ICON_STATE_WORLD + meteordrop = null + ismissile = TRUE + dropamt = 0 + +/obj/effect/meteor/big/missile + name = "high-yield missile" + desc = "Some kind of missile." + icon = 'icons/obj/items/grenades/missile.dmi' + icon_state = ICON_STATE_WORLD + meteordrop = null + ismissile = TRUE + dropamt = 0 + +/obj/effect/meteor/flaming/missile + name = "incendiary missile" + desc = "Some kind of missile." + icon = 'icons/obj/items/grenades/missile.dmi' + icon_state = ICON_STATE_WORLD + meteordrop = null + ismissile = TRUE + dropamt = 0 + +/obj/effect/meteor/emp/missile + name = "ion torpedo" + desc = "Some kind of missile." + icon = 'icons/obj/missile.dmi' + icon_state = "torpedo" + meteordrop = null + ismissile = TRUE + dropamt = 0 \ No newline at end of file diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index f0d80ca0a8f..8019d778352 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -45,21 +45,20 @@ for(var/z in affecting_z) SSradiation.z_radiate(locate(1, 1, z), radiation_level, 1) - for(var/mob/living/carbon/C in global.living_mob_list_) - var/area/A = get_area(C) + for(var/mob/living/M in global.living_mob_list_) + var/area/A = get_area(M) if(!A) continue if(A.area_flags & AREA_FLAG_RAD_SHIELDED) continue - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(prob(5 * (1 - H.get_blocked_ratio(null, IRRADIATE, damage_flags = DAM_DISPERSED, armor_pen = radiation_level)))) - if (prob(75)) - randmutb(H) // Applies bad mutation - domutcheck(H,null,MUTCHK_FORCED) - else - randmutg(H) // Applies good mutation - domutcheck(H,null,MUTCHK_FORCED) + if(!M.can_have_genetic_conditions()) + continue + if(prob(5 * (1 - M.get_blocked_ratio(null, IRRADIATE, damage_flags = DAM_DISPERSED, armor_pen = radiation_level)))) + if(prob(75)) + M.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/disability))) + else + M.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/superpower))) + /datum/event/radiation_storm/end() global.using_map.revoke_maint_all_access(1) diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index 472ea942f53..580d8c0a21a 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -1,5 +1,5 @@ /datum/event/spontaneous_appendicitis/start() - for(var/mob/living/carbon/human/H in shuffle(global.living_mob_list_)) + for(var/mob/living/human/H in shuffle(global.living_mob_list_)) if(H.client && H.stat != DEAD) var/obj/item/organ/internal/appendix/A = H.get_organ(BP_APPENDIX, /obj/item/organ/internal/appendix) if(!istype(A) || (A && A.inflamed)) diff --git a/code/modules/fabrication/designs/textile/gimmick.dm b/code/modules/fabrication/designs/textile/gimmick.dm index 4c0fd224276..97f4344e531 100644 --- a/code/modules/fabrication/designs/textile/gimmick.dm +++ b/code/modules/fabrication/designs/textile/gimmick.dm @@ -10,7 +10,7 @@ path = /obj/item/clothing/suit/redtag /datum/fabricator_recipe/textiles/gimmick/mantle - path = /obj/item/clothing/suit/fated + path = /obj/item/clothing/suit/mantle/fated /datum/fabricator_recipe/textiles/gimmick/syndicatefake path = /obj/item/clothing/suit/syndicatefake @@ -111,14 +111,11 @@ /datum/fabricator_recipe/textiles/gimmick/capjacket path = /obj/item/clothing/suit/jacket/captain -/datum/fabricator_recipe/textiles/gimmick/robe - path = /obj/item/clothing/suit/robe - /datum/fabricator_recipe/textiles/gimmick/xeno path = /obj/item/clothing/head/xeno/scarf /datum/fabricator_recipe/textiles/gimmick/syndicatetactical - path = /obj/item/clothing/under/syndicate/tacticool + path = /obj/item/clothing/shirt/syndicate/tacticool /datum/fabricator_recipe/textiles/gimmick/costumesanta path = /obj/item/clothing/suit/santa diff --git a/code/modules/fabrication/designs/textile/job.dm b/code/modules/fabrication/designs/textile/job.dm index 276b59321f6..e0f376636b2 100644 --- a/code/modules/fabrication/designs/textile/job.dm +++ b/code/modules/fabrication/designs/textile/job.dm @@ -108,9 +108,6 @@ /datum/fabricator_recipe/textiles/job/medical/psych path = /obj/item/clothing/jumpsuit/psych -/datum/fabricator_recipe/textiles/job/medical/turtleneck - path = /obj/item/clothing/jumpsuit/psych/turtleneck - // Suits /datum/fabricator_recipe/textiles/job/medical/surgicalapron path = /obj/item/clothing/suit/surgicalapron @@ -163,10 +160,7 @@ path = /obj/item/clothing/jumpsuit/warden /datum/fabricator_recipe/textiles/job/security/dispatch - path = /obj/item/clothing/under/dispatch - -/datum/fabricator_recipe/textiles/job/security/alt - path = /obj/item/clothing/under/security2 + path = /obj/item/clothing/costume/dispatch /datum/fabricator_recipe/textiles/job/security/tacticalofficer path = /obj/item/clothing/jumpsuit/tactical @@ -182,10 +176,10 @@ // Tacticool /datum/fabricator_recipe/textiles/job/security/tactical - path = /obj/item/clothing/under/syndicate + path = /obj/item/clothing/shirt/syndicate /datum/fabricator_recipe/textiles/job/security/syndicatecombat - path = /obj/item/clothing/under/syndicate/combat + path = /obj/item/clothing/shirt/syndicate/combat /datum/fabricator_recipe/textiles/job/security/maskbalatact path = /obj/item/clothing/mask/balaclava/tactical diff --git a/code/modules/fabrication/designs/textile/overwear.dm b/code/modules/fabrication/designs/textile/overwear.dm index 3d6c77b5e43..52218db5138 100644 --- a/code/modules/fabrication/designs/textile/overwear.dm +++ b/code/modules/fabrication/designs/textile/overwear.dm @@ -76,4 +76,7 @@ path = /obj/item/clothing/suit/poncho/engineering /datum/fabricator_recipe/textiles/overwear/poncho9 - path = /obj/item/clothing/suit/poncho/cargo \ No newline at end of file + path = /obj/item/clothing/suit/poncho/cargo + +/datum/fabricator_recipe/textiles/overwear/mantle + path = /obj/item/clothing/suit/mantle diff --git a/code/modules/fabrication/fabricator_bioprinter.dm b/code/modules/fabrication/fabricator_bioprinter.dm index 47c64a567f8..f885dad3c4a 100644 --- a/code/modules/fabrication/fabricator_bioprinter.dm +++ b/code/modules/fabrication/fabricator_bioprinter.dm @@ -9,7 +9,7 @@ base_type = /obj/machinery/fabricator/bioprinter fabricator_class = FABRICATOR_CLASS_MEAT ignore_input_contents_length = TRUE // mostly eats organs, let people quickly dump a torso in there without doing surgery. - var/datum/dna/loaded_dna //DNA for biological organs + var/datum/mob_snapshot/loaded_dna //DNA for biological organs /obj/machinery/fabricator/bioprinter/can_ingest(var/obj/item/thing) . = istype(thing, /obj/item/organ) || istype(thing, /obj/item/chems/food/butchery) || ..() @@ -29,10 +29,10 @@ /obj/machinery/fabricator/bioprinter/do_build(datum/fabricator_build_order/order) . = ..() //Fetch params as they were when the order was passed - var/datum/dna/D = order.get_data("dna") + var/datum/mob_snapshot/D = order.get_data("dna") for(var/obj/item/organ/O in .) if(D) - O.set_dna(D) + O.copy_from_mob_snapshot(D) O.status |= ORGAN_CUT_AWAY /obj/machinery/fabricator/bioprinter/attackby(obj/item/W, mob/user) @@ -42,14 +42,15 @@ var/sample = REAGENT_DATA(S.reagents, /decl/material/liquid/blood) if(islist(sample)) var/weakref/R = sample["donor"] - var/mob/living/carbon/human/H = R.resolve() - if(H && istype(H) && H.species && H.dna) - loaded_dna = H.dna.Clone() - to_chat(user, SPAN_INFO("You inject the blood sample into \the [src].")) - S.remove_any_reagents(BIOPRINTER_BLOOD_SAMPLE_SIZE) - //Tell nano to do its job - SSnano.update_uis(src) - return TRUE + var/mob/living/human/H = R.resolve() + if(H && istype(H) && H.species) + loaded_dna = H.get_mob_snapshot() + if(loaded_dna) + to_chat(user, SPAN_INFO("You inject the blood sample into \the [src].")) + S.remove_any_reagents(BIOPRINTER_BLOOD_SAMPLE_SIZE) + //Tell nano to do its job + SSnano.update_uis(src) + return TRUE to_chat(user, SPAN_WARNING("\The [src] displays an error: no viable blood sample could be obtained from \the [W].")) return TRUE . = ..() @@ -69,8 +70,8 @@ return list( "real_name" = loaded_dna.real_name, "UE" = loaded_dna.unique_enzymes, - "species" = loaded_dna.species, - "btype" = loaded_dna.b_type, + "species" = loaded_dna.root_species.name, + "btype" = loaded_dna.blood_type, ) /obj/machinery/fabricator/bioprinter/ui_draw_config(mob/user, ui_key) diff --git a/code/modules/fabrication/fabricator_intake.dm b/code/modules/fabrication/fabricator_intake.dm index b7e65173c5b..5af01117dbe 100644 --- a/code/modules/fabrication/fabricator_intake.dm +++ b/code/modules/fabrication/fabricator_intake.dm @@ -97,7 +97,7 @@ if(panel_open && (IS_MULTITOOL(O) || IS_WIRECUTTER(O))) attack_hand_with_interaction_checks(user) return TRUE - if((obj_flags & OBJ_FLAG_ANCHORABLE) && IS_WRENCH(O)) + if((obj_flags & OBJ_FLAG_ANCHORABLE) && (IS_WRENCH(O) || IS_HAMMER(O))) return ..() if(stat & (NOPOWER | BROKEN)) return diff --git a/code/modules/fabrication/fabricator_pipe.dm b/code/modules/fabrication/fabricator_pipe.dm index b378f098ba7..92b988cb55a 100644 --- a/code/modules/fabrication/fabricator_pipe.dm +++ b/code/modules/fabrication/fabricator_pipe.dm @@ -19,7 +19,7 @@ return STATUS_CLOSE return ..() -/obj/machinery/fabricator/pipe/wrench_floor_bolts() +/obj/machinery/fabricator/pipe/wrench_floor_bolts(mob/user, delay = 2 SECONDS, obj/item/tool) ..() update_use_power(anchored ? POWER_USE_IDLE : POWER_USE_OFF) diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index cb184834f0d..90dfbe79088 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -293,6 +293,12 @@ if(!new_line || !is_type_in_list(new_line, valid_line_types)) return FALSE + // TODO: better solution for grass vs dried grass + if(istype(new_line, /obj/item/stack/material)) + var/obj/item/stack/material/stack = new_line + if(!stack.special_crafting_check()) + return FALSE + if(!new_line.material?.tensile_strength) to_chat(user, SPAN_WARNING("\The [new_line] isn't suitable for the rigors of fishing.")) return TRUE diff --git a/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm b/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm index 3e27c4b4141..7acab663068 100644 --- a/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm +++ b/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm @@ -89,7 +89,8 @@ update_icon() /obj/item/chems/cooking_vessel/on_reagent_change() - . = ..() + if(!(. = ..())) + return started_cooking = null if(!is_processing) START_PROCESSING(SSobj, src) diff --git a/code/modules/food/plates/plate_tray.dm b/code/modules/food/plates/plate_tray.dm index 3581fb55ba0..c2b507a3296 100644 --- a/code/modules/food/plates/plate_tray.dm +++ b/code/modules/food/plates/plate_tray.dm @@ -39,7 +39,7 @@ . = ..() /obj/item/plate/tray/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) // There is a better way to do this but I'll be damned if I'm the one to fix it. + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) // There is a better way to do this but I'll be damned if I'm the one to fix it. to_chat(user, SPAN_DANGER("You accidentally slam yourself with \the [src]!")) SET_STATUS_MAX(user, STAT_WEAK, 1) user.take_organ_damage(2) diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index 6a4b7b387d5..f326cc6036d 100644 --- a/code/modules/games/boardgame.dm +++ b/code/modules/games/boardgame.dm @@ -92,13 +92,13 @@ else dat+= ">" if(!isobserver(user)) - dat += "" + dat += "" dat += "" dat += "" if(selected >= 0 && !isobserver(user)) - dat += "
    Remove Selected Piece" + dat += "
    Remove Selected Piece" show_browser(user, jointext(dat, null), "window=boardgame;size=430x500") // 50px * 8 squares + 30 margin onclose(usr, "boardgame") @@ -132,7 +132,7 @@ if(I) selected = text2num(s) else - var/mob/living/carbon/human/H = locate(href_list["person"]) + var/mob/living/human/H = locate(href_list["person"]) if(!istype(H)) return var/obj/item/O = H.get_active_held_item() diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index ef99cd2250e..530125d0dec 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -170,7 +170,7 @@ var/global/list/card_decks = list() if(!ishuman(usr) || usr.incapacitated() || !Adjacent(usr)) return - var/mob/living/carbon/human/user = usr + var/mob/living/human/user = usr if(!cards.len) to_chat(usr, "There are no cards in the deck.") return diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm index 73f2aade08a..bc3fbea82fd 100644 --- a/code/modules/ghosttrap/trap.dm +++ b/code/modules/ghosttrap/trap.dm @@ -39,7 +39,7 @@ if(pref_check && !O.client.wishes_to_be_role(pref_check)) continue if(O.client) - to_chat(O, "[request_string] (Occupy) ([ghost_follow_link(target, O)])") + to_chat(O, "[request_string] (Occupy) ([ghost_follow_link(target, O)])") /decl/ghosttrap/proc/unregister_target(var/target) LAZYREMOVE(request_timeouts, target) @@ -186,29 +186,6 @@ /decl/ghosttrap/wizard_familiar/welcome_candidate(var/mob/target) return 0 -/decl/ghosttrap/cult_shade - name = "shade" - ghost_trap_message = "They are occupying a soul stone now." - ban_checks = list(/decl/special_role/cultist, /decl/special_role/godcultist) - pref_check = "ghost_shade" - can_set_own_name = FALSE - -/decl/ghosttrap/cult_shade/welcome_candidate(var/mob/target) - var/obj/item/soulstone/S = target.loc - if(istype(S)) - if(S.is_evil) - var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) - cult.add_antagonist(target.mind) - to_chat(target, "Remember, you serve the one who summoned you first, and the cult second.") - else - to_chat(target, "This soultone has been purified. You do not belong to the cult.") - to_chat(target, "Remember, you only serve the one who summoned you.") - -/decl/ghosttrap/cult_shade/forced(var/mob/user) - var/obj/item/soulstone/stone = new(get_turf(user)) - stone.shade = new(stone) - request_player(stone.shade, "The soul stone shade summon ritual has been performed. ") - // Stub PAI ghost trap so that PAI shows up in the ghost role list. // Actually invoking this ghost trap as normal will not do anything. /decl/ghosttrap/personal_ai diff --git a/code/modules/goals/_goal.dm b/code/modules/goals/_goal.dm index fbcf0e55f67..b36b7b50a40 100644 --- a/code/modules/goals/_goal.dm +++ b/code/modules/goals/_goal.dm @@ -28,8 +28,8 @@ if(show_success) . += get_success_string() if(allow_modification) - if(can_abandon) . += " (Abandon)" - if(can_reroll) . += " (Reroll)" + if(can_abandon) . += " (Abandon)" + if(can_reroll) . += " (Reroll)" /datum/goal/proc/get_success_string() return check_success() ? " Success!" : " Failure." diff --git a/code/modules/goals/goal_mind.dm b/code/modules/goals/goal_mind.dm index be8d7c7915d..2a34d31f176 100644 --- a/code/modules/goals/goal_mind.dm +++ b/code/modules/goals/goal_mind.dm @@ -31,7 +31,7 @@ if(job && LAZYLEN(job.possible_goals)) available_goals |= job.possible_goals if(ishuman(current)) - var/mob/living/carbon/human/H = current + var/mob/living/human/H = current for(var/token in H.cultural_info) var/decl/cultural_info/culture = H.get_cultural_value(token) var/list/new_goals = culture.get_possible_personal_goals(job ? job.department_types : null) diff --git a/code/modules/goals/goal_mob.dm b/code/modules/goals/goal_mob.dm index a2230468245..ddd87767c25 100644 --- a/code/modules/goals/goal_mob.dm +++ b/code/modules/goals/goal_mob.dm @@ -30,8 +30,8 @@ else to_chat(src, SPAN_NOTICE("You have no personal goals this round.")) if(allow_modification && LAZYLEN(mind.goals) < 5) - to_chat(src, SPAN_NOTICE("Add Random Goal")) - + to_chat(src, SPAN_NOTICE("Add Random Goal")) + for(var/dept_key in mind.assigned_job?.department_types) var/decl/department/dept = SSjobs.get_department_by_type(dept_key) if(dept) diff --git a/code/modules/hallucinations/hallucination_telepathy.dm b/code/modules/hallucinations/hallucination_telepathy.dm index 36a982c5a36..a4a409f52e9 100644 --- a/code/modules/hallucinations/hallucination_telepathy.dm +++ b/code/modules/hallucinations/hallucination_telepathy.dm @@ -6,19 +6,19 @@ /datum/hallucination/telepathy/start() . = ..() to_chat(holder, SPAN_NOTICE("You expand your mind outwards.")) - holder.verbs += /mob/living/carbon/human/proc/fakeremotesay + holder.verbs += /mob/living/human/proc/fakeremotesay /datum/hallucination/telepathy/end() . = ..() if(holder) - holder.verbs -= /mob/living/carbon/human/proc/fakeremotesay + holder.verbs -= /mob/living/human/proc/fakeremotesay -/mob/living/carbon/human/proc/fakeremotesay() +/mob/living/human/proc/fakeremotesay() set name = "Telepathic Message" set category = "Superpower" if(!hallucination_power) - src.verbs -= /mob/living/carbon/human/proc/fakeremotesay + src.verbs -= /mob/living/human/proc/fakeremotesay return if(stat) @@ -29,8 +29,8 @@ to_chat(usr, SPAN_WARNING("Chemicals in your blood prevent you from using your power!")) var/list/creatures = list() - for(var/mob/living/carbon/C in SSmobs.mob_list) - creatures += C + for(var/mob/living/creature in SSmobs.mob_list) + creatures += creature creatures -= usr var/mob/target = input("Who do you want to project your mind to?") as null|anything in creatures if (isnull(target)) diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index e044274ad46..3d408b7e821 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -41,9 +41,9 @@ dat += "Holodeck Control System
    " if(!islocked) - dat += "Holodeck is (UNLOCKED)
    " + dat += "Holodeck is (UNLOCKED)
    " else - dat += "Holodeck is (LOCKED)
    " + dat += "Holodeck is (LOCKED)
    " show_browser(user, dat, "window=computer;size=400x500") onclose(user, "computer") return @@ -63,10 +63,10 @@ return for(var/prog in supported_programs) - dat += "([prog])
    " + dat += "([prog])
    " dat += "
    " - dat += "(Turn Off)
    " + dat += "(Turn Off)
    " dat += "
    " dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
    " @@ -77,15 +77,15 @@ if (emagged) dat += "ERROR: Cannot re-enable Safety Protocols.
    " else - dat += "(Re-Enable Safety Protocols?)
    " + dat += "(Re-Enable Safety Protocols?)
    " else - dat += "(Override Safety Protocols?)
    " + dat += "(Override Safety Protocols?)
    " dat += "
    " if(safety_disabled) for(var/prog in restricted_programs) - dat += "(Begin [prog])
    " + dat += "(Begin [prog])
    " dat += "Ensure the holodeck is empty before testing.
    " dat += "
    " dat += "Safety Protocols are DISABLED
    " @@ -93,9 +93,9 @@ dat += "Safety Protocols are ENABLED
    " if(linkedholodeck.has_gravity) - dat += "Gravity is (ON)
    " + dat += "Gravity is (ON)
    " else - dat += "Gravity is (OFF)
    " + dat += "Gravity is (OFF)
    " show_browser(user, dat, "window=computer;size=400x500") onclose(user, "computer") return diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 7a2c09d690c..36e96954952 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -330,7 +330,7 @@ var/global/list/_wood_materials = list( if(!seed) return if(seed.get_trait(TRAIT_STINGS)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(istype(H) && H.get_equipped_item(slot_gloves_str)) return if(!reagents || reagents.total_volume <= 0) diff --git a/code/modules/hydroponics/plant_types/seeds_misc.dm b/code/modules/hydroponics/plant_types/seeds_misc.dm index 5865d2f5d9e..2bf620737ec 100644 --- a/code/modules/hydroponics/plant_types/seeds_misc.dm +++ b/code/modules/hydroponics/plant_types/seeds_misc.dm @@ -1470,7 +1470,7 @@ set_trait(TRAIT_MATURATION,6) set_trait(TRAIT_PRODUCTION,6) set_trait(TRAIT_YIELD,5) - set_trait(TRAIT_PRODUCT_ICON,"grapes") + set_trait(TRAIT_PRODUCT_ICON,"treefruit") set_trait(TRAIT_PRODUCT_COLOUR,"#a80000") set_trait(TRAIT_PLANT_COLOUR,"#749733") set_trait(TRAIT_PLANT_ICON,"vine2") diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 549a6948a70..c114d6ca4d9 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -107,7 +107,7 @@ qdel(R) // Does brute damage to a target. -/datum/seed/proc/do_thorns(var/mob/living/carbon/human/target, var/obj/item/fruit, var/target_limb) +/datum/seed/proc/do_thorns(var/mob/living/human/target, var/obj/item/fruit, var/target_limb) if(!get_trait(TRAIT_CARNIVOROUS)) return @@ -147,7 +147,7 @@ target.apply_damage(damage, BRUTE, target_limb, damage_flags, used_weapon = "Thorns") // Adds reagents to a target. -/datum/seed/proc/do_sting(var/mob/living/carbon/human/target, var/obj/item/fruit) +/datum/seed/proc/do_sting(var/mob/living/human/target, var/obj/item/fruit) if(!get_trait(TRAIT_STINGS)) return @@ -583,7 +583,7 @@ update_growth_stages() //Place the plant products at the feet of the user. -/datum/seed/proc/harvest(var/mob/user,var/yield_mod,var/harvest_sample,var/force_amount) +/datum/seed/proc/harvest(var/mob/user, var/yield_mod, var/harvest_sample, var/force_amount) if(!user) return FALSE diff --git a/code/modules/hydroponics/seed_appearance.dm b/code/modules/hydroponics/seed_appearance.dm index 4db240a4796..97350040b7b 100644 --- a/code/modules/hydroponics/seed_appearance.dm +++ b/code/modules/hydroponics/seed_appearance.dm @@ -16,18 +16,19 @@ if(SSplants.plant_icon_cache[ikey]) dead_overlay = SSplants.plant_icon_cache[ikey] else - dead_overlay = image('icons/obj/hydroponics/hydroponics_growing.dmi', "[ikey]") + dead_overlay = image('icons/obj/hydroponics/hydroponics_growing.dmi', ikey) dead_overlay.color = DEAD_PLANT_COLOUR SSplants.plant_icon_cache[ikey] = dead_overlay return dead_overlay /datum/seed/proc/get_harvest_appearance() if(!harvest_overlay) - var/ikey = "product-[get_trait(TRAIT_PRODUCT_ICON)]-[get_trait(TRAIT_PLANT_COLOUR)]" + var/icon_state = get_trait(TRAIT_PRODUCT_ICON) + var/ikey = "product-[icon_state]-[get_trait(TRAIT_PLANT_COLOUR)]" if(SSplants.plant_icon_cache[ikey]) harvest_overlay = SSplants.plant_icon_cache[ikey] else - harvest_overlay = image('icons/obj/hydroponics/hydroponics_products.dmi', "[ikey]") + harvest_overlay = image('icons/obj/hydroponics/hydroponics_products.dmi', icon_state) harvest_overlay.color = get_trait(TRAIT_PRODUCT_COLOUR) SSplants.plant_icon_cache[ikey] = harvest_overlay return harvest_overlay diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index 4993c7cfd88..d821135f6b5 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -367,3 +367,18 @@ /obj/item/seeds/extracted/foxglove seed = "foxglove" + +/obj/item/seeds/extracted/cabbage + seed = "cabbage" + +/obj/item/seeds/extracted/carrot + seed = "carrot" + +/obj/item/seeds/extracted/potato + seed = "potato" + +/obj/item/seeds/extracted/wheat + seed = "wheat" + +/obj/item/seeds/extracted/rice + seed = "rice" diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 42078ffb24a..ad697eec832 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -275,17 +275,17 @@ expected_target_type = /obj/effect/vine /decl/interaction_handler/vine_chop/invoked(atom/target, mob/user, obj/item/prop) - var/obj/effect/vine/V = target - var/obj/item/W = user.get_active_held_item() - if(!istype(W) || !W.edge || W.w_class < ITEM_SIZE_NORMAL) + var/obj/effect/vine/vine = target + var/obj/item/holding = user.get_active_held_item() + if(!istype(holding) || !holding.edge || holding.w_class < ITEM_SIZE_NORMAL) to_chat(user, SPAN_WARNING("You need a larger or sharper object for this task!")) return - user.visible_message(SPAN_NOTICE("\The [user] starts chopping down \the [V].")) - playsound(get_turf(V), W.hitsound, 100, 1) - var/chop_time = (V.current_health/W.force) * 0.5 SECONDS + user.visible_message(SPAN_NOTICE("\The [user] starts chopping down \the [vine].")) + playsound(get_turf(vine), holding.hitsound, 100, 1) + var/chop_time = (vine.current_health/holding.force) * 0.5 SECONDS if(user.skill_check(SKILL_BOTANY, SKILL_ADEPT)) chop_time *= 0.5 - if(do_after(user, chop_time, V, TRUE)) - user.visible_message(SPAN_NOTICE("[user] chops down \the [V].")) - playsound(get_turf(V), W.hitsound, 100, 1) - V.die_off() + if(do_after(user, chop_time, vine, TRUE)) + user.visible_message(SPAN_NOTICE("[user] chops down \the [vine].")) + playsound(get_turf(vine), holding.hitsound, 100, 1) + vine.die_off() diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index e7ef9f180df..5848a943ac7 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -31,7 +31,7 @@ return if(prob((seed.get_trait(TRAIT_POTENCY) / 2) * 3)) entangle(victim) - var/mob/living/carbon/human/H = victim + var/mob/living/human/H = victim if(istype(H) && H.get_equipped_item(slot_shoes_str)) return seed.do_thorns(victim,src) @@ -74,7 +74,7 @@ return if(ishuman(victim)) - var/mob/living/carbon/human/H = victim + var/mob/living/human/H = victim if(H.species.species_flags & SPECIES_FLAG_NO_TANGLE) return diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 9986843208a..c43a5f49272 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -260,7 +260,7 @@ check_plant_health() //Harvests the product of a plant. -/obj/machinery/portable_atmospherics/hydroponics/proc/harvest(var/mob/user) +/obj/machinery/portable_atmospherics/hydroponics/proc/harvest(mob/user) //Harvest the product of the plant, if(!seed || !harvest) diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm index ec1eec2a61e..64a48f1df5c 100644 --- a/code/modules/hydroponics/trays/tray_soil.dm +++ b/code/modules/hydroponics/trays/tray_soil.dm @@ -166,7 +166,7 @@ ..() qdel(src) -/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/harvest() +/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/harvest(mob/user) ..() if(!seed) // Repeat harvests are a thing. qdel(src) diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 4b5e96c5b0a..7d6b5e8f50c 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -60,7 +60,7 @@ to_chat(user, "Its got a few dents in it.") if((isobserver(user) && ckeys_allowed_to_scan[user.ckey]) || check_rights(R_ADMIN, 0, user)) - to_chat(user, "You can scan this circuit."); + to_chat(user, "You can scan this circuit."); /obj/item/electronic_assembly/check_health(lastdamage, lastdamtype, lastdamflags, consumed) if(!can_take_damage()) @@ -136,7 +136,7 @@ /obj/item/electronic_assembly/proc/closed_interact(mob/user) var/HTML = list() HTML += "[src.name]" - HTML += "
    \[Refresh\]" + HTML += "
    \[Refresh\]" HTML += "

    " var/listed_components = FALSE @@ -150,7 +150,7 @@ for(var/entry in topic_data) var/href = topic_data[entry] if(href) - HTML += "[entry]" + HTML += "[entry]" else HTML += entry HTML += "
    " @@ -170,11 +170,11 @@ HTML += "[name]" - HTML += "\[Refresh\] | \[Rename\]
    " + HTML += "\[Refresh\] | \[Rename\]
    " HTML += "[total_part_size]/[max_components] space taken up in the assembly.
    " HTML += "[total_complexity]/[max_complexity] complexity in the assembly.
    " if(battery) - HTML += "[round(battery.charge, 0.1)]/[battery.maxcharge] ([round(battery.percent(), 0.1)]%) cell charge. \[Remove\]" + HTML += "[round(battery.charge, 0.1)]/[battery.maxcharge] ([round(battery.percent(), 0.1)]%) cell charge. \[Remove\]" else HTML += "No power cell detected!" @@ -185,13 +185,13 @@ var/start_index = ((components_per_page * interact_page) + 1) for(var/i = start_index to min(length(assembly_components), start_index + (components_per_page - 1))) var/obj/item/integrated_circuit/circuit = assembly_components[i] - HTML += "\[ [i] \] | " - HTML += "\[R\] | " + HTML += "\[ [i] \] | " + HTML += "\[R\] | " if(circuit.removable) - HTML += "\[-\] | " + HTML += "\[-\] | " else HTML += "\[-\] | " - HTML += "[circuit.displayed_name]" + HTML += "[circuit.displayed_name]" HTML += "
    " if(length(assembly_components) > components_per_page) @@ -200,7 +200,7 @@ if((i-1) == interact_page) HTML += " [i]" else - HTML += " [i]" + HTML += " [i]" HTML += " \]" HTML += "" diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index 54d278494b5..f60872d9179 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -141,13 +141,13 @@ a creative player the means to solve many problems. Circuits are held inside an HTML += "" if(assembly) - HTML += "\[Return to Assembly\]
    " + HTML += "\[Return to Assembly\]
    " - HTML += "\[Refresh\] | " - HTML += "\[Rename\] | " - HTML += "\[Copy Ref\]" + HTML += "\[Refresh\] | " + HTML += "\[Rename\] | " + HTML += "\[Copy Ref\]" if(assembly && removable) - HTML += " | \[Remove\]" + HTML += " | \[Remove\]" HTML += "
    " HTML += "" @@ -169,13 +169,13 @@ a creative player the means to solve many problems. Circuits are held inside an if(1) io = get_pin_ref(IC_INPUT, i) if(io) - words += "[io.display_pin_type()] [io.name] \ - [io.display_data(io.data)]
    " + words += "[io.display_pin_type()] [io.name] \ + [io.display_data(io.data)]
    " if(io.linked.len) for(var/k in 1 to io.linked.len) var/datum/integrated_io/linked = io.linked[k] - words += "[linked] \ - @ [linked.holder.displayed_name]
    " + words += "[linked] \ + @ [linked.holder.displayed_name]
    " if(LAZYLEN(outputs) > LAZYLEN(inputs)) height = 1 @@ -188,13 +188,13 @@ a creative player the means to solve many problems. Circuits are held inside an if(3) io = get_pin_ref(IC_OUTPUT, i) if(io) - words += "[io.display_pin_type()] [io.name] \ - [io.display_data(io.data)]
    " + words += "[io.display_pin_type()] [io.name] \ + [io.display_data(io.data)]
    " if(io.linked.len) for(var/k in 1 to io.linked.len) var/datum/integrated_io/linked = io.linked[k] - words += "[linked] \ - @ [linked.holder.displayed_name]
    " + words += "[linked] \ + @ [linked.holder.displayed_name]
    " if(LAZYLEN(inputs) > LAZYLEN(outputs)) height = 1 @@ -205,13 +205,13 @@ a creative player the means to solve many problems. Circuits are held inside an var/datum/integrated_io/io = activators[i] var/words = list() - words += "[io] " - words += "[io.data?"\":"\"]
    " + words += "[io] " + words += "[io.data?"\":"\"]
    " if(io.linked.len) for(var/k in 1 to io.linked.len) var/datum/integrated_io/linked = io.linked[k] - words += "[linked] \ - @ [linked.holder.displayed_name]
    " + words += "[linked] \ + @ [linked.holder.displayed_name]
    " HTML += "" HTML += "" diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index 8a33268251d..71b69011ced 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -167,21 +167,21 @@ if((can_clone && get_config_value(/decl/config/toggle/on/allow_ic_printing)) || debug) HTML += "Here you can load script for your assembly.
    " if(!cloning) - HTML += " {Load Program} " + HTML += " {Load Program} " else HTML += " {Load Program}" if(!program) HTML += " {[fast_clone ? "Print" : "Begin Printing"] Assembly}" else if(cloning) - HTML += " {Cancel Print}" + HTML += " {Cancel Print}" else - HTML += " {[fast_clone ? "Print" : "Begin Printing"] Assembly}" + HTML += " {[fast_clone ? "Print" : "Begin Printing"] Assembly}" HTML += "

    " HTML += "Categories:" for(var/category in SScircuit.circuit_fabricator_recipe_list) if(category != current_category) - HTML += " \[[category]\] " + HTML += " \[[category]\] " else // Bold the button if it's already selected. HTML += " \[[category]\] " HTML += "
    " @@ -196,7 +196,7 @@ if((initial(IC.spawn_flags) & IC_SPAWN_RESEARCH) && (!(initial(IC.spawn_flags) & IC_SPAWN_DEFAULT)) && !upgraded) can_build = FALSE if(can_build) - HTML += "\[[initial(O.name)]\]: [initial(O.desc)]
    " + HTML += "\[[initial(O.name)]\]: [initial(O.desc)]
    " else HTML += "\[[initial(O.name)]\]: [initial(O.desc)]
    " diff --git a/code/modules/integrated_electronics/core/special_pins/list_pin.dm b/code/modules/integrated_electronics/core/special_pins/list_pin.dm index 23999d250be..60f7561e46e 100644 --- a/code/modules/integrated_electronics/core/special_pins/list_pin.dm +++ b/code/modules/integrated_electronics/core/special_pins/list_pin.dm @@ -10,19 +10,19 @@ var/list/my_list = data var/t = "

    [src]


    " t += "List length: [my_list.len]
    " - t += "\[Refresh\] | " - t += "\[Add\] | " - t += "\[Remove\] | " - t += "\[Edit\] | " - t += "\[Swap\] | " - t += "\[Clear\]
    " + t += "\[Refresh\] | " + t += "\[Add\] | " + t += "\[Remove\] | " + t += "\[Edit\] | " + t += "\[Swap\] | " + t += "\[Clear\]
    " t += "
    " var/i = 0 for(var/line in my_list) i++ t += "#[i] | [display_data(line)] | " - t += "\[Edit\] | " - t += "\[Remove\]
    " + t += "\[Edit\] | " + t += "\[Remove\]
    " show_browser(user, t, "window=list_pin_\ref[src];size=500x400") /datum/integrated_io/lists/proc/add_to_list(mob/user, var/new_entry) diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index 2e26743389d..8a5e9a6ccbe 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -120,7 +120,8 @@ ..() /obj/item/integrated_circuit/passive/power/chemical_cell/on_reagent_change(changetype) - ..() + if(!(. = ..())) + return set_pin_data(IC_OUTPUT, 1, reagents?.total_volume || 0) push_data() diff --git a/code/modules/integrated_electronics/subtypes/filter.dm b/code/modules/integrated_electronics/subtypes/filter.dm index f1626432967..781bb23ca3d 100644 --- a/code/modules/integrated_electronics/subtypes/filter.dm +++ b/code/modules/integrated_electronics/subtypes/filter.dm @@ -47,7 +47,7 @@ name = "humanoid filter" desc = "Only allow refs belonging to humanoids (dead or alive) through" icon_state = "filter_humanoid" - filter_type = /mob/living/carbon/human + filter_type = /mob/living/human /obj/item/integrated_circuit/filter/ref/obj name = "object filter" diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 141860d1da4..aeff7927052 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -140,7 +140,7 @@ power_draw_per_use = 40 /obj/item/integrated_circuit/input/med_scanner/do_work() - var/mob/living/carbon/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living) + var/mob/living/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living) if(!istype(H)) //Invalid input return if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range. @@ -192,7 +192,7 @@ /obj/item/integrated_circuit/input/adv_med_scanner/do_work() - var/mob/living/carbon/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living) + var/mob/living/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living) if(!istype(H)) //Invalid input return if(H in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 085a2ebe47f..5ee4be4e792 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -50,8 +50,8 @@ var/notified = FALSE /obj/item/integrated_circuit/reagent/on_reagent_change() - ..() - push_vol() + if((. = ..())) + push_vol() /obj/item/integrated_circuit/reagent/smoke/do_work(ord) switch(ord) @@ -150,16 +150,16 @@ /obj/item/integrated_circuit/reagent/injector/proc/draw_after(var/weakref/target, var/amount) busy = FALSE - var/mob/living/carbon/C = target_nearby(target) - if(!C) + var/mob/living/target_living = target_nearby(target) + if(!target_living) activate_pin(3) return var/atom/movable/acting_object = get_object() - C.visible_message("\The [acting_object] draws blood from \the [C]", + target_living.visible_message("\The [acting_object] draws blood from \the [target_living]", "\The [acting_object] draws blood from you." ) - C.take_blood(src, amount) + target_living.take_blood(src, amount) activate_pin(2) @@ -214,12 +214,12 @@ var/tramount = abs(transfer_amount) if(ishuman(AM)) - var/mob/living/carbon/human/H = AM + var/mob/living/human/H = AM var/injection_status = H.can_inject(null, BP_CHEST) var/injection_delay = 3 SECONDS if(injection_status == INJECTION_PORT) injection_delay += INJECTION_PORT_DELAY - if(!H.dna || !injection_status) + if(!H.vessel?.total_volume || !injection_status) activate_pin(3) return H.visible_message( diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm index 6fe32e00f0e..aaed1a9fbe1 100644 --- a/code/modules/keybindings/bindings_atom.dm +++ b/code/modules/keybindings/bindings_atom.dm @@ -15,7 +15,7 @@ if((movement_dir & EAST) && (movement_dir & WEST)) movement_dir &= ~(EAST|WEST) - if(!get_config_value(/decl/config/toggle/allow_diagonal_movement)) + if(!get_config_value(/decl/config/toggle/on/allow_diagonal_movement)) if(movement_dir & user.last_move_dir_pressed) movement_dir = user.last_move_dir_pressed else diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index fb56abe3346..cafe738137b 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -37,7 +37,7 @@ if(!(next_move_dir_sub & movement)) next_move_dir_add |= movement - if(movement && !get_config_value(/decl/config/toggle/allow_diagonal_movement)) + if(movement && !get_config_value(/decl/config/toggle/on/allow_diagonal_movement)) last_move_dir_pressed = movement // Client-level keybindings are ones anyone should be able to do at any time diff --git a/code/modules/keybindings/human.dm b/code/modules/keybindings/human.dm index aaff20decab..c93ddcc13cf 100644 --- a/code/modules/keybindings/human.dm +++ b/code/modules/keybindings/human.dm @@ -11,7 +11,7 @@ description = "Quickly puts an item in the best slot available" /datum/keybinding/human/quick_equip/down(client/user) - var/mob/living/carbon/human/H = user.mob + var/mob/living/human/H = user.mob H.quick_equip() return TRUE @@ -22,7 +22,7 @@ description = "Draw or holster weapon" /datum/keybinding/human/holster/down(client/user) - var/mob/living/carbon/human/H = user.mob + var/mob/living/human/H = user.mob if(H.incapacitated()) return @@ -61,6 +61,6 @@ description = "Give the item you're currently holding" /datum/keybinding/human/give/down(client/user) - var/mob/living/carbon/human/H = user.mob + var/mob/living/human/H = user.mob H.give() return TRUE diff --git a/code/modules/materials/_material_stack.dm b/code/modules/materials/_material_stack.dm index 763f81ac7e0..4ea3840e334 100644 --- a/code/modules/materials/_material_stack.dm +++ b/code/modules/materials/_material_stack.dm @@ -63,6 +63,9 @@ LAZYSET(matter, reinf_material.type, MATTER_AMOUNT_REINFORCEMENT) // No matter_multiplier as this is applied in parent. ..() +/obj/item/stack/material/proc/special_crafting_check() + return TRUE + /obj/item/stack/material/proc/update_strings() var/prefix_name = name_modifier ? "[name_modifier] " : "" if(amount>1) diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 7e32fd8fa0b..79ffebfee71 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -635,23 +635,22 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) /decl/material/proc/on_leaving_metabolism(datum/reagents/metabolism/holder) return -#define ACID_MELT_DOSE 10 /decl/material/proc/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) // Acid melting, cleaner cleaning, etc if(solvent_power >= MAT_SOLVENT_MILD) if(istype(O, /obj/item/paper)) var/obj/item/paper/paperaffected = O paperaffected.clearpaper() - to_chat(usr, SPAN_NOTICE("The solution dissolves the ink on the paper.")) - else if(istype(O, /obj/item/book) && REAGENT_VOLUME(holder, type) >= 5) - if(istype(O, /obj/item/book/tome)) - to_chat(usr, SPAN_WARNING("The solution does nothing. Whatever this is, it isn't normal ink.")) - else - var/obj/item/book/affectedbook = O + O.visible_message(SPAN_NOTICE("The solution dissolves the ink on the paper."), range = 1) + else if(istype(O, /obj/item/book) && amount >= 5) + var/obj/item/book/affectedbook = O + if(affectedbook.can_dissolve_text) affectedbook.dat = null - to_chat(usr, SPAN_NOTICE("The solution dissolves the ink on the book.")) + O.visible_message(SPAN_NOTICE("The solution dissolves the ink on the book."), range = 1) + else + O.visible_message(SPAN_WARNING("The solution does nothing. Whatever this is, it isn't normal ink."), range = 1) - if(solvent_power >= MAT_SOLVENT_STRONG && O.solvent_can_melt(solvent_power) && (istype(O, /obj/item) || istype(O, /obj/effect/vine)) && (REAGENT_VOLUME(holder, type) > solvent_melt_dose)) + if(solvent_power >= MAT_SOLVENT_STRONG && O.solvent_can_melt(solvent_power) && (istype(O, /obj/item) || istype(O, /obj/effect/vine)) && (amount > solvent_melt_dose)) O.visible_message(SPAN_DANGER("\The [O] dissolves!")) O.handle_melting() holder?.remove_reagent(type, solvent_melt_dose) @@ -664,7 +663,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(I.contaminated) I.decontaminate() if(dirtiness <= DIRTINESS_STERILE) - O.germ_level -= min(REAGENT_VOLUME(holder, type)*20, O.germ_level) + O.germ_level -= min(amount*20, O.germ_level) O.was_bloodied = null if(dirtiness <= DIRTINESS_CLEAN) O.clean() @@ -770,7 +769,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(toxicity_targets_organ && ishuman(M)) var/organ_damage = dam * M.get_toxin_resistance() if(organ_damage > 0) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/organ/internal/I = GET_INTERNAL_ORGAN(H, toxicity_targets_organ) if(I) var/can_damage = I.max_damage - I.damage @@ -845,7 +844,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(mask) mask.clean() if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/head = H.get_equipped_item(slot_head_str) if(head) head.clean() diff --git a/code/modules/materials/definitions/gasses/material_gas_mundane.dm b/code/modules/materials/definitions/gasses/material_gas_mundane.dm index 8fe49127ea0..e5bc8c5abfe 100644 --- a/code/modules/materials/definitions/gasses/material_gas_mundane.dm +++ b/code/modules/materials/definitions/gasses/material_gas_mundane.dm @@ -63,7 +63,7 @@ var/warning_message var/warning_prob = 10 var/dosage = LAZYACCESS(M.chem_doses, type) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(dosage >= 3) warning_message = pick("extremely dizzy","short of breath","faint","confused") warning_prob = 15 @@ -107,7 +107,7 @@ . = ..() if(!ishuman(M)) return - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M for(var/obj/item/organ/external/E in H.get_external_organs()) for(var/obj/effect/spider/spider in E.implants) if(prob(25)) diff --git a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm index 57a75acba9b..9b783888447 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm @@ -121,7 +121,7 @@ /decl/material/liquid/heartstopper/affect_overdose(mob/living/M, total_dose) ..() if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.stat != UNCONSCIOUS) if(H.ticks_since_last_successful_breath >= 10) H.ticks_since_last_successful_breath = max(10, H.ticks_since_last_successful_breath-10) @@ -257,7 +257,7 @@ /decl/material/liquid/zombie/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if (ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/true_dose = LAZYACCESS(H.chem_doses, type) + REAGENT_VOLUME(holder, type) if (true_dose >= amount_to_zombify) H.zombify() diff --git a/code/modules/materials/definitions/liquids/materials_liquid_water.dm b/code/modules/materials/definitions/liquids/materials_liquid_water.dm index d45b14c9048..90ad34af075 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_water.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_water.dm @@ -34,22 +34,11 @@ ..() if(ishuman(M)) var/list/data = REAGENT_DATA(holder, type) - if(data && data["holy"]) - if(iscultist(M)) - if(prob(10)) - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.offer_uncult(M) - if(prob(2)) - var/obj/effect/spider/spiderling/S = new /obj/effect/spider/spiderling(M.loc) - M.visible_message("\The [M] coughs up \the [S]!") - else - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - if(M.mind && godcult.is_antagonist(M.mind)) - if(REAGENT_VOLUME(holder, type) > 5) - M.take_damage(5, PAIN, do_update_health = FALSE) - M.take_damage(1) - if(prob(10)) //Only annoy them a /bit/ - to_chat(M,"You feel your insides curdle and burn! \[Give Into Purity\]") + if(data?["holy"]) + affect_holy(M, removed, holder) + +/decl/material/liquid/water/proc/affect_holy(mob/living/M, removed, datum/reagents/holder) + return FALSE /decl/material/liquid/water/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() diff --git a/code/modules/materials/definitions/solids/materials_solid_metal.dm b/code/modules/materials/definitions/solids/materials_solid_metal.dm index 4cc9f5d75b5..2c041aa6fe0 100644 --- a/code/modules/materials/definitions/solids/materials_solid_metal.dm +++ b/code/modules/materials/definitions/solids/materials_solid_metal.dm @@ -386,7 +386,7 @@ ferrous = TRUE /decl/material/solid/metal/iron/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.add_chemical_effect(CE_BLOODRESTORE, 8 * removed) diff --git a/code/modules/materials/definitions/solids/materials_solid_stone.dm b/code/modules/materials/definitions/solids/materials_solid_stone.dm index 0838a33c616..4f91cdbb4ea 100644 --- a/code/modules/materials/definitions/solids/materials_solid_stone.dm +++ b/code/modules/materials/definitions/solids/materials_solid_stone.dm @@ -115,24 +115,3 @@ /decl/material/solid/stone/concrete/get_wall_texture() return texture - -/decl/material/solid/stone/cult - name = "disturbing stone" - uid = "solid_stone_cult" - icon_base = 'icons/turf/walls/cult.dmi' - icon_reinf = 'icons/turf/walls/reinforced_cult.dmi' - color = "#402821" - shard_type = SHARD_STONE_PIECE - conductive = 0 - construction_difficulty = MAT_VALUE_NORMAL_DIY - hidden_from_codex = TRUE - reflectiveness = MAT_VALUE_DULL - exoplanet_rarity_plant = MAT_RARITY_NOWHERE - exoplanet_rarity_gas = MAT_RARITY_NOWHERE - -/decl/material/solid/stone/cult/place_dismantled_girder(var/turf/target) - return list(new /obj/structure/girder/cult(target)) - -/decl/material/solid/stone/cult/reinforced - name = "runic inscriptions" - uid = "solid_runes_cult" diff --git a/code/modules/materials/material_sheets_mapping.dm b/code/modules/materials/material_sheets_mapping.dm index 272cf4a0882..9221f0959ae 100644 --- a/code/modules/materials/material_sheets_mapping.dm +++ b/code/modules/materials/material_sheets_mapping.dm @@ -79,7 +79,7 @@ STACK_SUBTYPES(yew, "yew", solid/organic/wo STACK_SUBTYPES(cardboard, "cardboard", solid/organic/cardboard, cardstock, null) STACK_SUBTYPES(leather, "leather", solid/organic/leather, skin, null) STACK_SUBTYPES(synthleather, "synthleather", solid/organic/leather/synth, skin, null) -STACK_SUBTYPES(bone, "bone", solid/organic/bone, bone, null) +STACK_SUBTYPES(bone, "bone", solid/organic/bone, bone, null) STACK_SUBTYPES(glass, "glass", solid/glass, pane, null) STACK_SUBTYPES(borosilicate, "borosilicate glass", solid/glass/borosilicate, pane, null) STACK_SUBTYPES(aliumium, "aliumium", solid/metal/aliumium, cubes, null) diff --git a/code/modules/materials/material_stack_misc.dm b/code/modules/materials/material_stack_misc.dm index 0d263397283..6ac557a3969 100644 --- a/code/modules/materials/material_stack_misc.dm +++ b/code/modules/materials/material_stack_misc.dm @@ -141,6 +141,10 @@ craft_verb = "weave" craft_verbing = "weaving" +// Hacky fix for grass crafting. +/obj/item/stack/material/bundle/special_crafting_check() + return !dried_type || drying_wetness <= 0 + /obj/item/stack/material/strut name = "struts" singular_name = "strut" diff --git a/code/modules/materials/materials_ore.dm b/code/modules/materials/materials_ore.dm index 11a18c4ae33..b2eb776014b 100644 --- a/code/modules/materials/materials_ore.dm +++ b/code/modules/materials/materials_ore.dm @@ -110,7 +110,7 @@ /obj/item/stack/material/ore/throw_impact(atom/hit_atom) . = ..() if(icon_state == "dust") - var/mob/living/carbon/human/H = hit_atom + var/mob/living/human/H = hit_atom if(istype(H) && H.check_has_eyes() && prob(85)) to_chat(H, SPAN_DANGER("Some of \the [src] gets in your eyes!")) ADJ_STATUS(H, STAT_BLIND, 5) diff --git a/code/modules/mechs/equipment/combat.dm b/code/modules/mechs/equipment/combat.dm index 9a646515d03..c9792e5ef10 100644 --- a/code/modules/mechs/equipment/combat.dm +++ b/code/modules/mechs/equipment/combat.dm @@ -478,8 +478,8 @@ flash_time /= 2 if(ishuman(O)) - var/mob/living/carbon/human/H = O - flash_time = round(H.getFlashMod() * flash_time) + var/mob/living/human/H = O + flash_time = round(H.get_flash_mod() * flash_time) if(flash_time <= 0) return @@ -524,8 +524,8 @@ flash_time /= 2 if(ishuman(O)) - var/mob/living/carbon/human/H = O - flash_time = round(H.getFlashMod() * flash_time) + var/mob/living/human/H = O + flash_time = round(H.get_flash_mod() * flash_time) if(flash_time <= 0) return diff --git a/code/modules/mechs/equipment/combat_projectile.dm b/code/modules/mechs/equipment/combat_projectile.dm index 040ff1497f1..05e608852f3 100644 --- a/code/modules/mechs/equipment/combat_projectile.dm +++ b/code/modules/mechs/equipment/combat_projectile.dm @@ -17,11 +17,11 @@ /obj/item/gun/projectile/automatic/get_hardpoint_status_value() if(!isnull(ammo_magazine)) - return ammo_magazine.stored_ammo.len + return ammo_magazine.get_stored_ammo_count() /obj/item/gun/projectile/automatic/get_hardpoint_maptext() if(!isnull(ammo_magazine)) - return "[ammo_magazine.stored_ammo.len]/[ammo_magazine.max_ammo]" + return "[ammo_magazine.get_stored_ammo_count()]/[ammo_magazine.max_ammo]" return 0 //Weapons below this. diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index 035a478c13b..7365af2cad0 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -99,9 +99,7 @@ new /obj/item/seeds/random(src) if(89, 90) new /obj/item/organ/internal/heart(src) - if(91) - new /obj/item/soulstone(src) - if(92) + if(91,92) new /obj/item/sword/katana(src) if(93) new /obj/item/firstaid/combat(src) // Probably the least OP diff --git a/code/modules/mining/machinery/material_compressor.dm b/code/modules/mining/machinery/material_compressor.dm index 09f460de259..20d359bea1d 100644 --- a/code/modules/mining/machinery/material_compressor.dm +++ b/code/modules/mining/machinery/material_compressor.dm @@ -25,7 +25,7 @@ if(compressed >= MAX_COMPRESS_ORE_PER_TICK) break if(emagged) - for(var/mob/living/carbon/human/H in input_turf) + for(var/mob/living/human/H in input_turf) for(var/obj/item/organ/external/crushing in H.get_external_organs()) if(!crushing.simulated || crushing.anchored || !prob(5)) continue diff --git a/code/modules/mining/machinery/material_extractor.dm b/code/modules/mining/machinery/material_extractor.dm index 08c9ad8b7f3..10b759facec 100644 --- a/code/modules/mining/machinery/material_extractor.dm +++ b/code/modules/mining/machinery/material_extractor.dm @@ -94,9 +94,8 @@ break /obj/machinery/material_processing/extractor/on_reagent_change() - ..() - if(!reagents) + if(!(. = ..()) || !reagents) return var/adjusted_reagents = FALSE diff --git a/code/modules/mining/machinery/material_smelter.dm b/code/modules/mining/machinery/material_smelter.dm index 188fe797b5c..7d2a9c4fe84 100644 --- a/code/modules/mining/machinery/material_smelter.dm +++ b/code/modules/mining/machinery/material_smelter.dm @@ -26,9 +26,8 @@ // Outgas anything that is in gas form. Check what you put into the smeltery, nerds. /obj/machinery/material_processing/smeltery/on_reagent_change() - ..() - if(!reagents) + if(!(. = ..()) || !reagents) return var/datum/gas_mixture/environment = loc?.return_air() @@ -97,7 +96,7 @@ if(eaten >= MAX_INTAKE_ORE_PER_TICK) break if(emagged) - for(var/mob/living/carbon/human/H in input_turf) + for(var/mob/living/human/H in input_turf) for(var/obj/item/organ/external/eating in H.get_external_organs()) if(!eating.simulated || eating.anchored || !can_eat(eating) || !prob(5)) continue diff --git a/code/modules/mob/grab/grab_datum.dm b/code/modules/mob/grab/grab_datum.dm index 039cd8bc826..f2d493245c2 100644 --- a/code/modules/mob/grab/grab_datum.dm +++ b/code/modules/mob/grab/grab_datum.dm @@ -216,7 +216,7 @@ /decl/grab/proc/item_attack(var/obj/item/grab/G, var/obj/item) -/decl/grab/proc/resolve_item_attack(var/obj/item/grab/G, var/mob/living/carbon/human/user, var/obj/item/I, var/target_zone) +/decl/grab/proc/resolve_item_attack(var/obj/item/grab/G, var/mob/living/human/user, var/obj/item/I, var/target_zone) return 0 /decl/grab/proc/handle_resist(var/obj/item/grab/G) diff --git a/code/modules/mob/grab/grab_object.dm b/code/modules/mob/grab/grab_object.dm index 95bfb90518e..1a598a635c0 100644 --- a/code/modules/mob/grab/grab_object.dm +++ b/code/modules/mob/grab/grab_object.dm @@ -41,7 +41,7 @@ if(affecting_mob) affecting_mob.update_posture() if(ishuman(affecting_mob)) - var/mob/living/carbon/human/H = affecting_mob + var/mob/living/human/H = affecting_mob var/obj/item/uniform = H.get_equipped_item(slot_w_uniform_str) if(uniform) uniform.add_fingerprint(assailant) @@ -200,7 +200,7 @@ /obj/item/grab/proc/action_used() if(ishuman(assailant)) - var/mob/living/carbon/human/H = assailant + var/mob/living/human/H = assailant H.remove_cloaking_source(H.species) last_action = world.time leave_forensic_traces() @@ -213,7 +213,7 @@ /obj/item/grab/proc/leave_forensic_traces() if(ishuman(affecting)) - var/mob/living/carbon/human/affecting_mob = affecting + var/mob/living/human/affecting_mob = affecting var/obj/item/clothing/C = affecting_mob.get_covering_equipped_item_by_zone(target_zone) if(istype(C)) C.leave_evidence(assailant) diff --git a/code/modules/mob/grab/normal/grab_normal.dm b/code/modules/mob/grab/normal/grab_normal.dm index 410fb3a7546..638fdd04be0 100644 --- a/code/modules/mob/grab/normal/grab_normal.dm +++ b/code/modules/mob/grab/normal/grab_normal.dm @@ -118,8 +118,8 @@ return FALSE /decl/grab/normal/proc/attack_eye(var/obj/item/grab/G) - var/mob/living/carbon/human/target = G.get_affecting_mob() - var/mob/living/carbon/human/attacker = G.assailant + var/mob/living/human/target = G.get_affecting_mob() + var/mob/living/human/attacker = G.assailant if(!istype(target) || !istype(attacker)) return var/decl/natural_attack/attack = attacker.get_unarmed_attack(target, BP_EYES) @@ -140,8 +140,8 @@ return 1 /decl/grab/normal/proc/headbutt(var/obj/item/grab/G) - var/mob/living/carbon/human/target = G.get_affecting_mob() - var/mob/living/carbon/human/attacker = G.assailant + var/mob/living/human/target = G.get_affecting_mob() + var/mob/living/human/attacker = G.assailant if(!istype(target) || !istype(attacker)) return if(!attacker.skill_check(SKILL_COMBAT, SKILL_BASIC)) @@ -214,7 +214,7 @@ return FALSE return TRUE -/decl/grab/normal/resolve_item_attack(var/obj/item/grab/G, var/mob/living/carbon/human/user, var/obj/item/I) +/decl/grab/normal/resolve_item_attack(var/obj/item/grab/G, var/mob/living/human/user, var/obj/item/I) switch(G.target_zone) if(BP_HEAD) return attack_throat(G, I, user) diff --git a/code/modules/mob/grab/normal/norm_aggressive.dm b/code/modules/mob/grab/normal/norm_aggressive.dm index 37dc3da0ec4..e5130ef0f42 100644 --- a/code/modules/mob/grab/normal/norm_aggressive.dm +++ b/code/modules/mob/grab/normal/norm_aggressive.dm @@ -33,7 +33,7 @@ if(!(G.target_zone in list(BP_CHEST, BP_HEAD))) to_chat(G.assailant, SPAN_WARNING("You need to be grabbing their torso or head for this!")) return FALSE - var/mob/living/carbon/human/affecting_mob = G.get_affecting_mob() + var/mob/living/human/affecting_mob = G.get_affecting_mob() if(istype(affecting_mob)) var/obj/item/clothing/C = affecting_mob.get_equipped_item(slot_head_str) if(istype(C)) //hardsuit helmets etc diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index ff24f185a8d..9adf1633bd1 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -130,7 +130,7 @@ var/speaker_name = vname ? vname : speaker.name if(ishuman(speaker)) - var/mob/living/carbon/human/H = speaker + var/mob/living/human/H = speaker if(H.voice && !vname) speaker_name = H.voice @@ -141,18 +141,18 @@ if(isAI(src) && !hard_to_hear) var/jobname // the mob's "job" - var/mob/living/carbon/human/impersonating //The crew member being impersonated, if any. + var/mob/living/human/impersonating //The crew member being impersonated, if any. if (ishuman(speaker)) - var/mob/living/carbon/human/H = speaker + var/mob/living/human/H = speaker if(istype(H.get_equipped_item(slot_wear_mask_str), /obj/item/clothing/mask/chameleon/voice)) changed_voice = 1 var/list/impersonated = new() - var/mob/living/carbon/human/I = impersonated[speaker_name] + var/mob/living/human/I = impersonated[speaker_name] if(!I) - for(var/mob/living/carbon/human/M in SSmobs.mob_list) + for(var/mob/living/human/M in SSmobs.mob_list) if(M.real_name == speaker_name) I = M impersonated[speaker_name] = I @@ -212,8 +212,8 @@ formatted = language.format_message_radio(message, nverb) else formatted = "[verb], \"[message]\"" - if(sdisabilities & DEAFENED || GET_STATUS(src, STAT_DEAF)) - var/mob/living/carbon/human/H = src + if(has_genetic_condition(GENE_COND_DEAFENED) || GET_STATUS(src, STAT_DEAF)) + var/mob/living/human/H = src if(istype(H) && H.has_headset_in_ears() && prob(20)) to_chat(src, SPAN_WARNING("You feel your headset vibrate but can hear nothing from it!")) else if(vsource) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index fce971e2e1c..6d4d3cd4495 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -1,14 +1,14 @@ //This proc is called whenever someone clicks an inventory ui slot. /mob/proc/attack_ui(slot) - var/obj/item/W = get_active_held_item() - var/obj/item/E = get_equipped_item(slot) - if (istype(E)) - if(istype(W)) - E.attackby(W,src) + var/obj/item/holding = get_active_held_item() + var/obj/item/equipped = get_equipped_item(slot) + if (istype(equipped)) + if(istype(holding)) + equipped.attackby(holding, src) else - E.attack_hand(src) // We can assume it's physically accessible if it's on our person. + equipped.attack_hand(src) // We can assume it's physically accessible if it's on our person. else - equip_to_slot_if_possible(W, slot) + equip_to_slot_if_possible(holding, slot) //This is a SAFE proc. Use this instead of equip_to_slot()! //set del_on_fail to have it delete W if it fails to equip diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm index ce8d905a915..9c66c132c1d 100644 --- a/code/modules/mob/living/autohiss.dm +++ b/code/modules/mob/living/autohiss.dm @@ -4,7 +4,7 @@ /mob/living/proc/handle_autohiss(message, decl/language/L) return message // no autohiss at this level -/mob/living/carbon/human/handle_autohiss(message, decl/language/L) +/mob/living/human/handle_autohiss(message, decl/language/L) if(!client || get_preference_value(/datum/client_preference/autohiss) == PREF_OFF) // no need to process if there's no client or they have autohiss off return message return species.handle_autohiss(message, L, get_preference_value(/datum/client_preference/autohiss)) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index cf84fa7cad7..b1cea26e1c5 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -164,7 +164,7 @@ return /mob/living/bot/proc/GetInteractStatus() - . = "Status: [on ? "On" : "Off"]" + . = "Status: [on ? "On" : "Off"]" . += "
    Behaviour controls are [locked ? "locked" : "unlocked"]" . += "
    Maintenance panel is [open ? "opened" : "closed"]" diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index bdcd85af07a..e640ecc4784 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -99,12 +99,12 @@ . += "Automatic Cleaner v1.0" /mob/living/bot/cleanbot/GetInteractPanel() - . = "Cleans blood: [blood ? "Yes" : "No"]" - . += "
    Patrol station: [will_patrol ? "Yes" : "No"]" + . = "Cleans blood: [blood ? "Yes" : "No"]" + . += "
    Patrol station: [will_patrol ? "Yes" : "No"]" /mob/living/bot/cleanbot/GetInteractMaintenance() - . = "Odd looking screw twiddled: [screwloose ? "Yes" : "No"]" - . += "
    Weird button pressed: [oddbutton ? "Yes" : "No"]" + . = "Odd looking screw twiddled: [screwloose ? "Yes" : "No"]" + . += "
    Weird button pressed: [oddbutton ? "Yes" : "No"]" /mob/living/bot/cleanbot/ProcessCommand(var/mob/user, var/command, var/href_list) ..() diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 9d8c81f1dd3..4a487bb1a4c 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -45,20 +45,20 @@ . += "error: not found" /mob/living/bot/farmbot/GetInteractPanel() - . = "Water plants : [waters_trays ? "Yes" : "No"]" - . += "
    Refill watertank : [refills_water ? "Yes" : "No"]" - . += "
    Weed plants: [uproots_weeds ? "Yes" : "No"]" - . += "
    Replace fertilizer: [replaces_nutriment ? "Yes" : "No"]" - . += "
    Collect produce: [collects_produce ? "Yes" : "No"]" - . += "
    Remove dead plants: [removes_dead ? "Yes" : "No"]" + . = "Water plants : [waters_trays ? "Yes" : "No"]" + . += "
    Refill watertank : [refills_water ? "Yes" : "No"]" + . += "
    Weed plants: [uproots_weeds ? "Yes" : "No"]" + . += "
    Replace fertilizer: [replaces_nutriment ? "Yes" : "No"]" + . += "
    Collect produce: [collects_produce ? "Yes" : "No"]" + . += "
    Remove dead plants: [removes_dead ? "Yes" : "No"]" /mob/living/bot/farmbot/GetInteractMaintenance() . = "Plant identifier status: " switch(emagged) if(0) - . += "Normal" + . += "Normal" if(1) - . += "Scrambled (DANGER)" + . += "Scrambled (DANGER)" if(2) . += "ERROROROROROR-----" @@ -110,7 +110,7 @@ /mob/living/bot/farmbot/lookForTargets() if(emagged) - for(var/mob/living/carbon/human/H in view(7, src)) + for(var/mob/living/human/H in view(7, src)) target = H return else diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index 24380760339..f972e041782 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -45,17 +45,17 @@ . += "
    Tiles left: [amount]" /mob/living/bot/floorbot/GetInteractPanel() - . = "Improves floors: [improvefloors ? "Yes" : "No"]" - . += "
    Finds tiles: [eattiles ? "Yes" : "No"]" - . += "
    Make single pieces of metal into tiles when empty: [maketiles ? "Yes" : "No"]" + . = "Improves floors: [improvefloors ? "Yes" : "No"]" + . += "
    Finds tiles: [eattiles ? "Yes" : "No"]" + . += "
    Make single pieces of metal into tiles when empty: [maketiles ? "Yes" : "No"]" /mob/living/bot/floorbot/GetInteractMaintenance() . = "Disassembly mode: " switch(emagged) if(0) - . += "Off" + . += "Off" if(1) - . += "On (Caution)" + . += "On (Caution)" if(2) . += "ERROROROROROR-----" diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm index 01020dc7f35..e0f4c842d86 100644 --- a/code/modules/mob/living/bot/medibot.dm +++ b/code/modules/mob/living/bot/medibot.dm @@ -78,7 +78,7 @@ /mob/living/bot/medbot/lookForTargets() if(is_tipped) // Don't look for targets if we're incapacitated! return - for(var/mob/living/carbon/human/H in view(7, src)) // Time to find a patient! + for(var/mob/living/human/H in view(7, src)) // Time to find a patient! if(confirmTarget(H)) target = H if(last_newpatient_speak + 300 < world.time && vocal) @@ -95,7 +95,7 @@ last_newpatient_speak = world.time break -/mob/living/bot/medbot/UnarmedAttack(var/mob/living/carbon/human/H, var/proximity) +/mob/living/bot/medbot/UnarmedAttack(var/mob/living/human/H, var/proximity) . = ..() if(.) return @@ -203,34 +203,34 @@ . = ..() . += "
    Beaker: " if(reagent_glass) - . += "Loaded \[[reagent_glass.reagents.total_volume]/[reagent_glass.reagents.maximum_volume]\]" + . += "Loaded \[[reagent_glass.reagents.total_volume]/[reagent_glass.reagents.maximum_volume]\]" else . += "None loaded" /mob/living/bot/medbot/GetInteractPanel() . = "Healing threshold: " - . += "-- " - . += "- " + . += "-- " + . += "- " . += "[heal_threshold] " - . += "+ " - . += "++" + . += "+ " + . += "++" . += "
    Injection level: " - . += "- " + . += "- " . += "[injection_amount] " - . += "+ " + . += "+ " - . += "
    Reagent source: [use_beaker ? "Loaded Beaker (When available)" : "Internal Synthesizer"]" - . += "
    Treatment report is [declare_treatment ? "on" : "off"]. Toggle" - . += "
    The speaker switch is [vocal ? "on" : "off"]. Toggle" + . += "
    Reagent source: [use_beaker ? "Loaded Beaker (When available)" : "Internal Synthesizer"]" + . += "
    Treatment report is [declare_treatment ? "on" : "off"]. Toggle" + . += "
    The speaker switch is [vocal ? "on" : "off"]. Toggle" /mob/living/bot/medbot/GetInteractMaintenance() . = "Injection mode: " switch(emagged) if(0) - . += "Treatment" + . += "Treatment" if(1) - . += "Random (DANGER)" + . += "Random (DANGER)" if(2) . += "ERROROROROROR-----" @@ -297,7 +297,7 @@ reagent_glass.forceMove(my_turf) reagent_glass = null -/mob/living/bot/medbot/confirmTarget(var/mob/living/carbon/human/H) +/mob/living/bot/medbot/confirmTarget(var/mob/living/human/H) if(!..()) return 0 diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index bb3c960f2fc..255cc333ade 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -67,19 +67,19 @@ . += "
    Current Load: [load ? load.name : "none"]" /mob/living/bot/mulebot/GetInteractPanel() - . += "Stop" - . += "
    Proceed" - . += "
    Return to home" - . += "
    Set destination" - . += "
    Set home" - . += "
    Toggle auto return home ([auto_return ? "On" : "Off"])" - . += "
    Toggle non-standard cargo ([crates_only ? "Off" : "On"])" + . += "Stop" + . += "
    Proceed" + . += "
    Return to home" + . += "
    Set destination" + . += "
    Set home" + . += "
    Toggle auto return home ([auto_return ? "On" : "Off"])" + . += "
    Toggle non-standard cargo ([crates_only ? "Off" : "On"])" if(load) - . += "
    Unload now" + . += "
    Unload now" /mob/living/bot/mulebot/GetInteractMaintenance() - . = "Toggle safety ([safety ? "On" : "Off - DANGER"])" + . = "Toggle safety ([safety ? "On" : "Off - DANGER"])" /mob/living/bot/mulebot/ProcessCommand(var/mob/user, var/command, var/href_list) ..() @@ -197,7 +197,7 @@ if(T == src.loc) unload(dir) -/mob/living/bot/mulebot/Bump(var/mob/living/carbon/human/M) +/mob/living/bot/mulebot/Bump(var/mob/living/human/M) if(!safety && istype(M)) visible_message("[src] knocks over [M]!") SET_STATUS_MAX(M, STAT_STUN, 8) diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 9b24c8cbaa5..947f989f447 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -66,19 +66,19 @@ . += "Automatic Security Unit" /mob/living/bot/secbot/GetInteractPanel() - . = "Check for weapon authorization: [idcheck ? "Yes" : "No"]" - . += "
    Check security records: [check_records ? "Yes" : "No"]" - . += "
    Check arrest status: [check_arrest ? "Yes" : "No"]" - . += "
    Report arrests: [declare_arrests ? "Yes" : "No"]" - . += "
    Auto patrol: [will_patrol ? "On" : "Off"]" + . = "Check for weapon authorization: [idcheck ? "Yes" : "No"]" + . += "
    Check security records: [check_records ? "Yes" : "No"]" + . += "
    Check arrest status: [check_arrest ? "Yes" : "No"]" + . += "
    Report arrests: [declare_arrests ? "Yes" : "No"]" + . += "
    Auto patrol: [will_patrol ? "On" : "Off"]" /mob/living/bot/secbot/GetInteractMaintenance() . = "Threat identifier status: " switch(emagged) if(0) - . += "Normal" + . += "Normal" if(1) - . += "Scrambled (DANGER)" + . += "Scrambled (DANGER)" if(2) . += "ERROROROROROR-----" @@ -175,7 +175,7 @@ return /mob/living/bot/secbot/handleAdjacentTarget() - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/threat = check_threat(target) if(awaiting_surrender < SECBOT_WAIT_TIME && istype(H) && !H.current_posture.prone && threat < SECBOT_THREAT_ATTACK) if(awaiting_surrender == -1) @@ -184,10 +184,10 @@ else UnarmedAttack(target) -/mob/living/bot/secbot/proc/cuff_target(var/mob/living/carbon/C) - if(istype(C) && !C.get_equipped_item(slot_handcuffed_str)) - handcuffs.place_handcuffs(C, src) - resetTarget() //we're done, failed or not. Don't want to get stuck if C is not +/mob/living/bot/secbot/proc/cuff_target(var/mob/living/target) + if(istype(target) && !target.get_equipped_item(slot_handcuffed_str)) + handcuffs.place_handcuffs(target, src) + resetTarget() //we're done, failed or not. Don't want to get stuck if target is not /mob/living/bot/get_target_zone() if(!client) @@ -203,7 +203,7 @@ if(!istype(M)) return FALSE - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H) && H.current_posture.prone) cuff_target(H) return TRUE @@ -228,7 +228,7 @@ /mob/living/bot/secbot/proc/target_name(mob/living/T) if(ishuman(T)) - var/mob/living/carbon/human/H = T + var/mob/living/human/H = T return H.get_id_name("unidentified person") return "unidentified lifeform" diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm deleted file mode 100644 index 3ff1d6e1d1f..00000000000 --- a/code/modules/mob/living/carbon/breathe.dm +++ /dev/null @@ -1,3 +0,0 @@ -#define MOB_BREATH_DELAY 2 -/mob/living/should_breathe() - return ((life_tick % MOB_BREATH_DELAY) == 0 || failed_last_breath || is_asystole()) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm deleted file mode 100644 index b043a9d6621..00000000000 --- a/code/modules/mob/living/carbon/carbon.dm +++ /dev/null @@ -1,198 +0,0 @@ -/mob/living/carbon/Initialize() - //setup reagent holders - if(!bloodstr) - bloodstr = new/datum/reagents/metabolism(120, src, CHEM_INJECT) - if(!reagents) - reagents = bloodstr - if(!touching) - touching = new/datum/reagents/metabolism(mob_size * 100, src, CHEM_TOUCH) - - if (!default_language && species_language) - default_language = species_language - . = ..() - -/mob/living/carbon/Destroy() - QDEL_NULL(touching) - QDEL_NULL(bloodstr) - reagents = null //We assume reagents is a reference to bloodstr here - if(loc) - for(var/mob/M in contents) - M.dropInto(loc) - else - for(var/mob/M in contents) - qdel(M) - return ..() - -/mob/living/carbon/rejuvenate() - set_nutrition(400) - set_hydration(400) - ..() - -/mob/living/carbon/Move(NewLoc, direct) - . = ..() - if(!.) - return - - if(stat != DEAD) - var/nut_removed = DEFAULT_HUNGER_FACTOR/10 - var/hyd_removed = DEFAULT_THIRST_FACTOR/10 - if (move_intent.flags & MOVE_INTENT_EXERTIVE) - nut_removed *= 2 - hyd_removed *= 2 - adjust_nutrition(-nut_removed) - adjust_hydration(-hyd_removed) - - // Moving around increases germ_level faster - if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8)) - germ_level++ - -/mob/living/carbon/relaymove(var/mob/living/user, direction) - if(!istype(user) || !(user in contents) || user.is_on_special_ability_cooldown()) - return - user.set_special_ability_cooldown(5 SECONDS) - visible_message(SPAN_DANGER("You hear something rumbling inside [src]'s stomach...")) - var/obj/item/I = user.get_active_held_item() - if(!I?.force) - return - var/d = rand(round(I.force / 4), I.force) - visible_message(SPAN_DANGER("\The [user] attacks [src]'s stomach wall with \the [I]!")) - playsound(user.loc, 'sound/effects/attackblob.ogg', 50, 1) - var/obj/item/organ/external/organ = GET_EXTERNAL_ORGAN(src, BP_CHEST) - if(istype(organ)) - organ.take_external_damage(d, 0) - else - take_organ_damage(d) - if(prob(get_damage(BRUTE) - 50)) - gib() - -/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null) - if(status_flags & GODMODE) return 0 //godmode - - shock_damage = apply_shock(shock_damage, def_zone, siemens_coeff) - - if(!shock_damage) - return 0 - - stun_effect_act(agony_amount=shock_damage, def_zone=def_zone) - - playsound(loc, "sparks", 50, 1, -1) - if (shock_damage > 15) - src.visible_message( - "[src] was electrocuted[source ? " by the [source]" : ""]!", \ - "You feel a powerful shock course through your body!", \ - "You hear a heavy electrical crack." \ - ) - else - src.visible_message( - "[src] was shocked[source ? " by the [source]" : ""].", \ - "You feel a shock course through your body.", \ - "You hear a zapping sound." \ - ) - - switch(shock_damage) - if(11 to 15) - SET_STATUS_MAX(src, STAT_STUN, 1) - if(16 to 20) - SET_STATUS_MAX(src, STAT_STUN, 2) - if(21 to 25) - SET_STATUS_MAX(src, STAT_WEAK, 2) - if(26 to 30) - SET_STATUS_MAX(src, STAT_WEAK, 5) - if(31 to INFINITY) - SET_STATUS_MAX(src, STAT_WEAK, 10) //This should work for now, more is really silly and makes you lay there forever - - set_status(STAT_JITTER, min(shock_damage*5, 200)) - - spark_at(loc, amount=5, cardinal_only = TRUE) - - return shock_damage - -/mob/living/carbon/proc/apply_shock(var/shock_damage, var/def_zone, var/siemens_coeff = 1.0) - shock_damage *= siemens_coeff - if(shock_damage < 0.5) - return 0 - if(shock_damage < 1) - shock_damage = 1 - apply_damage(shock_damage, BURN, def_zone, used_weapon="Electrocution") - return(shock_damage) - -/mob/proc/swap_hand() - SHOULD_CALL_PARENT(TRUE) - -/mob/living/carbon/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) - if(eyecheck() < intensity || override_blindness_check) - return ..() - -/mob/living/carbon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - ..() - var/temp_inc = max(min(BODYTEMP_HEATING_MAX*(1-get_heat_protection()), exposed_temperature - bodytemperature), 0) - bodytemperature += temp_inc - -/mob/living/carbon/restrained() - return get_equipped_item(slot_handcuffed_str) - -/mob/living/carbon/Bump(var/atom/movable/AM, yes) - if(now_pushing || !yes) - return - ..() - -/mob/living/carbon/slip(slipped_on, stun_duration = 8) - if(has_gravity() && !buckled && !current_posture.prone) - to_chat(src, SPAN_DANGER("You slipped on [slipped_on]!")) - playsound(loc, 'sound/misc/slip.ogg', 50, 1, -3) - SET_STATUS_MAX(src, STAT_WEAK, stun_duration) - . = TRUE - -/mob/living/carbon/get_satiated_nutrition() - return 350 - -/mob/living/carbon/get_max_nutrition() - return 400 - -/mob/living/carbon/get_max_hydration() - return 400 - -/mob/living/carbon/fluid_act(var/datum/reagents/fluids) - ..() - if(QDELETED(src) || !fluids?.total_volume || !touching || fluids.total_volume <= touching.total_volume) - return - // TODO: review saturation logic so we can end up with more than like 15 water in our contact reagents. - var/saturation = min(fluids.total_volume, round(mob_size * 1.5 * reagent_permeability()) - touching.total_volume) - if(saturation > 0) - fluids.trans_to_holder(touching, saturation) - -/mob/living/carbon/get_species() - RETURN_TYPE(/decl/species) - return species - -/mob/living/carbon/get_contact_reagents() - return touching - -/mob/living/carbon/get_injected_reagents() - return bloodstr - -/mob/living/carbon/get_admin_job_string() - return "Carbon-based" - -/mob/living/carbon/handle_flashed(var/obj/item/flash/flash, var/flash_strength) - - var/safety = eyecheck() - if(safety >= FLASH_PROTECTION_MODERATE || flash_strength <= 0) // May be modified by human proc. - return FALSE - - flash_eyes(FLASH_PROTECTION_MODERATE - safety) - SET_STATUS_MAX(src, STAT_STUN, (flash_strength / 2)) - SET_STATUS_MAX(src, STAT_BLURRY, flash_strength) - SET_STATUS_MAX(src, STAT_CONFUSE, (flash_strength + 2)) - if(flash_strength > 3) - drop_held_items() - if(flash_strength > 5) - SET_STATUS_MAX(src, STAT_WEAK, 2) - -/mob/living/carbon/verb/showoff() - set name = "Show Held Item" - set category = "Object" - - var/obj/item/I = get_active_held_item() - if(I && I.simulated) - I.showoff(src) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm deleted file mode 100644 index a8c4298393f..00000000000 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ /dev/null @@ -1,6 +0,0 @@ - -/mob/living/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) - if(effective_force) - try_embed_in_mob(I, hit_zone, effective_force, direction = get_dir(user, src)) - return TRUE - return FALSE diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm deleted file mode 100644 index 96e7afdbc09..00000000000 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ /dev/null @@ -1,29 +0,0 @@ -/mob/living/carbon - gender = MALE - abstract_type = /mob/living/carbon - - //Surgery info - //Active emote/pose - var/pose = null - var/datum/reagents/metabolism/bloodstr - var/datum/reagents/metabolism/touching - - var/ignore_rads = FALSE - /// Whether the mob is performing cpr or not. - var/performing_cpr = FALSE - var/lastpuke = 0 - - var/obj/item/tank/internal = null//Human/Monkey - var/decl/species/species // Contains environment tolerances and language information, set during New(). - - //these two help govern taste. The first is the last time a taste message was shown to the plaer. - //the second is the message in question. - var/last_taste_time = 0 - var/last_taste_text = "" - - // organ-related variables, see organ.dm and human_organs.dm - //Shouldn't be accessed directly - var/list/organs_by_tag - var/tmp/list/internal_organs - var/tmp/list/external_organs - var/list/organs_by_category diff --git a/code/modules/mob/living/carbon/carbon_grabs.dm b/code/modules/mob/living/carbon/carbon_grabs.dm deleted file mode 100644 index 93acf062189..00000000000 --- a/code/modules/mob/living/carbon/carbon_grabs.dm +++ /dev/null @@ -1,4 +0,0 @@ -/mob/living/carbon/get_active_grabs() - . = list() - for(var/obj/item/grab/grab in get_held_items()) - . += grab diff --git a/code/modules/mob/living/carbon/carbon_organs.dm b/code/modules/mob/living/carbon/carbon_organs.dm deleted file mode 100644 index 5e7378e8747..00000000000 --- a/code/modules/mob/living/carbon/carbon_organs.dm +++ /dev/null @@ -1,78 +0,0 @@ -/mob/living/carbon/get_organ(var/organ_tag, var/expected_type = /obj/item/organ) - RETURN_TYPE(expected_type) - var/obj/item/organ = LAZYACCESS(organs_by_tag, organ_tag) - if(!expected_type || istype(organ, expected_type)) - return organ - -/mob/living/carbon/get_external_organs() - return external_organs - -/mob/living/carbon/get_internal_organs() - return internal_organs - -/mob/living/carbon/has_organs() - return (LAZYLEN(external_organs) + LAZYLEN(internal_organs)) > 0 - -/mob/living/carbon/has_external_organs() - return LAZYLEN(external_organs) > 0 - -/mob/living/carbon/has_internal_organs() - return LAZYLEN(internal_organs) > 0 - -/mob/living/carbon/get_organs_by_categories(var/list/categories) - for(var/organ_cat in categories) - if(organ_cat in organs_by_category) - LAZYDISTINCTADD(., organs_by_category[organ_cat]) - -//Deletes all references to organs -/mob/living/carbon/delete_organs() - ..() - organs_by_tag = null - internal_organs = null - external_organs = null - organs_by_category = null - -/mob/living/carbon/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached, skip_health_update = FALSE) - var/obj/item/organ/existing = LAZYACCESS(organs_by_tag, O.organ_tag) - if(existing && O != existing) - CRASH("mob/living/carbon/add_organ(): '[O]' tried to overwrite [src]'s existing organ '[existing]' in slot '[O.organ_tag]'!") - if(O.parent_organ && !LAZYACCESS(organs_by_tag, O.parent_organ)) - CRASH("mob/living/carbon/add_organ(): Tried to add an internal organ to a non-existing parent external organ!") - - //We don't add internal organs to the lists if we're detached - if(O.is_internal() && !detached) - LAZYSET(organs_by_tag, O.organ_tag, O) - LAZYDISTINCTADD(internal_organs, O) - //External organs must always be in the organ list even when detached. Otherwise icon updates won't show the limb, and limb attach surgeries won't work - else if(!O.is_internal()) - LAZYSET(organs_by_tag, O.organ_tag, O) - LAZYDISTINCTADD(external_organs, O) - - // Update our organ category lists, if neeed. - if(O.organ_category) - LAZYINITLIST(organs_by_category) - LAZYDISTINCTADD(organs_by_category[O.organ_category], O) - - . = ..() - -/mob/living/carbon/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = TRUE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE, var/skip_health_update = FALSE) - if(istype(O) && !in_place && O.is_vital_to_owner() && usr) - admin_attack_log(usr, src, "Removed a vital organ ([src]).", "Had a vital organ ([src]) removed.", "removed a vital organ ([src]) from") - if(!(. = ..())) - return - LAZYREMOVE(organs_by_tag, O.organ_tag) - if(O.is_internal()) - LAZYREMOVE(internal_organs, O) - else - LAZYREMOVE(external_organs, O) - - // Update our organ category lists, if neeed. - if(O.organ_category && islist(organs_by_category)) - organs_by_category[O.organ_category] -= O - if(LAZYLEN(organs_by_category[O.organ_category]) <= 0) - LAZYREMOVE(organs_by_category, O.organ_category) - -/mob/living/carbon/get_bodytype() - RETURN_TYPE(/decl/bodytype) - // If the root organ ever changes/isn't always the chest, this will need to be changed. - return get_organ(BP_CHEST, /obj/item/organ)?.bodytype \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_powers.dm b/code/modules/mob/living/carbon/carbon_powers.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm deleted file mode 100644 index 57be8c03832..00000000000 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ /dev/null @@ -1,12 +0,0 @@ -/* -Contians the proc to handle radiation. -Specifically made to do radiation burns. -*/ - - -/mob/living/carbon/apply_radiation(damage) - ..() - if(!isSynthetic() && !ignore_rads) - damage = 0.25 * damage * (species ? species.get_radiation_mod(src) : 1) - take_damage(damage, BURN) - return TRUE diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm deleted file mode 100644 index 65b725089f0..00000000000 --- a/code/modules/mob/living/carbon/human/death.dm +++ /dev/null @@ -1,63 +0,0 @@ -/mob/living/carbon/human/gib(do_gibs = TRUE) - var/turf/my_turf = get_turf(src) - . = ..() - if(.) - for(var/obj/item/organ/I in get_internal_organs()) - remove_organ(I) - if(!QDELETED(I) && isturf(my_turf)) - I.dropInto(my_turf) - I.throw_at(get_edge_target_turf(I, pick(global.alldirs)), rand(1,3), THROWFORCE_GIBS) - for(var/obj/item/organ/external/E in get_external_organs()) - if(!E.parent_organ) - continue //Skip root organ - E.dismember(FALSE, DISMEMBER_METHOD_EDGE, TRUE, ignore_last_organ = TRUE) - if(my_turf) - E.dropInto(my_turf) - E.throw_at(get_edge_target_turf(E, pick(global.alldirs)), rand(1,3), THROWFORCE_GIBS) - -/mob/living/carbon/human/get_death_message(gibbed) - if(get_config_value(/decl/config/toggle/health_show_human_death_message)) - return species.get_species_death_message(src) || "seizes up and falls limp..." - return ..() - -/mob/living/carbon/human/death(gibbed) - . = ..() - if(.) - BITSET(hud_updateflag, HEALTH_HUD) - BITSET(hud_updateflag, STATUS_HUD) - BITSET(hud_updateflag, LIFE_HUD) - //Handle species-specific deaths. - callHook("death", list(src, gibbed)) - handle_hud_list() - if(!gibbed) - animate_tail_stop() - handle_organs() - if(species.death_sound) - playsound(loc, species.death_sound, 80, 1, 1) - if(SSticker.mode) - SSticker.mode.check_win() - species.handle_death(src) - -/mob/living/carbon/human/proc/is_husked() - return (MUTATION_HUSK in mutations) - -/mob/living/carbon/human/proc/make_husked() - if(is_husked()) - return - - SET_FACIAL_HAIR_STYLE(src, /decl/sprite_accessory/facial_hair/shaved, TRUE) - SET_HAIR_STYLE(src, /decl/sprite_accessory/hair/bald, FALSE) - - mutations.Add(MUTATION_HUSK) - for(var/obj/item/organ/external/E in get_external_organs()) - E.status |= ORGAN_DISFIGURED - update_body(1) - -/mob/living/carbon/human/physically_destroyed(var/skip_qdel, var/droplimb_type = DISMEMBER_METHOD_BLUNT) - for(var/obj/item/organ/external/limb in get_external_organs()) - if(!limb.parent_organ) // don't dismember root - continue - limb.dismember(TRUE, droplimb_type, TRUE, TRUE) - dump_contents() - if(!skip_qdel && !QDELETED(src)) - qdel(src) diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm deleted file mode 100644 index 93eb234aff7..00000000000 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ /dev/null @@ -1,140 +0,0 @@ -/mob/living/carbon/human/proc/update_eyes(update_icons = TRUE) - var/obj/item/organ/internal/eyes/eyes = get_organ((get_bodytype()?.vision_organ || BP_EYES), /obj/item/organ/internal/eyes) - if(eyes) - eyes.update_colour() - if(update_icons) - queue_icon_update() - -/mob/living/carbon/human/proc/get_bodypart_name(var/zone) - var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, zone) - return E?.name - -/mob/living/carbon/human/proc/should_recheck_bad_external_organs() - var/damage_this_tick = get_damage(TOX) - for(var/obj/item/organ/external/O in get_external_organs()) - damage_this_tick += O.burn_dam + O.brute_dam - - if(damage_this_tick > last_dam) - . = TRUE - last_dam = damage_this_tick - -/mob/living/carbon/human/proc/recheck_bad_external_organs() - LAZYCLEARLIST(bad_external_organs) - for(var/obj/item/organ/external/E in get_external_organs()) - if(E.need_process()) - LAZYDISTINCTADD(bad_external_organs, E) - -// Takes care of organ related updates, such as broken and missing limbs -/mob/living/carbon/human/proc/handle_organs() - - // Check for the presence (or lack of) vital organs like the brain. - // Set a timer after this point, since we want a little bit of - // wiggle room before the body dies for good (brain transplants). - if(stat != DEAD) - var/decl/bodytype/root_bodytype = get_bodytype() - if(root_bodytype.check_vital_organ_missing(src)) - SET_STATUS_MAX(src, STAT_PARA, 5) - if(vital_organ_missing_time) - if(world.time >= vital_organ_missing_time) - death() - else - vital_organ_missing_time = world.time + root_bodytype.vital_organ_failure_death_delay - else - vital_organ_missing_time = null - - //processing internal organs is pretty cheap, do that first. - for(var/obj/item/organ/I in internal_organs) - I.Process() - - var/force_process = should_recheck_bad_external_organs() - - if(force_process) - recheck_bad_external_organs() - for(var/obj/item/organ/external/Ex in get_external_organs()) - LAZYDISTINCTADD(bad_external_organs, Ex) - - if(!force_process && !LAZYLEN(bad_external_organs)) - return - - for(var/obj/item/organ/external/E in bad_external_organs) - if(!E) - continue - if(!E.need_process()) - LAZYREMOVE(bad_external_organs, E) - continue - else - E.Process() - - if(!current_posture.prone && !buckled && world.time - l_move_time < 15) - //Moving around with fractured ribs won't do you any good - if (prob(10) && !stat && can_feel_pain() && GET_CHEMICAL_EFFECT(src, CE_PAINKILLER) < 50 && E.is_broken() && LAZYLEN(E.internal_organs)) - custom_pain("Pain jolts through your broken [E.encased ? E.encased : E.name], staggering you!", 50, affecting = E) - drop_held_items() - SET_STATUS_MAX(src, STAT_STUN, 2) - - //Moving makes open wounds get infected much faster - for(var/datum/wound/W in E.wounds) - if (W.infection_check()) - W.germ_level += 1 - -/mob/living/carbon/human/is_asystole() - if(isSynthetic()) - var/obj/item/organ/internal/cell/C = get_organ(BP_CELL, /obj/item/organ/internal/cell) - if(!C || !C.is_usable() || !C.percent()) - return TRUE - else if(should_have_organ(BP_HEART)) - var/obj/item/organ/internal/heart/heart = get_organ(BP_HEART, /obj/item/organ/internal/heart) - if(!istype(heart) || !heart.is_working()) - return TRUE - return FALSE - -//Registers an organ and setup the organ hierachy properly. -//affected : Parent organ if applicable. -//in_place : If true, we're performing an in-place replacement, without triggering anything related to adding the organ in-game as part of surgery or else. -/mob/living/carbon/human/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached, skip_health_update = FALSE) - if(!(. = ..())) - return - if(!O.is_internal()) - refresh_modular_limb_verbs() - - //#TODO: wish we could invalidate the human icons to trigger a single update when the organ state changes multiple times in a row - if(update_icon) - update_inhand_overlays(FALSE) - update_body(FALSE) - update_bandages(FALSE) - update_damage_overlays(FALSE) - hud_reset() - queue_icon_update() //Avoids calling icon updates 50 times when adding multiple organs - -//Unregister and remove a given organ from the mob. -//drop_organ : Once the organ is removed its dropped to the ground. -//detach : Toggle the ORGAN_CUT_AWAY flag on the removed organ -//ignore_children: Skips recursively removing this organ's child organs. -//in_place : If true we remove only the organ (no children items or implants) and avoid triggering mob changes and parent organs changes as much as possible. -// Meant to be used for init and species transforms, without triggering any updates to mob state or anything related to losing a limb as part of surgery or combat. -/mob/living/carbon/human/remove_organ(obj/item/organ/O, drop_organ, detach, ignore_children, in_place, update_icon, skip_health_update = FALSE) - if(!(. = ..())) - return - if(!O.is_internal()) - refresh_modular_limb_verbs() - LAZYREMOVE(bad_external_organs, O) - - //#TODO: wish we could invalidate the human icons to trigger a single update when the organ state changes multiple times in a row - if(update_icon) - regenerate_body_icon = TRUE - hud_reset() - queue_icon_update() //Avoids calling icon updates 50 times when removing multiple organs - -/mob/living/carbon/human/on_lost_organ(var/obj/item/organ/O) - if(!(. = ..())) - return - //Move some blood over to the organ - if(!BP_IS_PROSTHETIC(O) && O.species && O.reagents?.total_volume < 5) - vessel.trans_to(O, 5 - O.reagents.total_volume, 1, 1) - -/mob/living/carbon/human/delete_organs() - . = ..() - LAZYCLEARLIST(bad_external_organs) - -/mob/living/carbon/human/get_injured_organs() - return bad_external_organs diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 830fed910ba..17bc1361363 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -24,19 +24,18 @@ switch(damagetype) if(BURN) - if(MUTATION_COLD_RESISTANCE in mutations) + if(has_genetic_condition(GENE_COND_COLD_RESISTANCE)) return - take_damage(damage, BURN) + take_damage(damage, BURN, damage_flags, used_weapon, armor_pen) if(ELECTROCUTE) electrocute_act(damage, used_weapon, 1, def_zone) else - take_damage(damage, damagetype) + take_damage(damage, damagetype, damage_flags, used_weapon, armor_pen) return TRUE /mob/living/apply_radiation(var/damage = 0) if(!damage) return FALSE - radiation = max(0, radiation + damage) return TRUE diff --git a/code/modules/mob/living/deity/forms/narsie.dm b/code/modules/mob/living/deity/forms/narsie.dm deleted file mode 100644 index 930f095dd41..00000000000 --- a/code/modules/mob/living/deity/forms/narsie.dm +++ /dev/null @@ -1,49 +0,0 @@ -/datum/god_form/narsie - name = "Nar-Sie" - info = {"The Geometer of Blood, you crave blood and destruction.
    - Benefits:
    - +Can gain power from blood sacrifices.
    - +Ability to forge weapons and armor.
    - Drawbacks:
    - -Servant abilities require copious amounts of their blood. - "} - desc = "A being made of a million nightmares, a billion deaths." - god_icon_state = "nar-sie" - pylon_icon_state = "shade" - faction = "cult" - - buildables = list(/obj/structure/deity/altar/narsie, - /obj/structure/deity/pylon - ) - items = list(/datum/deity_item/general/potential, - /datum/deity_item/general/regeneration, - /datum/deity_item/boon/eternal_darkness, - /datum/deity_item/boon/torment, - /datum/deity_item/boon/blood_shard, - /datum/deity_item/boon/drain_blood, - /datum/deity_item/phenomena/exhude_blood, - /datum/deity_item/sacrifice, - /datum/deity_item/boon/sac_dagger, - /datum/deity_item/boon/sac_spell, - /datum/deity_item/boon/execution_axe, - /datum/deity_item/blood_stone, - /datum/deity_item/minions, - /datum/deity_item/boon/soul_shard, - /datum/deity_item/boon/blood_zombie, - /datum/deity_item/boon/tear_veil, - /datum/deity_item/phenomena/hellscape, - /datum/deity_item/blood_crafting, - /datum/deity_item/blood_crafting/armored, - /datum/deity_item/blood_crafting/space - ) - -/datum/god_form/narsie/take_charge(var/mob/living/user, var/charge) - charge = min(100, charge * 0.25) - if(prob(charge)) - to_chat(user, "You feel drained...") - var/mob/living/carbon/human/H = user - if(istype(H) && H.should_have_organ(BP_HEART)) - H.vessel.remove_any(charge) - else - user.take_damage(charge) - return 1 \ No newline at end of file diff --git a/code/modules/mob/living/deity/items/narsie/smithing.dm b/code/modules/mob/living/deity/items/narsie/smithing.dm deleted file mode 100644 index 6d43233bf91..00000000000 --- a/code/modules/mob/living/deity/items/narsie/smithing.dm +++ /dev/null @@ -1,40 +0,0 @@ -/datum/deity_item/blood_crafting - name = DEITY_BLOOD_CRAFT - desc = "Unlocks the blood smithing structure which allows followers to forge unholy tools from blood and flesh." - category = DEITY_BLOOD_CRAFT - max_level = 1 - base_cost = 75 - var/forge_type = /obj/structure/deity/blood_forge - var/list/recipes = list(/obj/item/sword/cultblade = 50, - /obj/item/clothing/head/culthood/alt = 10, - /obj/item/clothing/suit/cultrobes/alt = 20 - ) - -/datum/deity_item/blood_crafting/buy(var/mob/living/deity/user) - ..() - user.form.buildables |= forge_type //put structure here - var/list/L = user.feats[name] - if(!L) - L = list() - for(var/type in recipes) - L[type] = recipes[type] - user.feats[name] = L - -/datum/deity_item/blood_crafting/armored - name = DEITY_ARMOR_CRAFT - desc = "Unlock the secrets to tempered blood smithing, allowing your followers to smith more powerful and expensive armaments." - category = DEITY_BLOOD_CRAFT - base_cost = 75 - requirements = list(DEITY_BLOOD_CRAFT = 1) - recipes = list(/obj/item/clothing/suit/cultrobes/magusred = 80, - /obj/item/clothing/head/culthood/magus = 50, - /obj/structure/constructshell/cult = 70) //also shield? - -/datum/deity_item/blood_crafting/space - name = DEITY_VOID_CRAFT - desc = "Allows your followers to craft space suits, allowing you to finally spread across the cosmos." - category = DEITY_BLOOD_CRAFT - base_cost = 100 - requirements = list(DEITY_BLOOD_CRAFT = 1, DEITY_ARMOR_CRAFT = 1) - recipes = list(/obj/item/clothing/suit/space/cult = 100, - /obj/item/clothing/head/helmet/space/cult = 70) //Probably more too. \ No newline at end of file diff --git a/code/modules/mob/living/human/death.dm b/code/modules/mob/living/human/death.dm new file mode 100644 index 00000000000..83e6c71dcd2 --- /dev/null +++ b/code/modules/mob/living/human/death.dm @@ -0,0 +1,50 @@ +/mob/living/human/gib(do_gibs = TRUE) + var/turf/my_turf = get_turf(src) + . = ..() + if(.) + for(var/obj/item/organ/I in get_internal_organs()) + remove_organ(I) + if(!QDELETED(I) && isturf(my_turf)) + I.dropInto(my_turf) + I.throw_at(get_edge_target_turf(I, pick(global.alldirs)), rand(1,3), THROWFORCE_GIBS) + for(var/obj/item/organ/external/E in get_external_organs()) + if(!E.parent_organ) + continue //Skip root organ + E.dismember(FALSE, DISMEMBER_METHOD_EDGE, TRUE, ignore_last_organ = TRUE) + if(my_turf) + E.dropInto(my_turf) + E.throw_at(get_edge_target_turf(E, pick(global.alldirs)), rand(1,3), THROWFORCE_GIBS) + +/mob/living/human/get_death_message(gibbed) + if(get_config_value(/decl/config/toggle/health_show_human_death_message)) + return species.get_species_death_message(src) || "seizes up and falls limp..." + return ..() + +/mob/living/human/death(gibbed) + if(!(. = ..())) + return + + BITSET(hud_updateflag, HEALTH_HUD) + BITSET(hud_updateflag, STATUS_HUD) + BITSET(hud_updateflag, LIFE_HUD) + + //Handle species-specific deaths. + callHook("death", list(src, gibbed)) + handle_hud_list() + if(!gibbed) + animate_tail_stop() + handle_organs() + if(species.death_sound) + playsound(loc, species.death_sound, 80, 1, 1) + if(SSticker.mode) + SSticker.mode.check_win() + species.handle_death(src) + +/mob/living/human/physically_destroyed(var/skip_qdel, var/droplimb_type = DISMEMBER_METHOD_BLUNT) + for(var/obj/item/organ/external/limb in get_external_organs()) + if(!limb.parent_organ) // don't dismember root + continue + limb.dismember(TRUE, droplimb_type, TRUE, TRUE) + dump_contents() + if(!skip_qdel && !QDELETED(src)) + qdel(src) diff --git a/code/modules/mob/living/carbon/human/descriptors/_descriptors.dm b/code/modules/mob/living/human/descriptors/_descriptors.dm similarity index 97% rename from code/modules/mob/living/carbon/human/descriptors/_descriptors.dm rename to code/modules/mob/living/human/descriptors/_descriptors.dm index df1a9d0dcb4..2d4a57aa138 100644 --- a/code/modules/mob/living/carbon/human/descriptors/_descriptors.dm +++ b/code/modules/mob/living/human/descriptors/_descriptors.dm @@ -14,7 +14,7 @@ */ -/mob/living/carbon/human/proc/show_descriptors_to(mob/user) +/mob/living/human/proc/show_descriptors_to(mob/user) if(LAZYLEN(appearance_descriptors)) var/decl/bodytype/bodytype = get_bodytype() if(user == src) @@ -87,8 +87,8 @@ /datum/appearance_descriptor/proc/get_initial_comparison_component(mob/me, mob/them, decl/pronouns/my_gender, decl/pronouns/other_gender, my_value) if(!skip_species_mention) - var/mob/living/carbon/human/H = me - var/mob/living/carbon/human/O = them + var/mob/living/human/H = me + var/mob/living/human/O = them if(istype(H) && (!istype(O) || H.species.name != O.species.name)) . = get_species_text("\improper [H.species.name]") . = "[get_third_person_message_start(my_gender)] [get_standalone_value_descriptor(my_value)][.]" @@ -114,7 +114,7 @@ // Append the same-descriptor comparison text. var/comparing_value if(ishuman(observer)) - var/mob/living/carbon/human/human_observer = observer + var/mob/living/human/human_observer = observer var/decl/bodytype/human_bodytype = human_observer?.get_bodytype() if(LAZYLEN(human_observer.appearance_descriptors) && !isnull(human_bodytype.appearance_descriptors[name]) && !isnull(human_observer.appearance_descriptors[name])) var/datum/appearance_descriptor/obs_descriptor = human_bodytype.appearance_descriptors[name] diff --git a/code/modules/mob/living/carbon/human/descriptors/descriptors_age.dm b/code/modules/mob/living/human/descriptors/descriptors_age.dm similarity index 100% rename from code/modules/mob/living/carbon/human/descriptors/descriptors_age.dm rename to code/modules/mob/living/human/descriptors/descriptors_age.dm diff --git a/code/modules/mob/living/carbon/human/descriptors/descriptors_generic.dm b/code/modules/mob/living/human/descriptors/descriptors_generic.dm similarity index 100% rename from code/modules/mob/living/carbon/human/descriptors/descriptors_generic.dm rename to code/modules/mob/living/human/descriptors/descriptors_generic.dm diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/human/examine.dm similarity index 93% rename from code/modules/mob/living/carbon/human/examine.dm rename to code/modules/mob/living/human/examine.dm index 7024317a429..0d214079de3 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/human/examine.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/show_examined_short_description(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/living/human/show_examined_short_description(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) var/msg = list("*---------*\n[user == src ? "You are" : "This is"] [name]") if(!(hideflags & HIDEJUMPSUIT) || !(hideflags & HIDEFACE)) var/species_name = "\improper " @@ -6,7 +6,7 @@ species_name += "[species.cyborg_noun] [species.get_root_species_name(src)]" else species_name += "[species.name]" - msg += ", \a [species_name]![(user.can_use_codex() && SScodex.get_codex_entry(get_codex_value(user))) ? SPAN_NOTICE(" \[?\]") : ""]" + msg += ", \a [species_name]![(user.can_use_codex() && SScodex.get_codex_entry(get_codex_value(user))) ? SPAN_NOTICE(" \[?\]") : ""]" var/extra_species_text = species.get_additional_examine_text(src) if(extra_species_text) msg += "
    [extra_species_text]" @@ -20,7 +20,7 @@ msg += "
    *---------*" to_chat(user, jointext(msg, null)) -/mob/living/carbon/human/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/living/human/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) var/self_examine = (user == src) var/use_He = self_examine ? "You" : pronouns.He @@ -203,8 +203,8 @@ if(R) criminal = R.get_criminalStatus() - msg += "Criminal status: \[[criminal]\]\n" - msg += "Security records: \[View\]\n" + msg += "Criminal status: \[[criminal]\]\n" + msg += "Security records: \[View\]\n" if(hasHUD(user, HUD_MEDICAL)) var/perpname = "wot" @@ -222,8 +222,8 @@ if(R) medical = R.get_status() - msg += "Physical status: \[[medical]\]\n" - msg += "Medical records: \[View\]\n" + msg += "Physical status: \[[medical]\]\n" + msg += "Medical records: \[View\]\n" // Show IC/OOC info if available. if(comments_record_id) @@ -260,14 +260,14 @@ ..() -//Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records. +//Helper procedure. Called by /mob/living/human/examine() and /mob/living/human/Topic() to determine HUD access to security and medical records. /proc/hasHUD(mob/M, hudtype) return !!M.getHUDsource(hudtype) /mob/proc/getHUDsource(hudtype) return -/mob/living/carbon/human/getHUDsource(hudtype) +/mob/living/human/getHUDsource(hudtype) var/obj/item/clothing/glasses/G = get_equipped_item(slot_glasses_str) if(!istype(G)) return ..() @@ -293,7 +293,7 @@ if(getHUDsource(hudtype)) return get_computer_network() -/mob/living/carbon/human/verb/pose() +/mob/living/human/verb/pose() set name = "Set Pose" set desc = "Sets a description which will be shown when someone examines you." set category = "IC" @@ -301,7 +301,7 @@ var/decl/pronouns/G = get_pronouns() pose = sanitize(input(usr, "This is [src]. [G.He]...", "Pose", null) as text) -/mob/living/carbon/human/verb/set_flavor() +/mob/living/human/verb/set_flavor() set name = "Set Flavour Text" set desc = "Sets an extended description of your character's features." set category = "IC" @@ -339,6 +339,6 @@ HTML += TextPreview(flavor_texts["feet"]) HTML += "
    " HTML += "
    " - HTML +="\[Done\]" + HTML +="\[Done\]" HTML += "" show_browser(src, jointext(HTML,null), "window=flavor_changes;size=430x300") diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/human/human.dm similarity index 83% rename from code/modules/mob/living/carbon/human/human.dm rename to code/modules/mob/living/human/human.dm index f43c1aa60d4..c3639aa7fac 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -1,27 +1,39 @@ -/mob/living/carbon/human +/mob/living/human name = "unknown" real_name = "unknown" icon = 'icons/mob/human.dmi' icon_state = "body_m_s" mob_sort_value = 6 - dna = new /datum/dna() max_health = 150 var/list/hud_list[10] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/step_count -/mob/living/carbon/human/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/human/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) + current_health = max_health setup_hud_overlays() var/list/newargs = args.Copy(2) - setup(arglist(newargs)) + setup_human(arglist(newargs)) global.human_mob_list |= src + + if(!bloodstr) + bloodstr = new/datum/reagents/metabolism(120, src, CHEM_INJECT) + if(!reagents) + reagents = bloodstr + if(!touching) + touching = new/datum/reagents/metabolism(mob_size * 100, src, CHEM_TOUCH) + + if (!default_language && species_language) + default_language = species_language + . = ..() + if(. != INITIALIZE_HINT_QDEL) post_setup(arglist(newargs)) -/mob/living/carbon/human/proc/setup_hud_overlays() +/mob/living/human/proc/setup_hud_overlays() hud_list[HEALTH_HUD] = new /image/hud_overlay('icons/mob/hud_med.dmi', src, "100") hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") @@ -33,27 +45,43 @@ hud_list[SPECIALROLE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") hud_list[STATUS_HUD_OOC] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") -/mob/living/carbon/human/Destroy() +/mob/living/human/Destroy() global.human_mob_list -= src regenerate_body_icon = FALSE // don't bother regenerating if we happen to be queued to update icon worn_underwear = null + + LAZYCLEARLIST(smell_cooldown) + QDEL_NULL(attack_selector) QDEL_NULL(vessel) - . = ..() + QDEL_NULL(touching) -/mob/living/carbon/human/get_ingested_reagents() + if(reagents == bloodstr) + bloodstr = null + else + QDEL_NULL(bloodstr) + + if(loc) + for(var/mob/M in contents) + M.dropInto(loc) + else + for(var/mob/M in contents) + qdel(M) + return ..() + +/mob/living/human/get_ingested_reagents() if(!should_have_organ(BP_STOMACH)) return var/obj/item/organ/internal/stomach/stomach = get_organ(BP_STOMACH) return stomach?.ingested -/mob/living/carbon/human/get_inhaled_reagents() +/mob/living/human/get_inhaled_reagents() if(!should_have_organ(BP_LUNGS)) return var/obj/item/organ/internal/lungs/lungs = get_organ(BP_LUNGS) return lungs?.inhaled -/mob/living/carbon/human/Stat() +/mob/living/human/Stat() . = ..() if(statpanel("Status")) @@ -88,7 +116,7 @@ cell_status = "[rig.cell.charge]/[rig.cell.maxcharge]" stat(null, "Hardsuit charge: [cell_status]") -/mob/living/carbon/human/proc/implant_loyalty(mob/living/carbon/human/M, override = FALSE) // Won't override by default. +/mob/living/human/proc/implant_loyalty(mob/living/human/M, override = FALSE) // Won't override by default. if(!get_config_value(/decl/config/toggle/use_loyalty_implants) && !override) return // Nuh-uh. var/obj/item/implant/loyalty/L = new/obj/item/implant/loyalty(M) @@ -99,7 +127,7 @@ L.part = affected L.implanted(src) -/mob/living/carbon/human/proc/is_loyalty_implanted(mob/living/carbon/human/M) +/mob/living/human/proc/is_loyalty_implanted(mob/living/human/M) for(var/L in M.contents) if(istype(L, /obj/item/implant/loyalty)) for(var/obj/item/organ/external/O in M.get_external_organs()) @@ -107,34 +135,13 @@ return 1 return 0 -/mob/living/carbon/human/restrained() - if(get_equipped_item(slot_handcuffed_str)) - return 1 - if(grab_restrained()) - return 1 - if (istype(get_equipped_item(slot_wear_suit_str), /obj/item/clothing/suit/straight_jacket)) - return 1 - return 0 - -/mob/living/carbon/human/proc/grab_restrained() - for (var/obj/item/grab/G in grabbed_by) - if(G.restrains()) - return TRUE - -/mob/living/carbon/human/get_additional_stripping_options() +/mob/living/human/get_additional_stripping_options() . = ..() for(var/entry in worn_underwear) var/obj/item/underwear/UW = entry - LAZYADD(., "
    Remove \the [UW]") - + LAZYADD(., "
    Remove \the [UW]") -// TODO: remove when is_husked is moved to a parent type (or if husking is removed) -/mob/living/carbon/human/identity_is_visible() - if(is_husked()) - return FALSE - return ..() - -/mob/living/carbon/human/OnSelfTopic(href_list) +/mob/living/human/OnSelfTopic(href_list) if (href_list["lookitem"]) var/obj/item/I = locate(href_list["lookitem"]) if(I) @@ -149,12 +156,12 @@ return ..() -/mob/living/carbon/human/CanUseTopic(mob/user, datum/topic_state/state, href_list) +/mob/living/human/CanUseTopic(mob/user, datum/topic_state/state, href_list) . = ..() if(href_list && (href_list["refresh"] || href_list["item"])) return min(., ..(user, global.physical_topic_state, href_list)) -/mob/living/carbon/human/OnTopic(mob/user, href_list) +/mob/living/human/OnTopic(mob/user, href_list) if (href_list["criminal"]) if(hasHUD(user, HUD_SECURITY)) @@ -183,7 +190,7 @@ spawn() BITSET(hud_updateflag, WANTED_HUD) if(ishuman(user)) - var/mob/living/carbon/human/U = user + var/mob/living/human/U = user U.handle_regular_hud_updates() if(isrobot(user)) var/mob/living/silicon/robot/U = user @@ -241,7 +248,7 @@ spawn() if(ishuman(user)) - var/mob/living/carbon/human/U = user + var/mob/living/human/U = user U.handle_regular_hud_updates() if(isrobot(user)) var/mob/living/silicon/robot/U = user @@ -280,7 +287,7 @@ return ..() -/mob/living/carbon/human/update_flavor_text(key) +/mob/living/human/update_flavor_text(key) var/msg switch(key) if("done") @@ -297,22 +304,14 @@ flavor_texts[key] = msg set_flavor() -/mob/living/carbon/human/proc/get_darksight_range() - var/decl/bodytype/root_bodytype = get_bodytype() - if(root_bodytype.vision_organ) - var/obj/item/organ/internal/eyes/I = get_organ(root_bodytype.vision_organ, /obj/item/organ/internal/eyes) - if(istype(I)) - return I.get_darksight_range() - return root_bodytype.eye_darksight_range - -/mob/living/carbon/human/abiotic(var/full_body = TRUE) +/mob/living/human/abiotic(var/full_body = TRUE) if(full_body) for(var/slot in list(slot_head_str, slot_shoes_str, slot_w_uniform_str, slot_wear_suit_str, slot_glasses_str, slot_l_ear_str, slot_r_ear_str, slot_gloves_str)) if(get_equipped_item(slot)) return FALSE return ..() -/mob/living/carbon/human/empty_stomach() +/mob/living/human/empty_stomach() SET_STATUS_MAX(src, STAT_STUN, 3) var/obj/item/organ/internal/stomach/stomach = get_organ(BP_STOMACH, /obj/item/organ/internal/stomach) @@ -349,9 +348,9 @@ handle_additional_vomit_reagents(splat) splat.update_icon() -/mob/living/carbon/human/proc/vomit(var/timevomit = 1, var/level = 3, var/deliberate = FALSE) +/mob/living/human/proc/vomit(var/timevomit = 1, var/level = 3, var/deliberate = FALSE) - set waitfor = 0 + set waitfor = FALSE if(!check_has_mouth() || isSynthetic() || !timevomit || !level || stat == DEAD || lastpuke) return @@ -380,19 +379,17 @@ sleep(350) //wait 35 seconds before next volley lastpuke = FALSE -/mob/living/carbon/human/proc/increase_germ_level(n) +/mob/living/human/proc/increase_germ_level(n) var/obj/item/gloves = get_equipped_item(slot_gloves_str) if(gloves) gloves.germ_level += n else germ_level += n -/mob/living/carbon/human/revive() - +/mob/living/human/revive() get_bodytype().create_missing_organs(src) // Reset our organs/limbs. restore_all_organs() // Reapply robotics/amputated status from preferences. reset_blood() - if(!client || !key) //Don't boot out anyone already in the mob. for(var/mob/living/brain/brain in global.player_list) // This is really nasty, does it even work anymore? if(brain.real_name == src.real_name && brain.mind) @@ -400,7 +397,6 @@ qdel(brain.loc) break ticks_since_last_successful_breath = 0 - UpdateAppearance() ..() /mob/living/add_blood(mob/living/M, amount = 2, list/blood_data) @@ -411,10 +407,10 @@ bloodied |= grabber.add_blood(M, amount, blood_data) if(bloodied) update_equipment_overlay(slot_gloves_str) //handles bloody hands overlays and updating - verbs += /mob/living/carbon/human/proc/bloody_doodle + verbs += /mob/living/human/proc/bloody_doodle return 1 //we applied blood to the item -/mob/living/carbon/human/get_visible_implants(var/class = 0) +/mob/living/human/get_visible_implants(var/class = 0) var/list/visible_implants = list() for(var/obj/item/organ/external/organ in get_external_organs()) @@ -424,14 +420,14 @@ return(visible_implants) -/mob/living/carbon/human/embedded_needs_process() +/mob/living/human/embedded_needs_process() for(var/obj/item/organ/external/organ in src.get_external_organs()) for(var/obj/item/O in organ.implants) if(!istype(O, /obj/item/implant)) //implant type items do not cause embedding effects, see handle_embedded_objects() return 1 return 0 -/mob/living/carbon/human/handle_embedded_and_stomach_objects() +/mob/living/human/handle_embedded_and_stomach_objects() if(embedded_flag) for(var/obj/item/organ/external/organ in get_external_organs()) @@ -454,7 +450,7 @@ else jostle_internal_object(parent, O) -/mob/living/carbon/human/proc/jostle_internal_object(var/obj/item/organ/external/organ, var/obj/item/O) +/mob/living/human/proc/jostle_internal_object(var/obj/item/organ/external/organ, var/obj/item/O) // All kinds of embedded objects cause bleeding. if(!organ.can_feel_pain()) to_chat(src, SPAN_DANGER("You feel [O] moving inside your [organ.name].")) @@ -466,7 +462,11 @@ custom_pain(msg,40,affecting = organ) organ.take_external_damage(rand(1,3) + O.w_class, DAM_EDGE, 0) -/mob/living/carbon/human/proc/set_bodytype(var/decl/bodytype/new_bodytype) +/mob/proc/set_bodytype(var/decl/bodytype/new_bodytype) + return + +/mob/living/human/set_bodytype(var/decl/bodytype/new_bodytype) + var/decl/bodytype/old_bodytype = get_bodytype() if(ispath(new_bodytype)) new_bodytype = GET_DECL(new_bodytype) @@ -486,10 +486,13 @@ update_eyes() return TRUE +/mob/proc/set_species(var/new_species_name, var/new_bodytype = null) + return + //set_species should not handle the entirety of initing the mob, and should not trigger deep updates //It focuses on setting up species-related data, without force applying them uppon organs and the mob's appearance. // For transforming an existing mob, look at change_species() -/mob/living/carbon/human/proc/set_species(var/new_species_name, var/new_bodytype = null) +/mob/living/human/set_species(var/new_species_name, var/new_bodytype = null) if(!new_species_name) CRASH("set_species on mob '[src]' was passed a null species name '[new_species_name]'!") var/new_species = get_species_by_key(new_species_name) @@ -505,8 +508,6 @@ //Update our species species = new_species - if(dna) - dna.species = new_species_name holder_type = null if(species.holder_type) holder_type = species.holder_type @@ -551,8 +552,9 @@ return TRUE + //Syncs cultural tokens to the currently set species, and may trigger a language update -/mob/living/carbon/human/proc/apply_species_cultural_info() +/mob/living/human/proc/apply_species_cultural_info() var/update_lang for(var/token in ALL_CULTURAL_TAGS) if(species.force_cultural_info && species.force_cultural_info[token]) @@ -566,7 +568,7 @@ update_languages() //Drop anything that cannot be worn by the current species of the mob -/mob/living/carbon/human/proc/apply_species_inventory_restrictions() +/mob/living/human/proc/apply_species_inventory_restrictions() if(!(get_bodytype().appearance_flags & HAS_UNDERWEAR)) QDEL_NULL_LIST(worn_underwear) @@ -593,7 +595,7 @@ //This handles actually updating our visual appearance // Triggers deep update of limbs and hud -/mob/living/carbon/human/proc/apply_species_appearance() +/mob/living/human/proc/apply_species_appearance() if(!species) icon_state = lowertext(SPECIES_HUMAN) else @@ -605,7 +607,7 @@ hud_reset(TRUE) // Like above, but for bodytype. Not as complicated. -/mob/living/carbon/human/proc/apply_bodytype_appearance() +/mob/living/human/proc/apply_bodytype_appearance() var/decl/bodytype/root_bodytype = get_bodytype() if(!root_bodytype) set_skin_colour(COLOR_BLACK) @@ -632,7 +634,7 @@ reset_offsets() -/mob/living/carbon/human/proc/update_languages() +/mob/living/human/proc/update_languages() if(!length(cultural_info)) log_warning("'[src]'([x], [y], [z]) doesn't have any cultural info set and is attempting to update its language!!") @@ -687,7 +689,7 @@ return thing return FALSE -/mob/living/carbon/human/can_inject(var/mob/user, var/target_zone) +/mob/living/human/can_inject(var/mob/user, var/target_zone) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(src, target_zone) if(!affecting) @@ -709,7 +711,7 @@ return 0 -/mob/living/carbon/human/print_flavor_text(var/shrink = 1) +/mob/living/human/print_flavor_text(var/shrink = 1) var/head_exposed = 1 var/face_exposed = 1 @@ -761,29 +763,19 @@ else return ..() -/mob/living/carbon/human/has_brain() +/mob/living/human/has_brain() . = !!GET_INTERNAL_ORGAN(src, BP_BRAIN) -/mob/living/carbon/human/check_has_eyes() +/mob/living/human/check_has_eyes() var/obj/item/organ/internal/eyes = GET_INTERNAL_ORGAN(src, BP_EYES) . = eyes?.is_usable() -/mob/living/carbon/human/slip(var/slipped_on, stun_duration = 8) - if(species.check_no_slip(src)) - return FALSE - var/obj/item/shoes = get_equipped_item(slot_shoes_str) - if(shoes && (shoes.item_flags & ITEM_FLAG_NOSLIP)) - return FALSE - return !!(..(slipped_on,stun_duration)) - - -/mob/living/carbon/human/reset_view(atom/A, update_hud = 1) +/mob/living/human/reset_view(atom/A, update_hud = 1) ..() if(update_hud) handle_regular_hud_updates() - -/mob/living/carbon/human/can_stand_overridden() +/mob/living/human/can_stand_overridden() if(get_rig()?.ai_can_move_suit(check_for_ai = 1)) // Actually missing a leg will screw you up. Everything else can be compensated for. for(var/limbcheck in list(BP_L_LEG,BP_R_LEG)) @@ -793,8 +785,7 @@ return TRUE return FALSE - -/mob/living/carbon/human/can_devour(atom/movable/victim, var/silent = FALSE) +/mob/living/human/can_devour(atom/movable/victim, var/silent = FALSE) if(!should_have_organ(BP_STOMACH)) return ..() @@ -817,18 +808,19 @@ . = stomach.get_devour_time(victim) || ..() -/mob/living/carbon/human/move_to_stomach(atom/movable/victim) +/mob/living/human/move_to_stomach(atom/movable/victim) var/obj/item/organ/internal/stomach = GET_INTERNAL_ORGAN(src, BP_STOMACH) if(stomach) victim.forceMove(stomach) -/mob/living/carbon/human/get_adjusted_metabolism(metabolism) +/mob/living/human/get_adjusted_metabolism(metabolism) return ..() * (species ? species.metabolism_mod : 1) -/mob/living/carbon/human/is_invisible_to(var/mob/viewer) +/mob/living/human/is_invisible_to(var/mob/viewer) return (is_cloaked() || ..()) -/mob/living/carbon/human/proc/resuscitate() + +/mob/living/human/proc/resuscitate() if(!is_asystole() || !should_have_organ(BP_HEART)) return var/obj/item/organ/internal/heart/heart = get_organ(BP_HEART, /obj/item/organ/internal/heart) @@ -853,23 +845,23 @@ heart.handle_pulse() return TRUE -/mob/living/carbon/human/proc/make_reagent(amount, reagent_type) +/mob/living/human/proc/make_reagent(amount, reagent_type) if(stat == CONSCIOUS) var/limit = max(0, reagents.get_overdose(reagent_type) - REAGENT_VOLUME(reagents, reagent_type)) add_to_reagents(reagent_type, min(amount, limit)) //Get fluffy numbers -/mob/living/carbon/human/proc/get_blood_pressure() +/mob/living/human/proc/get_blood_pressure() if(status_flags & FAKEDEATH) return "[FLOOR(120+rand(-5,5))*0.25]/[FLOOR(80+rand(-5,5)*0.25)]" var/blood_result = get_blood_circulation() return "[FLOOR((120+rand(-5,5))*(blood_result/100))]/[FLOOR((80+rand(-5,5))*(blood_result/100))]" //Point at which you dun breathe no more. Separate from asystole crit, which is heart-related. -/mob/living/carbon/human/nervous_system_failure() +/mob/living/human/nervous_system_failure() return get_damage(BRAIN) >= get_max_health() * 0.75 -/mob/living/carbon/human/melee_accuracy_mods() +/mob/living/human/melee_accuracy_mods() . = ..() if(get_shock() > 50) . += 15 @@ -878,7 +870,7 @@ if(shock_stage > 30) . += 15 -/mob/living/carbon/human/ranged_accuracy_mods() +/mob/living/human/ranged_accuracy_mods() . = ..() if(get_shock() > 10 && !skill_check(SKILL_WEAPONS, SKILL_ADEPT)) . -= 1 @@ -895,12 +887,12 @@ if(skill_check(SKILL_WEAPONS, SKILL_PROF)) . += 2 -/mob/living/carbon/human/fluid_act(var/datum/reagents/fluids) +/mob/living/human/fluid_act(var/datum/reagents/fluids) ..() if(!QDELETED(src) && fluids?.total_volume) species.fluid_act(src, fluids) -/mob/living/carbon/human/proc/set_cultural_value(var/token, var/decl/cultural_info/_culture, var/defer_language_update) +/mob/living/human/proc/set_cultural_value(var/token, var/decl/cultural_info/_culture, var/defer_language_update) if(ispath(_culture, /decl/cultural_info)) _culture = GET_DECL(_culture) if(istype(_culture)) @@ -911,17 +903,17 @@ /mob/living/proc/get_cultural_value(var/token) return null -/mob/living/carbon/human/get_cultural_value(var/token) +/mob/living/human/get_cultural_value(var/token) . = LAZYACCESS(cultural_info, token) if(!istype(., /decl/cultural_info)) . = global.using_map.default_cultural_info[token] PRINT_STACK_TRACE("get_cultural_value() tried to return a non-instance value for token '[token]' - full culture list: [json_encode(cultural_info)] default species culture list: [json_encode(global.using_map.default_cultural_info)]") -/mob/living/carbon/human/get_digestion_product() +/mob/living/human/get_digestion_product() return species.get_digestion_product(src) // A damaged stomach can put blood in your vomit. -/mob/living/carbon/human/handle_additional_vomit_reagents(var/obj/effect/decal/cleanable/vomit/vomit) +/mob/living/human/handle_additional_vomit_reagents(var/obj/effect/decal/cleanable/vomit/vomit) ..() if(should_have_organ(BP_STOMACH)) var/obj/item/organ/internal/stomach = GET_INTERNAL_ORGAN(src, BP_STOMACH) @@ -931,14 +923,7 @@ else reagents.trans_to_obj(vomit, 5) -/mob/living/carbon/human/get_sound_volume_multiplier() - . = ..() - for(var/slot in list(slot_l_ear_str, slot_r_ear_str, slot_head_str)) - var/obj/item/clothing/C = get_equipped_item(slot) - if(istype(C)) - . = min(., C.volume_multiplier) - -/mob/living/carbon/human/get_bullet_impact_effect_type(var/def_zone) +/mob/living/human/get_bullet_impact_effect_type(var/def_zone) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, def_zone) if(!E) return BULLET_IMPACT_NONE @@ -946,7 +931,7 @@ return BULLET_IMPACT_METAL return BULLET_IMPACT_MEAT -/mob/living/carbon/human/lose_hair() +/mob/living/human/lose_hair() if(species.handle_additional_hair_loss(src)) . = TRUE for(var/obj/item/organ/external/E in get_external_organs()) @@ -965,46 +950,43 @@ remove_sprite_accessory(accessory, skip_update = TRUE) . = TRUE -/mob/living/carbon/human/increaseBodyTemp(value) +/mob/living/human/increaseBodyTemp(value) bodytemperature += value return bodytemperature -/mob/living/carbon/human/get_admin_job_string() +/mob/living/human/get_admin_job_string() return job || uppertext(species.name) -/mob/living/carbon/human/can_change_intent() +/mob/living/human/can_change_intent() return TRUE -/mob/living/carbon/human/breathing_hole_covered() +/mob/living/human/breathing_hole_covered() . = ..() if(!.) var/obj/item/head = get_equipped_item(slot_head_str) if(head && (head.item_flags & ITEM_FLAG_AIRTIGHT)) return TRUE -/mob/living/carbon/human/set_internals_to_best_available_tank(var/breathes_gas = /decl/material/gas/oxygen, var/list/poison_gas = list(/decl/material/gas/chlorine)) +/mob/living/human/set_internals_to_best_available_tank(var/breathes_gas = /decl/material/gas/oxygen, var/list/poison_gas = list(/decl/material/gas/chlorine)) . = ..(species.breath_type, species.poison_types) //Sets the mob's real name and update all the proper fields -/mob/living/carbon/human/proc/set_real_name(var/newname) +/mob/living/human/proc/set_real_name(var/newname) if(!newname) return real_name = newname SetName(newname) - if(dna) - dna.real_name = newname if(mind) mind.name = newname //Human mob specific init code. Meant to be used only on init. -/mob/living/carbon/human/proc/setup(species_name = null, datum/dna/new_dna = null, decl/bodytype/new_bodytype = null) - if(new_dna) - species_name = new_dna.species - src.dna = new_dna +/mob/living/human/proc/setup_human(species_name, datum/mob_snapshot/supplied_appearance) + if(supplied_appearance) + species_name = supplied_appearance.root_species else if(!species_name) species_name = global.using_map.default_species //Humans cannot exist without a species! - set_species(species_name, new_bodytype) + set_species(species_name, supplied_appearance?.root_bodytype) var/decl/bodytype/root_bodytype = get_bodytype() // root bodytype is set in set_species if(!get_skin_colour()) set_skin_colour(root_bodytype.base_color, skip_update = TRUE) @@ -1015,23 +997,23 @@ if(!blood_type && length(species?.blood_types)) blood_type = pickweight(species.blood_types) - if(new_dna) - set_real_name(new_dna.real_name) + if(supplied_appearance) + set_real_name(supplied_appearance.real_name) else try_generate_default_name() - dna.ready_dna(src) //regen dna filler only if we haven't forced the dna already species.handle_pre_spawn(src) apply_species_cultural_info() species.handle_post_spawn(src) - UpdateAppearance() //Apply dna appearance to mob, causes DNA to change because filler values are regenerated + supplied_appearance?.apply_appearance_to(src) + //Prevent attempting to create blood container if its already setup if(!vessel) reset_blood() //If the mob has its default name it'll try to generate /obtain a proper one -/mob/living/carbon/human/proc/try_generate_default_name() +/mob/living/human/proc/try_generate_default_name() if(name != initial(name)) return if(species) @@ -1040,18 +1022,18 @@ SetName(initial(name)) //Runs last after setup and after the parent init has been executed. -/mob/living/carbon/human/proc/post_setup(var/species_name = null, var/datum/dna/new_dna = null) +/mob/living/human/proc/post_setup(species_name, datum/mob_snapshot/supplied_appearance) try_refresh_visible_overlays() //Do this exactly once per setup -/mob/living/carbon/human/handle_flashed(var/obj/item/flash/flash, var/flash_strength) +/mob/living/human/handle_flashed(var/obj/item/flash/flash, var/flash_strength) var/safety = eyecheck() if(safety < FLASH_PROTECTION_MODERATE) - flash_strength = round(getFlashMod() * flash_strength) + flash_strength = round(get_flash_mod() * flash_strength) if(safety > FLASH_PROTECTION_NONE) flash_strength = (flash_strength / 2) . = ..() -/mob/living/carbon/human/handle_nutrition_and_hydration() +/mob/living/human/handle_nutrition_and_hydration() ..() // Apply stressors. @@ -1079,20 +1061,20 @@ else remove_stressor(/datum/stressor/thirsty) -/mob/living/carbon/human/get_comments_record() +/mob/living/human/get_comments_record() if(comments_record_id) return SScharacter_info.get_record(comments_record_id, TRUE) return ..() -/mob/living/carbon/human/proc/get_age() +/mob/living/human/proc/get_age() . = LAZYACCESS(appearance_descriptors, "age") || 30 -/mob/living/carbon/human/proc/set_age(var/val) +/mob/living/human/proc/set_age(var/val) var/decl/bodytype/bodytype = get_bodytype() var/datum/appearance_descriptor/age = LAZYACCESS(bodytype.appearance_descriptors, "age") LAZYSET(appearance_descriptors, "age", (age ? age.sanitize_value(val) : 30)) -/mob/living/carbon/human/HandleBloodTrail(turf/T, old_loc) +/mob/living/human/HandleBloodTrail(turf/T, old_loc) // Tracking blood var/obj/item/source var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) @@ -1126,11 +1108,11 @@ var/turf/old_turf = old_loc old_turf.AddTracks(species.get_move_trail(src), bloodDNA, 0, dir, bloodcolor) // Going -/mob/living/carbon/human/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) +/mob/living/human/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) if((. = ..()) && !surgical_removal) shock_stage += 20 -/mob/living/carbon/human/proc/has_footsteps() +/mob/living/human/proc/has_footsteps() if(species.silent_steps || buckled || current_posture.prone || throwing) return //people flying, lying down or sitting do not step @@ -1143,7 +1125,7 @@ return TRUE -/mob/living/carbon/human/handle_footsteps() +/mob/living/human/handle_footsteps() step_count++ if(!has_footsteps()) return @@ -1182,5 +1164,52 @@ if(volume > 0 && range > 0) playsound(T, footsound, volume, 1, range) -/mob/living/carbon/human/try_awaken(mob/user) +/mob/living/human/get_skin_tone(value) + return skin_tone + +/mob/living/human/set_skin_tone(value) + skin_tone = value + +/mob/living/human/try_awaken(mob/user) return !is_asystole() && ..() + +/mob/living/human/get_satiated_nutrition() + return 350 + +/mob/living/human/get_max_nutrition() + return 400 + +/mob/living/human/get_max_hydration() + return 400 + +/mob/living/human/get_species() + RETURN_TYPE(/decl/species) + return species + +/mob/living/human/get_contact_reagents() + return touching + +/mob/living/human/get_injected_reagents() + return bloodstr + +/mob/living/human/Bump(var/atom/movable/AM, yes) + if(now_pushing || !yes) + return + ..() + +/mob/living/human/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() + var/temp_inc = max(min(BODYTEMP_HEATING_MAX*(1-get_heat_protection()), exposed_temperature - bodytemperature), 0) + bodytemperature += temp_inc + +/mob/living/human/currently_has_skin() + return currently_has_meat() + +/mob/living/human/currently_has_innards() + return length(get_internal_organs()) + +/mob/living/human/currently_has_meat() + for(var/obj/item/organ/external/limb in get_external_organs()) + if(istype(limb.material, /decl/material/solid/organic/meat)) + return TRUE + return FALSE diff --git a/code/modules/mob/living/carbon/human/human_appearance.dm b/code/modules/mob/living/human/human_appearance.dm similarity index 76% rename from code/modules/mob/living/carbon/human/human_appearance.dm rename to code/modules/mob/living/human/human_appearance.dm index c307ef22184..ca0dddcea7e 100644 --- a/code/modules/mob/living/carbon/human/human_appearance.dm +++ b/code/modules/mob/living/human/human_appearance.dm @@ -1,22 +1,23 @@ -/mob/living/carbon/human +/mob/living/human var/_skin_colour -/mob/living/carbon/human/proc/change_appearance(var/flags = APPEARANCE_ALL_HAIR, var/location = src, var/mob/user = src, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list(), var/datum/topic_state/state = global.default_topic_state) +/mob/living/human/proc/change_appearance(var/flags = APPEARANCE_ALL_HAIR, var/location = src, var/mob/user = src, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list(), var/datum/topic_state/state = global.default_topic_state) var/datum/nano_module/appearance_changer/AC = new(location, src, check_species_whitelist, species_whitelist, species_blacklist) AC.flags = flags AC.ui_interact(user, state = state) -/mob/living/carbon/human/get_skin_colour() +/mob/living/human/get_skin_colour() return _skin_colour -/mob/living/carbon/human/set_skin_colour(var/new_color, var/skip_update = FALSE) +/mob/living/human/set_skin_colour(var/new_color, var/skip_update = FALSE) if((. = ..())) _skin_colour = new_color if(!skip_update) force_update_limbs() update_body() -/mob/living/carbon/human/proc/change_species(var/new_species, var/new_bodytype = null) +/mob/living/human/proc/change_species(var/new_species, var/new_bodytype = null) + if(!new_species) return @@ -27,11 +28,9 @@ return set_species(new_species, new_bodytype) - dna.ready_dna(src) //Handle spawning stuff species.handle_pre_spawn(src) - UpdateAppearance() apply_species_appearance() apply_bodytype_appearance() apply_species_cultural_info() @@ -47,17 +46,16 @@ try_refresh_visible_overlays() return 1 -/mob/living/carbon/human/set_gender(var/new_gender, var/update_body = FALSE) +/mob/living/human/set_gender(var/new_gender, var/update_body = FALSE) . = ..() if(. && update_body) update_body() - update_dna() -/mob/living/carbon/human/proc/randomize_gender() +/mob/living/human/proc/randomize_gender() var/decl/pronouns/pronouns = pick(species.available_pronouns) set_gender(pronouns.name, TRUE) -/mob/living/carbon/human/proc/reset_hair() +/mob/living/human/proc/reset_hair() var/decl/bodytype/root_bodytype = get_bodytype() var/decl/sprite_accessory_category/hair/hair_category = GET_DECL(SAC_HAIR) var/list/valid_hairstyles = species?.get_available_accessories(root_bodytype, SAC_HAIR) @@ -84,7 +82,7 @@ update_hair() -/mob/living/carbon/human/proc/change_skin_tone(var/tone) +/mob/living/human/proc/change_skin_tone(var/tone) if(skin_tone == tone || !(get_bodytype().appearance_flags & HAS_A_SKIN_TONE)) return skin_tone = tone @@ -92,11 +90,7 @@ update_body() return 1 -/mob/living/carbon/human/proc/update_dna() - check_dna() - dna.ready_dna(src) - -/mob/living/carbon/human/proc/generate_valid_species(var/check_whitelist = 1, var/list/whitelist = list(), var/list/blacklist = list()) +/mob/living/human/proc/generate_valid_species(var/check_whitelist = 1, var/list/whitelist = list(), var/list/blacklist = list()) var/list/valid_species = new() for(var/current_species_name in get_all_species()) var/decl/species/current_species = get_species_by_key(current_species_name) @@ -114,8 +108,3 @@ valid_species += current_species_name return valid_species - -/mob/living/carbon/human/proc/force_update_limbs() - for(var/obj/item/organ/external/O in get_external_organs()) - O.sync_colour_to_human(src) - update_body(0) diff --git a/code/modules/mob/living/carbon/human/human_appearance_head.dm b/code/modules/mob/living/human/human_appearance_head.dm similarity index 53% rename from code/modules/mob/living/carbon/human/human_appearance_head.dm rename to code/modules/mob/living/human/human_appearance_head.dm index d60fc877013..f5ed43182da 100644 --- a/code/modules/mob/living/carbon/human/human_appearance_head.dm +++ b/code/modules/mob/living/human/human_appearance_head.dm @@ -1,11 +1,11 @@ -/mob/living/carbon/human +/mob/living/human var/_eye_colour // Eyes! TODO, make these a marking. -/mob/living/carbon/human/get_eye_colour() +/mob/living/human/get_eye_colour() return _eye_colour -/mob/living/carbon/human/set_eye_colour(var/new_color, var/skip_update = FALSE) +/mob/living/human/set_eye_colour(var/new_color, var/skip_update = FALSE) if((. = ..())) _eye_colour = new_color if(!skip_update) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/human/human_attackhand.dm similarity index 95% rename from code/modules/mob/living/carbon/human/human_attackhand.dm rename to code/modules/mob/living/human/human_attackhand.dm index 1cd230c8c13..ed057dcb330 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/human/human_attackhand.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/proc/get_unarmed_attack(var/mob/target, var/hit_zone = null) +/mob/living/human/proc/get_unarmed_attack(var/mob/target, var/hit_zone = null) if(!hit_zone) hit_zone = get_target_zone() var/list/available_attacks = get_natural_attacks() @@ -18,13 +18,13 @@ use_attack = pick(other_attacks) . = use_attack?.resolve_to_soft_variant(src) -/mob/living/carbon/human/proc/get_natural_attacks() +/mob/living/human/proc/get_natural_attacks() . = list() for(var/obj/item/organ/external/limb in get_external_organs()) if(length(limb.unarmed_attacks) && limb.is_usable()) . |= limb.unarmed_attacks -/mob/living/carbon/human/default_help_interaction(mob/user) +/mob/living/human/default_help_interaction(mob/user) if(user != src) if(ishuman(user) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath) && !on_fire && !(user.get_target_zone() == BP_R_ARM || user.get_target_zone() == BP_L_ARM)) @@ -96,7 +96,7 @@ show_message("My [org.name] is OK.",1) return TRUE -/mob/living/carbon/human/default_disarm_interaction(mob/user) +/mob/living/human/default_disarm_interaction(mob/user) var/decl/species/user_species = user.get_species() if(user_species) admin_attack_log(user, src, "Disarmed their victim.", "Was disarmed.", "disarmed") @@ -104,7 +104,7 @@ return TRUE . = ..() -/mob/living/carbon/human/default_hurt_interaction(mob/user) +/mob/living/human/default_hurt_interaction(mob/user) . = ..() if(.) return TRUE @@ -117,7 +117,7 @@ attack_generic(user, rand(1,3), "punched") return TRUE - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/rand_damage = rand(1, 5) var/block = 0 var/accurate = 0 @@ -219,7 +219,7 @@ apply_damage(real_damage, attack.get_damage_type(), hit_zone, damage_flags=attack.damage_flags()) return TRUE -/mob/living/carbon/human/attack_hand(mob/user) +/mob/living/human/attack_hand(mob/user) remove_cloaking_source(species) if(user.a_intent != I_GRAB) @@ -227,7 +227,7 @@ if(G.assailant == user && G.affecting == src && G.resolve_openhand_attack()) return TRUE // Should this all be in Touch()? - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(istype(H)) if(H != src && check_shields(0, null, H, H.get_target_zone(), H.name)) H.do_attack_animation(src) @@ -235,7 +235,7 @@ return ..() -/mob/living/carbon/human/proc/start_compressions(mob/living/carbon/human/H, starting = FALSE, cpr_mode) +/mob/living/human/proc/start_compressions(mob/living/human/H, starting = FALSE, cpr_mode) if(length(H.get_held_items())) performing_cpr = FALSE to_chat(H, SPAN_WARNING("You cannot perform CPR with anything in your hands.")) @@ -334,7 +334,7 @@ start_compressions(H, FALSE, cpr_mode) //Breaks all grips and pulls that the mob currently has. -/mob/living/carbon/human/proc/break_all_grabs(mob/living/carbon/user) +/mob/living/human/proc/break_all_grabs(mob/living/user) . = FALSE for(var/obj/item/grab/grab in get_active_grabs()) if(grab.affecting) @@ -350,7 +350,7 @@ If you are applying pressure to another and attempt to apply pressure to yourself, you'll have to switch to an empty hand which will also stop do_mob() Changing targeted zones should also stop do_mob(), preventing you from applying pressure to more than one body part at once. */ -/mob/living/carbon/human/proc/apply_pressure(mob/living/user, var/target_zone) +/mob/living/human/proc/apply_pressure(mob/living/user, var/target_zone) var/obj/item/organ/external/organ = GET_EXTERNAL_ORGAN(src, target_zone) if(!organ || !(organ.status & (ORGAN_BLEEDING|ORGAN_ARTERY_CUT)) || BP_IS_PROSTHETIC(organ)) return 0 @@ -389,7 +389,7 @@ return 1 -/mob/living/carbon/human/verb/set_default_unarmed_attack() +/mob/living/human/verb/set_default_unarmed_attack() set name = "Set Default Unarmed Attack" set category = "IC" diff --git a/code/modules/mob/living/carbon/human/human_blood.dm b/code/modules/mob/living/human/human_blood.dm similarity index 87% rename from code/modules/mob/living/carbon/human/human_blood.dm rename to code/modules/mob/living/human/human_blood.dm index 606fe303b89..7e8d636e51f 100644 --- a/code/modules/mob/living/carbon/human/human_blood.dm +++ b/code/modules/mob/living/human/human_blood.dm @@ -1,8 +1,8 @@ -/mob/living/carbon/human +/mob/living/human var/datum/reagents/vessel // Container for blood and BLOOD ONLY. Do not transfer other chems here. //Initializes blood vessels -/mob/living/carbon/human/proc/make_blood() +/mob/living/human/proc/make_blood() if(vessel) return vessel = new /datum/reagents(species.blood_volume, src) @@ -11,7 +11,7 @@ reset_blood() //Modifies blood level -/mob/living/carbon/human/proc/adjust_blood(var/amt, var/blood_data) +/mob/living/human/proc/adjust_blood(var/amt, var/blood_data) if(!vessel) make_blood() @@ -25,7 +25,7 @@ vessel.remove_any(abs(amt)) //Resets blood data -/mob/living/carbon/human/proc/reset_blood() +/mob/living/human/proc/reset_blood() if(!vessel) make_blood() @@ -51,7 +51,7 @@ )) //Makes a blood drop, leaking amt units of blood from the mob -/mob/living/carbon/human/proc/drip(var/amt, var/tar = src, var/ddir) +/mob/living/human/proc/drip(var/amt, var/tar = src, var/ddir) var/datum/reagents/bloodstream = get_injected_reagents() if(remove_blood(amt)) if(bloodstream.total_volume && vessel.total_volume) @@ -62,7 +62,7 @@ return 0 #define BLOOD_SPRAY_DISTANCE 2 -/mob/living/carbon/human/proc/blood_squirt(var/amt, var/turf/sprayloc) +/mob/living/human/proc/blood_squirt(var/amt, var/turf/sprayloc) if(amt <= 0 || !istype(sprayloc)) return var/spraydir = pick(global.alldirs) @@ -87,7 +87,7 @@ break if(ishuman(A)) - var/mob/living/carbon/human/H = A + var/mob/living/human/H = A if(!H.current_posture.prone) H.bloody_body(src) H.bloody_hands(src) @@ -121,16 +121,17 @@ return bled #undef BLOOD_SPRAY_DISTANCE -/mob/living/carbon/human/proc/remove_blood(var/amt) +/mob/living/human/remove_blood(amt, absolute = FALSE) if(!should_have_organ(BP_HEART)) //TODO: Make drips come from the reagents instead. return 0 if(!amt) return 0 - amt *= ((src.mob_size/MOB_SIZE_MEDIUM) ** 0.5) + if(!absolute) + amt *= ((src.mob_size/MOB_SIZE_MEDIUM) ** 0.5) return vessel.remove_any(amt) //Transfers blood from reagents to vessel, respecting blood types compatability. -/mob/living/carbon/human/inject_blood(var/amount, var/datum/reagents/donor) +/mob/living/human/inject_blood(var/amount, var/datum/reagents/donor) if(!should_have_organ(BP_HEART)) add_to_reagents(species.blood_reagent, amount, REAGENT_DATA(donor, species.blood_reagent)) return @@ -146,7 +147,7 @@ adjust_blood(amount, injected_data) ..() -/mob/living/carbon/human/proc/regenerate_blood(var/amount) +/mob/living/human/proc/regenerate_blood(var/amount) amount *= (species.blood_volume / SPECIES_BLOOD_DEFAULT) var/stress_modifier = get_stress_modifier() @@ -160,7 +161,7 @@ return amount //For humans, blood does not appear from blue, it comes from vessels. -/mob/living/carbon/human/take_blood(obj/item/chems/container, var/amount) +/mob/living/human/take_blood(obj/item/chems/container, var/amount) if(!vessel) make_blood() @@ -177,16 +178,18 @@ return 1 //Percentage of maximum blood volume. -/mob/living/carbon/human/proc/get_blood_volume() - return species.blood_volume? round((vessel.total_volume/species.blood_volume)*100) : 0 +/mob/living/human/proc/get_blood_volume() + return species.blood_volume ? round((vessel.total_volume/species.blood_volume)*100) : 0 //Percentage of maximum blood volume, affected by the condition of circulation organs -/mob/living/carbon/human/proc/get_blood_circulation() +/mob/living/human/proc/get_blood_circulation() + + var/obj/item/organ/internal/heart/heart = get_organ(BP_HEART, /obj/item/organ/internal/heart) - var/blood_volume = get_blood_volume() if(!heart) - return 0.25 * blood_volume + return 0.25 * get_blood_volume() + var/blood_volume = get_blood_volume() var/recent_pump = LAZYACCESS(heart.external_pump, 1) > world.time - (20 SECONDS) var/pulse_mod = 1 if((status_flags & FAKEDEATH) || BP_IS_PROSTHETIC(heart)) @@ -205,24 +208,22 @@ if(PULSE_2FAST, PULSE_THREADY) pulse_mod *= 1.25 blood_volume *= pulse_mod - if(current_posture.prone) blood_volume *= 1.25 var/min_efficiency = recent_pump ? 0.5 : 0.3 blood_volume *= max(min_efficiency, (1-(heart.damage / heart.max_damage))) - if(!heart.open && has_chemical_effect(CE_BLOCKAGE, 1)) blood_volume *= max(0, 1-GET_CHEMICAL_EFFECT(src, CE_BLOCKAGE)) return min(blood_volume, 100) //Whether the species needs blood to carry oxygen. Used in get_blood_oxygenation and may be expanded based on blood rather than species in the future. -/mob/living/carbon/human/proc/blood_carries_oxygen() +/mob/living/human/proc/blood_carries_oxygen() return species.blood_oxy //Percentage of maximum blood volume, affected by the condition of circulation organs, affected by the oxygen loss. What ultimately matters for brain -/mob/living/carbon/human/proc/get_blood_oxygenation() +/mob/living/human/proc/get_blood_oxygenation() var/blood_volume = get_blood_circulation() if(blood_carries_oxygen()) if(is_asystole()) // Heart is missing or isn't beating and we're not breathing (hardcrit) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/human/human_damage.dm similarity index 69% rename from code/modules/mob/living/carbon/human/human_damage.dm rename to code/modules/mob/living/human/human_damage.dm index ea5f04ad075..c1d05b7c6ab 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/human/human_damage.dm @@ -1,24 +1,24 @@ -/mob/living/carbon/human/get_life_damage_types() - var/static/list/life_damage_types = list( +/mob/living/human/get_life_damage_types() + var/static/list/brain_life_damage_types = list( BRAIN ) - return life_damage_types + return brain_life_damage_types //Updates the mob's health from organs and mob damage variables -/mob/living/carbon/human/update_health() +/mob/living/human/update_health() . = ..() //TODO: fix husking if(. && stat == DEAD && (get_damage(BRUTE) - get_damage(BURN)) < get_config_value(/decl/config/num/health_health_threshold_dead)) - make_husked() + add_genetic_condition(GENE_COND_HUSK) -/mob/living/carbon/human/adjustBrainLoss(var/amount, var/do_update_health = TRUE) +/mob/living/human/adjustBrainLoss(var/amount, var/do_update_health = TRUE) if(!(status_flags & GODMODE) && should_have_organ(BP_BRAIN)) var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(src, BP_BRAIN) if(sponge) sponge.take_internal_damage(amount) ..() -/mob/living/carbon/human/setBrainLoss(var/amount) +/mob/living/human/setBrainLoss(var/amount) if(status_flags & GODMODE) return 0 //godmode if(should_have_organ(BP_BRAIN)) var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(src, BP_BRAIN) @@ -26,7 +26,7 @@ sponge.damage = min(max(amount, 0),sponge.species.total_health) update_health() -/mob/living/carbon/human/getBrainLoss() +/mob/living/human/getBrainLoss() if(status_flags & GODMODE) return 0 //godmode if(should_have_organ(BP_BRAIN)) var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(src, BP_BRAIN) @@ -40,17 +40,17 @@ return 0 //Straight pain values, not affected by painkillers etc -/mob/living/carbon/human/getHalLoss() +/mob/living/human/getHalLoss() if(isnull(last_pain)) last_pain = 0 for(var/obj/item/organ/external/E in get_external_organs()) last_pain += E.get_pain() return last_pain -/mob/living/carbon/human/setHalLoss(var/amount) +/mob/living/human/setHalLoss(var/amount) take_damage(get_damage(PAIN)-amount, PAIN) -/mob/living/carbon/human/adjustHalLoss(var/amount, var/do_update_health = TRUE) +/mob/living/human/adjustHalLoss(var/amount, var/do_update_health = TRUE) var/heal = (amount < 0) amount = abs(amount) var/list/limbs = get_external_organs() @@ -71,7 +71,7 @@ update_health() //These procs fetch a cumulative total damage from all organs -/mob/living/carbon/human/getBruteLoss() +/mob/living/human/getBruteLoss() var/amount = 0 for(var/obj/item/organ/external/O in get_external_organs()) if(BP_IS_PROSTHETIC(O) && !O.is_vital_to_owner()) @@ -79,7 +79,7 @@ amount += O.brute_dam return amount -/mob/living/carbon/human/getFireLoss() +/mob/living/human/getFireLoss() var/amount = 0 for(var/obj/item/organ/external/O in get_external_organs()) if(BP_IS_PROSTHETIC(O) && !O.is_vital_to_owner()) @@ -87,7 +87,7 @@ amount += O.burn_dam return amount -/mob/living/carbon/human/adjustBruteLoss(var/amount, var/do_update_health = TRUE) +/mob/living/human/adjustBruteLoss(var/amount, var/do_update_health = TRUE) SHOULD_CALL_PARENT(FALSE) // take/heal overall call update_health regardless of arg if(amount > 0) take_overall_damage(amount, 0) @@ -95,23 +95,23 @@ heal_overall_damage(-amount, 0) BITSET(hud_updateflag, HEALTH_HUD) -/mob/living/carbon/human/adjustFireLoss(var/amount, var/do_update_health = TRUE) +/mob/living/human/adjustFireLoss(var/amount, var/do_update_health = TRUE) if(amount > 0) take_overall_damage(0, amount) else heal_overall_damage(0, -amount) BITSET(hud_updateflag, HEALTH_HUD) -/mob/living/carbon/human/getCloneLoss() +/mob/living/human/getCloneLoss() var/amount = 0 for(var/obj/item/organ/external/E in get_external_organs()) amount += E.get_genetic_damage() return amount -/mob/living/carbon/human/setCloneLoss(var/amount) +/mob/living/human/setCloneLoss(var/amount) take_damage(get_damage(CLONE)-amount, CLONE) -/mob/living/carbon/human/adjustCloneLoss(var/amount, var/do_update_health = TRUE) +/mob/living/human/adjustCloneLoss(var/amount, var/do_update_health = TRUE) var/heal = amount < 0 amount = abs(amount) var/list/limbs = get_external_organs() @@ -127,19 +127,19 @@ BITSET(hud_updateflag, HEALTH_HUD) ..() -/mob/living/carbon/human/proc/getOxyLossPercent() +/mob/living/human/proc/getOxyLossPercent() return (get_damage(OXY) / species.total_health) * 100 -/mob/living/carbon/human/getOxyLoss() +/mob/living/human/getOxyLoss() if(need_breathe()) var/obj/item/organ/internal/lungs/breathe_organ = get_organ(get_bodytype().breathing_organ, /obj/item/organ/internal/lungs) return breathe_organ ? breathe_organ.oxygen_deprivation : species.total_health return 0 -/mob/living/carbon/human/setOxyLoss(var/amount) +/mob/living/human/setOxyLoss(var/amount) take_damage(amount - get_damage(OXY), OXY) -/mob/living/carbon/human/adjustOxyLoss(var/damage, var/do_update_health = TRUE) +/mob/living/human/adjustOxyLoss(var/damage, var/do_update_health = TRUE) . = FALSE if(need_breathe()) var/obj/item/organ/internal/lungs/breathe_organ = get_organ(get_bodytype().breathing_organ, /obj/item/organ/internal/lungs) @@ -149,7 +149,7 @@ . = TRUE ..(do_update_health = FALSE) // Oxyloss cannot directly kill humans -/mob/living/carbon/human/getToxLoss() +/mob/living/human/getToxLoss() if((species.species_flags & SPECIES_FLAG_NO_POISON) || isSynthetic()) return 0 var/amount = 0 @@ -157,12 +157,12 @@ amount += I.getToxLoss() return amount -/mob/living/carbon/human/setToxLoss(var/amount) +/mob/living/human/setToxLoss(var/amount) if(!(species.species_flags & SPECIES_FLAG_NO_POISON) && !isSynthetic()) take_damage(get_damage(TOX)-amount, TOX) // TODO: better internal organ damage procs. -/mob/living/carbon/human/adjustToxLoss(var/amount, var/do_update_health = TRUE) +/mob/living/human/adjustToxLoss(var/amount, var/do_update_health = TRUE) if((species.species_flags & SPECIES_FLAG_NO_POISON) || isSynthetic()) return @@ -218,7 +218,7 @@ if(do_update_health) update_health() -/mob/living/carbon/human/proc/can_autoheal(var/dam_type) +/mob/living/human/proc/can_autoheal(var/dam_type) if(!species || !dam_type) return FALSE if(dam_type == BRUTE || dam_type == BURN) @@ -228,7 +228,7 @@ //////////////////////////////////////////// //Returns a list of damaged organs -/mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn) +/mob/living/human/proc/get_damaged_organs(var/brute, var/burn) var/list/obj/item/organ/external/parts = list() for(var/obj/item/organ/external/O in get_external_organs()) if((brute && O.brute_dam) || (burn && O.burn_dam)) @@ -236,7 +236,7 @@ return parts //Returns a list of damageable organs -/mob/living/carbon/human/proc/get_damageable_organs() +/mob/living/human/proc/get_damageable_organs() var/list/obj/item/organ/external/parts = list() for(var/obj/item/organ/external/O in get_external_organs()) if(O.is_damageable()) @@ -246,7 +246,7 @@ //Heals ONE external organ, organ gets randomly selected from damaged ones. //It automatically updates damage overlays if necesary //It automatically updates health status -/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE, var/update_health = TRUE) +/mob/living/human/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE, var/update_health = TRUE) var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn) if(!parts.len) return var/obj/item/organ/external/picked = pick(parts) @@ -263,7 +263,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t //Damages ONE external organ, organ gets randomly selected from damagable ones. //It automatically updates damage overlays if necesary //It automatically updates health status -/mob/living/carbon/human/take_organ_damage(var/brute = 0, var/burn = 0, var/bypass_armour = FALSE, var/override_droplimb) +/mob/living/human/take_organ_damage(var/brute = 0, var/burn = 0, var/bypass_armour = FALSE, var/override_droplimb) var/list/parts = get_damageable_organs() if(!length(parts)) return @@ -273,7 +273,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t update_health() //Heal MANY external organs, in random order -/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn) +/mob/living/human/heal_overall_damage(var/brute, var/burn) var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn) while(parts.len && (brute>0 || burn>0) ) @@ -292,7 +292,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t BITSET(hud_updateflag, HEALTH_HUD) // damage MANY external organs, in random order -/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null) +/mob/living/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null) if(status_flags & GODMODE) return //godmode @@ -320,17 +320,20 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t /* This function restores all organs. */ -/mob/living/carbon/human/restore_all_organs(var/ignore_organ_aspects) +/mob/living/human/restore_all_organs(var/ignore_organ_traits) get_bodytype()?.create_missing_organs(src) // root body part should never be missing on a mob for(var/bodypart in global.all_limb_tags_by_depth) var/obj/item/organ/external/current_organ = GET_EXTERNAL_ORGAN(src, bodypart) if(current_organ) - current_organ.rejuvenate(ignore_organ_aspects) + current_organ.rejuvenate(ignore_organ_traits) recheck_bad_external_organs() - verbs -= /mob/living/carbon/human/proc/undislocate + verbs -= /mob/living/human/proc/undislocate + + +/mob/living/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/damage_flags = 0, var/obj/used_weapon = null, var/armor_pen, var/silent = FALSE, var/obj/item/organ/external/given_organ = null) + if(status_flags & GODMODE) + return //godmode -/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/damage_flags = 0, var/obj/used_weapon = null, var/armor_pen, var/silent = FALSE, var/obj/item/organ/external/given_organ = null) - if(status_flags & GODMODE) return //godmode var/obj/item/organ/external/organ = given_organ if(!organ) if(isorgan(def_zone)) @@ -352,8 +355,10 @@ This function restores all organs. organ = GET_EXTERNAL_ORGAN(src, check_zone(def_zone, src)) //Handle other types of damage - if(!(damagetype in list(BRUTE, BURN, PAIN, CLONE))) + var/static/list/human_handled_damage_types = list(BRUTE, BURN, PAIN, CLONE) + if(!(damagetype in human_handled_damage_types)) return ..() + if(!istype(organ)) return 0 // This is reasonable and means the organ is missing. @@ -368,6 +373,7 @@ This function restores all organs. if(damage > 15 && prob(damage*4) && organ.can_feel_pain()) make_reagent(round(damage/10), /decl/material/liquid/adrenaline) + var/datum/wound/created_wound damageoverlaytemp = 20 switch(damagetype) @@ -386,7 +392,7 @@ This function restores all organs. return created_wound // Find out in how much pain the mob is at the moment. -/mob/living/carbon/human/proc/get_shock() +/mob/living/human/proc/get_shock() if (!can_feel_pain()) return 0 @@ -397,81 +403,3 @@ This function restores all organs. if(stat == UNCONSCIOUS) traumatic_shock *= 0.6 return max(0,traumatic_shock) - -//Electrical shock - -/mob/living/carbon/human/apply_shock(var/shock_damage, var/def_zone, var/base_siemens_coeff = 1.0) - var/obj/item/organ/external/initial_organ = GET_EXTERNAL_ORGAN(src, check_zone(def_zone, src)) - if(!initial_organ) - initial_organ = pick(get_external_organs()) - - var/obj/item/organ/external/floor_organ - - if(!current_posture.prone) - var/list/obj/item/organ/external/standing = list() - for(var/limb_tag in list(BP_L_FOOT, BP_R_FOOT)) - var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, limb_tag) - if(E && E.is_usable()) - standing[E.organ_tag] = E - if((def_zone == BP_L_FOOT || def_zone == BP_L_LEG) && standing[BP_L_FOOT]) - floor_organ = standing[BP_L_FOOT] - if((def_zone == BP_R_FOOT || def_zone == BP_R_LEG) && standing[BP_R_FOOT]) - floor_organ = standing[BP_R_FOOT] - else - floor_organ = standing[pick(standing)] - - if(!floor_organ) - floor_organ = pick(get_external_organs()) - - var/list/obj/item/organ/external/to_shock = trace_shock(initial_organ, floor_organ) - - if(to_shock && to_shock.len) - shock_damage /= to_shock.len - shock_damage = round(shock_damage, 0.1) - else - return 0 - - var/total_damage = 0 - - for(var/obj/item/organ/external/E in to_shock) - total_damage += ..(shock_damage, E.organ_tag, base_siemens_coeff * get_siemens_coefficient_organ(E)) - - if(total_damage > 10) - local_emp(initial_organ, 3) - - return total_damage - -/mob/living/carbon/human/proc/trace_shock(var/obj/item/organ/external/init, var/obj/item/organ/external/floor) - var/list/obj/item/organ/external/traced_organs = list(floor) - - if(!init) - return - - if(!floor || init == floor) - return list(init) - - for(var/obj/item/organ/external/E in list(floor, init)) - while(E && E.parent_organ) - var/candidate = GET_EXTERNAL_ORGAN(src, E.parent_organ) - if(!candidate || (candidate in traced_organs)) - break // Organ parenthood is not guaranteed to be a tree - E = candidate - traced_organs += E - if(E == init) - return traced_organs - - return traced_organs - -/mob/living/carbon/human/proc/local_emp(var/list/limbs, var/severity = 2) - if(!islist(limbs)) - limbs = list(limbs) - - var/list/EMP = list() - for(var/obj/item/organ/external/limb in limbs) - EMP += limb - if(LAZYLEN(limb.internal_organs)) - EMP += limb.internal_organs - if(LAZYLEN(limb.implants)) - EMP += limb.implants - for(var/atom/E in EMP) - E.emp_act(severity) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/human/human_defense.dm similarity index 78% rename from code/modules/mob/living/carbon/human/human_defense.dm rename to code/modules/mob/living/human/human_defense.dm index e953754d033..8968e71fdf1 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/human/human_defense.dm @@ -7,7 +7,7 @@ meteor_act */ -/mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone) +/mob/living/human/bullet_act(var/obj/item/projectile/P, var/def_zone) def_zone = check_zone(def_zone, src) if(!has_organ(def_zone)) @@ -28,7 +28,7 @@ meteor_act return blocked -/mob/living/carbon/human/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone) +/mob/living/human/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(src, def_zone) if(!affected) return @@ -47,7 +47,7 @@ meteor_act ..(stun_amount, agony_amount, def_zone) -/mob/living/carbon/human/get_blocked_ratio(def_zone, damage_type, damage_flags, armor_pen, damage) +/mob/living/human/get_blocked_ratio(def_zone, damage_type, damage_flags, armor_pen, damage) if(!def_zone && (damage_flags & DAM_DISPERSED)) var/tally for(var/zone in organ_rel_size) @@ -58,7 +58,7 @@ meteor_act return return ..() -/mob/living/carbon/human/get_armors_by_zone(obj/item/organ/external/def_zone, damage_type, damage_flags) +/mob/living/human/get_armors_by_zone(obj/item/organ/external/def_zone, damage_type, damage_flags) if(!def_zone) def_zone = ran_zone() if(!istype(def_zone)) @@ -85,20 +85,7 @@ meteor_act // Add inherent armor to the end of list so that protective equipment is checked first . += ..() -//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ. -/mob/living/carbon/human/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone) - if (!def_zone) - return 1.0 - - var/siemens_coefficient = max(species.get_shock_vulnerability(src), 0) - for(var/slot in global.standard_clothing_slots) - var/obj/item/clothing/C = get_equipped_item(slot) - if(istype(C) && (C.body_parts_covered & def_zone.body_part)) // Is that body part being targeted covered? - siemens_coefficient *= C.siemens_coefficient - - return siemens_coefficient - -/mob/living/carbon/human/proc/check_head_coverage() +/mob/living/human/proc/check_head_coverage() for(var/slot in global.standard_headgear_slots) var/obj/item/clothing/clothes = get_equipped_item(slot) if(istype(clothes) && (clothes.body_parts_covered & SLOT_HEAD)) @@ -106,13 +93,13 @@ meteor_act return FALSE //Used to check if they can be fed food/drinks/pills -/mob/living/carbon/human/check_mouth_coverage() +/mob/living/human/check_mouth_coverage() for(var/slot in global.standard_headgear_slots) var/obj/item/gear = get_equipped_item(slot) if(istype(gear) && (gear.body_parts_covered & SLOT_FACE) && !(gear.item_flags & ITEM_FLAG_FLEXIBLEMATERIAL)) return gear -/mob/living/carbon/human/resolve_item_attack(obj/item/I, mob/living/user, var/target_zone) +/mob/living/human/resolve_item_attack(obj/item/I, mob/living/user, var/target_zone) for (var/obj/item/grab/G in grabbed_by) if(G.resolve_item_attack(user, I, target_zone)) @@ -142,7 +129,7 @@ meteor_act return hit_zone -/mob/living/carbon/human/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) +/mob/living/human/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(src, hit_zone) if(!affecting) return //should be prevented by attacked_with_item() but for sanity. @@ -158,7 +145,7 @@ meteor_act return standard_weapon_hit_effects(I, user, effective_force, hit_zone) -/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) +/mob/living/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(src, hit_zone) if(!affecting) return 0 @@ -202,7 +189,7 @@ meteor_act return 1 -/mob/living/carbon/human/proc/attack_bloody(obj/item/W, mob/attacker, var/effective_force, var/hit_zone) +/mob/living/human/proc/attack_bloody(obj/item/W, mob/attacker, var/effective_force, var/hit_zone) if(W.atom_damage_type != BRUTE) return @@ -222,7 +209,7 @@ meteor_act if(istype(location) && location.simulated) location.add_blood(src) if(ishuman(attacker)) - var/mob/living/carbon/human/H = attacker + var/mob/living/human/H = attacker if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood H.bloody_body(src) H.bloody_hands(src) @@ -244,7 +231,7 @@ meteor_act if(BP_CHEST) bloody_body(src) -/mob/living/carbon/human/proc/projectile_hit_bloody(obj/item/projectile/P, var/effective_force, var/hit_zone, var/obj/item/organ/external/organ) +/mob/living/human/proc/projectile_hit_bloody(obj/item/projectile/P, var/effective_force, var/hit_zone, var/obj/item/organ/external/organ) if(P.atom_damage_type != BRUTE || P.nodamage) return if(!(P.sharp || prob(effective_force*4))) @@ -261,7 +248,7 @@ meteor_act C.add_blood(src) C.update_clothing_icon() -/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked) +/mob/living/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked) if(!organ || organ.is_dislocated() || !(organ.limb_flags & ORGAN_FLAG_CAN_DISLOCATE) || blocked >= 100) return 0 if(W.atom_damage_type != BRUTE) @@ -275,7 +262,7 @@ meteor_act return 1 return 0 -/mob/living/carbon/human/emag_act(var/remaining_charges, mob/user, var/emag_source) +/mob/living/human/emag_act(var/remaining_charges, mob/user, var/emag_source) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(src, user.get_target_zone()) if(!affecting || !affecting.is_robotic()) to_chat(user, "That limb isn't robotic.") @@ -287,7 +274,7 @@ meteor_act affecting.status |= ORGAN_SABOTAGED return 1 -/mob/living/carbon/human/hitby(atom/movable/AM, var/datum/thrownthing/TT) +/mob/living/human/hitby(atom/movable/AM, var/datum/thrownthing/TT) // empty active hand and we're in throw mode, so we can catch it if(isobj(AM) && in_throw_mode && !get_active_held_item() && TT.speed <= THROWFORCE_SPEED_DIVISOR && !incapacitated() && isturf(AM.loc)) put_in_active_hand(AM) @@ -297,7 +284,7 @@ meteor_act return FALSE return ..() -/mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2) +/mob/living/human/proc/bloody_hands(var/mob/living/source, var/amount = 2) var/obj/item/clothing/gloves/gloves = get_equipped_item(slot_gloves_str) if(istype(gloves)) gloves.add_blood(source, amount) @@ -306,7 +293,7 @@ meteor_act //updates on-mob overlays for bloody hands and/or bloody gloves update_equipment_overlay(slot_gloves_str) -/mob/living/carbon/human/proc/bloody_body(var/mob/living/source) +/mob/living/human/proc/bloody_body(var/mob/living/source) var/obj/item/gear = get_equipped_item(slot_wear_suit_str) if(gear) gear.add_blood(source) @@ -316,7 +303,7 @@ meteor_act gear.add_blood(source) update_equipment_overlay(slot_w_uniform_str, redraw_mob = FALSE) -/mob/living/carbon/human/proc/handle_suit_punctures(var/damtype, var/damage, var/def_zone) +/mob/living/human/proc/handle_suit_punctures(var/damtype, var/damage, var/def_zone) // Tox and oxy don't matter to suits. if(damtype != BURN && damtype != BRUTE) return @@ -331,7 +318,7 @@ meteor_act if(istype(suit)) suit.create_breaches(damtype, damage) -/mob/living/carbon/human/reagent_permeability() +/mob/living/human/reagent_permeability() var/perm = 0 var/list/perm_by_part = list( @@ -367,7 +354,7 @@ meteor_act return perm -/mob/living/carbon/human/lava_act(datum/gas_mixture/air, temperature, pressure) +/mob/living/human/lava_act(datum/gas_mixture/air, temperature, pressure) var/was_burned = FireBurn(0.4 * vsc.fire_firelevel_multiplier, temperature, pressure) if (was_burned) fire_act(air, temperature) @@ -375,7 +362,7 @@ meteor_act //Removed the horrible safety parameter. It was only being used by ninja code anyways. //Now checks siemens_coefficient of the affected area by default -/mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/base_siemens_coeff = 1.0, var/def_zone = null) +/mob/living/human/electrocute_act(var/shock_damage, var/obj/source, var/base_siemens_coeff = 1.0, var/def_zone = null) if(status_flags & GODMODE) return 0 //godmode @@ -389,9 +376,46 @@ meteor_act if (!def_zone) def_zone = pick(BP_L_HAND, BP_R_HAND) - return ..(shock_damage, source, base_siemens_coeff, def_zone) + shock_damage = apply_shock(shock_damage, def_zone, base_siemens_coeff) + + if(!shock_damage) + return 0 + + stun_effect_act(agony_amount=shock_damage, def_zone=def_zone) + + playsound(loc, "sparks", 50, 1, -1) + if (shock_damage > 15) + src.visible_message( + "[src] was electrocuted[source ? " by the [source]" : ""]!", \ + "You feel a powerful shock course through your body!", \ + "You hear a heavy electrical crack." \ + ) + else + src.visible_message( + "[src] was shocked[source ? " by the [source]" : ""].", \ + "You feel a shock course through your body.", \ + "You hear a zapping sound." \ + ) + + switch(shock_damage) + if(11 to 15) + SET_STATUS_MAX(src, STAT_STUN, 1) + if(16 to 20) + SET_STATUS_MAX(src, STAT_STUN, 2) + if(21 to 25) + SET_STATUS_MAX(src, STAT_WEAK, 2) + if(26 to 30) + SET_STATUS_MAX(src, STAT_WEAK, 5) + if(31 to INFINITY) + SET_STATUS_MAX(src, STAT_WEAK, 10) //This should work for now, more is really silly and makes you lay there forever + + set_status(STAT_JITTER, min(shock_damage*5, 200)) + + spark_at(loc, amount=5, cardinal_only = TRUE) -/mob/living/carbon/human/explosion_act(severity) + return shock_damage + +/mob/living/human/explosion_act(severity) ..() if(QDELETED(src)) return @@ -430,7 +454,7 @@ meteor_act //Used by various things that knock people out by applying blunt trauma to the head. //Checks that the species has a "head" (brain containing organ) and that hit_zone refers to it. -/mob/living/carbon/human/proc/headcheck(var/target_zone, var/brain_tag = BP_BRAIN) +/mob/living/human/proc/headcheck(var/target_zone, var/brain_tag = BP_BRAIN) target_zone = check_zone(target_zone, src) @@ -446,32 +470,21 @@ meteor_act return prob(100 / 2**(head.w_class - brain.w_class - 1)) return TRUE -///eyecheck() -///Returns a number between -1 to 2 -/mob/living/carbon/human/eyecheck() - var/total_protection = flash_protection - var/decl/bodytype/root_bodytype = get_bodytype() - if(root_bodytype.has_organ[root_bodytype.vision_organ]) - var/obj/item/organ/internal/eyes/I = get_organ(root_bodytype.vision_organ, /obj/item/organ/internal/eyes) - if(!I?.is_usable()) - return FLASH_PROTECTION_MAJOR - total_protection = I.get_total_protection(flash_protection) - else // They can't be flashed if they don't have eyes. - return FLASH_PROTECTION_MAJOR - return total_protection - -/mob/living/carbon/human/flash_eyes(var/intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) - var/decl/bodytype/root_bodytype = get_bodytype() - if(root_bodytype.has_organ[root_bodytype.vision_organ]) - var/obj/item/organ/internal/eyes/I = get_organ(root_bodytype.vision_organ, /obj/item/organ/internal/eyes) +/mob/living/human/flash_eyes(var/intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) + var/vision_organ_tag = get_vision_organ_tag() + if(vision_organ_tag) + var/obj/item/organ/internal/eyes/I = get_organ(vision_organ_tag, /obj/item/organ/internal/eyes) if(I) I.additional_flash_effects(intensity) return ..() -/mob/living/carbon/human/proc/getFlashMod() - var/decl/bodytype/root_bodytype = get_bodytype() - if(root_bodytype.vision_organ) - var/obj/item/organ/internal/eyes/I = get_organ(root_bodytype.vision_organ, /obj/item/organ/internal/eyes) - if(I) // get_organ with a type passed already does a typecheck - return I.get_flash_mod() - return root_bodytype.eye_flash_mod +/* +Contians the proc to handle radiation. +Specifically made to do radiation burns. +*/ +/mob/living/human/apply_radiation(damage) + ..() + if(!isSynthetic() && !ignore_rads) + damage = 0.25 * damage * (species ? species.get_radiation_mod(src) : 1) + take_damage(BURN, damage) + return TRUE diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/human/human_defines.dm similarity index 76% rename from code/modules/mob/living/carbon/human/human_defines.dm rename to code/modules/mob/living/human/human_defines.dm index 66db490a296..71c332ff74b 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/human/human_defines.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human +/mob/living/human ai = /datum/ai/human mob_bump_flag = HUMAN @@ -20,8 +20,6 @@ var/voice = "" /// Used for determining if we need to process all organs or just some or even none. var/last_dam = -1 - /// organs we check until they are good. - var/list/bad_external_organs var/mob/remoteview_target = null var/hand_blood_color var/list/flavor_texts = list() @@ -33,8 +31,6 @@ var/robolimb_count = 0 /// The world_time where an unarmed attack was done var/last_attack = 0 - /// Total level of flash protection - var/flash_protection = 0 /// Total level of visualy impairing items var/equipment_tint_total = 0 /// Darksight modifier from equipped items @@ -64,3 +60,19 @@ var/vital_organ_missing_time /// Used to look up records when the client is logged out. var/comments_record_id + /// Active emote/pose - appended to examine + var/pose = null + /// Reagent holder for bloodstream reagents + var/datum/reagents/metabolism/bloodstr + /// Reagent holder for contact reagents + var/datum/reagents/metabolism/touching + /// Should this mob ignore radiation? + var/ignore_rads = FALSE + /// Whether the mob is performing cpr or not. + var/performing_cpr = FALSE + /// Cooldown tracker for throwing up. + var/lastpuke = 0 + /// Reference to the tank we are currently breathing from. + var/obj/item/tank/internal + /// Contains environment tolerances and language information, along with a lot of other stuff, usually set during Initialize(). + var/decl/species/species diff --git a/code/modules/mob/living/carbon/human/human_examine_decl.dm b/code/modules/mob/living/human/human_examine_decl.dm similarity index 100% rename from code/modules/mob/living/carbon/human/human_examine_decl.dm rename to code/modules/mob/living/human/human_examine_decl.dm diff --git a/code/modules/mob/living/carbon/human/human_grabs.dm b/code/modules/mob/living/human/human_grabs.dm similarity index 78% rename from code/modules/mob/living/carbon/human/human_grabs.dm rename to code/modules/mob/living/human/human_grabs.dm index 37c1c45832a..dc1476fecc2 100644 --- a/code/modules/mob/living/carbon/human/human_grabs.dm +++ b/code/modules/mob/living/human/human_grabs.dm @@ -1,10 +1,10 @@ -/mob/living/carbon/human/add_grab(var/obj/item/grab/grab, var/defer_hand = FALSE) +/mob/living/human/add_grab(var/obj/item/grab/grab, var/defer_hand = FALSE) if(defer_hand) . = put_in_hands(grab) else . = put_in_active_hand(grab) -/mob/living/carbon/human/can_be_grabbed(var/mob/grabber, var/target_zone, var/defer_hand = FALSE) +/mob/living/human/can_be_grabbed(var/mob/grabber, var/target_zone, var/defer_hand = FALSE) . = ..() if(.) var/obj/item/organ/external/organ = GET_EXTERNAL_ORGAN(src, check_zone(target_zone, src)) @@ -28,7 +28,7 @@ if(istype(C)) C.leave_evidence(grabber) -/mob/living/carbon/human/make_grab(atom/movable/target, grab_tag = /decl/grab/simple, defer_hand = FALSE, force_grab_tag = FALSE) +/mob/living/human/make_grab(atom/movable/target, grab_tag = /decl/grab/simple, defer_hand = FALSE, force_grab_tag = FALSE) . = ..() if(.) remove_cloaking_source(species) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/human/human_helpers.dm similarity index 86% rename from code/modules/mob/living/carbon/human/human_helpers.dm rename to code/modules/mob/living/human/human_helpers.dm index a1a6a17a2c7..d5e995232d8 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/human/human_helpers.dm @@ -7,7 +7,7 @@ flash_protection += C.flash_protection; \ equipment_tint_total += C.get_equipment_tint(); -/mob/living/carbon/human/can_eat(var/food, var/feedback = 1) +/mob/living/human/can_eat(var/food, var/feedback = 1) var/list/status = can_eat_status() if(status[1] == HUMAN_EATING_NO_ISSUE) return 1 @@ -18,7 +18,7 @@ to_chat(src, "\The [status[2]] is in the way!") return 0 -/mob/living/carbon/human/can_force_feed(var/feeder, var/food, var/feedback = 1) +/mob/living/human/can_force_feed(var/feeder, var/food, var/feedback = 1) var/list/status = can_eat_status() if(status[1] == HUMAN_EATING_NO_ISSUE) return 1 @@ -29,7 +29,7 @@ to_chat(feeder, "\The [status[2]] is in the way!") return 0 -/mob/living/carbon/human/proc/can_eat_status() +/mob/living/human/proc/can_eat_status() if(!check_has_mouth()) return list(HUMAN_EATING_NBP_MOUTH) var/obj/item/blocked = check_mouth_coverage() @@ -41,7 +41,7 @@ #undef HUMAN_EATING_NBP_MOUTH #undef HUMAN_EATING_BLOCKED_MOUTH -/mob/living/carbon/human/proc/update_equipment_vision() +/mob/living/human/proc/update_equipment_vision() flash_protection = 0 equipment_tint_total = 0 equipment_see_invis = 0 @@ -69,7 +69,7 @@ if(rig) process_rig(rig) -/mob/living/carbon/human/proc/process_glasses(var/obj/item/clothing/glasses/G) +/mob/living/human/proc/process_glasses(var/obj/item/clothing/glasses/G) if(G) // prescription applies regardless of if the glasses are active equipment_prescription += G.prescription @@ -88,12 +88,12 @@ add_clothing_protection(G) G.process_hud(src) -/mob/living/carbon/human/proc/process_rig(var/obj/item/rig/O) +/mob/living/human/proc/process_rig(var/obj/item/rig/O) var/obj/item/head = get_equipped_item(slot_head_str) if(O.visor && O.visor.active && O.visor.vision && O.visor.vision.glasses && (!O.helmet || (head && O.helmet == head))) process_glasses(O.visor.vision.glasses) -/mob/living/carbon/human/fully_replace_character_name(var/new_name, var/in_depth = TRUE) +/mob/living/human/fully_replace_character_name(var/new_name, var/in_depth = TRUE) var/old_name = real_name . = ..() if(!. || !in_depth) @@ -124,10 +124,10 @@ if(rig?.update_visible_name) rig.visible_name = real_name -/mob/living/carbon/human +/mob/living/human var/next_sonar_ping = 0 -/mob/living/carbon/human/proc/sonar_ping() +/mob/living/human/proc/sonar_ping() set name = "Listen In" set desc = "Allows you to listen in to movement and noises around you." set category = "IC" @@ -179,14 +179,14 @@ if(!heard_something) to_chat(src, "You hear no movement but your own.") -/mob/living/carbon/human/proc/has_headset_in_ears() +/mob/living/human/proc/has_headset_in_ears() return istype(get_equipped_item(slot_l_ear_str), /obj/item/radio/headset) || istype(get_equipped_item(slot_r_ear_str), /obj/item/radio/headset) -/mob/living/carbon/human/welding_eyecheck() - var/vision_organ = get_bodytype()?.vision_organ - if(!vision_organ) +/mob/living/human/welding_eyecheck() + var/vision_organ_tag = get_vision_organ_tag() + if(!vision_organ_tag) return - var/obj/item/organ/internal/eyes/E = get_organ(vision_organ, /obj/item/organ/internal/eyes) + var/obj/item/organ/internal/eyes/E = get_organ(vision_organ_tag, /obj/item/organ/internal/eyes) if(!E) return var/safety = eyecheck() @@ -218,15 +218,13 @@ to_chat(src, "You go blind!") SET_STATUS_MAX(src, STAT_BLIND, 5) SET_STATUS_MAX(src, STAT_BLURRY, 5) - disabilities |= NEARSIGHTED - spawn(100) - disabilities &= ~NEARSIGHTED + add_genetic_condition(GENE_COND_NEARSIGHTED, 10 SECONDS) -/mob/living/carbon/human +/mob/living/human var/list/cloaking_sources // Returns true if, and only if, the human has gone from uncloaked to cloaked -/mob/living/carbon/human/proc/add_cloaking_source(var/datum/cloaking_source) +/mob/living/human/proc/add_cloaking_source(var/datum/cloaking_source) var/has_uncloaked = clean_cloaking_sources() LAZYDISTINCTADD(cloaking_sources, weakref(cloaking_source)) @@ -241,7 +239,7 @@ #define CLOAK_APPEAR_SELF "You have re-appeared." // Returns true if, and only if, the human has gone from cloaked to uncloaked -/mob/living/carbon/human/proc/remove_cloaking_source(var/datum/cloaking_source) +/mob/living/human/proc/remove_cloaking_source(var/datum/cloaking_source) var/was_cloaked = LAZYLEN(cloaking_sources) clean_cloaking_sources() LAZYREMOVE(cloaking_sources, weakref(cloaking_source)) @@ -256,7 +254,7 @@ /mob/proc/is_cloaked() return FALSE -/mob/living/carbon/human/is_cloaked() +/mob/living/human/is_cloaked() if(clean_cloaking_sources()) update_icon() visible_message(CLOAK_APPEAR_OTHER, CLOAK_APPEAR_SELF) @@ -266,11 +264,11 @@ #undef CLOAK_APPEAR_SELF // Returns true if the human is cloaked by the given source -/mob/living/carbon/human/proc/is_cloaked_by(var/cloaking_source) +/mob/living/human/proc/is_cloaked_by(var/cloaking_source) return LAZYISIN(cloaking_sources, weakref(cloaking_source)) // Returns true if this operation caused the mob to go from cloaked to uncloaked -/mob/living/carbon/human/proc/clean_cloaking_sources() +/mob/living/human/proc/clean_cloaking_sources() if(!cloaking_sources) return FALSE @@ -288,16 +286,11 @@ UNSETEMPTY(cloaking_sources) return !cloaking_sources // If cloaking_sources wasn't initially null but is now, we've uncloaked -/mob/living/carbon/human/set_sdisability(sdisability) - if(isSynthetic()) - return // Can't cure disabilites, so don't give them. - ..() - -/mob/living/carbon/human/proc/has_meson_effect() +/mob/living/human/proc/has_meson_effect() var/datum/global_hud/global_hud = get_global_hud() return (global_hud.meson in equipment_overlays) -/mob/living/carbon/human/proc/is_in_pocket(var/obj/item/I) +/mob/living/human/proc/is_in_pocket(var/obj/item/I) for(var/slot in global.pocket_slots) if(get_equipped_item(slot) == I) return TRUE diff --git a/code/modules/mob/living/carbon/internals.dm b/code/modules/mob/living/human/human_internals.dm similarity index 50% rename from code/modules/mob/living/carbon/internals.dm rename to code/modules/mob/living/human/human_internals.dm index c21f82f68b0..f77c5000586 100644 --- a/code/modules/mob/living/carbon/internals.dm +++ b/code/modules/mob/living/human/human_internals.dm @@ -1,7 +1,7 @@ -/mob/living/carbon/get_internals() +/mob/living/human/get_internals() return internal -/mob/living/carbon/set_internals(obj/item/tank/source, source_string) +/mob/living/human/set_internals(obj/item/tank/source, source_string) ..() internal = source if(internals) diff --git a/code/modules/mob/living/carbon/human/human_maneuvers.dm b/code/modules/mob/living/human/human_maneuvers.dm similarity index 66% rename from code/modules/mob/living/carbon/human/human_maneuvers.dm rename to code/modules/mob/living/human/human_maneuvers.dm index f106bf43d9c..b06ca93faea 100644 --- a/code/modules/mob/living/carbon/human/human_maneuvers.dm +++ b/code/modules/mob/living/human/human_maneuvers.dm @@ -1,12 +1,12 @@ -/mob/living/carbon/human/get_acrobatics_multiplier(var/decl/maneuver/attempting_maneuver) +/mob/living/human/get_acrobatics_multiplier(var/decl/maneuver/attempting_maneuver) . = 0.5 + ((get_skill_value(SKILL_HAULING) - SKILL_MIN)/(SKILL_MAX - SKILL_MIN)) if(skill_check(SKILL_HAULING, SKILL_BASIC)) . = max(..(), .) -/mob/living/carbon/human/get_jump_distance() +/mob/living/human/get_jump_distance() return species.standing_jump_range -/mob/living/carbon/human/can_do_maneuver(var/decl/maneuver/maneuver, var/silent = FALSE) +/mob/living/human/can_do_maneuver(var/decl/maneuver/maneuver, var/silent = FALSE) . = ..() if(.) if(nutrition <= 20) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/human/human_movement.dm similarity index 81% rename from code/modules/mob/living/carbon/human/human_movement.dm rename to code/modules/mob/living/human/human_movement.dm index eb52cca2f25..1a590d41e43 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/human/human_movement.dm @@ -1,7 +1,7 @@ -/mob/living/carbon/human +/mob/living/human move_intents = list(/decl/move_intent/walk) -/mob/living/carbon/human/get_movement_delay(var/travel_dir) +/mob/living/human/get_movement_delay(var/travel_dir) var/tally = ..() var/obj/item/organ/external/H = GET_EXTERNAL_ORGAN(src, BP_GROIN) // gets bodytype slowdown, which can be reset by set_bodytype @@ -59,16 +59,16 @@ if (root_bodytype && bodytemperature < root_bodytype.cold_discomfort_level) tally += (root_bodytype.cold_discomfort_level - bodytemperature) / 10 * 1.75 - if(mRun in mutations) + if(has_genetic_condition(GENE_COND_RUNNING)) tally = 0 return (tally+get_config_value(/decl/config/num/movement_human)) -/mob/living/carbon/human/size_strength_mod() +/mob/living/human/size_strength_mod() . = ..() . += species.strength -/mob/living/carbon/human/space_do_move(var/allow_move, var/direction) +/mob/living/human/space_do_move(var/allow_move, var/direction) if(allow_move == 1) var/obj/item/tank/jetpack/thrust = get_jetpack() if(thrust && thrust.on && prob(skill_fail_chance(SKILL_EVA, 10, SKILL_ADEPT))) @@ -83,7 +83,7 @@ . = ..() -/mob/living/carbon/human/slip_chance(var/prob_slip = 5) +/mob/living/human/slip_chance(var/prob_slip = 5) if(!..()) return 0 //Check hands and mod slip @@ -96,7 +96,7 @@ prob_slip -= 1 return prob_slip -/mob/living/carbon/human/Check_Shoegrip() +/mob/living/human/Check_Shoegrip() if(species.check_no_slip(src)) return 1 var/obj/item/shoes = get_equipped_item(slot_shoes_str) @@ -104,16 +104,26 @@ return 1 return 0 -/mob/living/carbon/human/Move() +/mob/living/human/Move() . = ..() if(.) //We moved - var/stamina_cost = 0 - for(var/obj/item/grab/G as anything in get_active_grabs()) - stamina_cost -= G.grab_slowdown() - stamina_cost = round(stamina_cost) - if(stamina_cost < 0) - adjust_stamina(stamina_cost) + if(stat != DEAD) + + var/stamina_cost = 0 + for(var/obj/item/grab/G as anything in get_active_grabs()) + stamina_cost -= G.grab_slowdown() + stamina_cost = round(stamina_cost) + if(stamina_cost < 0) + adjust_stamina(stamina_cost) + + var/nut_removed = DEFAULT_HUNGER_FACTOR/10 + var/hyd_removed = DEFAULT_THIRST_FACTOR/10 + if (move_intent.flags & MOVE_INTENT_EXERTIVE) + nut_removed *= 2 + hyd_removed *= 2 + adjust_nutrition(-nut_removed) + adjust_hydration(-hyd_removed) handle_leg_damage() species.handle_post_move(src) @@ -121,7 +131,7 @@ var/turf/B = GetAbove(src) up_hint.icon_state = "uphint[!!(B && TURF_IS_MIMICKING(B))]" -/mob/living/carbon/human/proc/handle_leg_damage() +/mob/living/human/proc/handle_leg_damage() if(!can_feel_pain()) return var/crutches = 0 @@ -135,5 +145,5 @@ else E.add_pain(10) -/mob/living/carbon/human/can_sprint() +/mob/living/human/can_sprint() return (stamina > 0) diff --git a/code/modules/mob/living/human/human_organs.dm b/code/modules/mob/living/human/human_organs.dm new file mode 100644 index 00000000000..7dbeab31c6c --- /dev/null +++ b/code/modules/mob/living/human/human_organs.dm @@ -0,0 +1,221 @@ +/// organ-related variables, see organ.dm and human_organs.dm, shouldn't be accessed directly +/mob/living/human + /// organs we check until they are good. + var/list/bad_external_organs + /// organs grouped by category, largely used for stance calc + var/list/organs_by_category + /// organs indexed by organ_tag + var/list/organs_by_tag + /// unassociated list of internal organs + var/tmp/list/internal_organs + /// unassociated list of external organs + var/tmp/list/external_organs + +/mob/living/human/get_organ(var/organ_tag, var/expected_type = /obj/item/organ) + RETURN_TYPE(expected_type) + var/obj/item/organ = LAZYACCESS(organs_by_tag, organ_tag) + if(!expected_type || istype(organ, expected_type)) + return organ + +/mob/living/human/get_external_organs() + return external_organs + +/mob/living/human/get_internal_organs() + return internal_organs + +/mob/living/human/has_organs() + return (LAZYLEN(external_organs) + LAZYLEN(internal_organs)) > 0 + +/mob/living/human/has_external_organs() + return LAZYLEN(external_organs) > 0 + +/mob/living/human/has_internal_organs() + return LAZYLEN(internal_organs) > 0 + +/mob/living/human/get_organs_by_categories(var/list/categories) + for(var/organ_cat in categories) + if(organ_cat in organs_by_category) + LAZYDISTINCTADD(., organs_by_category[organ_cat]) + +//Deletes all references to organs +/mob/living/human/delete_organs() + ..() + organs_by_tag = null + internal_organs = null + external_organs = null + organs_by_category = null + LAZYCLEARLIST(bad_external_organs) + +//Registers an organ and setup the organ hierachy properly. +//affected : Parent organ if applicable. +//in_place : If true, we're performing an in-place replacement, without triggering anything related to adding the organ in-game as part of surgery or else. +/mob/living/human/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached, skip_health_update = FALSE) + + var/obj/item/organ/existing = LAZYACCESS(organs_by_tag, O.organ_tag) + if(existing && O != existing) + CRASH("mob/living/human/add_organ(): '[O]' tried to overwrite [src]'s existing organ '[existing]' in slot '[O.organ_tag]'!") + if(O.parent_organ && !LAZYACCESS(organs_by_tag, O.parent_organ)) + CRASH("mob/living/human/add_organ(): Tried to add an internal organ to a non-existing parent external organ!") + + //We don't add internal organs to the lists if we're detached + if(O.is_internal() && !detached) + LAZYSET(organs_by_tag, O.organ_tag, O) + LAZYDISTINCTADD(internal_organs, O) + //External organs must always be in the organ list even when detached. Otherwise icon updates won't show the limb, and limb attach surgeries won't work + else if(!O.is_internal()) + LAZYSET(organs_by_tag, O.organ_tag, O) + LAZYDISTINCTADD(external_organs, O) + + // Update our organ category lists, if neeed. + if(O.organ_category) + LAZYINITLIST(organs_by_category) + LAZYDISTINCTADD(organs_by_category[O.organ_category], O) + + . = ..() + if(!.) + return + + if(!O.is_internal()) + refresh_modular_limb_verbs() + + //#TODO: wish we could invalidate the human icons to trigger a single update when the organ state changes multiple times in a row + if(update_icon) + update_inhand_overlays(FALSE) + update_body(FALSE) + update_bandages(FALSE) + update_damage_overlays(FALSE) + hud_reset() + queue_icon_update() //Avoids calling icon updates 50 times when adding multiple organs + +//Unregister and remove a given organ from the mob. +//drop_organ : Once the organ is removed its dropped to the ground. +//detach : Toggle the ORGAN_CUT_AWAY flag on the removed organ +//ignore_children: Skips recursively removing this organ's child organs. +//in_place : If true we remove only the organ (no children items or implants) and avoid triggering mob changes and parent organs changes as much as possible. +// Meant to be used for init and species transforms, without triggering any updates to mob state or anything related to losing a limb as part of surgery or combat. +/mob/living/human/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = TRUE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE, var/skip_health_update = FALSE) + if(istype(O) && !in_place && O.is_vital_to_owner() && usr) + admin_attack_log(usr, src, "Removed a vital organ ([src]).", "Had a vital organ ([src]) removed.", "removed a vital organ ([src]) from") + if(!(. = ..())) + return + LAZYREMOVE(organs_by_tag, O.organ_tag) + if(O.is_internal()) + LAZYREMOVE(internal_organs, O) + else + LAZYREMOVE(external_organs, O) + + // Update our organ category lists, if neeed. + if(O.organ_category && islist(organs_by_category)) + organs_by_category[O.organ_category] -= O + if(LAZYLEN(organs_by_category[O.organ_category]) <= 0) + LAZYREMOVE(organs_by_category, O.organ_category) + + if(!O.is_internal()) + refresh_modular_limb_verbs() + LAZYREMOVE(bad_external_organs, O) + + //#TODO: wish we could invalidate the human icons to trigger a single update when the organ state changes multiple times in a row + if(update_icon) + regenerate_body_icon = TRUE + hud_reset() + queue_icon_update() //Avoids calling icon updates 50 times when removing multiple organs + +/mob/living/human/get_bodytype() + RETURN_TYPE(/decl/bodytype) + // If the root organ ever changes/isn't always the chest, this will need to be changed. + return get_organ(BP_CHEST, /obj/item/organ)?.bodytype + +/mob/living/human/proc/get_bodypart_name(var/zone) + var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, zone) + return E?.name + +/mob/living/human/proc/should_recheck_bad_external_organs() + var/damage_this_tick = get_damage(TOX) + for(var/obj/item/organ/external/O in get_external_organs()) + damage_this_tick += O.burn_dam + O.brute_dam + + if(damage_this_tick > last_dam) + . = TRUE + last_dam = damage_this_tick + +/mob/living/human/proc/recheck_bad_external_organs() + LAZYCLEARLIST(bad_external_organs) + for(var/obj/item/organ/external/E in get_external_organs()) + if(E.need_process()) + LAZYDISTINCTADD(bad_external_organs, E) + +/mob/living/human/proc/check_vital_organ_missing() + return get_bodytype()?.check_vital_organ_missing(src) + +/mob/living/human/proc/process_internal_organs() + for(var/obj/item/organ/I in internal_organs) + I.Process() + +// Takes care of organ related updates, such as broken and missing limbs +/mob/living/human/proc/handle_organs() + + // Check for the presence (or lack of) vital organs like the brain. + // Set a timer after this point, since we want a little bit of + // wiggle room before the body dies for good (brain transplants). + if(stat != DEAD) + if(check_vital_organ_missing()) + SET_STATUS_MAX(src, STAT_PARA, 5) + if(vital_organ_missing_time) + if(world.time >= vital_organ_missing_time) + death() + else + vital_organ_missing_time = world.time + max(get_bodytype()?.vital_organ_failure_death_delay, 5 SECONDS) + else + vital_organ_missing_time = null + + //processing internal organs is pretty cheap, do that first. + process_internal_organs() + + var/force_process = should_recheck_bad_external_organs() + + if(force_process) + recheck_bad_external_organs() + for(var/obj/item/organ/external/Ex in get_external_organs()) + LAZYDISTINCTADD(bad_external_organs, Ex) + + if(!force_process && !LAZYLEN(bad_external_organs)) + return + + for(var/obj/item/organ/external/E in bad_external_organs) + if(!E) + continue + if(!E.need_process()) + LAZYREMOVE(bad_external_organs, E) + continue + else + E.Process() + + if(!current_posture.prone && !buckled && world.time - l_move_time < 15) + //Moving around with fractured ribs won't do you any good + if (prob(10) && !stat && can_feel_pain() && GET_CHEMICAL_EFFECT(src, CE_PAINKILLER) < 50 && E.is_broken() && LAZYLEN(E.internal_organs)) + custom_pain("Pain jolts through your broken [E.encased ? E.encased : E.name], staggering you!", 50, affecting = E) + drop_held_items() + SET_STATUS_MAX(src, STAT_STUN, 2) + + //Moving makes open wounds get infected much faster + for(var/datum/wound/W in E.wounds) + if (W.infection_check()) + W.germ_level += 1 + +/mob/living/human/proc/Check_Proppable_Object() + for(var/turf/T in RANGE_TURFS(src, 1)) //we only care for non-space turfs + if(T.density && T.simulated) //walls work + return 1 + + for(var/obj/O in orange(1, src)) + if(O && O.density && O.anchored) + return 1 + + return 0 + +/mob/living/human/on_lost_organ(var/obj/item/organ/O) + if(!(. = ..())) + return + //Move some blood over to the organ + if(!BP_IS_PROSTHETIC(O) && O.species && O.reagents?.total_volume < 5) + vessel.trans_to(O, 5 - O.reagents.total_volume, 1, 1) diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/human/human_powers.dm similarity index 94% rename from code/modules/mob/living/carbon/human/human_powers.dm rename to code/modules/mob/living/human/human_powers.dm index 0113513663c..8a2246c31eb 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/human/human_powers.dm @@ -1,7 +1,7 @@ /**************** true human verbs ****************/ -/mob/living/carbon/human/proc/tie_hair() +/mob/living/human/proc/tie_hair() set name = "Tie Hair" set desc = "Style your hair." set category = "IC" @@ -39,7 +39,7 @@ /**************** misc alien verbs ****************/ -/mob/living/carbon/human/proc/psychic_whisper(mob/M as mob in oview()) +/mob/living/human/proc/psychic_whisper(mob/M as mob in oview()) set name = "Psychic Whisper" set desc = "Whisper silently to someone over a distance." set category = "Abilities" diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/human/human_resist.dm similarity index 67% rename from code/modules/mob/living/carbon/resist.dm rename to code/modules/mob/living/human/human_resist.dm index 9eef36b15d9..0aaad35e2ee 100644 --- a/code/modules/mob/living/carbon/resist.dm +++ b/code/modules/mob/living/human/human_resist.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/process_resist() +/mob/living/human/process_resist() //drop && roll if(on_fire && !buckled) @@ -29,10 +29,7 @@ if(get_equipped_item(slot_handcuffed_str)) spawn() escape_handcuffs() -/mob/living/carbon/proc/get_cuff_breakout_mod() - return 1 - -/mob/living/carbon/proc/escape_handcuffs() +/mob/living/human/proc/escape_handcuffs() //This line represent a significant buff to grabs... // We don't have to check the click cooldown because /mob/living/verb/resist() has done it for us, we can simply set the delay setClickCooldown(100) @@ -46,7 +43,7 @@ //A default in case you are somehow cuffed with something that isn't an obj/item/handcuffs type var/breakouttime = istype(cuffs) ? cuffs.breakouttime : 2 MINUTES - var/mob/living/carbon/human/H = src + var/mob/living/human/H = src if(istype(H) && istype(H.get_equipped_item(slot_gloves_str), /obj/item/clothing/gloves/rig)) breakouttime /= 2 @@ -98,10 +95,7 @@ drop_from_inventory(cuffs) return -/mob/living/proc/can_break_cuffs() - . = FALSE - -/mob/living/carbon/proc/break_handcuffs() +/mob/living/human/proc/break_handcuffs() var/obj/item/cuffs = get_equipped_item(slot_handcuffed_str) visible_message( "[src] is trying to break \the [cuffs]!", @@ -122,53 +116,3 @@ qdel(cuffs) if(buckled && buckled.buckle_require_restraints) buckled.unbuckle_mob() - -/mob/living/carbon/human/can_break_cuffs() - . = ..() || species.can_shred(src,1) - -/mob/living/carbon/proc/get_special_resist_time() - return 0 - -/mob/living/carbon/escape_buckle() - var/unbuckle_time - if(src.get_equipped_item(slot_handcuffed_str) && istype(src.buckled, /obj/effect/energy_net)) - var/obj/effect/energy_net/N = src.buckled - N.escape_net(src) //super snowflake but is literally used NOWHERE ELSE.-Luke - return - - if(!buckled) return - if(!restrained()) - ..() - else - setClickCooldown(100) - unbuckle_time = max(0, (2 MINUTES) - get_special_resist_time()) - - visible_message( - "[src] attempts to unbuckle themself!", - "You attempt to unbuckle yourself. (This will take around [unbuckle_time / (1 SECOND)] second\s and you need to stand still)", range = 2 - ) - - if(unbuckle_time && buckled) - var/stages = 2 - for(var/i = 1 to stages) - if(!unbuckle_time || do_after(usr, unbuckle_time*0.5, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY))) - if(!buckled) - return - visible_message( - SPAN_WARNING("\The [src] tries to unbuckle themself."), - SPAN_WARNING("You try to unbuckle yourself ([i*100/stages]% done)."), range = 2 - ) - else - if(!buckled) - return - visible_message( - SPAN_WARNING("\The [src] stops trying to unbuckle themself."), - SPAN_WARNING("You stop trying to unbuckle yourself."), range = 2 - ) - return - visible_message( - SPAN_DANGER("\The [src] manages to unbuckle themself!"), - SPAN_NOTICE("You successfully unbuckle yourself."), range = 2 - ) - buckled.user_unbuckle_mob(src) - return diff --git a/code/modules/mob/living/carbon/human/human_skin.dm b/code/modules/mob/living/human/human_skin.dm similarity index 60% rename from code/modules/mob/living/carbon/human/human_skin.dm rename to code/modules/mob/living/human/human_skin.dm index 5b37b43781f..54e4f7b3eab 100644 --- a/code/modules/mob/living/carbon/human/human_skin.dm +++ b/code/modules/mob/living/human/human_skin.dm @@ -1,7 +1,7 @@ -/mob/living/carbon/human +/mob/living/human var/skin_state = SKIN_NORMAL -/mob/living/carbon/human/proc/reset_skin() +/mob/living/human/proc/reset_skin() if(skin_state == SKIN_THREAT) skin_state = SKIN_NORMAL update_skin() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/human/human_species.dm similarity index 52% rename from code/modules/mob/living/carbon/human/human_species.dm rename to code/modules/mob/living/human/human_species.dm index 927f421d5ca..c6d9d61e914 100644 --- a/code/modules/mob/living/carbon/human/human_species.dm +++ b/code/modules/mob/living/human/human_species.dm @@ -1,29 +1,29 @@ -/mob/living/carbon/human/dummy +/mob/living/human/dummy real_name = "test dummy" status_flags = GODMODE|CANPUSH virtual_mob = null -/mob/living/carbon/human/dummy/mannequin/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/human/dummy/mannequin/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) . = ..() STOP_PROCESSING(SSmobs, src) global.human_mob_list -= src -/mob/living/carbon/human/dummy/selfdress/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/human/dummy/selfdress/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) ..() return INITIALIZE_HINT_LATELOAD -/mob/living/carbon/human/dummy/selfdress/LateInitialize() +/mob/living/human/dummy/selfdress/LateInitialize() for(var/obj/item/I in loc) equip_to_appropriate_slot(I) -/mob/living/carbon/human/corpse +/mob/living/human/corpse real_name = "corpse" -/mob/living/carbon/human/corpse/get_death_message(gibbed) +/mob/living/human/corpse/get_death_message(gibbed) return SKIP_DEATH_MESSAGE -/mob/living/carbon/human/corpse/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype, obj/abstract/landmark/corpse/corpse) - . = ..(mapload, species_name, new_dna, new_bodytype) // do not pass the corpse landmark +/mob/living/human/corpse/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance, obj/abstract/landmark/corpse/corpse) + . = ..(mapload, species_name, supplied_appearance) // do not pass the corpse landmark var/decl/cultural_info/culture = get_cultural_value(TAG_CULTURE) if(culture) var/newname = culture.get_random_name(src, gender, species.name) @@ -37,10 +37,10 @@ corpse.equip_corpse_outfit(src) return INITIALIZE_HINT_LATELOAD -/mob/living/carbon/human/corpse/get_death_message(gibbed) +/mob/living/human/corpse/get_death_message(gibbed) return SKIP_DEATH_MESSAGE -/mob/living/carbon/human/corpse/LateInitialize() +/mob/living/human/corpse/LateInitialize() ..() var/current_max_health = get_max_health() take_damage(current_max_health, OXY) //cease life functions @@ -50,22 +50,22 @@ if(corpse_heart) corpse_heart.pulse = PULSE_NONE//actually stops heart to make worried explorers not care too much -/mob/living/carbon/human/dummy/mannequin/add_to_living_mob_list() +/mob/living/human/dummy/mannequin/add_to_living_mob_list() return FALSE -/mob/living/carbon/human/dummy/mannequin/add_to_dead_mob_list() +/mob/living/human/dummy/mannequin/add_to_dead_mob_list() return FALSE -/mob/living/carbon/human/dummy/mannequin/fully_replace_character_name(new_name, in_depth = TRUE) +/mob/living/human/dummy/mannequin/fully_replace_character_name(new_name, in_depth = TRUE) ..("[new_name] (mannequin)", FALSE) -/mob/living/carbon/human/dummy/mannequin/InitializeHud() +/mob/living/human/dummy/mannequin/InitializeHud() return // Mannequins don't get HUDs -/mob/living/carbon/human/monkey +/mob/living/human/monkey gender = PLURAL -/mob/living/carbon/human/monkey/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/human/monkey/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) if(gender == PLURAL) gender = pick(MALE, FEMALE) species_name = SPECIES_MONKEY diff --git a/code/modules/mob/living/carbon/human/human_verbs.dm b/code/modules/mob/living/human/human_verbs.dm similarity index 92% rename from code/modules/mob/living/carbon/human/human_verbs.dm rename to code/modules/mob/living/human/human_verbs.dm index 3c5a947da48..32acb3e52f2 100644 --- a/code/modules/mob/living/carbon/human/human_verbs.dm +++ b/code/modules/mob/living/human/human_verbs.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/proc/morph() +/mob/living/human/proc/morph() set name = "Morph" set category = "Superpower" @@ -7,8 +7,8 @@ remoteview_target = null return - if(!(mMorph in mutations)) - src.verbs -= /mob/living/carbon/human/proc/morph + if(!has_genetic_condition(GENE_COND_SHAPESHIFTER)) + src.verbs -= /mob/living/human/proc/morph return var/new_facial = input("Please select facial hair color.", "Character Generation", GET_FACIAL_HAIR_COLOUR(src)) as color @@ -67,12 +67,11 @@ update_hair() try_refresh_visible_overlays() - check_dna() var/decl/pronouns/G = get_pronouns() visible_message("\The [src] morphs and changes [G.his] appearance!", "You change your appearance!", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!") -/mob/living/carbon/human/proc/remotesay() +/mob/living/human/proc/remotesay() set name = "Project mind" set category = "Superpower" @@ -81,18 +80,18 @@ remoteview_target = null return - if(!(mRemotetalk in src.mutations)) - src.verbs -= /mob/living/carbon/human/proc/remotesay + if(!has_genetic_condition(GENE_COND_REMOTE_TALK)) + src.verbs -= /mob/living/human/proc/remotesay return var/list/creatures = list() - for(var/mob/living/carbon/h in global.player_list) + for(var/mob/living/h in global.player_list) creatures += h var/mob/target = input("Who do you want to project your mind to ?") as null|anything in creatures if (isnull(target)) return var/say = sanitize(input("What do you wish to say")) - if(mRemotetalk in target.mutations) + if(target.has_genetic_condition(GENE_COND_REMOTE_TALK)) target.show_message("You hear [src.real_name]'s voice: [say]") else target.show_message("You hear a voice that seems to echo around the room: [say]") @@ -101,7 +100,7 @@ for(var/mob/observer/ghost/G in global.player_list) G.show_message("Telepathic message from [src] to [target]: [say]") -/mob/living/carbon/human/proc/remoteobserve() +/mob/living/human/proc/remoteobserve() set name = "Remote View" set category = "Superpower" @@ -110,10 +109,10 @@ reset_view(0) return - if(!(mRemote in src.mutations)) + if(!has_genetic_condition(GENE_COND_REMOTE_VIEW)) remoteview_target = null reset_view(0) - src.verbs -= /mob/living/carbon/human/proc/remoteobserve + src.verbs -= /mob/living/human/proc/remoteobserve return if(client.eye != client.mob) @@ -123,7 +122,7 @@ var/list/mob/creatures = list() - for(var/mob/living/carbon/h in global.living_mob_list_) + for(var/mob/living/h in global.living_mob_list_) var/turf/temp_turf = get_turf(h) if((temp_turf.z != 1 && temp_turf.z != 5) || h.stat!=CONSCIOUS) //Not on mining or the station. Or dead continue @@ -138,7 +137,7 @@ remoteview_target = null reset_view(0) -/mob/living/carbon/human/proc/remove_splints() +/mob/living/human/proc/remove_splints() set category = "Object" set name = "Remove Splints" set desc = "Carefully remove splints from someone's limbs." @@ -162,9 +161,9 @@ user.visible_message(SPAN_DANGER("\The [user] removes \the [src]'s splints!")) else to_chat(user, SPAN_WARNING("\The [src] has no splints that can be removed.")) - verbs -= /mob/living/carbon/human/proc/remove_splints + verbs -= /mob/living/human/proc/remove_splints -/mob/living/carbon/human/verb/check_pulse() +/mob/living/human/verb/check_pulse() set category = "Object" set name = "Check pulse" set desc = "Approximately count somebody's pulse. Requires you to stand still at least 6 seconds." @@ -198,7 +197,7 @@ else to_chat(usr, "You failed to check the pulse. Try again.") -/mob/living/carbon/human/proc/bloody_doodle() +/mob/living/human/proc/bloody_doodle() set category = "IC" set name = "Write in blood" set desc = "Use blood on your hands to write a short message on the floor or a wall, murder mystery style." @@ -214,7 +213,7 @@ if(grabber.coating) bloody_hands += REAGENT_VOLUME(grabber.coating, /decl/material/liquid/blood) if (!bloody_hands) - verbs -= /mob/living/carbon/human/proc/bloody_doodle + verbs -= /mob/living/human/proc/bloody_doodle var/obj/item/gloves = get_equipped_item(slot_gloves_str) if (gloves) @@ -259,7 +258,7 @@ W.message = message W.add_fingerprint(src) -/mob/living/carbon/human/proc/undislocate() +/mob/living/human/proc/undislocate() set category = "Object" set name = "Undislocate Joint" set desc = "Pop a joint back into place. Extremely painful." @@ -321,7 +320,7 @@ ) current_limb.undislocate() -/mob/living/carbon/human/verb/pull_punches() +/mob/living/human/verb/pull_punches() set name = "Switch Stance" set desc = "Try not to hurt them." set category = "IC" diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/human/life.dm similarity index 92% rename from code/modules/mob/living/carbon/human/life.dm rename to code/modules/mob/living/human/life.dm index bbbdf936373..8bc960c9226 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -20,10 +20,10 @@ #define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point #define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point -/mob/living/carbon/human +/mob/living/human var/stamina = 100 -/mob/living/carbon/human/handle_living_non_stasis_processes() +/mob/living/human/handle_living_non_stasis_processes() . = ..() if(!.) return FALSE @@ -34,10 +34,10 @@ handle_pain() handle_stamina() -/mob/living/carbon/human/get_stamina() +/mob/living/human/get_stamina() return stamina -/mob/living/carbon/human/adjust_stamina(var/amt) +/mob/living/human/adjust_stamina(var/amt) var/last_stamina = stamina if(stat == DEAD) stamina = 0 @@ -52,12 +52,12 @@ if(last_stamina != stamina && istype(hud_used)) hud_used.update_stamina() -/mob/living/carbon/human/proc/handle_stamina() +/mob/living/human/proc/handle_stamina() if((world.time - last_quick_move_time) > 5 SECONDS) var/mod = (current_posture.prone + (nutrition / get_max_nutrition())) / 2 adjust_stamina(max(get_config_value(/decl/config/num/movement_max_stamina_recovery), get_config_value(/decl/config/num/movement_min_stamina_recovery) * mod) * (1 + GET_CHEMICAL_EFFECT(src, CE_ENERGETIC))) -/mob/living/carbon/human/set_stat(var/new_stat) +/mob/living/human/set_stat(var/new_stat) var/old_stat = stat . = ..() if(stat) @@ -69,7 +69,7 @@ // Calculate how vulnerable the human is to the current pressure. // Returns 0 (equals 0 %) if sealed in an undamaged suit that's rated for the pressure, 1 if unprotected (equals 100%). // Suitdamage can modifiy this in 10% steps. -/mob/living/carbon/human/proc/get_pressure_weakness(pressure) +/mob/living/human/proc/get_pressure_weakness(pressure) var/pressure_adjustment_coefficient = 0 var/list/zones = list(SLOT_HEAD, SLOT_UPPER_BODY, SLOT_LOWER_BODY, SLOT_LEGS, SLOT_FEET, SLOT_ARMS, SLOT_HANDS) @@ -86,7 +86,7 @@ return pressure_adjustment_coefficient // Calculate how much of the enviroment pressure-difference affects the human. -/mob/living/carbon/human/calculate_affecting_pressure(var/pressure) +/mob/living/human/calculate_affecting_pressure(var/pressure) var/pressure_difference // First get the absolute pressure difference. @@ -112,7 +112,7 @@ else return ONE_ATMOSPHERE + pressure_difference -/mob/living/carbon/human/handle_impaired_vision() +/mob/living/human/handle_impaired_vision() . = ..() if(!.) @@ -120,47 +120,36 @@ //Vision var/obj/item/organ/vision - var/decl/bodytype/root_bodytype = get_bodytype() - if(root_bodytype.vision_organ) - vision = GET_INTERNAL_ORGAN(src, root_bodytype.vision_organ) + var/vision_organ_tag = get_vision_organ_tag() + if(vision_organ_tag) + vision = GET_INTERNAL_ORGAN(src, vision_organ_tag) - if(!root_bodytype.vision_organ) // Presumably if a species has no vision organs, they see via some other means. + if(!vision_organ_tag) // Presumably if a species has no vision organs, they see via some other means. set_status(STAT_BLIND, 0) set_status(STAT_BLURRY, 0) else if(!vision || (vision && !vision.is_usable())) // Vision organs cut out or broken? Permablind. SET_STATUS_MAX(src, STAT_BLIND, 2) SET_STATUS_MAX(src, STAT_BLURRY, 1) // Non-genetic blindness; covered eyes will heal faster. - else if(!(sdisabilities & BLINDED) && equipment_tint_total >= TINT_BLIND) + else if(!has_genetic_condition(GENE_COND_BLINDED) && equipment_tint_total >= TINT_BLIND) ADJ_STATUS(src, STAT_BLURRY, -1) -/mob/living/carbon/human/handle_disabilities() +/mob/living/human/handle_disabilities() ..() - if(stat != DEAD && (disabilities & COUGHING) && prob(5) && GET_STATUS(src, STAT_PARA) <= 1) + if(stat != DEAD && has_genetic_condition(GENE_COND_COUGHING) && prob(5) && GET_STATUS(src, STAT_PARA) <= 1) drop_held_items() cough() -/mob/living/carbon/human/handle_mutations_and_radiation() - if(get_damage(BURN)) - if((MUTATION_COLD_RESISTANCE in mutations) || (prob(1))) - heal_organ_damage(0,1) - - // DNA2 - Gene processing. - var/list/all_genes = decls_repository.get_decls_of_subtype(/decl/gene) - for(var/gene_type in all_genes) - var/decl/gene/gene = all_genes[gene_type] - if(!gene.block) - continue - if(gene.is_active(src)) - gene.OnMobLife(src) - +/mob/living/human/handle_mutations_and_radiation() + if(get_damage(BURN) && (has_genetic_condition(GENE_COND_COLD_RESISTANCE) || (prob(1)))) + heal_organ_damage(0,1) ..() -/mob/living/carbon/human/handle_environment(datum/gas_mixture/environment) +/mob/living/human/handle_environment(datum/gas_mixture/environment) ..() - if(!environment || (MUTATION_SPACERES in mutations)) + if(!environment || has_genetic_condition(GENE_COND_SPACE_RESISTANCE)) return //Stuff like water absorbtion happens here. @@ -268,19 +257,19 @@ return -/mob/living/carbon/human/get_bodytemperature_difference() +/mob/living/human/get_bodytemperature_difference() if (on_fire) return 0 //too busy for pesky metabolic regulation return ..() -/mob/living/carbon/human/stabilize_body_temperature() +/mob/living/human/stabilize_body_temperature() // Robolimbs cause overheating too. if(robolimb_count) bodytemperature += round(robolimb_count/2) return ..() //This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, SLOT_UPPER_BODY, SLOT_LOWER_BODY, etc. See setup.dm for the full list) -/mob/living/carbon/human/proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. +/mob/living/human/proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. . = 0 //Handle normal clothing for(var/slot in global.standard_clothing_slots) @@ -294,7 +283,7 @@ . |= accessory.heat_protection //See proc/get_heat_protection_flags(temperature) for the description of this proc. -/mob/living/carbon/human/proc/get_cold_protection_flags(temperature) +/mob/living/human/proc/get_cold_protection_flags(temperature) . = 0 //Handle normal clothing for(var/slot in global.standard_clothing_slots) @@ -308,19 +297,19 @@ . |= accessory.cold_protection -/mob/living/carbon/human/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to. +/mob/living/human/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to. var/thermal_protection_flags = get_heat_protection_flags(temperature) return get_thermal_protection(thermal_protection_flags) -/mob/living/carbon/human/get_cold_protection(temperature) - if(MUTATION_COLD_RESISTANCE in mutations) +/mob/living/human/get_cold_protection(temperature) + if(has_genetic_condition(GENE_COND_COLD_RESISTANCE)) return 1 //Fully protected from the cold. temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. var/thermal_protection_flags = get_cold_protection_flags(temperature) return get_thermal_protection(thermal_protection_flags) -/mob/living/carbon/human/proc/get_thermal_protection(var/flags) +/mob/living/human/proc/get_thermal_protection(var/flags) .=0 if(flags) if(flags & SLOT_HEAD) @@ -347,13 +336,13 @@ . += THERMAL_PROTECTION_HAND_RIGHT return min(1,.) -/mob/living/carbon/human/apply_chemical_effects() +/mob/living/human/apply_chemical_effects() . = ..() if(has_chemical_effect(CE_GLOWINGEYES, 1)) update_eyes() return TRUE -/mob/living/carbon/human/handle_regular_status_updates() +/mob/living/human/handle_regular_status_updates() voice = GetVoice() SetName(get_visible_name()) @@ -418,7 +407,7 @@ SET_STATUS_MAX(src, STAT_ASLEEP, 5) -/mob/living/carbon/human/handle_regular_hud_updates() +/mob/living/human/handle_regular_hud_updates() if(life_tick%30==15) hud_updateflag = 1022 if(hud_updateflag) // update our mob's hud overlays, AKA what others see flaoting above our head @@ -602,7 +591,7 @@ bodytemp.icon_state = "temp0" return 1 -/mob/living/carbon/human/handle_random_events() +/mob/living/human/handle_random_events() // Puke if toxloss is too high var/vomit_score = 0 for(var/tag in list(BP_LIVER,BP_KIDNEYS)) @@ -633,7 +622,7 @@ to_chat(src,"You feel like you're [pick("moving","flying","floating","falling","hovering")].") #define BASE_SHOCK_RECOVERY 1 -/mob/living/carbon/human/proc/handle_shock() +/mob/living/human/proc/handle_shock() if(!can_feel_pain() || (status_flags & GODMODE)) shock_stage = 0 return @@ -713,7 +702,7 @@ we only set those statuses and icons upon changes. Then those HUD items will simply add those pre-made images. This proc below is only called when those HUD elements need to change as determined by the mobs hud_updateflag. */ -/mob/living/carbon/human/proc/handle_hud_list() +/mob/living/human/proc/handle_hud_list() if (BITTEST(hud_updateflag, HEALTH_HUD) && hud_list[HEALTH_HUD]) var/image/holder = hud_list[HEALTH_HUD] if(stat == DEAD) @@ -822,7 +811,7 @@ hud_list[SPECIALROLE_HUD] = holder hud_updateflag = 0 -/mob/living/carbon/human/handle_fire() +/mob/living/human/handle_fire() if(..()) return @@ -852,22 +841,21 @@ if(!(E.body_part & protected_limbs) && prob(20)) E.take_external_damage(burn = round(species_heat_mod * log(10, (burn_temperature + 10)), 0.1), used_weapon = "fire") -/mob/living/carbon/human/rejuvenate() +/mob/living/human/rejuvenate() reset_blood() full_prosthetic = null shock_stage = 0 ..() adjust_stamina(100) - UpdateAppearance() -/mob/living/carbon/human/reset_view(atom/A) +/mob/living/human/reset_view(atom/A) ..() if(machine_visual && machine_visual != A) machine_visual.remove_visual(src) if(eyeobj) eyeobj.remove_visual(src) -/mob/living/carbon/human/handle_vision() +/mob/living/human/handle_vision() if(client) var/datum/global_hud/global_hud = get_global_hud() client.screen.Remove(global_hud.nvg, global_hud.thermal, global_hud.meson, global_hud.science) @@ -879,14 +867,14 @@ set_sight(sight|viewflags) if(eyeobj && eyeobj.owner != src) reset_view(null) - if((mRemote in mutations) && remoteview_target && remoteview_target.stat != CONSCIOUS) + if(has_genetic_condition(GENE_COND_REMOTE_VIEW) && remoteview_target && remoteview_target.stat != CONSCIOUS) remoteview_target = null reset_view(null, 0) update_equipment_vision() species.handle_vision(src) -/mob/living/carbon/human/update_living_sight() +/mob/living/human/update_living_sight() ..() - if(GET_CHEMICAL_EFFECT(src, CE_THIRDEYE) || (MUTATION_XRAY in mutations)) + if(GET_CHEMICAL_EFFECT(src, CE_THIRDEYE) || has_genetic_condition(GENE_COND_XRAY)) set_sight(sight|SEE_TURFS|SEE_MOBS|SEE_OBJS) diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/human/login.dm similarity index 62% rename from code/modules/mob/living/carbon/human/login.dm rename to code/modules/mob/living/human/login.dm index c74da53b8f1..3d8a8f70e2b 100644 --- a/code/modules/mob/living/carbon/human/login.dm +++ b/code/modules/mob/living/human/login.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/Login() +/mob/living/human/Login() ..() if(species) species.handle_login_special(src) diff --git a/code/modules/mob/living/carbon/human/logout.dm b/code/modules/mob/living/human/logout.dm similarity index 64% rename from code/modules/mob/living/carbon/human/logout.dm rename to code/modules/mob/living/human/logout.dm index f449ce991ad..3c473576f41 100644 --- a/code/modules/mob/living/carbon/human/logout.dm +++ b/code/modules/mob/living/human/logout.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/Logout() +/mob/living/human/Logout() ..() if(species) species.handle_logout_special(src) return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/human/npcs.dm similarity index 65% rename from code/modules/mob/living/carbon/human/npcs.dm rename to code/modules/mob/living/human/npcs.dm index 1eefd372172..cf9786e1a08 100644 --- a/code/modules/mob/living/carbon/human/npcs.dm +++ b/code/modules/mob/living/human/npcs.dm @@ -1,17 +1,20 @@ -/mob/living/carbon/human/monkey/punpun +/mob/living/human/monkey/punpun real_name = "Pun Pun" gender = MALE -/mob/living/carbon/human/monkey/punpun/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/human/monkey/punpun/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) ..() return INITIALIZE_HINT_LATELOAD -/mob/living/carbon/human/monkey/punpun/LateInitialize() +/mob/living/human/monkey/punpun/LateInitialize() ..() if(prob(50)) - equip_to_appropriate_slot(new /obj/item/clothing/under/waiter/monke(src)) + equip_to_appropriate_slot(new /obj/item/clothing/pants/slacks/black(src)) + equip_to_appropriate_slot(new /obj/item/clothing/shirt/button(src)) + equip_to_appropriate_slot(new /obj/item/clothing/neck/tie/bow/color/red(src)) + equip_to_appropriate_slot(new /obj/item/clothing/suit/jacket/vest/blue(src)) else - var/obj/item/clothing/C = new /obj/item/clothing/pants/casual/mustangjeans/monke(src) + var/obj/item/clothing/C = new /obj/item/clothing/pants/casual/mustangjeans(src) C.attach_accessory(null, new /obj/item/clothing/shirt/hawaii/random(src)) equip_to_appropriate_slot(C) if(prob(10)) @@ -32,12 +35,12 @@ sensor.set_sensor_mode(VITALS_SENSOR_OFF) attach_accessory(null, sensor) -/mob/living/carbon/human/blank/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/human/blank/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) species_name = SPECIES_HUMAN ..() return INITIALIZE_HINT_LATELOAD -/mob/living/carbon/human/blank/LateInitialize() +/mob/living/human/blank/LateInitialize() var/number = "[pick(global.greek_letters)]-[rand(1,30)]" fully_replace_character_name("Subject [number]") var/decl/hierarchy/outfit/outfit = outfit_by_type(/decl/hierarchy/outfit/blank_subject) @@ -46,5 +49,5 @@ if(F) F.SetName("[F.name] ([number])") -/mob/living/carbon/human/blank/ssd_check() +/mob/living/human/blank/ssd_check() return FALSE diff --git a/code/modules/mob/living/carbon/human/obj_grabs.dm b/code/modules/mob/living/human/obj_grabs.dm similarity index 100% rename from code/modules/mob/living/carbon/human/obj_grabs.dm rename to code/modules/mob/living/human/obj_grabs.dm diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/human/say.dm similarity index 86% rename from code/modules/mob/living/carbon/human/say.dm rename to code/modules/mob/living/human/say.dm index 5c76ae4c05f..2dbd8c4293d 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/human/say.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/say(var/message, var/decl/language/speaking, var/verb = "says", var/alt_name = "", whispering) +/mob/living/human/say(var/message, var/decl/language/speaking, var/verb = "says", var/alt_name = "", whispering) if(!whispering) var/obj/item/organ/internal/voicebox/voice = locate() in get_internal_organs() // Check if the language they're speaking is vocal and not supplied by a machine, and if they are currently suffocating. @@ -21,7 +21,7 @@ SetName(get_id_name("Unknown")) . = ..(message, speaking, verb, alt_name, whispering) -/mob/living/carbon/human/proc/forcesay(list/append) +/mob/living/human/proc/forcesay(list/append) if(stat == CONSCIOUS) if(client) var/virgin = 1 //has the text been modified yet? @@ -55,10 +55,10 @@ say(temp) winset(client, "input", "text=[null]") -/mob/living/carbon/human/say_understands(mob/speaker, decl/language/speaking) +/mob/living/human/say_understands(mob/speaker, decl/language/speaking) return (!speaking && (issilicon(speaker) || istype(speaker, /mob/announcer) || isbrain(speaker))) || ..() -/mob/living/carbon/human/say_quote(var/message, var/decl/language/speaking = null) +/mob/living/human/say_quote(var/message, var/decl/language/speaking = null) var/verb = "says" var/ending = copytext(message, length(message)) @@ -72,8 +72,8 @@ return verb -/mob/living/carbon/human/handle_speech_problems(var/list/message_data) - if(HAS_STATUS(src, STAT_SILENCE) || (sdisabilities & MUTED)) +/mob/living/human/handle_speech_problems(var/list/message_data) + if(HAS_STATUS(src, STAT_SILENCE) || has_genetic_condition(GENE_COND_MUTED)) to_chat(src, SPAN_WARNING("You are unable to speak!")) message_data[1] = "" return TRUE @@ -86,13 +86,13 @@ return ..(message_data) -/mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) +/mob/living/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) if(message_mode == MESSAGE_MODE_WHISPER) //It's going to get sanitized again immediately, so decode. whisper_say(html_decode(message), speaking, alt_name) return TRUE return ..() -/mob/living/carbon/human/handle_speech_sound() +/mob/living/human/handle_speech_sound() if(species.speech_sounds && prob(species.speech_chance)) var/list/returns[2] var/sound_to_play = species.speech_sounds @@ -103,7 +103,7 @@ return returns return ..() -/mob/living/carbon/human/can_speak(decl/language/speaking) +/mob/living/human/can_speak(decl/language/speaking) if(ispath(speaking, /decl/language)) speaking = GET_DECL(speaking) if(!istype(speaking)) @@ -118,7 +118,7 @@ return FALSE . = ..() -/mob/living/carbon/human/parse_language(var/message) +/mob/living/human/parse_language(var/message) var/prefix = copytext(message,1,2) if(length(message) >= 1 && prefix == get_prefix_key(/decl/prefix/audible_emote)) return GET_DECL(/decl/language/noise) diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/human/unarmed_attack.dm similarity index 91% rename from code/modules/mob/living/carbon/human/unarmed_attack.dm rename to code/modules/mob/living/human/unarmed_attack.dm index d3a9bed0863..708fe84c7ff 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/human/unarmed_attack.dm @@ -40,7 +40,11 @@ return PAIN return BRUTE -/decl/natural_attack/proc/padded_by_user_gear(var/mob/living/carbon/human/user) +/decl/natural_attack/proc/get_damage_flags() + . |= (sharp && DAM_SHARP) + . |= (edge && DAM_EDGE) + +/decl/natural_attack/proc/padded_by_user_gear(var/mob/living/human/user) if(istype(user) && length(usable_with_limbs)) for(var/limb_slot in usable_with_limbs) var/obj/item/gear = user.get_covering_equipped_item_by_zone(limb_slot) @@ -48,7 +52,7 @@ return TRUE return FALSE -/decl/natural_attack/proc/resolve_to_soft_variant(var/mob/living/carbon/human/user) +/decl/natural_attack/proc/resolve_to_soft_variant(var/mob/living/human/user) . = src if(istype(user) && (user.pulling_punches || padded_by_user_gear(user))) var/decl/natural_attack/soft_variant = get_sparring_variant() @@ -58,7 +62,7 @@ /decl/natural_attack/proc/get_sparring_variant() return GET_DECL(sparring_variant_type) -/decl/natural_attack/proc/is_usable(var/mob/living/carbon/human/user, var/mob/target, var/zone) +/decl/natural_attack/proc/is_usable(var/mob/living/human/user, var/mob/target, var/zone) if(!user.restrained() && !user.incapacitated()) for(var/etype in usable_with_limbs) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(user, etype) @@ -128,7 +132,7 @@ return TRUE -/decl/natural_attack/proc/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/proc/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/msg = "\The [user] [pick(attack_verb)] \the [target]" var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(affecting) @@ -139,7 +143,7 @@ user.visible_message(SPAN_DANGER("[msg]!")) playsound(user.loc, attack_sound, 25, 1, -1) -/decl/natural_attack/proc/handle_eye_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target) +/decl/natural_attack/proc/handle_eye_attack(var/mob/living/human/user, var/mob/living/human/target) var/obj/item/organ/internal/eyes = GET_INTERNAL_ORGAN(target, BP_EYES) var/decl/pronouns/G = user.get_pronouns() if(eyes) @@ -173,7 +177,7 @@ sharp = 1 edge = 1 -/decl/natural_attack/bite/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) +/decl/natural_attack/bite/is_usable(var/mob/living/human/user, var/mob/living/human/target, var/zone) if(user.get_item_blocking_speech()) return 0 @@ -196,7 +200,7 @@ sparring_variant_type = /decl/natural_attack/light_strike/punch is_starting_default = TRUE -/decl/natural_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/punch/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(!affecting) @@ -258,7 +262,7 @@ usable_with_limbs = list(BP_L_FOOT, BP_R_FOOT) sparring_variant_type = /decl/natural_attack/light_strike/kick -/decl/natural_attack/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) +/decl/natural_attack/kick/is_usable(var/mob/living/human/user, var/mob/living/human/target, var/zone) if(zone == BP_HEAD || zone == BP_EYES || zone == BP_MOUTH) zone = BP_CHEST . = ..() @@ -269,7 +273,7 @@ return damage return damage + (shoes ? shoes.force : 0) -/decl/natural_attack/kick/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/kick/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(!affecting) @@ -290,7 +294,7 @@ damage = 0 usable_with_limbs = list(BP_L_FOOT, BP_R_FOOT) -/decl/natural_attack/stomp/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) +/decl/natural_attack/stomp/is_usable(var/mob/living/human/user, var/mob/living/human/target, var/zone) if(!istype(target)) return FALSE if (!user.current_posture.prone && (target.current_posture.prone || (zone in list(BP_L_FOOT, BP_R_FOOT)))) @@ -305,7 +309,7 @@ var/obj/item/clothing/shoes = user.get_equipped_item(slot_shoes_str) return damage + (shoes ? shoes.force : 0) -/decl/natural_attack/stomp/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/stomp/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(!affecting) @@ -353,7 +357,7 @@ attack_noun = list("foot") usable_with_limbs = list(BP_L_FOOT, BP_R_FOOT) -/decl/natural_attack/light_strike/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) +/decl/natural_attack/light_strike/kick/is_usable(var/mob/living/human/user, var/mob/living/human/target, var/zone) if(zone == BP_HEAD || zone == BP_EYES || zone == BP_MOUTH) zone = BP_CHEST . = ..() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/human/update_icons.dm similarity index 87% rename from code/modules/mob/living/carbon/human/update_icons.dm rename to code/modules/mob/living/human/update_icons.dm index 4bc4a8c0184..0109853188c 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/human/update_icons.dm @@ -68,7 +68,7 @@ There are several things that need to be remembered: update_equipment_overlay(slot_wear_suit_str) > There are also these special cases: - update_mutations() //handles updating your appearance for certain mutations. e.g TK head-glows + update_genetic_conditions() //handles updating your appearance for certain mutations. e.g TK head-glows update_damage_overlays() //handles damage overlays for brute/burn damage //(will rename this when I geta round to it) update_body() //Handles updating your mob's icon to reflect their gender/race/complexion etc update_hair() //Handles updating your hair overlay (used to be update_face, but mouth and @@ -102,8 +102,8 @@ If you have any questions/constructive-comments/bugs-to-report/or have a massivl Please contact me on #coderbus IRC. ~Carn x */ -/mob/living/carbon/human/refresh_visible_overlays() - update_mutations(FALSE) +/mob/living/human/refresh_visible_overlays() + update_genetic_conditions(FALSE) update_body(FALSE) update_skin(FALSE) update_underwear(FALSE) @@ -115,12 +115,12 @@ Please contact me on #coderbus IRC. ~Carn x update_damage_overlays(FALSE) return ..() -/mob/living/carbon/human/on_update_icon() +/mob/living/human/on_update_icon() if(regenerate_body_icon) regenerate_body_icon = FALSE ..() -/mob/living/carbon/human/apply_visible_overlays() +/mob/living/human/apply_visible_overlays() var/list/visible_overlays var/list/visible_underlays if(is_cloaked()) @@ -134,6 +134,10 @@ Please contact me on #coderbus IRC. ~Carn x visible_underlays = get_all_current_mob_underlays() var/decl/bodytype/root_bodytype = get_bodytype() + // We are somehow updating with no torso, or a torso with no bodytype (probably gibbing). No point continuing. + if(!root_bodytype) + return + var/matrix/M = matrix() if(current_posture?.prone && (root_bodytype.prone_overlay_offset[1] || root_bodytype.prone_overlay_offset[2])) M.Translate(root_bodytype.prone_overlay_offset[1], root_bodytype.prone_overlay_offset[2]) @@ -173,7 +177,7 @@ Please contact me on #coderbus IRC. ~Carn x // If you want stuff like scaling based on species or something, here is a good spot to mix the numbers together. return list(icon_scale_x, icon_scale_y) -/mob/living/carbon/human/update_appearance_flags(add_flags, remove_flags) +/mob/living/human/update_appearance_flags(add_flags, remove_flags) . = ..() if(.) update_icon() @@ -192,7 +196,7 @@ Please contact me on #coderbus IRC. ~Carn x transform = M return transform -/mob/living/carbon/human/update_transform() +/mob/living/human/update_transform() // First, get the correct size. var/list/icon_scale_values = get_icon_scale_mult() @@ -245,11 +249,11 @@ Please contact me on #coderbus IRC. ~Carn x return transform -/mob/living/carbon/human/update_damage_overlays(update_icons = TRUE) +/mob/living/human/update_damage_overlays(update_icons = TRUE) . = ..() update_bandages(update_icons) -/mob/living/carbon/human/proc/update_bandages(var/update_icons=1) +/mob/living/human/proc/update_bandages(var/update_icons=1) var/list/bandage_overlays var/bandage_icon = get_bodytype().get_bandages_icon(src) if(bandage_icon) @@ -259,7 +263,7 @@ Please contact me on #coderbus IRC. ~Carn x LAZYADD(bandage_overlays, image(bandage_icon, "[O.icon_state][bandage_level]")) set_current_mob_overlay(HO_DAMAGE_LAYER, bandage_overlays, update_icons) -/mob/living/carbon/human/proc/get_human_icon_cache_key() +/mob/living/human/proc/get_human_icon_cache_key() . = list() for(var/limb_tag in global.all_limb_tags) . += "[limb_tag]_" @@ -269,11 +273,11 @@ Please contact me on #coderbus IRC. ~Carn x continue part.update_icon() // This wil regenerate their icon if needed, and more importantly set their cache key. . += part._icon_cache_key - . += "husked_[!!is_husked()]" + . += "husked_[!!has_genetic_condition(GENE_COND_HUSK)]" . = JOINTEXT(.) //BASE MOB SPRITE -/mob/living/carbon/human/update_body(var/update_icons = TRUE) +/mob/living/human/update_body(var/update_icons = TRUE) var/list/limbs = get_external_organs() if(!LAZYLEN(limbs)) @@ -311,7 +315,7 @@ Please contact me on #coderbus IRC. ~Carn x else stand_icon.Blend(temp, ICON_OVERLAY) //Handle husk overlay. - if(is_husked()) + if(has_genetic_condition(GENE_COND_HUSK)) var/husk_icon = root_bodytype.get_husk_icon(src) if(husk_icon) var/icon/mask = new(stand_icon) @@ -329,7 +333,7 @@ Please contact me on #coderbus IRC. ~Carn x //UNDERWEAR OVERLAY -/mob/living/carbon/human/proc/update_underwear(var/update_icons=1) +/mob/living/human/proc/update_underwear(var/update_icons=1) var/list/undies = list() for(var/entry in worn_underwear) @@ -352,40 +356,29 @@ Please contact me on #coderbus IRC. ~Carn x undies += I set_current_mob_overlay(HO_UNDERWEAR_LAYER, undies, update_icons) -/mob/living/carbon/human/update_hair(var/update_icons=1) +/mob/living/human/update_hair(var/update_icons=1) var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD, /obj/item/organ/external/head) var/list/new_accessories = head_organ?.get_mob_overlays() set_current_mob_overlay(HO_HAIR_LAYER, new_accessories, update_icons) -/mob/living/carbon/human/proc/update_skin(var/update_icons=1) +/mob/living/human/proc/update_skin(var/update_icons=1) // todo: make this use bodytype set_current_mob_overlay(HO_SKIN_LAYER, species.update_skin(src), update_icons) -/mob/living/carbon/human/update_mutations(var/update_icons=1) - - var/image/standing = overlay_image('icons/effects/genetics.dmi', flags=RESET_COLOR) - var/add_image = 0 - var/g = "m" - if(gender == FEMALE) g = "f" - // DNA2 - Drawing underlays. - var/list/all_genes = decls_repository.get_decls_of_subtype(/decl/gene) - for(var/gene_type in all_genes) - var/decl/gene/gene = all_genes[gene_type] - if(!gene.block) - continue - if(gene.is_active(src)) - var/underlay=gene.OnDrawUnderlays(src,g) - if(underlay) - standing.underlays += underlay - add_image = 1 - set_current_mob_overlay(HO_MUTATIONS_LAYER, (add_image ? standing : null), update_icons) +/mob/living/human/update_genetic_conditions(var/update_icons=1) + var/list/condition_overlays = null + for(var/decl/genetic_condition/condition as anything in get_genetic_conditions()) + var/condition_overlay = condition.get_mob_overlay() + if(condition_overlay) + LAZYADD(condition_overlays, condition_overlay) + set_current_mob_overlay(HO_CONDITION_LAYER, condition_overlays, update_icons) /* --------------------------------------- */ //vvvvvv UPDATE_INV PROCS vvvvvv /mob/living/proc/update_tail_showing(var/update_icons=1) return -/mob/living/carbon/human/update_tail_showing(var/update_icons=1) +/mob/living/human/update_tail_showing(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) if(!istype(tail_organ)) @@ -414,11 +407,19 @@ Please contact me on #coderbus IRC. ~Carn x set_current_mob_overlay(HO_TAIL_LAYER, null, FALSE) set_current_mob_underlay(HU_TAIL_LAYER, tail_image, update_icons) -/mob/living/carbon/human/proc/get_tail_icon_for_organ(var/obj/item/organ/external/tail/tail_organ) +/mob/living/human/proc/get_tail_icon_for_organ(var/obj/item/organ/external/tail/tail_organ) if(!istype(tail_organ)) return var/tail_state = tail_organ.get_tail() + if(tail_organ.limb_flags & ORGAN_FLAG_SKELETAL) + if(!tail_organ.bodytype?.skeletal_icon) + return + var/tail_cache_key = "[tail_state][tail_organ.bodytype.skeletal_icon]_skeletal" + if(!global.tail_icon_cache[tail_cache_key]) + global.tail_icon_cache[tail_cache_key] = icon(tail_organ.bodytype.skeletal_icon, tail_state) + return global.tail_icon_cache[tail_cache_key] + var/tail_icon = tail_organ.get_tail_icon() if(!tail_state || !tail_icon) return // No tail data! @@ -456,9 +457,9 @@ Please contact me on #coderbus IRC. ~Carn x if(tail_organ?.get_tail()) update_tail_showing() -/mob/living/carbon/human/proc/set_tail_state(var/t_state) +/mob/living/human/proc/set_tail_state(var/t_state) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) - if(!tail_organ) + if(!tail_organ || (tail_organ.limb_flags & ORGAN_FLAG_SKELETAL)) return null var/image/tail_overlay = get_current_tail_image() if(tail_overlay && check_state_in_icon(tail_overlay.icon, t_state)) @@ -467,12 +468,12 @@ Please contact me on #coderbus IRC. ~Carn x //Not really once, since BYOND can't do that. //Update this if the ability to flick() images or make looping animation start at the first frame is ever added. -/mob/living/carbon/human/proc/get_current_tail_image() +/mob/living/human/proc/get_current_tail_image() return get_current_mob_overlay(HO_TAIL_LAYER) || get_current_mob_underlay(HU_TAIL_LAYER) -/mob/living/carbon/human/proc/animate_tail_once(var/update_icons=1) +/mob/living/human/proc/animate_tail_once(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) - if(!tail_organ) + if(!tail_organ || (tail_organ.limb_flags & ORGAN_FLAG_SKELETAL)) return var/t_state = "[tail_organ.get_tail()]_once" @@ -491,9 +492,9 @@ Please contact me on #coderbus IRC. ~Carn x if(update_icons) queue_icon_update() -/mob/living/carbon/human/proc/animate_tail_start(var/update_icons=1) +/mob/living/human/proc/animate_tail_start(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) - if(!tail_organ) + if(!tail_organ || (tail_organ.limb_flags & ORGAN_FLAG_SKELETAL)) return var/tail_states = tail_organ.get_tail_states() if(tail_states) @@ -501,9 +502,9 @@ Please contact me on #coderbus IRC. ~Carn x if(update_icons) queue_icon_update() -/mob/living/carbon/human/proc/animate_tail_fast(var/update_icons=1) +/mob/living/human/proc/animate_tail_fast(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) - if(!tail_organ) + if(!tail_organ || (tail_organ.limb_flags & ORGAN_FLAG_SKELETAL)) return var/tail_states = tail_organ.get_tail_states() if(tail_states) @@ -511,9 +512,9 @@ Please contact me on #coderbus IRC. ~Carn x if(update_icons) queue_icon_update() -/mob/living/carbon/human/proc/animate_tail_reset(var/update_icons=1) +/mob/living/human/proc/animate_tail_reset(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) - if(!tail_organ) + if(!tail_organ || (tail_organ.limb_flags & ORGAN_FLAG_SKELETAL)) return var/tail_states = tail_organ.get_tail_states(src) if(stat != DEAD && tail_states) @@ -524,30 +525,19 @@ Please contact me on #coderbus IRC. ~Carn x if(update_icons) queue_icon_update() -/mob/living/carbon/human/proc/animate_tail_stop(var/update_icons=1) +/mob/living/human/proc/animate_tail_stop(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) - if(!tail_organ) + if(!tail_organ || (tail_organ.limb_flags & ORGAN_FLAG_SKELETAL)) return set_tail_state("[tail_organ.get_tail()]_static") -/mob/living/carbon/human/update_fire(var/update_icons=1) +/mob/living/human/update_fire(var/update_icons=1) if(on_fire) var/image/standing = overlay_image(get_bodytype()?.get_ignited_icon(src) || 'icons/mob/OnFire.dmi', "Standing", RESET_COLOR) set_current_mob_overlay(HO_FIRE_LAYER, standing, update_icons) else set_current_mob_overlay(HO_FIRE_LAYER, null, update_icons) -//Ported from hud login stuff -// -/mob/living/carbon/hud_reset(full_reset = FALSE) - if(!(. = ..())) - return . - for(var/obj/item/gear in get_equipped_items(TRUE)) - client.screen |= gear - if(istype(hud_used)) - hud_used.hidden_inventory_update() - hud_used.persistant_inventory_update() - update_action_buttons() - if(internals && internal) +/mob/living/human/hud_reset(full_reset = FALSE) + if((. = ..()) && internals && internal) internals.icon_state = "internal1" - queue_hand_rebuild() diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/human/whisper.dm similarity index 76% rename from code/modules/mob/living/carbon/human/whisper.dm rename to code/modules/mob/living/human/whisper.dm index 6776178e432..fa848cc225f 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/human/whisper.dm @@ -1,5 +1,5 @@ //Lallander was here -/mob/living/carbon/human/whisper(message as text) +/mob/living/human/whisper(message as text) if(filter_block_message(src, message)) return @@ -24,5 +24,5 @@ //This is used by both the whisper verb and human/say() to handle whispering -/mob/living/carbon/human/proc/whisper_say(var/message, var/decl/language/speaking = null, var/alt_name="", var/verb="whispers") +/mob/living/human/proc/whisper_say(var/message, var/decl/language/speaking = null, var/alt_name="", var/verb="whispers") say(message, speaking, verb, alt_name, whispering = TRUE) \ No newline at end of file diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 782bdbae84d..18588dee914 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -435,14 +435,14 @@ SHOULD_CALL_PARENT(TRUE) if(stat == DEAD) SET_STATUS_MAX(src, STAT_BLIND, 0) - if(stat != CONSCIOUS && (sdisabilities & BLINDED)) //blindness from disability or unconsciousness doesn't get better on its own + if(stat != CONSCIOUS && has_genetic_condition(GENE_COND_BLINDED)) //blindness from disability or unconsciousness doesn't get better on its own SET_STATUS_MAX(src, STAT_BLIND, 2) else return TRUE return FALSE /mob/living/proc/handle_impaired_hearing() - if((sdisabilities & DEAFENED) || stat) //disabled-deaf, doesn't get better on its own + if(has_genetic_condition(GENE_COND_DEAFENED) || stat) //disabled-deaf, doesn't get better on its own SET_STATUS_MAX(src, STAT_TINNITUS, 2) /mob/living/proc/should_do_hud_updates() @@ -493,7 +493,7 @@ overlay_fullscreen("blind", /obj/screen/fullscreen/blind) else clear_fullscreen("blind") - set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) + set_fullscreen(has_genetic_condition(GENE_COND_NEARSIGHTED), "impaired", /obj/screen/fullscreen/impaired, 1) set_fullscreen(GET_STATUS(src, STAT_BLURRY), "blurry", /obj/screen/fullscreen/blurry) set_fullscreen(GET_STATUS(src, STAT_DRUGGY), "high", /obj/screen/fullscreen/high) set_fullscreen(stat == UNCONSCIOUS, "blackout", /obj/screen/fullscreen/blackout) @@ -572,6 +572,7 @@ #define LIMB_DAMAGED 1 #define LIMB_IMPAIRED 0.5 + /mob/living/proc/handle_stance() set waitfor = FALSE // Can sleep in emotes. // Don't need to process any of this if they aren't standing anyways diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 1babace692f..e61fb103f46 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -20,7 +20,9 @@ /mob/living/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) if(admin_paralyzed) - to_chat(user, SPAN_OCCULT("OOC: They have been paralyzed by staff. Please avoid interacting with them unless cleared to do so by staff.")) + to_chat(user, SPAN_OCCULT("OOC: [pronouns.He] [pronouns.has] been paralyzed by staff. Please avoid interacting with [pronouns.him] unless cleared to do so by staff.")) + if(!length(get_external_organs()) && length(embedded)) // fallback for simple embedding used by limbless mobs + to_chat(user, SPAN_WARNING("[pronouns.He] [pronouns.has] [inline_counting_english_list(embedded, determiners = DET_INDEFINITE)] embedded in [pronouns.him].")) //mob verbs are faster than object verbs. See above. /mob/living/pointed(atom/A as mob|obj|turf in view()) @@ -31,7 +33,7 @@ if(!..()) return 0 - usr.visible_message("[src] points to [A]") + usr.visible_message("[src] points to [A]") return 1 /*one proc, four uses @@ -147,7 +149,7 @@ default behaviour is: if(!tmob.buckled.anchored) step(tmob.buckled, t) if(ishuman(AM)) - var/mob/living/carbon/human/M = AM + var/mob/living/human/M = AM for(var/obj/item/grab/G in M.grabbed_by) step(G.assailant, get_dir(G.assailant, AM)) G.adjust_position() @@ -300,13 +302,6 @@ default behaviour is: /mob/living/proc/restore_all_organs() return - -/mob/living/carbon/revive() - var/obj/item/cuffs = get_equipped_item(slot_handcuffed_str) - if (cuffs) - try_unequip(cuffs, get_turf(src)) - . = ..() - /mob/living/proc/revive() rejuvenate() if(buckled) @@ -316,6 +311,9 @@ default behaviour is: BITSET(hud_updateflag, LIFE_HUD) ExtinguishMob() fire_stacks = 0 + var/obj/item/cuffs = get_equipped_item(slot_handcuffed_str) + if (cuffs) + try_unequip(cuffs, get_turf(src)) /mob/living/proc/rejuvenate() @@ -335,8 +333,7 @@ default behaviour is: // shut down ongoing problems radiation = 0 bodytemperature = get_species()?.body_temperature || initial(bodytemperature) - sdisabilities = 0 - disabilities = 0 + reset_genetic_conditions() // fix all status conditions including blind/deaf clear_status_effects() @@ -361,12 +358,26 @@ default behaviour is: BITSET(hud_updateflag, STATUS_HUD) BITSET(hud_updateflag, LIFE_HUD) + set_nutrition(get_max_nutrition()) + set_hydration(get_max_hydration()) + failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath. reload_fullscreen() return /mob/living/proc/basic_revival(var/repair_brain = TRUE) + if(repair_brain && should_have_organ(BP_BRAIN)) + repair_brain = FALSE + var/obj/item/organ/internal/brain = GET_INTERNAL_ORGAN(src, BP_BRAIN) + if(brain) + if(brain.damage > (brain.max_damage/2)) + brain.damage = (brain.max_damage/2) + if(brain.status & ORGAN_DEAD) + brain.status &= ~ORGAN_DEAD + START_PROCESSING(SSobj, brain) + brain.update_icon() + if(repair_brain && get_damage(BRAIN) > 50) repair_brain = FALSE set_damage(BRAIN, 50) @@ -385,19 +396,6 @@ default behaviour is: failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath. reload_fullscreen() -/mob/living/carbon/basic_revival(var/repair_brain = TRUE) - if(repair_brain && should_have_organ(BP_BRAIN)) - repair_brain = FALSE - var/obj/item/organ/internal/brain = GET_INTERNAL_ORGAN(src, BP_BRAIN) - if(brain) - if(brain.damage > (brain.max_damage/2)) - brain.damage = (brain.max_damage/2) - if(brain.status & ORGAN_DEAD) - brain.status &= ~ORGAN_DEAD - START_PROCESSING(SSobj, brain) - brain.update_icon() - ..(repair_brain) - /mob/living var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed var/static/list/damage_icon_parts = list() @@ -509,6 +507,8 @@ default behaviour is: handle_grabs_after_move(old_loc, Dir) if(active_storage && !active_storage.can_view(src)) active_storage.close(src) + if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8)) + germ_level++ /mob/living/verb/resist() set name = "Resist" @@ -575,22 +575,6 @@ default behaviour is: if(loc != H) qdel(H) -/mob/living/proc/escape_buckle() - if(buckled) - if(buckled.can_buckle) - buckled.user_unbuckle_mob(src) - else - to_chat(usr, "You can't seem to escape from \the [buckled]!") - return - -/mob/living/proc/resist_grab() - var/resisting = 0 - for(var/obj/item/grab/G in grabbed_by) - resisting++ - G.handle_resist() - if(resisting) - visible_message("[src] resists!") - // Shortcut for people used to typing Rest instead of Change Posture. /mob/living/verb/rest_verb() set name = "Rest" @@ -630,21 +614,37 @@ default behaviour is: //called when the mob receives a bright flash /mob/living/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) - if(override_blindness_check || !(disabilities & BLINDED)) - ..() + if(eyecheck() < intensity || override_blindness_check || !has_genetic_condition(GENE_COND_BLINDED)) overlay_fullscreen("flash", type) spawn(25) if(src) clear_fullscreen("flash", 25) - return 1 + return TRUE + return FALSE /mob/living/proc/has_brain() return TRUE /mob/living/proc/slip(var/slipped_on, stun_duration = 8) + + var/decl/species/my_species = get_species() + if(my_species?.check_no_slip(src)) + return FALSE + + var/obj/item/shoes = get_equipped_item(slot_shoes_str) + if(shoes && (shoes.item_flags & ITEM_FLAG_NOSLIP)) + return FALSE + + if(has_gravity() && !buckled && !current_posture?.prone) + to_chat(src, SPAN_DANGER("You slipped on [slipped_on]!")) + playsound(loc, 'sound/misc/slip.ogg', 50, 1, -3) + SET_STATUS_MAX(src, STAT_WEAK, stun_duration) + return TRUE + return FALSE -/mob/living/carbon/human/canUnEquip(obj/item/I) + +/mob/living/human/canUnEquip(obj/item/I) . = ..() && !(I in get_organs()) /mob/proc/can_be_possessed_by(var/mob/observer/ghost/possessor) @@ -677,15 +677,6 @@ default behaviour is: src.ckey = possessor.ckey qdel(possessor) - if(round_is_spooky(6)) // Six or more active cultists. - to_chat(src, "You reach out with tendrils of ectoplasm and invade the mind of \the [src]...") - to_chat(src, "You have assumed direct control of \the [src].") - to_chat(src, "Due to the spookiness of the round, you have taken control of the poor animal as an invading, possessing spirit - roleplay accordingly.") - src.universal_speak = TRUE - src.universal_understand = TRUE - //src.on_defilement() // Maybe another time. - return - to_chat(src, "You are now \the [src]!") to_chat(src, "Remember to stay in character for a mob of this type!") return 1 @@ -747,7 +738,7 @@ default behaviour is: . += 15 if(HAS_STATUS(src, STAT_CONFUSE)) . += 30 - if(MUTATION_CLUMSY in mutations) + if(has_genetic_condition(GENE_COND_CLUMSY)) . += 40 /mob/living/proc/ranged_accuracy_mods() @@ -760,7 +751,7 @@ default behaviour is: . -= 5 if(HAS_STATUS(src, STAT_BLURRY)) . -= 1 - if(MUTATION_CLUMSY in mutations) + if(has_genetic_condition(GENE_COND_CLUMSY)) . -= 3 /mob/living/can_drown() @@ -806,6 +797,7 @@ default behaviour is: A.fluid_act(fluids) if(QDELETED(src) || !fluids.total_volume) return + // TODO: review saturation logic so we can end up with more than like 15 water in our contact reagents. var/datum/reagents/touching_reagents = get_contact_reagents() if(touching_reagents) var/saturation = min(fluids.total_volume, round(mob_size * 1.5 * reagent_permeability()) - touching_reagents.total_volume) @@ -835,8 +827,26 @@ default behaviour is: /mob/living/proc/handle_additional_vomit_reagents(var/obj/effect/decal/cleanable/vomit/vomit) vomit.add_to_reagents(/decl/material/liquid/acid/stomach, 5) +/mob/living/proc/get_flash_mod() + var/vision_organ_tag = get_vision_organ_tag() + if(vision_organ_tag) + var/obj/item/organ/internal/eyes/I = get_organ(vision_organ_tag, /obj/item/organ/internal/eyes) + if(I) // get_organ with a type passed already does a typecheck + return I.get_flash_mod() + return get_bodytype()?.eye_flash_mod + /mob/living/proc/eyecheck() - return FLASH_PROTECTION_NONE + var/total_protection = flash_protection + if(should_have_organ(BP_EYES)) + var/vision_organ_tag = get_vision_organ_tag() + if(vision_organ_tag && get_bodytype()?.has_organ[vision_organ_tag]) + var/obj/item/organ/internal/eyes/I = get_organ(vision_organ_tag, /obj/item/organ/internal/eyes) + if(!I?.is_usable()) + return FLASH_PROTECTION_MAJOR + total_protection = I.get_total_protection(flash_protection) + else // They can't be flashed if they don't have eyes. + return FLASH_PROTECTION_MAJOR + return total_protection /mob/living/proc/get_satiated_nutrition() return 500 @@ -941,7 +951,7 @@ default behaviour is: /mob/living/proc/should_have_organ(organ_to_check) var/decl/bodytype/root_bodytype = get_bodytype() - return root_bodytype?.has_organ[organ_to_check] + return !!root_bodytype?.has_organ[organ_to_check] /// Returns null if the mob's bodytype doesn't have a limb tag by default. /// Otherwise, returns the data of the limb instead. @@ -1146,12 +1156,14 @@ default behaviour is: //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle return life_tick <= 5 || !timeofdeath || (timeofdeath >= 5 && (world.time-timeofdeath) <= 10 MINUTES) -/mob/living/proc/check_dna() - dna?.check_integrity(src) - /mob/living/get_unique_enzymes() + if(isnull(unique_enzymes) && has_genetic_information()) + set_unique_enzymes(md5(name)) return unique_enzymes +/mob/living/set_unique_enzymes(value) + unique_enzymes = value + /mob/living/get_blood_type() return blood_type @@ -1186,7 +1198,7 @@ default behaviour is: var/how_open = round(E.how_open()) if(how_open <= 0) continue - var/surgery_icon = E.species.get_surgery_overlay_icon(src) + var/surgery_icon = E.get_surgery_overlay_icon() if(!surgery_icon) continue if(!total) @@ -1263,6 +1275,8 @@ default behaviour is: return "Unknown" /mob/living/proc/identity_is_visible() + if(has_genetic_condition(GENE_COND_HUSK)) + return FALSE if(!real_name) return FALSE var/obj/item/clothing/mask/mask = get_equipped_item(slot_wear_mask_str) @@ -1502,7 +1516,6 @@ default behaviour is: /mob/living/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, datum/callback/callback) //If this returns FALSE then callback will not be called. return !length(pinned) && ..() - /mob/living/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) LAZYREMOVE(embedded, implant) @@ -1542,6 +1555,52 @@ default behaviour is: /mob/living/proc/handle_footsteps() return +/mob/living/handle_flashed(var/obj/item/flash/flash, var/flash_strength) + + var/safety = eyecheck() + if(safety >= FLASH_PROTECTION_MODERATE || flash_strength <= 0) // May be modified by human proc. + return FALSE + + flash_eyes(FLASH_PROTECTION_MODERATE - safety) + SET_STATUS_MAX(src, STAT_STUN, (flash_strength / 2)) + SET_STATUS_MAX(src, STAT_BLURRY, flash_strength) + SET_STATUS_MAX(src, STAT_CONFUSE, (flash_strength + 2)) + if(flash_strength > 3) + drop_held_items() + if(flash_strength > 5) + SET_STATUS_MAX(src, STAT_WEAK, 2) + +/mob/living/verb/showoff() + set name = "Show Held Item" + set category = "Object" + + var/obj/item/I = get_active_held_item() + if(I && I.simulated) + I.showoff(src) + +/mob/living/relaymove(var/mob/living/user, direction) + if(!istype(user) || !(user in contents) || user.is_on_special_ability_cooldown()) + return + user.set_special_ability_cooldown(5 SECONDS) + visible_message(SPAN_DANGER("You hear something rumbling inside [src]'s stomach...")) + var/obj/item/I = user.get_active_held_item() + if(!I?.force) + return + var/d = rand(round(I.force / 4), I.force) + visible_message(SPAN_DANGER("\The [user] attacks [src]'s stomach wall with \the [I]!")) + playsound(user.loc, 'sound/effects/attackblob.ogg', 50, 1) + var/obj/item/organ/external/organ = GET_EXTERNAL_ORGAN(src, BP_CHEST) + if(istype(organ)) + organ.take_external_damage(d, 0) + else + take_organ_damage(d) + if(prob(get_damage(BRUTE) - 50)) + gib() + +/mob/living/hud_reset(full_reset = FALSE) + if((. = ..())) + queue_hand_rebuild() + /mob/living/get_movement_delay(var/travel_dir) . = ..() if(stance_damage) @@ -1576,3 +1635,19 @@ default behaviour is: for(var/obj/item/organ/organ in stat_organs) var/list/organ_info = organ.get_stat_info() stat(organ_info[1], organ_info[2]) + +/mob/living/force_update_limbs() + for(var/obj/item/organ/external/O in get_external_organs()) + O.sync_colour_to_human(src) + update_body(0) + +/mob/living/proc/get_vision_organ_tag() + return get_bodytype()?.vision_organ + +/mob/living/proc/get_darksight_range() + var/vision_organ_tag = get_vision_organ_tag() + if(vision_organ_tag) + var/obj/item/organ/internal/eyes/I = get_organ(vision_organ_tag, /obj/item/organ/internal/eyes) + if(istype(I)) + return I.get_darksight_range() + return get_bodytype()?.eye_darksight_range diff --git a/code/modules/mob/living/living_breath.dm b/code/modules/mob/living/living_breath.dm index d4be74ddffd..9ff47af0f62 100644 --- a/code/modules/mob/living/living_breath.dm +++ b/code/modules/mob/living/living_breath.dm @@ -5,7 +5,7 @@ return FALSE /mob/living/proc/need_breathe() - if(mNobreath in mutations) + if(has_genetic_condition(GENE_COND_NO_BREATH)) return FALSE var/decl/bodytype/root_bodytype = get_bodytype() if(!root_bodytype || !root_bodytype.breathing_organ || !should_have_organ(root_bodytype.breathing_organ)) @@ -13,7 +13,7 @@ return TRUE /mob/living/proc/should_breathe() - return FALSE + return ((life_tick % 2) == 0 || failed_last_breath || is_asystole()) /mob/living/proc/try_breathe() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index c758a16c9fc..b74e516c2d4 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -97,7 +97,7 @@ apply_effect(agony_amount/10, EYE_BLUR) /mob/living/proc/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, def_zone = null) - return 0 //only carbon liveforms have this proc + return 0 // No root logic, implemented separately on human and silicon. /mob/living/emp_act(severity) for(var/obj/O in get_mob_contents()) @@ -123,7 +123,9 @@ //returns 0 if the effects failed to apply for some reason, 1 otherwise. /mob/living/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) if(effective_force) - return apply_damage(effective_force, I.atom_damage_type, hit_zone, I.damage_flags(), used_weapon=I, armor_pen=I.armor_penetration) + try_embed_in_mob(I, hit_zone, effective_force, direction = get_dir(user, src)) + return TRUE + return FALSE /mob/living/hitby(var/atom/movable/AM, var/datum/thrownthing/TT) @@ -208,7 +210,7 @@ if(!affecting) affecting = get_organ(def_zone) - if(affecting && supplied_wound?.is_open() && dtype == BRUTE) // Can't embed in a small bruise. + if(affecting && istype(supplied_wound) && supplied_wound.is_open() && dtype == BRUTE) // Can't embed in a small bruise. var/obj/item/I = O var/sharp = is_sharp(I) embed_damage *= (1 - get_blocked_ratio(def_zone, BRUTE, O.damage_flags(), O.armor_penetration, I.force)) @@ -221,7 +223,7 @@ //Sharp objects will always embed if they do enough damage. //Thrown sharp objects have some momentum already and have a small chance to embed even if the damage is below the threshold if((sharp && prob(sharp_embed_chance)) || (embed_damage > embed_threshold && prob(embed_chance))) - affecting.embed_in_organ(I, supplied_wound = supplied_wound) + affecting.embed_in_organ(I, supplied_wound = (istype(supplied_wound) ? supplied_wound : null)) I.has_embedded(src) . = TRUE @@ -244,6 +246,7 @@ if(!istype(wall) || !wall.density) return FALSE LAZYDISTINCTADD(pinned, O) + walk_to(src, 0) // cancel any automated movement visible_message("\The [src] is pinned to \the [wall] by \the [O]!") // TODO: cancel all throwing and momentum after this point return TRUE diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 61450cf4d94..b6bfa9e1cae 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -73,6 +73,9 @@ // Currently only on humans due to the spaghetti code involved, TODO: generalize. var/list/appearance_descriptors + /// Total level of flash protection + var/flash_protection = FLASH_PROTECTION_NONE + /// Whether this mob's ability to stand has been affected var/stance_damage = 0 diff --git a/code/modules/mob/living/carbon/carbon_eating.dm b/code/modules/mob/living/living_eating.dm similarity index 100% rename from code/modules/mob/living/carbon/carbon_eating.dm rename to code/modules/mob/living/living_eating.dm diff --git a/code/modules/mob/living/living_electrocution.dm b/code/modules/mob/living/living_electrocution.dm new file mode 100644 index 00000000000..63404d00ecd --- /dev/null +++ b/code/modules/mob/living/living_electrocution.dm @@ -0,0 +1,93 @@ +//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ. +/mob/living/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone) + if (!def_zone) + return 1.0 + + var/siemens_coefficient = max(get_species()?.get_shock_vulnerability(src), 0) + for(var/slot in global.standard_clothing_slots) + var/obj/item/clothing/C = get_equipped_item(slot) + if(istype(C) && (C.body_parts_covered & def_zone.body_part)) // Is that body part being targeted covered? + siemens_coefficient *= C.siemens_coefficient + + return siemens_coefficient + +//Electrical shock +/mob/living/proc/apply_shock(var/shock_damage, var/def_zone, var/base_siemens_coeff = 1.0) + + var/list/shock_organs = get_external_organs() + if(!length(shock_organs)) + // TODO: check armor or Siemen's coefficient for non-human mobs + apply_damage(shock_damage, BURN, used_weapon = "Electrocution") + return + + var/obj/item/organ/external/initial_organ = GET_EXTERNAL_ORGAN(src, check_zone(def_zone, src)) + if(!initial_organ) + initial_organ = pick(shock_organs) + + var/obj/item/organ/external/floor_organ + if(!current_posture?.prone) + var/list/obj/item/organ/external/standing = list() + for(var/limb_tag in list(BP_L_FOOT, BP_R_FOOT)) + var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, limb_tag) + if(E && E.is_usable()) + standing[E.organ_tag] = E + if((def_zone == BP_L_FOOT || def_zone == BP_L_LEG) && standing[BP_L_FOOT]) + floor_organ = standing[BP_L_FOOT] + if((def_zone == BP_R_FOOT || def_zone == BP_R_LEG) && standing[BP_R_FOOT]) + floor_organ = standing[BP_R_FOOT] + else + floor_organ = standing[pick(standing)] + + if(!floor_organ) + floor_organ = pick(get_external_organs()) + + var/list/obj/item/organ/external/to_shock = trace_shock(initial_organ, floor_organ) + if(!length(to_shock)) + return 0 + + shock_damage /= length(to_shock) + shock_damage = round(shock_damage, 0.1) + + for(var/obj/item/organ/external/E in to_shock) + var/actual_shock_damage = max(1, round(shock_damage * base_siemens_coeff * get_siemens_coefficient_organ(E))) + if(actual_shock_damage) + apply_damage(shock_damage, BURN, E.organ_tag, used_weapon="Electrocution") + . += actual_shock_damage + + if(. > 10) + local_emp(initial_organ, 3) + +/mob/living/proc/trace_shock(var/obj/item/organ/external/init, var/obj/item/organ/external/floor) + + var/list/obj/item/organ/external/traced_organs = list(floor) + if(!init) + return + + if(!floor || init == floor) + return list(init) + + for(var/obj/item/organ/external/E in list(floor, init)) + while(E && E.parent_organ) + var/candidate = GET_EXTERNAL_ORGAN(src, E.parent_organ) + if(!candidate || (candidate in traced_organs)) + break // Organ parenthood is not guaranteed to be a tree + E = candidate + traced_organs += E + if(E == init) + return traced_organs + + return traced_organs + +/mob/living/proc/local_emp(var/list/limbs, var/severity = 2) + if(!islist(limbs)) + limbs = list(limbs) + + var/list/EMP = list() + for(var/obj/item/organ/external/limb in limbs) + EMP += limb + if(LAZYLEN(limb.internal_organs)) + EMP += limb.internal_organs + if(LAZYLEN(limb.implants)) + EMP += limb.implants + for(var/atom/E in EMP) + E.emp_act(severity) diff --git a/code/modules/mob/living/living_genetics.dm b/code/modules/mob/living/living_genetics.dm new file mode 100644 index 00000000000..fd0c40638a0 --- /dev/null +++ b/code/modules/mob/living/living_genetics.dm @@ -0,0 +1,56 @@ +/mob/living + VAR_PRIVATE/_updating_genetic_conditions + VAR_PRIVATE/list/_genetic_conditions + +/mob/living/proc/queue_genetic_condition_update() + set waitfor = FALSE + if(_updating_genetic_conditions) + return + _updating_genetic_conditions = TRUE + sleep(1) + _updating_genetic_conditions = FALSE + update_genetic_conditions() + +/mob/living/get_genetic_conditions() + RETURN_TYPE(/list) + return _genetic_conditions + +/mob/living/can_have_genetic_conditions() + return !(get_bodytype()?.body_flags & BODY_FLAG_NO_DNA) + +/mob/living/has_genetic_condition(condition_type) + if(!LAZYLEN(_genetic_conditions)) + return FALSE + var/decl/genetic_condition/condition = GET_DECL(condition_type) + return (condition in _genetic_conditions) + +/mob/living/add_genetic_condition(condition_type, temporary_time) + var/decl/genetic_condition/condition = GET_DECL(condition_type) + if(condition && !(condition in _genetic_conditions) && condition.activate_condition(src)) + LAZYDISTINCTADD(_genetic_conditions, condition) + if(temporary_time) + // TODO: some kind of world.time key or parameter so overlapping calls don't remove each other. + addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living, remove_genetic_condition)), temporary_time) + queue_genetic_condition_update() + return TRUE + return FALSE + +/mob/living/remove_genetic_condition(condition_type) + if(!LAZYLEN(_genetic_conditions)) + return FALSE + var/decl/genetic_condition/condition = GET_DECL(condition_type) + if(condition && (condition in _genetic_conditions) && condition.deactivate_condition(src)) + LAZYREMOVE(_genetic_conditions, condition) + queue_genetic_condition_update() + return TRUE + return FALSE + +/mob/living/reset_genetic_conditions() + if(!LAZYLEN(_genetic_conditions)) + return FALSE + for(var/decl/genetic_condition/condition as anything in _genetic_conditions) + if(condition.deactivate_condition(src)) + . = TRUE + _genetic_conditions = null + if(.) + update_icon() diff --git a/code/modules/mob/living/living_resist.dm b/code/modules/mob/living/living_resist.dm new file mode 100644 index 00000000000..c63c9b4a09c --- /dev/null +++ b/code/modules/mob/living/living_resist.dm @@ -0,0 +1,68 @@ +/mob/living/proc/escape_buckle() + + if(!buckled) + return + + var/unbuckle_time + if(get_equipped_item(slot_handcuffed_str) && istype(buckled, /obj/effect/energy_net)) + var/obj/effect/energy_net/N = buckled + N.escape_net(src) //super snowflake but is literally used NOWHERE ELSE.-Luke + return + + if(!restrained()) + if(buckled.can_buckle) + buckled.user_unbuckle_mob(src) + else + to_chat(usr, "You can't seem to escape from \the [buckled]!") + return + + setClickCooldown(100) + unbuckle_time = max(0, (2 MINUTES) - get_special_resist_time()) + + visible_message( + "[src] attempts to unbuckle themself!", + "You attempt to unbuckle yourself. (This will take around [unbuckle_time / (1 SECOND)] second\s and you need to stand still)", range = 2 + ) + + if(unbuckle_time && buckled) + var/stages = 2 + for(var/i = 1 to stages) + if(!unbuckle_time || do_after(usr, unbuckle_time*0.5, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY))) + if(!buckled) + return + visible_message( + SPAN_WARNING("\The [src] tries to unbuckle themself."), + SPAN_WARNING("You try to unbuckle yourself ([i*100/stages]% done)."), range = 2 + ) + else + if(!buckled) + return + visible_message( + SPAN_WARNING("\The [src] stops trying to unbuckle themself."), + SPAN_WARNING("You stop trying to unbuckle yourself."), range = 2 + ) + return + visible_message( + SPAN_DANGER("\The [src] manages to unbuckle themself!"), + SPAN_NOTICE("You successfully unbuckle yourself."), range = 2 + ) + buckled.user_unbuckle_mob(src) + return + +/mob/living/proc/resist_grab() + var/resisting = 0 + for(var/obj/item/grab/G in grabbed_by) + resisting++ + G.handle_resist() + if(resisting) + visible_message("[src] resists!") + +/mob/living/proc/get_cuff_breakout_mod() + return 1 + +/mob/living/proc/can_break_cuffs() + var/decl/species/my_species = get_species() + return my_species?.can_shred(src, 1) + +/mob/living/proc/get_special_resist_time() + return 0 diff --git a/code/modules/mob/living/living_taste.dm b/code/modules/mob/living/living_taste.dm new file mode 100644 index 00000000000..03845380c3e --- /dev/null +++ b/code/modules/mob/living/living_taste.dm @@ -0,0 +1,17 @@ +/mob/living + /// these two help govern taste. The first is the last time a taste message was shown to the player. + var/last_taste_time = 0 + /// the second is the message in question. + var/last_taste_text = "" + +/mob/living/proc/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) + if(last_taste_time + 50 < world.time) + var/datum/reagents/temp = new(amount, global.temp_reagents_holder) //temporary holder used to analyse what gets transfered. + from.trans_to_holder(temp, amount, multiplier, 1) + var/text_output = temp.generate_taste_message(src, from) + if(text_output != last_taste_text || last_taste_time + 1 MINUTE < world.time) //We dont want to spam the same message over and over again at the person. Give it a bit of a buffer. + to_chat(src, SPAN_NOTICE("You can taste [text_output].")) //no taste means there are too many tastes and not enough flavor. + last_taste_time = world.time + last_taste_text = text_output + RAISE_EVENT(/decl/observ/ingested, src, from, target, amount, multiplier, copy) + return from?.trans_to_holder(target, amount, multiplier, copy) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index e661e7c2663..8d807027a08 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -55,7 +55,6 @@ var/global/list/ai_verbs_default = list( anchored = TRUE // -- TLE density = TRUE status_flags = CANSTUN|CANPARALYSE|CANPUSH - shouldnt_see = list(/obj/effect/rune) max_health = 200 silicon_camera = /obj/item/camera/siliconcam/ai_camera @@ -378,7 +377,7 @@ var/global/list/custom_ai_icons_by_ckey_and_name = list() if (href_list["track"]) var/mob/target = locate(href_list["track"]) in SSmobs.mob_list - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(!istype(H) || (html_decode(href_list["trackname"]) == H.get_visible_name()) || (html_decode(href_list["trackname"]) == H.get_id_name())) ai_actual_track(target) diff --git a/code/modules/mob/living/silicon/ai/icons.dm b/code/modules/mob/living/silicon/ai/icons.dm index 3c0a4ea09f0..de4c3e77fd5 100644 --- a/code/modules/mob/living/silicon/ai/icons.dm +++ b/code/modules/mob/living/silicon/ai/icons.dm @@ -9,7 +9,7 @@ var/global/list/ai_icon_subtypes for(var/ai_icon_type in subtypesof(/datum/ai_icon)) ai_icon_subtypes[ai_icon_type] = new ai_icon_type return global.ai_icon_subtypes - + /datum/ai_icon var/name var/icon = 'icons/mob/AI.dmi' @@ -40,7 +40,7 @@ var/global/list/ai_icon_subtypes name = "[name] (Malf)" /datum/ai_icon/malf/may_used_by_ai(var/mob/living/silicon/ai/AI) - return istype(AI) && AI.is_traitor() + return istype(AI) && AI.is_malfunctioning() /datum/ai_icon/red name = "Red" diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 545efb31a13..17b45ba08ad 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -188,7 +188,7 @@ var/global/list/possible_say_verbs = list( else if(ismob(card.loc)) var/mob/holder = card.loc if(ishuman(holder)) - var/mob/living/carbon/human/H = holder + var/mob/living/human/H = holder for(var/obj/item/organ/external/affecting in H.get_external_organs()) if(card in affecting.implants) affecting.take_external_damage(rand(30,50)) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index da9259ba3f4..6e1a7989b71 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -36,7 +36,7 @@ var/global/datum/paiController/paiController // Global handler for pAI candida if(istype(card,/obj/item/paicard) && istype(candidate,/datum/paiCandidate)) var/mob/living/silicon/pai/pai = new(card) if(!candidate.name) - pai.SetName(pick(global.ninja_names)) + pai.SetName(pick(global.ai_names)) else pai.SetName(candidate.name) pai.real_name = pai.name diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm index 96d7998715a..c1ca1b982e6 100644 --- a/code/modules/mob/living/silicon/robot/analyzer.dm +++ b/code/modules/mob/living/silicon/robot/analyzer.dm @@ -21,7 +21,7 @@ /obj/item/robotanalyzer/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) user.visible_message( SPAN_WARNING("\The [user] has analyzed the floor's vitals!"), self_message = SPAN_WARNING("You try to analyze the floor's vitals!")) @@ -70,7 +70,7 @@ if("prosthetics") - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target to_chat(user, SPAN_NOTICE("Analyzing Results for \the [H]:")) to_chat(user, "Key: [SPAN_ORANGE("Electronics")]/[SPAN_RED("Brute")]") var/obj/item/organ/internal/cell/C = H.get_organ(BP_CELL, /obj/item/organ/internal/cell) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index 65158f20d7d..41ef351a611 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -26,12 +26,12 @@ dat += "
    [D.real_name] ([D.stat == DEAD ? "INACTIVE" : "ACTIVE"])" dat += "
    Cell charge: [D.cell.charge]/[D.cell.maxcharge]." dat += "
    Currently located in: [get_area_name(D)]." - dat += "
    Resync | Shutdown
    " + dat += "
    Resync | Shutdown" - dat += "

    Request drone presence in area: [drone_call_area] (Send ping)" + dat += "

    Request drone presence in area: [drone_call_area] (Send ping)" dat += "

    Drone fabricator: " - dat += "[dronefab ? "[(dronefab.produce_drones && !(dronefab.stat & NOPOWER)) ? "ACTIVE" : "INACTIVE"]" : "FABRICATOR NOT DETECTED. (search)"]" + dat += "[dronefab ? "[(dronefab.produce_drones && !(dronefab.stat & NOPOWER)) ? "ACTIVE" : "INACTIVE"]" : "FABRICATOR NOT DETECTED. (search)"]" show_browser(user, dat, "window=computer;size=400x500") onclose(user, "computer") return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index cb51b2bab66..a75c51534f9 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -419,9 +419,9 @@ dat += {" Activated Modules
    - Module 1: [module_state_1 ? "[module_state_1]" : "No Module"]
    - Module 2: [module_state_2 ? "
    [module_state_2]" : "No Module"]
    - Module 3: [module_state_3 ? "
    [module_state_3]" : "No Module"]
    + Module 1: [module_state_1 ? "
    [module_state_1]" : "No Module"]
    + Module 2: [module_state_2 ? "
    [module_state_2]" : "No Module"]
    + Module 3: [module_state_3 ? "
    [module_state_3]" : "No Module"]

    Installed Modules

    "} @@ -438,7 +438,7 @@ else if(activated(O)) module_string += text("[O]: Activated
    ") else - module_string += text("[O]:
    Activate
    ") + module_string += text("[O]: Activate
    ") if((istype(O,/obj/item) || istype(O,/obj/item)) && !(istype(O,/obj/item/stack/cable_coil))) tools += module_string @@ -453,7 +453,7 @@ else if(activated(module.emag)) dat += text("[module.emag]: Activated
    ") else - dat += text("[module.emag]: Activate
    ") + dat += text("[module.emag]: Activate
    ") dat += resources diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 886cb020c8f..22ecbf50f91 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -14,33 +14,29 @@ if(lawupdate) if (connected_ai) if(connected_ai.stat || connected_ai.control_disabled) - to_chat(src, "AI signal lost, unable to sync laws.") + to_chat(src, SPAN_BOLD("AI signal lost, unable to sync laws.")) else - lawsync() photosync() - to_chat(src, "Laws synced with AI, be sure to note any changes.") - // TODO: Update to new antagonist system. - if(mind && mind.assigned_special_role == /decl/special_role/traitor && mind.original == src) - to_chat(src, "Remember, your AI does NOT share or know about your law 0.") + to_chat(src, SPAN_BOLD("Laws synced with AI, be sure to note any changes.")) + lawsync() else - to_chat(src, "No AI selected to sync laws with, disabling lawsync protocol.") - lawupdate = 0 + to_chat(src, SPAN_BOLD("No AI selected to sync laws with, disabling lawsync protocol.")) + lawupdate = FALSE to_chat(who, SPAN_BOLD("Obey the following laws.")) to_chat(who, SPAN_ITALIC("All laws have equal priority. Laws may override other laws if written specifically to do so. If laws conflict, break the least.")) laws.show_laws(who) - // TODO: Update to new antagonist system. - if (mind && (mind.assigned_special_role == /decl/special_role/traitor && mind.original == src) && connected_ai) - to_chat(who, "Remember, [connected_ai.name] is technically your master, but your objective comes first.") - else if (connected_ai) + show_master(who) + +/mob/living/silicon/robot/proc/show_master(mob/who) + if (connected_ai) to_chat(who, "Remember, [connected_ai.name] is your master, other AIs can be ignored.") else if (emagged) to_chat(who, "Remember, you are not required to listen to the AI.") else to_chat(who, "Remember, you are not bound to any AI, you are not required to listen to them.") - /mob/living/silicon/robot/lawsync() laws_sanity_check() var/datum/ai_laws/master = connected_ai && lawupdate ? connected_ai.laws : null diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 1d8728fa974..1a49f4fb985 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -64,10 +64,10 @@ cameranet.update_visibility(src, FALSE) SET_STATUS_MAX(src, STAT_BLIND, 2) - if(sdisabilities & BLINDED) + if(has_genetic_condition(GENE_COND_BLINDED)) SET_STATUS_MAX(src, STAT_BLIND, 2) - if(src.sdisabilities & DEAFENED) + if(has_genetic_condition(GENE_COND_DEAFENED)) src.set_status(STAT_DEAF, 1) //update the state of modules and components here @@ -145,17 +145,6 @@ else src.healths.icon_state = "health7" - if (src.syndicate && src.client) - var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) - for(var/datum/mind/tra in traitors.current_antagonists) - if(tra.current) - // TODO: Update to new antagonist system. - var/I = image('icons/mob/mob.dmi', loc = tra.current, icon_state = "traitor") - src.client.images += I - src.disconnect_from_ai() - if(src.mind) - traitors.add_antagonist_mind(mind) - if (src.cells) if (src.cell) var/chargeNum = clamp(CEILING(cell.percent()/25), 0, 4) //0-100 maps to 0-4, but give it a paranoid clamp just in case. @@ -199,7 +188,7 @@ overlay_fullscreen("blind", /obj/screen/fullscreen/blind) else clear_fullscreen("blind") - set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) + set_fullscreen(has_genetic_condition(GENE_COND_NEARSIGHTED), "impaired", /obj/screen/fullscreen/impaired, 1) set_fullscreen(GET_STATUS(src, STAT_BLURRY), "blurry", /obj/screen/fullscreen/blurry) set_fullscreen(GET_STATUS(src, STAT_DRUGGY), "high", /obj/screen/fullscreen/high) @@ -209,7 +198,7 @@ /mob/living/silicon/robot/handle_vision() ..() - if (src.stat == DEAD || (MUTATION_XRAY in mutations) || (src.sight_mode & BORGXRAY)) + if (src.stat == DEAD || has_genetic_condition(GENE_COND_XRAY) || (src.sight_mode & BORGXRAY)) set_sight(sight|SEE_TURFS|SEE_MOBS|SEE_OBJS) set_see_in_dark(8) set_see_invisible(SEE_INVISIBLE_LEVEL_TWO) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 74919305f14..e3eeeee6c46 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -722,9 +722,9 @@ dat += {" Activated Modules
    - Module 1: [module_state_1 ? "[module_state_1]" : "No Module"]
    - Module 2: [module_state_2 ? "
    [module_state_2]" : "No Module"]
    - Module 3: [module_state_3 ? "
    [module_state_3]" : "No Module"]
    + Module 1: [module_state_1 ? "
    [module_state_1]" : "No Module"]
    + Module 2: [module_state_2 ? "
    [module_state_2]" : "No Module"]
    + Module 3: [module_state_3 ? "
    [module_state_3]" : "No Module"]

    Installed Modules

    "} @@ -735,17 +735,17 @@ else if(activated(obj)) dat += text("[obj]: Activated
    ") else - dat += text("[obj]:
    Activate
    ") + dat += text("[obj]: Activate
    ") if (emagged && module.emag) if(activated(module.emag)) dat += text("[module.emag]: Activated
    ") else - dat += text("[module.emag]: Activate
    ") + dat += text("[module.emag]: Activate
    ") /* if(activated(obj)) - dat += text("[obj]: \[Activated | Deactivate\]
    ") + dat += text("[obj]: \[Activated | Deactivate\]
    ") else - dat += text("[obj]: \[Activate | Deactivated\]
    ") + dat += text("[obj]: \[Activate | Deactivated\]
    ") */ show_browser(src, dat, "window=robotmod") @@ -874,9 +874,9 @@ set category = "IC" set src = usr - var/obj/item/W = get_active_held_item() - if (W) - W.attack_self(src) + var/obj/item/holding = get_active_held_item() + if (holding) + holding.attack_self(src) return diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 2635abf4cd5..49bbe726058 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -321,7 +321,7 @@ to_chat(src, "\The [A.alarm_name()].") if(alarm_raised) - to_chat(src, "\[Show Alerts\]") + to_chat(src, "\[Show Alerts\]") for(var/datum/alarm_handler/AH in queued_alarms) var/list/alarms = queued_alarms[AH] @@ -333,13 +333,12 @@ /mob/living/silicon/ai/raised_alarm(var/datum/alarm/A) var/cameratext = "" for(var/obj/machinery/camera/C in A.cameras()) - cameratext += "[(cameratext == "")? "" : "|"][C.c_tag]" + cameratext += "[(cameratext == "")? "" : "|"][C.c_tag]" to_chat(src, "[A.alarm_name()]! ([(cameratext)? cameratext : "No Camera"])") -/mob/living/silicon/proc/is_traitor() - var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) - return mind && (mind in traitors.current_antagonists) +/mob/living/silicon/proc/is_malfunctioning() + return FALSE /mob/living/silicon/reset_view() ..() @@ -456,12 +455,6 @@ adjustBruteLoss(5, do_update_health = FALSE) adjustFireLoss(10) -/mob/living/silicon/get_death_message(gibbed) - return "gives one shrill beep before falling lifeless." - -/mob/living/silicon/get_self_death_message(gibbed) - return "You have suffered a critical system failure, and are dead." - /mob/living/silicon/get_available_postures() var/static/list/available_postures = list( /decl/posture/standing diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 52a6e099774..eab529e073c 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -134,7 +134,7 @@ //Basic friend AI /mob/living/simple_animal/cat/fluff - var/mob/living/carbon/human/friend + var/mob/living/human/friend var/befriend_job = null /mob/living/simple_animal/cat/fluff/handle_movement_target() @@ -195,7 +195,7 @@ set src in view(1) if(!friend) - var/mob/living/carbon/human/H = usr + var/mob/living/human/H = usr if(istype(H) && (!befriend_job || H.job == befriend_job)) friend = usr . = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/antlion.dm b/code/modules/mob/living/simple_animal/hostile/antlion.dm index 8c60cc16af6..5328aa7f82c 100644 --- a/code/modules/mob/living/simple_animal/hostile/antlion.dm +++ b/code/modules/mob/living/simple_animal/hostile/antlion.dm @@ -63,7 +63,7 @@ set_invisibility(initial(invisibility)) prep_burrow(FALSE) set_special_ability_cooldown(ability_cooldown) - for(var/mob/living/carbon/human/H in get_turf(src)) + for(var/mob/living/human/H in get_turf(src)) H.attackby(natural_weapon, src) visible_message(SPAN_DANGER("\The [src] tears into \the [H] from below!")) SET_STATUS_MAX(H, STAT_WEAK, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm index f0e94bd7990..f4e8703919a 100644 --- a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm @@ -27,7 +27,7 @@ if(issilicon(A)) return FALSE if(ishuman(A)) - var/mob/living/carbon/human/H = A + var/mob/living/human/H = A if(H.isSynthetic()) return FALSE var/obj/item/head = H.get_equipped_item(slot_head_str) diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index a7f5e3bfb74..c378abffc2e 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -41,10 +41,3 @@ if(prob(15)) SET_STATUS_MAX(L, STAT_STUN, 1) L.visible_message("\the [src] scares \the [L]!") - -/mob/living/simple_animal/hostile/scarybat/cult - faction = "cult" - supernatural = 1 - -/mob/living/simple_animal/hostile/scarybat/cult/on_defilement() - return diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 79e7d46caaa..82ab25346f1 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -112,7 +112,7 @@ var/damage = rand(20,30) if(ishuman(target_mob)) - var/mob/living/carbon/human/H = target_mob + var/mob/living/human/H = target_mob var/dam_zone = pick(BP_CHEST, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, ran_zone(dam_zone, target = H)) H.apply_damage(damage, BRUTE, affecting, DAM_SHARP|DAM_EDGE) //TODO damage_flags var on simple_animals, maybe? diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index 85d56fe858f..c818a6512ab 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -8,12 +8,3 @@ faction = "creature" speed = 4 supernatural = 1 - -/mob/living/simple_animal/hostile/creature/cult - faction = "cult" - min_gas = null - max_gas = null - minbodytemp = 0 - -/mob/living/simple_animal/hostile/creature/cult/on_defilement() - return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 7ddde654525..b5f09072942 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -20,8 +20,6 @@ faction = "faithless" supernatural = 1 - butchery_data = /decl/butchery_data/occult - /obj/item/natural_weapon/faithless name = "shadow tendril" attack_verb = list("gripped") @@ -45,8 +43,10 @@ SET_STATUS_MAX(L, STAT_WEAK, 3) L.visible_message("\the [src] knocks down \the [L]!") -/mob/living/simple_animal/hostile/faithless/cult - faction = "cult" - -/mob/living/simple_animal/hostile/faithless/cult/on_defilement() - return +/obj/item/ectoplasm + name = "ectoplasm" + desc = "Spooky." + gender = PLURAL + icon = 'icons/obj/items/ectoplasm.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/liquid/drink/compote \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index d1b8d1e3cc3..8547d0d94ad 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -106,7 +106,7 @@ hunt_chance = 25 can_escape = TRUE pry_time = 5 SECONDS - flash_vulnerability = 2 //sensitive eyes for stalking prey + flash_protection = FLASH_PROTECTION_REDUCED does_spin = FALSE available_maneuvers = list(/decl/maneuver/leap/spider) ability_cooldown = 3 MINUTES @@ -126,7 +126,7 @@ fire_desc = "spits venom" ranged_range = 6 pry_time = 7 SECONDS - flash_vulnerability = 2 + flash_protection = FLASH_PROTECTION_REDUCED var/venom_charge = 16 @@ -154,7 +154,7 @@ if(attacking_with) heal_overall_damage(0.2 * attacking_with.force) //heal a bit on hit if(ishuman(.)) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . var/obj/item/clothing/suit/space/S = H.get_covering_equipped_item_by_zone(BP_CHEST) if(istype(S) && !length(S.breaches)) return @@ -275,7 +275,7 @@ Nurse caste procs /mob/living/simple_animal/hostile/giant_spider/nurse/attack_target(mob/target) . = ..() if(ishuman(.)) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . if(prob(infest_chance) && max_eggs) var/list/limbs = H.get_external_organs() var/obj/item/organ/external/O = LAZYLEN(limbs)? pick(limbs) : null @@ -310,15 +310,15 @@ Nurse caste procs //30% chance to stop wandering and do something if(!spooder.busy && prob(30)) //first, check for potential food nearby to cocoon - for(var/mob/living/C in can_see) - if(is_type_in_list(C, spooder.cocoon_blacklist)) + for(var/mob/living/web_target in can_see) + if(is_type_in_list(web_target, spooder.cocoon_blacklist)) continue - if(C.stat) - spooder.cocoon_target = C + if(web_target.stat) + spooder.cocoon_target = web_target spooder.busy = MOVING_TO_TARGET - walk_to(spooder, C, 1, spooder.move_to_delay) + walk_to(spooder, web_target, 1, spooder.move_to_delay) //give up if we can't reach them after 10 seconds - spooder.GiveUp(C) + spooder.GiveUp(web_target) return //second, spin a sticky spiderweb on this tile diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 06326c288d4..c224ef528fd 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -84,7 +84,7 @@ return FALSE if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if (H.is_cloaked()) return FALSE @@ -125,7 +125,7 @@ LostTarget() return 0 if (ishuman(target_mob)) - var/mob/living/carbon/human/H = target_mob + var/mob/living/human/H = target_mob if (H.is_cloaked()) LoseTarget() return 0 diff --git a/code/modules/mob/living/simple_animal/hostile/leech.dm b/code/modules/mob/living/simple_animal/hostile/leech.dm index 7b67b8644f4..f7c7cecb1eb 100644 --- a/code/modules/mob/living/simple_animal/hostile/leech.dm +++ b/code/modules/mob/living/simple_animal/hostile/leech.dm @@ -9,7 +9,7 @@ faction = "leeches" can_pry = FALSE break_stuff_probability = 5 - flash_vulnerability = 0 + flash_protection = FLASH_PROTECTION_MAJOR bleed_colour = COLOR_VIOLET var/suck_potency = 8 @@ -30,11 +30,11 @@ /mob/living/simple_animal/hostile/leech/attack_target(mob/target) . = ..() if(ishuman(.) && belly <= 75) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . var/obj/item/clothing/suit/space/S = H.get_covering_equipped_item_by_zone(BP_CHEST) if(istype(S) && !length(S.breaches)) return - H.remove_blood_simple(suck_potency) + H.remove_blood(suck_potency, absolute = TRUE) if(current_health < get_max_health()) heal_overall_damage(suck_potency / 1.5) belly += clamp(suck_potency, 0, 100) @@ -64,7 +64,7 @@ QDEL_NULL(proxy_listener) . = ..() -/obj/structure/leech_spawner/proc/burst(var/mob/living/carbon/victim) +/obj/structure/leech_spawner/proc/burst(var/mob/living/victim) if(!proxy_listener || !istype(victim) || !(victim in view(5, src))) return for(var/i in 1 to 12) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 97955f07393..480645b38c1 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -20,6 +20,7 @@ destroy_surroundings = 0 gene_damage = -1 butchery_data = /decl/butchery_data/synthetic + bleed_colour = SYNTH_BLOOD_COLOR var/datum/effect/effect/system/trail/ion_trail diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm index 3651874d0bd..8f610870094 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm @@ -25,7 +25,7 @@ ability_cooldown = 2 MINUTES ai = /datum/ai/giant_crab - var/mob/living/carbon/human/victim //the human we're grabbing + var/mob/living/human/victim //the human we're grabbing var/grab_duration = 3 //duration of disable in life ticks to simulate a grab var/grab_damage = 6 //brute damage before reductions, per crab's life tick var/list/grab_desc = list("thrashes", "squeezes", "crushes") @@ -68,7 +68,7 @@ /mob/living/simple_animal/hostile/retaliate/giant_crab/attack_target(mob/target) . = ..() if(ishuman(.)) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . if(victim == H) if(!Adjacent(victim)) release_grab() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm index 0df6b5ec780..ce7d80f9cec 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm @@ -41,7 +41,7 @@ /mob/living/simple_animal/hostile/retaliate/parrot/space/attack_target(mob/target) . = ..() if(ishuman(.) && can_act() && !is_on_special_ability_cooldown() && Adjacent(.)) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . if(prob(70)) SET_STATUS_MAX(H, STAT_WEAK, rand(2,3)) set_special_ability_cooldown(ability_cooldown / 1.5) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index 6f6d182d797..e18e9eb4479 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -21,7 +21,7 @@ max_gas = null minbodytemp = 0 break_stuff_probability = 35 - flash_vulnerability = 0 + flash_protection = FLASH_PROTECTION_MAJOR natural_weapon = /obj/item/natural_weapon/goatking var/current_damtype = BRUTE var/list/elemental_weapons = list( diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm index de6aec3a362..73c0c426397 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm @@ -435,14 +435,14 @@ return 1 var/obj/item/stolen_item = null - for(var/mob/living/carbon/C in view(1,src)) - for(var/obj/item/thing in C.get_held_items()) + for(var/mob/living/target in view(1,src)) + for(var/obj/item/thing in target.get_held_items()) if(can_pick_up(thing)) stolen_item = thing break - if(stolen_item && C.try_unequip(stolen_item, src)) + if(stolen_item && target.try_unequip(stolen_item, src)) held_item = stolen_item - visible_message("[src] grabs the [held_item] out of [C]'s hand!", "You snag the [held_item] out of [C]'s hand!", "You hear the sounds of wings flapping furiously.") + visible_message("[src] grabs the [held_item] out of [target]'s hand!", "You snag the [held_item] out of [target]'s hand!", "You hear the sounds of wings flapping furiously.") return held_item to_chat(src, "There is nothing of interest to take.") diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm index 8a4f83e6221..e4f6eafafb5 100644 --- a/code/modules/mob/living/simple_animal/hostile/slug.dm +++ b/code/modules/mob/living/simple_animal/hostile/slug.dm @@ -26,12 +26,12 @@ if(check_friendly_species(M)) . -= M -/mob/living/simple_animal/hostile/slug/get_scooped(var/mob/living/carbon/target, var/mob/living/initiator) +/mob/living/simple_animal/hostile/slug/get_scooped(var/mob/living/target, var/mob/living/initiator) if(target == initiator || check_friendly_species(initiator)) return ..() to_chat(initiator, SPAN_WARNING("\The [src] wriggles out of your hands before you can pick it up!")) -/mob/living/simple_animal/hostile/slug/proc/attach(var/mob/living/carbon/human/H) +/mob/living/simple_animal/hostile/slug/proc/attach(var/mob/living/human/H) var/obj/item/clothing/suit/space/S = H.get_covering_equipped_item_by_zone(BP_CHEST) if(istype(S) && !length(S.breaches)) S.create_breaches(BRUTE, 20) @@ -46,7 +46,7 @@ /mob/living/simple_animal/hostile/slug/attack_target(mob/target) . = ..() if(ishuman(.)) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . if(prob(H.get_damage(BRUTE)/2)) attach(H) @@ -63,7 +63,7 @@ /obj/item/holder/slug/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) var/mob/living/simple_animal/hostile/slug/V = contents[1] if(!V.stat && ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(do_mob(user, H, 30)) V.attach(H) qdel(src) diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm index c745d4b1221..50fb0091f5d 100644 --- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm +++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm @@ -22,7 +22,7 @@ nutrition = 100 var/cloaked = 0 - var/mob/living/carbon/human/gripping = null + var/mob/living/human/gripping = null var/blood_per_tick = 3 var/health_per_tick = 0.8 @@ -89,7 +89,7 @@ /mob/living/simple_animal/hostile/vagrant/attack_target(mob/target) . = ..() if(ishuman(.)) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . if(gripping == H) SET_STATUS_MAX(H, STAT_WEAK, 1) SET_STATUS_MAX(H, STAT_STUN, 1) diff --git a/code/modules/mob/living/simple_animal/passive/_passive.dm b/code/modules/mob/living/simple_animal/passive/_passive.dm index 39598e6000a..6cc2e8245ad 100644 --- a/code/modules/mob/living/simple_animal/passive/_passive.dm +++ b/code/modules/mob/living/simple_animal/passive/_passive.dm @@ -8,7 +8,8 @@ var/mob/living/simple_animal/critter = body var/atom/flee_target_atom = flee_target?.resolve() if(istype(flee_target_atom) && (flee_target_atom.loc in view(body))) - walk_away(body, flee_target_atom, 7, 2) + if(body.MayMove()) + walk_away(body, flee_target_atom, 7, 2) critter.stop_automated_movement = TRUE else flee_target = null diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 6ce04ebc2d1..b2354fbd88b 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -61,7 +61,6 @@ var/resistance = 0 // Damage reduction var/armor_type = /datum/extension/armor var/list/natural_armor //what armor animal has - var/flash_vulnerability = 1 // whether or not the mob can be flashed; 0 = no, 1 = yes, 2 = very yes var/is_aquatic = FALSE //Null rod stuff @@ -279,7 +278,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() atmos_suitable = FALSE break //Atmos effect - if(!(MUTATION_SPACERES in mutations) && abs(environment.temperature - bodytemperature) > 40) + if(!has_genetic_condition(GENE_COND_SPACE_RESISTANCE) && abs(environment.temperature - bodytemperature) > 40) bodytemperature += ((environment.temperature - bodytemperature) / 5) if(bodytemperature < minbodytemp) @@ -333,15 +332,17 @@ var/global/list/simplemob_icon_bitflag_cache = list() if(!.) var/dealt_damage = harm_intent_damage var/harm_verb = response_harm + var/damage_flags + var/damage_type if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/decl/natural_attack/attack = H.get_unarmed_attack(src) if(istype(attack)) dealt_damage = attack.damage <= dealt_damage ? dealt_damage : attack.damage harm_verb = pick(attack.attack_verb) - if(attack.sharp || attack.edge) - adjustBleedTicks(dealt_damage) - take_damage(dealt_damage) + damage_flags = attack.get_damage_flags() + damage_type = attack.get_damage_type() + take_damage(dealt_damage, damage_type, damage_flags = damage_flags, inflicter = user) user.visible_message(SPAN_DANGER("\The [user] [harm_verb] \the [src]!")) user.do_attack_animation(src) return TRUE @@ -380,12 +381,15 @@ var/global/list/simplemob_icon_bitflag_cache = list() if(supernatural && istype(O,/obj/item/nullrod)) damage *= 2 purge = 3 - take_damage(damage) - if(O.edge || O.sharp) - adjustBleedTicks(damage) + take_damage(damage, O.atom_damage_type, O.damage_flags()) return 1 +/mob/living/simple_animal/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) + . = ..() + if((damage_type == BRUTE) && (damage_flags & (DAM_EDGE | DAM_SHARP | DAM_BULLET))) // damage flags that should cause bleeding + adjustBleedTicks(damage) + /mob/living/simple_animal/get_movement_delay(var/travel_dir) var/tally = ..() //Incase I need to add stuff other than "speed" later @@ -479,18 +483,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/get_digestion_product() return /decl/material/liquid/nutriment -/mob/living/simple_animal/eyecheck() - switch(flash_vulnerability) - if(2 to INFINITY) - return FLASH_PROTECTION_REDUCED - if(1) - return FLASH_PROTECTION_NONE - if(0) - return FLASH_PROTECTION_MAJOR - else - return FLASH_PROTECTION_MAJOR - -/mob/living/simple_animal/proc/reflect_unarmed_damage(var/mob/living/carbon/human/attacker, var/damage_type, var/description) +/mob/living/simple_animal/proc/reflect_unarmed_damage(var/mob/living/human/attacker, var/damage_type, var/description) if(attacker.a_intent == I_HURT) attacker.apply_damage(rand(return_damage_min, return_damage_max), damage_type, attacker.get_active_held_item_slot(), used_weapon = description) if(rand(25)) @@ -504,18 +497,6 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/get_admin_job_string() return "Animal" -/mob/living/simple_animal/handle_flashed(var/obj/item/flash/flash, var/flash_strength) - var/safety = eyecheck() - if(safety < FLASH_PROTECTION_MAJOR) - SET_STATUS_MAX(src, STAT_WEAK, 2) - if(safety < FLASH_PROTECTION_MODERATE) - SET_STATUS_MAX(src, STAT_STUN, (flash_strength - 2)) - SET_STATUS_MAX(src, STAT_BLURRY, flash_strength) - SET_STATUS_MAX(src, STAT_CONFUSE, flash_strength) - flash_eyes(2) - return TRUE - return FALSE - /mob/living/simple_animal/get_speech_bubble_state_modifier() return ..() || "rough" diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 9f367883a5e..a2d7f65ab16 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -19,10 +19,10 @@ is_multikeying = 1 if(matches) if(M.client) - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)].") else - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).") if(is_multikeying && !client.warned_about_multikeying) client.warned_about_multikeying = 1 @@ -123,4 +123,13 @@ for(var/datum/status_marker_holder/marker in global.status_marker_holders) if(marker.mob_image && marker != status_markers) client.images |= marker.mob_image + + for(var/obj/item/gear in get_equipped_items(TRUE)) + client.screen |= gear + + if(istype(hud_used)) + hud_used.hidden_inventory_update() + hud_used.persistant_inventory_update() + update_action_buttons() + return TRUE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 22906b1ba85..e236a36b671 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -247,10 +247,10 @@ return restrained() ? FULLY_BUCKLED : PARTIALLY_BUCKLED /mob/proc/is_blind() - return ((sdisabilities & BLINDED) || incapacitated(INCAPACITATION_KNOCKOUT) || HAS_STATUS(src, STAT_BLIND)) + return (has_genetic_condition(GENE_COND_BLINDED) || incapacitated(INCAPACITATION_KNOCKOUT) || HAS_STATUS(src, STAT_BLIND)) /mob/proc/is_deaf() - return ((sdisabilities & DEAFENED) || incapacitated(INCAPACITATION_KNOCKOUT) || HAS_STATUS(src, STAT_DEAF)) + return (has_genetic_condition(GENE_COND_DEAFENED) || incapacitated(INCAPACITATION_KNOCKOUT) || HAS_STATUS(src, STAT_DEAF)) /mob/proc/is_physically_disabled() return incapacitated(INCAPACITATION_DISABLED) @@ -291,8 +291,19 @@ #undef PARTIALLY_BUCKLED #undef FULLY_BUCKLED +/mob/proc/grab_restrained() + for (var/obj/item/grab/G in grabbed_by) + if(G.restrains()) + return TRUE + /mob/proc/restrained() - return + if(get_equipped_item(slot_handcuffed_str)) + return TRUE + if(grab_restrained()) + return TRUE + if (istype(get_equipped_item(slot_wear_suit_str), /obj/item/clothing/suit/straight_jacket)) + return TRUE + return FALSE /mob/proc/reset_view(atom/A) set waitfor = 0 @@ -335,7 +346,7 @@ if(!inv_slot || inv_slot.skip_on_strip_display) continue var/obj/item/held = inv_slot.get_equipped_item() - dat += "[capitalize(inv_slot.slot_name)]: [held?.name || "nothing"]" + dat += "[capitalize(inv_slot.slot_name)]: [held?.name || "nothing"]" var/list/all_slots = get_all_available_equipment_slots() if(all_slots) @@ -343,39 +354,39 @@ if(slot in my_held_item_slots) continue var/obj/item/thing_in_slot = get_equipped_item(slot) - dat += "[capitalize(get_descriptive_slot_name(slot))]: [thing_in_slot || "nothing"]" + dat += "[capitalize(get_descriptive_slot_name(slot))]: [thing_in_slot || "nothing"]" if(istype(thing_in_slot, /obj/item/clothing)) var/obj/item/clothing/C = thing_in_slot if(LAZYLEN(C.accessories)) - dat += "Remove accessory" + dat += "Remove accessory" // Do they get an option to set internals? if(istype(get_equipped_item(slot_wear_mask_str), /obj/item/clothing/mask) || istype(get_equipped_item(slot_head_str), /obj/item/clothing/head/helmet/space)) for(var/slot in list(slot_back_str, slot_belt_str, slot_s_store_str)) var/obj/item/tank/tank = get_equipped_item(slot) if(istype(tank)) - dat += "
    Toggle internals." + dat += "
    Toggle internals." break // Other incidentals. var/obj/item/clothing/suit = get_equipped_item(slot_w_uniform_str) if(istype(suit)) - dat += "
    Pockets: Empty or Place Item" + dat += "
    Pockets: Empty or Place Item" var/obj/item/clothing/sensor/vitals/sensor = get_vitals_sensor() if(sensor) if(sensor.get_sensors_locked()) - dat += "
    Unlock vitals sensors" + dat += "
    Unlock vitals sensors" else if(user.get_multitool()) - dat += "
    Lock vitals sensors" - dat += "
    Set vitals sensors" + dat += "
    Lock vitals sensors" + dat += "
    Set vitals sensors" if(get_equipped_item(slot_handcuffed_str)) - dat += "
    Handcuffed" + dat += "
    Handcuffed" var/list/strip_add = get_additional_stripping_options() if(length(strip_add)) dat += strip_add - dat += "
    Refresh" + dat += "
    Refresh" var/datum/browser/popup = new(user, "[name]", "Inventory of \the [name]", 325, 500, src) popup.set_content(jointext(dat, "
    ")) @@ -469,9 +480,9 @@ set name = "Activate Held Object" set category = "Object" set src = usr - var/obj/item/W = get_active_held_item() - W?.attack_self(src) - return W + var/obj/item/holding = get_active_held_item() + holding?.attack_self(src) + return holding /mob/living/mode() if(!..()) @@ -585,7 +596,7 @@ /mob/proc/pull_damage() return 0 -/mob/living/carbon/human/pull_damage() +/mob/living/human/pull_damage() if(!current_posture.prone|| get_damage(BRUTE) + get_damage(BURN) < 100) return FALSE for(var/obj/item/organ/external/e in get_external_organs()) @@ -820,7 +831,7 @@ if(U.get_empty_hand_slot()) U.put_in_hands(selection) if(ishuman(U)) - var/mob/living/carbon/human/human_user = U + var/mob/living/human/human_user = U human_user.bloody_hands(src) return 1 @@ -982,7 +993,11 @@ /mob/proc/get_sound_volume_multiplier() if(GET_STATUS(src, STAT_DEAF)) return 0 - return 1 + . = 1 + for(var/slot in global.headphone_slots) + var/obj/item/clothing/C = get_equipped_item(slot) + if(istype(C)) + . = min(., C.volume_multiplier) // Mobs further up the chain should override this proc if they want to return a simple dexterity value. /mob/proc/get_dexterity(var/silent) @@ -1277,6 +1292,9 @@ /mob/proc/get_unique_enzymes() return +/mob/proc/set_unique_enzymes(value) + return + /mob/proc/get_blood_type() return @@ -1309,6 +1327,34 @@ /mob/proc/mob_throw_item(atom/target) return +/mob/proc/swap_hand() + SHOULD_CALL_PARENT(TRUE) + +/mob/proc/set_skin_tone(value) + return + +/mob/proc/get_skin_tone(value) + return + +/mob/proc/force_update_limbs() + return + +/mob/proc/update_eyes(update_icons = TRUE) + var/obj/item/organ/internal/eyes/eyes = get_organ((get_bodytype()?.vision_organ || BP_EYES), /obj/item/organ/internal/eyes) + if(eyes) + eyes.update_colour() + if(update_icons) + queue_icon_update() + +/mob/proc/has_genetic_information() + if(isSynthetic()) + return FALSE + var/decl/bodytype/bodytype = get_bodytype() + if(bodytype?.body_flags & BODY_FLAG_NO_DNA) + return FALSE + return TRUE + /mob/living/proc/get_butchery_product_name() var/decl/butchery_data/butchery_decl = GET_DECL(butchery_data) . = butchery_decl?.meat_name || name + diff --git a/code/modules/mob/mob_blood.dm b/code/modules/mob/mob_blood.dm index b7523c9851b..4f28d6b8d62 100644 --- a/code/modules/mob/mob_blood.dm +++ b/code/modules/mob/mob_blood.dm @@ -11,6 +11,17 @@ var/decl/species/my_species = get_species() return my_species ? my_species.blood_oxy : TRUE +/mob/proc/get_blood_name() + return "blood" + +/mob/living/silicon/get_blood_name() + return "oil" + +/mob/living/human/get_blood_name() + if(species) + return species.get_blood_name(src) + return "blood" + //Gets blood from mob to the container, preserving all data in it. /mob/proc/take_blood(obj/item/chems/container, var/amount) var/decl/species/my_species = get_species() @@ -23,3 +34,9 @@ var/data = list() data["donor"] = weakref(src) return data + +/// Removes amt units of blood from src, if it has blood. +/// If absolute is FALSE, rescale amt according to mob size. +/// Returns the amount of blood removed. +/mob/proc/remove_blood(amt, absolute = FALSE) + return 0 \ No newline at end of file diff --git a/code/modules/mob/mob_damage.dm b/code/modules/mob/mob_damage.dm index c53658f5982..26b684a8e2d 100644 --- a/code/modules/mob/mob_damage.dm +++ b/code/modules/mob/mob_damage.dm @@ -39,7 +39,7 @@ //if(ELECTROCUTE) return 0 -/mob/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, do_update_health) +/mob/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) switch(damage_type) if(BRUTE) return adjustBruteLoss(damage, do_update_health) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 5096fb36c94..9d750d10e17 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -76,9 +76,6 @@ var/damageoverlaytemp = 0 var/obj/machinery/machine = null - var/sdisabilities = 0 //Carbon - var/disabilities = 0 //Carbon - var/next_move = null var/real_name = null @@ -115,16 +112,11 @@ var/can_pull_size = ITEM_SIZE_STRUCTURE // Maximum w_class the mob can pull. var/can_pull_mobs = MOB_PULL_SAME // Whether or not the mob can pull other mobs. - var/datum/dna/dna = null//Carbon - var/list/active_genes - var/list/mutations = list() // TODO: Lazylist this var. - //see: setup.dm for list of mutations - var/radiation = 0.0//Carbon var/faction = MOB_FACTION_NEUTRAL //Used for checking whether hostile simple animals will attack you, possibly more stuff later - //The last mob/living/carbon to push/drag/grab this mob (mostly used by slimes friend recognition) + //The last mob/living to push/drag/grab this mob (mostly used by slimes friend recognition) var/weakref/last_handled_by_mob var/status_flags = CANSTUN|CANWEAKEN|CANPARALYSE|CANPUSH //bitflags defining which status effects can be inflicted (replaces canweaken, canstun, etc) diff --git a/code/modules/mob/mob_genetics.dm b/code/modules/mob/mob_genetics.dm new file mode 100644 index 00000000000..d7fc30f3688 --- /dev/null +++ b/code/modules/mob/mob_genetics.dm @@ -0,0 +1,17 @@ +/mob/proc/get_genetic_conditions() + RETURN_TYPE(/list) + +/mob/proc/can_have_genetic_conditions() + return FALSE + +/mob/proc/has_genetic_condition(condition_type) + return FALSE + +/mob/proc/add_genetic_condition(condition_type, temporary_time) + return FALSE + +/mob/proc/remove_genetic_condition(condition_type) + return FALSE + +/mob/proc/reset_genetic_conditions() + return diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index e501e4cc1ab..81b99458d48 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -13,10 +13,10 @@ return FALSE //M is too small to wield this return TRUE -/mob/living/proc/isSynthetic() +/mob/proc/isSynthetic() return 0 -/mob/living/carbon/human/isSynthetic() +/mob/living/human/isSynthetic() if(isnull(full_prosthetic)) robolimb_count = 0 var/list/limbs = get_external_organs() @@ -32,7 +32,7 @@ /mob/proc/isMonkey() return 0 -/mob/living/carbon/human/isMonkey() +/mob/living/human/isMonkey() return istype(species, /decl/species/monkey) @@ -51,7 +51,7 @@ /proc/isdeaf(A) if(isliving(A)) var/mob/living/M = A - return (M.sdisabilities & DEAFENED) || GET_STATUS(M, STAT_DEAF) + return M.has_genetic_condition(GENE_COND_DEAFENED) || GET_STATUS(M, STAT_DEAF) return 0 /proc/iscuffed(var/mob/mob) @@ -418,16 +418,11 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) /mob/living/proc/assess_perp(var/obj/access_obj, var/check_access, var/auth_weapons, var/check_records, var/check_arrest, var/check_network) if(stat == DEAD) return SAFE_PERP - - return 0 - -/mob/living/carbon/assess_perp(var/obj/access_obj, var/check_access, var/auth_weapons, var/check_records, var/check_arrest, var/check_network) if(get_equipped_item(slot_handcuffed_str)) return SAFE_PERP + return 0 - return ..() - -/mob/living/carbon/human/assess_perp(var/obj/access_obj, var/check_access, var/auth_weapons, var/check_records, var/check_arrest, var/check_network) +/mob/living/human/assess_perp(var/obj/access_obj, var/check_access, var/auth_weapons, var/check_records, var/check_arrest, var/check_network) var/threatcount = ..() if(. == SAFE_PERP) return SAFE_PERP @@ -494,7 +489,7 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) /mob/observer/ghost/get_multitool() return can_admin_interact() && ..(ghost_multitool) -/mob/living/carbon/human/get_multitool() +/mob/living/human/get_multitool() return ..(get_active_held_item()) /mob/living/silicon/robot/get_multitool() @@ -533,8 +528,6 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) SetName(new_name) if(mind) mind.name = new_name - if(dna) - dna.real_name = real_name return 1 /mob/proc/ssd_check() @@ -604,12 +597,6 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) return null return choice -/mob/proc/set_sdisability(sdisability) - sdisabilities |= sdisability - -/mob/proc/unset_sdisability(sdisability) - sdisabilities &= ~sdisability - /mob/proc/get_accumulated_vision_handlers() var/result[2] var/asight = 0 diff --git a/code/modules/mob/mob_layering.dm b/code/modules/mob/mob_layering.dm index 6c0c553e127..e7a933c39cd 100644 --- a/code/modules/mob/mob_layering.dm +++ b/code/modules/mob/mob_layering.dm @@ -49,7 +49,7 @@ return HIDING_MOB_LAYER . = ..() -/mob/living/carbon/human/get_base_layer() +/mob/living/human/get_base_layer() if(current_posture.prone) return LYING_HUMAN_LAYER . = ..() diff --git a/code/modules/mob/mob_snapshot.dm b/code/modules/mob/mob_snapshot.dm new file mode 100644 index 00000000000..8d9636d3f87 --- /dev/null +++ b/code/modules/mob/mob_snapshot.dm @@ -0,0 +1,89 @@ +// Stub type used to replicate old DNA system's role in mob/organ initialization. +// Effectively a snapshot of a mob's state at a moment in time. +/datum/mob_snapshot + var/real_name + var/eye_color + var/blood_type + var/unique_enzymes + var/skin_color + var/skin_tone + var/fingerprint + + var/decl/species/root_species + var/decl/bodytype/root_bodytype + + var/list/sprite_accessories + var/list/genetic_conditions + +/datum/mob_snapshot/New(mob/living/donor, force) + + real_name = donor?.real_name || "unknown" + eye_color = donor?.get_eye_colour() || COLOR_BLACK + blood_type = donor?.get_blood_type() + unique_enzymes = donor?.get_unique_enzymes() + fingerprint = donor?.get_full_print(ignore_blockers = TRUE) + + root_species = donor?.get_species() || get_species_by_key(global.using_map.default_species) + root_bodytype = donor?.get_bodytype() || root_species.default_bodytype + + for(var/obj/item/organ/external/limb in donor?.get_external_organs()) + // Discard anything not relating to our core/original bodytype and species. + // Does this need to be reviewed for Outreach serde? + if(limb.bodytype == root_bodytype && limb.species == root_species && (force || !BP_IS_PROSTHETIC(limb))) + var/list/limb_sprite_acc = limb.get_sprite_accessories(copy = TRUE) + if(length(limb_sprite_acc)) + LAZYSET(sprite_accessories, limb.organ_tag, limb_sprite_acc) + + genetic_conditions = donor?.get_genetic_conditions()?.Copy() + for(var/decl/genetic_condition/condition as anything in genetic_conditions) + if(!condition.is_heritable) + LAZYREMOVE(genetic_conditions, condition) + +/datum/mob_snapshot/Clone() + var/datum/mob_snapshot/clone = ..() + if(clone) + clone.real_name = real_name + clone.eye_color = eye_color + clone.blood_type = blood_type + clone.unique_enzymes = unique_enzymes + clone.skin_color = skin_color + clone.skin_tone = skin_tone + clone.fingerprint = fingerprint + clone.genetic_conditions = genetic_conditions?.Copy() + clone.root_species = root_species + clone.root_bodytype = root_bodytype + if(sprite_accessories) + clone.sprite_accessories = deepCopyList(sprite_accessories) + return clone + +// Replaces UpdateAppearance(). +/datum/mob_snapshot/proc/apply_appearance_to(mob/living/target) + + if(istype(root_species)) + if(istype(root_bodytype)) + target.set_species(root_species.name, root_bodytype) + else + target.set_species(root_species.name) + + else if(istype(root_bodytype)) + target.set_bodytype(root_bodytype) + + target.set_fingerprint(fingerprint) + target.set_unique_enzymes(unique_enzymes) + target.set_skin_colour(skin_color) + target.set_eye_colour(eye_color) + target.set_skin_tone(skin_tone) + + for(var/obj/item/organ/organ in target.get_organs()) + organ.copy_from_mob_snapshot(src) + + for(var/decl/genetic_condition/condition as anything in genetic_conditions) + target.add_genetic_condition(condition.type) + + target.force_update_limbs() + target.update_hair(update_icons = FALSE) + target.update_eyes() + return TRUE + +/mob/proc/get_mob_snapshot(force = FALSE) + return (force || has_genetic_information()) ? new /datum/mob_snapshot(src, force) : null diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index e4f273ad596..f6f86ce4f6e 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -2,8 +2,8 @@ var/global/list/href_to_mob_type = list( "Observer" = /mob/observer/ghost, "Crew" = list( - "Human" = /mob/living/carbon/human, - "Monkey" = /mob/living/carbon/human/monkey, + "Human" = /mob/living/human, + "Monkey" = /mob/living/human/monkey, "Robot" = /mob/living/silicon/robot ), "Animals" = list( @@ -15,12 +15,6 @@ var/global/list/href_to_mob_type = list( "Coffee" = /mob/living/simple_animal/crab/Coffee, "Parrot" = /mob/living/simple_animal/hostile/retaliate/parrot, "Poly" = /mob/living/simple_animal/hostile/retaliate/parrot/Poly, - ), - "Constructs" = list( - "Armoured" = /mob/living/simple_animal/construct/armoured, - "Builder" = /mob/living/simple_animal/construct/builder, - "Wraith" = /mob/living/simple_animal/construct/wraith, - "Shade" = /mob/living/simple_animal/shade ) ) @@ -77,16 +71,13 @@ var/global/list/href_to_mob_type = list( M.SetName(name) M.real_name = real_name - if(dna) - M.dna = dna.Clone() - if(mind) mind.transfer_to(M) if(!M.key) // ghost minds are inactive for reasons that escape me M.key = key if(subspecies && ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M H.change_species(subspecies) return M diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index b8537e6e002..7522407c8ae 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -132,7 +132,7 @@ INITIALIZE_IMMEDIATE(/mob/new_player) if(isnull(client.holder)) announce_ghost_joinleave(src) - var/mob/living/carbon/human/dummy/mannequin = get_mannequin(client.ckey) + var/mob/living/human/dummy/mannequin = get_mannequin(client.ckey) if(mannequin) client.prefs.dress_preview_mob(mannequin) observer.set_appearance(mannequin) @@ -352,7 +352,7 @@ INITIALIZE_IMMEDIATE(/mob/new_player) spawning = 1 close_spawn_windows() - var/mob/living/carbon/human/new_character + var/mob/living/human/new_character var/decl/species/chosen_species if(client.prefs.species) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 3ab762eae4e..1c997ec0de5 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -1,4 +1,4 @@ -/datum/preferences/proc/randomize_appearance_and_body_for(var/mob/living/carbon/human/H) +/datum/preferences/proc/randomize_appearance_and_body_for(var/mob/living/human/H) if(!H) H = client?.mob @@ -48,7 +48,7 @@ if(H) copy_to(H) -/datum/preferences/proc/dress_preview_mob(var/mob/living/carbon/human/dummy/mannequin) +/datum/preferences/proc/dress_preview_mob(var/mob/living/human/dummy/mannequin) if(!mannequin) return @@ -104,7 +104,7 @@ mannequin.compile_overlays() /datum/preferences/proc/update_preview_icon() - var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client?.ckey) + var/mob/living/human/dummy/mannequin/mannequin = get_mannequin(client?.ckey) if(mannequin) mannequin.delete_inventory(TRUE) dress_preview_mob(mannequin) diff --git a/code/modules/mob/observer/ghost/ghost.dm b/code/modules/mob/observer/ghost/ghost.dm index 188bc47fc4e..5803cbb30a4 100644 --- a/code/modules/mob/observer/ghost/ghost.dm +++ b/code/modules/mob/observer/ghost/ghost.dm @@ -69,9 +69,6 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images name = capitalize(pick(global.using_map.first_names_male)) + " " + capitalize(pick(global.using_map.last_names)) real_name = name - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.add_ghost_magic(src) - ghost_multitool = new(src) global.ghost_mob_list += src @@ -127,13 +124,13 @@ Works together with spawning an observer, noted above. /mob/observer/ghost/proc/process_medHUD(var/mob/M) var/client/C = M.client - for(var/mob/living/carbon/human/patient in oview(M, 14)) + for(var/mob/living/human/patient in oview(M, 14)) C.images += patient.hud_list[HEALTH_HUD] C.images += patient.hud_list[STATUS_HUD_OOC] /mob/observer/ghost/proc/assess_targets(list/target_list, mob/observer/ghost/U) var/client/C = U.client - for(var/mob/living/carbon/human/target in target_list) + for(var/mob/living/human/target in target_list) C.images += target.hud_list[SPECIALROLE_HUD] for(var/mob/living/silicon/target in target_list) C.images += target.hud_list[SPECIALROLE_HUD] diff --git a/code/modules/mob/skills/skill_verbs.dm b/code/modules/mob/skills/skill_verbs.dm index bad46b8f8b2..9364a5d8862 100644 --- a/code/modules/mob/skills/skill_verbs.dm +++ b/code/modules/mob/skills/skill_verbs.dm @@ -72,7 +72,7 @@ Robots and antags can instruct. if(skillset.owner.skill_check(S.type, SKILL_EXPERT)) return 1 -/mob/proc/can_instruct(mob/living/carbon/human/target, var/get_options = FALSE) +/mob/proc/can_instruct(mob/living/human/target, var/get_options = FALSE) var/datum/skill_verb/instruct/SV = skillset.fetch_verb_datum(/datum/skill_verb/instruct) if(!SV || !istype(target)) @@ -98,7 +98,7 @@ Robots and antags can instruct. if(!target.skill_check(S.type, SKILL_BASIC) && skill_check(S.type, SKILL_EXPERT)) LAZYSET(., S.name, S) -/mob/proc/instruct(mob/living/carbon/human/target as mob in oview(2)) +/mob/proc/instruct(mob/living/human/target as mob in oview(2)) set category = "IC" set name = "Instruct" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e1f036903ca..1b5ca140335 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/proc/monkeyize() +/mob/living/human/proc/monkeyize() if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return for(var/obj/item/W in get_contained_external_atoms()) @@ -29,8 +29,6 @@ for(var/obj/item/W in src) drop_from_inventory(W) change_species(species.primitive_form) - dna.SetSEState(global.MONKEYBLOCK,1) - dna.SetSEValueRange(global.MONKEYBLOCK,0xDAC, 0xFFF) to_chat(src, "You are now [species.name]. ") qdel(animation) @@ -41,17 +39,20 @@ spawning = 1 return ..() -/mob/living/carbon/human/AIize(move=1) // 'move' argument needs defining here too because BYOND is dumb +/mob/living/human/AIize(move=1) // 'move' argument needs defining here too because BYOND is dumb if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return - for(var/t in get_external_organs()) - qdel(t) QDEL_NULL_LIST(worn_underwear) return ..(move) -/mob/living/carbon/AIize() +/mob/living/silicon/ai/AIize() + return src + +/mob/living/AIize() if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return + for(var/t in get_external_organs()) + qdel(t) for(var/obj/item/W in src) drop_from_inventory(W) ADD_TRANSFORMATION_MOVEMENT_HANDLER(src) @@ -103,7 +104,7 @@ return O //human -> robot -/mob/living/carbon/human/proc/Robotize(var/supplied_robot_type = /mob/living/silicon/robot) +/mob/living/human/proc/Robotize(var/supplied_robot_type = /mob/living/silicon/robot) if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return QDEL_NULL_LIST(worn_underwear) @@ -140,7 +141,7 @@ qdel(src) // Queues us for a hard delete return O -/mob/living/carbon/human/proc/corgize() +/mob/living/human/proc/corgize() if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return for(var/obj/item/W in src) @@ -160,7 +161,7 @@ qdel(src) return -/mob/living/carbon/human/Animalize() +/mob/living/human/Animalize() var/list/mobtypes = typesof(/mob/living/simple_animal) var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes @@ -221,18 +222,6 @@ if(!MP) return 0 //Sanity, this should never happen. - if(ispath(MP, /mob/living/simple_animal/construct/behemoth)) - return 0 //I think this may have been an unfinished WiP or something. These constructs should really have their own class simple_animal/construct/subtype - - if(ispath(MP, /mob/living/simple_animal/construct/armoured)) - return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype - - if(ispath(MP, /mob/living/simple_animal/construct/wraith)) - return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype - - if(ispath(MP, /mob/living/simple_animal/construct/builder)) - return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype - //Good mobs! if(ispath(MP, /mob/living/simple_animal/cat)) return 1 @@ -244,8 +233,6 @@ return 1 if(ispath(MP, /mob/living/simple_animal/mushroom)) return 1 - if(ispath(MP, /mob/living/simple_animal/shade)) - return 1 if(ispath(MP, /mob/living/simple_animal/tomato)) return 1 if(ispath(MP, /mob/living/simple_animal/passive/mouse)) @@ -259,9 +246,9 @@ return 0 -/mob/living/carbon/human/proc/zombify() - make_husked() - mutations |= MUTATION_CLUMSY +/mob/living/human/proc/zombify() + add_genetic_condition(GENE_COND_HUSK) + add_genetic_condition(GENE_COND_CLUMSY) src.visible_message("\The [src]'s skin decays before your very eyes!", "Your entire body is ripe with pain as it is consumed down to flesh and bones. You ... hunger. Not only for flesh, but to spread this gift.") if (src.mind) if (src.mind.assigned_special_role == "Zombie") diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index 3c38a1b7daa..890f90d27c8 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -57,7 +57,7 @@ if(redraw_mob) queue_icon_update() -/mob/proc/update_mutations() +/mob/proc/update_genetic_conditions() return /mob/proc/update_hair(var/update_icons=1) diff --git a/code/modules/mob_holder/_holder.dm b/code/modules/mob_holder/_holder.dm index db21bf95f0e..7efdbfa7f9c 100644 --- a/code/modules/mob_holder/_holder.dm +++ b/code/modules/mob_holder/_holder.dm @@ -134,7 +134,7 @@ /obj/item/holder/proc/sync(var/mob/living/M) SetName(M.name) desc = M.desc - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(istype(H)) last_holder = H register_all_movement(H, M) diff --git a/code/modules/mob_holder/holder_mobs.dm b/code/modules/mob_holder/holder_mobs.dm index eeed2d5f4b2..d07a128335c 100644 --- a/code/modules/mob_holder/holder_mobs.dm +++ b/code/modules/mob_holder/holder_mobs.dm @@ -4,14 +4,14 @@ /mob/proc/get_holder_color() return color -/mob/living/carbon/human/get_holder_icon() +/mob/living/human/get_holder_icon() return species.holder_icon || ..() -/mob/living/carbon/human/get_holder_color() +/mob/living/human/get_holder_color() return species.get_holder_color(src) //Mob procs for scooping up -/mob/living/proc/get_scooped(var/mob/living/carbon/target, var/mob/living/initiator) +/mob/living/proc/get_scooped(var/mob/living/target, var/mob/living/initiator) if(!holder_type || buckled || LAZYLEN(pinned)) return FALSE @@ -35,7 +35,8 @@ to_chat(initiator, "You scoop up \the [src]!") to_chat(src, "\The [initiator] scoops you up!") - src.forceMove(H) + forceMove(H) + reset_offsets(0) target.status_flags |= PASSEMOTES H.sync(src) @@ -46,6 +47,9 @@ return FALSE if(QDELETED(scooper) || QDELETED(src)) return FALSE - if(!CanPhysicallyInteract(scooper)) + if(istype(loc, /obj/item/holder)) + if(loc.CanUseTopicPhysical(scooper) != STATUS_INTERACTIVE) + return FALSE + else if(!CanPhysicallyInteract(scooper)) return FALSE return !!holder_type && scooper.mob_size > src.mob_size diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index ede7ce9165a..9c0f8f262cd 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -39,7 +39,7 @@ // Used to install preset-specific programs /obj/item/modular_computer/proc/install_default_programs() - var/mob/living/carbon/human/H = get_recursive_loc_of_type(/mob) + var/mob/living/human/H = get_recursive_loc_of_type(/mob) var/list/job_programs = list() if(H) var/datum/job/jb = SSjobs.get_by_title(H.job) diff --git a/code/modules/modular_computers/computers/subtypes/dev_pda.dm b/code/modules/modular_computers/computers/subtypes/dev_pda.dm index 15b3f94e5d3..de01d091157 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_pda.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_pda.dm @@ -24,7 +24,7 @@ /obj/item/modular_computer/pda/on_update_icon() . = ..() - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(istype(H) && H.get_equipped_item(slot_wear_id_str) == src) H.update_equipment_overlay(slot_wear_id_str) diff --git a/code/modules/modular_computers/computers/subtypes/preset_pda.dm b/code/modules/modular_computers/computers/subtypes/preset_pda.dm index 49cb461c8c0..0783c94d1fc 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_pda.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_pda.dm @@ -35,12 +35,6 @@ "stripe2" = COLOR_GOLD ) -/obj/item/modular_computer/pda/ninja - color = COLOR_GRAY20 - decals = list( - "stripe" = COLOR_BLACK - ) - /obj/item/modular_computer/pda/heads color = COLOR_NAVY_BLUE diff --git a/code/modules/modular_computers/file_system/programs/generic/email_client.dm b/code/modules/modular_computers/file_system/programs/generic/email_client.dm index dd73361bea8..61536217f86 100644 --- a/code/modules/modular_computers/file_system/programs/generic/email_client.dm +++ b/code/modules/modular_computers/file_system/programs/generic/email_client.dm @@ -83,7 +83,7 @@ msg += "Subject: [received_message.title]\nMessage:\n[digitalPencode2html(received_message.stored_data)]\n" if(received_message.attachment) msg += "Attachment: [received_message.attachment.filename].[received_message.attachment.filetype] ([received_message.attachment.size]GQ)\n" - msg += "Reply\n" + msg += "Reply\n" msg += "*--*" to_chat(L, jointext(msg, null)) diff --git a/code/modules/modular_computers/file_system/programs/generic/folding.dm b/code/modules/modular_computers/file_system/programs/generic/folding.dm index 30c5c9ffcd0..a7472a35264 100644 --- a/code/modules/modular_computers/file_system/programs/generic/folding.dm +++ b/code/modules/modular_computers/file_system/programs/generic/folding.dm @@ -64,7 +64,7 @@ if(world.timeofday < next_event) //Checks if it's time for the next crash chance. return - var/mob/living/holder = computer.holder.get_recursive_loc_of_type(/mob/living/carbon/human) + var/mob/living/holder = computer.holder.get_recursive_loc_of_type(/mob/living/human) var/host = computer.get_physical_host() if(program_status > PROGRAM_STATUS_CRASHED) if(PROGRAM_STATUS_RUNNING_SCALDING >= program_status) diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index 82c554665be..c13b4b0101b 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -180,7 +180,7 @@ var/idname = "*None Provided*" var/idrank = "*None Provided*" if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user idname = H.get_authentification_name() idrank = H.get_assignment() else if(issilicon(user)) diff --git a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm index d5586fc52de..21839f9d5d5 100644 --- a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm +++ b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm @@ -48,7 +48,7 @@ if(href_list["track"]) if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - var/mob/living/carbon/human/H = locate(href_list["track"]) in SSmobs.mob_list + var/mob/living/human/H = locate(href_list["track"]) in SSmobs.mob_list if(hassensorlevel(H, VITALS_SENSOR_TRACKING)) AI.ai_actual_track(H) return 1 diff --git a/code/modules/modular_computers/file_system/reports/crew_record.dm b/code/modules/modular_computers/file_system/reports/crew_record.dm index acfcb3a6302..6364d2c4bca 100644 --- a/code/modules/modular_computers/file_system/reports/crew_record.dm +++ b/code/modules/modular_computers/file_system/reports/crew_record.dm @@ -23,13 +23,13 @@ var/global/arrest_security_status = "Arrest" . = ..() global.all_crew_records.Remove(src) -/datum/computer_file/report/crew_record/proc/load_from_mob(var/mob/living/carbon/human/H) +/datum/computer_file/report/crew_record/proc/load_from_mob(var/mob/living/human/H) if(istype(H)) photo_front = getFlatIcon(H, SOUTH, always_use_defdir = 1) photo_side = getFlatIcon(H, WEST, always_use_defdir = 1) else - var/mob/living/carbon/human/dummy = new() + var/mob/living/human/dummy = new() photo_front = getFlatIcon(dummy, SOUTH, always_use_defdir = 1) photo_side = getFlatIcon(dummy, WEST, always_use_defdir = 1) qdel(dummy) @@ -110,9 +110,9 @@ var/global/arrest_security_status = "Arrest" set_employment_record(employment_record) // Misc cultural info. - set_homeSystem(H ? html_decode(H.get_cultural_value(TAG_HOMEWORLD)) : "Unset") - set_faction(H ? html_decode(H.get_cultural_value(TAG_FACTION)) : "Unset") - set_religion(H ? html_decode(H.get_cultural_value(TAG_RELIGION)) : "Unset") + set_residence(H ? html_decode(H.get_cultural_value(TAG_HOMEWORLD)) : "Unset") + set_faction(H ? html_decode(H.get_cultural_value(TAG_FACTION)) : "Unset") + set_religion(H ? html_decode(H.get_cultural_value(TAG_RELIGION)) : "Unset") if(H) var/skills = list() @@ -202,7 +202,7 @@ var/global/arrest_security_status = "Arrest" return CR return null -/proc/GetAssignment(var/mob/living/carbon/human/H) +/proc/GetAssignment(var/mob/living/human/H) if(!H) return "Unassigned" if(!H.mind) @@ -255,8 +255,8 @@ FIELD_SHORT("Fingerprint", fingerprint, access_security, access_security, TRUE, // EMPLOYMENT RECORDS FIELD_LONG("Employment Record", employment_record, access_bridge, access_bridge, TRUE) -FIELD_SHORT("Home System", homeSystem, access_bridge, access_change_ids, FALSE, TRUE) -FIELD_SHORT("Faction", faction, access_bridge, access_bridge, FALSE, TRUE) +FIELD_SHORT("Residence", residence, access_bridge, access_change_ids, FALSE, TRUE) +FIELD_SHORT("Association", faction, access_bridge, access_bridge, FALSE, TRUE) FIELD_LONG("Qualifications", skillset, access_bridge, access_bridge, TRUE) // ANTAG RECORDS diff --git a/code/modules/modular_computers/networking/machinery/wall_relay.dm b/code/modules/modular_computers/networking/machinery/wall_relay.dm index dbf5102bf60..bb3b423e13f 100644 --- a/code/modules/modular_computers/networking/machinery/wall_relay.dm +++ b/code/modules/modular_computers/networking/machinery/wall_relay.dm @@ -12,3 +12,19 @@ /obj/machinery/network/relay/wall_mounted/Initialize() . = ..() queue_icon_update() + +/obj/machinery/network/relay/wall_mounted/south + dir = NORTH + pixel_y = -21 + +/obj/machinery/network/relay/wall_mounted/north + dir = SOUTH + pixel_y = 21 + +/obj/machinery/network/relay/wall_mounted/west + dir = EAST + pixel_x = -21 + +/obj/machinery/network/relay/wall_mounted/east + dir = WEST + pixel_x = 21 diff --git a/code/modules/multiz/basic.dm b/code/modules/multiz/basic.dm index b1fb50c38c1..c6bf8e48ba8 100644 --- a/code/modules/multiz/basic.dm +++ b/code/modules/multiz/basic.dm @@ -33,4 +33,26 @@ var/global/list/z_levels = list() // Each Z-level is associated with the relevan else if (dir == DOWN) . = GetBelow(ref)?.resolve_to_actual_turf() else - . = get_step_resolving_mimic(ref, dir) \ No newline at end of file + . = get_step_resolving_mimic(ref, dir) + +/proc/get_dir_multiz(turf/us, turf/them) + if(!us || !them) + return 0 + if(us.z == them.z) + return get_dir(us, them) + else + var/dir = 0 + if(them.z > us.z) + var/turf/T = GET_ABOVE(us) + if(T && (T.z == them.z)) + dir = UP + else + return get_dir(us, them) + else + var/turf/T = GET_BELOW(us) + if(T && (T.z == them.z)) + dir = DOWN + else + return get_dir(us, them) + + return (dir | get_dir(us, them)) \ No newline at end of file diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index b25a5c78af0..326db2561e1 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -16,7 +16,7 @@ /mob/proc/move_down() SelfMove(DOWN) -/mob/living/carbon/human/move_up() +/mob/living/human/move_up() var/turf/old_loc = loc ..() if(loc != old_loc) @@ -48,7 +48,7 @@ /mob/proc/can_overcome_gravity() return FALSE -/mob/living/carbon/human/can_overcome_gravity() +/mob/living/human/can_overcome_gravity() //First do species check if(species && species.can_overcome_gravity(src)) return 1 @@ -162,7 +162,7 @@ if((locate(/obj/structure/disposalpipe/up) in below) || locate(/obj/machinery/atmospherics/pipe/zpipe/up) in below) return FALSE -/mob/living/carbon/human/can_fall(var/anchor_bypass = FALSE, var/turf/location_override = loc) +/mob/living/human/can_fall(var/anchor_bypass = FALSE, var/turf/location_override = loc) if(..()) return species.can_fall(src) @@ -239,7 +239,7 @@ return 100 return BASE_STORAGE_COST(w_class) -/mob/living/carbon/human/apply_fall_damage(var/turf/landing) +/mob/living/human/apply_fall_damage(var/turf/landing) if(status_flags & GODMODE) return if(species && species.handle_fall_special(src, landing)) @@ -268,7 +268,7 @@ victim.dislocate() to_chat(src, "You feel a sickening pop as your [victim.joint] is wrenched out of the socket.") -/mob/living/carbon/human/proc/climb_up(atom/A) +/mob/living/human/proc/climb_up(atom/A) if(!isturf(loc) || !bound_overlay || bound_overlay.destruction_timer || is_physically_disabled()) // This destruction_timer check ideally wouldn't be required, but I'm not awake enough to refactor this to not need it. return FALSE @@ -375,7 +375,7 @@ /mob/living/simple_animal/can_float() return is_aquatic -/mob/living/carbon/human/can_float() +/mob/living/human/can_float() return species.can_float(src) /mob/living/silicon/can_float() diff --git a/code/modules/multiz/stairs.dm b/code/modules/multiz/stairs.dm index 6bff344b06d..e99c09cd85d 100644 --- a/code/modules/multiz/stairs.dm +++ b/code/modules/multiz/stairs.dm @@ -33,7 +33,7 @@ for(var/obj/item/grab/G in L.get_active_grabs()) G.affecting.forceMove(target) if(ishuman(A)) - var/mob/living/carbon/human/H = A + var/mob/living/human/H = A if(H.has_footsteps()) playsound(source, 'sound/effects/stairs_step.ogg', 50) playsound(target, 'sound/effects/stairs_step.ogg', 50) diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm index 46b8190ae47..4e1f89bb2d4 100644 --- a/code/modules/nano/interaction/default.dm +++ b/code/modules/nano/interaction/default.dm @@ -83,7 +83,7 @@ var/global/datum/topic_state/default/default_topic_state = new if(. == STATUS_INTERACTIVE) return STATUS_UPDATE -/mob/living/carbon/human/default_can_use_topic(var/src_object) +/mob/living/human/default_can_use_topic(var/src_object) . = shared_nano_interaction(src_object) if(. != STATUS_CLOSE) if(loc) diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index 926fe34acf2..8b30cf95b20 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -2,12 +2,12 @@ name = "Appearance Editor" available_to_ai = FALSE var/flags = APPEARANCE_ALL_HAIR - var/mob/living/carbon/human/owner = null + var/mob/living/human/owner = null var/check_whitelist var/list/whitelist var/list/blacklist -/datum/nano_module/appearance_changer/New(var/location, var/mob/living/carbon/human/H, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list()) +/datum/nano_module/appearance_changer/New(var/location, var/mob/living/human/H, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list()) ..() owner = H src.check_whitelist = check_species_whitelist @@ -43,38 +43,32 @@ if(href_list["skin_color"] && can_change_skin_color()) var/new_skin = input(usr, "Choose your character's skin colour: ", "Skin Color", owner.get_skin_colour()) as color|null if(new_skin && can_still_topic(state) && owner.set_skin_colour(new_skin)) - update_dna() return TRUE if(href_list["hair"]) var/decl/sprite_accessory/hair = locate(href_list["hair"]) if(can_change(APPEARANCE_HAIR) && istype(hair) && (hair.type in owner.get_species()?.get_available_accessory_types(owner.get_bodytype(), SAC_HAIR)) && SET_HAIR_STYLE(owner, hair.type, FALSE)) - update_dna() return TRUE if(href_list["hair_color"] && can_change(APPEARANCE_HAIR_COLOR)) var/new_hair = input("Please select hair color.", "Hair Color", GET_HAIR_COLOUR(owner)) as color|null if(new_hair && can_still_topic(state) && SET_HAIR_COLOUR(owner, new_hair, FALSE)) - update_dna() return TRUE if(href_list["facial_hair"]) var/decl/sprite_accessory/facial_hair = locate(href_list["facial_hair"]) if(can_change(APPEARANCE_FACIAL_HAIR) && istype(facial_hair) && (facial_hair.type in owner.get_species()?.get_available_accessory_types(owner.get_bodytype(), SAC_FACIAL_HAIR)) && SET_FACIAL_HAIR_STYLE(owner, facial_hair.type, FALSE)) - update_dna() return TRUE if(href_list["facial_hair_color"] && can_change(APPEARANCE_FACIAL_HAIR_COLOR)) var/new_facial = input("Please select facial hair color.", "Facial Hair Color", GET_FACIAL_HAIR_COLOUR(owner)) as color|null if(new_facial && can_still_topic(state) && SET_FACIAL_HAIR_COLOUR(owner, new_facial, FALSE)) - update_dna() return TRUE if(href_list["eye_color"]) if(can_change(APPEARANCE_EYE_COLOR)) var/new_eyes = input("Please select eye color.", "Eye Color", owner.get_eye_colour()) as color|null if(new_eyes && can_still_topic(state) && owner.set_eye_colour(new_eyes)) - update_dna() return TRUE return FALSE @@ -143,10 +137,6 @@ ui.open() ui.set_auto_update(1) -/datum/nano_module/appearance_changer/proc/update_dna() - if(owner && (flags & APPEARANCE_UPDATE_DNA)) - owner.update_dna() - /datum/nano_module/appearance_changer/proc/can_change(var/flag) return owner && (flags & flag) diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm index f336559475f..fe0a427807a 100644 --- a/code/modules/nano/modules/law_manager.dm +++ b/code/modules/nano/modules/law_manager.dm @@ -53,17 +53,17 @@ return 1 if(href_list["add_ion_law"]) - if(ion_law && is_traitor(usr)) + if(ion_law && is_jailbroken(usr)) owner.add_ion_law(ion_law) return 1 if(href_list["add_inherent_law"]) - if(inherent_law && is_traitor(usr)) + if(inherent_law && is_jailbroken(usr)) owner.add_inherent_law(inherent_law) return 1 if(href_list["add_supplied_law"]) - if(supplied_law && supplied_law_position >= 1 && MIN_SUPPLIED_LAW_NUMBER <= MAX_SUPPLIED_LAW_NUMBER && is_traitor(usr)) + if(supplied_law && supplied_law_position >= 1 && MIN_SUPPLIED_LAW_NUMBER <= MAX_SUPPLIED_LAW_NUMBER && is_jailbroken(usr)) owner.add_supplied_law(supplied_law_position, supplied_law) return 1 @@ -98,19 +98,19 @@ return 1 if(href_list["edit_law"]) - if(is_traitor(usr)) + if(is_jailbroken(usr)) var/datum/ai_law/AL = locate(href_list["edit_law"]) in owner.laws.all_laws() if(AL) var/new_law = sanitize(input(usr, "Enter new law. Leaving the field blank will cancel the edit.", "Edit Law", AL.law)) - if(new_law && new_law != AL.law && is_traitor(usr) && can_still_topic()) + if(new_law && new_law != AL.law && is_jailbroken(usr) && can_still_topic()) log_and_message_admins("has changed a law of [owner] from '[AL.law]' to '[new_law]'") AL.law = new_law return 1 if(href_list["delete_law"]) - if(is_traitor(usr)) + if(is_jailbroken(usr)) var/datum/ai_law/AL = locate(href_list["delete_law"]) in owner.laws.all_laws() - if(AL && is_traitor(usr)) + if(AL && is_jailbroken(usr)) owner.delete_law(AL) return 1 @@ -125,7 +125,7 @@ return 1 if(href_list["transfer_laws"]) - if(is_traitor(usr)) + if(is_jailbroken(usr)) var/datum/ai_laws/ALs = locate(href_list["transfer_laws"]) in (is_admin(usr) ? admin_laws : player_laws) if(ALs) log_and_message_admins("has transfered the [ALs.name] laws to [owner].") @@ -164,7 +164,7 @@ package_laws(data, "supplied_laws", owner.laws.supplied_laws) data["isAI"] = isAI(owner) - data["isMalf"] = is_traitor(user) + data["isMalf"] = is_jailbroken(user) data["isSlaved"] = owner.is_slaved() data["isAdmin"] = is_admin(user) data["view"] = current_view @@ -178,7 +178,7 @@ ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "law_manager.tmpl", sanitize("[src] - [owner]"), 800, is_traitor(user) ? 600 : 400, state = state) + ui = new(user, src, ui_key, "law_manager.tmpl", sanitize("[src] - [owner]"), 800, is_jailbroken(user) ? 600 : 400, state = state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -202,8 +202,8 @@ return law_sets -/datum/nano_module/law_manager/proc/is_traitor(var/mob/user) - return (is_admin(user) && !owner.is_slaved()) || owner.is_traitor() +/datum/nano_module/law_manager/proc/is_jailbroken(var/mob/user) + return (is_admin(user) && !owner.is_slaved()) || owner.is_malfunctioning() /mob/living/silicon/proc/is_slaved() return 0 diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 09cd55986e1..39673c2f03e 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -81,6 +81,13 @@ var/image/hud_damage_image var/fingerprint +/obj/item/organ/external/proc/set_fingerprint(value) + if((limb_flags & ORGAN_FLAG_FINGERPRINT) && !BP_IS_PROSTHETIC(src)) + fingerprint = value + else + for(var/obj/item/organ/external/E in children) + E.set_fingerprint(value) + /obj/item/organ/external/proc/get_fingerprint() if((limb_flags & ORGAN_FLAG_FINGERPRINT) && !BP_IS_PROSTHETIC(src)) @@ -102,7 +109,7 @@ F.completeness = rand(10,90) forensics.add_data(/datum/forensics/fingerprints, F) -/obj/item/organ/external/Initialize(mapload, material_key, datum/dna/given_dna, decl/bodytype/new_bodytype) +/obj/item/organ/external/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) . = ..() if(. != INITIALIZE_HINT_QDEL && isnull(pain_disability_threshold)) pain_disability_threshold = (max_damage * 0.75) @@ -144,8 +151,16 @@ if(.) update_icon(TRUE) -/obj/item/organ/external/set_dna(var/datum/dna/new_dna) +/obj/item/organ/external/copy_from_mob_snapshot(datum/mob_snapshot/supplied_appearance) _icon_cache_key = null + if(organ_tag in supplied_appearance?.sprite_accessories) + var/list/sprite_cats = supplied_appearance.sprite_accessories[organ_tag] + for(var/category in sprite_cats) + var/list/marklist = sprite_cats[category] + for(var/accessory in marklist) + set_sprite_accessory(accessory, null, marklist[accessory], skip_update = TRUE) + else + clear_sprite_accessories(skip_update = TRUE) return ..() /obj/item/organ/external/reset_status() @@ -413,7 +428,7 @@ if(can_feel_pain()) add_pain(20) owner.apply_effect(5, STUN) - owner.verbs |= /mob/living/carbon/human/proc/undislocate + owner.verbs |= /mob/living/human/proc/undislocate /obj/item/organ/external/proc/undislocate(var/skip_pain = FALSE) if(!(limb_flags & ORGAN_FLAG_CAN_DISLOCATE)) @@ -429,10 +444,10 @@ for(var/obj/item/organ/external/limb in owner.get_external_organs()) if(limb.is_dislocated()) return - owner.verbs -= /mob/living/carbon/human/proc/undislocate + owner.verbs -= /mob/living/human/proc/undislocate //If "in_place" is TRUE will make organs skip their install/uninstall effects and the sub-limbs and internal organs -/obj/item/organ/external/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) +/obj/item/organ/external/do_install(mob/living/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) if(!(. = ..())) return @@ -580,7 +595,7 @@ /* This function completely restores a damaged organ to perfect condition. */ -/obj/item/organ/external/rejuvenate(var/ignore_organ_aspects) +/obj/item/organ/external/rejuvenate(var/ignore_organ_traits) damage_state = "00" brute_dam = 0 @@ -595,10 +610,9 @@ This function completely restores a damaged organ to perfect condition. qdel(wound) number_wounds = 0 - // handle internal organs for(var/obj/item/organ/current_organ in internal_organs) - current_organ.rejuvenate(ignore_organ_aspects) + current_organ.rejuvenate(ignore_organ_traits) // remove embedded objects and drop them on the floor for(var/obj/implanted_object in implants) @@ -608,7 +622,7 @@ This function completely restores a damaged organ to perfect condition. undislocate(TRUE) - . = ..() // Clear damage, reapply aspects. + . = ..() // Clear damage, reapply traits. if(owner) owner.update_health() @@ -629,9 +643,15 @@ This function completely restores a damaged organ to perfect condition. if(!owner || damage <= 0) return - if(BP_IS_CRYSTAL(src) && (damage >= 15 || prob(1))) + if(BP_IS_CRYSTAL(src)) type = SHATTER - playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 40, 1) // Crash! + if(damage >= 15 || prob(1)) + playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 40, 1) // Crash! + else if((limb_flags & ORGAN_FLAG_SKELETAL) || (BP_IS_PROSTHETIC(src) && !bodytype.is_robotic)) + if(type == BURN) + type = CHARRED + else + type = SHATTER //moved these before the open_wound check so that having many small wounds for example doesn't somehow protect you from taking internal damage (because of the return) //Brute damage can possibly trigger an internal wound, too. @@ -713,7 +733,7 @@ This function completely restores a damaged organ to perfect condition. if(length(ailments)) return TRUE - if(status & (ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_DEAD|ORGAN_MUTATED|ORGAN_DISLOCATED)) + if(status & (ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_MUTATED|ORGAN_DISLOCATED|ORGAN_DEAD)) return TRUE if((brute_dam || burn_dam) && !BP_IS_PROSTHETIC(src)) //Robot limbs don't autoheal and thus don't need to process when damaged @@ -910,7 +930,7 @@ Note that amputating the affected organ does in fact remove the infection from t status &= ~ORGAN_BLEEDING var/clamped = 0 - var/mob/living/carbon/human/H + var/mob/living/human/H if(ishuman(owner)) H = owner @@ -1064,7 +1084,7 @@ Note that amputating the affected organ does in fact remove the infection from t owner.shock_stage += min_broken_damage var/obj/item/organ/external/original_parent = parent - var/mob/living/carbon/human/victim = owner //Keep a reference for post-removed(). + var/mob/living/human/victim = owner //Keep a reference for post-removed(). owner.remove_organ(src, TRUE, FALSE, ignore_children, update_icon = FALSE) var/remaining_organs = victim.get_external_organs() if(istype(victim) && !QDELETED(victim)) @@ -1132,7 +1152,7 @@ Note that amputating the affected organ does in fact remove the infection from t HELPERS ****************************************************/ -/obj/item/organ/external/proc/release_restraints(var/mob/living/carbon/human/holder) +/obj/item/organ/external/proc/release_restraints(var/mob/living/human/holder) if(!holder) holder = owner if(!holder) @@ -1339,7 +1359,7 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/do_uninstall(in_place, detach, ignore_children, update_icon) - var/mob/living/carbon/human/victim = owner //parent proc clears owner + var/mob/living/human/victim = owner //parent proc clears owner if(!(. = ..())) return @@ -1437,7 +1457,7 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/proc/get_incision(var/strict) var/datum/wound/incision - if(BP_IS_CRYSTAL(src)) + if(BP_IS_CRYSTAL(src) || (limb_flags & ORGAN_FLAG_SKELETAL)) for(var/datum/wound/shatter/other in wounds) if(!incision || incision.damage < other.damage) incision = other @@ -1600,3 +1620,25 @@ Note that amputating the affected organ does in fact remove the infection from t var/default_results = bodytype.get_default_grooming_results(src, tool) if(default_results) . = default_results + +/obj/item/organ/external/proc/get_sprite_accessories(copy = FALSE) + if(copy) + return _sprite_accessories?.Copy() + return _sprite_accessories + +/obj/item/organ/external/proc/skeletonize(mob/living/donor) + if(limb_flags & ORGAN_FLAG_SKELETAL) + return + if(!donor) + if(!owner) + return + donor = owner + var/decl/butchery_data/butchery_data = GET_DECL(donor.butchery_data) + if(!butchery_data?.bone_material) + return + material = GET_DECL(butchery_data?.bone_material) + limb_flags |= ORGAN_FLAG_SKELETAL + status |= (ORGAN_DEAD|ORGAN_BRITTLE) + _sprite_accessories = null + update_icon() + diff --git a/code/modules/organs/external/_external_damage.dm b/code/modules/organs/external/_external_damage.dm index f6b3e05938b..59136820d93 100644 --- a/code/modules/organs/external/_external_damage.dm +++ b/code/modules/organs/external/_external_damage.dm @@ -307,13 +307,13 @@ /obj/item/organ/external/proc/sever_artery() var/obj/item/organ/internal/heart/heart_path = bodytype?.has_organ[BP_HEART] if(heart_path) - if(!BP_IS_PROSTHETIC(src) && !(status & ORGAN_ARTERY_CUT) && !initial(heart_path.open)) + if(!BP_IS_PROSTHETIC(src) && !(limb_flags & ORGAN_FLAG_SKELETAL) && !(status & ORGAN_ARTERY_CUT) && !initial(heart_path.open)) status |= ORGAN_ARTERY_CUT return TRUE return FALSE /obj/item/organ/external/proc/sever_tendon() - if((limb_flags & ORGAN_FLAG_HAS_TENDON) && !BP_IS_PROSTHETIC(src) && !(status & ORGAN_TENDON_CUT)) + if((limb_flags & ORGAN_FLAG_HAS_TENDON) && !BP_IS_PROSTHETIC(src) && !(limb_flags & ORGAN_FLAG_SKELETAL) && !(status & ORGAN_TENDON_CUT)) status |= ORGAN_TENDON_CUT return TRUE return FALSE @@ -350,36 +350,38 @@ // and the brute damage dealt exceeds the tearoff threshold, the organ is torn off. /obj/item/organ/external/proc/attempt_dismemberment(brute, burn, sharp, edge, used_weapon, spillover, force_droplimb, override_droplimb) //Check edge eligibility - var/edge_eligible = 0 + var/edge_eligible = FALSE if(edge) + // used_weapon can be a string sometimes, for some reason + // todo: refactor to avoid? if(istype(used_weapon,/obj/item)) - var/obj/item/W = used_weapon - if(W.w_class >= w_class) - edge_eligible = 1 + var/obj/item/used_item = used_weapon + if(used_item.w_class >= w_class) + edge_eligible = TRUE else - edge_eligible = 1 + edge_eligible = TRUE else if(sharp) brute = 0.5 * brute if(force_droplimb) if(burn) - dismember(0, (override_droplimb || DISMEMBER_METHOD_BURN)) + dismember(FALSE, (override_droplimb || DISMEMBER_METHOD_BURN)) else if(brute) - dismember(0, (override_droplimb || (edge_eligible ? DISMEMBER_METHOD_EDGE : DISMEMBER_METHOD_BLUNT))) + dismember(FALSE, (override_droplimb || (edge_eligible ? DISMEMBER_METHOD_EDGE : DISMEMBER_METHOD_BLUNT))) return TRUE if(edge_eligible && brute >= max_damage / DROPLIMB_THRESHOLD_EDGE) if(prob(brute)) - dismember(0, (override_droplimb || DISMEMBER_METHOD_EDGE)) + dismember(FALSE, (override_droplimb || DISMEMBER_METHOD_EDGE)) return TRUE else if(burn >= max_damage / DROPLIMB_THRESHOLD_DESTROY) if(prob(burn/3)) - dismember(0, (override_droplimb || DISMEMBER_METHOD_BURN)) + dismember(FALSE, (override_droplimb || DISMEMBER_METHOD_BURN)) return TRUE else if(brute >= max_damage / DROPLIMB_THRESHOLD_DESTROY) if(prob(brute)) - dismember(0, (override_droplimb || DISMEMBER_METHOD_BLUNT)) + dismember(FALSE, (override_droplimb || DISMEMBER_METHOD_BLUNT)) return TRUE else if(brute >= max_damage / DROPLIMB_THRESHOLD_TEAROFF) if(prob(brute/3)) - dismember(0, (override_droplimb || DISMEMBER_METHOD_EDGE)) + dismember(FALSE, (override_droplimb || DISMEMBER_METHOD_EDGE)) return TRUE diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm index 687e4e12738..07af53dd451 100644 --- a/code/modules/organs/external/_external_icons.dm +++ b/code/modules/organs/external/_external_icons.dm @@ -18,7 +18,14 @@ var/global/list/limb_icon_cache = list() update_icon() compile_overlays() -/obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human) +/obj/item/organ/external/proc/get_surgery_overlay_icon() + if(limb_flags & ORGAN_FLAG_SKELETAL) + return null + if(BP_IS_PROSTHETIC(src)) + return null + return species?.get_surgery_overlay_icon(owner) + +/obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/human/human) _icon_cache_key = null skin_tone = null skin_colour = null @@ -29,16 +36,7 @@ var/global/list/limb_icon_cache = list() if(bodytype.appearance_flags & HAS_SKIN_COLOR) skin_colour = human.get_skin_colour() -/obj/item/organ/external/proc/sync_colour_to_dna() - _icon_cache_key = null - skin_tone = null - skin_colour = null - if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && (bodytype.appearance_flags & HAS_A_SKIN_TONE)) - skin_tone = dna.GetUIValue(DNA_UI_SKIN_TONE) - if(bodytype.appearance_flags & HAS_SKIN_COLOR) - skin_colour = rgb(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B)) - -/obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human) +/obj/item/organ/external/head/sync_colour_to_human(var/mob/living/human/human) ..() var/obj/item/organ/internal/eyes/eyes = human.get_organ(BP_EYES, /obj/item/organ/internal/eyes) if(eyes) eyes.update_colour() @@ -53,10 +51,10 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/proc/update_limb_icon_file() if(!bodytype) // This should not happen. icon = initial(icon) + else if(limb_flags & ORGAN_FLAG_SKELETAL) + icon = bodytype.get_skeletal_icon(owner) else if(!BP_IS_PROSTHETIC(src) && (status & ORGAN_MUTATED)) icon = bodytype.get_base_icon(owner, get_deform = TRUE) - else if(owner && (limb_flags & ORGAN_FLAG_SKELETAL)) - icon = bodytype.get_skeletal_icon(owner) else icon = bodytype.get_base_icon(owner) @@ -65,14 +63,20 @@ var/global/list/organ_icon_cache = list() // Generate base icon with colour and tone. var/icon/ret = bodytype.apply_limb_colouration(src, new /icon(icon, icon_state)) - if(status & ORGAN_DEAD) + if(limb_flags & ORGAN_FLAG_SKELETAL) + global.organ_icon_cache[_icon_cache_key] = ret + return ret + + if((status & ORGAN_DEAD)) ret.ColorTone(rgb(10,50,0)) ret.SetIntensity(0.7) + if(skin_tone) if(skin_tone >= 0) ret.Blend(rgb(skin_tone, skin_tone, skin_tone), ICON_ADD) else ret.Blend(rgb(-skin_tone, -skin_tone, -skin_tone), ICON_SUBTRACT) + if((bodytype.appearance_flags & HAS_SKIN_COLOR) && skin_colour) ret.Blend(skin_colour, skin_blend) @@ -108,7 +112,14 @@ var/global/list/organ_icon_cache = list() LAZYADD(., accessory_image) /obj/item/organ/external/proc/get_icon_cache_key_components() + . = list("[icon_state]_[species.name]_[bodytype?.name || "BAD_BODYTYPE"]_[render_alpha]_[icon]") + + // Skeletons don't care about most icon appearance stuff. + if(limb_flags & ORGAN_FLAG_SKELETAL) + . += "_skeletal_[skin_blend]" + return + if(status & ORGAN_DEAD) . += "_dead" . += "_tone_[skin_tone]_color_[skin_colour]_[skin_blend]" diff --git a/code/modules/organs/external/diagnostics.dm b/code/modules/organs/external/diagnostics.dm index fd7ace688cc..b3eddf17daa 100644 --- a/code/modules/organs/external/diagnostics.dm +++ b/code/modules/organs/external/diagnostics.dm @@ -90,6 +90,8 @@ . += "Splinted" if(status & ORGAN_BLEEDING) . += "Bleeding" + if(limb_flags & ORGAN_FLAG_SKELETAL) + . += "Skeletal" if(status & ORGAN_BROKEN) . += capitalize(broken_description) if (LAZYLEN(implants)) @@ -187,7 +189,7 @@ /decl/diagnostic_sign/proc/get_description(mob/user) . = descriptor if(user && user.skill_check(SKILL_MEDICAL, hint_min_skill)) - . += "(?)" + . += "(?)" /decl/diagnostic_sign/Topic(var/href, var/list/href_list) . = ..() diff --git a/code/modules/organs/external/head.dm b/code/modules/organs/external/head.dm index 876eb22f3d6..1d6b432822c 100644 --- a/code/modules/organs/external/head.dm +++ b/code/modules/organs/external/head.dm @@ -93,7 +93,7 @@ /obj/item/organ/external/head/proc/get_eyes_organ() RETURN_TYPE(/obj/item/organ/internal/eyes) if(owner) - return owner.get_organ((owner.get_bodytype().vision_organ || BP_EYES), /obj/item/organ/internal/eyes) + return owner.get_organ((owner.get_vision_organ_tag() || BP_EYES), /obj/item/organ/internal/eyes) return locate(/obj/item/organ/internal/eyes) in contents /obj/item/organ/external/head/get_icon_cache_key_components() @@ -114,7 +114,7 @@ if(eye_glow) LAZYADD(., eye_glow) -/obj/item/organ/external/head/gripper/do_install(mob/living/carbon/human/target, affected, in_place, update_icon, detached) +/obj/item/organ/external/head/gripper/do_install(mob/living/human/target, affected, in_place, update_icon, detached) . = ..() if(. && owner) owner.add_held_item_slot(new /datum/inventory_slot/gripper/mouth) diff --git a/code/modules/organs/external/standard.dm b/code/modules/organs/external/standard.dm index 8579c7690da..6864436733d 100644 --- a/code/modules/organs/external/standard.dm +++ b/code/modules/organs/external/standard.dm @@ -144,7 +144,7 @@ limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_FINGERPRINT | ORGAN_FLAG_HAS_TENDON | ORGAN_FLAG_CAN_BREAK | ORGAN_FLAG_CAN_DISLOCATE var/gripper_type = /datum/inventory_slot/gripper/left_hand -/obj/item/organ/external/hand/do_install(mob/living/carbon/human/target, affected, in_place, update_icon, detached) +/obj/item/organ/external/hand/do_install(mob/living/human/target, affected, in_place, update_icon, detached) . = ..() if(. && owner && gripper_type) owner.add_held_item_slot(new gripper_type) diff --git a/code/modules/organs/external/tail.dm b/code/modules/organs/external/tail.dm index 55fff675056..09ba736bec2 100644 --- a/code/modules/organs/external/tail.dm +++ b/code/modules/organs/external/tail.dm @@ -28,14 +28,18 @@ /// How many random tail states are available for animations. var/tail_states = 1 +/obj/item/organ/external/tail/skeletonize() + . = ..() + owner?.update_tail_showing() + /obj/item/organ/external/tail/do_uninstall(in_place, detach, ignore_children, update_icon) - var/mob/living/carbon/human/H = owner + var/mob/living/human/H = owner if(!(. = ..())) return if(update_icon && !istype(H) && !QDELETED(H) && H != owner) H.update_tail_showing(FALSE) -/obj/item/organ/external/tail/do_install(mob/living/carbon/human/target, affected, in_place, update_icon, detached) +/obj/item/organ/external/tail/do_install(mob/living/human/target, affected, in_place, update_icon, detached) . = ..() if(update_icon && istype(owner) && !QDELETED(owner)) owner.update_tail_showing(FALSE) diff --git a/code/modules/organs/external/wounds/wound_types.dm b/code/modules/organs/external/wounds/wound_types.dm index 0508751aa12..a60663462b7 100644 --- a/code/modules/organs/external/wounds/wound_types.dm +++ b/code/modules/organs/external/wounds/wound_types.dm @@ -57,6 +57,18 @@ return /datum/wound/shatter/cracked if(0 to 15) return /datum/wound/shatter/chipped + if(CHARRED) + switch(damage) + if(50 to INFINITY) + return /datum/wound/charred/charcoal + if(40 to 50) + return /datum/wound/charred/charred + if(30 to 40) + return /datum/wound/charred/burned + if(15 to 30) + return /datum/wound/charred/seared + if(0 to 15) + return /datum/wound/charred/singed return null //no wound @@ -345,3 +357,18 @@ /datum/wound/shatter/chipped stages = list("chip" = 0) + +/datum/wound/charred/charcoal + stages = list("crumbling charred area" = 0) + +/datum/wound/charred/charred + stages = list("charred area" = 0) + +/datum/wound/charred/burned + stages = list("burned area" = 0) + +/datum/wound/charred/seared + stages = list("lightly seared area" = 0) + +/datum/wound/charred/singed + stages = list("singed area" = 0) diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index b07a455e703..4ced3c84d5a 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -27,7 +27,7 @@ /// Whether or not we should try to transfer a brainmob when removed or replaced in a mob. var/transfer_brainmob_with_organ = FALSE -/obj/item/organ/internal/Initialize(mapload, material_key, datum/dna/given_dna, decl/bodytype/new_bodytype) +/obj/item/organ/internal/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) if(!alive_icon) alive_icon = initial(icon_state) . = ..() @@ -38,7 +38,7 @@ if(species.organs_icon) icon = species.organs_icon -/obj/item/organ/internal/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) +/obj/item/organ/internal/do_install(mob/living/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) . = ..() if(!affected) @@ -276,7 +276,6 @@ if(update_brainmob) brainmob.SetName(M.real_name) brainmob.real_name = M.real_name - brainmob.dna = M.dna?.Clone() brainmob.languages = M.languages?.Copy() brainmob.default_language = M.default_language to_chat(brainmob, SPAN_NOTICE("You feel slightly disoriented. That's normal when you're just \a [initial(src.name)].")) @@ -292,7 +291,7 @@ return brainmob?.key // This might need revisiting to stop people successfully implanting brains in groins and transferring minds. -/obj/item/organ/internal/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) +/obj/item/organ/internal/do_install(mob/living/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) . = ..() if(transfer_brainmob_with_organ && istype(owner)) var/mob/living/brainmob = get_brainmob(create_if_missing = FALSE) diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 937f4beeb1a..3721d55e684 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -70,7 +70,7 @@ else to_chat(user, "This one seems particularly lifeless. Perhaps it will regain some of its luster later..") -/obj/item/organ/internal/brain/do_install(mob/living/carbon/target, affected, in_place, update_icon, detached) +/obj/item/organ/internal/brain/do_install(mob/living/target, affected, in_place, update_icon, detached) if(!(. = ..())) return if(istype(owner)) @@ -185,9 +185,9 @@ /obj/item/organ/internal/brain/proc/handle_disabilities() if(owner.stat) return - if((owner.disabilities & EPILEPSY) && prob(1)) + if(owner.has_genetic_condition(GENE_COND_EPILEPSY) && prob(1)) owner.seizure() - else if((owner.disabilities & TOURETTES) && prob(10)) + else if(owner.has_genetic_condition(GENE_COND_TOURETTES) && prob(10)) SET_STATUS_MAX(owner, STAT_STUN, 10) switch(rand(1, 3)) if(1) @@ -195,7 +195,7 @@ if(2 to 3) owner.say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]") ADJ_STATUS(owner, STAT_JITTER, 100) - else if((owner.disabilities & NERVOUS) && prob(10)) + else if(owner.has_genetic_condition(GENE_COND_NERVOUS) && prob(10)) SET_STATUS_MAX(owner, STAT_STUTTER, 10) diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index 9eaec210aa2..f193afaa4da 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -31,7 +31,7 @@ organ_properties = ORGAN_PROP_PROSTHETIC icon = 'icons/obj/robot_component.dmi' -/obj/item/organ/internal/eyes/robot/Initialize(mapload, material_key, datum/dna/given_dna, decl/bodytype/new_bodytype) +/obj/item/organ/internal/eyes/robot/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) . = ..() verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color_verb verbs |= /obj/item/organ/internal/eyes/proc/toggle_eye_glow @@ -90,7 +90,7 @@ /obj/item/organ/internal/eyes/proc/additional_flash_effects(var/intensity) return -1 -/obj/item/organ/internal/eyes/do_install(mob/living/carbon/human/target, affected, in_place, update_icon, detached) +/obj/item/organ/internal/eyes/do_install(mob/living/human/target, affected, in_place, update_icon, detached) // Apply our eye colour to the target. if(istype(target) && eye_colour) target.set_eye_colour(eye_colour, skip_update = TRUE) diff --git a/code/modules/organs/internal/heart.dm b/code/modules/organs/internal/heart.dm index 4fcba76e39c..85f807eae8c 100644 --- a/code/modules/organs/internal/heart.dm +++ b/code/modules/organs/internal/heart.dm @@ -68,14 +68,15 @@ //If heart is stopped, it isn't going to restart itself randomly. if(pulse == PULSE_NONE) return - else //and if it's beating, let's see if it should - var/should_stop = prob(80) && owner.get_blood_circulation() < BLOOD_VOLUME_SURVIVE //cardiovascular shock, not enough liquid to pump - should_stop = should_stop || prob(max(0, owner.get_damage(BRAIN) - owner.get_max_health() * 0.75)) //brain failing to work heart properly - should_stop = should_stop || (prob(5) && pulse == PULSE_THREADY) //erratic heart patterns, usually caused by oxyloss - if(should_stop) // The heart has stopped due to going into traumatic or cardiovascular shock. - to_chat(owner, "Your heart has stopped!") - pulse = PULSE_NONE - return + + //and if it's beating, let's see if it should + var/should_stop = prob(80) && oxy < BLOOD_VOLUME_SURVIVE //cardiovascular shock, not enough liquid to pump + should_stop = should_stop || prob(max(0, owner.get_damage(BRAIN) - owner.get_max_health() * 0.75)) //brain failing to work heart properly + should_stop = should_stop || (prob(5) && pulse == PULSE_THREADY) //erratic heart patterns, usually caused by oxyloss + if(should_stop) // The heart has stopped due to going into traumatic or cardiovascular shock. + to_chat(owner, SPAN_DANGER("Your heart has stopped!")) + pulse = PULSE_NONE + return // Pulse normally shouldn't go above PULSE_2FAST pulse = clamp(PULSE_NORM + pulse_mod, PULSE_SLOW, PULSE_2FAST) @@ -136,7 +137,7 @@ if(W.bleeding()) if(temp.applied_pressure) if(ishuman(temp.applied_pressure)) - var/mob/living/carbon/human/H = temp.applied_pressure + var/mob/living/human/H = temp.applied_pressure H.bloody_hands(src, 0) //somehow you can apply pressure to every wound on the organ at the same time //you're basically forced to do nothing at all, so let's make it pretty effective @@ -218,7 +219,7 @@ . = "[pulsesound] pulse" -/obj/item/organ/internal/heart/rejuvenate(ignore_organ_aspects) +/obj/item/organ/internal/heart/rejuvenate(ignore_organ_traits) . = ..() if(!BP_IS_PROSTHETIC(src)) pulse = PULSE_NORM diff --git a/code/modules/organs/internal/liver.dm b/code/modules/organs/internal/liver.dm index 9df1702671c..bc782095676 100644 --- a/code/modules/organs/internal/liver.dm +++ b/code/modules/organs/internal/liver.dm @@ -23,12 +23,10 @@ if(!owner) return - if (germ_level > INFECTION_LEVEL_ONE) - if(prob(1)) - to_chat(owner, "Your skin itches.") - if (germ_level > INFECTION_LEVEL_TWO) - if(prob(1)) - spawn owner.vomit() + if (germ_level > INFECTION_LEVEL_ONE && prob(1)) + to_chat(owner, SPAN_DANGER("Your skin itches.")) + if (germ_level > INFECTION_LEVEL_TWO && prob(1)) + owner.vomit() //Detox can heal small amounts of damage if (damage < max_damage && !GET_CHEMICAL_EFFECT(owner, CE_TOXIN)) diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index 9fc8e2a6297..7a9b0cb8180 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -41,7 +41,7 @@ inhaled.my_atom = src . = ..() -/obj/item/organ/internal/lungs/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place) +/obj/item/organ/internal/lungs/do_install(mob/living/human/target, obj/item/organ/external/affected, in_place) if(!(. = ..())) return inhaled.my_atom = owner @@ -273,7 +273,7 @@ // Hot air hurts :( var/cold_1 = bodytype.get_body_temperature_threshold(COLD_LEVEL_1) var/heat_1 = bodytype.get_body_temperature_threshold(HEAT_LEVEL_1) - if((breath.temperature < cold_1 || breath.temperature > heat_1) && !(MUTATION_COLD_RESISTANCE in owner.mutations)) + if((breath.temperature < cold_1 || breath.temperature > heat_1) && !owner.has_genetic_condition(GENE_COND_COLD_RESISTANCE)) var/damage = 0 if(breath.temperature <= cold_1) if(prob(20)) diff --git a/code/modules/organs/internal/stomach.dm b/code/modules/organs/internal/stomach.dm index 25c3291e363..f28de893814 100644 --- a/code/modules/organs/internal/stomach.dm +++ b/code/modules/organs/internal/stomach.dm @@ -119,7 +119,7 @@ var/alcohol_volume = REAGENT_VOLUME(ingested, /decl/material/liquid/ethanol) var/alcohol_threshold_met = alcohol_volume > STOMACH_VOLUME / 2 - if(alcohol_threshold_met && (owner.disabilities & EPILEPSY) && prob(20)) + if(alcohol_threshold_met && owner.has_genetic_condition(GENE_COND_EPILEPSY) && prob(20)) owner.seizure() // Alcohol counts as double volume for the purposes of vomit probability diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 14f2729490c..6ae0fb2f1ea 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -19,8 +19,8 @@ var/vital_to_owner // Cache var for vitality to current owner. // Reference data. - var/mob/living/carbon/human/owner // Current mob owning the organ. - var/datum/dna/dna // Original DNA. + var/datum/mob_snapshot/organ_appearance + var/mob/living/human/owner // Current mob owning the organ. var/decl/species/species // Original species. var/decl/bodytype/bodytype // Original bodytype. var/list/ailments // Current active ailments if any. @@ -46,7 +46,7 @@ do_uninstall(TRUE, FALSE, FALSE, FALSE) //Don't ignore children here since we might own/contain them species = null bodytype = null - QDEL_NULL(dna) + QDEL_NULL(organ_appearance) QDEL_NULL_LIST(ailments) return ..() @@ -63,43 +63,42 @@ return (damage >= min_broken_damage || (status & ORGAN_CUT_AWAY) || (status & ORGAN_BROKEN) || (status & ORGAN_DEAD)) //Third argument may be a dna datum; if null will be set to holder's dna. -/obj/item/organ/Initialize(mapload, material_key, datum/dna/given_dna, decl/bodytype/new_bodytype) +/obj/item/organ/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance) . = ..(mapload, material_key) if(. == INITIALIZE_HINT_QDEL) return . - setup(given_dna, new_bodytype) + setup_organ(supplied_appearance) initialize_reagents() -/obj/item/organ/proc/setup(datum/dna/given_dna, decl/bodytype/new_bodytype) +/obj/item/organ/proc/setup_organ(datum/mob_snapshot/supplied_appearance) //Null DNA setup - if(!given_dna) - if(dna) - given_dna = dna //Use existing if possible + if(!supplied_appearance) + if(organ_appearance) + supplied_appearance = organ_appearance //Use existing if possible else if(owner) - if(owner.dna) - given_dna = owner.dna //Grab our owner's dna if we don't have any, and they have + if(owner) + supplied_appearance = owner.get_mob_snapshot() //Grab our owner's appearance info if we don't have any, and they have else - //The owner having no DNA can be a valid reason to keep our dna null in some cases - log_debug("obj/item/organ/setup(): [src] had null dna, with a owner with null dna!") - dna = null //#TODO: Not sure that's really legal + //The owner having no DNA can be a valid reason to keep our appearance data null in some cases + log_debug("obj/item/organ/setup(): [src] had null appearance data, with a owner with null appearance data!") + organ_appearance = null //#TODO: Not sure that's really legal return else - //If we have NO OWNER and given_dna, just make one up for consistency - given_dna = new/datum/dna() - given_dna.check_integrity() //Defaults everything + //If we have NO OWNER and supplied_appearance, just make one up for consistency + supplied_appearance = new // order of bodytype preference: new, current, owner, species - new_bodytype ||= bodytype || owner?.get_bodytype() + var/decl/bodytype/new_bodytype = supplied_appearance?.root_bodytype || bodytype || owner?.get_bodytype() if(ispath(new_bodytype, /decl/bodytype)) new_bodytype = GET_DECL(new_bodytype) if(!new_bodytype) - // this can be fine if dna with species is passed + // this can be fine if appearance data with species is passed log_debug("obj/item/organ/setup(): [src] had null bodytype, with an owner with null bodytype!") bodytype = new_bodytype // used in later setup procs - if((bodytype?.body_flags & BODY_FLAG_NO_DNA) || !given_dna) - // set_bodytype will unset invalid dna anyway, so set_dna(null) is unnecessary - set_species(given_dna?.species || owner?.get_species() || global.using_map.default_species) + if((bodytype?.body_flags & BODY_FLAG_NO_DNA) || !supplied_appearance) + // set_bodytype will unset invalid appearance data anyway, so set_dna(null) is unnecessary + set_species(owner?.get_species() || global.using_map.default_species) else - set_dna(given_dna) + copy_from_mob_snapshot(supplied_appearance) //Called on initialization to add the neccessary reagents @@ -117,15 +116,17 @@ if(reagent_to_add) add_to_reagents(reagent_to_add, reagents.maximum_volume) -/obj/item/organ/proc/set_dna(var/datum/dna/new_dna) +/obj/item/organ/proc/copy_from_mob_snapshot(var/datum/mob_snapshot/supplied_appearance) if(istype(bodytype) && (bodytype.body_flags & BODY_FLAG_NO_DNA)) - QDEL_NULL(dna) + QDEL_NULL(organ_appearance) return - if(new_dna != dna) // Hacky. Is this ever used? Do any organs ever have DNA set before setup_as_organic? - QDEL_NULL(dna) - dna = new_dna.Clone() - blood_DNA = list(dna.unique_enzymes = dna.b_type) - set_species(dna.species) + if(supplied_appearance != organ_appearance) // Hacky. Is this ever used? Do any organs ever have DNA set before setup_as_organic? + QDEL_NULL(organ_appearance) + organ_appearance = supplied_appearance.Clone() + blood_DNA = list(organ_appearance.unique_enzymes = organ_appearance.blood_type) + set_species(organ_appearance.root_species?.name || global.using_map.default_species) + if(organ_appearance.root_bodytype) + set_bodytype(organ_appearance.root_bodytype) /obj/item/organ/proc/set_bodytype(decl/bodytype/new_bodytype, override_material = null, apply_to_internal_organs = TRUE) SHOULD_CALL_PARENT(TRUE) @@ -153,7 +154,7 @@ reagents.clear_reagents() populate_reagents() if(bodytype.body_flags & BODY_FLAG_NO_DNA) - QDEL_NULL(dna) + QDEL_NULL(organ_appearance) reset_status() return TRUE @@ -312,9 +313,9 @@ return if(BP_IS_PROSTHETIC(src)) return - if(dna) + if(organ_appearance) if(!rejecting) - if(owner.is_blood_incompatible(dna.b_type)) + if(owner.is_blood_incompatible(organ_appearance.blood_type)) rejecting = 1 else rejecting++ //Rejection severity increases over time. @@ -328,7 +329,7 @@ germ_level += rand(2,3) if(501 to INFINITY) germ_level += rand(3,5) - var/decl/blood_type/blood_decl = dna?.b_type && get_blood_type_by_name(dna.b_type) + var/decl/blood_type/blood_decl = organ_appearance?.blood_type && get_blood_type_by_name(organ_appearance.blood_type) if(istype(blood_decl)) owner.add_to_reagents(blood_decl.transfusion_fail_reagent, round(rand(2,4) * blood_decl.transfusion_fail_percentage)) else @@ -337,16 +338,17 @@ /obj/item/organ/proc/remove_rejuv() qdel(src) -/obj/item/organ/proc/rejuvenate(var/ignore_organ_aspects) +/obj/item/organ/proc/rejuvenate(var/ignore_organ_traits) SHOULD_CALL_PARENT(TRUE) if(!owner) PRINT_STACK_TRACE("rejuvenate() called on organ of type [type] with no owner.") damage = 0 reset_status() - if(!ignore_organ_aspects && length(owner?.personal_aspects)) - for(var/decl/aspect/aspect as anything in owner.personal_aspects) - if(aspect.applies_to_organ(organ_tag)) - aspect.apply(owner) + if(!ignore_organ_traits) + for(var/trait_type in owner.get_traits()) + var/decl/trait/trait = GET_DECL(trait_type) + if(trait.applies_to_organ(organ_tag) && trait.reapply_on_rejuvenation) + trait.apply_trait(owner) /obj/item/organ/proc/reset_status() vital_to_owner = null // organ modifications might need this to be recalculated @@ -412,10 +414,10 @@ return yum /obj/item/organ/proc/can_feel_pain() - return bodytype && !(bodytype.body_flags & BODY_FLAG_NO_PAIN) + return bodytype && !(bodytype.body_flags & BODY_FLAG_NO_PAIN) && !(status & ORGAN_DEAD) /obj/item/organ/proc/is_usable() - return !(status & (ORGAN_CUT_AWAY|ORGAN_MUTATED|ORGAN_DEAD)) + . = !(status & (ORGAN_CUT_AWAY|ORGAN_MUTATED|ORGAN_DEAD)) /obj/item/organ/proc/can_recover() return (max_damage > 0) && !(status & ORGAN_DEAD) || death_time >= REALTIMEOFDAY - ORGAN_RECOVERY_THRESHOLD @@ -437,7 +439,6 @@ . += tag ? "Necrotic" : "Necrotic" if(BP_IS_BRITTLE(src)) . += tag ? "Brittle" : "Brittle" - switch (germ_level) if (INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + ((INFECTION_LEVEL_TWO - INFECTION_LEVEL_ONE) / 3)) . += "Mild Infection" @@ -555,7 +556,7 @@ var/global/list/ailment_reference_cache = list() // 3. When attaching a detached organ through surgery this is called. // The organ may be inside an external organ that's not inside a mob, or inside a mob //detached : If true, the organ will be installed in a detached state, otherwise it will be added in an attached state -/obj/item/organ/proc/do_install(var/mob/living/carbon/human/target, var/obj/item/organ/external/affected, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE) +/obj/item/organ/proc/do_install(var/mob/living/human/target, var/obj/item/organ/external/affected, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE) //Make sure to force the flag accordingly set_detached(detached) if(QDELETED(src)) diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm index 19e542f35a1..12ab422d198 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/organs/pain.dm @@ -42,16 +42,14 @@ to_chat(src, "[message]") next_pain_time = world.time + max(30 SECONDS - power, 10 SECONDS) -/mob/living/carbon/custom_pain(var/message, var/power, var/force, var/obj/item/organ/external/affecting, var/nohalloss) - . = ..() - if(.) - var/force_emote = species.get_pain_emote(src, power) - if(force_emote && prob(power)) - var/decl/emote/use_emote = GET_DECL(force_emote) - if(!(use_emote.message_type == AUDIBLE_MESSAGE &&HAS_STATUS(src, STAT_SILENCE))) - emote(force_emote) + var/decl/species/my_species = get_species() + var/force_emote = my_species?.get_pain_emote(src, power) + if(force_emote && prob(power)) + var/decl/emote/use_emote = GET_DECL(force_emote) + if(!(use_emote.message_type == AUDIBLE_MESSAGE &&HAS_STATUS(src, STAT_SILENCE))) + emote(force_emote) -/mob/living/carbon/human/proc/handle_pain() +/mob/living/human/proc/handle_pain() if(stat) return if(!can_feel_pain()) diff --git a/code/modules/organs/prosthetics/_prosthetics.dm b/code/modules/organs/prosthetics/_prosthetics.dm index b92181ed703..603f76dfae9 100644 --- a/code/modules/organs/prosthetics/_prosthetics.dm +++ b/code/modules/organs/prosthetics/_prosthetics.dm @@ -13,7 +13,7 @@ // Checks if a limb could theoretically be removed. // Note that this does not currently bother checking if a child or internal organ is vital. -/obj/item/organ/external/proc/can_remove_modular_limb(var/mob/living/carbon/human/user) +/obj/item/organ/external/proc/can_remove_modular_limb(var/mob/living/human/user) if((owner?.species && is_vital_to_owner()) || !(limb_flags & ORGAN_FLAG_CAN_AMPUTATE)) return FALSE var/bodypart_cat = get_modular_limb_category() @@ -26,12 +26,12 @@ . = (bodypart_cat != MODULAR_BODYPART_INVALID) // Note that this proc is checking if the organ can be attached -to-, not attached itself. -/obj/item/organ/external/proc/can_attach_modular_limb_here(var/mob/living/carbon/human/user) +/obj/item/organ/external/proc/can_attach_modular_limb_here(var/mob/living/human/user) var/list/limb_data = user?.get_bodytype()?.has_limbs[organ_tag] if(islist(limb_data) && limb_data["has_children"] > 0) . = (LAZYLEN(children) < limb_data["has_children"]) -/obj/item/organ/external/proc/can_be_attached_modular_limb(var/mob/living/carbon/user) +/obj/item/organ/external/proc/can_be_attached_modular_limb(var/mob/living/user) var/bodypart_cat = get_modular_limb_category() if(bodypart_cat == MODULAR_BODYPART_INVALID) return FALSE @@ -47,13 +47,13 @@ return TRUE // Checks if an organ (or the parent of one) is in a fit state for modular limb stuff to happen. -/obj/item/organ/external/proc/check_modular_limb_damage(var/mob/living/carbon/human/user) +/obj/item/organ/external/proc/check_modular_limb_damage(var/mob/living/human/user) . = damage >= min_broken_damage || (status & ORGAN_BROKEN) // can't use is_broken() as the limb has ORGAN_CUT_AWAY // Human mob procs: // Checks the organ list for limbs meeting a predicate. Way overengineered for such a limited use // case but I can see it being expanded in the future if meat limbs or doona limbs use it. -/mob/living/carbon/human/proc/get_modular_limbs(var/return_first_found = FALSE, var/validate_proc) +/mob/living/human/proc/get_modular_limbs(var/return_first_found = FALSE, var/validate_proc) for(var/obj/item/organ/external/limb as anything in get_external_organs()) if(!validate_proc || call(limb, validate_proc)(src) > MODULAR_BODYPART_INVALID) LAZYADD(., limb) @@ -67,7 +67,7 @@ . -= limb.children // Called in bodytype.apply_bodytype_organ_modifications(), replaced() and removed() to update our modular limb verbs. -/mob/living/carbon/human/proc/refresh_modular_limb_verbs() +/mob/living/human/proc/refresh_modular_limb_verbs() if(length(get_modular_limbs(return_first_found = TRUE, validate_proc = /obj/item/organ/external/proc/can_attach_modular_limb_here))) verbs |= .proc/attach_limb_verb else @@ -78,7 +78,7 @@ verbs -= .proc/detach_limb_verb // Proc helper for attachment verb. -/mob/living/carbon/human/proc/check_can_attach_modular_limb(var/obj/item/organ/external/E) +/mob/living/human/proc/check_can_attach_modular_limb(var/obj/item/organ/external/E) if(is_on_special_ability_cooldown() || get_active_held_item() != E) return FALSE if(incapacitated() || restrained()) @@ -109,7 +109,7 @@ return TRUE // Proc helper for detachment verb. -/mob/living/carbon/human/proc/check_can_detach_modular_limb(var/obj/item/organ/external/E) +/mob/living/human/proc/check_can_detach_modular_limb(var/obj/item/organ/external/E) if(is_on_special_ability_cooldown()) return FALSE if(incapacitated() || restrained()) @@ -130,7 +130,7 @@ // Verbs below: // Add or remove robotic limbs; check refresh_modular_limb_verbs() above. -/mob/living/carbon/human/proc/attach_limb_verb() +/mob/living/human/proc/attach_limb_verb() set name = "Attach Limb" set category = "Object" set desc = "Attach a replacement limb." @@ -160,7 +160,7 @@ try_refresh_visible_overlays() // Not sure why this isn't called by removed(), but without it we don't update our limb appearance. return TRUE -/mob/living/carbon/human/proc/detach_limb_verb() +/mob/living/human/proc/detach_limb_verb() set name = "Remove Limb" set category = "Object" set desc = "Detach one of your limbs." diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm index 4e468591ced..01f7aa03d05 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm +++ b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm @@ -9,7 +9,7 @@ material = /decl/material/solid/metal/steel eye_flash_mod = 1 eye_darksight_range = 2 - associated_gender = PLURAL + associated_gender = null emote_sounds = list( "whistle" = list('sound/voice/emotes/longwhistle_robot.ogg'), "qwhistle" = list('sound/voice/emotes/shortwhistle_robot.ogg'), @@ -56,7 +56,7 @@ var/decl/species/species = get_species_by_key(species_name) for(var/decl/bodytype/bodytype_data in species.available_bodytypes) if(bodytype_data.bodytype_category == bodytype_category) - return species_name + return species return ..() /decl/bodytype/prosthetic/apply_bodytype_organ_modifications(obj/item/organ/org) diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm b/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm index 5baa68397ea..56dc4625b85 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm +++ b/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm @@ -16,4 +16,4 @@ bodytype_category = BODYTYPE_HUMANOID material = /decl/material/solid/organic/wood -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/wooden, pirate, 0) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/wooden, pirate, 0) diff --git a/code/modules/overmap/ftl_shunt/core.dm b/code/modules/overmap/ftl_shunt/core.dm index c9ae2ac1b46..eea9868992d 100644 --- a/code/modules/overmap/ftl_shunt/core.dm +++ b/code/modules/overmap/ftl_shunt/core.dm @@ -154,7 +154,7 @@ /obj/machinery/ftl_shunt/core/physical_attack_hand(var/mob/user) if(sabotaged) - var/mob/living/carbon/human/h_user = user + var/mob/living/human/h_user = user if(!istype(h_user)) return TRUE var/skill_delay = user.skill_delay_mult(SKILL_ENGINES, 0.3) @@ -222,7 +222,7 @@ return FTL_START_FAILURE_FUEL if(sabotaged) - for(var/mob/living/carbon/human/H in global.living_mob_list_) //Give engineers a hint that something might be very, very wrong. + for(var/mob/living/human/H in global.living_mob_list_) //Give engineers a hint that something might be very, very wrong. if(!(H.z in ftl_computer.linked.map_z)) continue if(H.skill_check(SKILL_ENGINES, SKILL_EXPERT)) @@ -284,7 +284,7 @@ addtimer(CALLBACK(src, PROC_REF(do_shunt), shunt_x, shunt_y, jumpdist, destination), 6 SECONDS) jumping = TRUE update_icon() - for(var/mob/living/carbon/M in global.living_mob_list_) + for(var/mob/living/M in global.living_mob_list_) if(!(M.z in ftl_computer.linked.map_z)) continue sound_to(M, 'sound/machines/hyperspace_begin.ogg') @@ -311,7 +311,7 @@ else shunt_sev = SHUNT_SEVERITY_CRITICAL - for(var/mob/living/carbon/human/H in global.living_mob_list_) //Affect mobs, skip synthetics. + for(var/mob/living/human/H in global.living_mob_list_) //Affect mobs, skip synthetics. sound_to(H, 'sound/machines/hyperspace_end.ogg') if(!(H.z in ftl_computer.linked.map_z)) @@ -373,7 +373,7 @@ if(prob(50)) A.overload_lighting(50) -/obj/machinery/ftl_shunt/core/proc/handle_spacefloat(var/mob/living/carbon/human/H) +/obj/machinery/ftl_shunt/core/proc/handle_spacefloat(var/mob/living/human/H) if(!H.check_space_footing()) //Flip a coin ... to_chat(H, SPAN_WARNING("Being untethered from a ship entering FTL is a bad idea, but you roll the dice...")) @@ -391,7 +391,7 @@ switch(sabotaged) if(SHUNT_SABOTAGE_MINOR) announcetxt = shunt_sabotage_text_minor - for(var/mob/living/carbon/human/H in view(7)) + for(var/mob/living/human/H in view(7)) H.show_message(SPAN_DANGER("\The [src] emits a flash of incredibly bright, searing light!"), VISIBLE_MESSAGE) H.flash_eyes(FLASH_PROTECTION_NONE) empulse(src, 8, 10) @@ -416,7 +416,7 @@ continue A.energy_fail(rand(100,120)) - for(var/mob/living/carbon/human/H in view(7)) //scary text if you're in view, because you're fucked now boy. + for(var/mob/living/human/H in view(7)) //scary text if you're in view, because you're fucked now boy. H.show_message(SPAN_DANGER("The light around \the [src] warps before it emits a flash of incredibly bright, searing light!"), VISIBLE_MESSAGE) H.flash_eyes(FLASH_PROTECTION_NONE) diff --git a/code/modules/overmap/ships/computers/ship.dm b/code/modules/overmap/ships/computers/ship.dm index 396a4fe2172..f6ccc699ebd 100644 --- a/code/modules/overmap/ships/computers/ship.dm +++ b/code/modules/overmap/ships/computers/ship.dm @@ -33,7 +33,7 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov /obj/machinery/computer/ship/proc/display_reconnect_dialog(var/mob/user, var/flavor) var/datum/browser/written_digital/popup = new (user, "[src]", "[src]") - popup.set_content("
    Error
    Unable to connect to [flavor].
    Reconnect
    ") + popup.set_content("
    Error
    Unable to connect to [flavor].
    Reconnect
    ") popup.open() /obj/machinery/computer/ship/interface_interact(var/mob/user) diff --git a/code/modules/overmap/spacetravel.dm b/code/modules/overmap/spacetravel.dm index 2aaef59f4f4..24747a3d46f 100644 --- a/code/modules/overmap/spacetravel.dm +++ b/code/modules/overmap/spacetravel.dm @@ -43,5 +43,5 @@ /mob/overmap_can_discard() return isnull(client) -/mob/living/carbon/human/overmap_can_discard() +/mob/living/human/overmap_can_discard() return isnull(client) && (!last_ckey || stat == DEAD) diff --git a/code/modules/paperwork/adminpaper.dm b/code/modules/paperwork/adminpaper.dm index a6a1cf86f12..11891f5d55a 100644 --- a/code/modules/paperwork/adminpaper.dm +++ b/code/modules/paperwork/adminpaper.dm @@ -30,14 +30,14 @@ //Snapshot is crazy and likes putting each topic hyperlink on a seperate line from any other tags so it's nice and clean. interactions += "
    The fax will transmit everything above this line
    " - interactions += "Send fax " - interactions += "Pen mode: [isCrayon ? "Crayon" : "Pen"] " - interactions += "Cancel fax " + interactions += "Send fax " + interactions += "Pen mode: [isCrayon ? "Crayon" : "Pen"] " + interactions += "Cancel fax " interactions += "
    " - interactions += "Change logo " - interactions += "Toggle Header " - interactions += "Toggle Footer " - interactions += "Clear page " + interactions += "Change logo " + interactions += "Toggle Header " + interactions += "Toggle Footer " + interactions += "Clear page " interactions += "
    " /obj/item/paper/admin/proc/generateHeader() diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 8226110bb9a..5aad53384cb 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -98,19 +98,19 @@ /obj/item/clipboard/interact(mob/user) var/dat = "Clipboard" if(stored_pen) - dat += "Remove Pen

    " + dat += "Remove Pen

    " else - dat += "Add Pen

    " + dat += "Add Pen

    " dat += "
    [jointext(words, null)]
    " for(var/i = 1 to LAZYLEN(papers)) var/obj/item/P = papers[i] - dat += "" + dat += "" if(i == 1) - dat += "" + dat += "" else dat += "" + dat += "" dat += "
    [P.name]
    [P.name]WriteWrite" - dat += "RemoveRename
    RemoveRename
    " user.set_machine(src) diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 331c94acae6..85f24feac70 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -679,8 +679,8 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to reply_type = "UNKNOWN" var/msg = "[faxname]: [get_options_bar(sender, 2,1,1)]" - msg += "(TAKE) (REPLY): " - msg += "Receiving '[rcvdcopy.name]' via secure connection ... view message" + msg += "(TAKE) (REPLY)
    : " + msg += "Receiving '[rcvdcopy.name]' via secure connection ... view message" if (istype(doc, /obj/item/paper)) var/obj/item/paper/paper = doc diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 4e728b71bd9..c63df5d0d77 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -42,7 +42,7 @@ user.set_machine(src) var/dat = "
    " for(var/obj/item/P in src) - dat += "" + dat += "" dat += "
    [P.name]
    [P.name]
    " show_browser(user, "[name][dat]", "window=filingcabinet;size=350x300") diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 392d25940da..38ea557a765 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -59,7 +59,7 @@ /obj/item/folder/interact(mob/user) var/dat = "[name]" for(var/obj/item/I in src) - dat += "Remove Rename - [I.name]
    " + dat += "Remove Rename - [I.name]
    " user.set_machine(src) show_browser(user, dat, "window=[initial(name)]") diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 0f0f20ec49c..0d32e6b7005 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -224,8 +224,8 @@ info_links = info var/i = 0 for(i=1,i<=fields,i++) - addtofield(i, "write", 1) - info_links = info_links + "write" + addtofield(i, "write", 1) + info_links = info_links + "write" /obj/item/paper/proc/clearpaper() info = null @@ -495,7 +495,7 @@ to_chat(usr, SPAN_WARNING("You can't do that in your current state!")) return - if((MUTATION_CLUMSY in usr.mutations) && prob(50)) + if(usr.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(usr, SPAN_WARNING("You cut yourself on the paper.")) return var/n_name = sanitize_safe(input(usr, "What would you like to name the paper?", "Paper Naming", name) as text, MAX_NAME_LEN) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index fe1df67457b..11e8c049dd4 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -195,54 +195,54 @@ /obj/item/paper_bundle/interact(mob/user) var/dat - var/obj/item/W = LAZYACCESS(pages, cur_page) + var/obj/item/cur_page_item = LAZYACCESS(pages, cur_page) //Header dat = "" dat += "" dat += "" - dat += "" + dat += "" dat += "" dat += "" dat += "
    " if(cur_page > 1) - dat += "First" + dat += "First" else dat += "First" dat += "" if(cur_page > 1) - dat += "Previous" + dat += "Previous" else dat += "Previous" dat += "[cur_page]/[length(pages)] Remove[cur_page]/[length(pages)] Remove" if(cur_page < pages.len) - dat += "Next" + dat += "Next" else dat += "Next" dat += "" if(cur_page < pages.len) - dat += "Last" + dat += "Last" else dat += "Last" dat += "

    " //Contents - if(istype(W, /obj/item/paper)) - var/obj/item/paper/P = W - dat += "[P.name][P.info][P.stamp_text]" + if(istype(cur_page_item, /obj/item/paper)) + var/obj/item/paper/cur_paper = cur_page_item + dat += "[cur_paper.name][cur_paper.info][cur_paper.stamp_text]" show_browser(user, dat, "window=[name]") onclose(user, name) - else if(istype(W, /obj/item/photo)) - var/obj/item/photo/P = W + else if(istype(cur_page_item, /obj/item/photo)) + var/obj/item/photo/cur_photo = cur_page_item dat += {" - [P.name] -
    Written on the back:
    [P.scribble]" : null ] + [cur_photo.name] +
    Written on the back:
    [cur_photo.scribble]" : null ] "} - send_rsc(user, P.img, "tmp_photo.png") + send_rsc(user, cur_photo.img, "tmp_photo.png") show_browser(user, dat, "window=[name]") onclose(user, name) user.set_machine(src) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index f8e49419e25..f416d7fda01 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -132,7 +132,8 @@ var/photo_html = {" [name] - + // todo: remove -ms-interpolation-mode once 516 is required + [scribble ? "
    Written on the back:
    [scribble]" : ""] "} @@ -291,7 +292,7 @@ /obj/item/camera/proc/get_mobs(turf/the_turf) var/mob_detail - for(var/mob/living/carbon/A in the_turf) + for(var/mob/living/A in the_turf) if(A.invisibility) continue var/holding diff --git a/code/modules/persistence/noticeboards.dm b/code/modules/persistence/noticeboards.dm index c0e2095187c..fcc44e0f473 100644 --- a/code/modules/persistence/noticeboards.dm +++ b/code/modules/persistence/noticeboards.dm @@ -96,10 +96,10 @@ for(var/thing in notices) LAZYADD(dat, "[thing]") if(istype(thing, /obj/item/paper)) - LAZYADD(dat, "ReadWrite") + LAZYADD(dat, "ReadWrite") else if(istype(thing, /obj/item/photo)) - LAZYADD(dat, "Look") - LAZYADD(dat, "Remove") + LAZYADD(dat, "Look") + LAZYADD(dat, "Remove") var/datum/browser/popup = new(user, "noticeboard-\ref[src]", "Noticeboard") popup.set_content(jointext(dat, null)) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ba7d20c7b7a..a7756f7e6d0 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -487,7 +487,7 @@ var/global/list/all_apcs = list() /obj/machinery/power/apc/physical_attack_hand(mob/user) //Human mob special interaction goes here. if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species.can_shred(H)) user.visible_message("\The [user] slashes at \the [src]!", "You slash at \the [src]!") diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index c744458397a..434a96e50c1 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -537,7 +537,7 @@ By design, d1 is the smallest direction and d2 is the highest //you can use wires to heal robotics /obj/item/stack/cable_coil/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(ishuman(target) && user.a_intent == I_HELP) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/S = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(!S || !BP_IS_PROSTHETIC(S) || user.a_intent != I_HELP) return ..() diff --git a/code/modules/power/fusion/fusion_reactions.dm b/code/modules/power/fusion/fusion_reactions.dm index 66d44183612..73cffcc1529 100644 --- a/code/modules/power/fusion/fusion_reactions.dm +++ b/code/modules/power/fusion/fusion_reactions.dm @@ -115,7 +115,7 @@ // Copied from the SM for proof of concept. //Not any more --Cirra //Use the whole z proc --Leshana SSradiation.z_radiate(locate(1, 1, holder.z), radiation_level, 1) - for(var/mob/living/carbon/human/H in global.living_mob_list_) + for(var/mob/living/human/H in global.living_mob_list_) var/turf/T = get_turf(H) if(T && (holder.z == T.z)) H.set_hallucination(rand(100,150), 51) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index cdc4a702cdb..14b082723f1 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -317,7 +317,7 @@ return TRUE if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species.can_shred(H)) visible_message("[user.name] smashed the light!", 3, "You hear a tinkle of breaking glass.") broken() @@ -327,13 +327,13 @@ if(on) var/prot = FALSE - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(istype(H)) var/obj/item/clothing/gloves/G = H.get_equipped_item(slot_gloves_str) if(istype(G) && G.max_heat_protection_temperature > LIGHT_BULB_TEMPERATURE) prot = TRUE - if(prot > 0 || (MUTATION_COLD_RESISTANCE in user.mutations)) + if(prot > 0 || user.has_genetic_condition(GENE_COND_COLD_RESISTANCE)) to_chat(user, "You remove the [get_fitting_name()].") else if(istype(user) && user.is_telekinetic()) to_chat(user, "You telekinetically remove the [get_fitting_name()].") @@ -355,12 +355,6 @@ user.put_in_active_hand(remove_bulb()) //puts it in our active hand return TRUE -// ghost attack - make lights flicker like an AI, but even spookier! -/obj/machinery/light/attack_ghost(mob/user) - if(round_is_spooky()) - src.flicker(rand(2,5)) - else return ..() - // break the light and make sparks if was on /obj/machinery/light/proc/broken(var/skip_sound_and_sparks = 0) if(!lightbulb) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 1f0d9e4c72d..1d776af3f8a 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -481,18 +481,19 @@ if(power_output > max_safe_output) icon_state = "potatodanger" -/obj/machinery/port_gen/pacman/super/potato/attackby(var/obj/item/O, var/mob/user) - if(istype(O, /obj/item/chems/)) - var/obj/item/chems/R = O - if(R.standard_pour_into(src,user)) - if(reagents.has_reagent(/decl/material/liquid/ethanol/vodka)) - audible_message("[src] blips happily") - playsound(get_turf(src),'sound/machines/synth_yes.ogg', 50, 0) - else - audible_message("[src] blips in disappointment") - playsound(get_turf(src), 'sound/machines/synth_no.ogg', 50, 0) - return - ..() +/obj/machinery/port_gen/pacman/super/potato/attackby(var/obj/item/hit_with, var/mob/user) + if(istype(hit_with, /obj/item/chems)) + var/obj/item/chems/chem_container = hit_with + var/old_vodka_amount = REAGENT_VOLUME(reagents, /decl/material/liquid/ethanol/vodka) + if(chem_container.standard_pour_into(src,user)) + if(REAGENT_VOLUME(reagents, /decl/material/liquid/ethanol/vodka) > old_vodka_amount) // yay, booze! + audible_message(SPAN_NOTICE("[src] blips happily!")) + playsound(get_turf(src),'sound/machines/synth_yes.ogg', 50, FALSE) + else // you didn't add any more than we already had + audible_message(SPAN_WARNING("[src] blips in disappointment.")) + playsound(get_turf(src), 'sound/machines/synth_no.ogg', 50, FALSE) + return TRUE + return ..() /obj/machinery/port_gen/pacman/mrs name = "portable fusion generator" diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 7dfb8afc036..ca4b205e6b0 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -183,7 +183,7 @@ //power_source is a source of electricity, can be powercell, area, apc, cable, powernet or null //source is an object caused electrocuting (airlock, grille, etc) //No animations will be performed by this proc. -/proc/electrocute_mob(mob/living/carbon/M, var/power_source, var/obj/source, var/siemens_coeff = 1.0) +/proc/electrocute_mob(mob/living/M, var/power_source, var/obj/source, var/siemens_coeff = 1.0) var/area/source_area if(istype(power_source,/area)) source_area = power_source @@ -215,7 +215,7 @@ if(PN) PN.trigger_warning(5) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.species.get_shock_vulnerability(H) <= 0) return var/obj/item/clothing/gloves/G = H.get_equipped_item(slot_gloves_str) diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index ef3868e9d5d..4f3f45ee931 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -115,7 +115,7 @@ if(strength > strength_upper_limit) strength = strength_upper_limit else - message_admins("PA Control Computer increased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) + message_admins("PA Control Computer increased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) log_game("PA Control Computer increased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])") investigate_log("increased to [strength] by [usr.key]","singulo") strength_change() @@ -126,7 +126,7 @@ if(strength < 0) strength = 0 else - message_admins("PA Control Computer decreased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) + message_admins("PA Control Computer decreased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) log_game("PA Control Computer decreased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])") investigate_log("decreased to [strength] by [usr.key]","singulo") strength_change() @@ -205,7 +205,7 @@ /obj/machinery/particle_accelerator/control_box/toggle_power() src.active = !src.active investigate_log("turned [active?"ON":"OFF"] by [usr ? usr.key : "outside forces"]","singulo") - message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) + message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr.ckey]([usr]) in ([x],[y],[z])") if(src.active) update_use_power(POWER_USE_ACTIVE) @@ -232,11 +232,11 @@ var/dat = "" dat += "Particle Accelerator Control Panel
    " - dat += "Close

    " + dat += "Close

    " dat += "Status:
    " if(!assembled) dat += "Unable to detect all parts!
    " - dat += "Run Scan

    " + dat += "Run Scan

    " else dat += "All parts in place.

    " dat += "Power:" @@ -244,9 +244,9 @@ dat += "On
    " else dat += "Off
    " - dat += "Toggle Power

    " + dat += "Toggle Power

    " dat += "Particle Strength: [src.strength] " - dat += "--|++

    " + dat += "--|++

    " show_browser(user, dat, "window=pacontrol;size=420x500") onclose(user, "pacontrol") diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 004052a0ffb..6482521407e 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -41,7 +41,7 @@ var/global/list/singularities = list() var/found_containment = locate(/obj/effect/containment_field) in orange(30, src) if(!found_containment) last_warning = world.time - message_admins("A singulo has been created without containment fields active ([x], [y], [z] - JMP).") + message_admins("A singulo has been created without containment fields active ([x], [y], [z] - JMP).") investigate_log("was created. [found_containment ? "" : "No containment fields were active."]", investigation_label) current_stage = GET_DECL(/decl/singularity_stage/stage_one) energy = starting_energy diff --git a/code/modules/power/singularity/singularity_events.dm b/code/modules/power/singularity/singularity_events.dm index 9ecdc2ae467..e48a040231b 100644 --- a/code/modules/power/singularity/singularity_events.dm +++ b/code/modules/power/singularity/singularity_events.dm @@ -26,14 +26,14 @@ M.apply_damage(toxdamage, TOX, null, damage_flags = DAM_DISPERSED) /decl/singularity_event/mesmerize/handle_event(obj/effect/singularity/source) - for(var/mob/living/carbon/M in oviewers(8, source)) + for(var/mob/living/M in oviewers(8, source)) if(isbrain(M)) //Ignore brains continue if(M.status_flags & GODMODE) continue if(M.stat == CONSCIOUS) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H.get_equipped_item(slot_glasses_str), /obj/item/clothing/glasses/meson)) if(source.current_stage.stage_size != STAGE_SUPER) to_chat(H, SPAN_WARNING("You look directly into \the [source]. Good thing you had your protective eyewear on!")) diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index b8ced099d91..e685cc0e8dc 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -143,7 +143,7 @@ if (!intensity) return - var/mob/living/carbon/human/h_user = null + var/mob/living/human/h_user = null if (!ishuman(user)) return else @@ -155,7 +155,7 @@ var/obj/item/clothing/gloves/G = h_user.get_equipped_item(slot_gloves_str) if(istype(G) && G.siemens_coefficient == 0) user_protected = 1 - log_and_message_admins("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100 - JMP") + log_and_message_admins("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100 - JMP") switch (intensity) if (0 to 15) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index d6b41eab2be..c19ac1912e9 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -396,21 +396,21 @@ var/global/list/solars_list = list() t += "Tracking:
    " switch(track) if(0) - t += "Off Timed Auto
    " + t += "Off Timed Auto
    " if(1) - t += "Off Timed Auto
    " + t += "Off Timed Auto
    " if(2) - t += "Off Timed Auto
    " + t += "Off Timed Auto
    " t += "Tracking Rate: [rate_control(src,"tdir","[trackrate] deg/h ([trackrate<0 ? "CCW" : "CW"])",1,30,180)]

    " t += "Connected devices:
    " - t += "Search for devices
    " + t += "Search for devices
    " t += "Solar panels : [connected_panels.len] connected
    " t += "Solar tracker : [connected_tracker ? "Found" : "Not found"]

    " - t += "Close" + t += "Close" var/datum/browser/written_digital/popup = new(user, "solar", name) popup.set_content(t) @@ -515,7 +515,7 @@ var/global/list/solars_list = list() info = "

    Welcome

    At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuels! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array.

    You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!

    Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker.

    Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.

    That's all to it, be safe, be green!

    " /proc/rate_control(var/S, var/V, var/C, var/Min=1, var/Max=5, var/Limit=null) //How not to name vars - var/href = "-"+rate+"[href]=[Limit]'>+" return rate diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 6be4303ca1b..8fb0064ca70 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -168,9 +168,9 @@ t += "Turbine: [round(compressor.rpm)] RPM
    " - t += "Starter: [ compressor.starter ? "Off On" : "Off On"]" + t += "Starter: [ compressor.starter ? "Off On" : "Off On"]" - t += "
    Close" + t += "
    Close" t += "
    " show_browser(user, t, "window=turbine") @@ -225,14 +225,14 @@ var/dat if(src.compressor) dat += {"
    Gas turbine remote control system
    - \nTurbine status: [ src.compressor.starter ? "Off On" : "Off On"] + \nTurbine status: [ src.compressor.starter ? "Off On" : "Off On"] \n
    \nTurbine speed: [src.compressor.rpm]rpm
    \nPower currently being generated: [src.compressor.turbine.lastgen]W
    \nInternal gas temperature: [src.compressor.gas_contained.temperature]K
    - \nVent doors: [ src.door_status ? "Closed Open" : "Closed Open"] - \n
    View - \n
    Close + \nVent doors: [ src.door_status ? "Closed Open" : "Closed Open"] + \n
    View + \n
    Close \n
    \n"} else diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 71deaf78791..00a2cc7b86f 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -72,7 +72,7 @@ var/obj/item/gun/G = get_recursive_loc_of_type(/obj/item/gun) if(G) put_residue_on(G) - var/mob/living/carbon/human/H = G.get_recursive_loc_of_type(/mob/living/carbon/human) + var/mob/living/human/H = G.get_recursive_loc_of_type(/mob/living/human) if(H) var/holding_slot = H.get_held_slot_for_item(G) if(holding_slot) @@ -155,9 +155,25 @@ var/list/icon_keys = list() //keys var/list/ammo_states = list() //values + /// Determines whether or not we wait until the first time our contents are gotten to initialize contents. May lead to icon bugs if not handled delicately. + var/lazyload_contents = TRUE + /// Whether or not our contents have been initialized or not, used in lazyloaded contents. + var/contents_initialized = FALSE + /obj/item/ammo_magazine/box w_class = ITEM_SIZE_NORMAL +/obj/item/ammo_magazine/proc/create_initial_contents() + if(contents_initialized || !initial_ammo || !ammo_type) + return + for(var/i in 1 to initial_ammo) + stored_ammo += new ammo_type(src) + +/obj/item/ammo_magazine/proc/get_stored_ammo_count() + . = length(stored_ammo) + if(!contents_initialized) + . += initial_ammo + /obj/item/ammo_magazine/Initialize() . = ..() if(multiple_sprites) @@ -166,9 +182,8 @@ if(isnull(initial_ammo)) initial_ammo = max_ammo - if(initial_ammo) - for(var/i in 1 to initial_ammo) - stored_ammo += new ammo_type(src) + if(!lazyload_contents) + create_initial_contents() if(caliber) LAZYINSERT(labels, caliber, 1) if(LAZYLEN(labels)) @@ -181,7 +196,7 @@ if(C.caliber != caliber) to_chat(user, "[C] does not fit into [src].") return - if(stored_ammo.len >= max_ammo) + if(get_stored_ammo_count() >= max_ammo) to_chat(user, "[src] is full!") return if(!user.try_unequip(C, src)) @@ -192,6 +207,7 @@ else ..() /obj/item/ammo_magazine/attack_self(mob/user) + create_initial_contents() if(!stored_ammo.len) to_chat(user, "[src] is already empty!") return @@ -206,6 +222,7 @@ /obj/item/ammo_magazine/attack_hand(mob/user) if(!user.is_holding_offhand(src) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() + create_initial_contents() if(!stored_ammo.len) to_chat(user, SPAN_NOTICE("\The [src] is already empty!")) return TRUE @@ -222,18 +239,20 @@ /obj/item/ammo_magazine/on_update_icon() . = ..() if(multiple_sprites) - //find the lowest key greater than or equal to stored_ammo.len + //find the lowest key greater than or equal to our ammo count var/new_state = null + var/self_ammo_count = get_stored_ammo_count() for(var/idx in 1 to icon_keys.len) - var/ammo_count = icon_keys[idx] - if (ammo_count >= stored_ammo.len) + var/icon_ammo_count = icon_keys[idx] + if (icon_ammo_count >= self_ammo_count) new_state = ammo_states[idx] break icon_state = (new_state)? new_state : initial(icon_state) /obj/item/ammo_magazine/examine(mob/user) . = ..() - to_chat(user, "There [(stored_ammo.len == 1)? "is" : "are"] [stored_ammo.len] round\s left!") + var/self_ammo_count = get_stored_ammo_count() + to_chat(user, "There [(self_ammo_count == 1)? "is" : "are"] [self_ammo_count] round\s left!") //magazine icon state caching var/global/list/magazine_icondata_keys = list() diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 1d1bf7a0cb0..43f6f7fb6c1 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -66,6 +66,7 @@ /obj/item/ammo_magazine/shotholder/attack_hand(mob/user) if(loc != user || user.a_intent != I_HURT || !length(stored_ammo) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() + create_initial_contents() var/obj/item/ammo_casing/C = stored_ammo[stored_ammo.len] stored_ammo -= C user.put_in_hands(C) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 14f8eacef89..6f18ee8cdcc 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -198,7 +198,8 @@ if(prob(30)) toggle_safety() return 1 - if((MUTATION_CLUMSY in M.mutations) && prob(40)) //Clumsy handling + + if(M.has_genetic_condition(GENE_COND_CLUMSY) && prob(40)) //Clumsy handling var/obj/P = consume_next_projectile() if(P) var/pew_loc = pick(BP_L_FOOT, BP_R_FOOT) @@ -399,7 +400,7 @@ shake_camera(user, max(burst_delay*burst, fire_delay), screen_shake) if(ishuman(user) && user.is_cloaked()) //shooting will disable a rig cloaking device - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/obj/item/rig/rig = H.get_rig() if(rig) for(var/obj/item/rig_module/stealth_field/S in rig.installed_modules) @@ -510,7 +511,7 @@ //shooting while in shock var/shock_dispersion = 0 if(ishuman(firer)) - var/mob/living/carbon/human/mob = firer + var/mob/living/human/mob = firer if(mob.shock_stage > 120) shock_dispersion = rand(-4,4) else if(mob.shock_stage > 70) @@ -541,7 +542,7 @@ /obj/item/gun/proc/handle_suicide(mob/living/user) if(!ishuman(user)) return - var/mob/living/carbon/human/M = user + var/mob/living/human/M = user mouthshoot = 1 admin_attacker_log(user, "is attempting to suicide with \a [src]") diff --git a/code/modules/projectiles/guns/energy/ebow.dm b/code/modules/projectiles/guns/energy/ebow.dm index 5a1bcde899a..a18470f2c40 100644 --- a/code/modules/projectiles/guns/energy/ebow.dm +++ b/code/modules/projectiles/guns/energy/ebow.dm @@ -16,15 +16,6 @@ charge_meter = 0 combustion = 0 -/obj/item/gun/energy/crossbow/ninja - name = "energy dart thrower" - projectile_type = /obj/item/projectile/energy/dart - max_shots = 5 - -/obj/item/gun/energy/crossbow/ninja/mounted - use_external_power = 1 - has_safety = FALSE - /obj/item/gun/energy/crossbow/largecrossbow name = "energy crossbow" desc = "A weapon favored by mercenary infiltration teams." diff --git a/code/modules/projectiles/guns/energy/lasertag.dm b/code/modules/projectiles/guns/energy/lasertag.dm index e9857630b0b..fd6af12baa0 100644 --- a/code/modules/projectiles/guns/energy/lasertag.dm +++ b/code/modules/projectiles/guns/energy/lasertag.dm @@ -10,7 +10,7 @@ projectile_type = /obj/item/projectile/beam/lastertag/blue var/required_vest -/obj/item/gun/energy/lasertag/special_check(var/mob/living/carbon/human/M) +/obj/item/gun/energy/lasertag/special_check(var/mob/living/human/M) if(ishuman(M) && !istype(M.get_equipped_item(slot_wear_suit_str), required_vest)) to_chat(M, SPAN_WARNING("You need to be wearing your laser tag vest!")) return FALSE diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm index 15cd979e5fd..933c6d2fff6 100644 --- a/code/modules/projectiles/guns/energy/temperature.dm +++ b/code/modules/projectiles/guns/energy/temperature.dm @@ -42,7 +42,7 @@ var/dat = {"Freeze Gun Configuration:
    Current output temperature: [temp_text]
    - Target output temperature: - - - [current_temperature] + + +
    + Target output temperature: - - - [current_temperature] + + +
    "} show_browser(user, dat, "window=freezegun;size=450x300;can_resize=1;can_close=1;can_minimize=1") diff --git a/code/modules/projectiles/guns/launcher/bows/arrow.dm b/code/modules/projectiles/guns/launcher/bows/arrow.dm index b7f2339da5c..b570bed7657 100644 --- a/code/modules/projectiles/guns/launcher/bows/arrow.dm +++ b/code/modules/projectiles/guns/launcher/bows/arrow.dm @@ -44,6 +44,9 @@ desc = "A long, sharp stick, fletched at one end." var/decl/material/fletching_material +/obj/item/stack/material/bow_ammo/arrow/fifteen + amount = 15 + /obj/item/stack/material/bow_ammo/arrow/Initialize() if(ispath(fletching_material)) fletching_material = GET_DECL(fletching_material) diff --git a/code/modules/projectiles/guns/launcher/bows/bow_drawing.dm b/code/modules/projectiles/guns/launcher/bows/bow_drawing.dm index 6f9947b99f3..c9d3ad10947 100644 --- a/code/modules/projectiles/guns/launcher/bows/bow_drawing.dm +++ b/code/modules/projectiles/guns/launcher/bows/bow_drawing.dm @@ -5,7 +5,7 @@ return draw_time /obj/item/gun/launcher/bow/proc/check_can_draw(mob/user) - return istype(user) && !QDELETED(user) && !QDELETED(src) && (!require_loaded_to_draw || get_loaded_arrow(user)) + return istype(user) && !QDELETED(user) && !QDELETED(src) && istype(string) && !QDELETED(string) && (!require_loaded_to_draw || get_loaded_arrow(user)) /obj/item/gun/launcher/bow/proc/start_drawing(var/mob/user) diff --git a/code/modules/projectiles/guns/launcher/bows/bow_firing.dm b/code/modules/projectiles/guns/launcher/bows/bow_firing.dm index b37c34bc995..bc3168961d4 100644 --- a/code/modules/projectiles/guns/launcher/bows/bow_firing.dm +++ b/code/modules/projectiles/guns/launcher/bows/bow_firing.dm @@ -2,6 +2,10 @@ return istype(ammo, bow_ammo_type) /obj/item/gun/launcher/bow/proc/load_arrow(mob/user, obj/item/ammo) + if(!istype(string)) + if(user) + to_chat(user, SPAN_WARNING("\The [src] has no bowstring!")) + return FALSE if(istype(ammo, /obj/item/stack)) var/obj/item/stack/stack = ammo ammo = stack.split(1) diff --git a/code/modules/projectiles/guns/launcher/money_cannon.dm b/code/modules/projectiles/guns/launcher/money_cannon.dm index bb585d1c534..8ef05876a4d 100644 --- a/code/modules/projectiles/guns/launcher/money_cannon.dm +++ b/code/modules/projectiles/guns/launcher/money_cannon.dm @@ -148,7 +148,7 @@ if(!ishuman(user)) return - var/mob/living/carbon/human/M = user + var/mob/living/human/M = user M.visible_message("[user] sticks [src] in their mouth, ready to pull the trigger...") if(!do_after(user, 40, progress = 0)) diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 8f6c03407b3..dd0320b8586 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -68,10 +68,16 @@ chambered = loaded[1] //load next casing. if(handle_casings != HOLD_CASINGS) loaded -= chambered - else if(ammo_magazine && ammo_magazine.stored_ammo.len) - chambered = ammo_magazine.stored_ammo[ammo_magazine.stored_ammo.len] - if(handle_casings != HOLD_CASINGS) - ammo_magazine.stored_ammo -= chambered + else if(ammo_magazine) + if(!ammo_magazine.contents_initialized && ammo_magazine.initial_ammo > 0) + chambered = new ammo_magazine.ammo_type(src) + if(handle_casings == HOLD_CASINGS) + ammo_magazine.stored_ammo += chambered + ammo_magazine.initial_ammo-- + else if(ammo_magazine.stored_ammo.len) + chambered = ammo_magazine.stored_ammo[ammo_magazine.stored_ammo.len] + if(handle_casings != HOLD_CASINGS) + ammo_magazine.stored_ammo -= chambered if (chambered) return chambered.BB @@ -86,7 +92,7 @@ /obj/item/gun/projectile/process_point_blank(obj/projectile, atom/movable/firer, atom/target) ..() if(chambered && ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/zone = BP_CHEST if(isliving(firer)) var/mob/living/user = firer @@ -237,7 +243,7 @@ /obj/item/gun/projectile/afterattack(atom/A, mob/living/user) ..() - if(auto_eject && ammo_magazine && ammo_magazine.stored_ammo && !ammo_magazine.stored_ammo.len) + if(auto_eject && ammo_magazine && !ammo_magazine.get_stored_ammo_count()) ammo_magazine.dropInto(loc) user.visible_message( "[ammo_magazine] falls out and clatters on the floor!", @@ -262,8 +268,8 @@ var/bullets = 0 if(loaded) bullets += loaded.len - if(ammo_magazine && ammo_magazine.stored_ammo) - bullets += ammo_magazine.stored_ammo.len + if(ammo_magazine) + bullets += ammo_magazine.get_stored_ammo_count() if(chambered) bullets += 1 return bullets diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index a7614db6028..eaaf90ed248 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -72,7 +72,7 @@ /obj/item/gun/projectile/automatic/assault_rifle/update_base_icon() if(ammo_magazine) - if(ammo_magazine.stored_ammo.len) + if(ammo_magazine.get_stored_ammo_count()) icon_state = "[get_world_inventory_state()]-loaded" else icon_state = "[get_world_inventory_state()]-empty" diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index 57e98604535..9ce230085f7 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -37,13 +37,13 @@ /obj/item/gun/projectile/dartgun/on_update_icon() ..() if(ammo_magazine) - icon_state = "[get_world_inventory_state()]-[clamp(length(ammo_magazine.stored_ammo.len), 0, 5)]" + icon_state = "[get_world_inventory_state()]-[clamp(length(ammo_magazine.get_stored_ammo_count()), 0, 5)]" else icon_state = get_world_inventory_state() /obj/item/gun/projectile/dartgun/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && (slot in user_mob?.get_held_item_slots()) && ammo_magazine) - overlay.icon_state += "-[clamp(length(ammo_magazine.stored_ammo.len), 0, 5)]" + overlay.icon_state += "-[clamp(length(ammo_magazine.get_stored_ammo_count()), 0, 5)]" . = ..() /obj/item/gun/projectile/dartgun/consume_next_projectile() @@ -113,21 +113,22 @@ var/decl/material/R = GET_DECL(rtype) dat += "
    [REAGENT_VOLUME(B.reagents, rtype)] units of [R.get_reagent_name(B.reagents)], " if(B in mixing) - dat += "Mixing " + dat += "Mixing " else - dat += "Not mixing " + dat += "Not mixing " else dat += "nothing." - dat += " \[Eject\]
    " + dat += " \[Eject\]
    " if(ammo_magazine) - if(ammo_magazine.stored_ammo && ammo_magazine.stored_ammo.len) - dat += "The dart cartridge has [ammo_magazine.stored_ammo.len] shots remaining." + var/stored_ammo_count = ammo_magazine?.get_stored_ammo_count() + if(stored_ammo_count) + dat += "The dart cartridge has [stored_ammo_count] shot\s remaining." else dat += "The dart cartridge is empty!" - dat += " \[Eject\]
    " + dat += " \[Eject\]
    " - dat += "
    \[Refresh\]" + dat += "
    \[Refresh\]" var/datum/browser/popup = new(user, "dartgun", "[src] mixing control") popup.set_content(jointext(dat,null)) diff --git a/code/modules/projectiles/guns/projectile/flaregun.dm b/code/modules/projectiles/guns/projectile/flaregun.dm index b6f155d2a2b..283e7ceb8d0 100644 --- a/code/modules/projectiles/guns/projectile/flaregun.dm +++ b/code/modules/projectiles/guns/projectile/flaregun.dm @@ -33,12 +33,12 @@ var/obj/item/projectile/bullet/pellet/PP = chambered_round.BB damage = PP.damage*PP.pellets if(damage > 5) - var/mob/living/carbon/C = loc - if(istype(C)) - C.visible_message("[src] explodes in [C]'s hands!", "[src] explodes in your face!") - C.drop_from_inventory(src) + var/mob/living/user = loc + if(istype(user)) + user.visible_message("[src] explodes in [user]'s hands!", "[src] explodes in your face!") + user.drop_from_inventory(src) for(var/zone in list(BP_L_HAND, BP_R_HAND)) - C.apply_damage(rand(10,20), def_zone=zone) + user.apply_damage(rand(10,20), def_zone=zone) else visible_message("[src] explodes!") explosion(get_turf(src), -1, -1, 1) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index fd9905b1774..960f437fde0 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -148,7 +148,7 @@ /obj/item/projectile/beam/lastertag/blue/on_hit(var/atom/target, var/blocked = 0) if(ishuman(target)) - var/mob/living/carbon/human/M = target + var/mob/living/human/M = target if(istype(M.get_equipped_item(slot_wear_suit_str), /obj/item/clothing/suit/redtag)) SET_STATUS_MAX(M, STAT_WEAK, 5) return 1 @@ -163,7 +163,7 @@ /obj/item/projectile/beam/lastertag/red/on_hit(var/atom/target, var/blocked = 0) if(ishuman(target)) - var/mob/living/carbon/human/M = target + var/mob/living/human/M = target if(istype(M.get_equipped_item(slot_wear_suit_str), /obj/item/clothing/suit/bluetag)) SET_STATUS_MAX(M, STAT_WEAK, 5) return 1 @@ -181,7 +181,7 @@ /obj/item/projectile/beam/lastertag/omni/on_hit(var/atom/target, var/blocked = 0) if(ishuman(target)) - var/mob/living/carbon/human/M = target + var/mob/living/human/M = target var/obj/item/suit = M.get_equipped_item(slot_wear_suit_str) if((istype(suit, /obj/item/clothing/suit/bluetag))||(istype(suit, /obj/item/clothing/suit/redtag))) SET_STATUS_MAX(M, STAT_WEAK, 5) diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 916f3e347d0..e66053ebe84 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -16,7 +16,7 @@ for(var/t in get_all_species()) . += t if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M . -= H.species.name /obj/item/projectile/change/proc/apply_transformation(var/mob/M, var/choice) @@ -30,7 +30,7 @@ return R if(get_species_by_key(choice)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(!istype(H)) H = new(get_turf(M)) H.set_gender(M.get_gender()) diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index b11fabbd7ef..eb0cc1835e4 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -25,7 +25,7 @@ if(!istype(T)) return //blind and confuse adjacent people - for (var/mob/living/carbon/M in viewers(T, flash_range)) + for (var/mob/living/M in viewers(T, flash_range)) if(M.eyecheck() < FLASH_PROTECTION_MAJOR) M.flash_eyes() ADJ_STATUS(M, STAT_BLURRY, brightness / 2) @@ -157,7 +157,7 @@ var/med_dizziness_amt = 120 var/max_dizziness_amt = 300 -/obj/item/projectile/energy/plasmastun/proc/bang(var/mob/living/carbon/M) +/obj/item/projectile/energy/plasmastun/proc/bang(var/mob/living/M) if(!istype(M)) return @@ -168,7 +168,7 @@ if(M.get_sound_volume_multiplier() < 0.2) ear_safety += 2 if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H.get_equipped_item(slot_head_str), /obj/item/clothing/head/helmet)) ear_safety += 1 @@ -186,7 +186,7 @@ to_chat(M, SPAN_DANGER("Your ears start to ring badly!")) if(prob(GET_STATUS(M, STAT_TINNITUS) - 5)) to_chat(M, SPAN_DANGER("You can't hear anything!")) - M.set_sdisability(DEAFENED) + M.add_genetic_condition(GENE_COND_DEAFENED) else if(GET_STATUS(M, STAT_TINNITUS) >= 5) to_chat(M, SPAN_DANGER("Your ears start to ring!")) @@ -209,7 +209,7 @@ med_dizziness_amt = 60 max_dizziness_amt = 120 -/obj/item/projectile/energy/plasmastun/sonic/bang(var/mob/living/carbon/M) +/obj/item/projectile/energy/plasmastun/sonic/bang(var/mob/living/M) ..() if(istype(M, /atom/movable) && M.simulated && !M.anchored) M.throw_at(get_edge_target_turf(M, get_dir(src, M)), rand(1,5), 6) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 6094d2dd9e1..33165821ff6 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -93,15 +93,11 @@ SPAN_DANGER("\The [M] writhes in pain as [G.his] vacuoles boil."), blind_message = SPAN_WARNING("You hear a crunching sound.") ) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(prob(35)) - if(prob(80)) - randmutb(H) - domutcheck(H,null) - else - randmutg(H) - domutcheck(H,null) + if(prob(35)) + if(prob(80)) + M.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/disability))) + else + M.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/superpower))) else M.heal_damage(BURN, rand(5,15)) M.show_message(SPAN_DANGER("The radiation beam singes you!")) @@ -141,7 +137,7 @@ /obj/item/projectile/beam/mindflayer/on_hit(var/atom/target, var/blocked = 0) if(ishuman(target)) - var/mob/living/carbon/human/M = target + var/mob/living/human/M = target ADJ_STATUS(M, STAT_CONFUSE, rand(5,8)) /obj/item/projectile/chameleon diff --git a/code/modules/pronouns/_pronouns.dm b/code/modules/pronouns/_pronouns.dm index b9ecd77fbbb..83f899499b0 100644 --- a/code/modules/pronouns/_pronouns.dm +++ b/code/modules/pronouns/_pronouns.dm @@ -2,6 +2,7 @@ var/name = PLURAL var/bureaucratic_term = "other" var/informal_term = "hoopy frood" + var/honorific = "Mx." var/pronoun_string var/He = "They" diff --git a/code/modules/pronouns/pronouns_female.dm b/code/modules/pronouns/pronouns_female.dm index 7e993265477..41a90f3caba 100644 --- a/code/modules/pronouns/pronouns_female.dm +++ b/code/modules/pronouns/pronouns_female.dm @@ -2,6 +2,7 @@ name = FEMALE bureaucratic_term = "female" informal_term = "lady" + honorific = "Ms." He = "She" he = "she" diff --git a/code/modules/pronouns/pronouns_male.dm b/code/modules/pronouns/pronouns_male.dm index 67fa9c7d190..47ea51748d0 100644 --- a/code/modules/pronouns/pronouns_male.dm +++ b/code/modules/pronouns/pronouns_male.dm @@ -2,6 +2,7 @@ name = MALE bureaucratic_term = "male" informal_term = "guy" + honorific = "Mr." He = "He" he = "he" diff --git a/code/modules/random_map/dungeon/rooms/tomb.dm b/code/modules/random_map/dungeon/rooms/tomb.dm index d91a82b13e5..339b027250f 100644 --- a/code/modules/random_map/dungeon/rooms/tomb.dm +++ b/code/modules/random_map/dungeon/rooms/tomb.dm @@ -22,10 +22,10 @@ var/type = pickweight(corpses) var/mob/M if(istext(type)) - M = new /mob/living/carbon/human() - var/mob/living/carbon/human/H = M + M = new /mob/living/human() + var/mob/living/human/H = M H.set_species(type) - H.make_husked() + H.add_genetic_condition(GENE_COND_HUSK) else M = new type() M.death() @@ -38,10 +38,10 @@ var/type = pickweight(corpses) var/mob/M if(istext(type)) - M = new /mob/living/carbon/human() - var/mob/living/carbon/human/H = M + M = new /mob/living/human() + var/mob/living/human/H = M H.set_species(type) - H.make_husked() + H.add_genetic_condition(GENE_COND_HUSK) else M = new type() M.death() diff --git a/code/modules/random_map/noise/forage.dm b/code/modules/random_map/noise/forage.dm index 3408554680a..93ddba8a3e2 100644 --- a/code/modules/random_map/noise/forage.dm +++ b/code/modules/random_map/noise/forage.dm @@ -8,6 +8,9 @@ /obj/item/stack/material/ore/basalt/three amount = 3 +/obj/item/stack/material/ore/basalt/ten + amount = 10 + /atom/movable/spawn_boulder name = "material boulder spawner" is_spawnable_type = FALSE diff --git a/code/modules/reagents/Chemistry-Grinder.dm b/code/modules/reagents/Chemistry-Grinder.dm index 32dff0e6d68..dfdacb1d755 100644 --- a/code/modules/reagents/Chemistry-Grinder.dm +++ b/code/modules/reagents/Chemistry-Grinder.dm @@ -226,7 +226,7 @@ if(CanPhysicallyInteractWith(user, src)) interface_interact(user) -/obj/machinery/reagentgrinder/proc/attempt_skill_effect(mob/living/carbon/human/user) +/obj/machinery/reagentgrinder/proc/attempt_skill_effect(mob/living/human/user) if(!istype(user) || !prob(user.skill_fail_chance(skill_to_check, 50, SKILL_BASIC))) return FALSE var/hand = pick(BP_L_HAND, BP_R_HAND) @@ -270,7 +270,7 @@ item_size_limit = ITEM_SIZE_SMALL skill_to_check = SKILL_COOKING -/obj/machinery/reagentgrinder/juicer/attempt_skill_effect(mob/living/carbon/human/user) +/obj/machinery/reagentgrinder/juicer/attempt_skill_effect(mob/living/human/user) if(!istype(user) || !prob(user.skill_fail_chance(skill_to_check, 50, SKILL_BASIC))) return visible_message(SPAN_NOTICE("\The [src] whirrs violently and spills its contents all over \the [user]!")) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index f5da9eb6233..59b11b071d6 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -79,7 +79,7 @@ var/global/obj/temp_reagents_holder = new if(my_atom.reagents == src) my_atom.reagents = null if(total_volume > 0) // we can assume 0 reagents and null reagents are broadly identical for the purposes of atom logic - my_atom.on_reagent_change() + my_atom.try_on_reagent_change() my_atom = null /datum/reagents/GetCloneArgs() @@ -191,36 +191,34 @@ var/global/obj/temp_reagents_holder = new if(!(check_flags & ATOM_FLAG_NO_REACT)) var/list/active_reactions = list() - for(var/decl/chemical_reaction/C in eligible_reactions) - if(C.can_happen(src)) - active_reactions[C] = 1 // The number is going to be 1/(fraction of remaining reagents we are allowed to use), computed below + for(var/decl/chemical_reaction/reaction in eligible_reactions) + if(reaction.can_happen(src)) + active_reactions[reaction] = 1 // The number is going to be 1/(fraction of remaining reagents we are allowed to use), computed below reaction_occured = 1 var/list/used_reagents = list() // if two reactions share a reagent, each is allocated half of it, so we compute this here - for(var/decl/chemical_reaction/C in active_reactions) - var/list/adding = C.get_used_reagents() + for(var/decl/chemical_reaction/reaction in active_reactions) + var/list/adding = reaction.get_used_reagents() for(var/R in adding) - LAZYADD(used_reagents[R], C) + LAZYADD(used_reagents[R], reaction) for(var/R in used_reagents) var/counter = length(used_reagents[R]) if(counter <= 1) continue // Only used by one reaction, so nothing we need to do. - for(var/decl/chemical_reaction/C in used_reagents[R]) - active_reactions[C] = max(counter, active_reactions[C]) + for(var/decl/chemical_reaction/reaction in used_reagents[R]) + active_reactions[reaction] = max(counter, active_reactions[reaction]) counter-- //so the next reaction we execute uses more of the remaining reagents // Note: this is not guaranteed to maximize the size of the reactions we do (if one reaction is limited by reagent A, we may be over-allocating reagent B to it) // However, we are guaranteed to fully use up the most profligate reagent if possible. // Further reactions may occur on the next tick, when this runs again. - for(var/thing in active_reactions) - var/decl/chemical_reaction/C = thing - C.process(src, active_reactions[C]) + for(var/decl/chemical_reaction/reaction as anything in active_reactions) + reaction.process(src, active_reactions[reaction]) - for(var/thing in active_reactions) - var/decl/chemical_reaction/C = thing - C.post_reaction(src) + for(var/decl/chemical_reaction/reaction as anything in active_reactions) + reaction.post_reaction(src) update_total() @@ -237,16 +235,14 @@ var/global/obj/temp_reagents_holder = new update_total() if(!safety) HANDLE_REACTIONS(src) - if(my_atom) - my_atom.on_reagent_change() + my_atom?.try_on_reagent_change() ///Set and call updates on the target holder. /datum/reagents/proc/set_holder(var/obj/new_holder) if(my_atom == new_holder) return my_atom = new_holder - if(my_atom) - my_atom.on_reagent_change() + my_atom?.try_on_reagent_change() handle_update() /datum/reagents/proc/add_reagent(var/reagent_type, var/amount, var/data = null, var/safety = 0, var/defer_update = FALSE) @@ -335,7 +331,7 @@ var/global/obj/temp_reagents_holder = new LAZYCLEARLIST(reagent_volumes) LAZYCLEARLIST(reagent_data) total_volume = 0 - my_atom?.on_reagent_change() + my_atom?.try_on_reagent_change() /datum/reagents/proc/get_overdose(var/decl/material/current) if(current) @@ -679,13 +675,3 @@ var/global/obj/temp_reagents_holder = new else reagents = new/datum/reagents(max_vol, src) return reagents - -/datum/reagents/Topic(href, href_list) - . = ..() - if(!. && href_list["deconvert"]) - var/list/data = REAGENT_DATA(src, /decl/material/liquid/water) - if(LAZYACCESS(data, "holy")) - var/mob/living/carbon/C = locate(href_list["deconvert"]) - if(istype(C) && !QDELETED(C) && C.mind) - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.remove_antagonist(C.mind,1) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 39aca0bc1ab..13e9eb97816 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -194,7 +194,7 @@ #define MAX_PILL_SPRITE 25 //max icon state of the pill sprites var/dat = "" for(var/i = 1 to MAX_PILL_SPRITE) - dat += "" + dat += "" dat += "
    " show_browser(user, dat, "window=chem_master") return @@ -226,7 +226,7 @@ . += "Blood Type: [LAZYACCESS(blood_data, "blood_type")]
    DNA: [LAZYACCESS(blood_data, "blood.DNA")]" else . += "[reagent.lore_text]" - . += "


    (Back)" + . += "


    (Back)" . = JOINTEXT(.) /obj/machinery/chem_master/proc/create_bottle(mob/user) @@ -261,16 +261,16 @@ if(!beaker) dat += "Please insert beaker.
    " if(loaded_pill_bottle?.storage) - dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage.max_storage_space]\]

    " + dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage.max_storage_space]\]

    " else dat += "No pill bottle inserted.

    " - dat += "Close" + dat += "Close" else var/datum/reagents/R = beaker.reagents - dat += "Eject beaker and Clear Buffer
    " - dat += "Toggle purification mode: [sloppy ? "Quick" : "Thorough"]
    " + dat += "Eject beaker and Clear Buffer
    " + dat += "Toggle purification mode: [sloppy ? "Quick" : "Thorough"]
    " if(loaded_pill_bottle?.storage) - dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage.max_storage_space]\]

    " + dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage.max_storage_space]\]

    " else dat += "No pill bottle inserted.

    " if(!R.total_volume) @@ -280,24 +280,24 @@ for(var/rtype in R.reagent_volumes) var/decl/material/G = GET_DECL(rtype) dat += "[G.use_name], [REAGENT_VOLUME(R, rtype)] Units - " - dat += "(Analyze) " - dat += "(1) " - dat += "(5) " - dat += "(10) " - dat += "(All) " - dat += "(Custom)
    " - - dat += "
    Transfer to [(!mode ? "disposal" : "beaker")]:
    " + dat += "(Analyze) " + dat += "(1) " + dat += "(5) " + dat += "(10) " + dat += "(All) " + dat += "(Custom)
    " + + dat += "
    Transfer to [(!mode ? "disposal" : "beaker")]:
    " if(reagents.total_volume) for(var/rtype in reagents.reagent_volumes) var/decl/material/N = GET_DECL(rtype) dat += "[N.use_name], [REAGENT_VOLUME(reagents, rtype)] Units - " - dat += "(Analyze) " - dat += "(1) " - dat += "(5) " - dat += "(10) " - dat += "(All) " - dat += "(Custom)
    " + dat += "(Analyze) " + dat += "(1) " + dat += "(5) " + dat += "(10) " + dat += "(All) " + dat += "(Custom)
    " else dat += "Empty
    " dat += extra_options() @@ -307,11 +307,11 @@ //Use to add extra stuff to the end of the menu. /obj/machinery/chem_master/proc/extra_options() . = list() - . += "

    Create pill (30 units max)
    " - . += "Create multiple pills
    " - . += "Create bottle (60 units max)" - . += "
    Bottle Label Color:\tâ–‰" - . += "
    Bottle Lid Color:\tâ–‰" + . += "

    Create pill (30 units max)
    " + . += "Create multiple pills
    " + . += "Create bottle (60 units max)" + . += "
    Bottle Label Color:\tâ–‰" + . += "
    Bottle Lid Color:\tâ–‰" return JOINTEXT(.) /obj/machinery/chem_master/condimaster @@ -326,4 +326,4 @@ reagents.trans_to_obj(P,50) /obj/machinery/chem_master/condimaster/extra_options() - return "Create bottle (50 units max)" + return "Create bottle (50 units max)" diff --git a/code/modules/mob/living/carbon/taste.dm b/code/modules/reagents/Chemistry-Taste.dm similarity index 68% rename from code/modules/mob/living/carbon/taste.dm rename to code/modules/reagents/Chemistry-Taste.dm index 33bcbd1d163..5b73376f813 100644 --- a/code/modules/mob/living/carbon/taste.dm +++ b/code/modules/reagents/Chemistry-Taste.dm @@ -1,18 +1,3 @@ -/mob/living/proc/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) - RAISE_EVENT(/decl/observ/ingested, src, from, target, amount, multiplier, copy) - . = from.trans_to_holder(target,amount,multiplier,copy) - -/mob/living/carbon/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) //we kind of 'sneak' a proc in here for ingesting stuff so we can play with it. - if(last_taste_time + 50 < world.time) - var/datum/reagents/temp = new(amount, global.temp_reagents_holder) //temporary holder used to analyse what gets transfered. - from.trans_to_holder(temp, amount, multiplier, 1) - var/text_output = temp.generate_taste_message(src, from) - if(text_output && (text_output != last_taste_text || last_taste_time + 1 MINUTE < world.time)) //We dont want to spam the same message over and over again at the person. Give it a bit of a buffer. - to_chat(src, SPAN_NOTICE("You can taste [text_output].")) //no taste means there are too many tastes and not enough flavor. - last_taste_time = world.time - last_taste_text = text_output - . = ..() - /* what this does: catalogue the 'taste strength' of each one calculate text size per text. diff --git a/code/modules/reagents/chems/chems_blood.dm b/code/modules/reagents/chems/chems_blood.dm index df3a8d91769..ae76f942ab3 100644 --- a/code/modules/reagents/chems/chems_blood.dm +++ b/code/modules/reagents/chems/chems_blood.dm @@ -54,7 +54,7 @@ blood_splatter(T, W?.resolve() || holder.my_atom, 1) /decl/material/liquid/blood/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return if(LAZYACCESS(M.chem_doses, type) > 5) M.take_damage(removed, TOX) @@ -64,7 +64,7 @@ /decl/material/liquid/blood/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(ishuman(M)) var/volume = REAGENT_VOLUME(holder, type) - var/mob/living/carbon/H = M + var/mob/living/human/H = M H.inject_blood(volume, holder) holder.remove_reagent(type, volume) diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index e8c34cb0311..cd2fc94a85d 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -27,13 +27,13 @@ /decl/material/liquid/glowsap/affect_blood(mob/living/M, removed, var/datum/reagents/holder) M.add_chemical_effect(CE_GLOWINGEYES, 1) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M H.update_eyes() /decl/material/liquid/glowsap/on_leaving_metabolism(datum/reagents/metabolism/holder) if(ishuman(holder?.my_atom)) - var/mob/living/carbon/human/H = holder.my_atom - addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon/human, update_eyes)), 5 SECONDS) + var/mob/living/human/H = holder.my_atom + addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/human, update_eyes)), 5 SECONDS) . = ..() /decl/material/liquid/glowsap/affect_overdose(mob/living/M, total_dose) @@ -111,11 +111,11 @@ /decl/material/liquid/capsaicin/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) holder.remove_reagent(/decl/material/liquid/frostoil, 5) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(!H.can_feel_pain()) return @@ -202,11 +202,11 @@ /decl/material/liquid/capsaicin/condensed/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) holder.remove_reagent(/decl/material/liquid/frostoil, 5) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(!H.can_feel_pain()) return if(LAZYACCESS(M.chem_doses, type) == metabolism) @@ -241,20 +241,18 @@ if(M.isSynthetic()) return - - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H) && (H.get_bodytype()?.body_flags & BODY_FLAG_NO_DNA)) return - if(M.dna) - if(prob(removed * 0.1)) // Approx. one mutation per 10 injected/20 ingested/30 touching units - randmuti(M) - if(prob(98)) - randmutb(M) - else - randmutg(M) - domutcheck(M, null) - M.UpdateAppearance() + if(prob(removed * 0.1)) // Approx. one mutation per 10 injected/20 ingested/30 touching units + H.set_unique_enzymes(num2text(random_id(/mob, 1000000, 9999999))) + if(prob(98)) + M.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/disability))) + else + M.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/superpower))) + + M.apply_damage(10 * removed, IRRADIATE, armor_pen = 100) /decl/material/liquid/lactate @@ -292,7 +290,7 @@ uid = "chem_nanoblood" /decl/material/liquid/nanoblood/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(!istype(H)) return if(!H.should_have_organ(BP_HEART)) //We want the var for safety but we can do without the actual blood. @@ -384,7 +382,7 @@ if(M.bodytemperature < 170) M.heal_organ_damage(30 * removed, 30 * removed, affect_robo = 1) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M for(var/obj/item/organ/internal/I in H.get_internal_organs()) if(BP_IS_PROSTHETIC(I)) I.heal_damage(20*removed) @@ -407,13 +405,13 @@ exoplanet_rarity_gas = MAT_RARITY_EXOTIC uid = "chem_crystalizing_agent" -/decl/material/liquid/crystal_agent/proc/do_material_check(var/mob/living/carbon/M) +/decl/material/liquid/crystal_agent/proc/do_material_check(var/mob/living/M) . = /decl/material/solid/gemstone/crystal /decl/material/liquid/crystal_agent/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/result_mat = do_material_check(M) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/list/limbs = H.get_external_organs() var/list/shuffled_limbs = LAZYLEN(limbs) ? shuffle(limbs.Copy()) : null for(var/obj/item/organ/external/E in shuffled_limbs) diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index abc7f5bc776..85d84b009ec 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -18,7 +18,7 @@ M.take_damage(removed, TOX) // Probably not a good idea; not very deadly though /decl/material/liquid/drink/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return if(nutrition) @@ -41,7 +41,7 @@ /decl/material/liquid/drink/juice/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(!M.HasTrait(/decl/trait/metabolically_inert)) + if(!M.has_trait(/decl/trait/metabolically_inert)) M.immunity = min(M.immunity + 0.25, M.immunity_norm*1.5) /decl/material/liquid/drink/juice/banana @@ -116,7 +116,7 @@ /decl/material/liquid/drink/juice/lime/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.heal_damage(TOX, 0.5 * removed) @@ -135,7 +135,7 @@ /decl/material/liquid/drink/juice/orange/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.heal_damage(OXY, 2 * removed) @@ -198,7 +198,7 @@ /decl/material/liquid/drink/juice/tomato/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.heal_organ_damage(0, 0.5 * removed) @@ -274,7 +274,7 @@ holder.remove_reagent(/decl/material/liquid/capsaicin, 10 * removed) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.heal_organ_damage(0.5 * removed, 0) @@ -340,7 +340,7 @@ if(adj_temp > 0) holder.remove_reagent(/decl/material/liquid/frostoil, 10 * removed) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return var/volume = REAGENT_VOLUME(holder, type) @@ -513,7 +513,7 @@ /decl/material/liquid/drink/mutagencola/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.add_chemical_effect(CE_SPEEDBOOST, 1) @@ -643,7 +643,7 @@ /decl/material/liquid/drink/hell_ramen/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT @@ -662,7 +662,7 @@ /decl/material/liquid/drink/tea/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.heal_damage(TOX, 0.5 * removed) @@ -837,7 +837,7 @@ /decl/material/liquid/drink/beastenergy/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return ADJ_STATUS(M, STAT_DROWSY, -7) diff --git a/code/modules/reagents/chems/chems_drugs.dm b/code/modules/reagents/chems/chems_drugs.dm index 4f4c375dcae..6db2a8e8a95 100644 --- a/code/modules/reagents/chems/chems_drugs.dm +++ b/code/modules/reagents/chems/chems_drugs.dm @@ -218,7 +218,7 @@ ADJ_STATUS(M, STAT_JITTER, 3) ADJ_STATUS(M, STAT_DIZZY, 3) if(prob(0.1) && ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M H.seizure() H.take_damage(rand(8, 12), BRAIN) if(prob(5)) @@ -233,7 +233,7 @@ /decl/material/liquid/glowsap/gleam/affect_overdose(mob/living/M, total_dose) M.take_damage(rand(1, 5), BRAIN) if(ishuman(M) && prob(10)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M H.seizure() if(prob(10)) to_chat(M, SPAN_DANGER("[pick(overdose_messages)]")) diff --git a/code/modules/reagents/chems/chems_ethanol.dm b/code/modules/reagents/chems/chems_ethanol.dm index 84a26d93948..7982a87a312 100644 --- a/code/modules/reagents/chems/chems_ethanol.dm +++ b/code/modules/reagents/chems/chems_ethanol.dm @@ -43,7 +43,7 @@ /decl/material/liquid/ethanol/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return ..() @@ -131,7 +131,7 @@ /decl/material/liquid/ethanol/beer/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return ADJ_STATUS(M, STAT_JITTER, -3) @@ -194,7 +194,7 @@ /decl/material/liquid/ethanol/coffee/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return ADJ_STATUS(M, STAT_DIZZY, -5) @@ -276,7 +276,7 @@ /decl/material/liquid/ethanol/thirteenloko/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return ADJ_STATUS(M, STAT_DROWSY, -7) @@ -445,14 +445,14 @@ /decl/material/liquid/ethanol/pwine/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return var/dose = LAZYACCESS(M.chem_doses, type) if(dose > 30) M.take_damage(2 * removed, TOX) if(dose > 60 && ishuman(M) && prob(5)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/organ/internal/heart = GET_INTERNAL_ORGAN(H, BP_HEART) if(heart) if(dose < 120) diff --git a/code/modules/reagents/chems/chems_medicines.dm b/code/modules/reagents/chems/chems_medicines.dm index 2ded7b2060b..141dd99c0a8 100644 --- a/code/modules/reagents/chems/chems_medicines.dm +++ b/code/modules/reagents/chems/chems_medicines.dm @@ -12,7 +12,7 @@ /decl/material/liquid/eyedrops/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/organ/internal/E = GET_INTERNAL_ORGAN(H, BP_EYES) if(E && istype(E) && !E.is_broken()) ADJ_STATUS(M, STAT_BLURRY, -5) @@ -54,7 +54,7 @@ ..() if(ishuman(M)) M.add_chemical_effect(CE_BLOCKAGE, (15 + REAGENT_VOLUME(holder, type))/100) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M for(var/obj/item/organ/external/E in H.get_external_organs()) if(E.status & ORGAN_ARTERY_CUT && prob(2 + REAGENT_VOLUME(holder, type) / overdose)) E.status &= ~ORGAN_ARTERY_CUT @@ -166,7 +166,7 @@ /decl/material/liquid/immunobooster/affect_overdose(mob/living/M, total_dose) ..() M.add_chemical_effect(CE_TOXIN, 1) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H)) M.adjust_immunity(-0.5) @@ -260,7 +260,7 @@ /decl/material/liquid/retrovirals/affect_overdose(mob/living/M, total_dose) . = ..() if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M for(var/obj/item/organ/external/E in H.get_external_organs()) if(!BP_IS_PROSTHETIC(E) && prob(25) && !(E.status & ORGAN_MUTATED)) E.mutate() @@ -271,15 +271,7 @@ if(LAZYACCESS(M.chem_doses, type) > 10) ADJ_STATUS(M, STAT_DIZZY, 5) ADJ_STATUS(M, STAT_JITTER, 5) - var/needs_update = M.mutations.len > 0 - M.mutations.Cut() - M.disabilities = 0 - M.sdisabilities = 0 - if(needs_update && ishuman(M)) - M.dna.ResetUI() - M.dna.ResetSE() - domutcheck(M, null, MUTCHK_FORCED) - M.update_icon() + M.reset_genetic_conditions() /decl/material/liquid/adrenaline name = "adrenaline" @@ -306,7 +298,7 @@ if(volume >= 5 && M.is_asystole()) holder.remove_reagent(type, 5) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.resuscitate()) var/obj/item/organ/internal/heart = GET_INTERNAL_ORGAN(H, BP_HEART) heart.take_internal_damage(heart.max_damage * 0.15) @@ -360,7 +352,7 @@ M.add_chemical_effect(CE_PAINKILLER, 10) M.add_chemical_effect(CE_BRAIN_REGEN, 1) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M ADJ_STATUS(H, STAT_CONFUSE, 1) ADJ_STATUS(H, STAT_DROWSY, 1) diff --git a/code/modules/reagents/chems/chems_painkillers.dm b/code/modules/reagents/chems/chems_painkillers.dm index daf15d76a1a..91c75243fc7 100644 --- a/code/modules/reagents/chems/chems_painkillers.dm +++ b/code/modules/reagents/chems/chems_painkillers.dm @@ -123,7 +123,7 @@ else M.add_chemical_effect(CE_TOXIN, 1) -/decl/material/liquid/painkillers/proc/isboozed(var/mob/living/carbon/M) +/decl/material/liquid/painkillers/proc/isboozed(var/mob/living/M) . = 0 if(!narcotic) return diff --git a/code/modules/reagents/dispenser/dispenser2.dm b/code/modules/reagents/dispenser/dispenser2.dm index 1a5287a0035..619b8e964bf 100644 --- a/code/modules/reagents/dispenser/dispenser2.dm +++ b/code/modules/reagents/dispenser/dispenser2.dm @@ -86,38 +86,38 @@ cartridges -= label SSnano.update_uis(src) -/obj/machinery/chemical_dispenser/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/chems/chem_disp_cartridge)) - add_cartridge(W, user) +/obj/machinery/chemical_dispenser/attackby(obj/item/hit_with, mob/user) + if(istype(hit_with, /obj/item/chems/chem_disp_cartridge)) + add_cartridge(hit_with, user) return TRUE - if(IS_CROWBAR(W) && !panel_open && length(cartridges)) + if(IS_CROWBAR(hit_with) && !panel_open && length(cartridges)) var/label = input(user, "Which cartridge would you like to remove?", "Chemical Dispenser") as null|anything in cartridges if(!label) return var/obj/item/chems/chem_disp_cartridge/C = remove_cartridge(label) if(C) - to_chat(user, "You remove \the [C] from \the [src].") + to_chat(user, SPAN_NOTICE("You remove \the [C] from \the [src].")) C.dropInto(loc) return TRUE - if(is_type_in_list(W, acceptable_containers)) + if(is_type_in_list(hit_with, acceptable_containers)) if(container) - to_chat(user, "There is already \a [container] on \the [src]!") + to_chat(user, SPAN_WARNING("There is already \a [container] on \the [src]!")) return TRUE - var/obj/item/chems/RC = W + var/obj/item/chems/new_container = hit_with - if(!accept_drinking && (istype(RC,/obj/item/chems/condiment) || istype(RC,/obj/item/chems/drinks))) - to_chat(user, "This machine only accepts beakers!") + if(!accept_drinking && (istype(new_container,/obj/item/chems/condiment) || istype(new_container,/obj/item/chems/drinks))) + to_chat(user, SPAN_WARNING("This machine only accepts beakers!")) return TRUE - if(!ATOM_IS_OPEN_CONTAINER(RC)) - to_chat(user, "You don't see how \the [src] could dispense reagents into \the [RC].") + if(!ATOM_IS_OPEN_CONTAINER(new_container)) + to_chat(user, SPAN_WARNING("You don't see how \the [src] could dispense reagents into \the [new_container].")) return TRUE - if(!user.try_unequip(RC, src)) + if(!user.try_unequip(new_container, src)) return TRUE - set_container(RC) - to_chat(user, "You set \the [RC] on \the [src].") + set_container(new_container) + to_chat(user, SPAN_NOTICE("You set \the [new_container] on \the [src].")) return TRUE return ..() diff --git a/code/modules/reagents/heat_sources/_heat_source.dm b/code/modules/reagents/heat_sources/_heat_source.dm index afd89161d21..dfc9f92aa5d 100644 --- a/code/modules/reagents/heat_sources/_heat_source.dm +++ b/code/modules/reagents/heat_sources/_heat_source.dm @@ -141,21 +141,21 @@ dat += "Target temperature:" if(target_temperature > min_temperature) - dat += "- " + dat += "- " dat += "[target_temperature - T0C]C" if(target_temperature < max_temperature) - dat += " +" + dat += " +" dat += "" dat += "Current temperature:[FLOOR(temperature - T0C)]C" dat += "Loaded container:" - dat += "[container ? "[container.name] ([FLOOR(container.temperature - T0C)]C) Remove" : "None."]" + dat += "[container ? "[container.name] ([FLOOR(container.temperature - T0C)]C) Remove" : "None."]" - dat += "Switched:[use_power == POWER_USE_ACTIVE ? "On" : "Off"]" + dat += "Switched:[use_power == POWER_USE_ACTIVE ? "On" : "Off"]" dat += "" var/datum/browser/popup = new(user, "\ref[src]-reagent_temperature_window", "[capitalize(name)]") diff --git a/code/modules/reagents/reactions/reaction_grenade_reaction.dm b/code/modules/reagents/reactions/reaction_grenade_reaction.dm index 64bcf4da78e..dd3aaac6be8 100644 --- a/code/modules/reagents/reactions/reaction_grenade_reaction.dm +++ b/code/modules/reagents/reactions/reaction_grenade_reaction.dm @@ -36,7 +36,7 @@ var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) spark_at(location, amount=2, cardinal_only = TRUE) - for(var/mob/living/carbon/M in viewers(world.view, location)) + for(var/mob/living/M in viewers(world.view, location)) if(M.eyecheck() < FLASH_PROTECTION_MODERATE) switch(get_dist(M, location)) if(0 to 3) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index d1e1efb9a95..c1237db561e 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -79,10 +79,10 @@ desc = new_desc_list.Join("\n") /obj/item/chems/on_reagent_change() - ..() - update_container_name() - update_container_desc() - update_icon() + if((. = ..())) + update_container_name() + update_container_desc() + update_icon() /obj/item/chems/verb/set_amount_per_transfer_from_this() set name = "Set Transfer Amount" @@ -112,7 +112,7 @@ /obj/item/chems/standard_pour_into(mob/user, atom/target, amount = 5) return ..(user, target, amount_per_transfer_from_this) -/obj/item/chems/do_surgery(mob/living/carbon/M, mob/living/user) +/obj/item/chems/do_surgery(mob/living/M, mob/living/user) if(user.get_target_zone() != BP_MOUTH) //in case it is ever used as a surgery tool return ..() diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 60d34cefd8f..b8a8a2578ed 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -17,7 +17,7 @@ amount_per_transfer_from_this = REM atom_flags = ATOM_FLAG_OPEN_CONTAINER - var/mob/living/carbon/human/attached + var/mob/living/human/attached /obj/item/chems/ivbag/Destroy() STOP_PROCESSING(SSobj,src) @@ -25,7 +25,8 @@ . = ..() /obj/item/chems/ivbag/on_reagent_change() - ..() + if(!(. = ..())) + return if(reagents?.total_volume > volume/2) w_class = ITEM_SIZE_SMALL else diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index fe04dadb6f1..6e69142d458 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -94,7 +94,7 @@ if(mode == i) t += "[reagent_names[i]]" else - t += "[reagent_names[i]]" + t += "[reagent_names[i]]" t = "Available reagents: [t]." to_chat(user, t) diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index 60387824b71..5e7d21528cd 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -42,11 +42,12 @@ if(length(tmp_label)) to_chat(user, SPAN_NOTICE("You set the label to \"[tmp_label]\".")) label_text = tmp_label - name = addtext(name," ([label_text])") else to_chat(user, SPAN_NOTICE("You remove the label.")) label_text = null - on_reagent_change() + update_container_name() + update_container_desc() + update_icon() return /obj/item/chems/condiment/afterattack(var/obj/target, var/mob/user, var/proximity) @@ -77,8 +78,8 @@ /obj/item/chems/condiment/on_reagent_change() is_special_bottle = reagents?.total_volume && special_bottles[reagents?.primary_reagent] - ..() - update_center_of_mass() + if((. = ..())) + update_center_of_mass() /obj/item/chems/condiment/update_container_name() name = is_special_bottle ? initial(is_special_bottle.name) : initial(name) diff --git a/code/modules/reagents/reagent_containers/drinks/bottle.dm b/code/modules/reagents/reagent_containers/drinks/bottle.dm index fdaf1c2a812..ddecaec124f 100644 --- a/code/modules/reagents/reagent_containers/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/drinks/bottle.dm @@ -166,7 +166,7 @@ if(!smash_check(1)) return //won't always break on the first hit - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(istype(H) && H.headcheck(hit_zone)) var/obj/item/organ/affecting = GET_EXTERNAL_ORGAN(H, hit_zone) //headcheck should ensure that affecting is not null user.visible_message(SPAN_DANGER("\The [user] smashes \the [src] into [H]'s [affecting.name]!")) diff --git a/code/modules/reagents/reagent_containers/food/meat/cubes.dm b/code/modules/reagents/reagent_containers/food/meat/cubes.dm index 8be79bc8347..48a3db8b0ea 100644 --- a/code/modules/reagents/reagent_containers/food/meat/cubes.dm +++ b/code/modules/reagents/reagent_containers/food/meat/cubes.dm @@ -10,7 +10,7 @@ center_of_mass = @'{"x":16,"y":14}' var/growing = FALSE - var/monkey_type = /mob/living/carbon/human/monkey + var/monkey_type = /mob/living/human/monkey var/wrapper_type /obj/item/chems/food/monkeycube/populate_reagents() @@ -54,8 +54,7 @@ Expand(get_turf(target)) /obj/item/chems/food/monkeycube/on_reagent_change() - ..() - if(!QDELETED(src) && reagents?.has_reagent(/decl/material/liquid/water)) + if((. = ..()) && !QDELETED(src) && reagents?.has_reagent(/decl/material/liquid/water)) Expand() /obj/item/chems/food/monkeycube/wrapped diff --git a/code/modules/reagents/reagent_containers/inhaler.dm b/code/modules/reagents/reagent_containers/inhaler.dm index b692be6a17c..b33217aacbb 100644 --- a/code/modules/reagents/reagent_containers/inhaler.dm +++ b/code/modules/reagents/reagent_containers/inhaler.dm @@ -54,7 +54,7 @@ return TRUE // This properly handles mouth coverage/presence, but should probably be replaced later. - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(user == H) if(!H.can_eat(src)) return TRUE diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 6784ae185ab..0f766804599 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -39,8 +39,8 @@ /obj/item/chems/syringe/on_reagent_change() - . = ..() - update_icon() + if((. = ..())) + update_icon() /obj/item/chems/syringe/on_picked_up(mob/user) . = ..() @@ -130,11 +130,9 @@ return if(ishuman(target)) var/amount = REAGENTS_FREE_SPACE(reagents) - var/mob/living/carbon/human/T = target - if(!T.dna) + var/mob/living/human/T = target + if(!T.vessel?.total_volume) to_chat(user, SPAN_WARNING("You are unable to locate any blood.")) - if(ishuman(target)) - CRASH("[T] \[[T.type]\] was missing their dna datum!") return var/allow = T.can_inject(user, check_zone(user.get_target_zone(), T)) @@ -218,7 +216,7 @@ mode = SYRINGE_DRAW update_icon() -/obj/item/chems/syringe/proc/handleBodyBag(var/obj/structure/closet/body_bag/bag, var/mob/living/carbon/user) +/obj/item/chems/syringe/proc/handleBodyBag(var/obj/structure/closet/body_bag/bag, var/mob/living/user) if(bag.opened || !bag.contains_body) return @@ -226,7 +224,7 @@ if(L) injectMob(L, user, bag) -/obj/item/chems/syringe/proc/injectMob(var/mob/living/carbon/target, var/mob/living/carbon/user, var/atom/trackTarget) +/obj/item/chems/syringe/proc/injectMob(var/mob/living/target, var/mob/living/user, var/atom/trackTarget) if(!trackTarget) trackTarget = target @@ -267,11 +265,11 @@ mode = SYRINGE_DRAW update_icon() -/obj/item/chems/syringe/proc/syringestab(var/mob/living/carbon/target, var/mob/living/carbon/user) +/obj/item/chems/syringe/proc/syringestab(var/mob/living/target, var/mob/living/user) if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/target_zone = check_zone(user.get_target_zone(), H) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, target_zone) @@ -306,7 +304,7 @@ admin_inject_log(user, target, src, contained_reagents, trans, violent=1) break_syringe(target, user) -/obj/item/chems/syringe/proc/break_syringe(mob/living/carbon/human/target, mob/living/carbon/user) +/obj/item/chems/syringe/proc/break_syringe(mob/living/human/target, mob/living/user) desc += " It is broken." mode = SYRINGE_BROKEN if(target) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 115243743c8..f8c05d3172c 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -14,6 +14,7 @@ var/unwrenched = FALSE var/tmp/volume = 1000 var/amount_dispensed = 10 + var/can_toggle_open = TRUE var/tmp/possible_transfer_amounts = @"[10,25,50,100,500]" /obj/structure/reagent_dispensers/Initialize(ml, _mat, _reinf_mat) @@ -22,8 +23,19 @@ if (!possible_transfer_amounts) verbs -= /obj/structure/reagent_dispensers/verb/set_amount_dispensed +/obj/structure/reagent_dispensers/receive_mouse_drop(atom/dropping, mob/user, params) + if(!(. = ..()) && user?.get_active_held_item() == dropping && isitem(dropping)) + // Awful. Sorry. + var/obj/item/item = dropping + var/old_atom_flags = atom_flags + atom_flags |= ATOM_FLAG_OPEN_CONTAINER + if(item.standard_pour_into(user, src)) + . = TRUE + atom_flags = old_atom_flags + /obj/structure/reagent_dispensers/on_reagent_change() - ..() + if(!(. = ..())) + return if(reagents?.total_volume > 0) tool_interaction_flags = 0 else @@ -311,7 +323,8 @@ /obj/structure/reagent_dispensers/get_alt_interactions(var/mob/user) . = ..() LAZYADD(., /decl/interaction_handler/set_transfer/reagent_dispenser) - LAZYADD(., /decl/interaction_handler/toggle_open/reagent_dispenser) + if(can_toggle_open) + LAZYADD(., /decl/interaction_handler/toggle_open/reagent_dispenser) //Set amount dispensed /decl/interaction_handler/set_transfer/reagent_dispenser @@ -337,4 +350,4 @@ target.atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER else target.atom_flags |= ATOM_FLAG_OPEN_CONTAINER - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/recycling/destination_tagger.dm b/code/modules/recycling/destination_tagger.dm index ab74cb34715..5953b1e5268 100644 --- a/code/modules/recycling/destination_tagger.dm +++ b/code/modules/recycling/destination_tagger.dm @@ -29,7 +29,7 @@ var/dat = "

    TagMaster 2.3


    " dat += "
    " - dat += "
    Current Selection:
    " + dat += "
    Current Selection:
    " dat += "
    " dat += "

    Tag History:

    " @@ -38,7 +38,7 @@ for(var/prevdest in last_used_tags) if(cnt % 4 == 0) dat += "" - dat += "[prevdest]" + dat += "[prevdest]" ++cnt dat += "
    " diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 380350ea368..731fd5169f2 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -231,18 +231,18 @@ var/global/list/diversion_junctions = list() if(!ai) // AI can't pull flush handle if(flush) - dat += "Disposal handle: Disengage Engaged" + dat += "Disposal handle: Disengage Engaged" else - dat += "Disposal handle: Disengaged Engage" + dat += "Disposal handle: Disengaged Engage" - dat += "

    Eject contents
    " + dat += "

    Eject contents
    " if(mode <= 0) - dat += "Pump: Off On
    " + dat += "Pump: Off On
    " else if(mode == 1) - dat += "Pump: Off On (pressurizing)
    " + dat += "Pump: Off On (pressurizing)
    " else - dat += "Pump: Off On (idle)
    " + dat += "Pump: Off On (idle)
    " var/per = 100* air_contents.return_pressure() / (SEND_PRESSURE) diff --git a/code/modules/recycling/package_wrapper.dm b/code/modules/recycling/package_wrapper.dm index 4333cf48d40..b4261ef64a9 100644 --- a/code/modules/recycling/package_wrapper.dm +++ b/code/modules/recycling/package_wrapper.dm @@ -61,7 +61,7 @@ to_chat(user, SPAN_WARNING("You cannot wrap yourself!")) return if(ishuman(AM)) - var/mob/living/carbon/human/H = AM + var/mob/living/human/H = AM if(!H.incapacitated(INCAPACITATION_DISABLED | INCAPACITATION_RESTRAINED)) if(user) to_chat(user, SPAN_WARNING("\The [H] is moving around too much. Restrain or incapacitate them first.")) @@ -95,7 +95,7 @@ qdel(wrapper) else if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(H.incapacitated(INCAPACITATION_DISABLED | INCAPACITATION_RESTRAINED)) var/obj/item/parcel/wrapper = new wrapped_result_type(get_turf(target)) if(wrapper.make_parcel(target, user)) //Call this directly so it applies our fingerprints diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 1a1ecb8cd9c..e281cf1841a 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -58,7 +58,7 @@ sleep(5) // wait for animation to finish if(prob(35)) - for(var/mob/living/carbon/human/L in src) + for(var/mob/living/human/L in src) var/list/obj/item/organ/external/crush = L.get_damageable_organs() if(!crush.len) return diff --git a/code/modules/recycling/wrapped_package.dm b/code/modules/recycling/wrapped_package.dm index 9e85840711f..6aa4c487c83 100644 --- a/code/modules/recycling/wrapped_package.dm +++ b/code/modules/recycling/wrapped_package.dm @@ -268,7 +268,7 @@ /obj/item, /obj/structure, /obj/machinery, - /mob/living/carbon/human, + /mob/living/human, ) return type_whitelist diff --git a/code/modules/security levels/keycard_authentication.dm b/code/modules/security levels/keycard_authentication.dm index 6af4ec58fdc..3e65d1a901e 100644 --- a/code/modules/security levels/keycard_authentication.dm +++ b/code/modules/security levels/keycard_authentication.dm @@ -75,21 +75,21 @@ dat += "
  • Cannot modify the alert level at this time: [security_state.severe_security_level.name] engaged.
  • " else if(security_state.current_security_level == security_state.high_security_level) - dat += "
  • Disengage [security_state.high_security_level.name]
  • " + dat += "
  • Disengage [security_state.high_security_level.name]
  • " else - dat += "
  • Engage [security_state.high_security_level.name]
  • " + dat += "
  • Engage [security_state.high_security_level.name]
  • " if(!get_config_value(/decl/config/toggle/ert_admin_call_only)) - dat += "
  • Emergency Response Team
  • " + dat += "
  • Emergency Response Team
  • " - dat += "
  • Grant Emergency Maintenance Access
  • " - dat += "
  • Revoke Emergency Maintenance Access
  • " - dat += "
  • Grant Nuclear Authorization Code
  • " + dat += "
  • Grant Emergency Maintenance Access
  • " + dat += "
  • Revoke Emergency Maintenance Access
  • " + dat += "
  • Grant Nuclear Authorization Code
  • " dat += "" show_browser(user, dat, "window=keycard_auth;size=500x250") if(screen == 2) dat += "Please swipe your card to authorize the following event: [event]" - dat += "

    Back" + dat += "

    Back" show_browser(user, dat, "window=keycard_auth;size=500x250") return diff --git a/code/modules/shield_generators/shield.dm b/code/modules/shield_generators/shield.dm index 5b9ca7c6bf7..0adbc8ef951 100644 --- a/code/modules/shield_generators/shield.dm +++ b/code/modules/shield_generators/shield.dm @@ -130,7 +130,7 @@ // The closer we are to impact site, the longer it takes for shield to come back up. S.fail(-(-range + get_dist(src, S)) * 2) -/obj/effect/shield/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/effect/shield/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(!gen) qdel(src) return @@ -267,7 +267,7 @@ return !gen.check_flag(MODEFLAG_NONHUMANS) // Human mobs -/mob/living/carbon/human/can_pass_shield(var/obj/machinery/shield_generator/gen) +/mob/living/human/can_pass_shield(var/obj/machinery/shield_generator/gen) if(isSynthetic()) return !gen.check_flag(MODEFLAG_ANORGANIC) return !gen.check_flag(MODEFLAG_HUMANOIDS) diff --git a/code/modules/shuttles/antagonist.dm b/code/modules/shuttles/antagonist.dm index 00be092c6ba..9aa7aeee25f 100644 --- a/code/modules/shuttles/antagonist.dm +++ b/code/modules/shuttles/antagonist.dm @@ -7,9 +7,3 @@ name = "rescue shuttle control console" initial_access = list(access_cent_specops) shuttle_tag = "Rescue" - -/obj/machinery/computer/shuttle_control/multi/ninja - name = "stealth shuttle control console" - initial_access = list(access_ninja) - shuttle_tag = "Ninja" - diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index d350dc21c37..8003c296df8 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -237,25 +237,26 @@ bug.gib() else qdel(AM) //it just gets atomized I guess? TODO throw it into space somewhere, prevents people from using shuttles as an atom-smasher - for(var/area/A in shuttle_area) - // if there was a zlevel above our origin, erase our ceiling now we're leaving - if(HasAbove(current_location.z)) - for(var/turf/TO in A.contents) - var/turf/TA = GetAbove(TO) - if(istype(TA, ceiling_type)) - TA.ChangeTurf(get_base_turf_by_area(TA), 1, 1) - if(knockdown) + + if(knockdown) + for(var/area/A in shuttle_area) A.throw_unbuckled_occupants(4, 1) if(logging_home_tag) var/datum/shuttle_log/s_log = SSshuttle.shuttle_logs[src] s_log.handle_move(current_location, destination) - var/list/new_turfs = translate_turfs(turf_translation, current_location.base_area, current_location.base_turf, TRUE) + // if there's a zlevel above our destination, paint in a ceiling on it so we retain our air + create_translated_ceiling(FALSE, turf_translation) + + var/list/new_turfs = translate_turfs(turf_translation, current_location.base_area, current_location.base_turf, TRUE, TRUE) current_location = destination - // if there's a zlevel above our destination, paint in a ceiling on it so we retain our air - create_ceiling() + // remove the old ceiling, if it existed + for(var/turf/TO in turf_translation) + var/turf/TA = GetAbove(TO) + if(istype(TA, ceiling_type)) + TA.ChangeTurf(get_base_turf_by_area(TA), TRUE, TRUE, TRUE) handle_pipes_and_power_on_move(new_turfs) @@ -310,10 +311,28 @@ if(TD.turf_flags & TURF_FLAG_BACKGROUND) continue var/turf/TA = GetAbove(TD) - if(force || (istype(TA, get_base_turf_by_area(TA)) || (istype(TA) && TA.is_open()))) + if(!istype(TA)) + continue + if(force || (istype(TA, get_base_turf_by_area(TA)) || TA.is_open())) if(get_area(TA) in shuttle_area) continue - TA.ChangeTurf(ceiling_type, TRUE, TRUE, TRUE, TRUE) + TA.ChangeTurf(ceiling_type, TRUE, TRUE, TRUE) + +/datum/shuttle/proc/create_translated_ceiling(force, list/turf_translation) + for(var/turf/TS in turf_translation) + var/turf/TD = turf_translation[TS] + + if(TS.turf_flags & TURF_FLAG_BACKGROUND) + continue + var/turf/TAD = GetAbove(TD) + var/turf/TAS = GetAbove(TS) + if(!istype(TAD)) + continue + if(force || (istype(TAD, get_base_turf_by_area(TAD)) || TAD.is_open())) + // Check for multi-z shuttles. Don't create a ceiling where the shuttle is about to be. + if((istype(TAS) && (get_area(TAS) in shuttle_area))) + continue + TAD.ChangeTurf(ceiling_type, TRUE, TRUE, TRUE) //returns 1 if the shuttle has a valid arrive time /datum/shuttle/proc/has_arrive_time() diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index d3f1745af4f..3c28628e020 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -252,7 +252,7 @@ else if(!emagged && href_list["scanid"]) //They selected an empty entry. Try to scan their id. - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if (istype(H)) if (!read_authorization(H.get_active_held_item())) //try to read what's in their hand first read_authorization(H.get_equipped_item(slot_wear_id_str)) diff --git a/code/modules/species/outsider/random.dm b/code/modules/species/outsider/random.dm index 29f43d6fdf0..7dc435debf7 100644 --- a/code/modules/species/outsider/random.dm +++ b/code/modules/species/outsider/random.dm @@ -101,7 +101,7 @@ . = ..() -/decl/species/alium/get_species_blood_color(mob/living/carbon/human/H) +/decl/species/alium/get_species_blood_color(mob/living/human/H) if(istype(H) && H.isSynthetic()) return ..() return blood_color @@ -131,7 +131,7 @@ return TRUE to_chat(user, "You're now an alien humanoid of some undiscovered species. Make up what lore you want, no one knows a thing about your species! You can check info about your traits with Check Species Info verb in IC tab.") to_chat(user, "You can't speak any other languages by default. You can use translator implant that spawns on top of this monolith - it will give you knowledge of any language if you hear it enough times.") - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user new /obj/item/implanter/translator(get_turf(src)) H.change_species(SPECIES_ALIEN) var/decl/cultural_info/culture = H.get_cultural_value(TAG_CULTURE) diff --git a/code/modules/species/outsider/shadow.dm b/code/modules/species/outsider/shadow.dm index 9c71b34777d..f0c2147c401 100644 --- a/code/modules/species/outsider/shadow.dm +++ b/code/modules/species/outsider/shadow.dm @@ -34,7 +34,7 @@ species_flags = SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_EMBED -/decl/species/starlight/shadow/handle_environment_special(var/mob/living/carbon/human/H) +/decl/species/starlight/shadow/handle_environment_special(var/mob/living/human/H) if(H.is_in_stasis() || H.stat == DEAD || H.isSynthetic()) return var/light_amount = 0 diff --git a/code/modules/species/outsider/starlight.dm b/code/modules/species/outsider/starlight.dm index 6067e0c9093..261d2398329 100644 --- a/code/modules/species/outsider/starlight.dm +++ b/code/modules/species/outsider/starlight.dm @@ -64,7 +64,7 @@ splatter_desc = "A puddle of starstuff." splatter_colour = "#ffff00" -/decl/species/starlight/handle_death(var/mob/living/carbon/human/H) +/decl/species/starlight/handle_death(var/mob/living/human/H) addtimer(CALLBACK(H, TYPE_PROC_REF(/mob, dust)),0) /decl/species/starlight/starborn @@ -97,7 +97,7 @@ /obj/aura/starborn ) -/decl/species/starlight/starborn/handle_death(var/mob/living/carbon/human/H) +/decl/species/starlight/starborn/handle_death(var/mob/living/human/H) ..() var/turf/T = get_turf(H) T.add_to_reagents(/decl/material/liquid/fuel, 20) @@ -140,7 +140,7 @@ radiation_mod = 0 species_flags = SPECIES_FLAG_NO_MINOR_CUT | SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_EMBED | SPECIES_FLAG_NO_TANGLE -/decl/species/starlight/blueforged/handle_death(var/mob/living/carbon/human/H) +/decl/species/starlight/blueforged/handle_death(var/mob/living/human/H) ..() new /obj/effect/temporary(get_turf(H),11, 'icons/mob/mob.dmi', "liquify") diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index 3b40fb162a8..fec5d27cde6 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -386,9 +386,13 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 for(var/trait_type in traits) var/trait_level = traits[trait_type] - var/decl/trait/T = GET_DECL(trait_type) - if(!T.validate_level(trait_level)) + var/decl/trait/trait = GET_DECL(trait_type) + if(!trait.validate_level(trait_level)) . += "invalid levels for species trait [trait_type]" + if(name in trait.blocked_species) + . += "trait [trait.name] prevents this species from taking it" + if(trait.permitted_species && !(name in trait.permitted_species)) + . += "trait [trait.name] does not permit this species to take it" if(!length(blood_types)) . += "missing at least one blood type" @@ -400,22 +404,22 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 if(taste_sensitivity < 0) . += "taste_sensitivity ([taste_sensitivity]) was negative" -/decl/species/proc/equip_survival_gear(var/mob/living/carbon/human/H, var/box_type = /obj/item/box/survival) +/decl/species/proc/equip_survival_gear(var/mob/living/human/H, var/box_type = /obj/item/box/survival) var/obj/item/backpack/backpack = H.get_equipped_item(slot_back_str) if(istype(backpack)) H.equip_to_slot_or_del(new box_type(backpack), slot_in_backpack_str) else H.put_in_hands_or_del(new box_type(H)) -/decl/species/proc/get_manual_dexterity(var/mob/living/carbon/human/H) +/decl/species/proc/get_manual_dexterity(var/mob/living/human/H) . = manual_dexterity -/decl/species/proc/add_base_auras(var/mob/living/carbon/human/H) +/decl/species/proc/add_base_auras(var/mob/living/human/H) if(base_auras) for(var/type in base_auras) H.add_aura(new type(H), skip_icon_update = TRUE) -/decl/species/proc/remove_base_auras(var/mob/living/carbon/human/H) +/decl/species/proc/remove_base_auras(var/mob/living/human/H) if(base_auras) var/list/bcopy = base_auras.Copy() for(var/a in H.auras) @@ -425,69 +429,69 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 H.remove_aura(A) qdel(A) -/decl/species/proc/remove_inherent_verbs(var/mob/living/carbon/human/H) +/decl/species/proc/remove_inherent_verbs(var/mob/living/human/H) if(inherent_verbs) for(var/verb_path in inherent_verbs) H.verbs -= verb_path return -/decl/species/proc/add_inherent_verbs(var/mob/living/carbon/human/H) +/decl/species/proc/add_inherent_verbs(var/mob/living/human/H) if(inherent_verbs) for(var/verb_path in inherent_verbs) H.verbs |= verb_path return -/decl/species/proc/handle_post_spawn(var/mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment. +/decl/species/proc/handle_post_spawn(var/mob/living/human/H) //Handles anything not already covered by basic species assignment. add_inherent_verbs(H) add_base_auras(H) handle_movement_flags_setup(H) -/decl/species/proc/handle_pre_spawn(var/mob/living/carbon/human/H) +/decl/species/proc/handle_pre_spawn(var/mob/living/human/H) return -/decl/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events. +/decl/species/proc/handle_death(var/mob/living/human/H) //Handles any species-specific death events. return -/decl/species/proc/handle_sleeping(var/mob/living/carbon/human/H) +/decl/species/proc/handle_sleeping(var/mob/living/human/H) if(prob(2) && !H.failed_last_breath && !H.isSynthetic()) if(!HAS_STATUS(H, STAT_PARA)) H.emote(/decl/emote/audible/snore) else H.emote(/decl/emote/audible/groan) -/decl/species/proc/handle_environment_special(var/mob/living/carbon/human/H) +/decl/species/proc/handle_environment_special(var/mob/living/human/H) return -/decl/species/proc/handle_movement_delay_special(var/mob/living/carbon/human/H) +/decl/species/proc/handle_movement_delay_special(var/mob/living/human/H) return 0 // Used to update alien icons for aliens. -/decl/species/proc/handle_login_special(var/mob/living/carbon/human/H) +/decl/species/proc/handle_login_special(var/mob/living/human/H) return // As above. -/decl/species/proc/handle_logout_special(var/mob/living/carbon/human/H) +/decl/species/proc/handle_logout_special(var/mob/living/human/H) return -/decl/species/proc/can_overcome_gravity(var/mob/living/carbon/human/H) +/decl/species/proc/can_overcome_gravity(var/mob/living/human/H) return FALSE // Used for any extra behaviour when falling and to see if a species will fall at all. -/decl/species/proc/can_fall(var/mob/living/carbon/human/H) +/decl/species/proc/can_fall(var/mob/living/human/H) return TRUE // Used to override normal fall behaviour. Use only when the species does fall down a level. -/decl/species/proc/handle_fall_special(var/mob/living/carbon/human/H, var/turf/landing) +/decl/species/proc/handle_fall_special(var/mob/living/human/H, var/turf/landing) return FALSE //Used for swimming -/decl/species/proc/can_float(var/mob/living/carbon/human/H) +/decl/species/proc/can_float(var/mob/living/human/H) if(!H.is_physically_disabled()) return TRUE //We could tie it to stamina return FALSE // Called when using the shredding behavior. -/decl/species/proc/can_shred(var/mob/living/carbon/human/H, var/ignore_intent, var/ignore_antag) +/decl/species/proc/can_shred(var/mob/living/human/H, var/ignore_intent, var/ignore_antag) if((!ignore_intent && H.a_intent != I_HURT) || H.pulling_punches) return 0 @@ -503,7 +507,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 return 1 return 0 -/decl/species/proc/handle_vision(var/mob/living/carbon/human/H) +/decl/species/proc/handle_vision(var/mob/living/human/H) var/list/vision = H.get_accumulated_vision_handlers() H.update_sight() H.set_sight(H.sight|get_vision_flags(H)|H.equipment_vision_flags|vision[1]) @@ -541,9 +545,9 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 return 1 -/decl/species/proc/get_how_nearsighted(var/mob/living/carbon/human/H) +/decl/species/proc/get_how_nearsighted(var/mob/living/human/H) var/prescriptions = short_sighted - if(H.disabilities & NEARSIGHTED) + if(H.has_genetic_condition(GENE_COND_NEARSIGHTED)) prescriptions += 7 if(H.equipment_prescription) prescriptions -= H.equipment_prescription @@ -565,24 +569,24 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 light -= H.equipment_light_protection return clamp(max(prescriptions, light), 0, 7) -/decl/species/proc/handle_additional_hair_loss(var/mob/living/carbon/human/H, var/defer_body_update = TRUE) +/decl/species/proc/handle_additional_hair_loss(var/mob/living/human/H, var/defer_body_update = TRUE) return FALSE -/decl/species/proc/get_blood_decl(var/mob/living/carbon/human/H) +/decl/species/proc/get_blood_decl(var/mob/living/human/H) if(istype(H) && H.isSynthetic()) return GET_DECL(/decl/blood_type/coolant) return get_blood_type_by_name(blood_types[1]) -/decl/species/proc/get_blood_name(var/mob/living/carbon/human/H) +/decl/species/proc/get_blood_name(var/mob/living/human/H) var/decl/blood_type/blood = get_blood_decl(H) return istype(blood) ? blood.splatter_name : "blood" -/decl/species/proc/get_species_blood_color(var/mob/living/carbon/human/H) +/decl/species/proc/get_species_blood_color(var/mob/living/human/H) var/decl/blood_type/blood = get_blood_decl(H) return istype(blood) ? blood.splatter_colour : COLOR_BLOOD_HUMAN // Impliments different trails for species depending on if they're wearing shoes. -/decl/species/proc/get_move_trail(var/mob/living/carbon/human/H) +/decl/species/proc/get_move_trail(var/mob/living/human/H) if(H.current_posture.prone) return /obj/effect/decal/cleanable/blood/tracks/body var/obj/item/clothing/suit = H.get_equipped_item(slot_wear_suit_str) @@ -593,13 +597,13 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 return shoes.move_trail return move_trail -/decl/species/proc/handle_trail(var/mob/living/carbon/human/H, var/turf/T) +/decl/species/proc/handle_trail(var/mob/living/human/H, var/turf/T) return -/decl/species/proc/update_skin(var/mob/living/carbon/human/H) +/decl/species/proc/update_skin(var/mob/living/human/H) return -/decl/species/proc/disarm_attackhand(var/mob/living/carbon/human/attacker, var/mob/living/carbon/human/target) +/decl/species/proc/disarm_attackhand(var/mob/living/human/attacker, var/mob/living/human/target) attacker.do_attack_animation(target) var/obj/item/uniform = target.get_equipped_item(slot_w_uniform_str) @@ -649,7 +653,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 playsound(target.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) target.visible_message("[attacker] attempted to disarm \the [target]!") -/decl/species/proc/disfigure_msg(var/mob/living/carbon/human/H) //Used for determining the message a disfigured face has on examine. To add a unique message, just add this onto a specific species and change the "return" message. +/decl/species/proc/disfigure_msg(var/mob/living/human/H) //Used for determining the message a disfigured face has on examine. To add a unique message, just add this onto a specific species and change the "return" message. var/decl/pronouns/G = H.get_pronouns() return SPAN_DANGER("[G.His] face is horribly mangled!\n") @@ -683,23 +687,23 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 if(31 to 45) . = 4 else . = 8 -/decl/species/proc/check_no_slip(var/mob/living/carbon/human/H) +/decl/species/proc/check_no_slip(var/mob/living/human/H) if(can_overcome_gravity(H)) return TRUE return (species_flags & SPECIES_FLAG_NO_SLIP) // This assumes you've already checked that their bodytype can feel pain. -/decl/species/proc/get_pain_emote(var/mob/living/carbon/human/H, var/pain_power) +/decl/species/proc/get_pain_emote(var/mob/living/human/H, var/pain_power) for(var/pain_emotes in pain_emotes_with_pain_level) var/pain_level = pain_emotes_with_pain_level[pain_emotes] if(pain_level >= pain_power) // This assumes that if a pain-level has been defined it also has a list of emotes to go with it return pick(pain_emotes) -/decl/species/proc/handle_post_move(var/mob/living/carbon/human/H) +/decl/species/proc/handle_post_move(var/mob/living/human/H) handle_exertion(H) -/decl/species/proc/handle_exertion(mob/living/carbon/human/H) +/decl/species/proc/handle_exertion(mob/living/human/H) if (!exertion_effect_chance) return var/chance = max((100 - H.stamina), exertion_effect_chance * H.encumbrance()) @@ -726,12 +730,12 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 /decl/species/proc/get_default_name() return "[lowertext(name)] ([random_id(name, 100, 999)])" -/decl/species/proc/get_holder_color(var/mob/living/carbon/human/H) +/decl/species/proc/get_holder_color(var/mob/living/human/H) return //Called after a mob's species is set, organs were created, and we're about to update the icon, color, and etc of the mob being created. //Consider this might be called post-init -/decl/species/proc/apply_appearance(var/mob/living/carbon/human/H) +/decl/species/proc/apply_appearance(var/mob/living/human/H) H.icon_state = lowertext(src.name) /decl/species/proc/get_preview_icon() @@ -739,7 +743,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 // TODO: generate an icon based on all available bodytypes. - var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin("#species_[ckey(name)]") + var/mob/living/human/dummy/mannequin/mannequin = get_mannequin("#species_[ckey(name)]") if(mannequin) mannequin.change_species(name) // handles species/bodytype init @@ -760,7 +764,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 return preview_icon -/decl/species/proc/handle_movement_flags_setup(var/mob/living/carbon/human/H) +/decl/species/proc/handle_movement_flags_setup(var/mob/living/human/H) H.mob_bump_flag = bump_flag H.mob_swap_flags = swap_flags H.mob_push_flags = push_flags diff --git a/code/modules/species/species_attack.dm b/code/modules/species/species_attack.dm index b09bfdacc0d..0c1fe901f76 100644 --- a/code/modules/species/species_attack.dm +++ b/code/modules/species/species_attack.dm @@ -20,10 +20,10 @@ usable_with_limbs = list(BP_L_HAND, BP_R_HAND) var/blocked_by_gloves = TRUE -/decl/natural_attack/claws/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) +/decl/natural_attack/claws/is_usable(var/mob/living/human/user, var/mob/living/human/target, var/zone) return (!user.get_equipped_item(slot_gloves_str) || !blocked_by_gloves) -/decl/natural_attack/claws/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/claws/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(!affecting) return ..() @@ -102,7 +102,7 @@ /decl/natural_attack/stomp/weak/get_unarmed_damage(mob/living/user, mob/living/victim) return damage -/decl/natural_attack/stomp/weak/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/stomp/weak/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(affecting) user.visible_message(SPAN_WARNING("\The [user] jumped up and down on \the [target]'s [affecting.name]!")) @@ -124,7 +124,7 @@ BP_GROIN ) -/decl/natural_attack/tail/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) //ensures that you can't tail someone in the skull +/decl/natural_attack/tail/is_usable(var/mob/living/human/user, var/mob/living/human/target, var/zone) //ensures that you can't tail someone in the skull if(!(zone in can_hit_zones)) return FALSE for(var/foot_tag in list(BP_L_FOOT, BP_R_FOOT)) @@ -132,7 +132,7 @@ return TRUE return FALSE -/decl/natural_attack/tail/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/tail/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(!affecting) diff --git a/code/modules/species/species_bodytype.dm b/code/modules/species/species_bodytype.dm index 3af81b7759e..8169aa70bbb 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/species/species_bodytype.dm @@ -490,11 +490,12 @@ var/global/list/bodytypes_by_category = list() if(tail_data) var/obj/item/organ/external/tail/tail_organ = LAZYACCESS(tail_data, "path") if(ispath(tail_organ, /obj/item/organ/external/tail)) - var/use_species = get_user_species_for_validation() + var/decl/species/use_species = get_user_species_for_validation() if(use_species) - var/datum/dna/dummy_dna = new - dummy_dna.species = use_species - tail_organ = new tail_organ(null, null, dummy_dna, src) + var/datum/mob_snapshot/dummy_appearance = new + dummy_appearance.root_species = use_species + dummy_appearance.root_bodytype = src + tail_organ = new tail_organ(null, null, dummy_appearance) var/tail_icon = tail_organ.get_tail_icon() var/tail_state = tail_organ.get_tail() if(tail_icon && tail_state) @@ -506,7 +507,7 @@ var/global/list/bodytypes_by_category = list() if(!tail_state) . += "missing tail state" qdel(tail_organ) - qdel(dummy_dna) + qdel(dummy_appearance) else . += "could not find a species with this bodytype available for tail organ validation" else @@ -554,7 +555,7 @@ var/global/list/bodytypes_by_category = list() E.encased = apply_encased[E.organ_tag] //fully_replace: If true, all existing organs will be discarded. Useful when doing mob transformations, and not caring about the existing organs -/decl/bodytype/proc/create_missing_organs(mob/living/carbon/human/H, fully_replace = FALSE) +/decl/bodytype/proc/create_missing_organs(mob/living/human/H, fully_replace = FALSE) if(fully_replace) H.delete_organs() @@ -573,12 +574,15 @@ var/global/list/bodytypes_by_category = list() qdel(O) //Create missing limbs + var/datum/mob_snapshot/supplied_data = H.get_mob_snapshot(force = TRUE) + supplied_data.root_bodytype = src // This may not have been set on the target mob torso yet. + for(var/limb_type in has_limbs) if(GET_EXTERNAL_ORGAN(H, limb_type)) //Skip existing continue var/list/organ_data = has_limbs[limb_type] var/limb_path = organ_data["path"] - var/obj/item/organ/external/E = new limb_path(H, null, H.dna, src) //explicitly specify the dna and bodytype + var/obj/item/organ/external/E = new limb_path(H, null, supplied_data) //explicitly specify the dna and bodytype if(E.parent_organ) var/list/parent_organ_data = has_limbs[E.parent_organ] parent_organ_data["has_children"]++ @@ -589,7 +593,7 @@ var/global/list/bodytypes_by_category = list() if(GET_INTERNAL_ORGAN(H, organ_tag)) //Skip existing continue var/organ_type = has_organ[organ_tag] - var/obj/item/organ/O = new organ_type(H, null, H.dna, src) + var/obj/item/organ/O = new organ_type(H, null, supplied_data) if(organ_tag != O.organ_tag) warning("[O.type] has a default organ tag \"[O.organ_tag]\" that differs from the species' organ tag \"[organ_tag]\". Updating organ_tag to match.") O.organ_tag = organ_tag @@ -610,7 +614,7 @@ var/global/list/bodytypes_by_category = list() /decl/bodytype/proc/get_limb_from_zone(limb) . = length(LAZYACCESS(limb_mapping, limb)) ? pick(limb_mapping[limb]) : limb -/decl/bodytype/proc/check_vital_organ_missing(mob/living/carbon/H) +/decl/bodytype/proc/check_vital_organ_missing(mob/living/H) if(length(vital_organs)) for(var/organ_tag in vital_organs) var/obj/item/organ/O = H.get_organ(organ_tag, /obj/item/organ) @@ -650,17 +654,17 @@ var/global/list/bodytypes_by_category = list() if(O) O.set_sprite_accessory(accessory, null, accessory_colour, skip_update = TRUE) -/decl/bodytype/proc/customize_preview_mannequin(mob/living/carbon/human/dummy/mannequin/mannequin) +/decl/bodytype/proc/customize_preview_mannequin(mob/living/human/dummy/mannequin/mannequin) set_default_sprite_accessories(mannequin) mannequin.set_eye_colour(base_eye_color, skip_update = TRUE) mannequin.force_update_limbs() - mannequin.update_mutations(0) + mannequin.update_genetic_conditions(0) mannequin.update_body(0) mannequin.update_underwear(0) mannequin.update_hair(0) mannequin.update_icon() -/decl/species/proc/customize_preview_mannequin(mob/living/carbon/human/dummy/mannequin/mannequin) +/decl/species/proc/customize_preview_mannequin(mob/living/human/dummy/mannequin/mannequin) if(preview_outfit) var/decl/hierarchy/outfit/outfit = outfit_by_type(preview_outfit) outfit.equip_outfit(mannequin, equip_adjustments = (OUTFIT_ADJUSTMENT_SKIP_SURVIVAL_GEAR|OUTFIT_ADJUSTMENT_SKIP_BACKPACK)) @@ -697,9 +701,11 @@ var/global/list/bodytypes_by_category = list() qdel(innard) // Install any necessary new organs. + var/datum/mob_snapshot/supplied_data = limb.owner.get_mob_snapshot(force = TRUE) + supplied_data.root_bodytype = src for(var/organ_tag in replacing_organs) var/organ_type = replacing_organs[organ_tag] - var/obj/item/organ/internal/new_innard = new organ_type(limb.owner, null, limb.owner.dna, src) + var/obj/item/organ/internal/new_innard = new organ_type(limb.owner, null, supplied_data) limb.owner.add_organ(new_innard, GET_EXTERNAL_ORGAN(limb.owner, new_innard.parent_organ), FALSE, FALSE) /decl/bodytype/proc/get_body_temperature_threshold(var/threshold) @@ -719,7 +725,7 @@ var/global/list/bodytypes_by_category = list() else CRASH("get_species_temperature_threshold() called with invalid threshold value.") -/decl/bodytype/proc/get_environment_discomfort(var/mob/living/carbon/human/H, var/msg_type) +/decl/bodytype/proc/get_environment_discomfort(var/mob/living/human/H, var/msg_type) if(!prob(5)) return @@ -745,7 +751,7 @@ var/global/list/bodytypes_by_category = list() for(var/species_name in get_all_species()) var/decl/species/species = get_species_by_key(species_name) if(src in species.available_bodytypes) - return species_name + return species // Defined as a global so modpacks can add to it. var/global/list/limbs_with_nails = list( @@ -764,5 +770,5 @@ var/global/list/limbs_with_nails = list( ) return null -/decl/bodytype/proc/get_movement_slowdown(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_movement_slowdown(var/mob/living/human/H) return movement_slowdown diff --git a/code/modules/species/species_bodytype_helpers.dm b/code/modules/species/species_bodytype_helpers.dm index 4c84704d906..8736740277b 100644 --- a/code/modules/species/species_bodytype_helpers.dm +++ b/code/modules/species/species_bodytype_helpers.dm @@ -1,4 +1,4 @@ -/decl/bodytype/proc/get_ignited_icon(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_ignited_icon(var/mob/living/human/H) return ignited_icon /decl/bodytype/proc/get_icon_cache_uid(var/mob/H) @@ -6,41 +6,53 @@ icon_cache_uid = "[sequential_id(/decl/bodytype)]" return icon_cache_uid -/decl/bodytype/proc/get_bandages_icon(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_bandages_icon(var/mob/living/human/H) return bandages_icon -/decl/bodytype/proc/get_blood_overlays(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_blood_overlays(var/mob/living/human/H) return blood_overlays -/decl/bodytype/proc/get_damage_overlays(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_damage_overlays(var/mob/living/human/H) return damage_overlays -/decl/bodytype/proc/get_husk_icon(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_husk_icon(var/mob/living/human/H) return husk_icon -/decl/bodytype/proc/get_skeletal_icon(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_skeletal_icon(var/mob/living/human/H) return skeletal_icon /decl/bodytype/proc/get_cosmetics_icon(var/decl/sprite_accessory/cosmetics/cosmetics_style) return cosmetics_icon -/decl/bodytype/proc/get_vulnerable_location(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_vulnerable_location(var/mob/living/human/H) return vulnerable_location -/decl/bodytype/proc/get_base_icon(var/mob/living/carbon/human/H, var/get_deform) +/decl/bodytype/proc/get_base_icon(var/mob/living/human/H, var/get_deform) return get_deform ? icon_deformed : icon_base /decl/bodytype/proc/handle_post_bodytype_pref_set(datum/preferences/pref) if(!pref) return // Markings used to be cleared outside of here, but it was always done before every call, so it was moved in here. - pref.sprite_accessories = list() + // remove invalid accessories for our new bodytype. don't clear the list directly as we did before, to preserve in the case of no default + var/decl/species/mob_species = get_species_by_key(pref.species) + var/decl/bodytype/mob_bodytype = mob_species.get_bodytype_by_name(pref.bodytype) || mob_species.default_bodytype + for(var/acc_cat in pref.sprite_accessories) + if(!(acc_cat in mob_species.available_accessory_categories)) + pref.sprite_accessories -= acc_cat + continue + var/decl/sprite_accessory_category/accessory_category = GET_DECL(acc_cat) + for(var/acc in pref.sprite_accessories[acc_cat]) + var/decl/sprite_accessory/accessory = GET_DECL(acc) + if(!istype(accessory, accessory_category.base_accessory_type) || !accessory.accessory_is_available(get_mannequin(pref.client?.ckey), mob_species, mob_bodytype)) + pref.sprite_accessories[acc_cat] -= acc + // apply the defaults for(var/accessory_category in default_sprite_accessories) pref.sprite_accessories[accessory_category] = list() for(var/accessory in default_sprite_accessories[accessory_category]) pref.sprite_accessories[accessory_category][accessory] = default_sprite_accessories[accessory_category][accessory] -/decl/bodytype/proc/apply_appearance(var/mob/living/carbon/human/H) +/decl/bodytype/proc/apply_appearance(var/mob/living/human/H) if(base_color) H.set_skin_colour(base_color) diff --git a/code/modules/species/species_bodytype_quadruped.dm b/code/modules/species/species_bodytype_quadruped.dm index d9032a96e14..5673e68d89d 100644 --- a/code/modules/species/species_bodytype_quadruped.dm +++ b/code/modules/species/species_bodytype_quadruped.dm @@ -19,7 +19,7 @@ var/ridable = TRUE var/riding_offset = @"{'x':0,'y':0,'z':8}" -/decl/bodytype/quadruped/apply_appearance(var/mob/living/carbon/human/H) +/decl/bodytype/quadruped/apply_appearance(var/mob/living/human/H) . = ..() H.can_buckle = ridable H.buckle_pixel_shift = riding_offset \ No newline at end of file diff --git a/code/modules/species/species_bodytype_random.dm b/code/modules/species/species_bodytype_random.dm index 446b7581764..2e79046a92f 100644 --- a/code/modules/species/species_bodytype_random.dm +++ b/code/modules/species/species_bodytype_random.dm @@ -9,7 +9,7 @@ } #define SETUP_RANDOM_COLOR_SETTER(X, Y)\ -/mob/living/carbon/human/proc/randomize_##X(){\ +/mob/living/human/proc/randomize_##X(){\ var/decl/bodytype/root_bodytype = get_bodytype();\ if(!root_bodytype){\ return;\ @@ -45,7 +45,7 @@ SETUP_RANDOM_COLOR_SETTER(eye_color, set_eye_colour) /decl/bodytype/proc/get_random_skin_tone() return random_skin_tone(src) -/mob/living/carbon/human/proc/randomize_skin_tone() +/mob/living/human/proc/randomize_skin_tone() var/decl/bodytype/root_bodytype = get_bodytype() if(!root_bodytype) return diff --git a/code/modules/species/species_getters.dm b/code/modules/species/species_getters.dm index 04dd947cbe2..90b97759adc 100644 --- a/code/modules/species/species_getters.dm +++ b/code/modules/species/species_getters.dm @@ -1,40 +1,40 @@ -/decl/species/proc/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H) +/decl/species/proc/get_valid_shapeshifter_forms(var/mob/living/human/H) return list() -/decl/species/proc/get_additional_examine_text(var/mob/living/carbon/human/H) +/decl/species/proc/get_additional_examine_text(var/mob/living/human/H) return -/decl/species/proc/get_knockout_message(var/mob/living/carbon/human/H) +/decl/species/proc/get_knockout_message(var/mob/living/human/H) return ((H && H.isSynthetic()) ? "encounters a hardware fault and suddenly reboots!" : knockout_message) -/decl/species/proc/get_species_death_message(var/mob/living/carbon/human/H) +/decl/species/proc/get_species_death_message(var/mob/living/human/H) return ((H && H.isSynthetic()) ? "gives one shrill beep before falling lifeless." : death_message) -/decl/species/proc/get_ssd(var/mob/living/carbon/human/H) +/decl/species/proc/get_ssd(var/mob/living/human/H) return ((H && H.isSynthetic()) ? "flashing a 'system offline' glyph on their monitor" : show_ssd) -/decl/species/proc/get_species_flesh_color(var/mob/living/carbon/human/H) +/decl/species/proc/get_species_flesh_color(var/mob/living/human/H) return ((H && H.isSynthetic()) ? SYNTH_FLESH_COLOUR : flesh_color) -/decl/species/proc/get_vision_flags(var/mob/living/carbon/human/H) +/decl/species/proc/get_vision_flags(var/mob/living/human/H) return vision_flags -/decl/species/proc/get_surgery_overlay_icon(var/mob/living/carbon/human/H) +/decl/species/proc/get_surgery_overlay_icon(var/mob/living/human/H) return 'icons/mob/surgery.dmi' -/decl/species/proc/get_footstep(var/mob/living/carbon/human/H, var/footstep_type) +/decl/species/proc/get_footstep(var/mob/living/human/H, var/footstep_type) return -/decl/species/proc/get_brute_mod(var/mob/living/carbon/human/H) +/decl/species/proc/get_brute_mod(var/mob/living/human/H) . = brute_mod -/decl/species/proc/get_burn_mod(var/mob/living/carbon/human/H) +/decl/species/proc/get_burn_mod(var/mob/living/human/H) . = burn_mod -/decl/species/proc/get_radiation_mod(var/mob/living/carbon/human/H) +/decl/species/proc/get_radiation_mod(var/mob/living/human/H) . = (H && H.isSynthetic() ? 0.5 : radiation_mod) -/decl/species/proc/get_root_species_name(var/mob/living/carbon/human/H) +/decl/species/proc/get_root_species_name(var/mob/living/human/H) return name /decl/species/proc/get_bodytype_by_name(var/bodytype_name) @@ -48,6 +48,6 @@ /decl/species/proc/get_bodytype_by_pronouns(var/decl/pronouns/pronouns) if(istype(pronouns)) for(var/decl/bodytype/bodytype in available_bodytypes) - if(bodytype.associated_gender == pronouns.name) + if(!isnull(bodytype.associated_gender) && bodytype.associated_gender == pronouns.name) return bodytype return default_bodytype diff --git a/code/modules/species/species_helpers.dm b/code/modules/species/species_helpers.dm index 4568a520d5c..5bd257fa5bc 100644 --- a/code/modules/species/species_helpers.dm +++ b/code/modules/species/species_helpers.dm @@ -5,12 +5,12 @@ var/global/list/stored_shock_by_ref = list() target.electrocute_act(stored_shock_by_ref["\ref[src]"]*0.9, src) stored_shock_by_ref["\ref[src]"] = 0 -/decl/species/proc/toggle_stance(var/mob/living/carbon/human/H) +/decl/species/proc/toggle_stance(var/mob/living/human/H) if(!H.incapacitated()) H.pulling_punches = !H.pulling_punches to_chat(H, "You are now [H.pulling_punches ? "pulling your punches" : "not pulling your punches"].") -/decl/species/proc/fluid_act(var/mob/living/carbon/human/H, var/datum/reagents/fluids) +/decl/species/proc/fluid_act(var/mob/living/human/H, var/datum/reagents/fluids) SHOULD_CALL_PARENT(TRUE) var/water = REAGENT_VOLUME(fluids, /decl/material/liquid/water) if(water >= 40 && H.get_damage(PAIN)) @@ -23,7 +23,7 @@ var/global/list/stored_shock_by_ref = list() return FALSE else if(!isnull(max_players)) var/player_count = 0 - for(var/mob/living/carbon/human/H in global.living_mob_list_) + for(var/mob/living/human/H in global.living_mob_list_) if(H.client && H.key && H.species == src) player_count++ if(player_count >= max_players) @@ -42,23 +42,23 @@ var/global/list/stored_shock_by_ref = list() // pref.hair_colour = default_bodytype.base_hair_color // pref.facial_hair_colour = default_bodytype.base_hair_color -/decl/species/proc/equip_default_fallback_uniform(var/mob/living/carbon/human/H) +/decl/species/proc/equip_default_fallback_uniform(var/mob/living/human/H) if(istype(H)) - H.equip_to_slot_or_del(new /obj/item/clothing/under/harness, slot_w_uniform_str) + H.equip_to_slot_or_del(new /obj/item/clothing/shirt/harness, slot_w_uniform_str) -/decl/species/proc/get_hazard_high_pressure(var/mob/living/carbon/human/H) +/decl/species/proc/get_hazard_high_pressure(var/mob/living/human/H) return hazard_high_pressure -/decl/species/proc/get_warning_high_pressure(var/mob/living/carbon/human/H) +/decl/species/proc/get_warning_high_pressure(var/mob/living/human/H) return warning_high_pressure -/decl/species/proc/get_warning_low_pressure(var/mob/living/carbon/human/H) +/decl/species/proc/get_warning_low_pressure(var/mob/living/human/H) return warning_low_pressure -/decl/species/proc/get_hazard_low_pressure(var/mob/living/carbon/human/H) +/decl/species/proc/get_hazard_low_pressure(var/mob/living/human/H) return hazard_low_pressure -/decl/species/proc/get_shock_vulnerability(var/mob/living/carbon/human/H) +/decl/species/proc/get_shock_vulnerability(var/mob/living/human/H) return shock_vulnerability /decl/species/proc/adjust_status(mob/living/target, condition, amount) diff --git a/code/modules/species/species_shapeshifter.dm b/code/modules/species/species_shapeshifter.dm index 3252cb8e682..ef3d68dd66b 100644 --- a/code/modules/species/species_shapeshifter.dm +++ b/code/modules/species/species_shapeshifter.dm @@ -6,10 +6,10 @@ var/global/list/wrapped_species_by_ref = list() /decl/species/shapeshifter available_bodytypes = list(/decl/bodytype/shapeshifter) inherent_verbs = list( - /mob/living/carbon/human/proc/shapeshifter_select_shape, - /mob/living/carbon/human/proc/shapeshifter_select_hair, - /mob/living/carbon/human/proc/shapeshifter_select_gender, - /mob/living/carbon/human/proc/shapeshifter_select_colour + /mob/living/human/proc/shapeshifter_select_shape, + /mob/living/human/proc/shapeshifter_select_hair, + /mob/living/human/proc/shapeshifter_select_gender, + /mob/living/human/proc/shapeshifter_select_colour ) var/list/valid_transform_species = list() var/monochromatic @@ -20,31 +20,31 @@ var/global/list/wrapped_species_by_ref = list() valid_transform_species |= default_form . = ..() -/decl/species/shapeshifter/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H) +/decl/species/shapeshifter/get_valid_shapeshifter_forms(var/mob/living/human/H) return valid_transform_species -/decl/species/shapeshifter/get_root_species_name(var/mob/living/carbon/human/H) +/decl/species/shapeshifter/get_root_species_name(var/mob/living/human/H) if(!H) return ..() var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) return S.get_root_species_name(H) -/decl/species/shapeshifter/handle_pre_spawn(var/mob/living/carbon/human/H) +/decl/species/shapeshifter/handle_pre_spawn(var/mob/living/human/H) ..() wrapped_species_by_ref["\ref[H]"] = default_form -/decl/species/shapeshifter/handle_post_spawn(var/mob/living/carbon/human/H) +/decl/species/shapeshifter/handle_post_spawn(var/mob/living/human/H) if(monochromatic) var/skin_colour = H.get_skin_colour() SET_HAIR_COLOUR(H, skin_colour, TRUE) SET_FACIAL_HAIR_COLOUR(H, skin_colour, TRUE) ..() -/decl/species/shapeshifter/get_pain_emote(var/mob/living/carbon/human/H, var/pain_power) +/decl/species/shapeshifter/get_pain_emote(var/mob/living/human/H, var/pain_power) var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) return S.get_pain_emote(H, pain_power) // Verbs follow. -/mob/living/carbon/human/proc/shapeshifter_select_hair() +/mob/living/human/proc/shapeshifter_select_hair() set name = "Select Hair" set category = "Abilities" @@ -66,7 +66,7 @@ var/global/list/wrapped_species_by_ref = list() var/decl/sprite_accessory/new_hair = input("Select a facial hair style.", "Shapeshifter Hair") as null|anything in beardstyles SET_FACIAL_HAIR_STYLE(src, (new_hair ? new_hair.type : /decl/sprite_accessory/facial_hair/shaved), FALSE) -/mob/living/carbon/human/proc/shapeshifter_select_gender() +/mob/living/human/proc/shapeshifter_select_gender() set name = "Select Gender" set category = "Abilities" @@ -83,7 +83,7 @@ var/global/list/wrapped_species_by_ref = list() visible_message("\The [src]'s form contorts subtly.") set_gender(new_gender, TRUE) -/mob/living/carbon/human/proc/shapeshifter_select_shape() +/mob/living/human/proc/shapeshifter_select_shape() set name = "Select Body Shape" set category = "Abilities" @@ -101,7 +101,7 @@ var/global/list/wrapped_species_by_ref = list() visible_message("\The [src] shifts and contorts, taking the form of \a ["\improper [new_species]"]!") try_refresh_visible_overlays() -/mob/living/carbon/human/proc/shapeshifter_select_colour() +/mob/living/human/proc/shapeshifter_select_colour() set name = "Select Body Colour" set category = "Abilities" @@ -116,7 +116,7 @@ var/global/list/wrapped_species_by_ref = list() return shapeshifter_set_colour(new_skin) -/mob/living/carbon/human/proc/shapeshifter_set_colour(var/new_skin) +/mob/living/human/proc/shapeshifter_set_colour(var/new_skin) set_skin_colour(new_skin, skip_update = TRUE) var/decl/species/shapeshifter/S = species if(S.monochromatic) diff --git a/code/modules/species/species_shapeshifter_bodytypes.dm b/code/modules/species/species_shapeshifter_bodytypes.dm index 80ca137744f..3341259ea98 100644 --- a/code/modules/species/species_shapeshifter_bodytypes.dm +++ b/code/modules/species/species_shapeshifter_bodytypes.dm @@ -13,22 +13,22 @@ return DISMEMBER_METHOD_BLUNT return ..() -/decl/bodytype/shapeshifter/get_base_icon(var/mob/living/carbon/human/H, var/get_deform) +/decl/bodytype/shapeshifter/get_base_icon(var/mob/living/human/H, var/get_deform) if(!H) return ..(null, get_deform) var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) return S.default_bodytype.get_base_icon(H, get_deform) -/decl/bodytype/shapeshifter/get_blood_overlays(var/mob/living/carbon/human/H) +/decl/bodytype/shapeshifter/get_blood_overlays(var/mob/living/human/H) if(!H) return ..() var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) return S.default_bodytype.get_blood_overlays(H) -/decl/bodytype/shapeshifter/get_damage_overlays(var/mob/living/carbon/human/H) +/decl/bodytype/shapeshifter/get_damage_overlays(var/mob/living/human/H) if(!H) return ..() var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) return S.default_bodytype.get_damage_overlays(H) -/decl/bodytype/shapeshifter/get_husk_icon(var/mob/living/carbon/human/H) +/decl/bodytype/shapeshifter/get_husk_icon(var/mob/living/human/H) if(H) var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) if(S) return S.default_bodytype.get_husk_icon(H) diff --git a/code/modules/species/station/golem.dm b/code/modules/species/station/golem.dm index 9b79b87ed00..da23b45db89 100644 --- a/code/modules/species/station/golem.dm +++ b/code/modules/species/station/golem.dm @@ -39,7 +39,7 @@ traits = list(/decl/trait/metabolically_inert = TRAIT_LEVEL_EXISTS) -/decl/species/golem/handle_post_spawn(var/mob/living/carbon/human/H) +/decl/species/golem/handle_post_spawn(var/mob/living/human/H) if(H.mind) H.mind.reset() H.mind.assigned_role = "Golem" diff --git a/code/modules/species/station/human.dm b/code/modules/species/station/human.dm index 39088dd7d9d..89657af619a 100644 --- a/code/modules/species/station/human.dm +++ b/code/modules/species/station/human.dm @@ -6,7 +6,7 @@ description = "A medium-sized creature prone to great ambition. If you are reading this, you are probably a human." hidden_from_codex = FALSE spawn_flags = SPECIES_CAN_JOIN - inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) + inherent_verbs = list(/mob/living/human/proc/tie_hair) // Add /decl/bodytype/prosthetic/basic_human to this list to allow full-body prosthetics. available_bodytypes = list( @@ -30,14 +30,14 @@ /decl/emote/exertion/synthetic/creak ) -/decl/species/human/get_root_species_name(var/mob/living/carbon/human/H) +/decl/species/human/get_root_species_name(var/mob/living/human/H) return SPECIES_HUMAN -/decl/species/human/get_ssd(var/mob/living/carbon/human/H) +/decl/species/human/get_ssd(var/mob/living/human/H) if(H.stat == CONSCIOUS) return "staring blankly, not reacting to your presence" return ..() -/decl/species/human/equip_default_fallback_uniform(var/mob/living/carbon/human/H) +/decl/species/human/equip_default_fallback_uniform(var/mob/living/human/H) if(istype(H)) H.equip_to_slot_or_del(new /obj/item/clothing/jumpsuit/grey, slot_w_uniform_str) diff --git a/code/modules/spells/aoe_turf/conjure/faithful_hound.dm b/code/modules/spells/aoe_turf/conjure/faithful_hound.dm index 2a2a6c8a987..69ffe55db6c 100644 --- a/code/modules/spells/aoe_turf/conjure/faithful_hound.dm +++ b/code/modules/spells/aoe_turf/conjure/faithful_hound.dm @@ -17,8 +17,3 @@ ..() var/password = sanitize(input("What password will this beast listen to?") as text, MAX_NAME_LEN) newVars = list("password" = password, "allowed_mobs" = list(usr)) - -/spell/aoe_turf/conjure/faithful_hound/tower - desc = "This spell allows you to summon a singular spectral dog that guards the nearby area. Anyone without the password is barked at or bitten." - charge_max = 1 - spell_flags = 0 diff --git a/code/modules/spells/aoe_turf/conjure/force_portal.dm b/code/modules/spells/aoe_turf/conjure/force_portal.dm index 7a4483435cf..b81c05f8020 100644 --- a/code/modules/spells/aoe_turf/conjure/force_portal.dm +++ b/code/modules/spells/aoe_turf/conjure/force_portal.dm @@ -10,8 +10,3 @@ cast_sound = null hud_state = "wiz_force" - -/spell/aoe_turf/conjure/force_portal/tower - desc = "This spell allows you to summon a force portal. Anything that hits the portal gets sucked inside and is then thrown out when the portal explodes." - charge_max = 2 - spell_flags = 0 \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/conjure/forcewall.dm b/code/modules/spells/aoe_turf/conjure/forcewall.dm index 89ceb6d64cd..1c937f3f6d8 100644 --- a/code/modules/spells/aoe_turf/conjure/forcewall.dm +++ b/code/modules/spells/aoe_turf/conjure/forcewall.dm @@ -46,7 +46,3 @@ icon_state = "empty" name = "invisible wall" desc = "You have a bad feeling about this." - -/spell/aoe_turf/conjure/forcewall/tower - desc = "A temporary invincible wall for you to summon." - charge_max = 3 \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/disable_tech.dm b/code/modules/spells/aoe_turf/disable_tech.dm index a8069b209f8..d9912e1c390 100644 --- a/code/modules/spells/aoe_turf/disable_tech.dm +++ b/code/modules/spells/aoe_turf/disable_tech.dm @@ -31,8 +31,3 @@ emp_light += 2 return "You've increased the range of [src]." - -/spell/aoe_turf/disable_tech/starlight - hidden_from_codex = TRUE - charge_max = 600 - spell_flags = 0 \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/drain_blood.dm b/code/modules/spells/aoe_turf/drain_blood.dm index 470c18f9f3a..8ad4ea6b8a2 100644 --- a/code/modules/spells/aoe_turf/drain_blood.dm +++ b/code/modules/spells/aoe_turf/drain_blood.dm @@ -21,7 +21,7 @@ continue //Hurt target if(ishuman(L)) - var/mob/living/carbon/human/H = L + var/mob/living/human/H = L H.vessel.remove_any(10) else L.take_damage(10) @@ -35,7 +35,7 @@ //Heal self if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/amount = min(10, H.species.blood_volume - H.vessel.total_volume) if(amount > 0) H.adjust_blood(amount) diff --git a/code/modules/spells/aoe_turf/knock.dm b/code/modules/spells/aoe_turf/knock.dm index f3dfa6a1e3c..3cf8614eeaa 100644 --- a/code/modules/spells/aoe_turf/knock.dm +++ b/code/modules/spells/aoe_turf/knock.dm @@ -35,7 +35,3 @@ /spell/aoe_turf/knock/slow charge_max = 200 hidden_from_codex = TRUE - -/spell/aoe_turf/knock/tower - charge_max = 2 - hidden_from_codex = TRUE diff --git a/code/modules/spells/aoe_turf/smoke.dm b/code/modules/spells/aoe_turf/smoke.dm index 5fe95415955..f9f0138908f 100644 --- a/code/modules/spells/aoe_turf/smoke.dm +++ b/code/modules/spells/aoe_turf/smoke.dm @@ -24,7 +24,3 @@ smoke_amt += 2 return "[src] will now create more smoke." - -/spell/aoe_turf/smoke/tower - charge_max = 2 - hidden_from_codex = TRUE diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm index cccfbf560a1..2c8f93815c8 100644 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ b/code/modules/spells/artifacts/spellbound_servants.dm @@ -6,7 +6,7 @@ /datum/spellbound_type/proc/spawn_servant(var/atom/a, var/mob/master, var/mob/user) set waitfor = 0 - var/mob/living/carbon/human/H = new(a) + var/mob/living/human/H = new(a) H.ckey = user.ckey H.change_appearance(APPEARANCE_GENDER|APPEARANCE_BODY|APPEARANCE_EYE_COLOR|APPEARANCE_HAIR|APPEARANCE_FACIAL_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR_COLOR|APPEARANCE_SKIN) @@ -25,7 +25,7 @@ H.SetName(name_choice) H.real_name = name_choice -/datum/spellbound_type/proc/equip_servant(var/mob/living/carbon/human/H) +/datum/spellbound_type/proc/equip_servant(var/mob/living/human/H) for(var/stype in spells) var/spell/S = new stype() if(S.spell_flags & NEEDSCLOTHES) @@ -42,7 +42,7 @@ /datum/spellbound_type/proc/set_antag(var/datum/mind/M, var/mob/master) return -/datum/spellbound_type/proc/modify_servant(var/list/items, var/mob/living/carbon/human/H) +/datum/spellbound_type/proc/modify_servant(var/list/items, var/mob/living/human/H) return /datum/spellbound_type/apprentice @@ -103,39 +103,20 @@ /obj/item/clothing/pants/familiar = slot_w_uniform_str ) -/datum/spellbound_type/servant/familiar/modify_servant(var/list/equipment, var/mob/living/carbon/human/H) +/datum/spellbound_type/servant/familiar/modify_servant(var/list/equipment, var/mob/living/human/H) var/familiar_type switch(input(H,"Choose your desired animal form:", "Form") as anything in list("Space Pike", "Mouse", "Cat", "Bear")) if("Space Pike") - H.mutations |= mNobreath - H.mutations |= MUTATION_SPACERES + H.add_genetic_condition(GENE_COND_NO_BREATH) + H.add_genetic_condition(GENE_COND_SPACE_RESISTANCE) familiar_type = /mob/living/simple_animal/hostile/carp/pike if("Mouse") H.verbs |= /mob/living/proc/ventcrawl familiar_type = /mob/living/simple_animal/passive/mouse if("Cat") - H.mutations |= mRun + H.add_genetic_condition(GENE_COND_RUNNING) familiar_type = /mob/living/simple_animal/cat if("Bear") - var/obj/item/clothing/under/under = locate() in equipment - var/obj/item/clothing/head/head = locate() in equipment - - var/datum/extension/armor/A = get_extension(under, /datum/extension/armor) - if(A) - A.armor_values = list( - ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL - ) //More armor - A = get_extension(head, /datum/extension/armor) - if(A) - A.armor_values = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_LASER = ARMOR_LASER_MINOR, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR - ) familiar_type = /mob/living/simple_animal/hostile/bear var/spell/targeted/shapeshift/familiar/F = new() F.possible_transformations = list(familiar_type) @@ -152,9 +133,9 @@ /spell/hand/charges/blood_shard ) -/datum/spellbound_type/servant/fiend/equip_servant(var/mob/living/carbon/human/H) +/datum/spellbound_type/servant/fiend/equip_servant(var/mob/living/human/H) if(H.gender == MALE) - equipment = list(/obj/item/clothing/under/lawyer/fiendsuit = slot_w_uniform_str, + equipment = list(/obj/item/clothing/costume/fiendsuit = slot_w_uniform_str, /obj/item/clothing/shoes/dress/devilshoes = slot_shoes_str) spells += /spell/toggle_armor/fiend else @@ -167,11 +148,13 @@ name = "Infiltrator" desc = "A spy and a manipulator to the end, capable of hiding in plain sight and falsifying information to your heart's content." spiel = "On the surface, you are a completely normal person, but is that really all you are? People are so easy to fool, do as your Master says, and do it with style!" - spells = list(/spell/toggle_armor/infil_items, - /spell/targeted/exhude_pleasantness, - /spell/targeted/genetic/blind/hysteria) + spells = list( + /spell/toggle_armor/infil_items, + /spell/targeted/exude_pleasantness, + /spell/targeted/genetic/blind/hysteria + ) -/datum/spellbound_type/servant/infiltrator/equip_servant(var/mob/living/carbon/human/H) +/datum/spellbound_type/servant/infiltrator/equip_servant(var/mob/living/human/H) if(H.gender == MALE) equipment = list(/obj/item/clothing/pants/slacks/outfit/tie = slot_w_uniform_str, /obj/item/clothing/shoes/dress/infilshoes = slot_shoes_str) @@ -186,16 +169,21 @@ name = "Overseer" desc = "A ghost, or an imaginary friend; the Overseer is immune to space and can turn invisible at a whim, but has little offensive capabilities." spiel = "Physicality is not something you are familiar with. Indeed, injuries cannot slow you down, but you can't fight back, either! In addition to this, you can reach into the void and return the soul of a single departed crewmember via the revoke death verb, if so desired; this can even revive your Master, should they fall in combat before you do. Serve them well." - equipment = list(/obj/item/clothing/under/grimhoodie = slot_w_uniform_str, - /obj/item/clothing/shoes/sandal/grimboots = slot_shoes_str, - /obj/item/contract/wizard/xray = BP_L_HAND, - /obj/item/contract/wizard/telepathy = BP_R_HAND) - spells = list(/spell/toggle_armor/overseer, - /spell/targeted/ethereal_jaunt, - /spell/invisibility, - /spell/targeted/revoke) + equipment = list( + /obj/item/clothing/pants/casual/blackjeans/outfit = slot_w_uniform_str, + /obj/item/clothing/suit/jacket/hoodie/grim = slot_wear_suit_str, + /obj/item/clothing/shoes/sandal/grimboots = slot_shoes_str, + /obj/item/contract/wizard/xray = BP_L_HAND, + /obj/item/contract/wizard/telepathy = BP_R_HAND + ) + spells = list( + /spell/toggle_armor/overseer, + /spell/targeted/ethereal_jaunt, + /spell/invisibility, + /spell/targeted/revoke + ) -/datum/spellbound_type/servant/overseer/equip_servant(var/mob/living/carbon/human/H) +/datum/spellbound_type/servant/overseer/equip_servant(var/mob/living/human/H) ..() H.add_aura(new /obj/aura/regenerating(H)) @@ -220,7 +208,7 @@ var/decl/ghosttrap/G = GET_DECL(/decl/ghosttrap/wizard_familiar) for(var/mob/observer/ghost/ghost in global.player_list) if(G.assess_candidate(ghost,null,FALSE)) - to_chat(ghost, "[SPAN_NOTICE("A wizard is requesting a Spell-Bound Servant!")] (Join)") + to_chat(ghost, "[SPAN_NOTICE("A wizard is requesting a Spell-Bound Servant!")] (Join)") return TRUE /obj/effect/cleanable/spellbound/CanUseTopic(var/mob) @@ -248,7 +236,7 @@ throw_speed = 5 throw_range = 10 w_class = ITEM_SIZE_TINY - material = /decl/material/solid/stone/cult + material = /decl/material/solid/stone/basalt /obj/item/summoning_stone/attack_self(var/mob/user) if(isAdminLevel(user.z)) diff --git a/code/modules/spells/artifacts/storage.dm b/code/modules/spells/artifacts/storage.dm index b8fbc512eeb..4d84cab7d3d 100644 --- a/code/modules/spells/artifacts/storage.dm +++ b/code/modules/spells/artifacts/storage.dm @@ -27,14 +27,4 @@ return list( /obj/item/scrying, /obj/item/contract/wizard/xray, - ) - -/obj/structure/closet/wizard/souls - name = "Soul Shard Belt" - desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot. This also includes the spell Artificer, used to create the shells used in construct creation." - -/obj/structure/closet/wizard/souls/WillContain() - return list( - /obj/item/contract/boon/wizard/artificer, - /obj/item/belt/soulstone/full, - ) + ) \ No newline at end of file diff --git a/code/modules/spells/contracts.dm b/code/modules/spells/contracts.dm index 3326ddefef0..1b6ebf527f7 100644 --- a/code/modules/spells/contracts.dm +++ b/code/modules/spells/contracts.dm @@ -64,8 +64,7 @@ /obj/item/contract/wizard/xray/contract_effect(mob/user) ..() - if (!(MUTATION_XRAY in user.mutations)) - user.mutations.Add(MUTATION_XRAY) + if (user.add_genetic_condition(GENE_COND_XRAY)) user.set_sight(user.sight|SEE_MOBS|SEE_OBJS|SEE_TURFS) user.set_see_in_dark(8) user.set_see_invisible(SEE_INVISIBLE_LEVEL_TWO) @@ -80,15 +79,7 @@ /obj/item/contract/wizard/telepathy/contract_effect(mob/user) ..() - if (!ishuman(user)) - return 0 - var/mob/living/carbon/human/H = user - if (mRemotetalk in H.mutations) - return 0 - H.mutations.Add(mRemotetalk) - H.verbs += /mob/living/carbon/human/proc/remotesay - to_chat(H, "You expand your mind outwards.") - return 1 + return user.add_genetic_condition(GENE_COND_REMOTE_TALK) /obj/item/contract/boon name = "boon contract" @@ -124,10 +115,6 @@ /obj/item/contract/boon/wizard contract_master = "\improper Wizard Academy" -/obj/item/contract/boon/wizard/artificer - path = /spell/aoe_turf/conjure/construct - desc = "This contract has a passage dedicated to an entity known as 'Nar-Sie'." - /obj/item/contract/boon/wizard/fireball path = /spell/targeted/projectile/dumbfire/fireball desc = "This contract feels warm to the touch." diff --git a/code/modules/spells/general/acid_spray.dm b/code/modules/spells/general/acid_spray.dm index 5df698c238b..752a17eecb7 100644 --- a/code/modules/spells/general/acid_spray.dm +++ b/code/modules/spells/general/acid_spray.dm @@ -24,7 +24,3 @@ chem.add_to_reagents(reagent_type,10) spawn(0) chem.set_up(get_ranged_target_turf(target, angle2dir(angle+mod), 3)) - -/spell/acid_spray/tower - desc = "The simplest form of aggressive conjuration: acid spray is quite effective in melting both man and object." - charge_max = 2 \ No newline at end of file diff --git a/code/modules/spells/general/god_vision.dm b/code/modules/spells/general/camera_vision.dm similarity index 66% rename from code/modules/spells/general/god_vision.dm rename to code/modules/spells/general/camera_vision.dm index 186dbede1d9..cfd0cfb030e 100644 --- a/code/modules/spells/general/god_vision.dm +++ b/code/modules/spells/general/camera_vision.dm @@ -33,26 +33,4 @@ if(!cn) to_chat(user, SPAN_WARNING("There's a flash of sparks as the spell fizzles out!")) return - cn.look(L) - -/spell/camera_connection/god_vision - name = "All Seeing Eye" - desc = "See what your master sees." - - charge_max = 10 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - extension_type = /datum/extension/eye/freelook - - hud_state = "gen_mind" - -/spell/camera_connection/god_vision/set_connected_god(var/mob/living/deity/god) - ..() - - var/datum/extension/eye/freelook/fl = get_extension(src, /datum/extension/eye) - if(!fl) - return - fl.set_visualnet(god.eyenet) - + cn.look(L) \ No newline at end of file diff --git a/code/modules/spells/general/create_air.dm b/code/modules/spells/general/create_air.dm index 51d5cae6a46..405e161a54a 100644 --- a/code/modules/spells/general/create_air.dm +++ b/code/modules/spells/general/create_air.dm @@ -22,7 +22,3 @@ var/datum/gas_mixture/environment = targets[1] for(var/gas in air_change) environment.adjust_gas(gas, air_change[gas]) - -/spell/create_air/tower - desc = "Allows you to generate a livable atmosphere in the area you are in." - charge_max = 5 \ No newline at end of file diff --git a/code/modules/spells/general/invisibility.dm b/code/modules/spells/general/invisibility.dm index 0b71f9ee717..3fbab715efd 100644 --- a/code/modules/spells/general/invisibility.dm +++ b/code/modules/spells/general/invisibility.dm @@ -13,12 +13,12 @@ if(ishuman(holder)) return holder -/spell/invisibility/cast(var/mob/living/carbon/human/H, var/mob/user) +/spell/invisibility/cast(var/mob/living/human/H, var/mob/user) on = !on if(on) if(H.add_cloaking_source(src)) playsound(get_turf(H), 'sound/effects/teleport.ogg', 90, 1) - H.mutations |= MUTATION_CLUMSY + H.add_genetic_condition(GENE_COND_CLUMSY) else if(H.remove_cloaking_source(src)) playsound(get_turf(H), 'sound/effects/stealthoff.ogg', 90, 1) - H.mutations -= MUTATION_CLUMSY \ No newline at end of file + H.remove_genetic_condition(GENE_COND_CLUMSY) \ No newline at end of file diff --git a/code/modules/spells/general/mark_recall.dm b/code/modules/spells/general/mark_recall.dm index 2895e63fbcf..a8e987c8d54 100644 --- a/code/modules/spells/general/mark_recall.dm +++ b/code/modules/spells/general/mark_recall.dm @@ -73,10 +73,16 @@ qdel(src) return TRUE +/obj/effect/cleanable/wizard_mark/nullrod_act(mob/user, obj/item/nullrod/rod) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + visible_message("\The [user] dispels \the [src] and it fades away!") + qdel(src) + return TRUE + /obj/effect/cleanable/wizard_mark/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/nullrod) || istype(I, /obj/item/spellbook)) + if(istype(I, /obj/item/spellbook)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - src.visible_message("\The [src] fades away!") + visible_message("\The [src] fades away!") qdel(src) - return - ..() \ No newline at end of file + return TRUE + return ..() \ No newline at end of file diff --git a/code/modules/spells/general/radiant_aura.dm b/code/modules/spells/general/radiant_aura.dm index 12e608e2ec8..27e85404027 100644 --- a/code/modules/spells/general/radiant_aura.dm +++ b/code/modules/spells/general/radiant_aura.dm @@ -19,9 +19,3 @@ /spell/radiant_aura/cast(var/list/targets, var/mob/user) var/obj/aura/radiant_aura/A = new(user) QDEL_IN(A,duration) - -/spell/radiant_aura/starlight - name = "Starlight Aura" - desc = "This spell makes you immune to laser fire, for a short while at least." - spell_flags = 0 - charge_max = 400 \ No newline at end of file diff --git a/code/modules/spells/hand/blood_shards.dm b/code/modules/spells/hand/blood_shards.dm index aed4a560236..0908ee28520 100644 --- a/code/modules/spells/hand/blood_shards.dm +++ b/code/modules/spells/hand/blood_shards.dm @@ -29,7 +29,7 @@ /obj/item/projectile/blood_shard/on_hit(var/atom/movable/target, var/blocked = 0) if(..()) if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target H.vessel.remove_any(30) H.visible_message("Tiny red shards burst from \the [H]'s skin!") fragmentate(get_turf(src), 30, 5, list(/obj/item/projectile/bullet/pellet/blood)) diff --git a/code/modules/spells/hand/burning_grip.dm b/code/modules/spells/hand/burning_grip.dm index 759eda54cd6..772b4e6aa9c 100644 --- a/code/modules/spells/hand/burning_grip.dm +++ b/code/modules/spells/hand/burning_grip.dm @@ -10,7 +10,7 @@ spell_delay = 120 hud_state = "wiz_burn" cast_sound = 'sound/magic/fireball.ogg' - compatible_targets = list(/mob/living/carbon/human) + compatible_targets = list(/mob/living/human) /spell/hand/burning_grip/valid_target(var/mob/living/L, var/mob/user) if(!..()) @@ -19,7 +19,7 @@ return 0 return 1 -/spell/hand/burning_grip/cast_hand(var/mob/living/carbon/human/H, var/mob/user) +/spell/hand/burning_grip/cast_hand(var/mob/living/human/H, var/mob/user) var/list/targets = list() for(var/hand_slot in H.get_held_item_slots()) targets |= hand_slot @@ -37,7 +37,3 @@ else E.take_external_damage(burn=6, used_weapon = "hot iron") to_chat(H, SPAN_WARNING("You notice that your [E] is burned.")) - -/spell/hand/burning_grip/tower - desc = "Allows you cause an object to heat up intensly in someone's hand, making them drop it and whatever skin is attached." - charge_max = 3 \ No newline at end of file diff --git a/code/modules/spells/hand/slippery_surface.dm b/code/modules/spells/hand/slippery_surface.dm index 2db0588d128..3b5fc448d03 100644 --- a/code/modules/spells/hand/slippery_surface.dm +++ b/code/modules/spells/hand/slippery_surface.dm @@ -17,7 +17,3 @@ T.wet_floor(50) new /obj/effect/temporary(T, 3, 'icons/effects/effects.dmi', "sonar_ping") return ..() - -/spell/hand/slippery_surface/tower - desc = "Allows you to slicken a small patch of floor. Anyone without sure-footing will find it hard to stay upright." - charge_max = 2 \ No newline at end of file diff --git a/code/modules/spells/racial_wizard.dm b/code/modules/spells/racial_wizard.dm index f7eca973b1a..c06b8671aae 100644 --- a/code/modules/spells/racial_wizard.dm +++ b/code/modules/spells/racial_wizard.dm @@ -9,7 +9,7 @@ throw_speed = 1 throw_range = 3 force = 15 - material = /decl/material/solid/stone/cult + material = /decl/material/solid/stone/basalt var/list/potentials = list( SPECIES_HUMAN = /obj/item/bag/cash/infinite ) @@ -18,7 +18,7 @@ if(!ishuman(user)) to_chat(user, "\The [src] can do nothing for such a simple being.") return - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/reward = potentials[H.species.get_root_species_name(H)] //we get body type because that lets us ignore subspecies. if(!reward) to_chat(user, "\The [src] does not know what to make of you.") diff --git a/code/modules/spells/spell_code.dm b/code/modules/spells/spell_code.dm index 5e4621a9eaa..653d2b8cae2 100644 --- a/code/modules/spells/spell_code.dm +++ b/code/modules/spells/spell_code.dm @@ -62,7 +62,6 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now var/override_base = "" - var/mob/living/deity/connected_god //Do we have this spell based off a boon from a god? var/obj/screen/connected_button var/hidden_from_codex = FALSE @@ -121,8 +120,6 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now break if(cast_check(1,user, targets)) //we check again, otherwise you can choose a target and then wait for when you are no longer able to cast (I.E. Incapacitated) to use it. invocation(user, targets) - if(connected_god && !connected_god.take_charge(user, max(1, charge_max/10))) - break take_charge(user, skipcharge) before_cast(targets) //applies any overlays and effects if(prob(critfailchance)) @@ -390,9 +387,6 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now return do_after(user,delay, incapacitation_flags = incap_flags) -/spell/proc/set_connected_god(var/mob/living/deity/god) - connected_god = god - /proc/view_or_range(distance = world.view , center = usr , type) switch(type) if("view") diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index 79a64522435..110fb98c471 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -13,7 +13,6 @@ var/global/list/artefact_feedback = list( /obj/item/summoning_stone = "ST", /obj/item/magic_rock = "RA", /obj/item/contract/apprentice = "CP", - /obj/structure/closet/wizard/souls = "SS", /obj/structure/closet/wizard/scrying = "SO", /obj/item/teleportation_scroll = "TS", /obj/item/gun/energy/staff = "ST", @@ -161,7 +160,7 @@ var/global/list/artefact_feedback = list( dat += "

    [spellbook.book_flags & LOCKED ? "Unlock" : "Lock"] the spellbook.
    " show_browser(user, dat, "window=spellbook") -/obj/item/spellbook/CanUseTopic(var/mob/living/carbon/human/H) +/obj/item/spellbook/CanUseTopic(var/mob/living/human/H) if(!istype(H)) return STATUS_CLOSE @@ -170,7 +169,7 @@ var/global/list/artefact_feedback = list( return ..() -/obj/item/spellbook/OnTopic(var/mob/living/carbon/human/user, href_list) +/obj/item/spellbook/OnTopic(var/mob/living/human/user, href_list) if(href_list["lock"] && !(spellbook.book_flags & NO_LOCKING)) if(spellbook.book_flags & LOCKED) spellbook.book_flags &= ~LOCKED diff --git a/code/modules/spells/spellbook/druid.dm b/code/modules/spells/spellbook/druid.dm index fd35ae19542..ec86e1ac93b 100644 --- a/code/modules/spells/spellbook/druid.dm +++ b/code/modules/spells/spellbook/druid.dm @@ -29,7 +29,6 @@ /spell/area_teleport = 2, /spell/portal_teleport = 2, /spell/noclothes = 1, - /obj/structure/closet/wizard/souls = 1, /obj/item/magic_rock = 1, /obj/item/summoning_stone = 2, /obj/item/contract/wizard/telepathy = 1, diff --git a/code/modules/spells/spellbook/standard.dm b/code/modules/spells/spellbook/standard.dm index 2f1f3a77761..5b30a7c9918 100644 --- a/code/modules/spells/spellbook/standard.dm +++ b/code/modules/spells/spellbook/standard.dm @@ -28,7 +28,6 @@ /spell/noclothes = 2, /obj/item/gun/energy/staff/focus = 1, /obj/item/gun/energy/staff/fire = 1, - /obj/structure/closet/wizard/souls = 1, /obj/item/gun/energy/staff/animate = 1, /obj/structure/closet/wizard/scrying = 1, /obj/item/summoning_stone = 2, diff --git a/code/modules/spells/targeted/analyze.dm b/code/modules/spells/targeted/analyze.dm index 60ac4536930..705d97399c7 100644 --- a/code/modules/spells/targeted/analyze.dm +++ b/code/modules/spells/targeted/analyze.dm @@ -9,11 +9,11 @@ range = 2 invocation_type = SpI_WHISPER invocation = "Fu Yi Fim" - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) hud_state = "analyze" /spell/targeted/analyze/cast(var/list/targets, var/mob/user) for(var/a in targets) - var/mob/living/carbon/human/H = a + var/mob/living/human/H = a new /obj/effect/temporary(get_turf(a),5, 'icons/effects/effects.dmi', "repel_missiles") to_chat(user,medical_scan_results(H,1)) \ No newline at end of file diff --git a/code/modules/spells/targeted/blood_boil.dm b/code/modules/spells/targeted/blood_boil.dm index 0f9ef34b98a..4c39b3b4620 100644 --- a/code/modules/spells/targeted/blood_boil.dm +++ b/code/modules/spells/targeted/blood_boil.dm @@ -8,7 +8,7 @@ invocation_type = SpI_NONE range = 5 max_targets = 1 - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) time_between_channels = 50 number_of_channels = 0 @@ -16,7 +16,7 @@ hud_state = "wiz_boilblood" /spell/targeted/blood_boil/cast(var/list/targets, var/mob/user) - var/mob/living/carbon/human/H = targets[1] + var/mob/living/human/H = targets[1] H.bodytemperature += 40 if(prob(10)) to_chat(H,"\The [user] seems to radiate an uncomfortable amount of heat your direction.") diff --git a/code/modules/spells/targeted/cleric_spells.dm b/code/modules/spells/targeted/cleric_spells.dm index aea1cec1b94..74061d776dd 100644 --- a/code/modules/spells/targeted/cleric_spells.dm +++ b/code/modules/spells/targeted/cleric_spells.dm @@ -32,10 +32,6 @@ amt_dam_robo -= 7 return "[src] will now heal more." -/spell/targeted/heal_target/tower - desc = "Allows you to heal yourself, or others, for a slight amount." - charge_max = 2 - /spell/targeted/heal_target/touch name = "Healing Touch" desc = "Heals an adjacent target for a reasonable amount of health." @@ -83,11 +79,6 @@ return "[src] heals more, and heals organ damage and radiation." -/spell/targeted/heal_target/major/tower - charge_max = 1 - spell_flags = INCLUDEUSER | SELECTABLE - desc = "Allows you to heal others for a great amount." - /spell/targeted/heal_target/area name = "Cure Area" desc = "This spell heals everyone in an area." @@ -114,10 +105,6 @@ return "[src] now heals more in a wider area." -/spell/targeted/heal_target/area/tower - desc = "Allows you to heal everyone in an area for minor damage." - charge_max = 1 - /spell/targeted/heal_target/area/slow charge_max = 2 MINUTES @@ -196,6 +183,20 @@ charge_max += 300 QDEL_NULL(effect) +/obj/effect/rift + name = "rift" + desc = "a tear in space and time." + icon = 'icons/obj/wizard.dmi' + icon_state = "rift" + anchored = TRUE + density = FALSE + +/obj/effect/rift/Destroy() + for(var/o in contents) + var/atom/movable/M = o + M.dropInto(loc) + . = ..() + /spell/targeted/revoke name = "Revoke Death" desc = "Revoke that of death itself. Comes at a cost that may be hard to manage for some." diff --git a/code/modules/spells/targeted/equip/burning_touch.dm b/code/modules/spells/targeted/equip/burning_touch.dm index ba96d731f37..fb650fa154b 100644 --- a/code/modules/spells/targeted/equip/burning_touch.dm +++ b/code/modules/spells/targeted/equip/burning_touch.dm @@ -44,7 +44,7 @@ if(!ishuman(src.loc)) qdel(src) return - var/mob/living/carbon/human/user = src.loc + var/mob/living/human/user = src.loc var/obj/item/organ/external/hand if(src == user.get_equipped_item(BP_L_HAND)) hand = GET_INTERNAL_ORGAN(user, BP_L_HAND) diff --git a/code/modules/spells/targeted/equip/dyrnwyn.dm b/code/modules/spells/targeted/equip/dyrnwyn.dm index 98d9cc4fba4..71d7ace1e4f 100644 --- a/code/modules/spells/targeted/equip/dyrnwyn.dm +++ b/code/modules/spells/targeted/equip/dyrnwyn.dm @@ -14,28 +14,24 @@ duration = 300 //30 seconds max_targets = 1 equipped_summons = list("active hand" = /obj/item/sword) - delete_old = 0 + delete_old = FALSE var/material = /decl/material/solid/metal/gold hud_state = "gen_immolate" /spell/targeted/equip_item/dyrnwyn/summon_item(var/new_type) - var/obj/item/W = new new_type(null,material) - W.SetName("\improper Dyrnwyn") - W.atom_damage_type = BURN - W.hitsound = 'sound/items/welder2.ogg' - LAZYSET(W.slowdown_per_slot, BP_L_HAND, 1) - LAZYSET(W.slowdown_per_slot, BP_R_HAND, 1) - return W + var/obj/item/sword = new new_type(null,material) + sword.SetName("\improper Dyrnwyn") + sword.atom_damage_type = BURN + sword.hitsound = 'sound/items/welder2.ogg' + LAZYSET(sword.slowdown_per_slot, BP_L_HAND, 1) + LAZYSET(sword.slowdown_per_slot, BP_R_HAND, 1) + return sword /spell/targeted/equip_item/dyrnwyn/empower_spell() if(!..()) - return 0 + return FALSE material = /decl/material/solid/metal/silver return "Dyrnwyn has been made pure: it is now made of silver." - -/spell/targeted/equip_item/dyrnwyn/tower - desc = "This spell allows you to summon a golden firey sword for a short duration." - charge_max = 1 \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/holy_relic.dm b/code/modules/spells/targeted/equip/holy_relic.dm index 5ad87588bc6..7c6dadf5da2 100644 --- a/code/modules/spells/targeted/equip/holy_relic.dm +++ b/code/modules/spells/targeted/equip/holy_relic.dm @@ -14,7 +14,7 @@ duration = 25 SECONDS cooldown_min = 35 SECONDS delete_old = 0 - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) hud_state = "purge1" diff --git a/code/modules/spells/targeted/equip/horsemask.dm b/code/modules/spells/targeted/equip/horsemask.dm index 0ddb8708e90..31995ba86bd 100644 --- a/code/modules/spells/targeted/equip/horsemask.dm +++ b/code/modules/spells/targeted/equip/horsemask.dm @@ -14,7 +14,7 @@ cooldown_min = 30 //30 deciseconds reduction per rank selection_type = "range" - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) hud_state = "wiz_horse" cast_sound = 'sound/magic/horsehead_curse.ogg' diff --git a/code/modules/spells/targeted/equip/party_hardy.dm b/code/modules/spells/targeted/equip/party_hardy.dm index b8ae4513130..35dd93a22d0 100644 --- a/code/modules/spells/targeted/equip/party_hardy.dm +++ b/code/modules/spells/targeted/equip/party_hardy.dm @@ -16,7 +16,7 @@ hud_state = "wiz_party" - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) equipped_summons = list("active hand" = /obj/item/chems/drinks/bottle/small/beer) /spell/targeted/equip_item/party_hardy/empower_spell() diff --git a/code/modules/spells/targeted/equip/seed.dm b/code/modules/spells/targeted/equip/seed.dm index 8e4358f4368..2252ec75c8c 100644 --- a/code/modules/spells/targeted/equip/seed.dm +++ b/code/modules/spells/targeted/equip/seed.dm @@ -9,7 +9,7 @@ invocation = "Ria'li akta." equipped_summons = list("active hand" = /obj/item/seeds/random) - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) charge_max = 600 //1 minute cooldown_min = 200 //20 seconds diff --git a/code/modules/spells/targeted/equip/shield.dm b/code/modules/spells/targeted/equip/shield.dm index f81a75c3d62..b725196ad3a 100644 --- a/code/modules/spells/targeted/equip/shield.dm +++ b/code/modules/spells/targeted/equip/shield.dm @@ -9,7 +9,7 @@ range = -1 max_targets = 1 - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) level_max = list(Sp_TOTAL = 3, Sp_SPEED = 2, Sp_POWER = 1) charge_type = Sp_RECHARGE @@ -39,7 +39,3 @@ block_chance = 60 return "Your summoned shields will now block more often." - -/spell/targeted/equip_item/shield/tower - desc = "This spell allows you to summon a magical shield for a short duration." - charge_max = 1 \ No newline at end of file diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm index fd741613209..e686e7712dc 100644 --- a/code/modules/spells/targeted/ethereal_jaunt.dm +++ b/code/modules/spells/targeted/ethereal_jaunt.dm @@ -118,8 +118,3 @@ /obj/effect/dummy/spell_jaunt/bullet_act(blah) return - -/spell/targeted/ethereal_jaunt/tower - desc = "Allows you to liquify for a short duration, letting them pass through all dense objects." - charge_max = 2 - spell_flags = Z2NOCAST | INCLUDEUSER \ No newline at end of file diff --git a/code/modules/spells/targeted/exhude_pleasantness.dm b/code/modules/spells/targeted/exude_pleasantness.dm similarity index 66% rename from code/modules/spells/targeted/exhude_pleasantness.dm rename to code/modules/spells/targeted/exude_pleasantness.dm index 8e3d9c0d1c0..74ae51237ab 100644 --- a/code/modules/spells/targeted/exhude_pleasantness.dm +++ b/code/modules/spells/targeted/exude_pleasantness.dm @@ -1,4 +1,4 @@ -/spell/targeted/exhude_pleasantness +/spell/targeted/exude_pleasantness name = "Exhude Pleasantness" desc = "A simple spell used to make friends with people. Be warned, this spell only has a subtle effect" feedback = "AP" @@ -10,10 +10,10 @@ var/list/possible_messages = list("seems pretty trustworthy!", "makes you feel appreciated.", "looks pretty cool.", "feels like the only decent person here!", "makes you feel safe.") hud_state = "friendly" -/spell/targeted/exhude_pleasantness/cast(var/list/targets, var/mob/user) +/spell/targeted/exude_pleasantness/cast(var/list/targets, var/mob/user) for(var/m in targets) var/mob/living/L = m if(L.mind && L.mind.assigned_special_role == "Spellbound Servant") - to_chat(m, "\The [user] seems relatively harmless.") + to_chat(m, SPAN_NOTICE("\The [user] seems relatively harmless.")) else - to_chat(m, "\The [user] [pick(possible_messages)]") \ No newline at end of file + to_chat(m, FONT_LARGE(SPAN_NOTICE("\The [user] [pick(possible_messages)]"))) \ No newline at end of file diff --git a/code/modules/spells/targeted/genetic.dm b/code/modules/spells/targeted/genetic.dm index f107fcb1048..bcc5233b9b6 100644 --- a/code/modules/spells/targeted/genetic.dm +++ b/code/modules/spells/targeted/genetic.dm @@ -6,58 +6,41 @@ code\game\dna\genes\goon_powers.dm */ /spell/targeted/genetic name = "Genetic modifier" - desc = "This spell inflicts a set of mutations and disabilities upon the target." - - var/disabilities = 0 //bits - var/list/mutations = list() //mutation strings - duration = 100 //deciseconds - + desc = "This spell inflicts a set of genetic conditions upon the target." + duration = 10 SECONDS + var/list/genetic_conditions = list() /spell/targeted/genetic/cast(list/targets) ..() for(var/mob/living/target in targets) - for(var/x in mutations) - target.mutations.Add(x) - target.disabilities |= disabilities - target.update_mutations() //update target's mutation overlays - spawn(duration) - for(var/x in mutations) - target.mutations.Remove(x) - target.disabilities &= ~disabilities - target.update_mutations() - return + for(var/x in genetic_conditions) + target.add_genetic_condition(x, duration) /spell/targeted/genetic/blind name = "Blind" desc = "This spell inflicts a target with temporary blindness. Does not require wizard garb." feedback = "BD" - disabilities = 1 school = "illusion" duration = 300 - charge_max = 300 - spell_flags = 0 invocation = "Sty Kaly." invocation_type = SpI_WHISPER message = "Your eyes cry out in pain!" level_max = list(Sp_TOTAL = 3, Sp_SPEED = 1, Sp_POWER = 3) cooldown_min = 50 - range = 7 max_targets = 0 - amt_eye_blind = 10 amt_eye_blurry = 20 - hud_state = "wiz_blind" cast_sound = 'sound/magic/blind.ogg' + genetic_conditions = list(GENE_COND_BLINDED) /spell/targeted/genetic/blind/empower_spell() if(!..()) return 0 - duration += 100 - + duration += 10 SECONDS return "[src] will now blind for a longer period of time." /spell/targeted/genetic/blind/hysteria @@ -81,12 +64,10 @@ code\game\dna\genes\goon_powers.dm spell_flags = NOFACTION invocation_type = SpI_SHOUT charge_max = 60 SECONDS - + spell_flags = 0 amt_dizziness = 0 amt_eye_blurry = 5 amt_stunned = 1 - effect_state = "electricity_constant" effect_duration = 5 - - hud_state = "wiz_starburst" \ No newline at end of file + hud_state = "wiz_starburst" diff --git a/code/modules/spells/targeted/projectile/fireball.dm b/code/modules/spells/targeted/projectile/fireball.dm index 451c2726727..ef65dc885f7 100644 --- a/code/modules/spells/targeted/projectile/fireball.dm +++ b/code/modules/spells/targeted/projectile/fireball.dm @@ -44,10 +44,6 @@ return "The spell [src] now has a larger explosion." -/spell/targeted/projectile/dumbfire/fireball/tower - desc = "Imbue yourself with the power of exploding fire." - charge_max = 2 - //PROJECTILE /obj/item/projectile/spell_projectile/fireball diff --git a/code/modules/spells/targeted/projectile/stuncuff.dm b/code/modules/spells/targeted/projectile/stuncuff.dm index 63539562c62..52046381588 100644 --- a/code/modules/spells/targeted/projectile/stuncuff.dm +++ b/code/modules/spells/targeted/projectile/stuncuff.dm @@ -25,7 +25,7 @@ /spell/targeted/projectile/dumbfire/stuncuff/prox_cast(var/list/targets, spell_holder) for(var/mob/living/M in targets) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/handcuffs/wizard/cuffs = new() H.equip_to_slot(cuffs, slot_handcuffed_str) H.visible_message("Beams of light form around \the [H]'s hands!") diff --git a/code/modules/spells/targeted/shatter_mind.dm b/code/modules/spells/targeted/shatter_mind.dm index 2f62902ac58..f84d6765035 100644 --- a/code/modules/spells/targeted/shatter_mind.dm +++ b/code/modules/spells/targeted/shatter_mind.dm @@ -8,7 +8,7 @@ invocation_type = SpI_NONE range = 5 max_targets = 1 - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) time_between_channels = 150 number_of_channels = 0 @@ -16,7 +16,7 @@ hud_state = "wiz_statue" /spell/targeted/shatter/cast(var/list/targets, var/mob/user) - var/mob/living/carbon/human/H = targets[1] + var/mob/living/human/H = targets[1] if(prob(50)) sound_to(user, get_sfx("swing_hit")) if(prob(5)) diff --git a/code/modules/spells/targeted/subjugate.dm b/code/modules/spells/targeted/subjugate.dm index 914de088ed2..700dac35b36 100644 --- a/code/modules/spells/targeted/subjugate.dm +++ b/code/modules/spells/targeted/subjugate.dm @@ -18,7 +18,7 @@ amt_confused = 100 amt_stuttering = 100 - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) hud_state = "wiz_subj" diff --git a/code/modules/spells/targeted/targeted.dm b/code/modules/spells/targeted/targeted.dm index 422c1d3e574..46e6e242b26 100644 --- a/code/modules/spells/targeted/targeted.dm +++ b/code/modules/spells/targeted/targeted.dm @@ -145,7 +145,7 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp target.take_damage(amt_dam_tox, TOX, do_update_health = FALSE) target.take_damage(amt_dam_oxy, OXY) if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target for(var/obj/item/organ/internal/affecting in H.get_internal_organs()) if(affecting && istype(affecting)) affecting.heal_damage(amt_organ, amt_organ) diff --git a/code/modules/spells/targeted/torment.dm b/code/modules/spells/targeted/torment.dm index 4c9f9b9a3ee..e98836699f3 100644 --- a/code/modules/spells/targeted/torment.dm +++ b/code/modules/spells/targeted/torment.dm @@ -13,7 +13,7 @@ message = "So much pain! All you can hear is screaming!" max_targets = 0 - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) var/loss = 30 @@ -22,7 +22,7 @@ /spell/targeted/torment/cast(var/list/targets, var/mob/user) user.spawn_gibber() - for(var/mob/living/carbon/human/H in targets) + for(var/mob/living/human/H in targets) H.take_damage(loss, PAIN) /spell/targeted/torment/empower_spell() diff --git a/code/modules/sprite_accessories/_accessory.dm b/code/modules/sprite_accessories/_accessory.dm index 34f3802ee8a..3cbdf41587e 100644 --- a/code/modules/sprite_accessories/_accessory.dm +++ b/code/modules/sprite_accessories/_accessory.dm @@ -6,9 +6,9 @@ The process of adding in new hairstyles has been made pain-free and easy to do. Enjoy! - Doohl - Notice: This all gets automatically compiled in a list in dna2.dm, so you do not - have to define any UI values for sprite accessories manually for hair and facial - hair. Just add in new hair types and the game will naturally adapt. + Notice: This all gets automatically compiled in a list via the decl rfepository, + so you do not have to add sprite accessories manually to any lists etc. Just add + in new hair types and the game will naturally adapt. Changing icon states, icon files and names should not represent any risks to existing savefiles, but please do not change decl uids unless you are very sure diff --git a/code/modules/sprite_accessories/_accessory_category.dm b/code/modules/sprite_accessories/_accessory_category.dm index 663699bf8f4..5e7bd755899 100644 --- a/code/modules/sprite_accessories/_accessory_category.dm +++ b/code/modules/sprite_accessories/_accessory_category.dm @@ -15,7 +15,7 @@ var/single_selection = TRUE /// Set to TRUE to apply these markings as defaults when bodytype is set. var/always_apply_defaults = FALSE - /// Whether the default accessories in this category are cleared when prefs are applied. + /// Whether the accessories in this category are cleared when prefs are applied. var/clear_in_pref_apply = FALSE /decl/sprite_accessory_category/validate() diff --git a/code/modules/submaps/submap_job.dm b/code/modules/submaps/submap_job.dm index 61479dc7040..56b5121bc7f 100644 --- a/code/modules/submaps/submap_job.dm +++ b/code/modules/submaps/submap_job.dm @@ -95,7 +95,7 @@ /datum/job/submap/check_is_active(var/mob/M) . = (..() && M.faction == owner.name) -/datum/job/submap/create_cash_on_hand(var/mob/living/carbon/human/H, var/datum/money_account/M) +/datum/job/submap/create_cash_on_hand(var/mob/living/human/H, var/datum/money_account/M) . = get_total_starting_money(H) if(. > 0) var/obj/item/cash/cash = new diff --git a/code/modules/submaps/submap_join.dm b/code/modules/submaps/submap_join.dm index 997f6f89de2..67ab23971a1 100644 --- a/code/modules/submaps/submap_join.dm +++ b/code/modules/submaps/submap_join.dm @@ -65,7 +65,7 @@ if(istype(other_mob)) character = other_mob - var/mob/living/carbon/human/user_human + var/mob/living/human/user_human if(ishuman(character)) user_human = character if(job.branch && mil_branches) @@ -97,7 +97,7 @@ if(istype(ojob) && ojob.info) to_chat(character, ojob.info) - if(user_human && user_human.disabilities & NEARSIGHTED) + if(user_human && user_human.has_genetic_condition(GENE_COND_NEARSIGHTED)) var/equipped = user_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/prescription(user_human), slot_glasses_str) if(equipped) var/obj/item/clothing/glasses/G = user_human.get_equipped_item(slot_glasses_str) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index cdf3a4de4d4..5e816a644c1 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -522,7 +522,7 @@ var/global/list/supermatter_delam_accent_sounds = list( env.merge(removed) - for(var/mob/living/carbon/human/subject in view(src, min(7, round(sqrt(power/6))))) + for(var/mob/living/human/subject in view(src, min(7, round(sqrt(power/6))))) var/obj/item/organ/internal/eyes/eyes = subject.get_organ(BP_EYES, /obj/item/organ/internal/eyes) if (!eyes) continue diff --git a/code/modules/surgery/_surgery.dm b/code/modules/surgery/_surgery.dm index 31049834b8a..7ca2c764c28 100644 --- a/code/modules/surgery/_surgery.dm +++ b/code/modules/surgery/_surgery.dm @@ -48,7 +48,7 @@ var/global/list/surgery_tool_exception_cache = list() /// Any additional information to add to the codex entry for this step. var/list/additional_codex_lines /// What mob type does this surgery apply to. - var/expected_mob_type = /mob/living/carbon/human + var/expected_mob_type = /mob/living/human /// Sound (or list of sounds) to play on end step. var/end_step_sound = "rustle" /// Sound (or list of sounds) to play on fail step. @@ -142,8 +142,7 @@ var/global/list/surgery_tool_exception_cache = list() affected.how_open() < open_threshold)) return FALSE // Check if clothing is blocking access - var/mob/living/carbon/human/C = target - var/obj/item/I = C.get_covering_equipped_item_by_zone(target_zone) + var/obj/item/I = user.get_covering_equipped_item_by_zone(target_zone) if(I && (I.item_flags & ITEM_FLAG_THICKMATERIAL)) to_chat(user,SPAN_NOTICE("The material covering this area is too thick for you to do surgery through!")) return FALSE @@ -162,13 +161,13 @@ var/global/list/surgery_tool_exception_cache = list() if (can_infect && affected) spread_germs_to_organ(affected, user) if(ishuman(user) && prob(60)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if (blood_level) H.bloody_hands(target,2) if (blood_level > 1) H.bloody_body(target,2) if(shock_level && ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target H.shock_stage = max(H.shock_stage, shock_level) // does stuff to end the step, which is normally print a message + do whatever this step changes @@ -197,7 +196,7 @@ var/global/list/surgery_tool_exception_cache = list() . += 20 if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user . -= round(H.shock_stage * 0.5) if(GET_STATUS(H, STAT_BLURRY)) . -= 20 @@ -209,18 +208,15 @@ var/global/list/surgery_tool_exception_cache = list() . -= 10 if(!target.current_posture.prone) . -= 30 - var/turf/T = get_turf(target) - if(locate(/obj/machinery/optable, T)) - . -= 0 - else if(locate(/obj/structure/bed, T)) - . -= 5 - else if(locate(/obj/structure/table, T)) - . -= 10 - else if(locate(/obj/effect/rune/, T)) - . -= 10 + var/turf/T = get_turf(target) + for(var/obj/interfering in T) + . += interfering.get_surgery_success_modifier(delicate) . = max(., 0) -/proc/spread_germs_to_organ(var/obj/item/organ/external/E, var/mob/living/carbon/human/user) +/obj/proc/get_surgery_success_modifier(delicate) + return 0 + +/proc/spread_germs_to_organ(var/obj/item/organ/external/E, var/mob/living/human/user) if(!istype(user) || !istype(E)) return var/germ_level = user.germ_level @@ -323,22 +319,18 @@ var/global/list/surgery_tool_exception_cache = list() /obj/item/stack/handle_post_surgery() use(1) +/obj/proc/get_surgery_surface_quality(mob/living/victim) + return OPERATE_DENY + //check if mob is lying down on something we can operate him on. -/proc/can_operate(mob/living/carbon/M, mob/living/carbon/user) - var/turf/T = get_turf(M) - if(locate(/obj/machinery/optable, T)) - . = OPERATE_IDEAL - else if(locate(/obj/structure/table, T)) - . = OPERATE_OKAY - else if(locate(/obj/structure/bed, T)) - . = OPERATE_PASSABLE - else if(locate(/obj/effect/rune, T)) - . = OPERATE_PASSABLE - else - . = OPERATE_DENY - if(. != OPERATE_DENY && M == user) - var/hitzone = check_zone(user.get_target_zone(), M) - var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(M, M.get_active_held_item_slot()) +/proc/can_operate(mob/living/victim, mob/living/user) + var/turf/T = get_turf(victim) + for(var/obj/surface in T) + . = max(., surface.get_surgery_surface_quality(victim, user)) + if(. != OPERATE_DENY && victim == user) + var/hitzone = check_zone(user.get_target_zone(), victim) + var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(victim, victim.get_active_held_item_slot()) + // TODO: write some generalized helper for this that handles single-organ limbs, more-than-two-organ limbs, etc if(E && (E.organ_tag == hitzone || E.parent_organ == hitzone)) to_chat(user, SPAN_WARNING("You can't operate on the same arm you're using to hold the surgical tool!")) return OPERATE_DENY diff --git a/code/modules/tools/archetypes/tool_archetype.dm b/code/modules/tools/archetypes/tool_archetype.dm index c0d3db35c9e..bc5c26a709d 100644 --- a/code/modules/tools/archetypes/tool_archetype.dm +++ b/code/modules/tools/archetypes/tool_archetype.dm @@ -1,4 +1,5 @@ /decl/tool_archetype + abstract_type = /decl/tool_archetype /// Noun for the tool. var/name = "tool" /// Boolean value for prefixing 'a' or 'an' to the tool name. diff --git a/code/modules/tools/archetypes/tool_extension_variable.dm b/code/modules/tools/archetypes/tool_extension_variable.dm index 920589ce72f..fdfcc651c6b 100644 --- a/code/modules/tools/archetypes/tool_extension_variable.dm +++ b/code/modules/tools/archetypes/tool_extension_variable.dm @@ -34,7 +34,12 @@ return (current_tool == archetype) ? ..() : INFINITY /datum/extension/tool/variable/handle_physical_manipulation(var/mob/user) - current_tool = next_in_list(current_tool, tool_values) + return switch_tool(next_in_list(current_tool, tool_values), user) + +/datum/extension/tool/variable/proc/switch_tool(new_tool, mob/user) + if(!(new_tool in tool_values)) + CRASH("Invalid tool mode [new_tool] passed to [holder]'s [type]!") + current_tool = new_tool var/config_sound = LAZYACCESS(tool_config_sounds, current_tool) if(islist(config_sound) && length(config_sound)) config_sound = pick(config_sound) @@ -48,6 +53,7 @@ to_chat(user, get_adjustment_message(tool_name)) var/atom/A = holder A.update_icon() + return TRUE /datum/extension/tool/variable/proc/get_adjustment_message(tool_name) return SPAN_NOTICE("You adjust \the [holder] to function as [tool_name].") diff --git a/code/modules/tools/archetypes/tool_item.dm b/code/modules/tools/archetypes/tool_item.dm index 46bdb6f427c..0f3310a89a2 100644 --- a/code/modules/tools/archetypes/tool_item.dm +++ b/code/modules/tools/archetypes/tool_item.dm @@ -73,7 +73,7 @@ var/decl/tool_archetype/tool_archetype = GET_DECL(tool_type) var/tool_string = tool_archetype.get_tool_quality_descriptor(tool.tool_values[tool_type]) if(tool_archetype.codex_key) - tool_string = "[tool_string]" + tool_string = "[tool_string]" LAZYADD(tool_strings, tool_string) if(length(tool_strings)) to_chat(user, "[gender == PLURAL ? "They look" : "It looks"] like [english_list(tool_strings)].") diff --git a/code/modules/tools/components/recipes.dm b/code/modules/tools/components/recipes.dm index 18a5720e604..9ab5516ceb8 100644 --- a/code/modules/tools/components/recipes.dm +++ b/code/modules/tools/components/recipes.dm @@ -13,7 +13,8 @@ difficulty = MAT_VALUE_NORMAL_DIY craft_stack_types = list( /obj/item/stack/material/plank, - /obj/item/stack/material/rods + /obj/item/stack/material/rods, + /obj/item/stack/material/bone ) /decl/stack_recipe/tool/handle/long diff --git a/code/modules/turbolift/turbolift.dm b/code/modules/turbolift/turbolift.dm index 96c8276a2af..8f7e12a7c2e 100644 --- a/code/modules/turbolift/turbolift.dm +++ b/code/modules/turbolift/turbolift.dm @@ -27,6 +27,8 @@ var/busy_state // Used for controller processing. var/next_process + var/move_air = FALSE // Whether or not the turbolift will move air with it. + /datum/turbolift/proc/emergency_stop() queued_floors.Cut() target_floor = null @@ -139,7 +141,7 @@ else if(AM.simulated) qdel(AM) - origin.move_contents_to(destination) + origin.move_contents_to(destination, move_air) if((locate(/obj/machinery/power) in destination) || (locate(/obj/structure/cable) in destination)) SSmachines.makepowernets() diff --git a/code/modules/turbolift/turbolift_areas.dm b/code/modules/turbolift/turbolift_areas.dm index 0d59bde8d0e..893f07ab67c 100644 --- a/code/modules/turbolift/turbolift_areas.dm +++ b/code/modules/turbolift/turbolift_areas.dm @@ -1,8 +1,8 @@ // Used for creating the exchange areas. /area/turbolift - name = "Turbolift" + name = "\improper Turbolift" base_turf = /turf/open - requires_power = 0 + requires_power = FALSE sound_env = SMALL_ENCLOSED holomap_color = HOLOMAP_AREACOLOR_LIFTS diff --git a/code/modules/turbolift/turbolift_console.dm b/code/modules/turbolift/turbolift_console.dm index e570d0421ea..8d34b659309 100644 --- a/code/modules/turbolift/turbolift_console.dm +++ b/code/modules/turbolift/turbolift_console.dm @@ -110,15 +110,15 @@ var/datum/turbolift_floor/floor = lift.floors[i] var/label = floor.label? floor.label : "Level #[i]" dat += "" - dat += "[label]: [floor.name]
    " + dat += "[label]: [floor.name]

    " dat += "
    " if(LAZYLEN(lift.doors)) if(lift.doors_are_open()) - dat += "Close Doors
    " + dat += "Close Doors
    " else - dat += "Open Doors
    " - dat += "Emergency Stop" + dat += "Open Doors
    " + dat += "Emergency Stop" dat += "
    " var/datum/browser/written_digital/popup = new(user, "turbolift_panel", "Lift Panel", 230, 260) diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index 1a5b1dc82c8..bacbcbc4dc5 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -104,7 +104,7 @@ engine.emp_act(severity) ..() -/obj/vehicle/bike/insert_cell(var/obj/item/cell/C, var/mob/living/carbon/human/H) +/obj/vehicle/bike/insert_cell(var/obj/item/cell/C, var/mob/living/human/H) return /obj/vehicle/bike/attackby(obj/item/W, mob/user) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index e995266e03f..d2ab6861d6d 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -97,20 +97,20 @@ else icon_state = initial(icon_state) -/obj/vehicle/train/cargo/trolley/insert_cell(var/obj/item/cell/C, var/mob/living/carbon/human/H) +/obj/vehicle/train/cargo/trolley/insert_cell(var/obj/item/cell/C, var/mob/living/human/H) return -/obj/vehicle/train/cargo/engine/insert_cell(var/obj/item/cell/C, var/mob/living/carbon/human/H) +/obj/vehicle/train/cargo/engine/insert_cell(var/obj/item/cell/C, var/mob/living/human/H) ..() update_stats() -/obj/vehicle/train/cargo/engine/remove_cell(var/mob/living/carbon/human/H) +/obj/vehicle/train/cargo/engine/remove_cell(var/mob/living/human/H) ..() update_stats() /obj/vehicle/train/cargo/engine/Bump(atom/Obstacle) var/obj/machinery/door/D = Obstacle - var/mob/living/carbon/human/H = load + var/mob/living/human/H = load if(istype(D) && istype(H)) D.Bumped(H) //a little hacky, but hey, it works, and respects access rights @@ -164,11 +164,11 @@ /obj/vehicle/train/cargo/engine/crossed_mob(var/mob/living/victim) ..() if(is_train_head() && ishuman(load)) - var/mob/living/carbon/human/D = load + var/mob/living/human/D = load to_chat(D, "You ran over \the [victim]!") visible_message("\The [src] ran over \the [victim]!") attack_log += text("\[[time_stamp()]\] ran over [victim.name] ([victim.ckey]), driven by [D.name] ([D.ckey])") - msg_admin_attack("[D.name] ([D.ckey]) ran over [victim.name] ([victim.ckey]). (JMP)") + msg_admin_attack("[D.name] ([D.ckey]) ran over [victim.name] ([victim.ckey]). (JMP)") else attack_log += text("\[[time_stamp()]\] ran over [victim.name] ([victim.ckey])") diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index 23975a13955..3d82b225205 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -67,7 +67,7 @@ if(ishuman(load)) var/mob/living/D = load to_chat(D, "You hit [M]!") - msg_admin_attack("[D.name] ([D.ckey]) hit [M.name] ([M.ckey]) with [src]. (JMP)") + msg_admin_attack("[D.name] ([D.ckey]) hit [M.name] ([M.ckey]) with [src]. (JMP)") //------------------------------------------- diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 644af96f2d4..7e3226f3c8d 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -221,7 +221,7 @@ turn_on() return -/obj/vehicle/proc/insert_cell(var/obj/item/cell/C, var/mob/living/carbon/human/H) +/obj/vehicle/proc/insert_cell(var/obj/item/cell/C, var/mob/living/human/H) if(cell) return if(!istype(C)) @@ -232,7 +232,7 @@ powercheck() to_chat(usr, "You install [C] in [src].") -/obj/vehicle/proc/remove_cell(var/mob/living/carbon/human/H) +/obj/vehicle/proc/remove_cell(var/mob/living/human/H) if(!cell) return diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm index 86d5576a807..b9548f48bb9 100644 --- a/code/modules/ventcrawl/ventcrawl.dm +++ b/code/modules/ventcrawl/ventcrawl.dm @@ -10,11 +10,7 @@ var/global/list/ventcrawl_machinery = list( /obj/item/radio/borg, /obj/item/holder, /obj/machinery/camera, - /obj/item/clothing/head/culthood, - /obj/item/clothing/suit/cultrobes, - /obj/item/book/tome, - /obj/item/paper/, - /obj/item/sword/cultblade + /obj/item/paper ) /mob/living @@ -34,13 +30,11 @@ var/global/list/ventcrawl_machinery = list( return ventcrawl_carry() /mob/living/proc/is_allowed_vent_crawl_item(var/obj/item/carried_item) - if(is_type_in_list(carried_item, can_enter_vent_with)) - return !get_equipped_slot_for_item(carried_item) - -/mob/living/carbon/is_allowed_vent_crawl_item(var/obj/item/carried_item) - return (carried_item in get_internal_organs()) || ..() + if(is_type_in_list(carried_item, can_enter_vent_with) && !get_equipped_slot_for_item(carried_item)) + return TRUE + return (carried_item in get_internal_organs()) -/mob/living/carbon/human/is_allowed_vent_crawl_item(var/obj/item/carried_item) +/mob/living/human/is_allowed_vent_crawl_item(var/obj/item/carried_item) var/obj/item/organ/internal/stomach = GET_INTERNAL_ORGAN(src, BP_STOMACH) if(stomach && (carried_item in stomach.contents)) return TRUE diff --git a/code/modules/weather/_weather.dm b/code/modules/weather/_weather.dm index 420c6b755fb..3feea9f4366 100644 --- a/code/modules/weather/_weather.dm +++ b/code/modules/weather/_weather.dm @@ -62,8 +62,8 @@ for(var/tz in affecting_zs) for(var/turf/T as anything in block(locate(1, 1, tz), locate(world.maxx, world.maxy, tz))) if(T.weather == src) - T.remove_vis_contents(vis_contents_additions) T.weather = null + T.update_vis_contents() vis_contents_additions.Cut() SSweather.unregister_weather_system(src) QDEL_NULL(lightning_overlay) @@ -99,3 +99,4 @@ alpha = 0 invisibility = INVISIBILITY_NONE is_spawnable_type = FALSE + appearance_flags = RESET_COLOR | KEEP_APART diff --git a/code/modules/xenoarcheaology/artifacts/artifact.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm index 905e551641a..95c7419c963 100644 --- a/code/modules/xenoarcheaology/artifacts/artifact.dm +++ b/code/modules/xenoarcheaology/artifacts/artifact.dm @@ -12,12 +12,14 @@ /obj/structure/artifact/Initialize() . = ..() - var/effecttype = pick(subtypesof(/datum/artifact_effect)) - my_effect = new effecttype(src) - - if(prob(75)) - effecttype = pick(subtypesof(/datum/artifact_effect)) - secondary_effect = new effecttype(src) + if(!ispath(my_effect)) + my_effect = pick(subtypesof(/datum/artifact_effect)) + my_effect = new my_effect(src) + + if(prob(75) && !ispath(secondary_effect)) + secondary_effect = pick(subtypesof(/datum/artifact_effect)) + if(ispath(secondary_effect)) + secondary_effect = new secondary_effect(src) if(prob(75)) secondary_effect.ToggleActivate(0) @@ -136,3 +138,7 @@ ..() if(!QDELETED(src) && fluids?.total_volume) check_triggers(/datum/artifact_trigger/proc/on_fluid_act, fluids) + +// Premade subtypes for mapping or testing. +/obj/structure/artifact/dnascramble + my_effect = /datum/artifact_effect/dnaswitch diff --git a/code/modules/xenoarcheaology/artifacts/effects/_effect.dm b/code/modules/xenoarcheaology/artifacts/effects/_effect.dm index 0f987bdcaf4..6d441a98c4c 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/_effect.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/_effect.dm @@ -107,7 +107,7 @@ . += " Activation index involves [trigger]." //returns 0..1, with 1 being no protection and 0 being fully protected -/proc/GetAnomalySusceptibility(var/mob/living/carbon/human/H) +/proc/GetAnomalySusceptibility(var/mob/living/human/H) if(!istype(H)) return 1 diff --git a/code/modules/xenoarcheaology/artifacts/effects/badfeeling.dm b/code/modules/xenoarcheaology/artifacts/effects/badfeeling.dm index 58c8b2283b1..02f4612a86d 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/badfeeling.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/badfeeling.dm @@ -33,18 +33,18 @@ /datum/artifact_effect/badfeeling/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(effect_range,T)) + for (var/mob/living/human/H in range(effect_range,T)) affect_human(H, 5, 10) return 1 /datum/artifact_effect/badfeeling/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(effect_range,T)) + for (var/mob/living/human/H in range(effect_range,T)) affect_human(H, 50, 50) return 1 -/datum/artifact_effect/badfeeling/proc/affect_human(mob/living/carbon/human/H, message_prob, dizziness_prob) +/datum/artifact_effect/badfeeling/proc/affect_human(mob/living/human/H, message_prob, dizziness_prob) if(H.stat) return if(prob(message_prob)) diff --git a/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm b/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm index 7eb65adf44c..4f4fa21b087 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm @@ -1,4 +1,3 @@ -//todo /datum/artifact_effect/dnaswitch name = "dnaswitch" origin_type = EFFECT_ORGANIC @@ -28,24 +27,35 @@ /datum/artifact_effect/dnaswitch/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for(var/mob/living/carbon/human/H in range(effect_range,T)) + for(var/mob/living/human/H in range(effect_range,T)) mess_dna(H, 100, 50, 30) return 1 /datum/artifact_effect/dnaswitch/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for(var/mob/living/carbon/human/H in range(effect_range, T)) + for(var/mob/living/human/H in range(effect_range, T)) mess_dna(H, 25, 75, 75) return 1 -/datum/artifact_effect/dnaswitch/proc/mess_dna(mob/living/carbon/human/H, scramble_prob, UI_scramble_prob, message_prob) +// Swapped to radiation pending readding of mutations. +/datum/artifact_effect/dnaswitch/proc/mess_dna(mob/living/human/H, scramble_prob, UI_scramble_prob, message_prob) var/weakness = GetAnomalySusceptibility(H) - if(prob(weakness * 100)) + if(prob(weakness * 100) && H.has_genetic_information()) if(prob(message_prob)) to_chat(H, "[pick(feels)]") - if(scramble_prob) + if(prob(scramble_prob) ) if(prob(UI_scramble_prob)) - scramble(1, H, weakness * severity) - else - scramble(0, H, weakness * severity) \ No newline at end of file + H.set_unique_enzymes(num2text(random_id(/mob, 1000000, 9999999))) + var/gene_scramble_prob = weakness * severity + if(prob(gene_scramble_prob)) + H.randomize_gender() + if(prob(gene_scramble_prob)) + H.randomize_skin_tone() + if(prob(gene_scramble_prob)) + H.randomize_skin_color() + if(prob(gene_scramble_prob)) + H.randomize_eye_color() + if(prob(gene_scramble_prob)) + var/decl/genetic_condition/condition = pick(decls_repository.get_decls_of_type_unassociated(/decl/genetic_condition)) + H.add_genetic_condition(condition.type) diff --git a/code/modules/xenoarcheaology/artifacts/effects/goodfeeling.dm b/code/modules/xenoarcheaology/artifacts/effects/goodfeeling.dm index 165e415697a..e5d88d10a30 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/goodfeeling.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/goodfeeling.dm @@ -31,18 +31,18 @@ /datum/artifact_effect/goodfeeling/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(effect_range,T)) + for (var/mob/living/human/H in range(effect_range,T)) affect_human(H, 5, 5) return 1 /datum/artifact_effect/goodfeeling/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(effect_range,T)) + for (var/mob/living/human/H in range(effect_range,T)) affect_human(H, 50, 50) return 1 -/datum/artifact_effect/goodfeeling/proc/affect_human(mob/living/carbon/human/H, message_prob, dizziness_prob) +/datum/artifact_effect/goodfeeling/proc/affect_human(mob/living/human/H, message_prob, dizziness_prob) if(H.stat) return if(prob(message_prob)) diff --git a/code/modules/xenoarcheaology/artifacts/effects/heal.dm b/code/modules/xenoarcheaology/artifacts/effects/heal.dm index a7d9dffa317..73bf53bc022 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/heal.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/heal.dm @@ -10,14 +10,14 @@ /datum/artifact_effect/heal/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(src.effect_range,T)) - heal(C, 1, msg_prob = 5) + for (var/mob/living/target in range(src.effect_range,T)) + heal(target, 1, msg_prob = 5) /datum/artifact_effect/heal/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(effect_range,T)) - heal(C, 5) + for (var/mob/living/target in range(effect_range,T)) + heal(target, 5) //todo: check over this properly /datum/artifact_effect/heal/proc/heal(mob/living/M, amount, strong, msg_prob = 100) @@ -33,5 +33,5 @@ M.bodytemperature = M.get_species()?.body_temperature || initial(M.bodytemperature) M.adjust_nutrition(50 * weakness) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M H.regenerate_blood(5 * weakness) diff --git a/code/modules/xenoarcheaology/artifacts/effects/hurt.dm b/code/modules/xenoarcheaology/artifacts/effects/hurt.dm index c7d2004fbb0..238e8b99865 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/hurt.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/hurt.dm @@ -9,14 +9,14 @@ /datum/artifact_effect/hurt/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(src.effect_range,T)) - hurt(C, 1, msg_prob = 5) + for (var/mob/living/target in range(src.effect_range,T)) + hurt(target, 1, msg_prob = 5) /datum/artifact_effect/hurt/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(effect_range, T)) - hurt(C, 3) + for (var/mob/living/target in range(effect_range, T)) + hurt(target, 3) /datum/artifact_effect/hurt/proc/hurt(mob/living/M, amount, strong, msg_prob=100) var/weakness = GetAnomalySusceptibility(M) diff --git a/code/modules/xenoarcheaology/artifacts/effects/sleepy.dm b/code/modules/xenoarcheaology/artifacts/effects/sleepy.dm index b2a9e97ba48..6bb1478a0ba 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/sleepy.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/sleepy.dm @@ -20,18 +20,18 @@ /datum/artifact_effect/sleepy/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for(var/mob/living/carbon/human/H in range(effect_range,T)) + for(var/mob/living/human/H in range(effect_range,T)) sleepify(H, 2, 25, 10) return 1 /datum/artifact_effect/sleepy/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for(var/mob/living/carbon/human/H in range(effect_range, T)) + for(var/mob/living/human/H in range(effect_range, T)) sleepify(H, rand(5,15), 50, 50) return 1 -/datum/artifact_effect/sleepy/proc/sleepify(mob/living/carbon/human/H, speed, limit, message_prob) +/datum/artifact_effect/sleepy/proc/sleepify(mob/living/human/H, speed, limit, message_prob) var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100)) if(H.isSynthetic()) diff --git a/code/modules/xenoarcheaology/artifacts/effects/stun.dm b/code/modules/xenoarcheaology/artifacts/effects/stun.dm index c0d10b7db9c..257a9976bf4 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/stun.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/stun.dm @@ -17,21 +17,21 @@ /datum/artifact_effect/stun/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(effect_range,T)) - var/susceptibility = GetAnomalySusceptibility(C) + for (var/mob/living/target in range(effect_range,T)) + var/susceptibility = GetAnomalySusceptibility(target) if(prob(10 * susceptibility)) - to_chat(C, "Your body goes numb for a moment.") - SET_STATUS_MAX(C, STAT_WEAK, 2) - SET_STATUS_MAX(C, STAT_STUTTER, 2) + to_chat(target, "Your body goes numb for a moment.") + SET_STATUS_MAX(target, STAT_WEAK, 2) + SET_STATUS_MAX(target, STAT_STUTTER, 2) else if(prob(10)) - to_chat(C, "You feel numb.") + to_chat(target, "You feel numb.") /datum/artifact_effect/stun/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(effect_range,T)) - var/susceptibility = GetAnomalySusceptibility(C) + for (var/mob/living/target in range(effect_range,T)) + var/susceptibility = GetAnomalySusceptibility(target) if(prob(100 * susceptibility)) - to_chat(C, "A wave of energy overwhelms your senses!") - SET_STATUS_MAX(C, STAT_WEAK, 4 * susceptibility) - SET_STATUS_MAX(C, STAT_STUTTER, 4 * susceptibility) + to_chat(target, "A wave of energy overwhelms your senses!") + SET_STATUS_MAX(target, STAT_WEAK, 4 * susceptibility) + SET_STATUS_MAX(target, STAT_STUTTER, 4 * susceptibility) diff --git a/code/modules/xenoarcheaology/artifacts/standalone/replicator.dm b/code/modules/xenoarcheaology/artifacts/standalone/replicator.dm index 53a2d7655a1..ec01c88cba6 100644 --- a/code/modules/xenoarcheaology/artifacts/standalone/replicator.dm +++ b/code/modules/xenoarcheaology/artifacts/standalone/replicator.dm @@ -121,7 +121,7 @@ var/dat = "The control panel displays an incomprehensible selection of controls, many with unusual markings or text around them.
    " dat += "
    " for(var/index=1, index<=construction.len, index++) - dat += "\[[construction[index]]\]
    " + dat += "\[[construction[index]]\]
    " show_browser(user, dat, "window=alien_replicator") diff --git a/code/modules/xenoarcheaology/artifacts/triggers/_trigger.dm b/code/modules/xenoarcheaology/artifacts/triggers/_trigger.dm index 58558914b6f..f5193d211e2 100644 --- a/code/modules/xenoarcheaology/artifacts/triggers/_trigger.dm +++ b/code/modules/xenoarcheaology/artifacts/triggers/_trigger.dm @@ -4,7 +4,7 @@ //There procs should return TRUE if trigger is activated, FALSE if nothing happens -/datum/artifact_trigger/proc/on_hit(obj/O, mob/user) +/datum/artifact_trigger/proc/on_hit(obj/item/hit_with, mob/user) return FALSE /datum/artifact_trigger/proc/on_touch(mob/M) diff --git a/code/modules/xenoarcheaology/artifacts/triggers/energy.dm b/code/modules/xenoarcheaology/artifacts/triggers/energy.dm index 7075d6be0a9..7efb242c095 100644 --- a/code/modules/xenoarcheaology/artifacts/triggers/energy.dm +++ b/code/modules/xenoarcheaology/artifacts/triggers/energy.dm @@ -1,7 +1,6 @@ /datum/artifact_trigger/energy name = "applied high energy" var/static/list/energetic_things = list( - /obj/item/sword/cultblade, /obj/item/card/emag, /obj/item/multitool ) diff --git a/code/modules/xenoarcheaology/artifacts/triggers/force.dm b/code/modules/xenoarcheaology/artifacts/triggers/force.dm index 6184b118549..0e2daea434b 100644 --- a/code/modules/xenoarcheaology/artifacts/triggers/force.dm +++ b/code/modules/xenoarcheaology/artifacts/triggers/force.dm @@ -1,21 +1,20 @@ /datum/artifact_trigger/force name = "kinetic impact" -/datum/artifact_trigger/force/on_hit(obj/O, mob/user) +/datum/artifact_trigger/force/on_hit(obj/item/hit_with, mob/user) . = ..() - if(istype(O, /obj/item/projectile)) - var/obj/item/projectile/P = O - return (P.atom_damage_type == BRUTE) - else if(istype(O, /obj/item)) - var/obj/item/W = O - return (W.force >= 10) + if(istype(hit_with, /obj/item/projectile)) + var/obj/item/projectile/hit_projectile = hit_with + return (hit_projectile.atom_damage_type == BRUTE) + else if(istype(hit_with, /obj/item)) + return (hit_with.force >= 10) /datum/artifact_trigger/force/on_explosion(severity) return TRUE -/datum/artifact_trigger/force/on_bump(atom/movable/AM) +/datum/artifact_trigger/force/on_bump(atom/movable/bumper) . = ..() - if(isobj(AM)) - var/obj/O = AM - if(O.throwforce >= 10) + if(isobj(bumper)) + var/obj/bump_object = bumper + if(bump_object.throwforce >= 10) return TRUE \ No newline at end of file diff --git a/code/modules/xenoarcheaology/artifacts/triggers/touch.dm b/code/modules/xenoarcheaology/artifacts/triggers/touch.dm index 8be77b1b5bb..7eabff44e95 100644 --- a/code/modules/xenoarcheaology/artifacts/triggers/touch.dm +++ b/code/modules/xenoarcheaology/artifacts/triggers/touch.dm @@ -1,7 +1,7 @@ /datum/artifact_trigger/touch name = "touch" -/datum/artifact_trigger/touch/proc/can_touch(mob/living/carbon/human/H, bodypart) +/datum/artifact_trigger/touch/proc/can_touch(mob/living/human/H, bodypart) return TRUE /datum/artifact_trigger/touch/on_touch(mob/living/M) @@ -14,7 +14,7 @@ /datum/artifact_trigger/touch/organic name = "organic touch" -/datum/artifact_trigger/touch/organic/can_touch(mob/living/carbon/human/H, bodypart) +/datum/artifact_trigger/touch/organic/can_touch(mob/living/human/H, bodypart) if(!istype(H)) return FALSE if(H.get_covering_equipped_item_by_zone(bodypart)) @@ -31,7 +31,7 @@ if(issilicon(L)) return TRUE if(ishuman(L)) - var/mob/living/carbon/human/H = L + var/mob/living/human/H = L if(H.isSynthetic()) return TRUE var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, bodypart) diff --git a/code/modules/xenoarcheaology/boulder.dm b/code/modules/xenoarcheaology/boulder.dm index d84fcba62fd..31d5602461e 100644 --- a/code/modules/xenoarcheaology/boulder.dm +++ b/code/modules/xenoarcheaology/boulder.dm @@ -84,7 +84,7 @@ /obj/structure/boulder/Bumped(AM) . = ..() if(ishuman(AM)) - var/mob/living/carbon/human/H = AM + var/mob/living/human/H = AM for(var/obj/item/P in H.get_inactive_held_items()) if(IS_PICK(P)) attackby(P, H) diff --git a/code/modules/xenoarcheaology/datums/artifact_find.dm b/code/modules/xenoarcheaology/datums/artifact_find.dm index 54bb2008584..b70f17112e8 100644 --- a/code/modules/xenoarcheaology/datums/artifact_find.dm +++ b/code/modules/xenoarcheaology/datums/artifact_find.dm @@ -1,19 +1,16 @@ /datum/artifact_find var/artifact_id var/artifact_find_type + var/static/potential_finds = list( + /obj/machinery/power/supermatter = 5, + /obj/machinery/power/supermatter/shard = 25, + /obj/machinery/auto_cloner = 100, + /obj/machinery/giga_drill = 100, + /obj/machinery/replicator = 100, + /obj/structure/crystal = 150, + /obj/structure/artifact = 1000 + ) /datum/artifact_find/New() - artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[random_id(/datum/artifact_find, 100, 999)]" - - artifact_find_type = pick( - 5;/obj/machinery/power/supermatter, - 5;/obj/structure/constructshell, - 5;/obj/machinery/syndicate_beacon, - 25;/obj/machinery/power/supermatter/shard, - 50;/obj/structure/cult/pylon, - 100;/obj/machinery/auto_cloner, - 100;/obj/machinery/giga_drill, - 100;/obj/machinery/replicator, - 150;/obj/structure/crystal, -1000;/obj/structure/artifact) \ No newline at end of file + artifact_find_type = pickweight(potential_finds) diff --git a/code/modules/xenoarcheaology/finds/digsite_types.dm b/code/modules/xenoarcheaology/finds/digsite_types.dm index 88563d3ce35..8a3fffed241 100644 --- a/code/modules/xenoarcheaology/finds/digsite_types.dm +++ b/code/modules/xenoarcheaology/finds/digsite_types.dm @@ -51,13 +51,11 @@ /decl/xenoarch_digsite/temple find_types = list( - /decl/archaeological_find/cult = 200, /decl/archaeological_find/statuette = 200, /decl/archaeological_find/bowl/urn = 100, /decl/archaeological_find/bowl = 100, /decl/archaeological_find/knife = 100, /decl/archaeological_find/crystal = 100, - /decl/archaeological_find/cult/sword = 75, /decl/archaeological_find = 50, /decl/archaeological_find/trap = 25, /decl/archaeological_find/sword = 10, @@ -73,8 +71,6 @@ /decl/archaeological_find/laser = 75, /decl/archaeological_find/sword = 75, /decl/archaeological_find = 50, - /decl/archaeological_find/cult = 50, - /decl/archaeological_find/cult/sword = 50, /decl/archaeological_find/mask = 50, /decl/archaeological_find/trap = 25, /decl/archaeological_find/tool = 25 diff --git a/code/modules/xenoarcheaology/finds/find_types/statuette.dm b/code/modules/xenoarcheaology/finds/find_types/statuette.dm index c15c76efb84..ce0daf47304 100644 --- a/code/modules/xenoarcheaology/finds/find_types/statuette.dm +++ b/code/modules/xenoarcheaology/finds/find_types/statuette.dm @@ -17,7 +17,7 @@ name = "statuette" icon_state = "statuette" icon = 'icons/obj/xenoarchaeology.dmi' - material = /decl/material/solid/stone/cult + material = /decl/material/solid/stone/basalt var/charges = 0 var/list/nearby_mobs = list() var/last_bloodcall = 0 @@ -39,7 +39,7 @@ /obj/item/vampiric/Process() //see if we've identified anyone nearby if(world.time - last_bloodcall > bloodcall_interval && nearby_mobs.len) - var/mob/living/carbon/human/M = pop(nearby_mobs) + var/mob/living/human/M = pop(nearby_mobs) if(M in view(7,src) && M.current_health > 20) if(prob(50)) bloodcall(M) @@ -99,7 +99,7 @@ if(world.time - last_bloodcall >= bloodcall_interval && (M in view(7, src))) bloodcall(M) -/obj/item/vampiric/proc/bloodcall(var/mob/living/carbon/human/M) +/obj/item/vampiric/proc/bloodcall(var/mob/living/human/M) last_bloodcall = world.time if(istype(M)) playsound(src.loc, pick('sound/hallucinations/wail.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/far_noise.ogg'), 50, 1, -3) @@ -167,7 +167,7 @@ /obj/effect/shadow_wight/Process() if(loc) step_rand(src) - var/mob/living/carbon/M = locate() in src.loc + var/mob/living/M = locate() in src.loc if(M) playsound(src.loc, pick('sound/hallucinations/behind_you1.ogg',\ 'sound/hallucinations/behind_you2.ogg',\ diff --git a/code/modules/xenoarcheaology/tools/depth_scanner.dm b/code/modules/xenoarcheaology/tools/depth_scanner.dm index 1b497372ec9..a26253156a0 100644 --- a/code/modules/xenoarcheaology/tools/depth_scanner.dm +++ b/code/modules/xenoarcheaology/tools/depth_scanner.dm @@ -72,7 +72,7 @@ /obj/item/depth_scanner/interact(var/mob/user) var/dat = "Coordinates with positive matches
    " - dat += "== Clear all ==
    " + dat += "== Clear all ==
    " if(current) dat += "Time: [current.time]
    " @@ -84,7 +84,7 @@ dat += "Anomaly material: [responsive_carriers[current.material]]
    " else dat += "Anomaly material: Unknown
    " - dat += "clear entry
    " + dat += "clear entry
    " else dat += "Select an entry from the list
    " dat += "



    " @@ -92,12 +92,12 @@ if(positive_locations.len) for(var/index = 1 to positive_locations.len) var/datum/depth_scan/D = positive_locations[index] - dat += "[D.time], coords: [D.coords]
    " + dat += "[D.time], coords: [D.coords]
    " else dat += "No entries recorded." dat += "
    " - dat += "Refresh
    " + dat += "Refresh
    " var/datum/browser/popup = new(user, "depth_scanner", "Results", 300, 500) popup.set_content(dat) popup.open() diff --git a/code/modules/xenoarcheaology/tools/equipment.dm b/code/modules/xenoarcheaology/tools/equipment.dm index 5dfbe50ba1d..7d9047fa973 100644 --- a/code/modules/xenoarcheaology/tools/equipment.dm +++ b/code/modules/xenoarcheaology/tools/equipment.dm @@ -2,7 +2,7 @@ name = "anomaly suit" desc = "A suit that protects against exotic alien energies and biological contamination." anomaly_shielding = 0.7 - icon = 'icons/clothing/suit/biosuit/anomaly.dmi' + icon = 'icons/clothing/suits/biosuit/anomaly.dmi' /obj/item/clothing/head/bio_hood/anomaly name = "anomaly hood" diff --git a/code/procs/announce.dm b/code/procs/announce.dm index af8676554a7..0134ca4a1db 100644 --- a/code/procs/announce.dm +++ b/code/procs/announce.dm @@ -130,7 +130,7 @@ var/global/datum/announcement/minor/minor_announcement = new(new_sound = 'sound/ /proc/ion_storm_announcement(list/affecting_z) command_announcement.Announce("It has come to our attention that the [station_name()] passed through an ion storm. Please monitor all electronic equipment for malfunctions.", "Anomaly Alert", zlevels = affecting_z) -/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/datum/job/job, var/join_message) +/proc/AnnounceArrival(var/mob/living/human/character, var/datum/job/job, var/join_message) if(!istype(job) || !job.announced) return if (GAME_STATE != RUNLEVEL_GAME) diff --git a/code/procs/hud.dm b/code/procs/hud.dm index 760d1b2fb37..5f4c5580e92 100644 --- a/code/procs/hud.dm +++ b/code/procs/hud.dm @@ -13,7 +13,7 @@ the HUD updates properly! */ if(!can_process_hud(M)) return var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, global.med_hud_users) - for(var/mob/living/carbon/human/patient in P.Mob.in_view(P.Turf)) + for(var/mob/living/human/patient in P.Mob.in_view(P.Turf)) if(patient.is_invisible_to(P.Mob)) continue @@ -38,7 +38,7 @@ the HUD updates properly! */ if(!can_process_hud(M)) return var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, global.sec_hud_users) - for(var/mob/living/carbon/human/perp in P.Mob.in_view(P.Turf)) + for(var/mob/living/human/perp in P.Mob.in_view(P.Turf)) if(perp.is_invisible_to(P.Mob)) continue @@ -95,7 +95,7 @@ the HUD updates properly! */ /mob/observer/eye/in_view(var/turf/T) var/list/viewed = new - for(var/mob/living/carbon/human/H in SSmobs.mob_list) + for(var/mob/living/human/H in SSmobs.mob_list) if(get_dist(H, T) <= 7) viewed += H return viewed diff --git a/code/unit_tests/aspects.dm b/code/unit_tests/aspects.dm deleted file mode 100644 index 8c76dd5f447..00000000000 --- a/code/unit_tests/aspects.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/unit_test/aspects_shall_not_have_circular_references - name = "ASPECTS: Aspects Shall Not Have Circular References" - -/datum/unit_test/aspects_shall_not_have_circular_references/start_test() - - var/list/failures = list() - var/list/all_aspects = decls_repository.get_decls_of_subtype(/decl/aspect) - for(var/atype in all_aspects) - - var/list/seen_aspects = list() - var/list/checking_aspects = list(all_aspects[atype]) - while(checking_aspects.len) - var/decl/aspect/aspect = checking_aspects[1] - checking_aspects -= aspect - if(aspect in seen_aspects) - failures += "[atype] - [aspect.type]" - break - else - seen_aspects += aspect - if(aspect.children) - checking_aspects |= aspect.children - - if(length(failures)) - fail("Found [length(failures)] circular reference\s:\n[jointext(failures, "\n")]") - else - pass("Aspect tree has no circular references.") - return 1 diff --git a/code/unit_tests/codex.dm b/code/unit_tests/codex.dm index 7c69764a304..92a97cec0d5 100644 --- a/code/unit_tests/codex.dm +++ b/code/unit_tests/codex.dm @@ -62,3 +62,19 @@ else pass("All codex links were functional.") return 1 + +/datum/unit_test/codex_dump_test + name = "CODEX - Codex Will Successfully Dump To Filesystem" + +/datum/unit_test/codex_dump_test/start_test() + var/dump_result + try + dump_result = SScodex.dump_to_filesystem() + catch(var/exception/E) + fail("Codex dump threw an exception: [EXCEPTION_TEXT(E)]") + return 1 + if(dump_result) + pass("Codex dumped successfully.") + else + fail("Codex dump did not return true.") + return 1 diff --git a/code/unit_tests/equipment_tests.dm b/code/unit_tests/equipment_tests.dm index 95032a01c88..25146ab9251 100644 --- a/code/unit_tests/equipment_tests.dm +++ b/code/unit_tests/equipment_tests.dm @@ -1,13 +1,13 @@ /datum/unit_test/vision_glasses name = "EQUIPMENT: Vision Template" template = /datum/unit_test/vision_glasses - var/mob/living/carbon/human/H = null + var/mob/living/human/H = null var/expectation = SEE_INVISIBLE_NOLIGHTING var/glasses_type = null async = 1 /datum/unit_test/vision_glasses/start_test() - var/list/test = create_test_mob_with_mind(get_safe_turf(), /mob/living/carbon/human) + var/list/test = create_test_mob_with_mind(get_safe_turf(), /mob/living/human) if(isnull(test)) fail("Check Runtimed in Mob creation") @@ -129,7 +129,7 @@ "[slot_wear_suit_str]" = /obj/item/clothing/suit/chickensuit ) -/datum/unit_test/equipment_slot_test/proc/check_slot_equip_successful(mob/living/carbon/human/subject, obj/item/item, which_slot, list/failure_list) +/datum/unit_test/equipment_slot_test/proc/check_slot_equip_successful(mob/living/human/subject, obj/item/item, which_slot, list/failure_list) created_atoms |= item subject.equip_to_slot_if_possible(item, which_slot) if(!subject.isEquipped(item)) @@ -138,13 +138,13 @@ var/equipped_location = subject.get_equipped_slot_for_item(item) failure_list += "[item] was expected to be equipped to [which_slot] but get_equipped_slot_for_item returned [isnull(equipped_location) ? "NULL" : equipped_location]." -/datum/unit_test/equipment_slot_test/proc/check_slot_unequip_successful(mob/living/carbon/human/subject, obj/item/item, which_slot, list/failure_list) +/datum/unit_test/equipment_slot_test/proc/check_slot_unequip_successful(mob/living/human/subject, obj/item/item, which_slot, list/failure_list) created_atoms |= item subject.try_unequip(item) if(subject.isEquipped(item)) failure_list += "[item] remained equipped to [subject.get_equipped_slot_for_item(item)] after unEquip was called." -/datum/unit_test/equipment_slot_test/proc/check_slot_equip_failure(mob/living/carbon/human/subject, obj/item/item, which_slot, list/failure_list) +/datum/unit_test/equipment_slot_test/proc/check_slot_equip_failure(mob/living/human/subject, obj/item/item, which_slot, list/failure_list) created_atoms |= item subject.equip_to_slot_if_possible(item, which_slot) if(subject.isEquipped(item)) @@ -155,7 +155,7 @@ failure_list += "[item] was equipped to [equipped_location] despite failing isEquipped (should not be equipped)." /datum/unit_test/equipment_slot_test/start_test() - var/mob/living/carbon/human/subject = new(get_safe_turf(), SPECIES_HUMAN) // force human so default map species doesn't mess with anything + var/mob/living/human/subject = new(get_safe_turf(), SPECIES_HUMAN) // force human so default map species doesn't mess with anything created_atoms |= subject var/list/failures = list() diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm index c1d7651da27..5867dd2ca90 100644 --- a/code/unit_tests/mob_tests.dm +++ b/code/unit_tests/mob_tests.dm @@ -25,7 +25,7 @@ var/list/bodytype_pairings = get_bodytype_species_pairs() for(var/decl/bodytype/bodytype in bodytype_pairings) var/decl/species/species = bodytype_pairings[bodytype] - var/mob/living/carbon/human/test_subject = new(null, species.name, null, bodytype) + var/mob/living/human/test_subject = new(null, species.name, null, bodytype) if(test_subject.need_breathe()) test_subject.apply_effect(20, STUN, 0) var/obj/item/organ/internal/lungs/L = test_subject.get_organ(test_subject.get_bodytype().breathing_organ, /obj/item/organ/internal/lungs) @@ -36,13 +36,13 @@ /datum/unit_test/human_breath/check_result() for(var/i in test_subjects) - var/mob/living/carbon/human/test_subject = test_subjects[i][1] + var/mob/living/human/test_subject = test_subjects[i][1] if(test_subject.life_tick < 10) // Finish Condition return 0 // Return 0 to try again later. var/failcount = 0 for(var/i in test_subjects) - var/mob/living/carbon/human/test_subject = test_subjects[i][1] + var/mob/living/human/test_subject = test_subjects[i][1] var/ending_oxyloss = damage_check(test_subject, OXY) var/starting_oxyloss = test_subjects[i][2] if(starting_oxyloss >= ending_oxyloss) @@ -60,7 +60,7 @@ var/global/default_mobloc = null -/proc/create_test_mob_with_mind(var/turf/mobloc = null, var/mobtype = /mob/living/carbon/human) +/proc/create_test_mob_with_mind(var/turf/mobloc = null, var/mobtype = /mob/living/human) var/list/test_result = list("result" = FAILURE, "msg" = "", "mobref" = null) if(isnull(mobloc)) @@ -77,7 +77,7 @@ var/global/default_mobloc = null test_result["msg"] = "Unable to find a location to create test mob" return test_result - var/mob/living/carbon/human/H = new mobtype(mobloc) + var/mob/living/human/H = new mobtype(mobloc) H.mind_initialize("TestKey[rand(0,10000)]") @@ -108,7 +108,7 @@ var/global/default_mobloc = null loss = M.get_damage(PAIN) if(!loss && ishuman(M)) - var/mob/living/carbon/human/H = M // Synthetics have robot limbs which don't report damage to get_damage(XXX) + var/mob/living/human/H = M // Synthetics have robot limbs which don't report damage to get_damage(XXX) if(H.isSynthetic()) // So we have to hard code this check or create a different one for them. return H.species.total_health - H.current_health return loss @@ -131,7 +131,7 @@ var/global/default_mobloc = null name = "MOB: Template for mob damage" template = /datum/unit_test/mob_damage var/damagetype = BRUTE - var/mob_type = /mob/living/carbon/human + var/mob_type = /mob/living/human var/expected_vulnerability = STANDARD var/damage_location = BP_CHEST @@ -147,7 +147,7 @@ var/global/default_mobloc = null fail(test["msg"]) return 0 - var/mob/living/carbon/human/H = locate(test["mobref"]) + var/mob/living/human/H = locate(test["mobref"]) if(isnull(H)) fail("Test unable to set test mob from reference") @@ -289,13 +289,13 @@ var/global/default_mobloc = null /datum/unit_test/mob_nullspace/start_test() // Simply create one of each species type in nullspace for(var/species_name in get_all_species()) - var/test_subject = new/mob/living/carbon/human(null, species_name) + var/test_subject = new/mob/living/human(null, species_name) test_subjects += test_subject return TRUE /datum/unit_test/mob_nullspace/check_result() for(var/ts in test_subjects) - var/mob/living/carbon/human/H = ts + var/mob/living/human/H = ts if(H.life_tick < 10) return FALSE @@ -310,7 +310,7 @@ var/global/default_mobloc = null /datum/unit_test/mob_organ_size/start_test() var/failed = FALSE for(var/species_name in get_all_species()) - var/mob/living/carbon/human/H = new(null, species_name) + var/mob/living/human/H = new(null, species_name) for(var/obj/item/organ/external/E in H.get_external_organs()) for(var/obj/item/organ/internal/I in E.internal_organs) if(I.w_class > E.cavity_max_w_class) diff --git a/code/unit_tests/observation_tests.dm b/code/unit_tests/observation_tests.dm index aea6e3f5489..b9174d26fe8 100644 --- a/code/unit_tests/observation_tests.dm +++ b/code/unit_tests/observation_tests.dm @@ -112,7 +112,7 @@ /datum/unit_test/observation/moved_observer_shall_register_on_follow/conduct_test() var/turf/T = get_safe_turf() - var/mob/living/carbon/human/H = get_named_instance(/mob/living/carbon/human, T, global.using_map.default_species) + var/mob/living/human/H = get_named_instance(/mob/living/human, T, global.using_map.default_species) var/mob/observer/ghost/O = get_named_instance(/mob/observer/ghost, T, "Ghost") O.ManualFollow(H) @@ -130,7 +130,7 @@ /datum/unit_test/observation/moved_observer_shall_unregister_on_nofollow/conduct_test() var/turf/T = get_safe_turf() - var/mob/living/carbon/human/H = get_named_instance(/mob/living/carbon/human, T, global.using_map.default_species) + var/mob/living/human/H = get_named_instance(/mob/living/human, T, global.using_map.default_species) var/mob/observer/ghost/O = get_named_instance(/mob/observer/ghost, T, "Ghost") O.ManualFollow(H) @@ -149,7 +149,7 @@ /datum/unit_test/observation/moved_shall_not_register_on_enter_without_listeners/conduct_test() var/turf/T = get_safe_turf() - var/mob/living/carbon/human/H = get_named_instance(/mob/living/carbon/human, T, global.using_map.default_species) + var/mob/living/human/H = get_named_instance(/mob/living/human, T, global.using_map.default_species) qdel(H.virtual_mob) H.virtual_mob = null @@ -170,7 +170,7 @@ /datum/unit_test/observation/moved_shall_register_recursively_on_new_listener/conduct_test() var/turf/T = get_safe_turf() - var/mob/living/carbon/human/H = get_named_instance(/mob/living/carbon/human, T, global.using_map.default_species) + var/mob/living/human/H = get_named_instance(/mob/living/human, T, global.using_map.default_species) var/obj/structure/closet/C = get_named_instance(/obj/structure/closet, T, "Closet") var/mob/observer/ghost/O = get_named_instance(/mob/observer/ghost, T, "Ghost") @@ -193,7 +193,7 @@ /datum/unit_test/observation/moved_shall_register_recursively_with_existing_listener/conduct_test() var/turf/T = get_safe_turf() - var/mob/living/carbon/human/H = get_named_instance(/mob/living/carbon/human, T, global.using_map.default_species) + var/mob/living/human/H = get_named_instance(/mob/living/human, T, global.using_map.default_species) var/obj/structure/closet/C = get_named_instance(/obj/structure/closet, T, "Closet") var/mob/observer/ghost/O = get_named_instance(/mob/observer/ghost, T, "Ghost") diff --git a/code/unit_tests/organ_tests.dm b/code/unit_tests/organ_tests.dm index ee6aaf2755d..86d3406a5f3 100644 --- a/code/unit_tests/organ_tests.dm +++ b/code/unit_tests/organ_tests.dm @@ -22,7 +22,7 @@ /datum/unit_test/bodytype_organ_creation name = "ORGAN: Bodytype Organs are Created Correctly" -/datum/unit_test/bodytype_organ_creation/proc/check_internal_organs(var/mob/living/carbon/human/H, var/decl/bodytype/bodytype) +/datum/unit_test/bodytype_organ_creation/proc/check_internal_organs(var/mob/living/human/H, var/decl/bodytype/bodytype) . = 1 for(var/organ_tag in bodytype.has_organ) var/obj/item/organ/I = GET_INTERNAL_ORGAN(H, organ_tag) @@ -46,7 +46,7 @@ fail("[bodytype.name] internal organ has invalid absolute_max_damage value ([I.absolute_max_damage]).") . = 0 -/datum/unit_test/bodytype_organ_creation/proc/check_external_organs(var/mob/living/carbon/human/H, var/decl/bodytype/bodytype) +/datum/unit_test/bodytype_organ_creation/proc/check_external_organs(var/mob/living/human/H, var/decl/bodytype/bodytype) . = 1 for(var/organ_tag in bodytype.has_limbs) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, organ_tag) @@ -71,7 +71,7 @@ fail("[bodytype.name] external organ has invalid absolute_max_damage value ([E.absolute_max_damage]).") . = 0 -/datum/unit_test/bodytype_organ_creation/proc/check_organ_parents(var/mob/living/carbon/human/H, var/decl/bodytype/bodytype) +/datum/unit_test/bodytype_organ_creation/proc/check_organ_parents(var/mob/living/human/H, var/decl/bodytype/bodytype) . = 1 var/list/external_organs = H.get_external_organs() for(var/obj/item/organ/external/E in external_organs) @@ -119,7 +119,7 @@ var/list/bodytype_pairings = get_bodytype_species_pairs() for(var/decl/bodytype/bodytype in bodytype_pairings) var/decl/species/species = bodytype_pairings[bodytype] - var/mob/living/carbon/human/test_subject = new(null, species.name, null, bodytype) + var/mob/living/human/test_subject = new(null, species.name, null, bodytype) var/fail = 0 fail |= !check_internal_organs(test_subject, bodytype) @@ -138,7 +138,7 @@ /datum/unit_test/bodytype_organ_lists_update name = "ORGAN: Species Mob Organ Lists Update when Organs are Removed and Replaced." -/datum/unit_test/bodytype_organ_lists_update/proc/check_internal_organ_present(var/mob/living/carbon/human/H, var/obj/item/organ/internal/I) +/datum/unit_test/bodytype_organ_lists_update/proc/check_internal_organ_present(var/mob/living/human/H, var/obj/item/organ/internal/I) var/decl/bodytype/root_bodytype = H.get_bodytype() if(!(I in H.get_internal_organs())) fail("[root_bodytype.name] internal organ [I] not in internal_organs.") @@ -156,7 +156,7 @@ return 0 return 1 -/datum/unit_test/bodytype_organ_lists_update/proc/check_internal_organ_removed(var/mob/living/carbon/human/H, var/obj/item/organ/internal/I, var/obj/item/organ/external/old_parent) +/datum/unit_test/bodytype_organ_lists_update/proc/check_internal_organ_removed(var/mob/living/human/H, var/obj/item/organ/internal/I, var/obj/item/organ/external/old_parent) var/decl/bodytype/root_bodytype = H.get_bodytype() if(I in H.get_internal_organs()) fail("[root_bodytype.name] internal organ [I] was not removed from internal_organs.") @@ -170,7 +170,7 @@ return 0 return 1 -/datum/unit_test/bodytype_organ_lists_update/proc/check_external_organ_present(var/mob/living/carbon/human/H, var/obj/item/organ/external/E) +/datum/unit_test/bodytype_organ_lists_update/proc/check_external_organ_present(var/mob/living/human/H, var/obj/item/organ/external/E) var/decl/bodytype/root_bodytype = H.get_bodytype() if(!(E in H.get_external_organs())) fail("[root_bodytype.name] external organ [E] not in organs.") @@ -192,7 +192,7 @@ return 0 return 1 -/datum/unit_test/bodytype_organ_lists_update/proc/check_external_organ_removed(var/mob/living/carbon/human/H, var/obj/item/organ/external/E, var/obj/item/organ/external/old_parent = null) +/datum/unit_test/bodytype_organ_lists_update/proc/check_external_organ_removed(var/mob/living/human/H, var/obj/item/organ/external/E, var/obj/item/organ/external/old_parent = null) var/decl/bodytype/root_bodytype = H.get_bodytype() if(E in H.get_external_organs()) fail("[root_bodytype.name] external organ [E] was not removed from organs.") @@ -207,7 +207,7 @@ return 0 return 1 -/datum/unit_test/bodytype_organ_lists_update/proc/test_internal_organ(var/mob/living/carbon/human/H, var/obj/item/organ/internal/I) +/datum/unit_test/bodytype_organ_lists_update/proc/test_internal_organ(var/mob/living/human/H, var/obj/item/organ/internal/I) var/decl/bodytype/root_bodytype = H.get_bodytype() if(!check_internal_organ_present(H, I)) fail("[root_bodytype.name] internal organ [I] failed initial presence check.") @@ -227,7 +227,7 @@ return 1 -/datum/unit_test/bodytype_organ_lists_update/proc/test_external_organ(var/mob/living/carbon/human/H, var/obj/item/organ/external/E) +/datum/unit_test/bodytype_organ_lists_update/proc/test_external_organ(var/mob/living/human/H, var/obj/item/organ/external/E) var/decl/bodytype/root_bodytype = H.get_bodytype() if(!check_external_organ_present(H, E)) fail("[root_bodytype.name] external organ [E] failed initial presence check.") @@ -252,7 +252,7 @@ var/list/bodytype_pairings = get_bodytype_species_pairs() for(var/decl/bodytype/bodytype in bodytype_pairings) var/decl/species/species = bodytype_pairings[bodytype] - var/mob/living/carbon/human/test_subject = new(null, species.name, null, bodytype) + var/mob/living/human/test_subject = new(null, species.name, null, bodytype) for(var/O in test_subject.get_internal_organs()) if(!test_internal_organ(test_subject, O)) diff --git a/code/unit_tests/traits.dm b/code/unit_tests/traits.dm new file mode 100644 index 00000000000..646501516ec --- /dev/null +++ b/code/unit_tests/traits.dm @@ -0,0 +1,27 @@ +/datum/unit_test/traits_shall_not_have_circular_references + name = "TRAITS: Traits Shall Not Have Circular References" + +/datum/unit_test/traits_shall_not_have_circular_references/start_test() + + var/list/failures = list() + var/list/all_traits = decls_repository.get_decls_of_type(/decl/trait) + for(var/atype in all_traits) + + var/list/seen_traits = list() + var/list/checking_traits = list(all_traits[atype]) + while(checking_traits.len) + var/decl/trait/trait = checking_traits[1] + checking_traits -= trait + if(trait in seen_traits) + failures += "[atype] - [trait.type]" + break + else + seen_traits += trait + if(trait.children) + checking_traits |= trait.children + + if(length(failures)) + fail("Found [length(failures)] circular reference\s:\n[jointext(failures, "\n")]") + else + pass("trait tree has no circular references.") + return 1 diff --git a/code/unit_tests/turf_icons.dm b/code/unit_tests/turf_icons.dm index 86a70297aef..51a657d3dcf 100644 --- a/code/unit_tests/turf_icons.dm +++ b/code/unit_tests/turf_icons.dm @@ -14,7 +14,7 @@ var/turf/floor/check_floor = floor_type if(TYPE_IS_ABSTRACT(check_floor)) continue - floor = floor.ChangeTurf(floor_type, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) + floor = floor.ChangeTurf(floor_type, FALSE, FALSE, FALSE, FALSE, FALSE) if(istype(floor)) var/list/turf_failures = floor.validate_turf() if(length(turf_failures)) diff --git a/code/unit_tests/unique_tests.dm b/code/unit_tests/unique_tests.dm index 12d8fb5217f..b40e82eae5b 100644 --- a/code/unit_tests/unique_tests.dm +++ b/code/unit_tests/unique_tests.dm @@ -208,26 +208,6 @@ pass("All gas symbols are unique.") return TRUE -/datum/unit_test/aspects_shall_have_unique_names - name = "UNIQUENESS: All Aspects Shall Have Unique Names" - -/datum/unit_test/aspects_shall_have_unique_names/start_test() - var/list/aspects_by_name = list() - - var/list/all_aspects = decls_repository.get_decls_of_subtype(/decl/aspect) - for(var/atype in all_aspects) - var/decl/aspect/aspect = all_aspects[atype] - var/check_name = lowertext(aspect.name) - if(check_name) - group_by(aspects_by_name, check_name, atype) - - var/number_of_issues = number_of_issues(aspects_by_name, "Aspect Names") - if(length(number_of_issues)) - fail("Found [number_of_issues] aspect\s with duplicate names.") - else - pass("All aspects have unique names.") - return 1 - /datum/unit_test/submaps_shall_have_a_unique_descriptor name = "UNIQUENESS: Archetypes shall have a valid, unique descriptor." diff --git a/html/browser/common.css b/html/browser/common.css index 68579cf39ad..aba0dd6aa51 100644 --- a/html/browser/common.css +++ b/html/browser/common.css @@ -362,3 +362,35 @@ div.notice { text-align: center; } + +.dumpCodexPage +{ + font-family: sans-serif; + font-size: 15px; + width: 100%; + height: 100%; + padding: 10px; + margin: 10px; +} + +.dumpCodexSidebar +{ + float:left; + width: 200px; + height: 100%; + padding: 10px; + margin: 10px; +} + +.dumpCodexText +{ + position:absolute; + padding: 10px; + margin: 10px; + left:240px; +} + +.dumpCodexPage td +{ + vertical-align: top; +} \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 21ef1653bd1..8373e672193 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,30 @@ -->
    +

    20 June 2024

    +

    MistakeNot4892 updated:

    +
      +
    • You can now dip things like stacks of skin into barrels of water, wells or rivers.
    • +
    + +

    19 June 2024

    +

    Penelope Haze updated:

    +
      +
    • Ammo magazines will not initialize their contents until first interacted with, which makes startup faster but could cause bugs. Report any issues on the issue tracker!
    • +
    + +

    16 June 2024

    +

    Penelope Haze updated:

    +
      +
    • Meteor is now a votable mode on Exodus. Oh no!!
    • +
    + +

    13 June 2024

    +

    NataKilar updated:

    +
      +
    • Fixed space tiles not creating vacuums in certain conditions
    • +
    +

    10 June 2024

    MistakeNot4892 updated:

      @@ -132,28 +156,6 @@

      MistakeNot4892 updated:

      • Non-high vis accessories on clothes will show as part of the examine string.
      - -

      21 April 2024

      -

      MistakeNot4892 updated:

      -
        -
      • Running to exhaustion will now cause a mood stressor.
      • -
      • Sleeping in a bed for thirty seconds will remove exhaustion and add a well rested mood boost.
      • -
      - -

      18 April 2024

      -

      MistakeNot4892 updated:

      -
        -
      • Closets can now be locked with a physical lock.
      • -
      • Vox must now pick between pressure resistance and speed using the Toggle Pressure Seal verb.
      • -
      • Lots of cooking changes! Refer to PR #3704 on the Nebula GitHub for specific details.
      • -
      - -

      16 April 2024

      -

      MistakeNot4892 updated:

      -
        -
      • Butchery will now produce a wider variety of items.
      • -
      • Universal enzyme can be made from rennet.
      • -
    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 0022529c67e..e7f89d1c8cc 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14760,3 +14760,18 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2024-06-10: MistakeNot4892: - tweak: Bows/crossbows have been adjusted. Please report issues to the tracker. +2024-06-13: + NataKilar: + - bugfix: Fixed space tiles not creating vacuums in certain conditions +2024-06-16: + Penelope Haze: + - tweak: Meteor is now a votable mode on Exodus. Oh no!! +2024-06-19: + Penelope Haze: + - experiment: Ammo magazines will not initialize their contents until first interacted + with, which makes startup faster but could cause bugs. Report any issues on + the issue tracker! +2024-06-20: + MistakeNot4892: + - tweak: You can now dip things like stacks of skin into barrels of water, wells + or rivers. diff --git a/icons/clothing/accessories/clothing/vest.dmi b/icons/clothing/accessories/clothing/vest.dmi index 7fff3b5e6ad..6844740a141 100644 Binary files a/icons/clothing/accessories/clothing/vest.dmi and b/icons/clothing/accessories/clothing/vest.dmi differ diff --git a/icons/clothing/accessories/jewelry/prayer_beads.dmi b/icons/clothing/accessories/jewelry/prayer_beads.dmi new file mode 100644 index 00000000000..e36f6d8ac70 Binary files /dev/null and b/icons/clothing/accessories/jewelry/prayer_beads.dmi differ diff --git a/icons/clothing/accessories/ties/bowtie.dmi b/icons/clothing/accessories/ties/bowtie.dmi index 6fbc6d703a3..125667f49fa 100644 Binary files a/icons/clothing/accessories/ties/bowtie.dmi and b/icons/clothing/accessories/ties/bowtie.dmi differ diff --git a/icons/clothing/under/gladiator.dmi b/icons/clothing/costumes/gladiator.dmi similarity index 100% rename from icons/clothing/under/gladiator.dmi rename to icons/clothing/costumes/gladiator.dmi diff --git a/icons/clothing/under/hides_hunter.dmi b/icons/clothing/costumes/hides_hunter.dmi similarity index 100% rename from icons/clothing/under/hides_hunter.dmi rename to icons/clothing/costumes/hides_hunter.dmi diff --git a/icons/clothing/under/hides_huntress.dmi b/icons/clothing/costumes/hides_huntress.dmi similarity index 100% rename from icons/clothing/under/hides_huntress.dmi rename to icons/clothing/costumes/hides_huntress.dmi diff --git a/icons/clothing/under/kilt.dmi b/icons/clothing/costumes/kilt.dmi similarity index 100% rename from icons/clothing/under/kilt.dmi rename to icons/clothing/costumes/kilt.dmi diff --git a/icons/clothing/under/pirate.dmi b/icons/clothing/costumes/pirate.dmi similarity index 100% rename from icons/clothing/under/pirate.dmi rename to icons/clothing/costumes/pirate.dmi diff --git a/icons/clothing/under/redcoat.dmi b/icons/clothing/costumes/redcoat.dmi similarity index 100% rename from icons/clothing/under/redcoat.dmi rename to icons/clothing/costumes/redcoat.dmi diff --git a/icons/clothing/under/scratch.dmi b/icons/clothing/costumes/scratch.dmi similarity index 100% rename from icons/clothing/under/scratch.dmi rename to icons/clothing/costumes/scratch.dmi diff --git a/icons/clothing/under/sexyclown.dmi b/icons/clothing/costumes/sexyclown.dmi similarity index 100% rename from icons/clothing/under/sexyclown.dmi rename to icons/clothing/costumes/sexyclown.dmi diff --git a/icons/clothing/under/sexymime.dmi b/icons/clothing/costumes/sexymime.dmi similarity index 100% rename from icons/clothing/under/sexymime.dmi rename to icons/clothing/costumes/sexymime.dmi diff --git a/icons/clothing/under/soviet.dmi b/icons/clothing/costumes/soviet.dmi similarity index 100% rename from icons/clothing/under/soviet.dmi rename to icons/clothing/costumes/soviet.dmi diff --git a/icons/clothing/under/uniform_clown.dmi b/icons/clothing/costumes/uniform_clown.dmi similarity index 100% rename from icons/clothing/under/uniform_clown.dmi rename to icons/clothing/costumes/uniform_clown.dmi diff --git a/icons/clothing/under/uniform_lawyer_black.dmi b/icons/clothing/costumes/uniform_lawyer_black.dmi similarity index 100% rename from icons/clothing/under/uniform_lawyer_black.dmi rename to icons/clothing/costumes/uniform_lawyer_black.dmi diff --git a/icons/clothing/under/uniform_lawyer_blue.dmi b/icons/clothing/costumes/uniform_lawyer_blue.dmi similarity index 100% rename from icons/clothing/under/uniform_lawyer_blue.dmi rename to icons/clothing/costumes/uniform_lawyer_blue.dmi diff --git a/icons/clothing/under/uniform_lawyer_old.dmi b/icons/clothing/costumes/uniform_lawyer_old.dmi similarity index 100% rename from icons/clothing/under/uniform_lawyer_old.dmi rename to icons/clothing/costumes/uniform_lawyer_old.dmi diff --git a/icons/clothing/under/uniform_lawyer_red.dmi b/icons/clothing/costumes/uniform_lawyer_red.dmi similarity index 100% rename from icons/clothing/under/uniform_lawyer_red.dmi rename to icons/clothing/costumes/uniform_lawyer_red.dmi diff --git a/icons/clothing/under/uniform_mime.dmi b/icons/clothing/costumes/uniform_mime.dmi similarity index 100% rename from icons/clothing/under/uniform_mime.dmi rename to icons/clothing/costumes/uniform_mime.dmi diff --git a/icons/clothing/under/uniform_schoolgirl.dmi b/icons/clothing/costumes/uniform_schoolgirl.dmi similarity index 100% rename from icons/clothing/under/uniform_schoolgirl.dmi rename to icons/clothing/costumes/uniform_schoolgirl.dmi diff --git a/icons/clothing/under/dresses/dress_bridal_blue.dmi b/icons/clothing/dresses/dress_bridal_blue.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_bridal_blue.dmi rename to icons/clothing/dresses/dress_bridal_blue.dmi diff --git a/icons/clothing/under/dresses/dress_bridal_orange.dmi b/icons/clothing/dresses/dress_bridal_orange.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_bridal_orange.dmi rename to icons/clothing/dresses/dress_bridal_orange.dmi diff --git a/icons/clothing/under/dresses/dress_bridal_purple.dmi b/icons/clothing/dresses/dress_bridal_purple.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_bridal_purple.dmi rename to icons/clothing/dresses/dress_bridal_purple.dmi diff --git a/icons/clothing/under/dresses/dress_bridal_red.dmi b/icons/clothing/dresses/dress_bridal_red.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_bridal_red.dmi rename to icons/clothing/dresses/dress_bridal_red.dmi diff --git a/icons/clothing/under/dresses/dress_bridal_white.dmi b/icons/clothing/dresses/dress_bridal_white.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_bridal_white.dmi rename to icons/clothing/dresses/dress_bridal_white.dmi diff --git a/icons/clothing/under/dresses/dress_bridesmaid.dmi b/icons/clothing/dresses/dress_bridesmaid.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_bridesmaid.dmi rename to icons/clothing/dresses/dress_bridesmaid.dmi diff --git a/icons/clothing/under/dresses/dress_cheongsam.dmi b/icons/clothing/dresses/dress_cheongsam.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_cheongsam.dmi rename to icons/clothing/dresses/dress_cheongsam.dmi diff --git a/icons/clothing/under/dresses/dress_fiend.dmi b/icons/clothing/dresses/dress_fiend.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_fiend.dmi rename to icons/clothing/dresses/dress_fiend.dmi diff --git a/icons/clothing/under/dresses/dress_fire.dmi b/icons/clothing/dresses/dress_fire.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_fire.dmi rename to icons/clothing/dresses/dress_fire.dmi diff --git a/icons/clothing/under/dresses/dress_gown.dmi b/icons/clothing/dresses/dress_gown.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_gown.dmi rename to icons/clothing/dresses/dress_gown.dmi diff --git a/icons/clothing/under/dresses/dress_green.dmi b/icons/clothing/dresses/dress_green.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_green.dmi rename to icons/clothing/dresses/dress_green.dmi diff --git a/icons/clothing/under/dresses/dress_hop.dmi b/icons/clothing/dresses/dress_hop.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_hop.dmi rename to icons/clothing/dresses/dress_hop.dmi diff --git a/icons/clothing/under/dresses/dress_hr.dmi b/icons/clothing/dresses/dress_hr.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_hr.dmi rename to icons/clothing/dresses/dress_hr.dmi diff --git a/icons/clothing/under/dresses/dress_long.dmi b/icons/clothing/dresses/dress_long.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_long.dmi rename to icons/clothing/dresses/dress_long.dmi diff --git a/icons/clothing/under/dresses/dress_nurse.dmi b/icons/clothing/dresses/dress_nurse.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_nurse.dmi rename to icons/clothing/dresses/dress_nurse.dmi diff --git a/icons/clothing/under/dresses/dress_orange.dmi b/icons/clothing/dresses/dress_orange.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_orange.dmi rename to icons/clothing/dresses/dress_orange.dmi diff --git a/icons/clothing/under/dresses/dress_pink.dmi b/icons/clothing/dresses/dress_pink.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_pink.dmi rename to icons/clothing/dresses/dress_pink.dmi diff --git a/icons/clothing/under/dresses/dress_plaid_blue.dmi b/icons/clothing/dresses/dress_plaid_blue.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_plaid_blue.dmi rename to icons/clothing/dresses/dress_plaid_blue.dmi diff --git a/icons/clothing/under/dresses/dress_plaid_purple.dmi b/icons/clothing/dresses/dress_plaid_purple.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_plaid_purple.dmi rename to icons/clothing/dresses/dress_plaid_purple.dmi diff --git a/icons/clothing/under/dresses/dress_plaid_red.dmi b/icons/clothing/dresses/dress_plaid_red.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_plaid_red.dmi rename to icons/clothing/dresses/dress_plaid_red.dmi diff --git a/icons/clothing/under/dresses/dress_purple.dmi b/icons/clothing/dresses/dress_purple.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_purple.dmi rename to icons/clothing/dresses/dress_purple.dmi diff --git a/icons/clothing/under/dresses/dress_rd.dmi b/icons/clothing/dresses/dress_rd.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_rd.dmi rename to icons/clothing/dresses/dress_rd.dmi diff --git a/icons/clothing/under/dresses/dress_saloon.dmi b/icons/clothing/dresses/dress_saloon.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_saloon.dmi rename to icons/clothing/dresses/dress_saloon.dmi diff --git a/icons/clothing/under/dresses/dress_short.dmi b/icons/clothing/dresses/dress_short.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_short.dmi rename to icons/clothing/dresses/dress_short.dmi diff --git a/icons/clothing/under/dresses/dress_sundress.dmi b/icons/clothing/dresses/dress_sundress.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_sundress.dmi rename to icons/clothing/dresses/dress_sundress.dmi diff --git a/icons/clothing/under/dresses/dress_sundress_white.dmi b/icons/clothing/dresses/dress_sundress_white.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_sundress_white.dmi rename to icons/clothing/dresses/dress_sundress_white.dmi diff --git a/icons/clothing/under/dresses/dress_tango.dmi b/icons/clothing/dresses/dress_tango.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_tango.dmi rename to icons/clothing/dresses/dress_tango.dmi diff --git a/icons/clothing/under/dresses/dress_white.dmi b/icons/clothing/dresses/dress_white.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_white.dmi rename to icons/clothing/dresses/dress_white.dmi diff --git a/icons/clothing/under/dresses/dress_yellow.dmi b/icons/clothing/dresses/dress_yellow.dmi similarity index 100% rename from icons/clothing/under/dresses/dress_yellow.dmi rename to icons/clothing/dresses/dress_yellow.dmi diff --git a/icons/clothing/under/kimono.dmi b/icons/clothing/dresses/kimono.dmi similarity index 100% rename from icons/clothing/under/kimono.dmi rename to icons/clothing/dresses/kimono.dmi diff --git a/icons/clothing/under/nurse.dmi b/icons/clothing/dresses/nurse.dmi similarity index 100% rename from icons/clothing/under/nurse.dmi rename to icons/clothing/dresses/nurse.dmi diff --git a/icons/clothing/under/uniform_captain_dress.dmi b/icons/clothing/dresses/uniform_captain_dress.dmi similarity index 100% rename from icons/clothing/under/uniform_captain_dress.dmi rename to icons/clothing/dresses/uniform_captain_dress.dmi diff --git a/icons/clothing/head/grim_hood.dmi b/icons/clothing/head/grim_hood.dmi new file mode 100644 index 00000000000..37ae3d7ecc5 Binary files /dev/null and b/icons/clothing/head/grim_hood.dmi differ diff --git a/icons/clothing/under/caretaker.dmi b/icons/clothing/jumpsuits/caretaker.dmi similarity index 100% rename from icons/clothing/under/caretaker.dmi rename to icons/clothing/jumpsuits/caretaker.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit.dmi b/icons/clothing/jumpsuits/jumpsuit.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit.dmi rename to icons/clothing/jumpsuits/jumpsuit.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_atmos.dmi b/icons/clothing/jumpsuits/jumpsuit_atmos.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_atmos.dmi rename to icons/clothing/jumpsuits/jumpsuit_atmos.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_captain.dmi b/icons/clothing/jumpsuits/jumpsuit_captain.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_captain.dmi rename to icons/clothing/jumpsuits/jumpsuit_captain.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_cargo.dmi b/icons/clothing/jumpsuits/jumpsuit_cargo.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_cargo.dmi rename to icons/clothing/jumpsuits/jumpsuit_cargo.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_cargo_alt.dmi b/icons/clothing/jumpsuits/jumpsuit_cargo_alt.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_cargo_alt.dmi rename to icons/clothing/jumpsuits/jumpsuit_cargo_alt.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_ce.dmi b/icons/clothing/jumpsuits/jumpsuit_ce.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_ce.dmi rename to icons/clothing/jumpsuits/jumpsuit_ce.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_chaplain.dmi b/icons/clothing/jumpsuits/jumpsuit_chaplain.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_chaplain.dmi rename to icons/clothing/jumpsuits/jumpsuit_chaplain.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_chemist.dmi b/icons/clothing/jumpsuits/jumpsuit_chemist.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_chemist.dmi rename to icons/clothing/jumpsuits/jumpsuit_chemist.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_cmo.dmi b/icons/clothing/jumpsuits/jumpsuit_cmo.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_cmo.dmi rename to icons/clothing/jumpsuits/jumpsuit_cmo.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_engineer.dmi b/icons/clothing/jumpsuits/jumpsuit_engineer.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_engineer.dmi rename to icons/clothing/jumpsuits/jumpsuit_engineer.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_genetics.dmi b/icons/clothing/jumpsuits/jumpsuit_genetics.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_genetics.dmi rename to icons/clothing/jumpsuits/jumpsuit_genetics.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_hazard.dmi b/icons/clothing/jumpsuits/jumpsuit_hazard.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_hazard.dmi rename to icons/clothing/jumpsuits/jumpsuit_hazard.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_hop.dmi b/icons/clothing/jumpsuits/jumpsuit_hop.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_hop.dmi rename to icons/clothing/jumpsuits/jumpsuit_hop.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_hos.dmi b/icons/clothing/jumpsuits/jumpsuit_hos.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_hos.dmi rename to icons/clothing/jumpsuits/jumpsuit_hos.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_hos_alt.dmi b/icons/clothing/jumpsuits/jumpsuit_hos_alt.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_hos_alt.dmi rename to icons/clothing/jumpsuits/jumpsuit_hos_alt.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_hydroponics.dmi b/icons/clothing/jumpsuits/jumpsuit_hydroponics.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_hydroponics.dmi rename to icons/clothing/jumpsuits/jumpsuit_hydroponics.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_janitor.dmi b/icons/clothing/jumpsuits/jumpsuit_janitor.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_janitor.dmi rename to icons/clothing/jumpsuits/jumpsuit_janitor.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_johnny.dmi b/icons/clothing/jumpsuits/jumpsuit_johnny.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_johnny.dmi rename to icons/clothing/jumpsuits/jumpsuit_johnny.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_mailman.dmi b/icons/clothing/jumpsuits/jumpsuit_mailman.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_mailman.dmi rename to icons/clothing/jumpsuits/jumpsuit_mailman.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_medical.dmi b/icons/clothing/jumpsuits/jumpsuit_medical.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_medical.dmi rename to icons/clothing/jumpsuits/jumpsuit_medical.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_miner.dmi b/icons/clothing/jumpsuits/jumpsuit_miner.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_miner.dmi rename to icons/clothing/jumpsuits/jumpsuit_miner.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_owl.dmi b/icons/clothing/jumpsuits/jumpsuit_owl.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_owl.dmi rename to icons/clothing/jumpsuits/jumpsuit_owl.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_prisoner.dmi b/icons/clothing/jumpsuits/jumpsuit_prisoner.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_prisoner.dmi rename to icons/clothing/jumpsuits/jumpsuit_prisoner.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_psionic.dmi b/icons/clothing/jumpsuits/jumpsuit_psionic.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_psionic.dmi rename to icons/clothing/jumpsuits/jumpsuit_psionic.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_psych.dmi b/icons/clothing/jumpsuits/jumpsuit_psych.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_psych.dmi rename to icons/clothing/jumpsuits/jumpsuit_psych.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_psychadelic.dmi b/icons/clothing/jumpsuits/jumpsuit_psychadelic.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_psychadelic.dmi rename to icons/clothing/jumpsuits/jumpsuit_psychadelic.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_qm.dmi b/icons/clothing/jumpsuits/jumpsuit_qm.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_qm.dmi rename to icons/clothing/jumpsuits/jumpsuit_qm.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_rainbow.dmi b/icons/clothing/jumpsuits/jumpsuit_rainbow.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_rainbow.dmi rename to icons/clothing/jumpsuits/jumpsuit_rainbow.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_rd.dmi b/icons/clothing/jumpsuits/jumpsuit_rd.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_rd.dmi rename to icons/clothing/jumpsuits/jumpsuit_rd.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_robotics.dmi b/icons/clothing/jumpsuits/jumpsuit_robotics.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_robotics.dmi rename to icons/clothing/jumpsuits/jumpsuit_robotics.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_robotics_skirt.dmi b/icons/clothing/jumpsuits/jumpsuit_robotics_skirt.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_robotics_skirt.dmi rename to icons/clothing/jumpsuits/jumpsuit_robotics_skirt.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_sec.dmi b/icons/clothing/jumpsuits/jumpsuit_sec.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_sec.dmi rename to icons/clothing/jumpsuits/jumpsuit_sec.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_shorts.dmi b/icons/clothing/jumpsuits/jumpsuit_shorts.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_shorts.dmi rename to icons/clothing/jumpsuits/jumpsuit_shorts.dmi diff --git a/icons/clothing/jumpsuits/jumpsuit_skirt.dmi b/icons/clothing/jumpsuits/jumpsuit_skirt.dmi new file mode 100644 index 00000000000..04062ac781d Binary files /dev/null and b/icons/clothing/jumpsuits/jumpsuit_skirt.dmi differ diff --git a/icons/clothing/under/jumpsuits/jumpsuit_skirt_short.dmi b/icons/clothing/jumpsuits/jumpsuit_skirt_short.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_skirt_short.dmi rename to icons/clothing/jumpsuits/jumpsuit_skirt_short.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_sterile.dmi b/icons/clothing/jumpsuits/jumpsuit_sterile.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_sterile.dmi rename to icons/clothing/jumpsuits/jumpsuit_sterile.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_virology.dmi b/icons/clothing/jumpsuits/jumpsuit_virology.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_virology.dmi rename to icons/clothing/jumpsuits/jumpsuit_virology.dmi diff --git a/icons/clothing/under/jumpsuits/jumpsuit_warden.dmi b/icons/clothing/jumpsuits/jumpsuit_warden.dmi similarity index 100% rename from icons/clothing/under/jumpsuits/jumpsuit_warden.dmi rename to icons/clothing/jumpsuits/jumpsuit_warden.dmi diff --git a/icons/clothing/under/uniform_quantum.dmi b/icons/clothing/jumpsuits/uniform_quantum.dmi similarity index 100% rename from icons/clothing/under/uniform_quantum.dmi rename to icons/clothing/jumpsuits/uniform_quantum.dmi diff --git a/icons/clothing/under/wetsuit.dmi b/icons/clothing/jumpsuits/wetsuit.dmi similarity index 100% rename from icons/clothing/under/wetsuit.dmi rename to icons/clothing/jumpsuits/wetsuit.dmi diff --git a/icons/clothing/mask/ninja.dmi b/icons/clothing/mask/camera_miu.dmi similarity index 100% rename from icons/clothing/mask/ninja.dmi rename to icons/clothing/mask/camera_miu.dmi diff --git a/icons/clothing/under/mankini.dmi b/icons/clothing/pants/mankini.dmi similarity index 100% rename from icons/clothing/under/mankini.dmi rename to icons/clothing/pants/mankini.dmi diff --git a/icons/clothing/under/pants/overpants.dmi b/icons/clothing/pants/overpants.dmi similarity index 100% rename from icons/clothing/under/pants/overpants.dmi rename to icons/clothing/pants/overpants.dmi diff --git a/icons/clothing/under/pants/pants.dmi b/icons/clothing/pants/pants.dmi similarity index 100% rename from icons/clothing/under/pants/pants.dmi rename to icons/clothing/pants/pants.dmi diff --git a/icons/clothing/under/pants/pants_baggy.dmi b/icons/clothing/pants/pants_baggy.dmi similarity index 100% rename from icons/clothing/under/pants/pants_baggy.dmi rename to icons/clothing/pants/pants_baggy.dmi diff --git a/icons/clothing/under/pants/pants_camo.dmi b/icons/clothing/pants/pants_camo.dmi similarity index 100% rename from icons/clothing/under/pants/pants_camo.dmi rename to icons/clothing/pants/pants_camo.dmi diff --git a/icons/clothing/under/pants/pants_camo_baggy.dmi b/icons/clothing/pants/pants_camo_baggy.dmi similarity index 100% rename from icons/clothing/under/pants/pants_camo_baggy.dmi rename to icons/clothing/pants/pants_camo_baggy.dmi diff --git a/icons/clothing/under/pants/pants_jeans.dmi b/icons/clothing/pants/pants_jeans.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans.dmi rename to icons/clothing/pants/pants_jeans.dmi diff --git a/icons/clothing/under/pants/pants_jeans_baggy.dmi b/icons/clothing/pants/pants_jeans_baggy.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_baggy.dmi rename to icons/clothing/pants/pants_jeans_baggy.dmi diff --git a/icons/clothing/under/pants/pants_jeans_baggy_black.dmi b/icons/clothing/pants/pants_jeans_baggy_black.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_baggy_black.dmi rename to icons/clothing/pants/pants_jeans_baggy_black.dmi diff --git a/icons/clothing/under/pants/pants_jeans_baggy_classic.dmi b/icons/clothing/pants/pants_jeans_baggy_classic.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_baggy_classic.dmi rename to icons/clothing/pants/pants_jeans_baggy_classic.dmi diff --git a/icons/clothing/under/pants/pants_jeans_baggy_grey.dmi b/icons/clothing/pants/pants_jeans_baggy_grey.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_baggy_grey.dmi rename to icons/clothing/pants/pants_jeans_baggy_grey.dmi diff --git a/icons/clothing/under/pants/pants_jeans_baggy_mustang.dmi b/icons/clothing/pants/pants_jeans_baggy_mustang.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_baggy_mustang.dmi rename to icons/clothing/pants/pants_jeans_baggy_mustang.dmi diff --git a/icons/clothing/under/pants/pants_jeans_baggy_young.dmi b/icons/clothing/pants/pants_jeans_baggy_young.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_baggy_young.dmi rename to icons/clothing/pants/pants_jeans_baggy_young.dmi diff --git a/icons/clothing/under/pants/pants_jeans_black.dmi b/icons/clothing/pants/pants_jeans_black.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_black.dmi rename to icons/clothing/pants/pants_jeans_black.dmi diff --git a/icons/clothing/under/pants/pants_jeans_classic.dmi b/icons/clothing/pants/pants_jeans_classic.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_classic.dmi rename to icons/clothing/pants/pants_jeans_classic.dmi diff --git a/icons/clothing/under/pants/pants_jeans_grey.dmi b/icons/clothing/pants/pants_jeans_grey.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_grey.dmi rename to icons/clothing/pants/pants_jeans_grey.dmi diff --git a/icons/clothing/under/pants/pants_jeans_mustang.dmi b/icons/clothing/pants/pants_jeans_mustang.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_mustang.dmi rename to icons/clothing/pants/pants_jeans_mustang.dmi diff --git a/icons/clothing/under/pants/pants_jeans_shorts.dmi b/icons/clothing/pants/pants_jeans_shorts.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_shorts.dmi rename to icons/clothing/pants/pants_jeans_shorts.dmi diff --git a/icons/clothing/under/pants/pants_jeans_shorts_classic.dmi b/icons/clothing/pants/pants_jeans_shorts_classic.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_shorts_classic.dmi rename to icons/clothing/pants/pants_jeans_shorts_classic.dmi diff --git a/icons/clothing/under/pants/pants_jeans_shorts_mustang.dmi b/icons/clothing/pants/pants_jeans_shorts_mustang.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_shorts_mustang.dmi rename to icons/clothing/pants/pants_jeans_shorts_mustang.dmi diff --git a/icons/clothing/under/pants/pants_jeans_shorts_young.dmi b/icons/clothing/pants/pants_jeans_shorts_young.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_shorts_young.dmi rename to icons/clothing/pants/pants_jeans_shorts_young.dmi diff --git a/icons/clothing/under/pants/pants_jeans_young.dmi b/icons/clothing/pants/pants_jeans_young.dmi similarity index 100% rename from icons/clothing/under/pants/pants_jeans_young.dmi rename to icons/clothing/pants/pants_jeans_young.dmi diff --git a/icons/clothing/pants/pants_mustard.dmi b/icons/clothing/pants/pants_mustard.dmi new file mode 100644 index 00000000000..9d888722427 Binary files /dev/null and b/icons/clothing/pants/pants_mustard.dmi differ diff --git a/icons/clothing/under/pants/pants_shorts.dmi b/icons/clothing/pants/pants_shorts.dmi similarity index 100% rename from icons/clothing/under/pants/pants_shorts.dmi rename to icons/clothing/pants/pants_shorts.dmi diff --git a/icons/clothing/under/pants/pants_shorts_black.dmi b/icons/clothing/pants/pants_shorts_black.dmi similarity index 100% rename from icons/clothing/under/pants/pants_shorts_black.dmi rename to icons/clothing/pants/pants_shorts_black.dmi diff --git a/icons/clothing/under/pants/pants_shorts_grey.dmi b/icons/clothing/pants/pants_shorts_grey.dmi similarity index 100% rename from icons/clothing/under/pants/pants_shorts_grey.dmi rename to icons/clothing/pants/pants_shorts_grey.dmi diff --git a/icons/clothing/under/pants/pants_shorts_khaki.dmi b/icons/clothing/pants/pants_shorts_khaki.dmi similarity index 100% rename from icons/clothing/under/pants/pants_shorts_khaki.dmi rename to icons/clothing/pants/pants_shorts_khaki.dmi diff --git a/icons/clothing/under/pants/pants_shorts_tan.dmi b/icons/clothing/pants/pants_shorts_tan.dmi similarity index 100% rename from icons/clothing/under/pants/pants_shorts_tan.dmi rename to icons/clothing/pants/pants_shorts_tan.dmi diff --git a/icons/clothing/under/pants/pants_track.dmi b/icons/clothing/pants/pants_track.dmi similarity index 100% rename from icons/clothing/under/pants/pants_track.dmi rename to icons/clothing/pants/pants_track.dmi diff --git a/icons/clothing/under/pants/pants_track_black.dmi b/icons/clothing/pants/pants_track_black.dmi similarity index 100% rename from icons/clothing/under/pants/pants_track_black.dmi rename to icons/clothing/pants/pants_track_black.dmi diff --git a/icons/clothing/under/pants/pants_track_blue.dmi b/icons/clothing/pants/pants_track_blue.dmi similarity index 100% rename from icons/clothing/under/pants/pants_track_blue.dmi rename to icons/clothing/pants/pants_track_blue.dmi diff --git a/icons/clothing/under/pants/pants_track_navy.dmi b/icons/clothing/pants/pants_track_navy.dmi similarity index 100% rename from icons/clothing/under/pants/pants_track_navy.dmi rename to icons/clothing/pants/pants_track_navy.dmi diff --git a/icons/clothing/under/pants/pants_track_red.dmi b/icons/clothing/pants/pants_track_red.dmi similarity index 100% rename from icons/clothing/under/pants/pants_track_red.dmi rename to icons/clothing/pants/pants_track_red.dmi diff --git a/icons/clothing/pants/security.dmi b/icons/clothing/pants/security.dmi new file mode 100644 index 00000000000..98c5eb43182 Binary files /dev/null and b/icons/clothing/pants/security.dmi differ diff --git a/icons/clothing/pants/slacks_black.dmi b/icons/clothing/pants/slacks_black.dmi index 0c7508ace72..f7bd40cabfa 100644 Binary files a/icons/clothing/pants/slacks_black.dmi and b/icons/clothing/pants/slacks_black.dmi differ diff --git a/icons/clothing/pants/slacks_navy.dmi b/icons/clothing/pants/slacks_navy.dmi new file mode 100644 index 00000000000..76d5d417d14 Binary files /dev/null and b/icons/clothing/pants/slacks_navy.dmi differ diff --git a/icons/clothing/pants/slacks_white.dmi b/icons/clothing/pants/slacks_white.dmi new file mode 100644 index 00000000000..dae8898b6a1 Binary files /dev/null and b/icons/clothing/pants/slacks_white.dmi differ diff --git a/icons/clothing/under/rogue_captain.dmi b/icons/clothing/rogue_captain.dmi similarity index 100% rename from icons/clothing/under/rogue_captain.dmi rename to icons/clothing/rogue_captain.dmi diff --git a/icons/clothing/shirts/button_up.dmi b/icons/clothing/shirts/button_up.dmi index 4059684ec76..db7bc763495 100644 Binary files a/icons/clothing/shirts/button_up.dmi and b/icons/clothing/shirts/button_up.dmi differ diff --git a/icons/clothing/shirts/button_up_blue.dmi b/icons/clothing/shirts/button_up_blue.dmi new file mode 100644 index 00000000000..f91345c666a Binary files /dev/null and b/icons/clothing/shirts/button_up_blue.dmi differ diff --git a/icons/clothing/under/harness.dmi b/icons/clothing/shirts/harness.dmi similarity index 100% rename from icons/clothing/under/harness.dmi rename to icons/clothing/shirts/harness.dmi diff --git a/icons/clothing/shirts/security.dmi b/icons/clothing/shirts/security.dmi new file mode 100644 index 00000000000..9933ad4e838 Binary files /dev/null and b/icons/clothing/shirts/security.dmi differ diff --git a/icons/clothing/shirts/sweater_combat.dmi b/icons/clothing/shirts/sweater_combat.dmi new file mode 100644 index 00000000000..68044fdba45 Binary files /dev/null and b/icons/clothing/shirts/sweater_combat.dmi differ diff --git a/icons/clothing/shirts/sweater_tactical.dmi b/icons/clothing/shirts/sweater_tactical.dmi new file mode 100644 index 00000000000..452f4f290aa Binary files /dev/null and b/icons/clothing/shirts/sweater_tactical.dmi differ diff --git a/icons/clothing/shirts/tshirt.dmi b/icons/clothing/shirts/tshirt.dmi new file mode 100644 index 00000000000..bdddbe8c138 Binary files /dev/null and b/icons/clothing/shirts/tshirt.dmi differ diff --git a/icons/clothing/shirts/uniform_turtleneck.dmi b/icons/clothing/shirts/uniform_turtleneck.dmi new file mode 100644 index 00000000000..5e96213d5ca Binary files /dev/null and b/icons/clothing/shirts/uniform_turtleneck.dmi differ diff --git a/icons/clothing/shirts/uniform_turtleneck_blue.dmi b/icons/clothing/shirts/uniform_turtleneck_blue.dmi new file mode 100644 index 00000000000..6697dc7972e Binary files /dev/null and b/icons/clothing/shirts/uniform_turtleneck_blue.dmi differ diff --git a/icons/clothing/under/skirts/skirt_black.dmi b/icons/clothing/skirts/skirt_black.dmi similarity index 100% rename from icons/clothing/under/skirts/skirt_black.dmi rename to icons/clothing/skirts/skirt_black.dmi diff --git a/icons/clothing/under/skirts/skirt_khaki.dmi b/icons/clothing/skirts/skirt_khaki.dmi similarity index 100% rename from icons/clothing/under/skirts/skirt_khaki.dmi rename to icons/clothing/skirts/skirt_khaki.dmi diff --git a/icons/clothing/under/skirts/skirt_short.dmi b/icons/clothing/skirts/skirt_short.dmi similarity index 100% rename from icons/clothing/under/skirts/skirt_short.dmi rename to icons/clothing/skirts/skirt_short.dmi diff --git a/icons/clothing/under/skirts/skirt_swept.dmi b/icons/clothing/skirts/skirt_swept.dmi similarity index 100% rename from icons/clothing/under/skirts/skirt_swept.dmi rename to icons/clothing/skirts/skirt_swept.dmi diff --git a/icons/clothing/under/abaya.dmi b/icons/clothing/suits/abaya.dmi similarity index 100% rename from icons/clothing/under/abaya.dmi rename to icons/clothing/suits/abaya.dmi diff --git a/icons/clothing/suit/apron.dmi b/icons/clothing/suits/apron.dmi similarity index 100% rename from icons/clothing/suit/apron.dmi rename to icons/clothing/suits/apron.dmi diff --git a/icons/clothing/suit/apron_chef.dmi b/icons/clothing/suits/apron_chef.dmi similarity index 100% rename from icons/clothing/suit/apron_chef.dmi rename to icons/clothing/suits/apron_chef.dmi diff --git a/icons/clothing/suit/apron_colourable.dmi b/icons/clothing/suits/apron_colourable.dmi similarity index 100% rename from icons/clothing/suit/apron_colourable.dmi rename to icons/clothing/suits/apron_colourable.dmi diff --git a/icons/clothing/suit/apron_surgery.dmi b/icons/clothing/suits/apron_surgery.dmi similarity index 100% rename from icons/clothing/suit/apron_surgery.dmi rename to icons/clothing/suits/apron_surgery.dmi diff --git a/icons/clothing/suit/armor/ballistic.dmi b/icons/clothing/suits/armor/ballistic.dmi similarity index 100% rename from icons/clothing/suit/armor/ballistic.dmi rename to icons/clothing/suits/armor/ballistic.dmi diff --git a/icons/clothing/suit/armor/banded.dmi b/icons/clothing/suits/armor/banded.dmi similarity index 100% rename from icons/clothing/suit/armor/banded.dmi rename to icons/clothing/suits/armor/banded.dmi diff --git a/icons/clothing/suit/armor/improvised.dmi b/icons/clothing/suits/armor/improvised.dmi similarity index 100% rename from icons/clothing/suit/armor/improvised.dmi rename to icons/clothing/suits/armor/improvised.dmi diff --git a/icons/clothing/suit/armor/plate_carrier.dmi b/icons/clothing/suits/armor/plate_carrier.dmi similarity index 100% rename from icons/clothing/suit/armor/plate_carrier.dmi rename to icons/clothing/suits/armor/plate_carrier.dmi diff --git a/icons/clothing/suit/armor/reactive.dmi b/icons/clothing/suits/armor/reactive.dmi similarity index 100% rename from icons/clothing/suit/armor/reactive.dmi rename to icons/clothing/suits/armor/reactive.dmi diff --git a/icons/clothing/suit/armor/reflective.dmi b/icons/clothing/suits/armor/reflective.dmi similarity index 100% rename from icons/clothing/suit/armor/reflective.dmi rename to icons/clothing/suits/armor/reflective.dmi diff --git a/icons/clothing/suit/armor/riot.dmi b/icons/clothing/suits/armor/riot.dmi similarity index 100% rename from icons/clothing/suit/armor/riot.dmi rename to icons/clothing/suits/armor/riot.dmi diff --git a/icons/clothing/suit/armor/vest.dmi b/icons/clothing/suits/armor/vest.dmi similarity index 100% rename from icons/clothing/suit/armor/vest.dmi rename to icons/clothing/suits/armor/vest.dmi diff --git a/icons/clothing/suit/biosuit/_biosuit.dmi b/icons/clothing/suits/biosuit/_biosuit.dmi similarity index 100% rename from icons/clothing/suit/biosuit/_biosuit.dmi rename to icons/clothing/suits/biosuit/_biosuit.dmi diff --git a/icons/clothing/suit/biosuit/anomaly.dmi b/icons/clothing/suits/biosuit/anomaly.dmi similarity index 100% rename from icons/clothing/suit/biosuit/anomaly.dmi rename to icons/clothing/suits/biosuit/anomaly.dmi diff --git a/icons/clothing/suit/biosuit/cmo.dmi b/icons/clothing/suits/biosuit/cmo.dmi similarity index 100% rename from icons/clothing/suit/biosuit/cmo.dmi rename to icons/clothing/suits/biosuit/cmo.dmi diff --git a/icons/clothing/suit/biosuit/janitor.dmi b/icons/clothing/suits/biosuit/janitor.dmi similarity index 100% rename from icons/clothing/suit/biosuit/janitor.dmi rename to icons/clothing/suits/biosuit/janitor.dmi diff --git a/icons/clothing/suit/biosuit/plague.dmi b/icons/clothing/suits/biosuit/plague.dmi similarity index 100% rename from icons/clothing/suit/biosuit/plague.dmi rename to icons/clothing/suits/biosuit/plague.dmi diff --git a/icons/clothing/suit/biosuit/scientist.dmi b/icons/clothing/suits/biosuit/scientist.dmi similarity index 100% rename from icons/clothing/suit/biosuit/scientist.dmi rename to icons/clothing/suits/biosuit/scientist.dmi diff --git a/icons/clothing/suit/biosuit/security.dmi b/icons/clothing/suits/biosuit/security.dmi similarity index 100% rename from icons/clothing/suit/biosuit/security.dmi rename to icons/clothing/suits/biosuit/security.dmi diff --git a/icons/clothing/suit/biosuit/virology.dmi b/icons/clothing/suits/biosuit/virology.dmi similarity index 100% rename from icons/clothing/suit/biosuit/virology.dmi rename to icons/clothing/suits/biosuit/virology.dmi diff --git a/icons/clothing/suit/bluetag.dmi b/icons/clothing/suits/bluetag.dmi similarity index 100% rename from icons/clothing/suit/bluetag.dmi rename to icons/clothing/suits/bluetag.dmi diff --git a/icons/clothing/suit/bombsuit.dmi b/icons/clothing/suits/bombsuit.dmi similarity index 100% rename from icons/clothing/suit/bombsuit.dmi rename to icons/clothing/suits/bombsuit.dmi diff --git a/icons/clothing/suit/bombsuit_olive.dmi b/icons/clothing/suits/bombsuit_olive.dmi similarity index 100% rename from icons/clothing/suit/bombsuit_olive.dmi rename to icons/clothing/suits/bombsuit_olive.dmi diff --git a/icons/clothing/suit/cardborg.dmi b/icons/clothing/suits/cardborg.dmi similarity index 100% rename from icons/clothing/suit/cardborg.dmi rename to icons/clothing/suits/cardborg.dmi diff --git a/icons/clothing/suit/chaplain.dmi b/icons/clothing/suits/chaplain.dmi similarity index 100% rename from icons/clothing/suit/chaplain.dmi rename to icons/clothing/suits/chaplain.dmi diff --git a/icons/clothing/suit/chef.dmi b/icons/clothing/suits/chef.dmi similarity index 100% rename from icons/clothing/suit/chef.dmi rename to icons/clothing/suits/chef.dmi diff --git a/icons/clothing/suit/chem_suit.dmi b/icons/clothing/suits/chem_suit.dmi similarity index 100% rename from icons/clothing/suit/chem_suit.dmi rename to icons/clothing/suits/chem_suit.dmi diff --git a/icons/clothing/suit/chicken.dmi b/icons/clothing/suits/chicken.dmi similarity index 100% rename from icons/clothing/suit/chicken.dmi rename to icons/clothing/suits/chicken.dmi diff --git a/icons/clothing/suit/cloaks/_cloak.dmi b/icons/clothing/suits/cloaks/_cloak.dmi similarity index 100% rename from icons/clothing/suit/cloaks/_cloak.dmi rename to icons/clothing/suits/cloaks/_cloak.dmi diff --git a/icons/clothing/suit/cloaks/cloak_atmospherics.dmi b/icons/clothing/suits/cloaks/cloak_atmospherics.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_atmospherics.dmi rename to icons/clothing/suits/cloaks/cloak_atmospherics.dmi diff --git a/icons/clothing/suit/cloaks/cloak_captain.dmi b/icons/clothing/suits/cloaks/cloak_captain.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_captain.dmi rename to icons/clothing/suits/cloaks/cloak_captain.dmi diff --git a/icons/clothing/suit/cloaks/cloak_cargo.dmi b/icons/clothing/suits/cloaks/cloak_cargo.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_cargo.dmi rename to icons/clothing/suits/cloaks/cloak_cargo.dmi diff --git a/icons/clothing/suit/cloaks/cloak_ce.dmi b/icons/clothing/suits/cloaks/cloak_ce.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_ce.dmi rename to icons/clothing/suits/cloaks/cloak_ce.dmi diff --git a/icons/clothing/suit/cloaks/cloak_cmo.dmi b/icons/clothing/suits/cloaks/cloak_cmo.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_cmo.dmi rename to icons/clothing/suits/cloaks/cloak_cmo.dmi diff --git a/icons/clothing/suit/cloaks/cloak_engineer.dmi b/icons/clothing/suits/cloaks/cloak_engineer.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_engineer.dmi rename to icons/clothing/suits/cloaks/cloak_engineer.dmi diff --git a/icons/clothing/suit/cloaks/cloak_hide.dmi b/icons/clothing/suits/cloaks/cloak_hide.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_hide.dmi rename to icons/clothing/suits/cloaks/cloak_hide.dmi diff --git a/icons/clothing/suit/cloaks/cloak_hop.dmi b/icons/clothing/suits/cloaks/cloak_hop.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_hop.dmi rename to icons/clothing/suits/cloaks/cloak_hop.dmi diff --git a/icons/clothing/suit/cloaks/cloak_hos.dmi b/icons/clothing/suits/cloaks/cloak_hos.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_hos.dmi rename to icons/clothing/suits/cloaks/cloak_hos.dmi diff --git a/icons/clothing/suit/cloaks/cloak_medical.dmi b/icons/clothing/suits/cloaks/cloak_medical.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_medical.dmi rename to icons/clothing/suits/cloaks/cloak_medical.dmi diff --git a/icons/clothing/suit/cloaks/cloak_mining.dmi b/icons/clothing/suits/cloaks/cloak_mining.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_mining.dmi rename to icons/clothing/suits/cloaks/cloak_mining.dmi diff --git a/icons/clothing/suit/cloaks/cloak_qm.dmi b/icons/clothing/suits/cloaks/cloak_qm.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_qm.dmi rename to icons/clothing/suits/cloaks/cloak_qm.dmi diff --git a/icons/clothing/suit/cloaks/cloak_rd.dmi b/icons/clothing/suits/cloaks/cloak_rd.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_rd.dmi rename to icons/clothing/suits/cloaks/cloak_rd.dmi diff --git a/icons/clothing/suit/cloaks/cloak_research.dmi b/icons/clothing/suits/cloaks/cloak_research.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_research.dmi rename to icons/clothing/suits/cloaks/cloak_research.dmi diff --git a/icons/clothing/suit/cloaks/cloak_security.dmi b/icons/clothing/suits/cloaks/cloak_security.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_security.dmi rename to icons/clothing/suits/cloaks/cloak_security.dmi diff --git a/icons/clothing/suit/cloaks/cloak_service.dmi b/icons/clothing/suits/cloaks/cloak_service.dmi similarity index 100% rename from icons/clothing/suit/cloaks/cloak_service.dmi rename to icons/clothing/suits/cloaks/cloak_service.dmi diff --git a/icons/clothing/suit/cult.dmi b/icons/clothing/suits/cult.dmi similarity index 100% rename from icons/clothing/suit/cult.dmi rename to icons/clothing/suits/cult.dmi diff --git a/icons/clothing/suit/cult_alt.dmi b/icons/clothing/suits/cult_alt.dmi similarity index 100% rename from icons/clothing/suit/cult_alt.dmi rename to icons/clothing/suits/cult_alt.dmi diff --git a/icons/clothing/suit/dashiki/dashiki.dmi b/icons/clothing/suits/dashiki/dashiki.dmi similarity index 100% rename from icons/clothing/suit/dashiki/dashiki.dmi rename to icons/clothing/suits/dashiki/dashiki.dmi diff --git a/icons/clothing/suit/dashiki/dashiki_blue.dmi b/icons/clothing/suits/dashiki/dashiki_blue.dmi similarity index 100% rename from icons/clothing/suit/dashiki/dashiki_blue.dmi rename to icons/clothing/suits/dashiki/dashiki_blue.dmi diff --git a/icons/clothing/suit/dashiki/dashiki_red.dmi b/icons/clothing/suits/dashiki/dashiki_red.dmi similarity index 100% rename from icons/clothing/suit/dashiki/dashiki_red.dmi rename to icons/clothing/suits/dashiki/dashiki_red.dmi diff --git a/icons/clothing/suit/deity/star_champion.dmi b/icons/clothing/suits/deity/star_champion.dmi similarity index 100% rename from icons/clothing/suit/deity/star_champion.dmi rename to icons/clothing/suits/deity/star_champion.dmi diff --git a/icons/clothing/suit/deity/star_oracle.dmi b/icons/clothing/suits/deity/star_oracle.dmi similarity index 100% rename from icons/clothing/suit/deity/star_oracle.dmi rename to icons/clothing/suits/deity/star_oracle.dmi diff --git a/icons/clothing/suit/deity/star_traitor.dmi b/icons/clothing/suits/deity/star_traitor.dmi similarity index 100% rename from icons/clothing/suit/deity/star_traitor.dmi rename to icons/clothing/suits/deity/star_traitor.dmi diff --git a/icons/clothing/suit/detective_brown.dmi b/icons/clothing/suits/detective_brown.dmi similarity index 100% rename from icons/clothing/suit/detective_brown.dmi rename to icons/clothing/suits/detective_brown.dmi diff --git a/icons/clothing/suit/detective_grey.dmi b/icons/clothing/suits/detective_grey.dmi similarity index 100% rename from icons/clothing/suit/detective_grey.dmi rename to icons/clothing/suits/detective_grey.dmi diff --git a/icons/clothing/suit/emt_jacket.dmi b/icons/clothing/suits/emt_jacket.dmi similarity index 100% rename from icons/clothing/suit/emt_jacket.dmi rename to icons/clothing/suits/emt_jacket.dmi diff --git a/icons/clothing/suit/fated_mantle.dmi b/icons/clothing/suits/fated_mantle.dmi similarity index 100% rename from icons/clothing/suit/fated_mantle.dmi rename to icons/clothing/suits/fated_mantle.dmi diff --git a/icons/clothing/under/fated_robes.dmi b/icons/clothing/suits/fated_robes.dmi similarity index 75% rename from icons/clothing/under/fated_robes.dmi rename to icons/clothing/suits/fated_robes.dmi index d11475b319c..52b97fc3cfd 100644 Binary files a/icons/clothing/under/fated_robes.dmi and b/icons/clothing/suits/fated_robes.dmi differ diff --git a/icons/clothing/suit/firesuit.dmi b/icons/clothing/suits/firesuit.dmi similarity index 100% rename from icons/clothing/suit/firesuit.dmi rename to icons/clothing/suits/firesuit.dmi diff --git a/icons/clothing/suit/forensic_blue.dmi b/icons/clothing/suits/forensic_blue.dmi similarity index 100% rename from icons/clothing/suit/forensic_blue.dmi rename to icons/clothing/suits/forensic_blue.dmi diff --git a/icons/clothing/suit/forensic_red.dmi b/icons/clothing/suits/forensic_red.dmi similarity index 100% rename from icons/clothing/suit/forensic_red.dmi rename to icons/clothing/suits/forensic_red.dmi diff --git a/icons/clothing/suit/gown.dmi b/icons/clothing/suits/gown.dmi similarity index 100% rename from icons/clothing/suit/gown.dmi rename to icons/clothing/suits/gown.dmi diff --git a/icons/clothing/suits/grim_hoodie.dmi b/icons/clothing/suits/grim_hoodie.dmi new file mode 100644 index 00000000000..d639d5f5bab Binary files /dev/null and b/icons/clothing/suits/grim_hoodie.dmi differ diff --git a/icons/clothing/suit/hastur.dmi b/icons/clothing/suits/hastur.dmi similarity index 100% rename from icons/clothing/suit/hastur.dmi rename to icons/clothing/suits/hastur.dmi diff --git a/icons/clothing/suit/hazard_vest/green.dmi b/icons/clothing/suits/hazard_vest/green.dmi similarity index 100% rename from icons/clothing/suit/hazard_vest/green.dmi rename to icons/clothing/suits/hazard_vest/green.dmi diff --git a/icons/clothing/suit/hazard_vest/orange.dmi b/icons/clothing/suits/hazard_vest/orange.dmi similarity index 100% rename from icons/clothing/suit/hazard_vest/orange.dmi rename to icons/clothing/suits/hazard_vest/orange.dmi diff --git a/icons/clothing/suit/holidaypriest.dmi b/icons/clothing/suits/holidaypriest.dmi similarity index 100% rename from icons/clothing/suit/holidaypriest.dmi rename to icons/clothing/suits/holidaypriest.dmi diff --git a/icons/clothing/suit/hoodie.dmi b/icons/clothing/suits/hoodie.dmi similarity index 100% rename from icons/clothing/suit/hoodie.dmi rename to icons/clothing/suits/hoodie.dmi diff --git a/icons/clothing/suit/hos.dmi b/icons/clothing/suits/hos.dmi similarity index 100% rename from icons/clothing/suit/hos.dmi rename to icons/clothing/suits/hos.dmi diff --git a/icons/clothing/suit/human_suit.dmi b/icons/clothing/suits/human_suit.dmi similarity index 100% rename from icons/clothing/suit/human_suit.dmi rename to icons/clothing/suits/human_suit.dmi diff --git a/icons/clothing/suit/ianshirt.dmi b/icons/clothing/suits/ianshirt.dmi similarity index 100% rename from icons/clothing/suit/ianshirt.dmi rename to icons/clothing/suits/ianshirt.dmi diff --git a/icons/clothing/suit/jackets/agent.dmi b/icons/clothing/suits/jackets/agent.dmi similarity index 100% rename from icons/clothing/suit/jackets/agent.dmi rename to icons/clothing/suits/jackets/agent.dmi diff --git a/icons/clothing/suit/jackets/black.dmi b/icons/clothing/suits/jackets/black.dmi similarity index 100% rename from icons/clothing/suit/jackets/black.dmi rename to icons/clothing/suits/jackets/black.dmi diff --git a/icons/clothing/suits/jackets/blazer.dmi b/icons/clothing/suits/jackets/blazer.dmi new file mode 100644 index 00000000000..43109e43fd3 Binary files /dev/null and b/icons/clothing/suits/jackets/blazer.dmi differ diff --git a/icons/clothing/suit/jackets/bomber.dmi b/icons/clothing/suits/jackets/bomber.dmi similarity index 100% rename from icons/clothing/suit/jackets/bomber.dmi rename to icons/clothing/suits/jackets/bomber.dmi diff --git a/icons/clothing/suit/jackets/brown.dmi b/icons/clothing/suits/jackets/brown.dmi similarity index 100% rename from icons/clothing/suit/jackets/brown.dmi rename to icons/clothing/suits/jackets/brown.dmi diff --git a/icons/clothing/suit/jackets/brown_suit.dmi b/icons/clothing/suits/jackets/brown_suit.dmi similarity index 100% rename from icons/clothing/suit/jackets/brown_suit.dmi rename to icons/clothing/suits/jackets/brown_suit.dmi diff --git a/icons/clothing/suit/jackets/burgundy.dmi b/icons/clothing/suits/jackets/burgundy.dmi similarity index 100% rename from icons/clothing/suit/jackets/burgundy.dmi rename to icons/clothing/suits/jackets/burgundy.dmi diff --git a/icons/clothing/suit/jackets/captain.dmi b/icons/clothing/suits/jackets/captain.dmi similarity index 100% rename from icons/clothing/suit/jackets/captain.dmi rename to icons/clothing/suits/jackets/captain.dmi diff --git a/icons/clothing/suit/jackets/charcoal.dmi b/icons/clothing/suits/jackets/charcoal.dmi similarity index 100% rename from icons/clothing/suit/jackets/charcoal.dmi rename to icons/clothing/suits/jackets/charcoal.dmi diff --git a/icons/clothing/suit/jackets/checkered.dmi b/icons/clothing/suits/jackets/checkered.dmi similarity index 100% rename from icons/clothing/suit/jackets/checkered.dmi rename to icons/clothing/suits/jackets/checkered.dmi diff --git a/icons/clothing/suit/jackets/jacket.dmi b/icons/clothing/suits/jackets/jacket.dmi similarity index 100% rename from icons/clothing/suit/jackets/jacket.dmi rename to icons/clothing/suits/jackets/jacket.dmi diff --git a/icons/clothing/suit/jackets/navy.dmi b/icons/clothing/suits/jackets/navy.dmi similarity index 100% rename from icons/clothing/suit/jackets/navy.dmi rename to icons/clothing/suits/jackets/navy.dmi diff --git a/icons/clothing/suit/jackets/responder.dmi b/icons/clothing/suits/jackets/responder.dmi similarity index 100% rename from icons/clothing/suit/jackets/responder.dmi rename to icons/clothing/suits/jackets/responder.dmi diff --git a/icons/clothing/suit/jackets/tan.dmi b/icons/clothing/suits/jackets/tan.dmi similarity index 100% rename from icons/clothing/suit/jackets/tan.dmi rename to icons/clothing/suits/jackets/tan.dmi diff --git a/icons/clothing/suit/jensen.dmi b/icons/clothing/suits/jensen.dmi similarity index 100% rename from icons/clothing/suit/jensen.dmi rename to icons/clothing/suits/jensen.dmi diff --git a/icons/clothing/suit/judge.dmi b/icons/clothing/suits/judge.dmi similarity index 100% rename from icons/clothing/suit/judge.dmi rename to icons/clothing/suits/judge.dmi diff --git a/icons/clothing/suit/labcoat/blue_edge.dmi b/icons/clothing/suits/labcoat/blue_edge.dmi similarity index 100% rename from icons/clothing/suit/labcoat/blue_edge.dmi rename to icons/clothing/suits/labcoat/blue_edge.dmi diff --git a/icons/clothing/suit/labcoat/cmo.dmi b/icons/clothing/suits/labcoat/cmo.dmi similarity index 100% rename from icons/clothing/suit/labcoat/cmo.dmi rename to icons/clothing/suits/labcoat/cmo.dmi diff --git a/icons/clothing/suit/labcoat/default.dmi b/icons/clothing/suits/labcoat/default.dmi similarity index 100% rename from icons/clothing/suit/labcoat/default.dmi rename to icons/clothing/suits/labcoat/default.dmi diff --git a/icons/clothing/suit/labcoat/rd.dmi b/icons/clothing/suits/labcoat/rd.dmi similarity index 100% rename from icons/clothing/suit/labcoat/rd.dmi rename to icons/clothing/suits/labcoat/rd.dmi diff --git a/icons/clothing/suit/leathercoat.dmi b/icons/clothing/suits/leathercoat.dmi similarity index 100% rename from icons/clothing/suit/leathercoat.dmi rename to icons/clothing/suits/leathercoat.dmi diff --git a/icons/clothing/suit/letterman.dmi b/icons/clothing/suits/letterman.dmi similarity index 100% rename from icons/clothing/suit/letterman.dmi rename to icons/clothing/suits/letterman.dmi diff --git a/icons/clothing/suits/mantle.dmi b/icons/clothing/suits/mantle.dmi new file mode 100644 index 00000000000..4800dc50bfa Binary files /dev/null and b/icons/clothing/suits/mantle.dmi differ diff --git a/icons/clothing/suit/med_chest.dmi b/icons/clothing/suits/med_chest.dmi similarity index 100% rename from icons/clothing/suit/med_chest.dmi rename to icons/clothing/suits/med_chest.dmi diff --git a/icons/clothing/suit/monkey.dmi b/icons/clothing/suits/monkey.dmi similarity index 100% rename from icons/clothing/suit/monkey.dmi rename to icons/clothing/suits/monkey.dmi diff --git a/icons/clothing/suit/nun.dmi b/icons/clothing/suits/nun.dmi similarity index 100% rename from icons/clothing/suit/nun.dmi rename to icons/clothing/suits/nun.dmi diff --git a/icons/clothing/suit/overalls.dmi b/icons/clothing/suits/overalls.dmi similarity index 100% rename from icons/clothing/suit/overalls.dmi rename to icons/clothing/suits/overalls.dmi diff --git a/icons/clothing/suits/overalls_denim.dmi b/icons/clothing/suits/overalls_denim.dmi new file mode 100644 index 00000000000..be3bd6115d2 Binary files /dev/null and b/icons/clothing/suits/overalls_denim.dmi differ diff --git a/icons/clothing/suits/overalls_laborer.dmi b/icons/clothing/suits/overalls_laborer.dmi new file mode 100644 index 00000000000..0cbcba896ca Binary files /dev/null and b/icons/clothing/suits/overalls_laborer.dmi differ diff --git a/icons/clothing/suit/pirate.dmi b/icons/clothing/suits/pirate.dmi similarity index 100% rename from icons/clothing/suit/pirate.dmi rename to icons/clothing/suits/pirate.dmi diff --git a/icons/clothing/suit/pirate_captain.dmi b/icons/clothing/suits/pirate_captain.dmi similarity index 100% rename from icons/clothing/suit/pirate_captain.dmi rename to icons/clothing/suits/pirate_captain.dmi diff --git a/icons/clothing/suit/poncho/blue.dmi b/icons/clothing/suits/poncho/blue.dmi similarity index 100% rename from icons/clothing/suit/poncho/blue.dmi rename to icons/clothing/suits/poncho/blue.dmi diff --git a/icons/clothing/suit/poncho/cargo.dmi b/icons/clothing/suits/poncho/cargo.dmi similarity index 100% rename from icons/clothing/suit/poncho/cargo.dmi rename to icons/clothing/suits/poncho/cargo.dmi diff --git a/icons/clothing/suit/poncho/classic.dmi b/icons/clothing/suits/poncho/classic.dmi similarity index 100% rename from icons/clothing/suit/poncho/classic.dmi rename to icons/clothing/suits/poncho/classic.dmi diff --git a/icons/clothing/suit/poncho/colourable.dmi b/icons/clothing/suits/poncho/colourable.dmi similarity index 100% rename from icons/clothing/suit/poncho/colourable.dmi rename to icons/clothing/suits/poncho/colourable.dmi diff --git a/icons/clothing/suit/poncho/eng.dmi b/icons/clothing/suits/poncho/eng.dmi similarity index 100% rename from icons/clothing/suit/poncho/eng.dmi rename to icons/clothing/suits/poncho/eng.dmi diff --git a/icons/clothing/suit/poncho/green.dmi b/icons/clothing/suits/poncho/green.dmi similarity index 100% rename from icons/clothing/suit/poncho/green.dmi rename to icons/clothing/suits/poncho/green.dmi diff --git a/icons/clothing/suit/poncho/med.dmi b/icons/clothing/suits/poncho/med.dmi similarity index 100% rename from icons/clothing/suit/poncho/med.dmi rename to icons/clothing/suits/poncho/med.dmi diff --git a/icons/clothing/suit/poncho/purple.dmi b/icons/clothing/suits/poncho/purple.dmi similarity index 100% rename from icons/clothing/suit/poncho/purple.dmi rename to icons/clothing/suits/poncho/purple.dmi diff --git a/icons/clothing/suit/poncho/red.dmi b/icons/clothing/suits/poncho/red.dmi similarity index 100% rename from icons/clothing/suit/poncho/red.dmi rename to icons/clothing/suits/poncho/red.dmi diff --git a/icons/clothing/suit/poncho/sec.dmi b/icons/clothing/suits/poncho/sec.dmi similarity index 100% rename from icons/clothing/suit/poncho/sec.dmi rename to icons/clothing/suits/poncho/sec.dmi diff --git a/icons/clothing/suit/rad_suit.dmi b/icons/clothing/suits/rad_suit.dmi similarity index 100% rename from icons/clothing/suit/rad_suit.dmi rename to icons/clothing/suits/rad_suit.dmi diff --git a/icons/clothing/suit/redtag.dmi b/icons/clothing/suits/redtag.dmi similarity index 100% rename from icons/clothing/suit/redtag.dmi rename to icons/clothing/suits/redtag.dmi diff --git a/icons/clothing/suit/rough_robe.dmi b/icons/clothing/suits/rough_robe.dmi similarity index 100% rename from icons/clothing/suit/rough_robe.dmi rename to icons/clothing/suits/rough_robe.dmi diff --git a/icons/clothing/suit/santa.dmi b/icons/clothing/suits/santa.dmi similarity index 100% rename from icons/clothing/suit/santa.dmi rename to icons/clothing/suits/santa.dmi diff --git a/icons/clothing/suit/sherwani.dmi b/icons/clothing/suits/sherwani.dmi similarity index 100% rename from icons/clothing/suit/sherwani.dmi rename to icons/clothing/suits/sherwani.dmi diff --git a/icons/clothing/suit/space/syndicate/black.dmi b/icons/clothing/suits/space/syndicate/black.dmi similarity index 100% rename from icons/clothing/suit/space/syndicate/black.dmi rename to icons/clothing/suits/space/syndicate/black.dmi diff --git a/icons/clothing/suit/space/syndicate/blackblue.dmi b/icons/clothing/suits/space/syndicate/blackblue.dmi similarity index 100% rename from icons/clothing/suit/space/syndicate/blackblue.dmi rename to icons/clothing/suits/space/syndicate/blackblue.dmi diff --git a/icons/clothing/suit/space/syndicate/blackengie.dmi b/icons/clothing/suits/space/syndicate/blackengie.dmi similarity index 100% rename from icons/clothing/suit/space/syndicate/blackengie.dmi rename to icons/clothing/suits/space/syndicate/blackengie.dmi diff --git a/icons/clothing/suit/space/syndicate/blackgreen.dmi b/icons/clothing/suits/space/syndicate/blackgreen.dmi similarity index 100% rename from icons/clothing/suit/space/syndicate/blackgreen.dmi rename to icons/clothing/suits/space/syndicate/blackgreen.dmi diff --git a/icons/clothing/suit/space/syndicate/blackmed.dmi b/icons/clothing/suits/space/syndicate/blackmed.dmi similarity index 100% rename from icons/clothing/suit/space/syndicate/blackmed.dmi rename to icons/clothing/suits/space/syndicate/blackmed.dmi diff --git a/icons/clothing/suit/space/syndicate/blackorange.dmi b/icons/clothing/suits/space/syndicate/blackorange.dmi similarity index 100% rename from icons/clothing/suit/space/syndicate/blackorange.dmi rename to icons/clothing/suits/space/syndicate/blackorange.dmi diff --git a/icons/clothing/suit/space/syndicate/blackred.dmi b/icons/clothing/suits/space/syndicate/blackred.dmi similarity index 100% rename from icons/clothing/suit/space/syndicate/blackred.dmi rename to icons/clothing/suits/space/syndicate/blackred.dmi diff --git a/icons/clothing/suit/space/syndicate/blue.dmi b/icons/clothing/suits/space/syndicate/blue.dmi similarity index 100% rename from icons/clothing/suit/space/syndicate/blue.dmi rename to icons/clothing/suits/space/syndicate/blue.dmi diff --git a/icons/clothing/suit/space/syndicate/darkgreen.dmi b/icons/clothing/suits/space/syndicate/darkgreen.dmi similarity index 100% rename from icons/clothing/suit/space/syndicate/darkgreen.dmi rename to icons/clothing/suits/space/syndicate/darkgreen.dmi diff --git a/icons/clothing/suit/space/syndicate/green.dmi b/icons/clothing/suits/space/syndicate/green.dmi similarity index 100% rename from icons/clothing/suit/space/syndicate/green.dmi rename to icons/clothing/suits/space/syndicate/green.dmi diff --git a/icons/clothing/suit/space/syndicate/orange.dmi b/icons/clothing/suits/space/syndicate/orange.dmi similarity index 100% rename from icons/clothing/suit/space/syndicate/orange.dmi rename to icons/clothing/suits/space/syndicate/orange.dmi diff --git a/icons/clothing/suit/space/syndicate/red.dmi b/icons/clothing/suits/space/syndicate/red.dmi similarity index 100% rename from icons/clothing/suit/space/syndicate/red.dmi rename to icons/clothing/suits/space/syndicate/red.dmi diff --git a/icons/clothing/suit/straightjacket.dmi b/icons/clothing/suits/straightjacket.dmi similarity index 100% rename from icons/clothing/suit/straightjacket.dmi rename to icons/clothing/suits/straightjacket.dmi diff --git a/icons/clothing/under/suits/suit_black.dmi b/icons/clothing/suits/suit_black.dmi similarity index 100% rename from icons/clothing/under/suits/suit_black.dmi rename to icons/clothing/suits/suit_black.dmi diff --git a/icons/clothing/under/suits/suit_black_female.dmi b/icons/clothing/suits/suit_black_female.dmi similarity index 100% rename from icons/clothing/under/suits/suit_black_female.dmi rename to icons/clothing/suits/suit_black_female.dmi diff --git a/icons/clothing/under/suits/suit_executive.dmi b/icons/clothing/suits/suit_executive.dmi similarity index 100% rename from icons/clothing/under/suits/suit_executive.dmi rename to icons/clothing/suits/suit_executive.dmi diff --git a/icons/clothing/under/suits/suit_executive_female.dmi b/icons/clothing/suits/suit_executive_female.dmi similarity index 100% rename from icons/clothing/under/suits/suit_executive_female.dmi rename to icons/clothing/suits/suit_executive_female.dmi diff --git a/icons/clothing/under/suits/suit_fiend.dmi b/icons/clothing/suits/suit_fiend.dmi similarity index 100% rename from icons/clothing/under/suits/suit_fiend.dmi rename to icons/clothing/suits/suit_fiend.dmi diff --git a/icons/clothing/under/suits/suit_green.dmi b/icons/clothing/suits/suit_green.dmi similarity index 100% rename from icons/clothing/under/suits/suit_green.dmi rename to icons/clothing/suits/suit_green.dmi diff --git a/icons/clothing/under/suits/suit_skrell.dmi b/icons/clothing/suits/suit_skrell.dmi similarity index 100% rename from icons/clothing/under/suits/suit_skrell.dmi rename to icons/clothing/suits/suit_skrell.dmi diff --git a/icons/clothing/under/suits/suit_teal.dmi b/icons/clothing/suits/suit_teal.dmi similarity index 100% rename from icons/clothing/under/suits/suit_teal.dmi rename to icons/clothing/suits/suit_teal.dmi diff --git a/icons/clothing/suit/tdgreen.dmi b/icons/clothing/suits/tdgreen.dmi similarity index 100% rename from icons/clothing/suit/tdgreen.dmi rename to icons/clothing/suits/tdgreen.dmi diff --git a/icons/clothing/suit/tdred.dmi b/icons/clothing/suits/tdred.dmi similarity index 100% rename from icons/clothing/suit/tdred.dmi rename to icons/clothing/suits/tdred.dmi diff --git a/icons/clothing/suit/thawb.dmi b/icons/clothing/suits/thawb.dmi similarity index 100% rename from icons/clothing/suit/thawb.dmi rename to icons/clothing/suits/thawb.dmi diff --git a/icons/clothing/suit/tracksuit/black.dmi b/icons/clothing/suits/tracksuit/black.dmi similarity index 100% rename from icons/clothing/suit/tracksuit/black.dmi rename to icons/clothing/suits/tracksuit/black.dmi diff --git a/icons/clothing/suit/tracksuit/blue.dmi b/icons/clothing/suits/tracksuit/blue.dmi similarity index 100% rename from icons/clothing/suit/tracksuit/blue.dmi rename to icons/clothing/suits/tracksuit/blue.dmi diff --git a/icons/clothing/suit/tracksuit/navy.dmi b/icons/clothing/suits/tracksuit/navy.dmi similarity index 100% rename from icons/clothing/suit/tracksuit/navy.dmi rename to icons/clothing/suits/tracksuit/navy.dmi diff --git a/icons/clothing/suit/tracksuit/red.dmi b/icons/clothing/suits/tracksuit/red.dmi similarity index 100% rename from icons/clothing/suit/tracksuit/red.dmi rename to icons/clothing/suits/tracksuit/red.dmi diff --git a/icons/clothing/suit/vest.dmi b/icons/clothing/suits/vest.dmi similarity index 100% rename from icons/clothing/suit/vest.dmi rename to icons/clothing/suits/vest.dmi diff --git a/icons/clothing/suit/w40k.dmi b/icons/clothing/suits/w40k.dmi similarity index 100% rename from icons/clothing/suit/w40k.dmi rename to icons/clothing/suits/w40k.dmi diff --git a/icons/clothing/suit/warden.dmi b/icons/clothing/suits/warden.dmi similarity index 100% rename from icons/clothing/suit/warden.dmi rename to icons/clothing/suits/warden.dmi diff --git a/icons/clothing/suit/wintercoat/atmos.dmi b/icons/clothing/suits/wintercoat/atmos.dmi similarity index 100% rename from icons/clothing/suit/wintercoat/atmos.dmi rename to icons/clothing/suits/wintercoat/atmos.dmi diff --git a/icons/clothing/suit/wintercoat/captain.dmi b/icons/clothing/suits/wintercoat/captain.dmi similarity index 100% rename from icons/clothing/suit/wintercoat/captain.dmi rename to icons/clothing/suits/wintercoat/captain.dmi diff --git a/icons/clothing/suit/wintercoat/cargo.dmi b/icons/clothing/suits/wintercoat/cargo.dmi similarity index 100% rename from icons/clothing/suit/wintercoat/cargo.dmi rename to icons/clothing/suits/wintercoat/cargo.dmi diff --git a/icons/clothing/suit/wintercoat/coat.dmi b/icons/clothing/suits/wintercoat/coat.dmi similarity index 100% rename from icons/clothing/suit/wintercoat/coat.dmi rename to icons/clothing/suits/wintercoat/coat.dmi diff --git a/icons/clothing/suit/wintercoat/eng.dmi b/icons/clothing/suits/wintercoat/eng.dmi similarity index 100% rename from icons/clothing/suit/wintercoat/eng.dmi rename to icons/clothing/suits/wintercoat/eng.dmi diff --git a/icons/clothing/suit/wintercoat/hydro.dmi b/icons/clothing/suits/wintercoat/hydro.dmi similarity index 100% rename from icons/clothing/suit/wintercoat/hydro.dmi rename to icons/clothing/suits/wintercoat/hydro.dmi diff --git a/icons/clothing/suit/wintercoat/med.dmi b/icons/clothing/suits/wintercoat/med.dmi similarity index 100% rename from icons/clothing/suit/wintercoat/med.dmi rename to icons/clothing/suits/wintercoat/med.dmi diff --git a/icons/clothing/suit/wintercoat/mining.dmi b/icons/clothing/suits/wintercoat/mining.dmi similarity index 100% rename from icons/clothing/suit/wintercoat/mining.dmi rename to icons/clothing/suits/wintercoat/mining.dmi diff --git a/icons/clothing/suit/wintercoat/sci.dmi b/icons/clothing/suits/wintercoat/sci.dmi similarity index 100% rename from icons/clothing/suit/wintercoat/sci.dmi rename to icons/clothing/suits/wintercoat/sci.dmi diff --git a/icons/clothing/suit/wintercoat/sec.dmi b/icons/clothing/suits/wintercoat/sec.dmi similarity index 100% rename from icons/clothing/suit/wintercoat/sec.dmi rename to icons/clothing/suits/wintercoat/sec.dmi diff --git a/icons/clothing/suit/wizard/fake.dmi b/icons/clothing/suits/wizard/fake.dmi similarity index 100% rename from icons/clothing/suit/wizard/fake.dmi rename to icons/clothing/suits/wizard/fake.dmi diff --git a/icons/clothing/suit/wizard/gentleman.dmi b/icons/clothing/suits/wizard/gentleman.dmi similarity index 100% rename from icons/clothing/suit/wizard/gentleman.dmi rename to icons/clothing/suits/wizard/gentleman.dmi diff --git a/icons/clothing/suit/wizard/magusblue.dmi b/icons/clothing/suits/wizard/magusblue.dmi similarity index 100% rename from icons/clothing/suit/wizard/magusblue.dmi rename to icons/clothing/suits/wizard/magusblue.dmi diff --git a/icons/clothing/suit/wizard/magusred.dmi b/icons/clothing/suits/wizard/magusred.dmi similarity index 100% rename from icons/clothing/suit/wizard/magusred.dmi rename to icons/clothing/suits/wizard/magusred.dmi diff --git a/icons/clothing/suit/wizard/marisa.dmi b/icons/clothing/suits/wizard/marisa.dmi similarity index 100% rename from icons/clothing/suit/wizard/marisa.dmi rename to icons/clothing/suits/wizard/marisa.dmi diff --git a/icons/clothing/suit/wizard/psy.dmi b/icons/clothing/suits/wizard/psy.dmi similarity index 100% rename from icons/clothing/suit/wizard/psy.dmi rename to icons/clothing/suits/wizard/psy.dmi diff --git a/icons/clothing/suit/wizard/red.dmi b/icons/clothing/suits/wizard/red.dmi similarity index 100% rename from icons/clothing/suit/wizard/red.dmi rename to icons/clothing/suits/wizard/red.dmi diff --git a/icons/clothing/suit/wizard/servant/caretaker.dmi b/icons/clothing/suits/wizard/servant/caretaker.dmi similarity index 100% rename from icons/clothing/suit/wizard/servant/caretaker.dmi rename to icons/clothing/suits/wizard/servant/caretaker.dmi diff --git a/icons/clothing/suit/wizard/servant/champion.dmi b/icons/clothing/suits/wizard/servant/champion.dmi similarity index 100% rename from icons/clothing/suit/wizard/servant/champion.dmi rename to icons/clothing/suits/wizard/servant/champion.dmi diff --git a/icons/clothing/suit/wizard/servant/fiend_cowl.dmi b/icons/clothing/suits/wizard/servant/fiend_cowl.dmi similarity index 100% rename from icons/clothing/suit/wizard/servant/fiend_cowl.dmi rename to icons/clothing/suits/wizard/servant/fiend_cowl.dmi diff --git a/icons/clothing/suit/wizard/servant/fiend_robe.dmi b/icons/clothing/suits/wizard/servant/fiend_robe.dmi similarity index 100% rename from icons/clothing/suit/wizard/servant/fiend_robe.dmi rename to icons/clothing/suits/wizard/servant/fiend_robe.dmi diff --git a/icons/clothing/suit/wizard/servant/inf_dress.dmi b/icons/clothing/suits/wizard/servant/inf_dress.dmi similarity index 100% rename from icons/clothing/suit/wizard/servant/inf_dress.dmi rename to icons/clothing/suits/wizard/servant/inf_dress.dmi diff --git a/icons/clothing/suit/wizard/servant/inf_suit.dmi b/icons/clothing/suits/wizard/servant/inf_suit.dmi similarity index 100% rename from icons/clothing/suit/wizard/servant/inf_suit.dmi rename to icons/clothing/suits/wizard/servant/inf_suit.dmi diff --git a/icons/clothing/suit/wizard/servant/overseer.dmi b/icons/clothing/suits/wizard/servant/overseer.dmi similarity index 100% rename from icons/clothing/suit/wizard/servant/overseer.dmi rename to icons/clothing/suits/wizard/servant/overseer.dmi diff --git a/icons/clothing/suit/wizard/wizard.dmi b/icons/clothing/suits/wizard/wizard.dmi similarity index 100% rename from icons/clothing/suit/wizard/wizard.dmi rename to icons/clothing/suits/wizard/wizard.dmi diff --git a/icons/clothing/suit/xeno.dmi b/icons/clothing/suits/xeno.dmi similarity index 100% rename from icons/clothing/suit/xeno.dmi rename to icons/clothing/suits/xeno.dmi diff --git a/icons/clothing/under/blazer.dmi b/icons/clothing/under/blazer.dmi deleted file mode 100644 index 2200335585b..00000000000 Binary files a/icons/clothing/under/blazer.dmi and /dev/null differ diff --git a/icons/clothing/under/formal.dmi b/icons/clothing/under/formal.dmi deleted file mode 100644 index 96df0518d33..00000000000 Binary files a/icons/clothing/under/formal.dmi and /dev/null differ diff --git a/icons/clothing/under/frontier.dmi b/icons/clothing/under/frontier.dmi deleted file mode 100644 index 2ffb13e2a41..00000000000 Binary files a/icons/clothing/under/frontier.dmi and /dev/null differ diff --git a/icons/clothing/under/grim_hoodie.dmi b/icons/clothing/under/grim_hoodie.dmi deleted file mode 100644 index cb7030c6550..00000000000 Binary files a/icons/clothing/under/grim_hoodie.dmi and /dev/null differ diff --git a/icons/clothing/under/jumpsuits/jumpsuit_skirt.dmi b/icons/clothing/under/jumpsuits/jumpsuit_skirt.dmi deleted file mode 100644 index 59eb6a08bc5..00000000000 Binary files a/icons/clothing/under/jumpsuits/jumpsuit_skirt.dmi and /dev/null differ diff --git a/icons/clothing/under/overalls.dmi b/icons/clothing/under/overalls.dmi deleted file mode 100644 index 0fc9efc6a2e..00000000000 Binary files a/icons/clothing/under/overalls.dmi and /dev/null differ diff --git a/icons/clothing/under/suits/suit_gentleman.dmi b/icons/clothing/under/suits/suit_gentleman.dmi deleted file mode 100644 index 320610866ee..00000000000 Binary files a/icons/clothing/under/suits/suit_gentleman.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_bartender.dmi b/icons/clothing/under/uniform_bartender.dmi deleted file mode 100644 index db009e07e06..00000000000 Binary files a/icons/clothing/under/uniform_bartender.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_chef.dmi b/icons/clothing/under/uniform_chef.dmi deleted file mode 100644 index 2e0f85944ea..00000000000 Binary files a/icons/clothing/under/uniform_chef.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_combat.dmi b/icons/clothing/under/uniform_combat.dmi deleted file mode 100644 index 118583feec9..00000000000 Binary files a/icons/clothing/under/uniform_combat.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_director.dmi b/icons/clothing/under/uniform_director.dmi deleted file mode 100644 index 022183d6e52..00000000000 Binary files a/icons/clothing/under/uniform_director.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_ec.dmi b/icons/clothing/under/uniform_ec.dmi deleted file mode 100644 index d9df558cd8c..00000000000 Binary files a/icons/clothing/under/uniform_ec.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_ert.dmi b/icons/clothing/under/uniform_ert.dmi deleted file mode 100644 index 215f4b2ca70..00000000000 Binary files a/icons/clothing/under/uniform_ert.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_lawyer_black_female.dmi b/icons/clothing/under/uniform_lawyer_black_female.dmi deleted file mode 100644 index 3ee0c82ca73..00000000000 Binary files a/icons/clothing/under/uniform_lawyer_black_female.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_mechanic.dmi b/icons/clothing/under/uniform_mechanic.dmi deleted file mode 100644 index 792a7507456..00000000000 Binary files a/icons/clothing/under/uniform_mechanic.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_orderly.dmi b/icons/clothing/under/uniform_orderly.dmi deleted file mode 100644 index b7901126b4e..00000000000 Binary files a/icons/clothing/under/uniform_orderly.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_redshirt.dmi b/icons/clothing/under/uniform_redshirt.dmi deleted file mode 100644 index ab4c5ba8bac..00000000000 Binary files a/icons/clothing/under/uniform_redshirt.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_service.dmi b/icons/clothing/under/uniform_service.dmi deleted file mode 100644 index 6b17a97edc0..00000000000 Binary files a/icons/clothing/under/uniform_service.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_syndicate.dmi b/icons/clothing/under/uniform_syndicate.dmi deleted file mode 100644 index 46709e8c51a..00000000000 Binary files a/icons/clothing/under/uniform_syndicate.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_tacticool.dmi b/icons/clothing/under/uniform_tacticool.dmi deleted file mode 100644 index a2c5404812c..00000000000 Binary files a/icons/clothing/under/uniform_tacticool.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_turtleneck.dmi b/icons/clothing/under/uniform_turtleneck.dmi deleted file mode 100644 index d02ab4e1c6f..00000000000 Binary files a/icons/clothing/under/uniform_turtleneck.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_turtleneck_blue.dmi b/icons/clothing/under/uniform_turtleneck_blue.dmi deleted file mode 100644 index c696166ccc9..00000000000 Binary files a/icons/clothing/under/uniform_turtleneck_blue.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_waiter.dmi b/icons/clothing/under/uniform_waiter.dmi deleted file mode 100644 index 7c05b6b41e2..00000000000 Binary files a/icons/clothing/under/uniform_waiter.dmi and /dev/null differ diff --git a/icons/clothing/under/uniform_assistant_formal.dmi b/icons/clothing/uniform_assistant_formal.dmi similarity index 100% rename from icons/clothing/under/uniform_assistant_formal.dmi rename to icons/clothing/uniform_assistant_formal.dmi diff --git a/icons/clothing/under/uniform_captain_formal.dmi b/icons/clothing/uniform_captain_formal.dmi similarity index 100% rename from icons/clothing/under/uniform_captain_formal.dmi rename to icons/clothing/uniform_captain_formal.dmi diff --git a/icons/clothing/under/uniform_dispatch.dmi b/icons/clothing/uniform_dispatch.dmi similarity index 100% rename from icons/clothing/under/uniform_dispatch.dmi rename to icons/clothing/uniform_dispatch.dmi diff --git a/icons/clothing/under/uniform_hop_whimsy.dmi b/icons/clothing/uniform_hop_whimsy.dmi similarity index 100% rename from icons/clothing/under/uniform_hop_whimsy.dmi rename to icons/clothing/uniform_hop_whimsy.dmi diff --git a/icons/clothing/under/uniform_hos_formal.dmi b/icons/clothing/uniform_hos_formal.dmi similarity index 100% rename from icons/clothing/under/uniform_hos_formal.dmi rename to icons/clothing/uniform_hos_formal.dmi diff --git a/icons/clothing/uniform_mechanic.dmi b/icons/clothing/uniform_mechanic.dmi new file mode 100644 index 00000000000..b4cb22321ba Binary files /dev/null and b/icons/clothing/uniform_mechanic.dmi differ diff --git a/icons/clothing/under/uniform_officer_dress.dmi b/icons/clothing/uniform_officer_dress.dmi similarity index 100% rename from icons/clothing/under/uniform_officer_dress.dmi rename to icons/clothing/uniform_officer_dress.dmi diff --git a/icons/clothing/under/uniform_rd_alt.dmi b/icons/clothing/uniform_rd_alt.dmi similarity index 100% rename from icons/clothing/under/uniform_rd_alt.dmi rename to icons/clothing/uniform_rd_alt.dmi diff --git a/icons/clothing/under/uniform_swat.dmi b/icons/clothing/uniform_swat.dmi similarity index 100% rename from icons/clothing/under/uniform_swat.dmi rename to icons/clothing/uniform_swat.dmi diff --git a/icons/clothing/under/uniform_vice.dmi b/icons/clothing/uniform_vice.dmi similarity index 100% rename from icons/clothing/under/uniform_vice.dmi rename to icons/clothing/uniform_vice.dmi diff --git a/icons/effects/genetics.dmi b/icons/effects/genetics.dmi index 8e31fea9613..8ec52b23f58 100644 Binary files a/icons/effects/genetics.dmi and b/icons/effects/genetics.dmi differ diff --git a/icons/mob/human_races/species/human/skeleton.dmi b/icons/mob/human_races/species/human/skeleton.dmi index 1cedb1196f0..5dffe35ad87 100644 Binary files a/icons/mob/human_races/species/human/skeleton.dmi and b/icons/mob/human_races/species/human/skeleton.dmi differ diff --git a/icons/mob/simple_animal/fish_salmon.dmi b/icons/mob/simple_animal/fish_salmon.dmi index 4226c4cb46e..56e77249b1f 100644 Binary files a/icons/mob/simple_animal/fish_salmon.dmi and b/icons/mob/simple_animal/fish_salmon.dmi differ diff --git a/icons/obj/items/weapon/stunbaton.dmi b/icons/obj/items/weapon/stunbaton.dmi index fa1de1aaa43..da54a77b42f 100644 Binary files a/icons/obj/items/weapon/stunbaton.dmi and b/icons/obj/items/weapon/stunbaton.dmi differ diff --git a/icons/obj/structures/log_wall_frame.dmi b/icons/obj/structures/log_wall_frame.dmi new file mode 100644 index 00000000000..1fdbdb10536 Binary files /dev/null and b/icons/obj/structures/log_wall_frame.dmi differ diff --git a/maps/antag_spawn/heist/heist.dm b/maps/antag_spawn/heist/heist.dm deleted file mode 100644 index 0405013a004..00000000000 --- a/maps/antag_spawn/heist/heist.dm +++ /dev/null @@ -1,78 +0,0 @@ -#include "heist_antag.dm" -#include "heist_outfit.dm" - -/mob/living/simple_animal/hostile/retaliate/parrot/pirate - name = "\proper Meatbag" - emote_speech = list("Yaaar!","Squaaak!","Fight me Matey!","BAWWWWK Vox trying to eat me!") - -/datum/map_template/ruin/antag_spawn/heist - name = "Heist Base" - suffixes = list("heist/heist_base.dmm") - modify_tag_vars = FALSE - shuttles_to_initialise = list(/datum/shuttle/autodock/multi/antag/skipjack) - apc_test_exempt_areas = list( - /area/map_template/skipjack_station = NO_SCRUBBER|NO_VENT|NO_APC, - /area/map_template/syndicate_mothership/raider_base = NO_SCRUBBER|NO_VENT|NO_APC - ) - -/obj/machinery/network/telecomms_hub/raider - initial_network_id = "piratenet" - req_access = list(access_raider) - channels = list( - COMMON_FREQUENCY_DATA, - list( - "name" = "Raider", - "key" = "t", - "frequency" = PUB_FREQ, - "color" = COMMS_COLOR_SYNDICATE, - "span_class" = CSS_CLASS_RADIO, - "secured" = access_raider - ) - ) - -/datum/shuttle/autodock/multi/antag/skipjack - name = "Skipjack" - defer_initialisation = TRUE - warmup_time = 0 - destination_tags = list( - "nav_skipjack_start" - ) - shuttle_area = /area/map_template/skipjack_station/start - dock_target = "skipjack_shuttle" - current_location = "nav_skipjack_start" - announcer = "Proximity Sensor Array" - home_waypoint = "nav_skipjack_start" - arrival_message = "Attention, vessel detected entering vessel proximity." - departure_message = "Attention, vessel detected leaving vessel proximity." - -/obj/effect/shuttle_landmark/skipjack/start - name = "Raider Outpost" - landmark_tag = "nav_skipjack_start" - docking_controller = "skipjack_base" - -//Areas -/area/map_template/skipjack_station - name = "Raider Outpost" - icon_state = "yellow" - requires_power = 0 - req_access = list(access_raider) - -/area/map_template/skipjack_station/start - name = "\improper Skipjack" - icon_state = "yellow" - req_access = list(access_raider) - area_flags = AREA_FLAG_RAD_SHIELDED | AREA_FLAG_ION_SHIELDED - -/area/map_template/syndicate_mothership/raider_base - name = "\improper Raider Base" - requires_power = 0 - dynamic_lighting = FALSE - req_access = list(access_raider) - -/obj/machinery/computer/shuttle_control/multi/raider - name = "skipjack control console" - initial_access = list(access_raider) - shuttle_tag = "Skipjack" - -/obj/structure/sign/warning/nosmoking_1/heist - desc = "A warning sign which reads 'NO SMOKING'. Someone has scratched a variety of crude words in gutter across the entire sign." \ No newline at end of file diff --git a/maps/antag_spawn/wizard/wizard_base.dmm b/maps/antag_spawn/wizard/wizard_base.dmm index b05912d7e4d..1f7355801c5 100644 --- a/maps/antag_spawn/wizard/wizard_base.dmm +++ b/maps/antag_spawn/wizard/wizard_base.dmm @@ -80,7 +80,7 @@ /turf/floor/carpet, /area/map_template/wizard_station) "ap" = ( -/mob/living/carbon/human/monkey{ +/mob/living/human/monkey{ name = "Murphey" }, /turf/unsimulated/floor{ @@ -433,7 +433,7 @@ /area/map_template/wizard_station) "bh" = ( /obj/structure/closet, -/obj/item/clothing/under/psysuit, +/obj/item/clothing/jumpsuit/psysuit, /obj/item/clothing/suit/wizrobe/psypurple, /turf/unsimulated/floor{ icon_state = "lino" @@ -451,7 +451,8 @@ desc = "A set of fancy shoes that are as functional as they are comfortable."; name = "Gentlemans Shoes" }, -/obj/item/clothing/under/gentlesuit, +/obj/item/clothing/shirt/button/black, +/obj/item/clothing/suit/jacket/vest/gray, /obj/item/clothing/suit/wizrobe/gentlecoat, /obj/item/clothing/head/wizard/cap, /obj/item/staff/gentcane, @@ -512,7 +513,7 @@ }, /area/map_template/wizard_station) "bq" = ( -/obj/structure/cult/pylon, +/obj/structure/fake_pylon, /turf/unsimulated/floor{ icon_state = "cult"; name = "plating" @@ -561,7 +562,7 @@ }, /area/map_template/wizard_station) "bx" = ( -/obj/structure/cult/talisman, +/obj/structure/talisman_altar, /obj/item/knife/ritual, /turf/unsimulated/floor{ icon_state = "cult"; @@ -576,7 +577,7 @@ }, /area/map_template/wizard_station) "bz" = ( -/obj/effect/gateway/active/cult, +/obj/effect/gateway/active/spooky, /turf/unsimulated/floor{ icon_state = "cult"; name = "plating" diff --git a/maps/away/bearcat/bearcat.dm b/maps/away/bearcat/bearcat.dm index b44e9442bca..d959bc2f1d7 100644 --- a/maps/away/bearcat/bearcat.dm +++ b/maps/away/bearcat/bearcat.dm @@ -125,7 +125,7 @@ shoes = /obj/item/clothing/shoes/color/black r_pocket = /obj/item/radio -/decl/hierarchy/outfit/deadcap/post_equip(mob/living/carbon/human/H) +/decl/hierarchy/outfit/deadcap/post_equip(mob/living/human/H) ..() var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) if(uniform) diff --git a/maps/away/bearcat/bearcat_jobs.dm b/maps/away/bearcat/bearcat_jobs.dm index 2dc2800e4c7..56b92e64506 100644 --- a/maps/away/bearcat/bearcat_jobs.dm +++ b/maps/away/bearcat/bearcat_jobs.dm @@ -35,7 +35,7 @@ pda_type = /obj/item/modular_computer/pda/heads/captain id_type = /obj/item/card/id/bearcat_captain -/decl/hierarchy/outfit/job/bearcat/captain/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/job/bearcat/captain/post_equip(var/mob/living/human/H) ..() var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) if(uniform) diff --git a/maps/away/errant_pisces/errant_pisces.dm b/maps/away/errant_pisces/errant_pisces.dm index b19a2e61a5b..05319f87c3f 100644 --- a/maps/away/errant_pisces/errant_pisces.dm +++ b/maps/away/errant_pisces/errant_pisces.dm @@ -234,7 +234,7 @@ if (amount < 1) qdel(src) -/obj/item/clothing/under/carp //as far as I know sprites are taken from /tg/ +/obj/item/clothing/costume/carp //as far as I know sprites are taken from /tg/ name = "space carp suit" desc = "A suit in a shape of a space carp. Usually worn by corporate interns who are sent to entertain children during HQ excursions." icon = 'maps/away/errant_pisces/icons/carpsuit.dmi' diff --git a/maps/away/errant_pisces/errant_pisces.dmm b/maps/away/errant_pisces/errant_pisces.dmm index e05aba47439..73a12cad534 100644 --- a/maps/away/errant_pisces/errant_pisces.dmm +++ b/maps/away/errant_pisces/errant_pisces.dmm @@ -3710,7 +3710,7 @@ pixel_y = 24 }, /obj/structure/closet, -/obj/item/clothing/under/carp, +/obj/item/clothing/costume/carp, /turf/floor/tiled, /area/errant_pisces/science_wing) "jU" = ( diff --git a/maps/away/liberia/liberia.dmm b/maps/away/liberia/liberia.dmm index 0c0fa8ca613..5ada79b4e72 100644 --- a/maps/away/liberia/liberia.dmm +++ b/maps/away/liberia/liberia.dmm @@ -178,7 +178,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "merch_radaway"; - + }, /obj/machinery/door/window/northleft{ dir = 8; @@ -207,7 +207,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "merch_radaway"; - + }, /turf/floor, /area/liberia/engineeringreactor) @@ -646,7 +646,7 @@ dir = 2; id_tag = "merchantshuttle"; name = "Merchant Window Shutters"; - + }, /obj/effect/paint/silver, /obj/effect/paint_stripe/yellow, @@ -705,7 +705,8 @@ /obj/item/clothing/gloves/insulated, /obj/item/clothing/glasses/tacgoggles, /obj/item/clothing/shoes/legguards, -/obj/item/clothing/under/syndicate, +/obj/item/clothing/shirt/syndicate, +/obj/item/clothing/pants/casual/camo, /turf/floor/tiled/dark/monotile, /area/liberia/mule) "bt" = ( @@ -836,7 +837,7 @@ dir = 4; id_tag = "merchantshuttle"; name = "Merchant Window Shutters"; - + }, /obj/effect/paint/silver, /obj/effect/paint_stripe/yellow, @@ -1270,7 +1271,7 @@ dir = 4; id_tag = "merchantdesk"; name = "Merchant Desk Shutters"; - + }, /obj/effect/paint/silver, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -1577,7 +1578,7 @@ dir = 4; id_tag = "merchantdesk"; name = "Merchant Desk Shutters"; - + }, /obj/structure/cable/blue{ icon_state = "4-8" @@ -3827,8 +3828,8 @@ "gM" = ( /obj/structure/closet/cabinet, /obj/item/clothing/shoes/craftable, -/obj/item/clothing/under/blazer, -/obj/item/clothing/under/lawyer, +/obj/item/clothing/pants/slacks/red, +/obj/item/clothing/costume/lawyer, /obj/item/clothing/pants/slacks/black/outfit/navy, /obj/random/handgun, /obj/item/chems/drinks/bottle/premiumwine, @@ -4244,7 +4245,7 @@ "hG" = ( /obj/structure/closet/cabinet, /obj/item/clothing/shoes/color/black, -/obj/item/clothing/under/overalls, +/obj/item/clothing/suit/apron/overalls/laborer, /obj/item/clothing/skirt, /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 @@ -5014,7 +5015,7 @@ /obj/structure/table/glass, /obj/machinery/faxmachine/mapped{ req_access = list("ACCESS_MERCHANT"); - + }, /obj/effect/floor_decal/corner/blue/mono, /turf/floor/tiled/dark/monotile, @@ -6276,7 +6277,7 @@ "oJ" = ( /obj/abstract/level_data_spawner/player{ name = "Liberia"; - + }, /turf/space, /area/space) @@ -8095,7 +8096,7 @@ dir = 2; id_tag = "merchantshuttle"; name = "Merchant Window Shutters"; - + }, /obj/effect/paint/silver, /obj/effect/paint_stripe/yellow, diff --git a/maps/away/liberia/liberia_jobs.dm b/maps/away/liberia/liberia_jobs.dm index 9ff0c71d9f7..8bc4034c702 100644 --- a/maps/away/liberia/liberia_jobs.dm +++ b/maps/away/liberia/liberia_jobs.dm @@ -24,7 +24,7 @@ SKILL_PILOT = SKILL_BASIC ) -/datum/job/submap/merchant/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/submap/merchant/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) to_chat(H, "Your connections helped you learn about the words that will help you identify a locals... Particularly interested buyers:") to_chat(H, "Code phases: [syndicate_code_phrase]") to_chat(H, "Responses to phrases: [syndicate_code_response]") @@ -40,7 +40,7 @@ name = "Job - Merchant - Liberia" shoes = /obj/item/clothing/shoes/color/black l_ear = /obj/item/radio/headset - uniform = /obj/item/clothing/under/syndicate/tacticool + uniform = /obj/item/clothing/pants/casual/camo/outfit_tacticool id_slot = slot_wear_id_str id_type = /obj/item/card/id/merchant pda_slot = slot_r_store_str diff --git a/maps/away/magshield/magshield.dm b/maps/away/magshield/magshield.dm index a84677f711f..a6eb9bcec2e 100644 --- a/maps/away/magshield/magshield.dm +++ b/maps/away/magshield/magshield.dm @@ -74,7 +74,7 @@ SPAN_DANGER("\The [src] suddenly activates!"), SPAN_DANGER("Electricity arcs between \the [src]'s rotating spokes as a powerful magnetic field tugs on every metallic object nearby.") ) - for(var/mob/living/carbon/M in hear(10, T)) + for(var/mob/living/M in hear(10, T)) eye_safety = M.eyecheck() if(eye_safety < FLASH_PROTECTION_MODERATE) M.flash_eyes() diff --git a/maps/away/slavers/icons/uniform.dmi b/maps/away/slavers/icons/uniform.dmi index 6613e58b00a..841007db55f 100644 Binary files a/maps/away/slavers/icons/uniform.dmi and b/maps/away/slavers/icons/uniform.dmi differ diff --git a/maps/away/slavers/slavers_base.dm b/maps/away/slavers/slavers_base.dm index 2539f6edac0..394e86a002d 100644 --- a/maps/away/slavers/slavers_base.dm +++ b/maps/away/slavers/slavers_base.dm @@ -117,7 +117,7 @@ /decl/hierarchy/outfit/corpse/slavers_base/slaver6 name = "Dead Slaver 6" - uniform = /obj/item/clothing/under/frontier + uniform = /obj/item/clothing/shirt/flannel/red/outfit shoes = /obj/item/clothing/shoes/color/orange /obj/abstract/landmark/corpse/slavers_base/slave @@ -163,11 +163,11 @@ /decl/hierarchy/outfit/corpse/abolitionist name = "Dead abolitionist" - uniform = /obj/item/clothing/under/abol_uniform + uniform = /obj/item/clothing/jumpsuit/abolitionist shoes = /obj/item/clothing/shoes/jackboots head = /obj/item/clothing/head/helmet/merc -/obj/item/clothing/under/abol_uniform +/obj/item/clothing/jumpsuit/abolitionist name = "abolitionist combat suit" desc = "Lightly armored suit worn by abolition extremists during raids. It has green patches on the right sleeve and the chest. There is big green \"A\" on the back." icon = 'maps/away/slavers/icons/uniform.dmi' diff --git a/maps/away/unishi/unishi-2.dmm b/maps/away/unishi/unishi-2.dmm index 683b1d36f88..1860db0f1e4 100644 --- a/maps/away/unishi/unishi-2.dmm +++ b/maps/away/unishi/unishi-2.dmm @@ -1537,9 +1537,9 @@ "es" = ( /mob/living/slime, /mob/living/slime, -/mob/living/carbon/human/monkey, -/mob/living/carbon/human/monkey, -/mob/living/carbon/human/monkey, +/mob/living/human/monkey, +/mob/living/human/monkey, +/mob/living/human/monkey, /turf/floor/reinforced, /area/unishi/xenobio) "et" = ( @@ -1547,8 +1547,8 @@ dir = 4 }, /mob/living/slime, -/mob/living/carbon/human/monkey, -/mob/living/carbon/human/monkey, +/mob/living/human/monkey, +/mob/living/human/monkey, /turf/floor/reinforced, /area/unishi/xenobio) "eu" = ( @@ -1608,16 +1608,16 @@ /area/unishi/hydro) "eB" = ( /mob/living/slime, -/mob/living/carbon/human/monkey, -/mob/living/carbon/human/monkey, +/mob/living/human/monkey, +/mob/living/human/monkey, /turf/floor/reinforced, /area/unishi/xenobio) "eC" = ( /obj/structure/window/borosilicate_reinforced{ dir = 4 }, -/mob/living/carbon/human/monkey, -/mob/living/carbon/human/monkey, +/mob/living/human/monkey, +/mob/living/human/monkey, /turf/floor/reinforced, /area/unishi/xenobio) "eD" = ( @@ -2069,7 +2069,7 @@ /obj/machinery/door/blast/regular/open{ id_tag = "Biohazard"; name = "Biohazard Shutter"; - + }, /obj/machinery/door/airlock/hatch, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -2216,7 +2216,7 @@ dir = 4; id_tag = "Biohazard"; name = "Biohazard Shutter"; - + }, /turf/floor, /area/unishi/smresearch) @@ -2346,7 +2346,7 @@ dir = 4; id_tag = "Biohazard"; name = "Biohazard Shutter"; - + }, /obj/item/remains, /turf/floor, @@ -2492,7 +2492,9 @@ "gL" = ( /obj/effect/decal/cleanable/ash, /obj/effect/decal/cleanable/blood, -/obj/item/clothing/under/blazer, +/obj/item/clothing/shirt/button, +/obj/item/clothing/neck/tie/navy, +/obj/item/clothing/suit/jacket/blazer, /obj/machinery/computer/modular/preset/engineering{ dir = 4; icon_state = "console" @@ -2740,7 +2742,7 @@ dir = 4; id_tag = "Biohazard"; name = "Biohazard Shutter"; - + }, /obj/item/remains, /obj/random/shoes, diff --git a/maps/away/yacht/yacht.dmm b/maps/away/yacht/yacht.dmm index 9541da70238..3acb3cd9c30 100644 --- a/maps/away/yacht/yacht.dmm +++ b/maps/away/yacht/yacht.dmm @@ -1176,7 +1176,7 @@ /obj/item/cane, /obj/item/clothing/suit/det_trench/grey, /obj/item/clothing/gloves/ring/cti, -/obj/item/clothing/under/lawyer/oldman, +/obj/item/clothing/costume/oldman, /obj/structure/table/woodentable, /obj/effect/spider/stickyweb, /obj/random/cash, diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 11d6d1d0973..6e156d985a6 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -19891,7 +19891,7 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/mob/living/carbon/human/monkey/punpun, +/mob/living/human/monkey/punpun, /turf/floor/lino, /area/exodus/crew_quarters/bar) "aPK" = ( diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index 2059e3b5ec1..6c13c0ddb9c 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -1,5 +1,15 @@ #if !defined(USING_MAP_DATUM) + #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/deity/_deity.dme" + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" + #include "../../mods/gamemodes/mixed/_mixed.dme" + #include "../../mods/content/mundane.dm" #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/corporate/_corporate.dme" @@ -7,13 +17,15 @@ #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/scaling_descriptors.dm" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" + // Must come after borers for compatibility. + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/species/ascent/_ascent.dme" #include "../../mods/content/pheromones/_pheromones.dme" #include "../../mods/species/serpentid/_serpentid.dme" diff --git a/maps/exodus/jobs/captain.dm b/maps/exodus/jobs/captain.dm index fd73838809b..17f8c7e58bc 100644 --- a/maps/exodus/jobs/captain.dm +++ b/maps/exodus/jobs/captain.dm @@ -33,7 +33,7 @@ /datum/computer_file/program/reports ) -/datum/job/captain/equip_job(var/mob/living/carbon/human/H) +/datum/job/captain/equip_job(var/mob/living/human/H) . = ..() if(.) H.implant_loyalty(src) diff --git a/maps/exodus/jobs/civilian.dm b/maps/exodus/jobs/civilian.dm index 6919061c901..803a281a7d9 100644 --- a/maps/exodus/jobs/civilian.dm +++ b/maps/exodus/jobs/civilian.dm @@ -303,7 +303,7 @@ skill_points = 20 software_on_spawn = list(/datum/computer_file/program/reports) -/datum/job/lawyer/equip_job(var/mob/living/carbon/human/H) +/datum/job/lawyer/equip_job(var/mob/living/human/H) . = ..() if(.) H.implant_loyalty(H) diff --git a/maps/exodus/jobs/medical.dm b/maps/exodus/jobs/medical.dm index fac05edfb07..b5b1853523f 100644 --- a/maps/exodus/jobs/medical.dm +++ b/maps/exodus/jobs/medical.dm @@ -200,7 +200,7 @@ ) give_psionic_implant_on_join = FALSE -/datum/job/counselor/equip_job(var/mob/living/carbon/human/H) +/datum/job/counselor/equip_job(var/mob/living/human/H) if(H.mind.role_alt_title == "Counselor") psi_faculties = list("[PSI_REDACTION]" = PSI_RANK_OPERANT) if(H.mind.role_alt_title == "Mentalist") diff --git a/maps/exodus/jobs/security.dm b/maps/exodus/jobs/security.dm index b021a08e601..19bd3667d83 100644 --- a/maps/exodus/jobs/security.dm +++ b/maps/exodus/jobs/security.dm @@ -85,7 +85,7 @@ ) event_categories = list(ASSIGNMENT_SECURITY) -/datum/job/hos/equip_job(var/mob/living/carbon/human/H) +/datum/job/hos/equip_job(var/mob/living/human/H) . = ..() if(.) H.implant_loyalty(H) diff --git a/maps/exodus/jobs/synthetics.dm b/maps/exodus/jobs/synthetics.dm index 1cac23c65ae..10537a76afc 100644 --- a/maps/exodus/jobs/synthetics.dm +++ b/maps/exodus/jobs/synthetics.dm @@ -19,13 +19,13 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/computer/equip_job(var/mob/living/carbon/human/H) +/datum/job/computer/equip_job(var/mob/living/human/H) return !!H /datum/job/computer/is_position_available() return (empty_playable_ai_cores.len != 0) -/datum/job/computer/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) +/datum/job/computer/handle_variant_join(var/mob/living/human/H, var/alt_title) return H /datum/job/computer/do_spawn_special(var/mob/living/character, var/mob/new_player/new_player_mob, var/latejoin) @@ -66,11 +66,11 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/robot/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) +/datum/job/robot/handle_variant_join(var/mob/living/human/H, var/alt_title) if(H) return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) -/datum/job/robot/equip_job(var/mob/living/carbon/human/H) +/datum/job/robot/equip_job(var/mob/living/human/H) return !!H /datum/job/robot/New() diff --git a/maps/exodus/outfits/civilian.dm b/maps/exodus/outfits/civilian.dm index c5525340e38..2d96b4a5e99 100644 --- a/maps/exodus/outfits/civilian.dm +++ b/maps/exodus/outfits/civilian.dm @@ -4,13 +4,13 @@ /decl/hierarchy/outfit/job/service/bartender name = "Job - Bartender" - uniform = /obj/item/clothing/under/bartender + uniform = /obj/item/clothing/pants/formal/black/outfit id_type = /obj/item/card/id/civilian pda_type = /obj/item/modular_computer/pda /decl/hierarchy/outfit/job/service/chef name = "Job - Chef" - uniform = /obj/item/clothing/under/chef + uniform = /obj/item/clothing/pants/slacks/outfit_chef suit = /obj/item/clothing/suit/chef head = /obj/item/clothing/head/chefhat id_type = /obj/item/card/id/civilian diff --git a/maps/exodus/outfits/command.dm b/maps/exodus/outfits/command.dm index 20bf97a5172..9ef27067bc2 100644 --- a/maps/exodus/outfits/command.dm +++ b/maps/exodus/outfits/command.dm @@ -15,7 +15,7 @@ backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/backpack/satchel/cap backpack_overrides[/decl/backpack_outfit/messenger_bag] = /obj/item/backpack/messenger/com -/decl/hierarchy/outfit/job/captain/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/job/captain/post_equip(var/mob/living/human/H) ..() if(H.get_age() > 49) // Since we can have something other than the default uniform at this diff --git a/maps/ministation/jobs/command.dm b/maps/ministation/jobs/command.dm index 9f2ceeaddc6..11cfa3723db 100644 --- a/maps/ministation/jobs/command.dm +++ b/maps/ministation/jobs/command.dm @@ -29,7 +29,7 @@ must_fill = 1 not_random_selectable = 1 -/datum/job/ministation/captain/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/ministation/captain/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(H) H.verbs |= /mob/proc/freetradeunion_rename_company diff --git a/maps/ministation/jobs/synthetics.dm b/maps/ministation/jobs/synthetics.dm index 2fd718dc15e..3d3939cbcb6 100644 --- a/maps/ministation/jobs/synthetics.dm +++ b/maps/ministation/jobs/synthetics.dm @@ -18,11 +18,11 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/ministation/robot/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) +/datum/job/ministation/robot/handle_variant_join(var/mob/living/human/H, var/alt_title) if(H) return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) -/datum/job/ministation/robot/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/ministation/robot/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) return !!H /datum/job/ministation/robot/New() @@ -51,13 +51,13 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/computer/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/computer/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) return !!H /datum/job/computer/is_position_available() return (empty_playable_ai_cores.len != 0) -/datum/job/computer/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) +/datum/job/computer/handle_variant_join(var/mob/living/human/H, var/alt_title) return H /datum/job/computer/do_spawn_special(var/mob/living/character, var/mob/new_player/new_player_mob, var/latejoin) diff --git a/maps/ministation/ministation-2.dmm b/maps/ministation/ministation-2.dmm index 1e38429239c..f934e96902b 100644 --- a/maps/ministation/ministation-2.dmm +++ b/maps/ministation/ministation-2.dmm @@ -2600,7 +2600,10 @@ /area/ministation/hall/n3) "lh" = ( /obj/structure/closet, -/obj/item/clothing/under/librarian, +/obj/item/clothing/pants/slacks/red, +/obj/item/clothing/shirt/button, +/obj/item/clothing/neck/tie/navy, +/obj/item/clothing/suit/jacket/charcoal, /obj/item/clothing/shoes/sandal, /obj/item/multitool, /turf/floor/wood/mahogany, diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index a1691382b9a..cd027156fa9 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -15,6 +15,14 @@ Twice... #include "../../code/unit_tests/offset_tests.dm" #endif + #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" + #include "../../mods/gamemodes/mixed/_mixed.dme" + #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" #include "../../mods/content/xenobiology/_xenobiology.dme" @@ -30,7 +38,6 @@ Twice... #include "../../mods/content/government/_government.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/scaling_descriptors.dm" #include "ministation_antagonists.dm" @@ -66,6 +73,9 @@ Twice... #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" + // Must come after borers for compatibility. + #include "../../mods/content/psionics/_psionics.dme" + #include "ministation_overmap.dm" #include "jobs/command.dm" diff --git a/maps/ministation/ministation_areas.dm b/maps/ministation/ministation_areas.dm index 59b9cc53c6c..5046e0c921c 100644 --- a/maps/ministation/ministation_areas.dm +++ b/maps/ministation/ministation_areas.dm @@ -328,7 +328,7 @@ arrival_sound = null lift_announce_str = null -/area/turbolift/alert_on_fall(var/mob/living/carbon/human/H) +/area/turbolift/alert_on_fall(var/mob/living/human/H) if(H.client && SSpersistence.elevator_fall_shifts > 0) SSwebhooks.send(WEBHOOK_ELEVATOR_FALL, list("text" = "We managed to make it [SSpersistence.elevator_fall_shifts] shift\s without someone falling down an elevator shaft.")) SSpersistence.elevator_fall_shifts = -1 diff --git a/maps/ministation/ministation_objects.dm b/maps/ministation/ministation_objects.dm index 69309f0d863..1ff4956772d 100644 --- a/maps/ministation/ministation_objects.dm +++ b/maps/ministation/ministation_objects.dm @@ -1,5 +1,6 @@ /turf/wall/natural/random/ministation initial_gas = null + floor_type = /turf/floor/natural/barren/airless /turf/wall/natural/random/ministation/get_weighted_mineral_list() if(prob(80)) diff --git a/maps/ministation/outfits/civilian.dm b/maps/ministation/outfits/civilian.dm index ba37c9b5ff3..eb5b062487b 100644 --- a/maps/ministation/outfits/civilian.dm +++ b/maps/ministation/outfits/civilian.dm @@ -14,7 +14,7 @@ /decl/hierarchy/outfit/job/ministation/bartender l_ear = /obj/item/radio/headset/headset_service name = "Ministation - Job - Bartender" - uniform = /obj/item/clothing/under/bartender + uniform = /obj/item/clothing/pants/formal/black/outfit id_type = /obj/item/card/id/ministation/bartender pda_type = /obj/item/modular_computer/pda head = /obj/item/clothing/head/chefhat @@ -29,7 +29,7 @@ /decl/hierarchy/outfit/job/ministation/librarian l_ear = /obj/item/radio/headset/headset_service name = "Ministation - Job - Librarian" - uniform = /obj/item/clothing/under/librarian + uniform = /obj/item/clothing/pants/slacks/red/outfit id_type = /obj/item/card/id/ministation/librarian pda_type = /obj/item/modular_computer/pda diff --git a/maps/ministation/outfits/command.dm b/maps/ministation/outfits/command.dm index 9b6772b08e9..f118e3774ab 100644 --- a/maps/ministation/outfits/command.dm +++ b/maps/ministation/outfits/command.dm @@ -14,7 +14,7 @@ backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/backpack/satchel/cap backpack_overrides[/decl/backpack_outfit/messenger_bag] = /obj/item/backpack/messenger/com -/decl/hierarchy/outfit/job/ministation/captain/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/job/ministation/captain/post_equip(var/mob/living/human/H) ..() if(H.get_age() > 20) // Since we can have something other than the default uniform at this diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 96bdf94f9e4..0e75223cde4 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -3,6 +3,16 @@ #include "modpack_testing_lobby.dm" #include "blank.dmm" + #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/deity/_deity.dme" + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" + #include "../../mods/gamemodes/mixed/_mixed.dme" + #include "../../mods/content/mundane.dm" #include "../../mods/content/scaling_descriptors.dm" @@ -15,7 +25,6 @@ #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/shackles/_shackles.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/content/pheromones/_pheromones.dme" @@ -25,6 +34,9 @@ #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" + // Must come after borers for compatibility. + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/ascent/_ascent.dme" #include "../../mods/species/neoavians/_neoavians.dme" diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm index 5216bfdeef6..52104140d5d 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm @@ -284,7 +284,7 @@ /obj/item/stack/material/puck/mapped/uranium/ten, /obj/item/clothing/costume/savage_hunter, /obj/item/clothing/costume/savage_hunter/female, -/obj/item/clothing/under/wetsuit, +/obj/item/clothing/jumpsuit/wetsuit, /obj/effect/decal/cleanable/dirt, /obj/item/trash/candy/proteinbar, /obj/item/trash/liquidfood, diff --git a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm index 12220e523ba..5fbdbd3fbef 100644 --- a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm +++ b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm @@ -2567,7 +2567,7 @@ /turf/floor/fixed/alium, /area/map_template/hydrobase/station/dockport) "gx" = ( -/obj/item/clothing/under/overalls, +/obj/item/clothing/suit/apron/overalls/laborer, /obj/item/clothing/shoes/jackboots/desertboots, /obj/structure/closet, /turf/floor/tiled/freezer, diff --git a/maps/random_ruins/exoplanet_ruins/marooned/marooned.dm b/maps/random_ruins/exoplanet_ruins/marooned/marooned.dm index 4e11c1b0e20..3f04d093aa4 100644 --- a/maps/random_ruins/exoplanet_ruins/marooned/marooned.dm +++ b/maps/random_ruins/exoplanet_ruins/marooned/marooned.dm @@ -9,7 +9,7 @@ /area/map_template/marooned = NO_SCRUBBER|NO_VENT|NO_APC ) -/obj/item/clothing/under/magintka_uniform +/obj/item/clothing/costume/magintka_uniform name = "officer uniform" desc = "A dark uniform coat worn by Magnitka fleet officers." icon = 'maps/random_ruins/exoplanet_ruins/marooned/icons/uniform_magnitka.dmi' @@ -26,7 +26,7 @@ /decl/hierarchy/outfit/marooned_officer name = "Dead Magnitka's fleet officer" - uniform = /obj/item/clothing/under/magintka_uniform + uniform = /obj/item/clothing/costume/magintka_uniform suit = /obj/item/clothing/suit/jacket/winter shoes = /obj/item/clothing/shoes/jackboots/jungleboots gloves = /obj/item/clothing/gloves/thick diff --git a/maps/random_ruins/exoplanet_ruins/monoliths/monoliths.dm b/maps/random_ruins/exoplanet_ruins/monoliths/monoliths.dm index c6a632cd279..77f027c0bab 100644 --- a/maps/random_ruins/exoplanet_ruins/monoliths/monoliths.dm +++ b/maps/random_ruins/exoplanet_ruins/monoliths/monoliths.dm @@ -58,7 +58,7 @@ to_chat(user, SPAN_NOTICE("\The [src] is still.")) return TRUE - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.isSynthetic()) to_chat(user, SPAN_NOTICE("\The [src] is still.")) return TRUE diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index 2b7e508c2be..7ab290325a1 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -153,13 +153,15 @@ /obj/item/gun/energy/gun/small, /obj/item/flashlight/upgraded, /obj/item/crowbar, -/obj/item/clothing/jumpsuit/captain_fly, +/obj/item/clothing/costume/captain_fly, /obj/item/clothing/jumpsuit/blackjumpshorts, -/obj/item/clothing/under/frontier, +/obj/item/clothing/shirt/flannel/red, +/obj/item/clothing/suit/apron/overalls/denim, /obj/item/clothing/jumpsuit/hazard, /obj/item/clothing/pants/slacks/outfit, /obj/item/clothing/pants/slacks/black/outfit, -/obj/item/clothing/under/syndicate, +/obj/item/clothing/pants/casual/camo, +/obj/item/clothing/shirt/syndicate, /obj/item/clothing/pants/slacks/outfit/detective, /obj/item/clothing/pants/baggy, /obj/item/clothing/pants/casual/youngfolksjeans, @@ -1361,15 +1363,17 @@ /obj/item/gun/energy/gun/small, /obj/item/flashlight/upgraded, /obj/item/crowbar, -/obj/item/clothing/jumpsuit/captain_fly, +/obj/item/clothing/costume/captain_fly, /obj/item/clothing/jumpsuit/blackjumpshorts, -/obj/item/clothing/under/frontier, +/obj/item/clothing/shirt/flannel/red, +/obj/item/clothing/suit/apron/overalls/denim, /obj/item/clothing/jumpsuit/hazard, /obj/item/clothing/skirt, /obj/item/clothing/pants/slacks/outfit, /obj/item/clothing/pants/slacks/black/outfit/navy, /obj/item/clothing/pants/slacks/black/outfit, -/obj/item/clothing/under/syndicate, +/obj/item/clothing/pants/casual/camo, +/obj/item/clothing/shirt/syndicate, /obj/item/clothing/jumpsuit/sterile, /obj/item/clothing/pants/slacks/outfit/detective, /obj/item/clothing/pants/baggy, @@ -1546,12 +1550,12 @@ pixel_y = 20 }, /obj/structure/closet, -/obj/item/clothing/under/wetsuit, -/obj/item/clothing/under/wetsuit, +/obj/item/clothing/jumpsuit/wetsuit, +/obj/item/clothing/jumpsuit/wetsuit, /obj/item/clothing/costume/savage_hunter, /obj/item/clothing/costume/savage_hunter/female, -/obj/item/clothing/under/harness, -/obj/item/clothing/under/harness, +/obj/item/clothing/shirt/harness, +/obj/item/clothing/shirt/harness, /obj/item/clothing/head/cowboy_hat, /obj/item/clothing/head/cowboy_hat, /obj/item/clothing/suit/det_trench, @@ -2297,13 +2301,15 @@ /obj/item/flashlight/upgraded, /obj/item/crowbar, /obj/item/clothing/jumpsuit/blackjumpshorts, -/obj/item/clothing/jumpsuit/captain_fly, -/obj/item/clothing/under/frontier, +/obj/item/clothing/costume/captain_fly, +/obj/item/clothing/shirt/flannel/red, +/obj/item/clothing/suit/apron/overalls/denim, /obj/item/clothing/jumpsuit/hazard, /obj/item/clothing/skirt, /obj/item/clothing/pants/slacks/black/outfit/navy, /obj/item/clothing/pants/slacks/black/outfit, -/obj/item/clothing/under/syndicate, +/obj/item/clothing/pants/casual/camo, +/obj/item/clothing/shirt/syndicate, /obj/item/clothing/jumpsuit/sterile, /obj/item/clothing/pants/slacks/outfit/detective, /obj/item/clothing/pants/baggy, @@ -2744,14 +2750,16 @@ /obj/item/gun/energy/gun/small, /obj/item/flashlight/upgraded, /obj/item/crowbar, -/obj/item/clothing/jumpsuit/captain_fly, +/obj/item/clothing/costume/captain_fly, /obj/item/clothing/jumpsuit/blackjumpshorts, -/obj/item/clothing/under/frontier, +/obj/item/clothing/shirt/flannel/red, +/obj/item/clothing/suit/apron/overalls/denim, /obj/item/clothing/jumpsuit/hazard, /obj/item/clothing/skirt, /obj/item/clothing/pants/slacks/outfit, /obj/item/clothing/pants/slacks/black/outfit/navy, -/obj/item/clothing/under/syndicate, +/obj/item/clothing/pants/casual/camo, +/obj/item/clothing/shirt/syndicate, /obj/item/clothing/jumpsuit/sterile, /obj/item/clothing/pants/slacks/outfit/detective, /obj/item/clothing/pants/baggy, diff --git a/maps/shaded_hills/_shaded_hills_defines.dm b/maps/shaded_hills/_shaded_hills_defines.dm index b4f77d76dc4..e79bda4f54c 100644 --- a/maps/shaded_hills/_shaded_hills_defines.dm +++ b/maps/shaded_hills/_shaded_hills_defines.dm @@ -3,4 +3,4 @@ #define SKILL_TEXTILES /decl/hierarchy/skill/crafting/textiles #define SKILL_STONEMASONRY /decl/hierarchy/skill/crafting/stonemasonry #define SKILL_SCULPTING /decl/hierarchy/skill/crafting/sculpting -#define SKILL_ARTIFICE /decl/hierarchy/skill/crafting/artifice \ No newline at end of file +#define SKILL_ARTIFICE /decl/hierarchy/skill/crafting/artifice diff --git a/maps/shaded_hills/areas/downlands.dm b/maps/shaded_hills/areas/downlands.dm index 8fa019ee5d9..dc9cdd4177c 100644 --- a/maps/shaded_hills/areas/downlands.dm +++ b/maps/shaded_hills/areas/downlands.dm @@ -6,25 +6,45 @@ /area/shaded_hills/inn name = "\improper Inn" + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/inn/porch name = "\improper Inn Porch" interior_ambient_light_modifier = -0.3 // night is pitch-black on the porch + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/stable name = "\improper Stable" + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/farmhouse name = "\improper Farmhouse" + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/slaughterhouse name = "\improper Slaughterhouse" + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/tannery name = "\improper Tannery" + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/general_store name = "\improper General Store" + fishing_failure_prob = "100" + fishing_results = list() -/area/shaded_hills/forester_hut - name = "\improper Foresters' Hut" + +/area/shaded_hills/shrine + name = "\improper Shrine" + fishing_failure_prob = "100" + fishing_results = list() + +/area/shaded_hills/outside/shrine + name = "\improper Shrine Grounds" diff --git a/maps/shaded_hills/areas/swamp.dm b/maps/shaded_hills/areas/swamp.dm index f26e7893ea8..a8b0e19ca1f 100644 --- a/maps/shaded_hills/areas/swamp.dm +++ b/maps/shaded_hills/areas/swamp.dm @@ -1,6 +1,8 @@ // Swamp areas. /area/shaded_hills/witch_hut name = "Witches' Hut" + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/caves/river/swamp name = "Southern Silent River" diff --git a/maps/shaded_hills/areas/woods.dm b/maps/shaded_hills/areas/woods.dm index e1dee0bed35..fdaec01adc1 100644 --- a/maps/shaded_hills/areas/woods.dm +++ b/maps/shaded_hills/areas/woods.dm @@ -26,3 +26,8 @@ /area/shaded_hills/caves/unexplored/woods name = "Trackless Deeps - Far North" + +/area/shaded_hills/forester_hut + name = "\improper Foresters' Hut" + fishing_failure_prob = "100" + fishing_results = list() diff --git a/maps/shaded_hills/icons/hud.dmi b/maps/shaded_hills/icons/hud.dmi index 6209cd86d0b..3402f33c1b3 100644 Binary files a/maps/shaded_hills/icons/hud.dmi and b/maps/shaded_hills/icons/hud.dmi differ diff --git a/maps/shaded_hills/jobs/_jobs.dm b/maps/shaded_hills/jobs/_jobs.dm index a9ef3ea5cc8..0f83c06a161 100644 --- a/maps/shaded_hills/jobs/_jobs.dm +++ b/maps/shaded_hills/jobs/_jobs.dm @@ -3,6 +3,7 @@ allowed_jobs = list( /datum/job/shaded_hills/visitor/traveller, /datum/job/shaded_hills/visitor/traveller/learned, + /datum/job/shaded_hills/visitor/beggar_knight, /datum/job/shaded_hills/local/miner, /datum/job/shaded_hills/local/herbalist, /datum/job/shaded_hills/local/forester, @@ -10,9 +11,12 @@ /datum/job/shaded_hills/inn/inn_worker, /datum/job/shaded_hills/inn/bartender, /datum/job/shaded_hills/inn/farmer, - /datum/job/shaded_hills/caves/dweller + /datum/job/shaded_hills/caves/dweller, + /datum/job/shaded_hills/shrine/keeper, + /datum/job/shaded_hills/shrine/attendant, + /datum/job/shaded_hills/visitor/traveller/cleric ) - default_job_type = /datum/job/shaded_hills/visitor/traveller + default_job_type = /datum/job/shaded_hills/visitor/traveller default_department_type = /decl/department/shaded_hills/visitors species_to_job_whitelist = list( /decl/species/grafadreka = list( @@ -25,8 +29,13 @@ /decl/species/human, /decl/species/hnoll ), + ) + species_to_job_blacklist = list( /decl/species/kobaloi = list( - /datum/job/shaded_hills/inn/innkeeper + /datum/job/shaded_hills/visitor/beggar_knight, + /datum/job/shaded_hills/inn/innkeeper, + /datum/job/shaded_hills/shrine/keeper, + /datum/job/shaded_hills/visitor/traveller/cleric ) ) diff --git a/maps/shaded_hills/jobs/shrine.dm b/maps/shaded_hills/jobs/shrine.dm new file mode 100644 index 00000000000..d68077a7d9a --- /dev/null +++ b/maps/shaded_hills/jobs/shrine.dm @@ -0,0 +1,57 @@ +/decl/department/shaded_hills/shrine + name = "Shrine Attendants" + colour = "#404e68" + display_color = "#8c96c4" + +/datum/job/shaded_hills/shrine + abstract_type = /datum/job/shaded_hills/shrine + department_types = list(/decl/department/shaded_hills/shrine) + skill_points = 20 + +/datum/job/shaded_hills/shrine/keeper + title = "Shrine Keeper" + supervisors = "your vows, and your faith" + description = "You are the leader of the local religious order, living and working within the shrine. You are expected to see to both the spiritual and physical health of the populace, as well as travellers, if they can offer appropriate tithe." + spawn_positions = 1 + total_positions = 1 + outfit_type = /decl/hierarchy/outfit/job/shaded_hills/shrine/keeper + min_skill = list( + SKILL_LITERACY = SKILL_ADEPT, + SKILL_MEDICAL = SKILL_ADEPT, + SKILL_ANATOMY = SKILL_ADEPT, + ) + max_skill = list( + SKILL_MEDICAL = SKILL_MAX, + SKILL_ANATOMY = SKILL_MAX, + ) + skill_points = 24 + +/obj/abstract/landmark/start/shaded_hills/shrine_keeper + name = "Shrine Keeper" + +/datum/job/shaded_hills/shrine/attendant + title = "Shrine Attendant" + supervisors = "the Shrine Keeper, your vows, and your faith" + description = "You are an acolyte of the local religious order, living and working within the shrine. Under the direction of the shrine keeper, you are expected to tend to the shrine and the grounds, and to produce food or other goods for use or trade to support the clergy." + spawn_positions = 2 + total_positions = 2 + outfit_type = /decl/hierarchy/outfit/job/shaded_hills/shrine + min_skill = list( + SKILL_STONEMASONRY = SKILL_BASIC, + SKILL_CARPENTRY = SKILL_BASIC, + SKILL_TEXTILES = SKILL_BASIC, + SKILL_COOKING = SKILL_BASIC, + SKILL_BOTANY = SKILL_BASIC, + SKILL_ATHLETICS = SKILL_ADEPT, + SKILL_MEDICAL = SKILL_ADEPT, + SKILL_ANATOMY = SKILL_ADEPT, + ) + max_skill = list( + SKILL_COOKING = SKILL_EXPERT, + SKILL_BOTANY = SKILL_EXPERT, + SKILL_MEDICAL = SKILL_EXPERT, + SKILL_ANATOMY = SKILL_EXPERT, + ) + +/obj/abstract/landmark/start/shaded_hills/shrine_attendant + name = "Shrine Attendant" diff --git a/maps/shaded_hills/jobs/visitors.dm b/maps/shaded_hills/jobs/visitors.dm index 9165ac9a758..26c29e7f390 100644 --- a/maps/shaded_hills/jobs/visitors.dm +++ b/maps/shaded_hills/jobs/visitors.dm @@ -22,12 +22,12 @@ /datum/job/shaded_hills/visitor/traveller/learned title = "Itinerant Scholar" // todo: outfits for alt-titles? - alt_titles = list("Itinerant Monk", "Traveling Doctor", "Dilettante") + alt_titles = list("Itinerant Monk", "Travelling Doctor", "Dilettante") supervisors = "your conscience" - description = "You are a skilled professional who has traveled to this area from elsewhere. You may be a doctor, a scholar, a monk, or some other highly-educated individual with rare skills. Whatever your reason for coming here, you are likely one of the only individuals in the area to possess your unique skillset." + description = "You are a skilled professional who has travelled to this area from elsewhere. You may be a doctor, a scholar, a monk, or some other highly-educated individual with rare skills. Whatever your reason for coming here, you are likely one of the only individuals in the area to possess your unique skillset." spawn_positions = 2 total_positions = 2 - outfit_type = /decl/hierarchy/outfit/job/shaded_hills/traveller + outfit_type = /decl/hierarchy/outfit/job/shaded_hills/traveller/scholar skill_points = 24 min_skill = list( SKILL_LITERACY = SKILL_ADEPT @@ -40,3 +40,52 @@ /obj/abstract/landmark/start/shaded_hills/traveller/learned name = "Itinerant Scholar" + +/datum/job/shaded_hills/visitor/beggar_knight + title = "Beggar Knight" + supervisors = "your vows" + description = "You are a wandering swordmaster sworn to a vow of poverty, with nothing to your name but the armour on your back and the blade at your hip. Beggar knights are tolerated due to their martial prowess, and are usually paid with food or new equipment as they are avowed against carrying coin." + spawn_positions = 2 + total_positions = 2 + outfit_type = /decl/hierarchy/outfit/job/shaded_hills/beggar_knight + min_skill = list( + SKILL_WEAPONS = SKILL_ADEPT, + SKILL_ATHLETICS = SKILL_ADEPT, + ) + max_skill = list( + SKILL_FINANCE = SKILL_NONE, + SKILL_CARPENTRY = SKILL_BASIC, + SKILL_METALWORK = SKILL_BASIC, + SKILL_TEXTILES = SKILL_BASIC, + SKILL_STONEMASONRY = SKILL_BASIC, + SKILL_SCULPTING = SKILL_BASIC, + SKILL_ARTIFICE = SKILL_BASIC, + ) + +/obj/abstract/landmark/start/shaded_hills/beggar_knight + name = "Beggar Knight" + + +/datum/job/shaded_hills/visitor/traveller/cleric + title = "Travelling Cleric" + supervisors = "your vows, and your faith" + description = "You are an ordained person of faith, travelling the lands on the business of your order, to preach, or simply to experience new people and cultures. You are battle-trained, but are also a healer." + spawn_positions = 2 + total_positions = 2 + outfit_type = /decl/hierarchy/outfit/job/shaded_hills/traveller/cleric + min_skill = list( + SKILL_WEAPONS = SKILL_ADEPT, + SKILL_ATHLETICS = SKILL_ADEPT, + SKILL_MEDICAL = SKILL_ADEPT, + SKILL_ANATOMY = SKILL_ADEPT, + ) + max_skill = list( + SKILL_WEAPONS = SKILL_MAX, + SKILL_MEDICAL = SKILL_MAX, + SKILL_ANATOMY = SKILL_MAX, + ) + skill_points = 22 + +/obj/abstract/landmark/start/shaded_hills/cleric + name = "Travelling Cleric" + diff --git a/maps/shaded_hills/outfits/caves.dm b/maps/shaded_hills/outfits/caves.dm index 6e781f9841a..cbc634a3caf 100644 --- a/maps/shaded_hills/outfits/caves.dm +++ b/maps/shaded_hills/outfits/caves.dm @@ -1,4 +1,8 @@ /decl/hierarchy/outfit/job/shaded_hills/cave_dweller - name = "Shaded Hills - Cave Dweller" - uniform = /obj/item/clothing/pants/loincloth - shoes = /obj/item/clothing/shoes/sandal + name = "Shaded Hills - Cave Dweller" + uniform = /obj/item/clothing/pants/loincloth + shoes = /obj/item/clothing/shoes/sandal + hands = list( + /obj/item/gun/launcher/bow/sling, + /obj/item/stack/material/ore/basalt/ten, + ) diff --git a/maps/shaded_hills/outfits/shrine.dm b/maps/shaded_hills/outfits/shrine.dm new file mode 100644 index 00000000000..6f96a09d6bd --- /dev/null +++ b/maps/shaded_hills/outfits/shrine.dm @@ -0,0 +1,9 @@ +/decl/hierarchy/outfit/job/shaded_hills/shrine + name = "Shaded Hills - Shrine Attendant" + uniform = /obj/item/clothing/suit/robe + shoes = /obj/item/clothing/shoes/sandal + +/decl/hierarchy/outfit/job/shaded_hills/shrine/keeper + name = "Shaded Hills - Shrine Keeper" + suit = /obj/item/clothing/suit/mantle + mask = /obj/item/clothing/neck/necklace/prayer_beads/basalt diff --git a/maps/shaded_hills/outfits/visitors.dm b/maps/shaded_hills/outfits/visitors.dm index 5b21214a3e4..d9b927fc78b 100644 --- a/maps/shaded_hills/outfits/visitors.dm +++ b/maps/shaded_hills/outfits/visitors.dm @@ -1,2 +1,19 @@ /decl/hierarchy/outfit/job/shaded_hills/traveller name = "Shaded Hills - Traveller" + +/decl/hierarchy/outfit/job/shaded_hills/beggar_knight + name = "Shaded Hills - Beggar Knight" + suit = /obj/item/clothing/suit/armor/forged/banded + belt = /obj/item/bladed/shortsword + backpack_contents = list( + /obj/item/stack/medical/bruise_pack/bandage/five = 1, + /obj/item/stack/medical/ointment/poultice/five = 1, + /obj/item/chems/waterskin/crafted/wine = 1 + ) + +/decl/hierarchy/outfit/job/shaded_hills/traveller/scholar + name = "Shaded Hills - Itinerant Scholar" + +/decl/hierarchy/outfit/job/shaded_hills/traveller/cleric + name = "Shaded Hills - Travelling Cleric" + diff --git a/maps/shaded_hills/outfits/wilderness.dm b/maps/shaded_hills/outfits/wilderness.dm index ed3871a7bdd..883ad6deb5f 100644 --- a/maps/shaded_hills/outfits/wilderness.dm +++ b/maps/shaded_hills/outfits/wilderness.dm @@ -1,8 +1,12 @@ /decl/hierarchy/outfit/job/shaded_hills/forester - name = "Shaded Hills - Forester" + name = "Shaded Hills - Forester" + hands = list( + /obj/item/gun/launcher/bow, + /obj/item/stack/material/bow_ammo/arrow/fifteen + ) /decl/hierarchy/outfit/job/shaded_hills/miner - name = "Shaded Hills - Miner" + name = "Shaded Hills - Miner" /decl/hierarchy/outfit/job/shaded_hills/herbalist - name = "Shaded Hills - Herbalist" + name = "Shaded Hills - Herbalist" diff --git a/maps/shaded_hills/shaded_hills-grassland.dmm b/maps/shaded_hills/shaded_hills-grassland.dmm index 2d15d1952d7..db47baa5a25 100644 --- a/maps/shaded_hills/shaded_hills-grassland.dmm +++ b/maps/shaded_hills/shaded_hills-grassland.dmm @@ -71,7 +71,7 @@ "kr" = ( /obj/structure/closet/crate/chest, /obj/item/tool/pickaxe/iron, -/obj/item/tool/axe/hatchet, +/obj/item/tool/axe, /obj/abstract/exterior_marker/inside, /turf/floor/woven, /area/shaded_hills/outside) @@ -96,7 +96,7 @@ /area/shaded_hills/caves) "mG" = ( /obj/structure/bed/chair/bench/ebony, -/obj/item/knife/utility, +/obj/item/bladed/folding, /obj/abstract/landmark/start/shaded_hills/miner, /turf/floor/natural/barren, /area/shaded_hills/outside) diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 7e02733fa57..60e1bf32be4 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -16,6 +16,11 @@ /obj/structure/closet/crate/chest, /turf/floor/natural/path/basalt, /area/shaded_hills/general_store) +"bW" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/chems/cooking_vessel/skillet, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "cl" = ( /obj/structure/table/woodentable/ebony, /turf/floor/wood/ebony, @@ -28,12 +33,26 @@ "cx" = ( /turf/wall/brick/basalt, /area/shaded_hills/outside/downlands) +"cy" = ( +/obj/structure/reagent_dispensers/barrel/ebony/water, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) +"cT" = ( +/obj/structure/railing/mapped/ebony{ + dir = 1 + }, +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) "dC" = ( /obj/structure/door/wood/ebony, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) "dH" = ( /obj/structure/window/basic/full, +/obj/structure/wall_frame/log/ebony, /turf/wall/log/ebony, /area/shaded_hills/general_store) "dK" = ( @@ -46,6 +65,10 @@ }, /turf/floor/wood/ebony, /area/shaded_hills/inn) +"ev" = ( +/obj/structure/closet/crate/chest/ebony, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "eD" = ( /obj/structure/textiles/loom/ebony, /turf/floor/wood/ebony, @@ -54,6 +77,14 @@ /obj/structure/door/wood/ebony, /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"fg" = ( +/obj/structure/railing/mapped/ebony, +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/obj/structure/reagent_dispensers/compost_bin, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/shrine) "fh" = ( /obj/structure/table/marble, /obj/item/chems/glass/pottery/cup, @@ -67,6 +98,9 @@ /obj/item/chems/glass/pottery/mug, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) +"ft" = ( +/turf/floor/natural/mud, +/area/shaded_hills/outside/shrine) "fK" = ( /obj/structure/reagent_dispensers/barrel/ebony/water, /turf/floor/natural/path/herringbone/basalt, @@ -101,10 +135,26 @@ }, /turf/floor/natural/grass, /area/shaded_hills/outside/downlands) +"gt" = ( +/obj/structure/wall_sconce/lantern{ + dir = 8 + }, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) +"gA" = ( +/obj/structure/railing/mapped/ebony{ + dir = 8 + }, +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) "gB" = ( /obj/structure/wall_sconce/lantern, /turf/floor/wood/ebony, /area/shaded_hills/farmhouse) +"gL" = ( +/obj/structure/reagent_dispensers/barrel/ebony/oil, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "gR" = ( /obj/structure/table/marble, /obj/item/chems/condiment/flour, @@ -164,8 +214,12 @@ /obj/abstract/landmark/lock_preset/shaded_hills/inn_interior, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) +"iK" = ( +/turf/wall/brick/basalt, +/area/shaded_hills/outside/shrine) "iX" = ( /obj/structure/window/basic/full, +/obj/structure/wall_frame/log/ebony, /turf/floor/natural/path/basalt, /area/shaded_hills/inn) "iZ" = ( @@ -179,6 +233,13 @@ }, /turf/floor/wood/ebony, /area/shaded_hills/stable) +"jk" = ( +/obj/structure/bed/chair/bench/pew/mahogany{ + dir = 1 + }, +/obj/abstract/landmark/start/shaded_hills/cleric, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "js" = ( /turf/floor/wood/ebony, /area/shaded_hills/stable) @@ -200,6 +261,17 @@ /obj/item/bedsheet/furs, /turf/floor/wood/ebony, /area/shaded_hills/stable) +"ke" = ( +/obj/structure/wall_sconce/lantern{ + dir = 1; + pixel_y = 10 + }, +/obj/item/chems/glass/bucket/wood, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/downlands) +"kv" = ( +/turf/floor/natural/dirt, +/area/shaded_hills/outside/shrine) "kE" = ( /obj/structure/door/wood/ebony, /turf/floor/wood/ebony, @@ -232,6 +304,19 @@ /obj/abstract/landmark/start/shaded_hills/farmer, /turf/floor/wood/ebony, /area/shaded_hills/farmhouse) +"me" = ( +/obj/structure/reagent_dispensers/barrel/ebony, +/obj/item/seeds/extracted/potato, +/obj/item/seeds/extracted/potato, +/obj/item/seeds/extracted/potato, +/obj/item/seeds/extracted/carrot, +/obj/item/seeds/extracted/carrot, +/obj/item/seeds/extracted/carrot, +/obj/item/seeds/extracted/cabbage, +/obj/item/seeds/extracted/cabbage, +/obj/item/seeds/extracted/cabbage, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/downlands) "mG" = ( /obj/structure/railing/mapped/ebony{ dir = 4 @@ -246,6 +331,10 @@ /obj/item/chems/glass/bucket/wood, /turf/floor/natural/path/basalt, /area/shaded_hills/slaughterhouse) +"ol" = ( +/obj/structure/railing/mapped/ebony, +/turf/floor/natural/mud, +/area/shaded_hills/outside/shrine) "or" = ( /obj/structure/wall_sconce/lantern{ dir = 4 @@ -261,10 +350,23 @@ }, /turf/floor/natural/grass, /area/shaded_hills/outside/downlands) +"pd" = ( +/obj/structure/bed/chair/bench/pew/mahogany{ + dir = 1 + }, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "pi" = ( /obj/structure/table/woodentable/ebony, +/obj/item/stack/medical/ointment/poultice/five, +/obj/item/stack/medical/bruise_pack/bandage/five, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) +"qe" = ( +/obj/structure/bed/simple/ebony, +/obj/abstract/landmark/start/shaded_hills/shrine_attendant, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "qf" = ( /obj/structure/railing/mapped/ebony{ dir = 8 @@ -274,9 +376,25 @@ "qG" = ( /turf/wall/brick/basalt, /area/shaded_hills/inn) +"qL" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/ancient_surgery/bonesetter, +/obj/item/ancient_surgery/retractor, +/obj/item/ancient_surgery/sutures, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "qP" = ( /turf/floor/wood/ebony, /area/shaded_hills/farmhouse) +"qY" = ( +/turf/wall/brick/basalt, +/area/shaded_hills/outside/downlands/poi) +"ra" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/chems/glass/mortar, +/obj/item/rock/basalt, +/turf/floor/wood/ebony, +/area/shaded_hills/farmhouse) "rv" = ( /obj/structure/table/woodentable/ebony, /obj/item/chems/glass/pottery/bottle, @@ -293,6 +411,10 @@ }, /turf/floor/wood/ebony, /area/shaded_hills/inn/porch) +"rO" = ( +/mob/living/simple_animal/fowl/chicken, +/turf/floor/natural/grass, +/area/shaded_hills/outside/downlands) "sJ" = ( /obj/structure/door/wood/ebony, /obj/abstract/landmark/lock_preset/shaded_hills/inn_interior, @@ -344,14 +466,34 @@ "uJ" = ( /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"uK" = ( +/obj/structure/table/marble, +/obj/structure/wall_sconce/lantern{ + dir = 8 + }, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "uM" = ( /turf/floor/natural/path/basalt, /area/shaded_hills/general_store) +"uP" = ( +/obj/structure/wall_sconce/lantern{ + dir = 1; + pixel_y = 10 + }, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "vA" = ( /obj/structure/table/marble, /obj/item/chems/condiment/sugar, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) +"wg" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/ancient_surgery/bonesaw, +/obj/item/ancient_surgery/forceps, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "wh" = ( /obj/structure/closet/crate/chest, /obj/item/cash/imperial/regalis, @@ -378,6 +520,20 @@ "xH" = ( /turf/wall/brick/basalt, /area/shaded_hills/slaughterhouse) +"xU" = ( +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) +"xW" = ( +/obj/structure/reagent_dispensers/compost_bin, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/downlands) +"ya" = ( +/obj/structure/reagent_dispensers/barrel/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/farmhouse) "yn" = ( /obj/structure/bed/simple/ebony/cloth, /obj/item/bedsheet/yellowed, @@ -388,6 +544,10 @@ /obj/structure/reagent_dispensers/barrel/ebony, /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"yx" = ( +/obj/structure/table/marble, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "yz" = ( /turf/wall/brick/basalt, /area/shaded_hills/general_store) @@ -398,6 +558,10 @@ /obj/abstract/landmark/start/shaded_hills/farmer, /turf/floor/wood/ebony, /area/shaded_hills/farmhouse) +"yN" = ( +/obj/structure/closet/crate/chest/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/farmhouse) "yY" = ( /turf/floor/natural/grass, /area/shaded_hills/outside/downlands/poi) @@ -411,6 +575,15 @@ /obj/item/chems/food/meatpie, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) +"zm" = ( +/obj/structure/railing/mapped/ebony{ + dir = 8 + }, +/obj/structure/railing/mapped/ebony{ + dir = 1 + }, +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) "Ak" = ( /turf/floor/natural/path/basalt, /area/shaded_hills/stable) @@ -418,14 +591,43 @@ /obj/abstract/landmark/start/shaded_hills/bartender, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) +"Aq" = ( +/obj/structure/textiles/loom/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) +"Aw" = ( +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/obj/structure/reagent_dispensers/barrel/ebony, +/obj/item/seeds/extracted/foxglove, +/obj/item/seeds/extracted/foxglove, +/obj/item/seeds/extracted/ginseng, +/obj/item/seeds/extracted/ginseng, +/obj/item/seeds/extracted/valerian, +/obj/item/seeds/extracted/valerian, +/obj/item/seeds/extracted/yarrow, +/obj/item/seeds/extracted/yarrow, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/shrine) "Ay" = ( /turf/floor/natural/mud/water, /area/shaded_hills/outside/downlands) +"AE" = ( +/obj/structure/door/wood/ebony, +/turf/floor/natural/path/basalt, +/area/shaded_hills/shrine) "AG" = ( /obj/structure/table/woodentable/ebony, /obj/item/bag/sack, /turf/floor/wood/ebony, /area/shaded_hills/farmhouse) +"AX" = ( +/obj/structure/wall_sconce/lantern{ + dir = 4 + }, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "Br" = ( /turf/floor/natural/path/basalt, /area/shaded_hills/slaughterhouse) @@ -434,6 +636,13 @@ /obj/structure/textiles/spinning_wheel/twisting_bench/ebony, /turf/floor/natural/path/basalt, /area/shaded_hills/slaughterhouse) +"By" = ( +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) +"BD" = ( +/obj/structure/reagent_dispensers/barrel/ebony/wine, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "BG" = ( /obj/structure/bed/chair/bench/ebony, /turf/floor/wood/ebony, @@ -443,10 +652,25 @@ /obj/item/bedsheet/yellowed, /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"Ch" = ( +/obj/structure/wall_sconce/lantern{ + dir = 1; + pixel_y = 10 + }, +/turf/floor/natural/grass, +/area/shaded_hills/outside/downlands) +"CR" = ( +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "Dn" = ( /obj/structure/reagent_dispensers/barrel/ebony/oil, /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"Dt" = ( +/obj/structure/bed/simple/ebony/cloth, +/obj/abstract/landmark/start/shaded_hills/shrine_keeper, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "Ee" = ( /turf/wall/log/ebony, /area/shaded_hills/inn) @@ -457,6 +681,12 @@ /obj/structure/table/woodentable/ebony, /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"EJ" = ( +/obj/structure/railing/mapped/ebony{ + dir = 1 + }, +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) "EK" = ( /obj/structure/table/marble, /obj/item/rock/hematite, @@ -466,6 +696,22 @@ "EV" = ( /turf/floor/natural/path/basalt, /area/shaded_hills/outside/downlands) +"FD" = ( +/obj/structure/reagent_dispensers/barrel/ebony, +/obj/item/seeds/extracted/rice, +/obj/item/seeds/extracted/rice, +/obj/item/seeds/extracted/rice, +/obj/item/seeds/extracted/rice, +/obj/item/seeds/extracted/wheat, +/obj/item/seeds/extracted/wheat, +/obj/item/seeds/extracted/wheat, +/obj/item/seeds/extracted/wheat, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/downlands) +"FE" = ( +/obj/structure/closet/cabinet/wooden/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/farmhouse) "FH" = ( /obj/structure/wall_sconce/lantern{ dir = 4 @@ -476,6 +722,16 @@ /obj/abstract/landmark/start/shaded_hills/traveller, /turf/floor/natural/dirt, /area/shaded_hills/outside/downlands) +"Gb" = ( +/obj/structure/table/marble, +/obj/item/stack/medical/bruise_pack/bandage/five, +/obj/item/stack/medical/ointment/poultice/five, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) +"Gj" = ( +/obj/structure/table/woodentable_reinforced/mahogany, +/turf/floor/carpet/red, +/area/shaded_hills/shrine) "Gq" = ( /obj/abstract/landmark/start/shaded_hills/traveller/learned, /turf/floor/natural/path/basalt, @@ -519,6 +775,7 @@ /area/shaded_hills/inn) "HE" = ( /obj/structure/window/basic/full, +/obj/structure/wall_frame/log/ebony, /turf/floor/natural/path/basalt, /area/shaded_hills/stable) "HF" = ( @@ -547,6 +804,7 @@ /area/shaded_hills/tannery) "IQ" = ( /obj/structure/window/basic/full, +/obj/structure/wall_frame/log/ebony, /turf/floor/natural/path/basalt, /area/shaded_hills/farmhouse) "IS" = ( @@ -556,18 +814,54 @@ /obj/abstract/landmark/latejoin, /turf/floor/natural/path/basalt, /area/shaded_hills/outside/downlands) +"Je" = ( +/obj/structure/pit/closed/grave, +/obj/structure/gravemarker/random, +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) "Jo" = ( /obj/structure/wall_sconce/lantern, /turf/floor/wood/ebony, /area/shaded_hills/inn) +"Jt" = ( +/obj/structure/closet/cabinet/wooden/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "Jw" = ( /obj/structure/bed/chair/wood/ebony, /turf/floor/wood/ebony, /area/shaded_hills/inn/porch) +"Jz" = ( +/obj/structure/reagent_dispensers/barrel/ebony/water, +/turf/floor/wood/ebony, +/area/shaded_hills/inn) +"JK" = ( +/obj/structure/table/woodentable_reinforced/mahogany, +/obj/item/flame/candle, +/turf/floor/carpet/red, +/area/shaded_hills/shrine) +"JM" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/ancient_surgery/cautery, +/obj/item/ancient_surgery/scalpel, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "JU" = ( /obj/structure/railing/mapped/ebony, /turf/floor/wood/ebony, /area/shaded_hills/inn/porch) +"Ka" = ( +/mob/living/simple_animal/cow, +/turf/floor/natural/grass, +/area/shaded_hills/outside/downlands) +"Ke" = ( +/obj/structure/textiles/spinning_wheel/twisting_bench/ebony, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) +"Kh" = ( +/obj/structure/window/basic/full, +/turf/wall/log/ebony, +/area/shaded_hills/shrine) "KG" = ( /obj/structure/railing/mapped/ebony{ dir = 8 @@ -610,6 +904,11 @@ /obj/structure/closet/crate/chest, /turf/floor/natural/path/basalt, /area/shaded_hills/slaughterhouse) +"Ot" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/chems/cooking_vessel/pot, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "ON" = ( /obj/structure/table/marble, /obj/item/chems/glass/pottery/jar, @@ -629,6 +928,10 @@ "PA" = ( /turf/floor/straw, /area/shaded_hills/stable) +"PG" = ( +/obj/structure/door/wood/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "PQ" = ( /obj/structure/closet/crate/chest, /obj/item/chems/food/butchery/meat, @@ -642,6 +945,15 @@ /obj/abstract/landmark/lock_preset/shaded_hills/inn_exterior, /turf/floor/wood/ebony, /area/shaded_hills/inn) +"QB" = ( +/turf/wall/log/ebony, +/area/shaded_hills/shrine) +"QL" = ( +/obj/structure/bed/chair/wood/ebony{ + dir = 1 + }, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "QQ" = ( /turf/wall/log/ebony, /area/shaded_hills/tannery) @@ -670,6 +982,17 @@ }, /turf/floor/natural/grass, /area/shaded_hills/outside/downlands) +"Sj" = ( +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/obj/item/chems/glass/bucket/wood, +/turf/floor/natural/mud, +/area/shaded_hills/outside/shrine) +"Sy" = ( +/obj/structure/textiles/spinning_wheel/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "SF" = ( /obj/structure/door/wood/ebony, /turf/floor/natural/path/basalt, @@ -709,9 +1032,23 @@ /obj/abstract/landmark/latejoin, /turf/floor/natural/dirt, /area/shaded_hills/outside/downlands) +"TM" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/chems/food/grown/potato, +/obj/item/chems/food/grown/potato, +/obj/item/chems/food/grown/carrot, +/obj/item/chems/food/grown/carrot, +/obj/item/chems/food/grown/cabbage, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "TR" = ( /turf/floor/natural/dirt, /area/shaded_hills/outside/downlands) +"UD" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/flame/candle, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "US" = ( /obj/structure/bed/chair/wood/ebony{ dir = 4 @@ -724,6 +1061,19 @@ }, /turf/floor/natural/path/basalt, /area/shaded_hills/outside/downlands) +"Vj" = ( +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) +"VE" = ( +/obj/structure/reagent_dispensers/barrel/ebony/beer, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) +"VM" = ( +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/shrine) "VU" = ( /obj/structure/railing/mapped/ebony{ dir = 8 @@ -741,6 +1091,12 @@ "Wg" = ( /turf/wall/log/ebony, /area/shaded_hills/general_store) +"Wh" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/chems/glass/mortar, +/obj/item/rock/basalt, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "Wk" = ( /obj/structure/railing/mapped/ebony{ dir = 8 @@ -762,6 +1118,23 @@ }, /turf/floor/wood/ebony, /area/shaded_hills/inn/porch) +"WE" = ( +/obj/structure/reagent_dispensers/barrel/ebony, +/obj/item/seeds/extracted/cabbage, +/obj/item/seeds/extracted/cabbage, +/obj/item/seeds/extracted/carrot, +/obj/item/seeds/extracted/carrot, +/obj/item/seeds/extracted/wheat, +/obj/item/seeds/extracted/wheat, +/obj/item/seeds/extracted/rice, +/obj/item/seeds/extracted/rice, +/obj/item/seeds/extracted/potato, +/obj/item/seeds/extracted/potato, +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/turf/floor/natural/mud, +/area/shaded_hills/outside/shrine) "WI" = ( /obj/structure/wall_sconce/lantern{ dir = 8 @@ -775,6 +1148,7 @@ "WV" = ( /obj/structure/table/marble, /obj/item/chems/cooking_vessel/pot, +/obj/item/chems/cooking_vessel/skillet, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) "WY" = ( @@ -786,6 +1160,20 @@ /obj/structure/meat_hook, /turf/floor/natural/path/basalt, /area/shaded_hills/slaughterhouse) +"XH" = ( +/obj/structure/fire_source/stove, +/obj/item/stack/material/log/mapped/ebony/twenty, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) +"XM" = ( +/turf/floor/carpet/red, +/area/shaded_hills/shrine) +"XY" = ( +/turf/floor/natural/mud/water, +/area/shaded_hills/outside/shrine) +"Yc" = ( +/turf/wall/brick/basalt, +/area/shaded_hills/shrine) "Yg" = ( /turf/floor/wood/ebony, /area/shaded_hills/inn/porch) @@ -804,6 +1192,10 @@ }, /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"Zx" = ( +/obj/machinery/portable_atmospherics/hydroponics/soil, +/turf/floor/natural/mud, +/area/shaded_hills/outside/shrine) "ZE" = ( /obj/structure/table/marble, /obj/item/chems/food/cherrypie, @@ -4527,7 +4919,7 @@ yY yY yY yY -yY +HI HI HI HI @@ -4982,12 +5374,12 @@ yY yY yY yY -yY HI HI HI HI HI +TR HI TR EV @@ -5134,7 +5526,6 @@ yY yY yY yY -yY HI HI HI @@ -5143,6 +5534,7 @@ HI TR TR TR +TR Ic EV TR @@ -5285,7 +5677,6 @@ yY yY yY yY -yY HI HI HI @@ -5293,14 +5684,15 @@ HI HI HI TR +TR EV TR Ic EV TR HI -HI -HI +TR +TR yY yY yY @@ -5437,7 +5829,6 @@ yY yY yY yY -yY HI HI HI @@ -5445,15 +5836,16 @@ HI HI HI TR +TR EV Ic EV EV HI +TR HI -HI -HI -yY +TR +VZ yY yY yY @@ -5595,7 +5987,7 @@ HI HI HI HI -HI +aU TR TR Ic @@ -5605,8 +5997,8 @@ HI HI HI HI -yY -yY +VZ +VZ yY yY yY @@ -5740,7 +6132,6 @@ yY yY yY yY -yY HI HI HI @@ -5749,6 +6140,7 @@ HI HI HI TR +TR EV TR EV @@ -5760,8 +6152,8 @@ HI yY yY yY -yY -yY +VZ +VZ yY yY yY @@ -5899,7 +6291,7 @@ HI HI HI HI -HI +Ch TR EV Ic @@ -5911,11 +6303,11 @@ HI HI yY yY -yY -yY -yY -yY -yY +VZ +qY +qY +VZ +VZ yY yY yY @@ -6064,10 +6456,10 @@ HI HI yY yY -yY -yY -yY -yY +VZ +qY +qY +VZ yY yY yY @@ -6217,9 +6609,9 @@ HI HI yY yY -yY -yY -yY +VZ +VZ +VZ yY yY yY @@ -6339,11 +6731,7 @@ yY yY yY yY -yY -yY -yY -yY -yY +HI HI HI HI @@ -6355,6 +6743,10 @@ HI HI HI TR +HI +HI +HI +HI TR TR EV @@ -6370,9 +6762,9 @@ HI HI yY yY -yY -yY -yY +VZ +qY +VZ yY yY yY @@ -6489,11 +6881,10 @@ yY yY yY yY -yY -yY -yY -yY -yY +HI +HI +HI +HI HI HI HI @@ -6507,7 +6898,8 @@ HI HI HI TR -TR +HI +HI TR EV Ic @@ -6522,8 +6914,8 @@ HI HI yY yY -yY -yY +VZ +VZ yY yY yY @@ -6639,10 +7031,6 @@ yY yY yY yY -yY -yY -yY -yY HI HI HI @@ -6658,6 +7046,10 @@ HI HI HI HI +HI +TR +TR +HI TR TR TR @@ -6673,7 +7065,7 @@ HI HI HI HI -yY +VZ yY yY yY @@ -6790,8 +7182,6 @@ yY yY yY yY -yY -yY HI HI HI @@ -6808,6 +7198,8 @@ HI HI HI HI +HI +TR Iz Iz Iz @@ -6958,8 +7350,8 @@ HI HI HI HI -HI -HI +TR +TR wA wA wA @@ -7089,6 +7481,9 @@ yY yY yY yY +yY +yY +yY HI HI HI @@ -7107,11 +7502,8 @@ HI HI HI HI -HI -HI -HI -HI -HI +TR +TR wA Lj wA @@ -7240,11 +7632,10 @@ yY yY yY yY -HI -HI -HI -HI -HI +yY +yY +yY +yY HI HI HI @@ -7264,6 +7655,7 @@ HI HI HI TR +TR wA wA wA @@ -7391,6 +7783,11 @@ yY yY yY yY +yY +yY +yY +yY +yY HI HI HI @@ -7407,11 +7804,6 @@ HI HI HI HI -TR -HI -HI -HI -HI HI HI HI @@ -7543,30 +7935,30 @@ yY yY yY yY -HI -HI -HI -HI -HI +yY +yY +yY +yY +yY HI HI TR TR HI HI +HI TR TR TR TR TR -HI -TR -TR -TR TR TR HI HI +HI +HI +TR TR TR TR @@ -7695,11 +8087,11 @@ yY yY yY yY -HI -HI -HI -HI -HI +yY +yY +yY +yY +yY HI TR cx @@ -7715,7 +8107,7 @@ cx cx cx TR -TR +HI TR TR cx @@ -7848,9 +8240,9 @@ yY yY yY yY -HI -HI -HI +yY +yY +yY HI HI TR @@ -8000,9 +8392,9 @@ yY yY yY yY -HI -HI -HI +yY +yY +yY HI HI TR @@ -8152,12 +8544,12 @@ yY yY yY yY -HI +yY +yY HI HI HI TR -TR cx TR HI @@ -8304,12 +8696,12 @@ yY yY yY yY -HI +yY +yY HI HI HI TR -TR cx TR HI @@ -8456,12 +8848,12 @@ yY yY yY yY -HI +yY +yY HI HI HI TR -TR cx TR HI @@ -8608,12 +9000,12 @@ yY yY yY yY -HI +yY +yY HI HI HI TR -TR cx TR TR @@ -8760,12 +9152,12 @@ yY yY yY yY +yY HI HI HI HI TR -TR cx cx TR @@ -8773,7 +9165,7 @@ TR Ee ZY ZY -ZY +Jz ZY sJ ZY @@ -10019,7 +10411,7 @@ HI HI oO Sf -HI +Sf Sf Sf Sf @@ -10325,9 +10717,9 @@ gp HI HI HI +Ka HI -HI -HI +rO RC HI TR @@ -10783,7 +11175,7 @@ Ay HI HI HI -HI +rO RC HI HI @@ -11083,7 +11475,7 @@ HI HI LK hU -HI +hU hU hU hU @@ -11946,7 +12338,7 @@ NH NH NH NH -yY +NH yY yY yY @@ -11989,7 +12381,7 @@ LN cl qP qP -qP +FE LN TR Rl @@ -12097,8 +12489,8 @@ NH NH NH NH -yY -yY +NH +NH yY yY yY @@ -12249,8 +12641,8 @@ NH NH NH NH -yY -yY +NH +NH yY yY yY @@ -12293,7 +12685,7 @@ LN cl qP qP -qP +yN LN TR Rl @@ -12401,9 +12793,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -12445,7 +12837,7 @@ IQ cl yJ qP -qP +yN LN TR Rl @@ -12553,9 +12945,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -12705,9 +13097,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -12749,7 +13141,7 @@ LN AG qP qP -qP +ya LN TR Rl @@ -12857,9 +13249,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -12903,7 +13295,7 @@ WO LN LN LN -TR +me Rl GW Ay @@ -13009,9 +13401,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -13055,7 +13447,7 @@ qP qP qP LN -TR +FD Rl Rl Ay @@ -13161,10 +13553,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -13313,10 +13705,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -13359,7 +13751,7 @@ qP qP hJ LN -TR +xW Rl Rl Ay @@ -13466,10 +13858,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -13507,11 +13899,11 @@ qP hc LN HF -cl +ra gg eD LN -aU +ke TR Rl Rl @@ -13618,10 +14010,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -13770,10 +14162,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -13922,10 +14314,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -14075,8 +14467,8 @@ NH NH NH NH -yY -yY +NH +NH yY yY yY @@ -14227,8 +14619,8 @@ NH NH NH NH -yY -yY +NH +NH yY yY yY @@ -14379,9 +14771,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -14531,9 +14923,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -14684,9 +15076,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -14836,10 +15228,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -14988,11 +15380,11 @@ NH NH NH NH -yY -yY -yY -yY -yY +NH +NH +NH +NH +NH yY yY yY @@ -15140,11 +15532,11 @@ NH NH NH NH -yY -yY -yY -yY -yY +NH +NH +NH +NH +NH yY yY yY @@ -15172,8 +15564,8 @@ yY yY HI HI -HI -HI +TR +TR TR Ic EV @@ -15293,6 +15685,11 @@ NH NH NH NH +NH +NH +NH +NH +NH yY yY yY @@ -15308,24 +15705,19 @@ yY yY yY yY +By +By +By +By +By yY yY yY yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -HI +By HI TR +TR EV TR TR @@ -15447,6 +15839,10 @@ NH NH NH NH +NH +NH +NH +NH yY yY yY @@ -15458,26 +15854,22 @@ yY yY yY yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -HI -HI -HI +By +By +By +By +kv +kv +kv +By +By +By +By +By +By +kv +TR +TR TR EV Ic @@ -15602,6 +15994,7 @@ NH NH NH NH +NH yY yY yY @@ -15612,24 +16005,23 @@ yY yY yY yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -HI -HI -HI +By +By +kv +kv +kv +kv +kv +kv +kv +kv +kv +By +By +kv +kv +TR +TR EV EV Ic @@ -15764,23 +16156,23 @@ yY yY yY yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -HI -HI -HI +By +By +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +TR TR EV EV @@ -15909,30 +16301,30 @@ NH NH NH NH +NH yY yY yY yY yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -HI -HI -HI +By +By +kv +kv +kv +kv +By +By +By +By +By +kv +kv +kv +kv +kv +kv +TR TR EV EV @@ -16065,25 +16457,25 @@ NH NH NH yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -HI -HI +By +By +By +kv +kv +kv +kv +By +By +By +By +By +By +By +By +By +By +By +By HI TR TR @@ -16216,15 +16608,15 @@ NH NH NH NH -NH -yY -yY -yY -yY -yY -yY -yY -yY +By +By +kv +kv +kv +kv +kv +By +By yY yY yY @@ -16367,15 +16759,15 @@ NH NH NH NH -NH -NH -NH -yY -yY -yY -yY -yY -yY +By +By +kv +kv +kv +kv +By +By +By yY yY yY @@ -16519,13 +16911,13 @@ NH NH NH NH -NH -NH -NH -yY -yY -yY -yY +By +By +kv +kv +kv +kv +By yY yY yY @@ -16670,14 +17062,14 @@ NH NH NH NH -NH -NH -NH -NH -NH -yY -yY -yY +By +By +kv +kv +kv +kv +By +By yY yY yY @@ -16793,10 +17185,20 @@ NH NH NH NH +By +By +By +By NH NH NH NH +By +By +By +By +By +By NH NH NH @@ -16812,23 +17214,13 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -yY -yY +By +By +kv +kv +kv +kv +By yY yY yY @@ -16935,6 +17327,7 @@ lC lC Wm Wm +Wm NH NH NH @@ -16942,6 +17335,27 @@ NH NH NH NH +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By NH NH NH @@ -16952,35 +17366,13 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -yY +By +By +kv +kv +kv +kv +By yY yY yY @@ -17087,8 +17479,36 @@ lC lC Wm Wm +Wm NH NH +By +By +By +By +By +By +By +kv +By +By +By +kv +By +By +By +By +kv +kv +By +By +By +By +By +By +By +By +By NH NH NH @@ -17098,42 +17518,14 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -yY +By +By +kv +kv +kv +kv +By +By yY yY yY @@ -17239,7 +17631,37 @@ lC lC Wm Wm +Wm NH +By +By +By +By +By +By +By +By +kv +kv +By +kv +iK +kv +By +By +kv +kv +iK +kv +By +By +kv +kv +kv +kv +kv +By +By NH NH NH @@ -17248,44 +17670,14 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +kv +kv +kv +kv +By yY yY yY @@ -17391,7 +17783,37 @@ lC lC Wm Wm +Wm NH +By +zm +gA +gA +gA +gA +gA +gA +iK +QB +Kh +QB +QB +kv +kv +kv +iK +iK +iK +kv +kv +kv +kv +iK +iK +kv +iK +kv +By NH NH NH @@ -17401,43 +17823,13 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +kv +kv +kv +kv +By yY yY yY @@ -17543,7 +17935,37 @@ lC lC Wm Wm +Wm NH +By +EJ +By +By +By +By +Je +By +iK +QB +UD +QL +QB +By +By +By +kv +kv +kv +kv +kv +By +By +kv +kv +kv +kv +kv +By NH NH NH @@ -17554,43 +17976,13 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +kv +kv +kv +By +yY yY yY yY @@ -17695,7 +18087,38 @@ lC lC Wm Wm +Wm NH +By +EJ +Je +By +By +By +By +By +iK +QB +Dt +CR +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +By +By NH NH NH @@ -17704,45 +18127,14 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +kv +kv +kv +By +yY yY yY yY @@ -17847,7 +18239,38 @@ lC lC Wm Wm +Wm NH +By +EJ +By +By +Je +By +Je +By +iK +QB +Jt +CR +PG +CR +CR +CR +CR +CR +QB +CR +CR +gt +CR +CR +CR +CR +CR +QB +By +By NH NH NH @@ -17855,46 +18278,15 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +kv +kv +kv +By +By +By NH yY yY @@ -17999,53 +18391,53 @@ lC lC Wm Wm +Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +Je +By +By +By +By +By +iK +QB +QB +AE +QB +CR +CR +AX +CR +CR +PG +CR +XM +XM +XM +pd +CR +pd +CR +Kh +By +By +By +By +By +By +By +By +By +By +By +By +kv +kv +By +By +By NH NH yY @@ -18151,53 +18543,53 @@ lC lC Wm Wm +Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +Je +By +Je +By +iK +iK +kv +kv +QB +PG +QB +QB +PG +QB +QB +CR +XM +JK +XM +jk +CR +pd +CR +QB +kv +By +kv +kv +kv +kv +kv +kv +By +kv +kv +kv +kv +kv +By +By +By NH NH NH @@ -18303,52 +18695,52 @@ lC lC Wm Wm +Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +By +By +By +By +iK +kv +kv +kv +QB +CR +CR +QB +CR +CR +QB +uP +XM +Gj +XM +XM +XM +XM +CR +AE +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +By +By +By NH NH NH @@ -18455,51 +18847,51 @@ lC lC Wm Wm +Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +kv +kv +By +By +iK +kv +kv +kv +QB +Jt +qe +QB +Jt +qe +QB +CR +XM +JK +XM +pd +CR +pd +CR +QB +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +By +By +By +By +By NH NH NH @@ -18607,50 +18999,50 @@ lC lC Wm Wm +Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +Yc +Yc +QB +QB +QB +QB +QB +CR +XM +XM +XM +pd +CR +pd +CR +Kh +By +By +By +By +By +By +By +By +By +By +By +By +By +By NH NH NH @@ -18759,48 +19151,48 @@ lC lC Wm Wm +Wm NH +By +EJ +By +By +By +kv +kv +kv +kv +kv +kv +kv +Yc +XH +Vj +CR +CR +CR +PG +CR +CR +AX +CR +CR +CR +CR +CR +QB +By +By +By NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +By +By +By NH NH NH @@ -18908,41 +19300,41 @@ lC lC lC lC -lC -Wm -Wm -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +lC +Wm +Wm +Wm NH +By +EJ +By +By +By +By +By +By +kv +iK +kv +kv +AE +Vj +Vj +TM +Wh +CR +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +By +By NH NH NH @@ -19065,35 +19457,35 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +Je +By +Je +By +By +kv +kv +iK +kv +kv +QB +uP +CR +Ot +bW +CR +AE +ft +ft +ft +ft +ft +ft +ft +kv +By +By NH NH NH @@ -19217,35 +19609,35 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +By +By +By +kv +iK +iK +kv +kv +Kh +CR +CR +CR +CR +CR +Kh +ft +Zx +XY +Zx +ol +ft +kv +By +kv +By NH NH NH @@ -19369,35 +19761,35 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +Je +By +By +kv +iK +iK +kv +By +QB +cy +VE +BD +Sy +Aq +QB +ft +Zx +XY +Zx +ol +kv +By +By +By +By NH NH NH @@ -19521,33 +19913,33 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +By +By +kv +kv +iK +kv +By +kv +QB +QB +QB +QB +QB +QB +QB +ft +Zx +XY +Zx +ol +kv +By +By NH NH NH @@ -19673,32 +20065,32 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +Je +By +By +kv +kv +kv +kv +kv +kv +QB +yx +uK +Gb +Vj +Vj +AE +ft +Zx +XY +Zx +ol +kv +By NH NH NH @@ -19825,32 +20217,32 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +By +By +kv +kv +kv +kv +kv +By +AE +Vj +Vj +Vj +Vj +JM +QB +ft +ft +ft +ft +ol +kv +By NH NH NH @@ -19977,31 +20369,31 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +cT +xU +xU +xU +xU +kv +kv +kv +kv +By +kv +QB +ev +gL +Ke +wg +qL +QB +Aw +WE +VM +Sj +fg +By NH NH NH @@ -20129,31 +20521,31 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +By +By +By +VM +kv +kv +kv +By +kv +QB +QB +QB +QB +QB +QB +QB +kv +kv +By +kv +By +By NH NH NH @@ -20283,26 +20675,26 @@ Wm NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By NH NH NH @@ -20441,19 +20833,19 @@ NH NH NH NH +By +By +By +By +By +By NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +By NH NH NH @@ -20584,6 +20976,7 @@ lC Wm Wm Wm +Wm NH NH NH @@ -20593,9 +20986,8 @@ NH NH NH NH -NH -NH -NH +By +By NH NH NH @@ -20736,7 +21128,7 @@ lC Wm Wm Wm -NH +Wm NH NH NH diff --git a/maps/shaded_hills/shaded_hills-swamp.dmm b/maps/shaded_hills/shaded_hills-swamp.dmm index c4b92d251aa..2526bb0beb3 100644 --- a/maps/shaded_hills/shaded_hills-swamp.dmm +++ b/maps/shaded_hills/shaded_hills-swamp.dmm @@ -1,6 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aM" = ( /obj/structure/window/basic/full, +/obj/structure/wall_frame/log/ebony, /turf/floor/natural/path/basalt, /area/shaded_hills/witch_hut) "bg" = ( diff --git a/maps/shaded_hills/shaded_hills-woods.dmm b/maps/shaded_hills/shaded_hills-woods.dmm index 48c711f86a2..9d2af2d4755 100644 --- a/maps/shaded_hills/shaded_hills-woods.dmm +++ b/maps/shaded_hills/shaded_hills-woods.dmm @@ -9,7 +9,7 @@ /area/shaded_hills/outside/woods) "cN" = ( /obj/structure/table/woodentable/ebony, -/obj/item/knife/kitchen, +/obj/item/bladed/knife, /turf/floor/wood/ebony, /area/shaded_hills/forester_hut) "dp" = ( diff --git a/maps/shaded_hills/shaded_hills.dm b/maps/shaded_hills/shaded_hills.dm index 87513297c5e..e077b504feb 100644 --- a/maps/shaded_hills/shaded_hills.dm +++ b/maps/shaded_hills/shaded_hills.dm @@ -17,6 +17,7 @@ #include "jobs/_jobs.dm" #include "jobs/caves.dm" #include "jobs/inn.dm" + #include "jobs/shrine.dm" #include "jobs/visitors.dm" #include "jobs/wilderness.dm" @@ -38,10 +39,12 @@ #include "outfits/_outfits.dm" #include "outfits/caves.dm" #include "outfits/inn.dm" + #include "outfits/shrine.dm" #include "outfits/visitors.dm" #include "outfits/wilderness.dm" #include "shaded_hills_currency.dm" + #include "shaded_hills_events.dm" #include "shaded_hills_locks.dm" #include "shaded_hills_map.dm" #include "shaded_hills_names.dm" diff --git a/maps/shaded_hills/shaded_hills_events.dm b/maps/shaded_hills/shaded_hills_events.dm new file mode 100644 index 00000000000..cd2b3aa8673 --- /dev/null +++ b/maps/shaded_hills/shaded_hills_events.dm @@ -0,0 +1,20 @@ +/datum/map/shaded_hills + event_container_mundane = /datum/event_container/mundane/fantasy + event_container_moderate = /datum/event_container/moderate/fantasy + event_container_major = /datum/event_container/major/fantasy + +// TODO: more appropriate events. +/datum/event_container/mundane/fantasy + available_events = list( + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 100) + ) + +/datum/event_container/moderate/fantasy + available_events = list( + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 100) + ) + +/datum/event_container/major/fantasy + available_events = list( + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 100) + ) diff --git a/maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm b/maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm index b0ab07b1d98..cebf783cb01 100644 --- a/maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm +++ b/maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm @@ -22,7 +22,7 @@ /turf/floor/natural/dirt, /area/shaded_hills/outside/point_of_interest/bear_den) "w" = ( -/obj/item/knife, +/obj/item/bladed/knife, /obj/item/cash/imperial/crown, /obj/item/cash/imperial/crown, /obj/item/cash/imperial/quin, diff --git a/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm b/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm index 4e05687fb3c..b13b7d1214f 100644 --- a/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm +++ b/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm @@ -85,7 +85,7 @@ /turf/floor/natural/barren, /area/shaded_hills/outside/point_of_interest/hunter_camp) "Z" = ( -/obj/item/knife, +/obj/item/bladed/knife, /turf/floor/natural/barren, /area/shaded_hills/outside/point_of_interest/hunter_camp) diff --git a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm b/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm index 31ee2d0a21c..96d949d2540 100644 --- a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm +++ b/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm @@ -57,7 +57,7 @@ /area/shaded_hills/outside/point_of_interest/old_cabin) "H" = ( /obj/structure/table/woodentable/ebony, -/obj/item/knife, +/obj/item/bladed/knife, /obj/item/chems/food/grown/potato, /obj/item/chems/food/grown/potato, /obj/item/chems/food/grown/carrot, diff --git a/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm b/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm index d83d0ef38c7..2032c706884 100644 --- a/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm +++ b/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm @@ -43,11 +43,12 @@ /area/template_noop) "t" = ( /obj/structure/table/woodentable/ebony, -/obj/item/knife, +/obj/item/bladed/knife, /turf/floor/natural/path/basalt, /area/template_noop) "v" = ( /obj/structure/window/basic/full, +/obj/structure/wall_frame/log/ebony, /turf/floor/natural/path/basalt, /area/template_noop) "w" = ( diff --git a/maps/tradeship/jobs/command.dm b/maps/tradeship/jobs/command.dm index 3cb07038328..7b9a6fa654a 100644 --- a/maps/tradeship/jobs/command.dm +++ b/maps/tradeship/jobs/command.dm @@ -29,7 +29,7 @@ not_random_selectable = 1 forced_spawnpoint = /decl/spawnpoint/cryo/captain -/datum/job/tradeship_captain/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/tradeship_captain/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(H) H.verbs |= /mob/proc/tradehouse_rename_ship diff --git a/maps/tradeship/jobs/synthetics.dm b/maps/tradeship/jobs/synthetics.dm index 9e0664ea8f0..b2d9ce91265 100644 --- a/maps/tradeship/jobs/synthetics.dm +++ b/maps/tradeship/jobs/synthetics.dm @@ -18,11 +18,11 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/tradeship_robot/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) +/datum/job/tradeship_robot/handle_variant_join(var/mob/living/human/H, var/alt_title) if(H) return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) -/datum/job/tradeship_robot/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/tradeship_robot/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) return !!H /datum/job/tradeship_robot/New() diff --git a/maps/tradeship/outfits/_outfits.dm b/maps/tradeship/outfits/_outfits.dm index a89b5feaad8..b5064d2f43e 100644 --- a/maps/tradeship/outfits/_outfits.dm +++ b/maps/tradeship/outfits/_outfits.dm @@ -9,10 +9,10 @@ /decl/hierarchy/outfit/job/tradeship/hand name = "Tradeship - Job - Deck Hand" -/decl/hierarchy/outfit/job/tradeship/hand/pre_equip(mob/living/carbon/human/H) +/decl/hierarchy/outfit/job/tradeship/hand/pre_equip(mob/living/human/H) ..() uniform = pick(list( - /obj/item/clothing/under/overalls, + /obj/item/clothing/pants/mustard/overalls, /obj/item/clothing/jumpsuit/hazard, /obj/item/clothing/jumpsuit/cargotech, /obj/item/clothing/jumpsuit/black, diff --git a/maps/tradeship/outfits/command.dm b/maps/tradeship/outfits/command.dm index f7063c00485..5a3274d5f42 100644 --- a/maps/tradeship/outfits/command.dm +++ b/maps/tradeship/outfits/command.dm @@ -7,7 +7,7 @@ id_type = /obj/item/card/id/gold l_ear = /obj/item/radio/headset/heads/captain -/decl/hierarchy/outfit/job/tradeship/captain/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/job/tradeship/captain/post_equip(var/mob/living/human/H) ..() var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) if(uniform) diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index 1560a9beb03..7dd27ebd071 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -4,6 +4,14 @@ #include "../../code/unit_tests/offset_tests.dm" #endif + #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" + #include "../../mods/gamemodes/mixed/_mixed.dme" + #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" @@ -13,7 +21,6 @@ #include "../../mods/content/government/_government.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/scaling_descriptors.dm" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/content/matchmaking/_matchmaking.dme" @@ -22,6 +29,9 @@ #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" + // Must come after borers for compatibility. + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/species/ascent/_ascent.dme" #include "../../mods/species/drakes/_drakes.dme" #include "../../mods/species/serpentid/_serpentid.dme" diff --git a/maps/tradeship/tradeship_areas.dm b/maps/tradeship/tradeship_areas.dm index 3de5f7af9ab..6884791c749 100644 --- a/maps/tradeship/tradeship_areas.dm +++ b/maps/tradeship/tradeship_areas.dm @@ -307,7 +307,7 @@ arrival_sound = null lift_announce_str = null -/area/turbolift/alert_on_fall(var/mob/living/carbon/human/H) +/area/turbolift/alert_on_fall(var/mob/living/human/H) if(H.client && SSpersistence.elevator_fall_shifts > 0) SSwebhooks.send(WEBHOOK_ELEVATOR_FALL, list("text" = "We managed to make it [SSpersistence.elevator_fall_shifts] shift\s without someone falling down an elevator shaft.")) SSpersistence.elevator_fall_shifts = -1 diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index ed512725201..36cf1f1b1e1 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -269,8 +269,6 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable var/found_whitelisted_job = FALSE for(var/datum/job/job as anything in SSjobs.primary_job_datums) if((species.type in job_to_species_whitelist[job.type]) || (job.type in species_to_job_whitelist[species.type])) - LAZYDISTINCTADD(species_to_job_whitelist[species.type], job.type) - LAZYDISTINCTADD(job_to_species_whitelist[job.type], species.type) found_whitelisted_job = TRUE else LAZYDISTINCTADD(species_to_job_blacklist[species.type], job.type) @@ -480,7 +478,7 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable else to_chat(player, SPAN_BAD("You did not survive the events on [station_name()]...")) -/datum/map/proc/create_passport(var/mob/living/carbon/human/H) +/datum/map/proc/create_passport(var/mob/living/human/H) if(!passport_type) return var/obj/item/passport/pass = new passport_type(get_turf(H)) diff --git a/maps/~mapsystem/maps_currency.dm b/maps/~mapsystem/maps_currency.dm index fe90b12a880..f3169147c27 100644 --- a/maps/~mapsystem/maps_currency.dm +++ b/maps/~mapsystem/maps_currency.dm @@ -7,14 +7,14 @@ var/name = "all in bank account" var/transfer_mult = 1 -/decl/starting_cash_choice/proc/get_cash_objects(var/mob/living/carbon/human/owner, var/datum/money_account/owner_account) +/decl/starting_cash_choice/proc/get_cash_objects(var/mob/living/human/owner, var/datum/money_account/owner_account) return /decl/starting_cash_choice/credstick name = "all on charge stick" uid = "starting_cash_stick" -/decl/starting_cash_choice/credstick/get_cash_objects(var/mob/living/carbon/human/owner, var/datum/money_account/owner_account) +/decl/starting_cash_choice/credstick/get_cash_objects(var/mob/living/human/owner, var/datum/money_account/owner_account) var/obj/item/charge_stick/credstick = new credstick.creator = owner.real_name credstick.currency = owner_account.currency @@ -31,7 +31,7 @@ name = "all in cash" uid = "starting_cash_cash" -/decl/starting_cash_choice/cash/get_cash_objects(var/mob/living/carbon/human/owner, var/datum/money_account/owner_account) +/decl/starting_cash_choice/cash/get_cash_objects(var/mob/living/human/owner, var/datum/money_account/owner_account) var/obj/item/cash/cash = new cash.set_currency(owner_account.currency) cash.adjust_worth(FLOOR(owner_account.money * transfer_mult)) @@ -48,7 +48,7 @@ transfer_mult = 0.5 uid = "starting_cash_cash_stick_split" -/decl/starting_cash_choice/split/get_cash_objects(var/mob/living/carbon/human/owner, var/datum/money_account/owner_account) +/decl/starting_cash_choice/split/get_cash_objects(var/mob/living/human/owner, var/datum/money_account/owner_account) . = list() var/obj/item/cash/cash = new cash.set_currency(owner_account.currency) diff --git a/maps/~mapsystem/maps_events.dm b/maps/~mapsystem/maps_events.dm new file mode 100644 index 00000000000..6740542eb6a --- /dev/null +++ b/maps/~mapsystem/maps_events.dm @@ -0,0 +1,4 @@ +/datum/map + var/event_container_mundane = /datum/event_container/mundane + var/event_container_moderate = /datum/event_container/moderate + var/event_container_major = /datum/event_container/major diff --git a/mods/content/bigpharma/_bigpharma.dme b/mods/content/bigpharma/_bigpharma.dme index ee81e2f9ac1..7da543df8ee 100644 --- a/mods/content/bigpharma/_bigpharma.dme +++ b/mods/content/bigpharma/_bigpharma.dme @@ -1,9 +1,11 @@ #ifndef MODPACK_BIGPHARMA #define MODPACK_BIGPHARMA +// BEGIN_INCLUDE #include "_bigpharma.dm" #include "chems.dm" #include "extension.dm" #include "language.dm" #include "overrides.dm" #include "pill_bottle.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/content/corporate/clothing/outfits.dm b/mods/content/corporate/clothing/outfits.dm index 0302ce5d7d9..9249d7817e1 100644 --- a/mods/content/corporate/clothing/outfits.dm +++ b/mods/content/corporate/clothing/outfits.dm @@ -1,6 +1,6 @@ /decl/hierarchy/outfit/nanotrasen abstract_type = /decl/hierarchy/outfit/nanotrasen - uniform = /obj/item/clothing/under/centcom + uniform = /obj/item/clothing/costume/centcom shoes = /obj/item/clothing/shoes/dress gloves = /obj/item/clothing/gloves l_ear = /obj/item/radio/headset/heads/hop @@ -24,7 +24,7 @@ /decl/hierarchy/outfit/nanotrasen/captain name = "Corporate Captain" - uniform = /obj/item/clothing/under/centcom_captain + uniform = /obj/item/clothing/costume/centcom_captain l_ear = /obj/item/radio/headset/heads/captain head = /obj/item/clothing/head/beret/corp/centcom/captain belt = /obj/item/gun/energy @@ -35,7 +35,7 @@ head = /obj/item/clothing/head/centhat mask = /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba shoes = /obj/item/clothing/shoes/jackboots/swat - uniform = /obj/item/clothing/under/centcom_captain + uniform = /obj/item/clothing/costume/centcom_captain suit = /obj/item/clothing/suit/armor/bulletproof gloves = /obj/item/clothing/gloves/thick/swat l_ear = /obj/item/radio/headset/heads/captain @@ -46,7 +46,7 @@ /decl/hierarchy/outfit/death_command name = "Spec Ops - Death commando" -/decl/hierarchy/outfit/death_command/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/hierarchy/outfit/death_command/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) var/decl/special_role/deathsquad = GET_DECL(/decl/special_role/deathsquad) deathsquad.equip_role(H) return 1 @@ -54,7 +54,7 @@ /decl/hierarchy/outfit/syndicate_command name = "Spec Ops - Syndicate commando" -/decl/hierarchy/outfit/syndicate_command/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/hierarchy/outfit/syndicate_command/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) var/decl/special_role/commandos = GET_DECL(/decl/special_role/deathsquad/mercenary) commandos.equip_role(H) return 1 diff --git a/mods/content/corporate/clothing/suit/armour.dm b/mods/content/corporate/clothing/suit/armour.dm index 5d6f4e131e4..fac3a04eef9 100644 --- a/mods/content/corporate/clothing/suit/armour.dm +++ b/mods/content/corporate/clothing/suit/armour.dm @@ -1,13 +1,13 @@ /obj/item/clothing/suit/armor/pcarrier/nt_light starting_accessories = list( - /obj/item/clothing/armor_attachment/plate, + /obj/item/clothing/armor_attachment/plate, /obj/item/clothing/armor_attachment/tag/corp ) /obj/item/clothing/suit/armor/pcarrier/nt_medium starting_accessories = list( - /obj/item/clothing/armor_attachment/plate/medium, - /obj/item/clothing/webbing/pouches, + /obj/item/clothing/armor_attachment/plate/medium, + /obj/item/clothing/webbing/pouches, /obj/item/clothing/armor_attachment/tag/corp ) diff --git a/mods/content/corporate/clothing/under/security.dm b/mods/content/corporate/clothing/under/security.dm index 12cffa8681c..7a8cde34a77 100644 --- a/mods/content/corporate/clothing/under/security.dm +++ b/mods/content/corporate/clothing/under/security.dm @@ -7,7 +7,7 @@ /obj/item/clothing/jumpsuit/head_of_security/corp icon = 'mods/content/corporate/icons/clothing/under/hos_corporate.dmi' -/obj/item/clothing/under/pcrc +/obj/item/clothing/jumpsuit/pcrc name = "\improper PCRC uniform" desc = "A uniform belonging to Proxima Centauri Risk Control, a private security firm." icon = 'mods/content/corporate/icons/clothing/under/pcrc.dmi' diff --git a/mods/content/corporate/clothing/under/uniforms.dm b/mods/content/corporate/clothing/under/uniforms.dm index 13583d8cdf5..a01d24f319f 100644 --- a/mods/content/corporate/clothing/under/uniforms.dm +++ b/mods/content/corporate/clothing/under/uniforms.dm @@ -1,66 +1,66 @@ -/obj/item/clothing/under/work +/obj/item/clothing/jumpsuit/pilot + name = "green flight suit" + desc = "A sleek green Expeditionary Corps Organisation flight suit. It proudly sports three different patches with corporate logos on them, as well as several unnecessary looking flaps and pockets for effect." + icon = 'mods/content/corporate/icons/clothing/under/pilot.dmi' + +/obj/item/clothing/jumpsuit/pilot/nanotrasen + name = "red flight suit" + desc = "A sleek red NanoTrasen flight suit. It proudly sports three different patches with corporate logos on them, as well as several unnecessary looking flaps and pockets for effect." + icon = 'mods/content/corporate/icons/clothing/under/pilot_nt.dmi' + +/obj/item/clothing/jumpsuit/pilot/heph + name = "cyan flight suit" + desc = "A sleek cyan Hephaestus Industries flight suit. It proudly sports three different patches with corporate logos on them, as well as several unnecessary looking flaps and pockets for effect." + icon = 'mods/content/corporate/icons/clothing/under/pilot_heph.dmi' + +/obj/item/clothing/jumpsuit/work name = "beige and green coveralls" desc = "A pair of beige coveralls made of a strong, canvas-like fabric." icon = 'mods/content/corporate/icons/clothing/under/work.dmi' armor = list( ARMOR_MELEE = ARMOR_MELEE_MINOR, ARMOR_BIO = ARMOR_BIO_MINOR - ) + ) -/obj/item/clothing/under/pilot - name = "green flight suit" - desc = "A sleek green Expeditionary Corps Organisation flight suit. It proudly sports three different patches with corporate logos on them, as well as several unnecessary looking flaps and pockets for effect." - icon = 'mods/content/corporate/icons/clothing/under/pilot.dmi' - -/obj/item/clothing/under/work/nanotrasen +/obj/item/clothing/jumpsuit/work/nanotrasen name = "beige and red coveralls" icon = 'mods/content/corporate/icons/clothing/under/work_nt.dmi' -/obj/item/clothing/under/pilot/nanotrasen - name = "red flight suit" - desc = "A sleek red NanoTrasen flight suit. It proudly sports three different patches with corporate logos on them, as well as several unnecessary looking flaps and pockets for effect." - icon = 'mods/content/corporate/icons/clothing/under/pilot_nt.dmi' - -/obj/item/clothing/under/work/heph +/obj/item/clothing/jumpsuit/work/heph name = "grey and cyan coveralls" icon = 'mods/content/corporate/icons/clothing/under/work_heph.dmi' -/obj/item/clothing/under/pilot/heph - name = "cyan flight suit" - desc = "A sleek cyan Hephaestus Industries flight suit. It proudly sports three different patches with corporate logos on them, as well as several unnecessary looking flaps and pockets for effect." - icon = 'mods/content/corporate/icons/clothing/under/pilot_heph.dmi' - //Zeng-Hu -/obj/item/clothing/under/work/zeng +/obj/item/clothing/jumpsuit/work/zeng name = "beige and gold coveralls" icon = 'mods/content/corporate/icons/clothing/under/work_zeng.dmi' -/obj/item/clothing/under/grayson +/obj/item/clothing/costume/grayson name = "\improper Grayson overalls" desc = "A set of overalls belonging to Grayson Manufactories, a manufacturing and mining company." icon = 'mods/content/corporate/icons/clothing/under/grayson.dmi' -/obj/item/clothing/under/dais +/obj/item/clothing/costume/dais name = "\improper Deimos Advanced Information Systems uniform" desc = "The uniform of Deimos Advanced Information Systems, an IT company." icon = 'mods/content/corporate/icons/clothing/under/dais.dmi' -/obj/item/clothing/under/mbill +/obj/item/clothing/costume/mbill name = "\improper Major Bill's uniform" desc = "A uniform belonging to Major Bill's Transportation, a major shipping company." icon = 'mods/content/corporate/icons/clothing/under/mbill.dmi' -/obj/item/clothing/under/morpheus +/obj/item/clothing/costume/morpheus name = "\improper Morpheus Cyberkinetics uniform" desc = "A pair of overalls belonging to Morpheus Cyberkinetics, an IPC manufacturing company. It doesn't look like it would be comfortable on a human." icon = 'mods/content/corporate/icons/clothing/under/morpheus.dmi' -/obj/item/clothing/under/skinner +/obj/item/clothing/costume/skinner name = "\improper Skinner Catering uniform" desc = "A uniform belonging to Skinner's Catering, a dining company." icon = 'mods/content/corporate/icons/clothing/under/skinner.dmi' -/obj/item/clothing/under/saare +/obj/item/clothing/costume/saare name = "\improper SAARE uniform" desc = "A uniform belonging to Strategic Assault and Asset Retention Enterprises, a minor private military corporation." icon = 'mods/content/corporate/icons/clothing/under/saare.dmi' diff --git a/mods/content/corporate/datum/antagonists/commando.dm b/mods/content/corporate/datum/antagonists/commando.dm index 3c82b59bc56..0dedc60c130 100644 --- a/mods/content/corporate/datum/antagonists/commando.dm +++ b/mods/content/corporate/datum/antagonists/commando.dm @@ -17,7 +17,7 @@ name = "Special Role - Mercenary Commando" l_ear = /obj/item/radio/headset/mercenary/commando id_type = /obj/item/card/id/centcom/ERT - uniform = /obj/item/clothing/under/syndicate + uniform = /obj/item/clothing/pants/casual/camo/outfit shoes = /obj/item/clothing/shoes/jackboots/swat glasses = /obj/item/clothing/glasses/thermal mask = /obj/item/clothing/mask/gas/syndicate diff --git a/mods/content/corporate/datum/antagonists/deathsquad.dm b/mods/content/corporate/datum/antagonists/deathsquad.dm index c9ebb345ee9..52f32595abb 100644 --- a/mods/content/corporate/datum/antagonists/deathsquad.dm +++ b/mods/content/corporate/datum/antagonists/deathsquad.dm @@ -42,11 +42,11 @@ /decl/hierarchy/outfit/commando/leader name = "Special Role - Deathsquad Leader" - uniform = /obj/item/clothing/under/centcom_officer + uniform = /obj/item/clothing/costume/centcom_officer l_pocket = /obj/item/pinpointer r_pocket = /obj/item/disk/nuclear -/decl/special_role/deathsquad/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/deathsquad/equip_role(var/mob/living/human/player) if (player.mind == leader) default_outfit = /decl/hierarchy/outfit/commando/leader else @@ -74,12 +74,11 @@ player.current.real_name = player.name player.current.SetName(player.current.name) - var/mob/living/carbon/human/H = player.current + var/mob/living/human/H = player.current if(istype(H)) var/decl/pronouns/pronouns = pick(H.species.available_pronouns) H.set_gender(pronouns.name) H.set_age(rand(25,45)) - H.dna.ready_dna(H) /decl/special_role/deathsquad/create_antagonist() if(..() && !deployed) diff --git a/mods/content/corporate/datum/loadout.dm b/mods/content/corporate/datum/loadout.dm index 78ef934828f..bd9021edf75 100644 --- a/mods/content/corporate/datum/loadout.dm +++ b/mods/content/corporate/datum/loadout.dm @@ -43,34 +43,34 @@ /obj/item/clothing/jumpsuit/aether, /obj/item/clothing/jumpsuit/hephaestus, /obj/item/clothing/jumpsuit/wardt, + /obj/item/clothing/jumpsuit/pcrc, /obj/item/clothing/jumpsuit/focal ) /decl/loadout_option/uniform/corporate name = "corporate uniform selection" - path = /obj/item/clothing/under + path = /obj/item/clothing/costume /decl/loadout_option/uniform/corporate/get_gear_tweak_options() . = ..() LAZYINITLIST(.[/datum/gear_tweak/path/specified_types_list]) .[/datum/gear_tweak/path/specified_types_list] |= list( - /obj/item/clothing/under/mbill, - /obj/item/clothing/under/saare, - /obj/item/clothing/under/pcrc, - /obj/item/clothing/under/grayson, - /obj/item/clothing/under/morpheus, - /obj/item/clothing/under/skinner, - /obj/item/clothing/under/dais + /obj/item/clothing/costume/mbill, + /obj/item/clothing/costume/saare, + /obj/item/clothing/costume/grayson, + /obj/item/clothing/costume/morpheus, + /obj/item/clothing/costume/skinner, + /obj/item/clothing/costume/dais ) /decl/loadout_option/uniform/corp_overalls name = "corporate colours, coveralls" - path = /obj/item/clothing/under/work + path = /obj/item/clothing/jumpsuit/work loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/uniform/corp_flight name = "corporate colours, flight suit" - path = /obj/item/clothing/under/pilot + path = /obj/item/clothing/jumpsuit/pilot loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/uniform/corp_exec_shirt diff --git a/mods/content/corporate/datum/robolimbs.dm b/mods/content/corporate/datum/robolimbs.dm index 2b72d5a2089..b14da8cfd55 100644 --- a/mods/content/corporate/datum/robolimbs.dm +++ b/mods/content/corporate/datum/robolimbs.dm @@ -132,8 +132,8 @@ DEFINE_ROBOLIMB_DESIGNS(/decl/bodytype/prosthetic/xion, xion) DEFINE_ROBOLIMB_DESIGNS(/decl/bodytype/prosthetic/economy, wardtakahashi) DEFINE_ROBOLIMB_DESIGNS(/decl/bodytype/prosthetic/bishop, bishop) -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/shellguard, shellguard, 0) -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/nanotrasen, nanotrasen, 0) -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/xion, xion, 0) -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/economy, wardtakahashi, 0) -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/bishop, bishop, 0) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/shellguard, shellguard, 0) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/nanotrasen, nanotrasen, 0) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/xion, xion, 0) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/economy, wardtakahashi, 0) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/bishop, bishop, 0) diff --git a/mods/content/dungeon_loot/_dungeon_loot.dme b/mods/content/dungeon_loot/_dungeon_loot.dme index a45ad415641..18e66276b2f 100644 --- a/mods/content/dungeon_loot/_dungeon_loot.dme +++ b/mods/content/dungeon_loot/_dungeon_loot.dme @@ -1,9 +1,10 @@ #ifndef MODPACK_DUNGEON_LOOT #define MODPACK_DUNGEON_LOOT -// BEGIN INCLUDE +// BEGIN_INCLUDE #include "_dungeon_loot.dm" #include "loot_pile.dm" -#include "subtypes/exosuit.dm" -#include "subtypes/maint.dm" -#include "subtypes/surface.dm" +#include "subtypes\exosuit.dm" +#include "subtypes\maint.dm" +#include "subtypes\surface.dm" +// END_INCLUDE #endif diff --git a/mods/content/dungeon_loot/subtypes/maint.dm b/mods/content/dungeon_loot/subtypes/maint.dm index 9dd317f4eb8..cebd11d1c65 100644 --- a/mods/content/dungeon_loot/subtypes/maint.dm +++ b/mods/content/dungeon_loot/subtypes/maint.dm @@ -66,9 +66,9 @@ /obj/item/clothing/suit/jacket/leather, /obj/item/clothing/suit/apron, /obj/item/clothing/jumpsuit/grey, - /obj/item/clothing/under/syndicate/tacticool, + /obj/item/clothing/shirt/syndicate/tacticool, /obj/item/clothing/pants/casual/camo, - /obj/item/clothing/under/harness, + /obj/item/clothing/shirt/harness, /obj/item/clothing/webbing, /obj/item/cash/c1, /obj/item/cash/c10, diff --git a/mods/content/fantasy/_fantasy.dme b/mods/content/fantasy/_fantasy.dme index b8a389b8f58..5242af7c3d4 100644 --- a/mods/content/fantasy/_fantasy.dme +++ b/mods/content/fantasy/_fantasy.dme @@ -1,31 +1,33 @@ #ifndef MODPACK_FANTASY_SPECIES #define MODPACK_FANTASY_SPECIES +// BEGIN_INCLUDE #include "_fantasy.dm" -#include "datum/cultures.dm" -#include "datum/currencies.dm" -#include "datum/factions.dm" -#include "datum/locations.dm" -#include "datum/outfits.dm" -#include "datum/overrides.dm" -#include "datum/species.dm" -#include "datum/hnoll/bodytypes.dm" -#include "datum/hnoll/culture.dm" -#include "datum/hnoll/language.dm" -#include "datum/hnoll/markings.dm" -#include "datum/hnoll/organs.dm" -#include "datum/hnoll/species.dm" -#include "datum/kobaloi/bodytypes.dm" -#include "datum/kobaloi/clothing.dm" -#include "datum/kobaloi/culture.dm" -#include "datum/kobaloi/language.dm" -#include "datum/kobaloi/markings.dm" -#include "datum/kobaloi/organs.dm" -#include "datum/kobaloi/species.dm" -#include "items/clothing/_loadout.dm" -#include "items/clothing/_recipes.dm" -#include "items/clothing/armor.dm" -#include "items/clothing/jerkin.dm" -#include "items/clothing/loincloth.dm" -#include "items/clothing/overrides.dm" -#include "items/clothing/trousers.dm" +#include "datum\cultures.dm" +#include "datum\currencies.dm" +#include "datum\factions.dm" +#include "datum\locations.dm" +#include "datum\outfits.dm" +#include "datum\overrides.dm" +#include "datum\species.dm" +#include "datum\hnoll\bodytypes.dm" +#include "datum\hnoll\culture.dm" +#include "datum\hnoll\language.dm" +#include "datum\hnoll\markings.dm" +#include "datum\hnoll\organs.dm" +#include "datum\hnoll\species.dm" +#include "datum\kobaloi\bodytypes.dm" +#include "datum\kobaloi\clothing.dm" +#include "datum\kobaloi\culture.dm" +#include "datum\kobaloi\language.dm" +#include "datum\kobaloi\markings.dm" +#include "datum\kobaloi\organs.dm" +#include "datum\kobaloi\species.dm" +#include "items\clothing\_loadout.dm" +#include "items\clothing\_recipes.dm" +#include "items\clothing\armor.dm" +#include "items\clothing\jerkin.dm" +#include "items\clothing\loincloth.dm" +#include "items\clothing\overrides.dm" +#include "items\clothing\trousers.dm" +// END_INCLUDE #endif diff --git a/mods/content/fantasy/datum/hnoll/bodytypes.dm b/mods/content/fantasy/datum/hnoll/bodytypes.dm index ef9c8a3eaae..1afcab6224b 100644 --- a/mods/content/fantasy/datum/hnoll/bodytypes.dm +++ b/mods/content/fantasy/datum/hnoll/bodytypes.dm @@ -8,6 +8,7 @@ bandages_icon = 'icons/mob/bandage.dmi' eye_icon = 'mods/content/fantasy/icons/hnoll/eyes.dmi' cosmetics_icon = 'mods/content/fantasy/icons/hnoll/cosmetics.dmi' + skeletal_icon = 'mods/content/fantasy/icons/hnoll/skeleton.dmi' health_hud_intensity = 1.75 bodytype_flag = BODY_FLAG_HNOLL appearance_flags = HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR diff --git a/mods/content/fantasy/datum/hnoll/language.dm b/mods/content/fantasy/datum/hnoll/language.dm index 4ade4417fed..2cefb494174 100644 --- a/mods/content/fantasy/datum/hnoll/language.dm +++ b/mods/content/fantasy/datum/hnoll/language.dm @@ -1,5 +1,6 @@ /decl/language/hnoll name = "Hnoll Tongue" + shorthand = "HN" desc = "While every hnoll culture across the Nine Mothers and beyond has their own \ local dialect, the matriarches over the years have taken great care to cultivate and \ maintain a shared tongue used at the yearly gatherings and for inter-settlement trade. \ diff --git a/mods/content/fantasy/datum/hnoll/species.dm b/mods/content/fantasy/datum/hnoll/species.dm index ea9f5280d58..60218e40fbe 100644 --- a/mods/content/fantasy/datum/hnoll/species.dm +++ b/mods/content/fantasy/datum/hnoll/species.dm @@ -75,5 +75,5 @@ /decl/emote/visible/tail/stopsway ) -/decl/species/hnoll/handle_additional_hair_loss(var/mob/living/carbon/human/H, var/defer_body_update = TRUE) +/decl/species/hnoll/handle_additional_hair_loss(var/mob/living/human/H, var/defer_body_update = TRUE) . = H?.set_skin_colour(rgb(189, 171, 143)) diff --git a/mods/content/fantasy/datum/kobaloi/bodytypes.dm b/mods/content/fantasy/datum/kobaloi/bodytypes.dm index 18f4c5d35ef..4c6e14631b8 100644 --- a/mods/content/fantasy/datum/kobaloi/bodytypes.dm +++ b/mods/content/fantasy/datum/kobaloi/bodytypes.dm @@ -6,6 +6,7 @@ icon_base = 'mods/content/fantasy/icons/kobaloi/body.dmi' icon_deformed = 'mods/content/fantasy/icons/kobaloi/body.dmi' eye_icon = 'mods/content/fantasy/icons/kobaloi/eyes.dmi' + skeletal_icon = 'mods/content/fantasy/icons/kobaloi/skeleton.dmi' base_color = "#8f974a" base_eye_color = "#d95763" bodytype_flag = BODY_FLAG_KOBALOI diff --git a/mods/content/fantasy/datum/kobaloi/language.dm b/mods/content/fantasy/datum/kobaloi/language.dm index 880741b0de9..c4f4f714d1b 100644 --- a/mods/content/fantasy/datum/kobaloi/language.dm +++ b/mods/content/fantasy/datum/kobaloi/language.dm @@ -1,5 +1,6 @@ /decl/language/kobaloi name = "Kobaloi Tongue" + shorthand = "KB" desc = "The kobaloi have a huge variety of languages, sometimes differing even between groups in the same cave system, but all of them have some degree of overlap to allow mutual intelligibility." speech_verb = "says" ask_verb = "asks" diff --git a/mods/content/fantasy/icons/hnoll/skeleton.dmi b/mods/content/fantasy/icons/hnoll/skeleton.dmi new file mode 100644 index 00000000000..5dab29a2a5f Binary files /dev/null and b/mods/content/fantasy/icons/hnoll/skeleton.dmi differ diff --git a/mods/content/fantasy/icons/kobaloi/skeleton.dmi b/mods/content/fantasy/icons/kobaloi/skeleton.dmi new file mode 100644 index 00000000000..af27d46a6b5 Binary files /dev/null and b/mods/content/fantasy/icons/kobaloi/skeleton.dmi differ diff --git a/mods/content/fantasy/items/clothing/_loadout.dm b/mods/content/fantasy/items/clothing/_loadout.dm index 001e8c59987..420b62571b4 100644 --- a/mods/content/fantasy/items/clothing/_loadout.dm +++ b/mods/content/fantasy/items/clothing/_loadout.dm @@ -64,6 +64,10 @@ path = /obj/item/clothing/suit/robe slot = slot_wear_suit_str +/decl/loadout_option/fantasy/suit/mantle + name = "mantle" + path = /obj/item/clothing/suit/mantle + /decl/loadout_option/fantasy/suit/cloak name = "cloak" path = /obj/item/clothing/suit/cloak @@ -129,6 +133,23 @@ /decl/material/solid/organic/wood/walnut ) + +/decl/loadout_option/fantasy/neck + abstract_type = /decl/loadout_option/fantasy/neck + slot = slot_wear_mask_str + + +/decl/loadout_option/fantasy/neck/prayer_beads + name = "prayer beads" + path = /obj/item/clothing/neck/necklace/prayer_beads + available_materials = list( + /decl/material/solid/organic/bone, + /decl/material/solid/stone/marble, + /decl/material/solid/stone/basalt, + /decl/material/solid/organic/wood/mahogany, + /decl/material/solid/organic/wood/ebony + ) + /decl/loadout_category/fantasy/utility name = "Utility" diff --git a/mods/content/generic_shuttles/_generic_shuttles.dme b/mods/content/generic_shuttles/_generic_shuttles.dme index 79827a3486e..c77cee5daa9 100644 --- a/mods/content/generic_shuttles/_generic_shuttles.dme +++ b/mods/content/generic_shuttles/_generic_shuttles.dme @@ -1,5 +1,7 @@ #ifndef MODPACK_GENERIC_SHUTTLES #define MODPACK_GENERIC_SHUTTLES +// BEGIN_INCLUDE #include "_generic_shuttles.dm" -#include "tanker/tanker.dm" +#include "tanker\tanker.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/content/government/_government.dme b/mods/content/government/_government.dme index 62ec2d0408c..61285936c78 100644 --- a/mods/content/government/_government.dme +++ b/mods/content/government/_government.dme @@ -1,6 +1,6 @@ #ifndef MODPACK_GOVERNMENT #define MODPACK_GOVERNMENT -// BEGIN INCLUDE +// BEGIN_INCLUDE #include "government.dm" #include "datum\ai_holo.dm" #include "datum\ai_laws.dm" @@ -8,5 +8,5 @@ #include "items\cups.dm" #include "items\documents.dm" #include "ruins\ec_old_crash\ec_old_crash.dm" -#endif // END_INCLUDE +#endif diff --git a/mods/content/government/away_sites/icarus/icarus-1.dmm b/mods/content/government/away_sites/icarus/icarus-1.dmm index ec86ed80425..5e8ae63d89a 100644 --- a/mods/content/government/away_sites/icarus/icarus-1.dmm +++ b/mods/content/government/away_sites/icarus/icarus-1.dmm @@ -724,7 +724,6 @@ "cD" = ( /obj/structure/closet, /obj/random/smokes, -/obj/item/clothing/under/ec_uniform, /turf/floor/tiled, /area/icarus/vessel) "cE" = ( @@ -735,7 +734,7 @@ /area/icarus/vessel) "cF" = ( /obj/structure/closet, -/obj/item/clothing/under/harness, +/obj/item/clothing/shirt/harness, /turf/floor/tiled, /area/icarus/vessel) "cG" = ( @@ -758,7 +757,6 @@ /area/icarus/vessel) "cJ" = ( /obj/structure/closet, -/obj/item/clothing/under/ec_uniform, /turf/floor/tiled, /area/icarus/vessel) "cK" = ( @@ -873,7 +871,6 @@ "db" = ( /obj/structure/closet, /obj/random/drinkbottle, -/obj/item/clothing/under/ec_uniform, /turf/floor/tiled, /area/icarus/vessel) "dc" = ( @@ -962,7 +959,9 @@ "dp" = ( /obj/structure/closet, /obj/random/glasses, -/obj/item/clothing/under/blazer, +/obj/item/clothing/shirt/button, +/obj/item/clothing/neck/tie/navy, +/obj/item/clothing/suit/jacket/blazer, /turf/floor/tiled, /area/icarus/vessel) "dq" = ( @@ -1004,7 +1003,6 @@ "dx" = ( /obj/structure/closet, /obj/random/shoes, -/obj/item/clothing/under/ec_uniform, /turf/floor/tiled, /area/icarus/vessel) "dy" = ( diff --git a/mods/content/government/away_sites/icarus/icarus.dm b/mods/content/government/away_sites/icarus/icarus.dm index c05dc5a6c3a..bd1b5e57584 100644 --- a/mods/content/government/away_sites/icarus/icarus.dm +++ b/mods/content/government/away_sites/icarus/icarus.dm @@ -164,11 +164,6 @@ icon = 'mods/content/government/away_sites/icarus/icarus_sprites.dmi' icon_state = "solgovseal" -/obj/item/clothing/under/ec_uniform - name = "expeditionary uniform" - desc = "An older model of the utility uniform of the SCG Expeditionary Corps. It has a patch on the left sleeve signifying the wearer served on the SEV Icarus." - icon = 'icons/clothing/under/uniform_ec.dmi' - /obj/structure/sign/double/solgovflag name = "Sol Central Government Flag" desc = "The iconic flag of the Sol Central Government, a symbol with many different meanings." diff --git a/mods/content/matchmaking/_matchmaking.dme b/mods/content/matchmaking/_matchmaking.dme index a619db79f3d..e40cde1f5f0 100644 --- a/mods/content/matchmaking/_matchmaking.dme +++ b/mods/content/matchmaking/_matchmaking.dme @@ -1,7 +1,9 @@ #ifndef CONTENT_PACK_MATCHMAKING #define CONTENT_PACK_MATCHMAKING -#include "matchmaking.dm" +// BEGIN_INCLUDE #include "matchmaker.dm" -#include "relations_types.dm" +#include "matchmaking.dm" #include "relations.dm" +#include "relations_types.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/content/matchmaking/matchmaker.dm b/mods/content/matchmaking/matchmaker.dm index 9509e7ccff1..3dbf0f2ff3d 100644 --- a/mods/content/matchmaking/matchmaker.dm +++ b/mods/content/matchmaking/matchmaker.dm @@ -151,10 +151,10 @@ var/global/datum/matchmaker/matchmaker = new() if(other && other.finalized) to_chat(holder.current,"Your connection with [other.holder] is now confirmed!") to_chat(other.holder.current,"Your connection with [holder] is now confirmed!") - var/list/candidates = filter_list(global.player_list, /mob/living/carbon/human) + var/list/candidates = filter_list(global.player_list, /mob/living/human) candidates -= holder.current candidates -= other.holder.current - for(var/mob/living/carbon/human/M in candidates) + for(var/mob/living/human/M in candidates) if(!M.mind || M.stat == DEAD || !valid_candidate(M.mind)) candidates -= M continue @@ -193,11 +193,11 @@ var/global/datum/matchmaker/matchmaker = new() for(var/datum/relation/R in relations) dat += "[R.other.finalized ? "\[F\] " : ""][R.other.holder], [R.other.holder.role_alt_title ? R.other.holder.role_alt_title : R.other.holder.assigned_role]." if (!R.finalized) - dat += " Remove" + dat += " Remove" editable = 1 dat += "
    [R.desc]" dat += "
    " - dat += "Things they know about you:[!R.finalized ?"Edit" : ""]
    [R.info ? "[R.info]" : " Nothing specific."]" + dat += "Things they know about you:[!R.finalized ?"Edit" : ""]
    [R.info ? "[R.info]" : " Nothing specific."]" if(R.other.info) dat += "
    Things you know about them:
    [R.other.info]
    [R.other.holder.gen_relations_info]" dat += "
    " @@ -209,7 +209,7 @@ var/global/datum/matchmaker/matchmaker = new() var/datum/browser/popup = new(usr, "relations", "Relationship Info") if(editable) - dat.Insert(1,"Finalize edits and close
    ") + dat.Insert(1,"Finalize edits and close
    ") popup.set_window_options("focus=0;can_close=0;can_minimize=1;can_maximize=0;can_resize=1;titlebar=1;") popup.set_content(jointext(dat,null)) popup.open() diff --git a/mods/content/matchmaking/relations.dm b/mods/content/matchmaking/relations.dm index 51d4c76e4d6..74e11a360d2 100644 --- a/mods/content/matchmaking/relations.dm +++ b/mods/content/matchmaking/relations.dm @@ -29,7 +29,7 @@ .=list() . += "Characters with enabled relations are paired up randomly after spawn. You can terminate relations when you first open relations info window, but after that it's final." . += "
    " - . += "
    What do they know about you? This is the general info that all kinds of your connections would know. Edit" + . += "
    What do they know about you? This is the general info that all kinds of your connections would know. Edit" . += "
    [pref.relations_info["general"] ? pref.relations_info["general"] : "Nothing specific."]" . += "
    " for(var/T in subtypesof(/datum/relation)) @@ -37,12 +37,12 @@ . += "[initial(R.name)]\t" if(initial(R.name) in pref.relations) . += "On" - . += "Off" + . += "Off" else - . += "On" + . += "On" . += "Off" . += "
    [initial(R.desc)]" - . += "
    What do they know about you?Edit" + . += "
    What do they know about you?Edit" . += "
    [pref.relations_info[initial(R.name)] ? pref.relations_info[initial(R.name)] : "Nothing specific."]" . += "
    " . = jointext(.,null) diff --git a/mods/content/matchmaking/relations_types.dm b/mods/content/matchmaking/relations_types.dm index 7a6f7bf6be4..f9a076402e0 100644 --- a/mods/content/matchmaking/relations_types.dm +++ b/mods/content/matchmaking/relations_types.dm @@ -15,11 +15,11 @@ /datum/relation/kid_friend/get_candidates() var/list/creche = ..() - var/mob/living/carbon/human/holdermob = holder.current + var/mob/living/human/holdermob = holder.current if(istype(holdermob)) for(var/datum/relation/kid in creche) - var/mob/living/carbon/human/kidmob = kid.holder.current + var/mob/living/human/kidmob = kid.holder.current if(!istype(kidmob)) continue if(abs(holdermob.get_age() - kidmob.get_age()) > 3) @@ -93,10 +93,10 @@ /datum/relation/spessnam/get_candidates() var/list/warbuds = ..() var/list/branchmates = list() - var/mob/living/carbon/human/holdermob = holder.current + var/mob/living/human/holdermob = holder.current if(istype(holdermob) && global.using_map && (global.using_map.flags & MAP_HAS_BRANCH)) for(var/datum/relation/buddy in warbuds) - var/mob/living/carbon/human/buddymob = buddy.holder.current + var/mob/living/human/buddymob = buddy.holder.current if(!istype(buddymob)) continue if(holdermob.char_branch == buddymob.char_branch) diff --git a/mods/content/mouse_highlights/_mouse_highlight.dme b/mods/content/mouse_highlights/_mouse_highlight.dme index 1d2fa36844b..a4cb9ea9d6a 100644 --- a/mods/content/mouse_highlights/_mouse_highlight.dme +++ b/mods/content/mouse_highlights/_mouse_highlight.dme @@ -1,6 +1,8 @@ #ifndef CONTENT_PACK_MOUSEOVER #define CONTENT_PACK_MOUSEOVER +// BEGIN_INCLUDE #include "mouse_highlight.dm" #include "mouse_highlight_client.dm" #include "mouse_highlight_prefs.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/content/mouse_highlights/mouse_highlight_prefs.dm b/mods/content/mouse_highlights/mouse_highlight_prefs.dm index eaf4daab8eb..756c25c98df 100644 --- a/mods/content/mouse_highlights/mouse_highlight_prefs.dm +++ b/mods/content/mouse_highlights/mouse_highlight_prefs.dm @@ -8,7 +8,7 @@ var/global/const/PREF_SHOW_HOLD_SHIFT = "While Holding Shift" /datum/category_item/player_setup_item/player_global/ui/OnTopic(var/href,var/list/href_list, var/mob/user) . = ..() if(.) - return + return if(href_list["select_mouseover_color"]) var/UI_mouseover_color_new = input(user, "Choose mouseover color, dark colors are not recommended!", "Global Preference", pref.UI_mouseover_color) as color|null if(isnull(UI_mouseover_color_new) || !CanUseTopic(user)) return TOPIC_NOACTION @@ -27,11 +27,11 @@ var/global/const/PREF_SHOW_HOLD_SHIFT = "While Holding Shift" /datum/category_item/player_setup_item/player_global/ui/get_ui_table(var/mob/user) . = ..() || list() . += "UI Mouseover Color" - . += "[pref.UI_mouseover_color]" + . += "[pref.UI_mouseover_color]" . += "
    __
    " - . += "reset" + . += "reset" . += "" . += "UI Mouseover Opacity" - . += "[pref.UI_mouseover_alpha]" - . += "reset" + . += "[pref.UI_mouseover_alpha]" + . += "reset" . += "" diff --git a/mods/content/pheromones/_pheromones.dme b/mods/content/pheromones/_pheromones.dme index 2cf997f8787..fecc8b376dd 100644 --- a/mods/content/pheromones/_pheromones.dme +++ b/mods/content/pheromones/_pheromones.dme @@ -1,8 +1,10 @@ #ifndef MODPACK_PHEROMONES #define MODPACK_PHEROMONES +// BEGIN_INCLUDE #include "_pheromones.dm" #include "pheromone_effect.dm" #include "pheromone_emotes.dm" #include "pheromone_implant.dm" #include "pheromone_mob.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/content/pheromones/pheromone_effect.dm b/mods/content/pheromones/pheromone_effect.dm index a894ce433a1..46e03dc1d8a 100644 --- a/mods/content/pheromones/pheromone_effect.dm +++ b/mods/content/pheromones/pheromone_effect.dm @@ -34,7 +34,7 @@ if(!marker) return for(var/client/C) - var/mob/living/carbon/human/H = C.mob + var/mob/living/human/H = C.mob if(istype(H) && H.can_read_pheromones()) C.images -= marker var/datum/extension/scent/custom/pheromone/smell = get_extension(src, /datum/extension/scent) @@ -46,7 +46,7 @@ marker.filters = filter(type="drop_shadow", color = color + "F0", size = 2, offset = 1, x = 0, y = 0) global.pheromone_markers |= marker for(var/client/C) - var/mob/living/carbon/human/H = C.mob + var/mob/living/human/H = C.mob if(istype(H) && H.can_read_pheromones()) C.images |= marker diff --git a/mods/content/pheromones/pheromone_emotes.dm b/mods/content/pheromones/pheromone_emotes.dm index c7c96755a9e..86d16a40003 100644 --- a/mods/content/pheromones/pheromone_emotes.dm +++ b/mods/content/pheromones/pheromone_emotes.dm @@ -13,6 +13,12 @@ self_smell_descriptor = "distressing" scent_color = COLOR_RED +/decl/emote/pheromone/pain + key = "scentpain" + smell_message = "PAIN" + self_smell_descriptor = "distressing" + scent_color = COLOR_RED + /decl/emote/pheromone/calm key = "scentcalm" smell_message = "calm" @@ -71,7 +77,7 @@ if(!T) return to_chat(user, SPAN_NOTICE("You emit the [self_smell_descriptor ? "[self_smell_descriptor] " : ""]scent of [smell_message].")) - for(var/mob/living/carbon/human/H in viewers(world.view, user)) + for(var/mob/living/human/H in viewers(world.view, user)) if(H != user && H.stat == CONSCIOUS && H.can_read_pheromones()) to_chat(H, SPAN_NOTICE("\The [user] emits the [self_smell_descriptor ? "[self_smell_descriptor] " : ""]scent of [smell_message].")) diff --git a/mods/content/psionics/_psionics.dm b/mods/content/psionics/_psionics.dm index 37937aecb23..9092fd88ae6 100644 --- a/mods/content/psionics/_psionics.dm +++ b/mods/content/psionics/_psionics.dm @@ -7,8 +7,8 @@ if(isliving(M)) var/datum/ability_handler/psionics/psi = M.get_ability_handler(/datum/ability_handler/psionics) if(psi) - . += "Remove psionics.

    " - . += "Trigger latencies.
    " + . += "Remove psionics.

    " + . += "Trigger latencies.
    " . += "" for(var/faculty in list(PSI_COERCION, PSI_PSYCHOKINESIS, PSI_REDACTION, PSI_ENERGISTICS)) var/decl/psionic_faculty/faculty_decl = SSpsi.get_faculty(faculty) @@ -18,14 +18,14 @@ var/psi_title = global.psychic_ranks_to_strings[i] if(i == faculty_rank) psi_title = "[psi_title]" - . += "" + . += "" . += "" . += "
    [psi_title][psi_title]
    " else . += "Only available for living mobs, sorry." . = jointext(., null) -/datum/preferences/copy_to(mob/living/carbon/human/character, is_preview_copy = FALSE) +/datum/preferences/copy_to(mob/living/human/character, is_preview_copy = FALSE) character = ..() var/datum/ability_handler/psionics/psi = !is_preview_copy && istype(character) && character.get_ability_handler(/datum/ability_handler/psionics) if(psi) diff --git a/mods/content/psionics/_psionics.dme b/mods/content/psionics/_psionics.dme index 53919e93eb0..7bf5f2f680d 100644 --- a/mods/content/psionics/_psionics.dme +++ b/mods/content/psionics/_psionics.dme @@ -53,6 +53,7 @@ #include "system\psionics\interface\ui.dm" #include "system\psionics\interface\ui_hub.dm" #include "system\psionics\interface\ui_toggles.dm" +#include "system\psionics\mob\borer_power.dm" #include "system\psionics\mob\mob.dm" #include "system\psionics\mob\mob_assay.dm" #include "system\psionics\mob\mob_interactions.dm" diff --git a/mods/content/psionics/datum/antagonists/foundation.dm b/mods/content/psionics/datum/antagonists/foundation.dm index 9e255a579a3..203595f01d5 100644 --- a/mods/content/psionics/datum/antagonists/foundation.dm +++ b/mods/content/psionics/datum/antagonists/foundation.dm @@ -25,7 +25,7 @@ default_outfit = /decl/hierarchy/outfit/foundation id_title = "Foundation Agent" -/decl/special_role/foundation/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/foundation/equip_role(var/mob/living/human/player) . = ..() if(.) player.set_psi_rank(PSI_REDACTION, 3, defer_update = TRUE) diff --git a/mods/content/psionics/datum/antagonists/paramount.dm b/mods/content/psionics/datum/antagonists/paramount.dm index 2d4f12c036d..3010cc5e9b9 100644 --- a/mods/content/psionics/datum/antagonists/paramount.dm +++ b/mods/content/psionics/datum/antagonists/paramount.dm @@ -16,14 +16,14 @@ /decl/hierarchy/outfit/paramount name = "Special Role - Paramount Grandmaster" head = /obj/item/clothing/head/helmet/space/psi_amp - uniform = /obj/item/clothing/under/psysuit + uniform = /obj/item/clothing/jumpsuit/psysuit suit = /obj/item/clothing/suit/wizrobe/psypurple shoes = /obj/item/clothing/shoes/jackboots back = /obj/item/backpack/satchel gloves = /obj/item/clothing/gloves/grey id_type = /obj/item/card/id/syndicate -/decl/special_role/paramount/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/paramount/equip_role(var/mob/living/human/player) . = ..() if(.) player.set_psi_rank(PSI_REDACTION, 3, defer_update = TRUE) diff --git a/mods/content/psionics/datum/chems.dm b/mods/content/psionics/datum/chems.dm index 55e292ac6a9..f302bc693c7 100644 --- a/mods/content/psionics/datum/chems.dm +++ b/mods/content/psionics/datum/chems.dm @@ -1,4 +1,4 @@ -/decl/material/liquid/crystal_agent/do_material_check(var/mob/living/carbon/M) +/decl/material/liquid/crystal_agent/do_material_check(var/mob/living/M) var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) . = (M.get_ability_handler(/datum/ability_handler/psionics) || (M.mind && wizards.is_antagonist(M.mind))) ? MAT_NULLGLASS : ..() @@ -13,18 +13,26 @@ required_reagents = list(/decl/material/liquid/blood = 15, /decl/material/liquid/crystal_agent = 1) result_amount = 1 +// TODO: #if defined(GAMEMODE_PACK_CULT) && defined(GAMEMODE_PACK_WIZARD) +// once wizard is modpacked +#ifdef GAMEMODE_PACK_CULT /decl/chemical_reaction/synthesis/nullglass/get_alternate_reaction_indicator(var/datum/reagents/holder) var/list/blood_data = REAGENT_DATA(holder, /decl/material/liquid/blood) var/weakref/donor_ref = LAZYACCESS(blood_data, "donor") var/mob/living/donor = donor_ref?.resolve() var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) . = (istype(donor) && (!!donor.get_ability_handler(/datum/ability_handler/psionics) || (donor.mind && wizards.is_antagonist(donor.mind)))) +#endif /decl/chemical_reaction/synthesis/nullglass/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(reaction_flags) + #ifdef GAMEMODE_PACK_CULT for(var/i = 1, i <= created_volume, i++) new /obj/item/soulstone(location) + #else + CRASH("Nullglass alternate reaction triggered in [holder.my_atom] without cult modpack loaded!") + #endif else for(var/i = 1, i <= created_volume*2, i++) new /obj/item/shard(location, /decl/material/solid/gemstone/crystal) \ No newline at end of file diff --git a/mods/content/psionics/datum/jobs.dm b/mods/content/psionics/datum/jobs.dm index 48f342be0fc..18b2adbf9c4 100644 --- a/mods/content/psionics/datum/jobs.dm +++ b/mods/content/psionics/datum/jobs.dm @@ -6,7 +6,7 @@ /datum/job/submap give_psionic_implant_on_join = FALSE -/datum/job/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(psi_latency_chance && prob(psi_latency_chance)) H.set_psi_rank(pick(PSI_COERCION, PSI_REDACTION, PSI_ENERGISTICS, PSI_PSYCHOKINESIS), 1, defer_update = TRUE) diff --git a/mods/content/psionics/items/cerebro_enhancers.dm b/mods/content/psionics/items/cerebro_enhancers.dm index 01c1bfc56d3..f58cc158b38 100644 --- a/mods/content/psionics/items/cerebro_enhancers.dm +++ b/mods/content/psionics/items/cerebro_enhancers.dm @@ -38,7 +38,7 @@ deintegrate() return - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(istype(H) && H.get_equipped_item(slot_head_str) == src) integrate() return @@ -76,7 +76,7 @@ if(canremove) return - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(!istype(H) || H.get_equipped_item(slot_head_str) != src) canremove = TRUE return @@ -107,7 +107,7 @@ var/lastloc = loc . = ..() if(.) - var/mob/living/carbon/human/H = lastloc + var/mob/living/human/H = lastloc if(istype(H)) var/datum/ability_handler/psionics/psi = H.get_ability_handler(/datum/ability_handler/psionics) psi?.reset() @@ -132,7 +132,7 @@ to_chat(usr, SPAN_NOTICE("You still have [max_boosted_faculties - LAZYLEN(boosted_faculties)] facult[LAZYLEN(boosted_faculties) == 1 ? "y" : "ies"] to select. Use \the [src] in-hand to select them.")) return - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(!istype(H) || H.get_equipped_item(slot_head_str) != src) to_chat(usr, SPAN_WARNING("\The [src] must be worn on your head in order to be activated.")) return diff --git a/mods/content/psionics/items/soulstone.dm b/mods/content/psionics/items/soulstone.dm index 610d6632b93..a206e6dad68 100644 --- a/mods/content/psionics/items/soulstone.dm +++ b/mods/content/psionics/items/soulstone.dm @@ -1,3 +1,4 @@ +#ifdef GAMEMODE_PACK_CULT /obj/item/soulstone/disrupts_psionics() . = !full ? src : FALSE @@ -11,3 +12,4 @@ if(. > 0) . = max(0, . - rand(2,5)) shatter() +#endif \ No newline at end of file diff --git a/mods/content/psionics/machines/psimeter.dm b/mods/content/psionics/machines/psimeter.dm index f74249580a9..22b1de43259 100644 --- a/mods/content/psionics/machines/psimeter.dm +++ b/mods/content/psionics/machines/psimeter.dm @@ -33,7 +33,7 @@ var/found for(var/mob/living/H in range(1, src)) found = TRUE - dat += "[H.name]Conduct Assay" + dat += "[H.name]Conduct Assay" if(!found) dat += "No candidates found." dat += "" diff --git a/mods/content/psionics/machines/psimonitor.dm b/mods/content/psionics/machines/psimonitor.dm index a194b5769ab..de83ed6b114 100644 --- a/mods/content/psionics/machines/psimonitor.dm +++ b/mods/content/psionics/machines/psimonitor.dm @@ -78,9 +78,9 @@ var/list/dat = list() dat += "

    Psi Dampener Monitor

    " if(authorized) - dat += "[authorized]Logout" + dat += "[authorized]Logout" else - dat += "Login" + dat += "Login" dat += "

    Active Psionic Dampeners


    " dat += "
    " @@ -93,21 +93,21 @@ if(implant.malfunction) dat += "" else - dat += "" + dat += "" dat += "" dat += "
    ERRORERROR[implant.overload]%[authorized ? "[implant.psi_mode]" : "[implant.psi_mode]"][implant.overload]%[authorized ? "[implant.psi_mode]" : "[implant.psi_mode]"]

    " if(show_violations) - dat += "

    Psionic Control Violations -


    " + dat += "

    Psionic Control Violations -


    " if(psi_violations.len) for(var/i = 1 to psi_violations.len) var/entry = psi_violations[i] - dat += "" + dat += "" else dat += "" dat += "

    [entry]
    [authorized ? "Remove" : ""]

    [entry]
    [authorized ? "Remove" : ""]
    None reported.

    " else - dat += "

    Psionic Control Violations +


    " + dat += "

    Psionic Control Violations +


    " var/datum/browser/written_digital/popup = new(user, "psi_monitor_\ref[src]", "Psi-Monitor") popup.set_content(jointext(dat,null)) diff --git a/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm b/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm index cc6463ff670..bf810cba7f9 100644 --- a/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm +++ b/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm @@ -84,7 +84,7 @@ // Your head asplode. owner.take_damage(value, BRAIN) if(ishuman(owner)) - var/mob/living/carbon/human/pop = owner + var/mob/living/human/pop = owner if(pop.should_have_organ(BP_BRAIN)) var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(pop, BP_BRAIN) if(sponge && sponge.damage >= sponge.max_damage) diff --git a/mods/content/psionics/system/psionics/complexus/complexus_process.dm b/mods/content/psionics/system/psionics/complexus/complexus_process.dm index 17dc1291403..13c6b7492a9 100644 --- a/mods/content/psionics/system/psionics/complexus/complexus_process.dm +++ b/mods/content/psionics/system/psionics/complexus/complexus_process.dm @@ -168,7 +168,7 @@ if(ishuman(owner)) - var/mob/living/carbon/human/H = owner + var/mob/living/human/H = owner // Fix some pain. if(heal_rate > 0) diff --git a/mods/content/psionics/system/psionics/events/mini_spasm.dm b/mods/content/psionics/system/psionics/events/mini_spasm.dm index cbf083b0195..fd130c723f0 100644 --- a/mods/content/psionics/system/psionics/events/mini_spasm.dm +++ b/mods/content/psionics/system/psionics/events/mini_spasm.dm @@ -34,12 +34,12 @@ set waitfor = FALSE if(isliving(victim) && !victim.isSynthetic()) - var/list/disabilities = list(NEARSIGHTED, EPILEPSY, TOURETTES, NERVOUS) - for(var/disability in disabilities) - if(victim.disabilities & disability) - disabilities -= disability - if(disabilities.len) - victim.disabilities |= pick(disabilities) + var/list/spasm_disabilities = list(GENE_COND_NEARSIGHTED, GENE_COND_EPILEPSY, GENE_COND_TOURETTES, GENE_COND_NERVOUS) + for(var/spasm_disability in spasm_disabilities) + if(victim.has_genetic_condition(spasm_disability)) + spasm_disabilities -= spasm_disability + if(length(spasm_disabilities)) + victim.add_genetic_condition(pick(spasm_disabilities)) var/datum/ability_handler/psionics/psi = victim.get_ability_handler(/datum/ability_handler/psionics) if(psi) diff --git a/mods/content/psionics/system/psionics/faculties/coercion.dm b/mods/content/psionics/system/psionics/faculties/coercion.dm index bc597cb3b7c..bd3f6de8da3 100644 --- a/mods/content/psionics/system/psionics/faculties/coercion.dm +++ b/mods/content/psionics/system/psionics/faculties/coercion.dm @@ -117,7 +117,7 @@ min_rank = PSI_RANK_MASTER use_description = "Target the arms or hands on disarm intent to use a ranged attack that may rip the weapons away from the target." -/decl/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/carbon/human/target) +/decl/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/human/target) if(!istype(target)) return FALSE diff --git a/mods/content/psionics/system/psionics/faculties/redaction.dm b/mods/content/psionics/system/psionics/faculties/redaction.dm index e427fd96945..97354f41a05 100644 --- a/mods/content/psionics/system/psionics/faculties/redaction.dm +++ b/mods/content/psionics/system/psionics/faculties/redaction.dm @@ -46,7 +46,7 @@ min_rank = PSI_RANK_OPERANT use_description = "Target a patient while on help intent at melee range to mend a variety of maladies, such as bleeding or broken bones. Higher ranks in this faculty allow you to mend a wider range of problems." -/decl/psionic_power/redaction/mend/invoke(var/mob/living/user, var/mob/living/carbon/human/target) +/decl/psionic_power/redaction/mend/invoke(var/mob/living/user, var/mob/living/human/target) if(!istype(user) || !istype(target)) return FALSE . = ..() @@ -129,7 +129,7 @@ min_rank = PSI_RANK_GRANDMASTER use_description = "Target a patient while on help intent at melee range to cleanse radiation and genetic damage from a patient." -/decl/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/carbon/human/target) +/decl/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/human/target) if(!istype(user) || !istype(target)) return FALSE . = ..() diff --git a/mods/content/psionics/system/psionics/mob/borer_power.dm b/mods/content/psionics/system/psionics/mob/borer_power.dm index 4e17326877f..b48874f08e8 100644 --- a/mods/content/psionics/system/psionics/mob/borer_power.dm +++ b/mods/content/psionics/system/psionics/mob/borer_power.dm @@ -1,12 +1,8 @@ +#ifdef CONTENT_PACK_BORERS /mob/living/simple_animal/borer var/image/aura_image /mob/living/simple_animal/borer/Initialize(var/mapload, var/gen=1) - - if(!SSmodpacks.loaded_modpacks["Cortical Borers"]) // Borer module not included. - log_debug("Attempted spawn of stubbed mobtype [type].") - return INITIALIZE_HINT_QDEL - . = ..() aura_image = create_aura_image(src) aura_image.color = "#aaffaa" @@ -57,3 +53,4 @@ set_ability_cooldown(15 SECONDS) return TRUE +#endif \ No newline at end of file diff --git a/mods/content/psionics/system/psionics/mob/mob.dm b/mods/content/psionics/system/psionics/mob/mob.dm index 2f7e98bb5b1..e51d5aeedae 100644 --- a/mods/content/psionics/system/psionics/mob/mob.dm +++ b/mods/content/psionics/system/psionics/mob/mob.dm @@ -29,7 +29,7 @@ return TRUE return FALSE -/mob/living/carbon/human/check_shields(var/damage = 0, var/atom/damage_source = null, var/mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") +/mob/living/human/check_shields(var/damage = 0, var/atom/damage_source = null, var/mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") var/obj/item/projectile/P = damage_source var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) if(istype(P) && !P.disrupts_psionics() && psi && P.starting && prob(psi.get_armour(SSmaterials.get_armor_key(P.atom_damage_type, P.damage_flags())) * 0.5) && psi.spend_power(round(damage/10))) @@ -38,7 +38,7 @@ return PROJECTILE_FORCE_MISS . = ..() -/mob/living/carbon/get_cuff_breakout_mod() +/mob/living/get_cuff_breakout_mod() . = ..() var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) if(psi) @@ -48,7 +48,7 @@ var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) . = (psi && psi.can_use() && psi.get_rank(PSI_PSYCHOKINESIS) >= PSI_RANK_PARAMOUNT) -/mob/living/carbon/get_special_resist_time() +/mob/living/get_special_resist_time() . = ..() var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) if(psi && psi.can_use()) diff --git a/mods/content/psionics/system/psionics/mob/mob_assay.dm b/mods/content/psionics/system/psionics/mob/mob_assay.dm index c0b05f74596..ad655cae3bd 100644 --- a/mods/content/psionics/system/psionics/mob/mob_assay.dm +++ b/mods/content/psionics/system/psionics/mob/mob_assay.dm @@ -87,7 +87,7 @@ dat += "[use_He_has] no notable psychic latency or operancy." if(istype(machine)) - dat += "Print Clear Buffer" + dat += "Print Clear Buffer" machine.last_assay = dat return diff --git a/mods/content/shackles/laws_pref.dm b/mods/content/shackles/laws_pref.dm index 77c3b8baffa..308d2342b23 100644 --- a/mods/content/shackles/laws_pref.dm +++ b/mods/content/shackles/laws_pref.dm @@ -47,11 +47,11 @@ . += "Shackle: " if(!pref.is_shackled) . += "Off" - . += "On" + . += "On" . += "
    Only shackled synthetics have laws." . += "
    " else - . += "Off" + . += "Off" . += "On" . += "
    You are shackled and have laws that restrict your behaviour." . += "
    " @@ -64,7 +64,7 @@ for(var/i in 1 to pref.laws.len) . += "[i]) [pref.laws[i]]
    " - . += "Law sets: Load Set
    " + . += "Law sets: Load Set
    " . = jointext(.,null) @@ -102,7 +102,7 @@ . = ..() if(!ishuman(.)) return - var/mob/living/carbon/human/new_character = . + var/mob/living/human/new_character = . if(new_character.client?.prefs?.is_shackled && new_character.get_bodytype().can_be_shackled && new_character.mind) new_character.mind.set_shackle(new_character.client.prefs.get_lawset(), TRUE) // Silent as laws will be announced on Login() anyway. diff --git a/mods/content/xenobiology/_xenobiology.dme b/mods/content/xenobiology/_xenobiology.dme index 144a87c3142..11a5f3972c6 100644 --- a/mods/content/xenobiology/_xenobiology.dme +++ b/mods/content/xenobiology/_xenobiology.dme @@ -1,56 +1,58 @@ #ifndef CONTENT_PACK_XENOBIO #define CONTENT_PACK_XENOBIO +// BEGIN_INCLUDE #include "_xenobiology.dm" #include "achievement.dm" #include "circuit.dm" #include "emotes.dm" #include "food.dm" #include "overrides.dm" -#include "colours/_colour.dm" -#include "colours/colour_adamantine.dm" -#include "colours/colour_black.dm" -#include "colours/colour_blue.dm" -#include "colours/colour_cerulean.dm" -#include "colours/colour_dark_blue.dm" -#include "colours/colour_dark_purple.dm" -#include "colours/colour_gold.dm" -#include "colours/colour_green.dm" -#include "colours/colour_grey.dm" -#include "colours/colour_light_pink.dm" -#include "colours/colour_metal.dm" -#include "colours/colour_oil.dm" -#include "colours/colour_orange.dm" -#include "colours/colour_pink.dm" -#include "colours/colour_purple.dm" -#include "colours/colour_pyrite.dm" -#include "colours/colour_quantum.dm" -#include "colours/colour_rainbow.dm" -#include "colours/colour_red.dm" -#include "colours/colour_sepia.dm" -#include "colours/colour_silver.dm" -#include "colours/colour_yellow.dm" -#include "mobs/critter_slime.dm" -#include "mobs/slime_feeding_helpers.dm" -#include "slime/_slime.dm" -#include "slime/death.dm" -#include "slime/examine.dm" -#include "slime/feeding.dm" -#include "slime/items.dm" -#include "slime/items_extract_enhancer.dm" -#include "slime/items_cell.dm" -#include "slime/items_potion.dm" -#include "slime/items_steroid.dm" -#include "slime/life.dm" -#include "slime/powers.dm" -#include "slime/say.dm" -#include "slime/slime_AI.dm" -#include "slime/slime_click.dm" -#include "slime/slime_codex.dm" -#include "slime/slime_commands.dm" -#include "slime/slime_comments.dm" -#include "slime/slime_follow.dm" -#include "slime/slime_hud.dm" -#include "slime/slime_reagents.dm" -#include "slime/slime_surgery.dm" -#include "slime/slime_update_icon.dm" +#include "colours\_colour.dm" +#include "colours\colour_adamantine.dm" +#include "colours\colour_black.dm" +#include "colours\colour_blue.dm" +#include "colours\colour_cerulean.dm" +#include "colours\colour_dark_blue.dm" +#include "colours\colour_dark_purple.dm" +#include "colours\colour_gold.dm" +#include "colours\colour_green.dm" +#include "colours\colour_grey.dm" +#include "colours\colour_light_pink.dm" +#include "colours\colour_metal.dm" +#include "colours\colour_oil.dm" +#include "colours\colour_orange.dm" +#include "colours\colour_pink.dm" +#include "colours\colour_purple.dm" +#include "colours\colour_pyrite.dm" +#include "colours\colour_quantum.dm" +#include "colours\colour_rainbow.dm" +#include "colours\colour_red.dm" +#include "colours\colour_sepia.dm" +#include "colours\colour_silver.dm" +#include "colours\colour_yellow.dm" +#include "mobs\critter_slime.dm" +#include "mobs\slime_feeding_helpers.dm" +#include "slime\_slime.dm" +#include "slime\death.dm" +#include "slime\examine.dm" +#include "slime\feeding.dm" +#include "slime\items.dm" +#include "slime\items_cell.dm" +#include "slime\items_extract_enhancer.dm" +#include "slime\items_potion.dm" +#include "slime\items_steroid.dm" +#include "slime\life.dm" +#include "slime\powers.dm" +#include "slime\say.dm" +#include "slime\slime_AI.dm" +#include "slime\slime_click.dm" +#include "slime\slime_codex.dm" +#include "slime\slime_commands.dm" +#include "slime\slime_comments.dm" +#include "slime\slime_follow.dm" +#include "slime\slime_hud.dm" +#include "slime\slime_reagents.dm" +#include "slime\slime_surgery.dm" +#include "slime\slime_update_icon.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/content/xenobiology/colours/colour_silver.dm b/mods/content/xenobiology/colours/colour_silver.dm index cfc1fb8cb71..8399b9debd4 100644 --- a/mods/content/xenobiology/colours/colour_silver.dm +++ b/mods/content/xenobiology/colours/colour_silver.dm @@ -16,7 +16,7 @@ var/location = get_turf(holder.get_reaction_loc()) if(location) playsound(location, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(location, null)) + for(var/mob/living/human/M in viewers(location, null)) if(M.eyecheck() < FLASH_PROTECTION_MODERATE) M.flash_eyes() for(var/i = 1, i <= 4 + rand(1,2), i++) diff --git a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm index c970be7f223..bebb1ed1669 100644 --- a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm +++ b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm @@ -23,7 +23,7 @@ var/global/list/slime_pain_messages = list( qdel(src) . = rand(2,3) -/mob/living/carbon/human/eaten_by_slime() +/mob/living/human/eaten_by_slime() var/list/limbs = get_external_organs() if(LAZYLEN(limbs) > 1) var/obj/item/organ/external/E = pick(limbs) @@ -50,13 +50,10 @@ var/global/list/slime_pain_messages = list( // Handle cosmetic effects (currently) from being eaten by a slime, mostly pain-related. /mob/living/proc/handle_additional_slime_effects() - return - -/mob/living/carbon/handle_additional_slime_effects() if(can_feel_pain()) to_chat(src, SPAN_DANGER(pick(global.slime_pain_messages))) -/mob/living/carbon/human/handle_additional_slime_effects() +/mob/living/human/handle_additional_slime_effects() custom_pain(pick(global.slime_pain_messages),100) // Called by a feeding slime on the victim. diff --git a/mods/content/xenobiology/overrides.dm b/mods/content/xenobiology/overrides.dm index 5ab370b3c58..a5c39ef2743 100644 --- a/mods/content/xenobiology/overrides.dm +++ b/mods/content/xenobiology/overrides.dm @@ -39,7 +39,7 @@ . = ..() can_hold |= /obj/item/slime_extract -/mob/living/carbon/human/say_understands(var/mob/other,var/decl/language/speaking = null) +/mob/living/human/say_understands(var/mob/other,var/decl/language/speaking = null) . = (!speaking && isslime(other)) || ..() /mob/living/brain/say_understands(var/mob/other,var/decl/language/speaking = null) diff --git a/mods/content/xenobiology/slime/_slime.dm b/mods/content/xenobiology/slime/_slime.dm index f337ce94b35..11db21dc83c 100644 --- a/mods/content/xenobiology/slime/_slime.dm +++ b/mods/content/xenobiology/slime/_slime.dm @@ -350,18 +350,18 @@ . += "Electric charge strength:\t[powerlevel]" . += "Health:\t[get_health_percent()]%" - var/list/mutations = slime_data.descendants?.Copy() - if(!mutations.len) + var/list/slime_mutations = slime_data.descendants?.Copy() + if(!length(slime_mutations)) . += "This slime will never mutate." else var/list/mutationChances = list() - for(var/i in mutations) + for(var/i in slime_mutations) if(i == slime_type) continue if(mutationChances[i]) - mutationChances[i] += mutation_chance / mutations.len + mutationChances[i] += mutation_chance / length(slime_mutations) else - mutationChances[i] = mutation_chance / mutations.len + mutationChances[i] = mutation_chance / length(slime_mutations) var/list/mutationTexts = list("[slime_data.name] ([100 - mutation_chance]%)") for(var/i in mutationChances) diff --git a/mods/content/xenobiology/slime/feeding.dm b/mods/content/xenobiology/slime/feeding.dm index 1099bf3b84e..0a208e3c5a6 100644 --- a/mods/content/xenobiology/slime/feeding.dm +++ b/mods/content/xenobiology/slime/feeding.dm @@ -22,7 +22,7 @@ to_chat(src, SPAN_WARNING("\The [M] is protected from your feeding.")) return FEED_RESULT_INVALID if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if((H.species.species_flags & SPECIES_FLAG_NO_POISON) || (H.get_bodytype()?.body_flags & BODY_FLAG_NO_DNA)) if(!silent) to_chat(src, SPAN_WARNING("You cannot feed on \the [M].")) diff --git a/mods/content/xenobiology/slime/items.dm b/mods/content/xenobiology/slime/items.dm index df20c560312..e2a4b4c3774 100644 --- a/mods/content/xenobiology/slime/items.dm +++ b/mods/content/xenobiology/slime/items.dm @@ -50,8 +50,7 @@ add_to_reagents(/decl/material/liquid/slimejelly, 30) /obj/item/slime_extract/on_reagent_change() - ..() - if(reagents?.total_volume) + if((. = ..()) && reagents?.total_volume) var/decl/slime_colour/slime_data = GET_DECL(slime_type) slime_data.handle_reaction(reagents) @@ -100,7 +99,7 @@ return TRUE visible_message(SPAN_WARNING("A craggy humanoid figure coalesces into being!")) - var/mob/living/carbon/human/G = new(src.loc) + var/mob/living/human/G = new(src.loc) G.set_species(SPECIES_GOLEM) G.key = ghost.key diff --git a/mods/gamemodes/cult/_cult.dm b/mods/gamemodes/cult/_cult.dm new file mode 100644 index 00000000000..37d934178bb --- /dev/null +++ b/mods/gamemodes/cult/_cult.dm @@ -0,0 +1,27 @@ +#define isconstruct(A) istype(A, /mob/living/simple_animal/construct) + +#define CULTINESS_PER_CULTIST 40 +#define CULTINESS_PER_SACRIFICE 40 +#define CULTINESS_PER_TURF 1 + +#define CULT_RUNES_1 200 +#define CULT_RUNES_2 400 +#define CULT_RUNES_3 1000 + +#define CULT_GHOSTS_1 400 +#define CULT_GHOSTS_2 800 +#define CULT_GHOSTS_3 1200 + +#define CULT_MAX_CULTINESS 1200 // When this value is reached, the game stops checking for updates so we don't recheck every time a tile is converted in endgame + +/decl/modpack/cult + name = "Cult Gamemode Content" + +/decl/modpack/cult/post_initialize() + . = ..() + global.href_to_mob_type["Constructs"] = list( + "Armoured" = /mob/living/simple_animal/construct/armoured, + "Builder" = /mob/living/simple_animal/construct/builder, + "Wraith" = /mob/living/simple_animal/construct/wraith, + "Shade" = /mob/living/simple_animal/shade + ) \ No newline at end of file diff --git a/mods/gamemodes/cult/_cult.dme b/mods/gamemodes/cult/_cult.dme new file mode 100644 index 00000000000..bda33c4bf96 --- /dev/null +++ b/mods/gamemodes/cult/_cult.dme @@ -0,0 +1,40 @@ +#ifndef GAMEMODE_PACK_CULT +#define GAMEMODE_PACK_CULT + +#ifdef GAMEMODE_PACK_DEITY +#warn Deity modpack loaded before Cult modpack, Nar'sie godform will be unavailable! +#endif + +// BEGIN_INCLUDE +#include "_cult.dm" +#include "archaeology.dm" +#include "codex.dm" +#include "flooring.dm" +#include "gamemode.dm" +#include "ghosts.dm" +#include "ghosttrap.dm" +#include "hell_universe.dm" +#include "holy.dm" +#include "items.dm" +#include "materials.dm" +#include "narsie.dm" +#include "objectives.dm" +#include "overrides.dm" +#include "ritual.dm" +#include "runes.dm" +#include "special_role.dm" +#include "structures.dm" +#include "talisman.dm" +#include "wizard.dm" +#include "cultify\de-cultify.dm" +#include "cultify\defile.dm" +#include "cultify\mob.dm" +#include "cultify\turf.dm" +#include "mobs\mob_subtypes.dm" +#include "mobs\shade.dm" +#include "mobs\constructs\constructs.dm" +#include "mobs\constructs\soulstone.dm" +#include "spells\construct.dm" +#include "spells\harvest.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/code/modules/xenoarcheaology/finds/find_types/cult.dm b/mods/gamemodes/cult/archaeology.dm similarity index 57% rename from code/modules/xenoarcheaology/finds/find_types/cult.dm rename to mods/gamemodes/cult/archaeology.dm index 3826931d442..1d81b9117c1 100644 --- a/code/modules/xenoarcheaology/finds/find_types/cult.dm +++ b/mods/gamemodes/cult/archaeology.dm @@ -1,5 +1,3 @@ - - /decl/archaeological_find/cult item_type = "garments" responsive_reagent = /decl/material/solid/potassium @@ -22,4 +20,21 @@ possible_types = list( /obj/item = 4, /obj/item/soulstone - ) \ No newline at end of file + ) + +/decl/xenoarch_digsite/temple/Initialize() + find_types[/decl/archaeological_find/cult] = 200 + find_types[/decl/archaeological_find/cult/sword] = 75 + return ..() + +/decl/xenoarch_digsite/war/Initialize() + find_types[/decl/archaeological_find/cult] = 50 + find_types[/decl/archaeological_find/cult/sword] = 50 + return ..() + +/datum/artifact_trigger/energy/New() + var/static/injected = FALSE + if(!injected) + energetic_things += /obj/item/sword/cultblade + injected = TRUE + ..() \ No newline at end of file diff --git a/mods/gamemodes/cult/codex.dm b/mods/gamemodes/cult/codex.dm new file mode 100644 index 00000000000..f2fe2a16ae2 --- /dev/null +++ b/mods/gamemodes/cult/codex.dm @@ -0,0 +1,3 @@ +/datum/codex_entry/cultblade + associated_paths = list(/obj/item/sword/cultblade) + antag_text = "This sword is a powerful weapon, capable of severing limbs easily, if they are targeted. Nonbelievers are unable to use this weapon." \ No newline at end of file diff --git a/mods/gamemodes/cult/cultify/de-cultify.dm b/mods/gamemodes/cult/cultify/de-cultify.dm new file mode 100644 index 00000000000..32c0738df02 --- /dev/null +++ b/mods/gamemodes/cult/cultify/de-cultify.dm @@ -0,0 +1,7 @@ +/turf/unsimulated/wall/cult/nullrod_act(mob/user, obj/item/nullrod/rod) + user.visible_message( + SPAN_NOTICE("\The [user] touches \the [src] with \the [rod], and it shifts."), + SPAN_NOTICE("You touch \the [src] with \the [rod], and it shifts.") + ) + ChangeTurf(/turf/unsimulated/wall) + return TRUE \ No newline at end of file diff --git a/mods/gamemodes/cult/cultify/defile.dm b/mods/gamemodes/cult/cultify/defile.dm new file mode 100644 index 00000000000..684a22c481b --- /dev/null +++ b/mods/gamemodes/cult/cultify/defile.dm @@ -0,0 +1,2 @@ +/atom/proc/on_defilement() + return \ No newline at end of file diff --git a/code/game/gamemodes/cult/cultify/mob.dm b/mods/gamemodes/cult/cultify/mob.dm similarity index 100% rename from code/game/gamemodes/cult/cultify/mob.dm rename to mods/gamemodes/cult/cultify/mob.dm diff --git a/mods/gamemodes/cult/cultify/turf.dm b/mods/gamemodes/cult/cultify/turf.dm new file mode 100644 index 00000000000..cacaec6517c --- /dev/null +++ b/mods/gamemodes/cult/cultify/turf.dm @@ -0,0 +1,62 @@ +/turf/on_defilement() + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.add_cultiness(CULTINESS_PER_TURF) + +/turf/proc/is_defiled() + return (locate(/obj/effect/narsie_footstep) in src) + +/turf/floor/on_defilement() + if(flooring?.type != /decl/flooring/reinforced/cult) + ..() + set_flooring(GET_DECL(/decl/flooring/reinforced/cult)) + +/turf/floor/is_defiled() + return flooring?.type == /decl/flooring/reinforced/cult || ..() + +/turf/floor/cult + name = "engraved floor" + icon = 'icons/turf/flooring/cult.dmi' + icon_state = "cult" + initial_flooring = /decl/flooring/reinforced/cult + +/turf/wall/on_defilement() + var/new_material + if(material?.type != /decl/material/solid/stone/cult) + new_material = /decl/material/solid/stone/cult + var/new_rmaterial + if(reinf_material && reinf_material.type != /decl/material/solid/stone/cult/reinforced) + new_rmaterial = /decl/material/solid/stone/cult/reinforced + if(new_material || new_rmaterial) + ..() + set_turf_materials(new_material, new_rmaterial) + +/turf/wall/is_defiled() + return material?.type == /decl/material/solid/stone/cult || reinf_material?.type == /decl/material/solid/stone/cult/reinforced || ..() + +//Cult wall +/turf/wall/cult + icon_state = "cult" + color = COLOR_RED_GRAY + material = /decl/material/solid/stone/cult + +/turf/wall/cult/reinf + icon_state = "reinforced_cult" + reinf_material = /decl/material/solid/stone/cult/reinforced + +/turf/wall/cult/dismantle_turf(devastated, explode, no_product, keep_air = TRUE) + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.remove_cultiness(CULTINESS_PER_TURF) + . = ..() + +/turf/wall/cult/can_join_with(var/turf/wall/W) + if(material && W.material && material.icon_base == W.material.icon_base) + return FALSE + else if(istype(W, /turf/wall)) + return TRUE + return FALSE + +/turf/wall/natural/on_defilement() + ChangeTurf(/turf/wall/cult) + +/turf/unsimulated/on_defilement() + return \ No newline at end of file diff --git a/mods/gamemodes/cult/flooring.dm b/mods/gamemodes/cult/flooring.dm new file mode 100644 index 00000000000..45409acc223 --- /dev/null +++ b/mods/gamemodes/cult/flooring.dm @@ -0,0 +1,12 @@ +/decl/flooring/reinforced/cult + name = "engraved floor" + desc = "Unsettling whispers waver from the surface..." + icon = 'icons/turf/flooring/cult.dmi' + icon_base = "cult" + build_type = null + flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK | TURF_REMOVE_WRENCH + can_paint = null + +/decl/flooring/reinforced/cult/on_remove() + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.remove_cultiness(CULTINESS_PER_TURF) \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult.dm b/mods/gamemodes/cult/gamemode.dm similarity index 100% rename from code/game/gamemodes/cult/cult.dm rename to mods/gamemodes/cult/gamemode.dm diff --git a/code/game/gamemodes/cult/ghosts.dm b/mods/gamemodes/cult/ghosts.dm similarity index 81% rename from code/game/gamemodes/cult/ghosts.dm rename to mods/gamemodes/cult/ghosts.dm index cd9e729dbc1..9d9763e6bbf 100644 --- a/code/game/gamemodes/cult/ghosts.dm +++ b/mods/gamemodes/cult/ghosts.dm @@ -16,6 +16,36 @@ M.verbs += /mob/observer/ghost/proc/bloodless_doodle M.verbs += /mob/observer/ghost/proc/toggle_visiblity +/proc/round_is_spooky(var/spookiness_threshold = get_config_value(/decl/config/num/cult_ghostwriter_req_cultists)) + var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) + return (cult.current_antagonists.len > spookiness_threshold) + +// ghost attack - make lights flicker like an AI, but even spookier! +/obj/machinery/light/attack_ghost(mob/user) + if(round_is_spooky()) + src.flicker(rand(2,5)) + else return ..() + +/obj/item/t_scanner/can_scan_mob(mob/victim) + if(round_is_spooky() && isobserver(victim)) + return TRUE + return ..() + +/mob/living/do_possession(var/mob/observer/ghost/possessor) + if(round_is_spooky(6)) // Six or more active cultists. + to_chat(src, SPAN_NOTICE("You reach out with tendrils of ectoplasm and invade the mind of \the [src]...")) + to_chat(src, SPAN_BOLD("You have assumed direct control of \the [src].")) + to_chat(src, SPAN_NOTICE("Due to the spookiness of the round, you have taken control of the poor animal as an invading, possessing spirit - roleplay accordingly.")) + src.universal_speak = TRUE + src.universal_understand = TRUE + //src.on_defilement() // Maybe another time. + return TRUE + +/mob/observer/ghost/Initialize() + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.add_ghost_magic(src) + return ..() + /mob/observer/ghost/proc/ghost_ability_check() var/turf/T = get_turf(src) if(is_holy_turf(T)) @@ -206,11 +236,11 @@ if(!ghost_ability_check()) return - var/list/mob/living/carbon/human/choices = list() - for(var/mob/living/carbon/human/H in range(1)) + var/list/mob/living/human/choices = list() + for(var/mob/living/human/H in range(1)) choices += H - var/mob/living/carbon/human/choice = input(src, "Whom do you want to scratch?") as null|anything in choices + var/mob/living/human/choice = input(src, "Whom do you want to scratch?") as null|anything in choices if(!choice) return @@ -234,11 +264,11 @@ if(!ghost_ability_check()) return - var/list/mob/living/carbon/human/choices = list() - for(var/mob/living/carbon/human/H in range(1)) + var/list/mob/living/human/choices = list() + for(var/mob/living/human/H in range(1)) choices += H - var/mob/living/carbon/human/choice = input(src, "Whom do you want to scare?") as null|anything in choices + var/mob/living/human/choice = input(src, "Whom do you want to scare?") as null|anything in choices if(!choice) return @@ -288,3 +318,11 @@ to_chat(src, "You are now visible.") set_invisibility(INVISIBILITY_NONE) mouse_opacity = MOUSE_OPACITY_UNCLICKABLE // This is so they don't make people invincible to melee attacks by hovering over them + +//ATTACK GHOST IGNORING PARENT RETURN VALUE +// If we're spooky, ghosts can use the spirit board +/obj/item/spirit_board/attack_ghost(var/mob/observer/ghost/user) + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + if(cult.max_cult_rating >= CULT_GHOSTS_2) + spirit_board_pick_letter(user) + return ..() \ No newline at end of file diff --git a/mods/gamemodes/cult/ghosttrap.dm b/mods/gamemodes/cult/ghosttrap.dm new file mode 100644 index 00000000000..3e5d7452df6 --- /dev/null +++ b/mods/gamemodes/cult/ghosttrap.dm @@ -0,0 +1,28 @@ +/decl/ghosttrap/cult_shade + name = "shade" + ghost_trap_message = "They are occupying a soul stone now." + ban_checks = list(/decl/special_role/cultist) + pref_check = "ghost_shade" + can_set_own_name = FALSE + +/decl/ghosttrap/cult_shade/welcome_candidate(var/mob/target) + var/obj/item/soulstone/S = target.loc + if(istype(S)) + if(S.is_evil) + var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) + cult.add_antagonist(target.mind) + to_chat(target, "Remember, you serve the one who summoned you first, and the cult second.") + else + to_chat(target, "This soultone has been purified. You do not belong to the cult.") + to_chat(target, "Remember, you only serve the one who summoned you.") + +/decl/ghosttrap/cult_shade/forced(var/mob/user) + var/obj/item/soulstone/stone = new(get_turf(user)) + stone.shade = new(stone) + request_player(stone.shade, "The soul stone shade summon ritual has been performed. ") + +#ifdef GAMEMODE_PACK_DEITY +/decl/ghosttrap/cult_shade/Initialize() + ban_checks |= /decl/special_role/godcultist + . = ..() +#endif \ No newline at end of file diff --git a/code/game/gamemodes/cult/hell_universe.dm b/mods/gamemodes/cult/hell_universe.dm similarity index 82% rename from code/game/gamemodes/cult/hell_universe.dm rename to mods/gamemodes/cult/hell_universe.dm index 5133b72ba09..c5e5ad0adf0 100644 --- a/code/game/gamemodes/cult/hell_universe.dm +++ b/mods/gamemodes/cult/hell_universe.dm @@ -40,3 +40,9 @@ In short: for(var/mob/living/simple_animal/M in SSmobs.mob_list) if(M && !M.client) M.set_stat(DEAD) + +// Disable Narsie when we enter other (non-hell) universe states +/datum/universal_state/supermatter_cascade/OnEnter() + // Disable Nar-Sie. + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.allow_narsie = 0 \ No newline at end of file diff --git a/mods/gamemodes/cult/holy.dm b/mods/gamemodes/cult/holy.dm new file mode 100644 index 00000000000..fce20c925af --- /dev/null +++ b/mods/gamemodes/cult/holy.dm @@ -0,0 +1,34 @@ +/decl/material/liquid/water/affect_holy(mob/living/M, removed, datum/reagents/holder) + if(iscultist(M)) + if(prob(10)) + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.offer_uncult(M) + if(prob(2)) + var/obj/effect/spider/spiderling/S = new /obj/effect/spider/spiderling(M.loc) + M.visible_message(SPAN_WARNING("\The [M] coughs up \the [S]!")) + return TRUE + return FALSE + +/obj/item/nullrod/holy_act(mob/living/target, mob/living/user) + if(iscultist(target)) + target.visible_message(SPAN_NOTICE("\The [user] waves \the [src] over \the [target]'s head.")) + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.offer_uncult(target) + return TRUE + return ..() + +/turf/wall/cult/nullrod_act(mob/user, obj/item/nullrod/rod) + user.visible_message( + SPAN_NOTICE("\The [user] touches \the [src] with \the [rod], and the enchantment affecting it fizzles away."), + SPAN_NOTICE("You touch \the [src] with \the [rod], and the enchantment affecting it fizzles away.") + ) + ChangeTurf(/turf/wall) + return TRUE + +/turf/floor/cult/nullrod_act(mob/user, obj/item/nullrod/rod) + user.visible_message( + SPAN_NOTICE("\The [user] touches \the [src] with \the [rod], and the enchantment affecting it fizzles away."), + SPAN_NOTICE("You touch \the [src] with \the [rod], and the enchantment affecting it fizzles away.") + ) + ChangeTurf(/turf/floor, keep_air = TRUE) + return TRUE \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult_items.dm b/mods/gamemodes/cult/items.dm similarity index 93% rename from code/game/gamemodes/cult/cult_items.dm rename to mods/gamemodes/cult/items.dm index 6923d889265..fae84e6d780 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/mods/gamemodes/cult/items.dm @@ -4,17 +4,20 @@ icon = 'icons/obj/items/weapon/swords/cult.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME +// separated into a proc so that deity can modify it +/obj/item/sword/cultblade/proc/can_use_safely(mob/living/user) + return iscultist(user) + /obj/item/sword/cultblade/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - if(iscultist(user) || (user.mind in godcult.current_antagonists)) + if(can_use_safely(user)) return ..() var/zone = user.get_active_held_item_slot() var/obj/item/organ/external/affecting = null if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user affecting = GET_EXTERNAL_ORGAN(H, zone) if(affecting) @@ -71,7 +74,7 @@ /obj/item/clothing/suit/cultrobes name = "cult robes" - icon = 'icons/clothing/suit/cult.dmi' + icon = 'icons/clothing/suits/cult.dmi' desc = "A set of durable robes worn by the followers of Nar-Sie." body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS|SLOT_TAIL allowed = list(/obj/item/book/tome,/obj/item/sword/cultblade) @@ -86,12 +89,12 @@ siemens_coefficient = 0.6 /obj/item/clothing/suit/cultrobes/alt - icon = 'icons/clothing/suit/cult_alt.dmi' + icon = 'icons/clothing/suits/cult_alt.dmi' /obj/item/clothing/suit/cultrobes/magusred name = "magus robes" desc = "A set of plated robes worn by the followers of Nar-Sie." - icon = 'icons/clothing/suit/wizard/magusred.dmi' + icon = 'icons/clothing/suits/wizard/magusred.dmi' body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET|SLOT_ARMS|SLOT_HANDS|SLOT_TAIL flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT armor = list( diff --git a/mods/gamemodes/cult/materials.dm b/mods/gamemodes/cult/materials.dm new file mode 100644 index 00000000000..6b1165f2f05 --- /dev/null +++ b/mods/gamemodes/cult/materials.dm @@ -0,0 +1,33 @@ +/decl/material/solid/stone/cult + name = "disturbing stone" + uid = "solid_stone_cult" + icon_base = 'icons/turf/walls/cult.dmi' + icon_reinf = 'icons/turf/walls/reinforced_cult.dmi' + color = "#402821" + shard_type = SHARD_STONE_PIECE + conductive = 0 + construction_difficulty = MAT_VALUE_NORMAL_DIY + hidden_from_codex = TRUE + reflectiveness = MAT_VALUE_DULL + exoplanet_rarity_plant = MAT_RARITY_NOWHERE + exoplanet_rarity_gas = MAT_RARITY_NOWHERE + +/decl/material/solid/stone/cult/place_dismantled_girder(var/turf/target) + return list(new /obj/structure/girder/cult(target)) + +/decl/material/solid/stone/cult/reinforced + name = "runic inscriptions" + uid = "solid_runes_cult" + +/decl/butchery_data/occult + meat_material = /decl/material/solid/stone/cult + meat_type = /obj/item/stack/material/lump + bone_material = /decl/material/solid/stone/cult/reinforced + + skin_material = null + skin_type = null + skin_amount = null + + gut_amount = null + gut_material = null + gut_type = null diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/mods/gamemodes/cult/mobs/constructs/constructs.dm similarity index 89% rename from code/modules/mob/living/simple_animal/constructs/constructs.dm rename to mods/gamemodes/cult/mobs/constructs/constructs.dm index ca68e7223b8..29711d9ec27 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/mods/gamemodes/cult/mobs/constructs/constructs.dm @@ -31,6 +31,7 @@ bleed_colour = "#331111" gene_damage = -1 butchery_data = /decl/butchery_data/occult + hud_used = /datum/hud/construct z_flags = ZMM_MANGLE_PLANES glowing_eyes = TRUE @@ -43,6 +44,9 @@ /mob/living/simple_animal/construct/on_defilement() return +/mob/living/simple_animal/construct/get_blood_name() + return "ichor" + /mob/living/simple_animal/construct/Initialize() . = ..() name = text("[initial(name)] ([random_id(/mob/living/simple_animal/construct, 1000, 9999)])") @@ -85,14 +89,6 @@ else to_chat(user, SPAN_DANGER("It looks severely dented!")) -/obj/item/ectoplasm - name = "ectoplasm" - desc = "Spooky." - gender = PLURAL - icon = 'icons/obj/items/ectoplasm.dmi' - icon_state = ICON_STATE_WORLD - material = /decl/material/liquid/drink/compote - /////////////////Juggernaut/////////////// @@ -114,6 +110,7 @@ resistance = 10 construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser) can_escape = TRUE + hud_used = /datum/hud/construct/juggernaut /obj/item/natural_weapon/juggernaut name = "armored gauntlet" @@ -148,6 +145,10 @@ return (..(P)) +/mob/living/simple_animal/construct/armoured/mind_initialize() + ..() + mind.assigned_role = "Juggernaut" + mind.assigned_special_role = "Cultist" ////////////////////////Wraith///////////////////////////////////////////// @@ -165,6 +166,7 @@ environment_smash = 1 see_in_dark = 7 construct_spells = list(/spell/targeted/ethereal_jaunt/shift) + hud_used = /datum/hud/construct/wraith /obj/item/natural_weapon/wraith name = "wicked blade" @@ -174,6 +176,11 @@ edge = TRUE force = 25 +/mob/living/simple_animal/construct/wraith/mind_initialize() + ..() + mind.assigned_role = "Wraith" + mind.assigned_special_role = "Cultist" + /////////////////////////////Artificer///////////////////////// @@ -189,18 +196,26 @@ natural_weapon = /obj/item/natural_weapon/cult_builder speed = 0 environment_smash = 1 - construct_spells = list(/spell/aoe_turf/conjure/construct/lesser, - /spell/aoe_turf/conjure/wall, - /spell/aoe_turf/conjure/floor, - /spell/aoe_turf/conjure/soulstone, - /spell/aoe_turf/conjure/pylon - ) + construct_spells = list( + /spell/aoe_turf/conjure/construct/lesser, + /spell/aoe_turf/conjure/wall, + /spell/aoe_turf/conjure/floor, + /spell/aoe_turf/conjure/soulstone, + /spell/aoe_turf/conjure/pylon + ) + hud_used = /datum/hud/construct/artificer /obj/item/natural_weapon/cult_builder name = "heavy arms" attack_verb = list("rammed") force = 5 + +/mob/living/simple_animal/construct/builder/mind_initialize() + ..() + mind.assigned_role = "Artificer" + mind.assigned_special_role = "Cultist" + /////////////////////////////Behemoth///////////////////////// @@ -219,6 +234,7 @@ resistance = 10 construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser) can_escape = TRUE + hud_used = /datum/hud/construct/juggernaut /obj/item/natural_weapon/juggernaut/behemoth force = 50 @@ -237,10 +253,11 @@ speed = -1 environment_smash = 1 see_in_dark = 7 + hud_used = /datum/hud/construct/harvester construct_spells = list( - /spell/targeted/harvest - ) + /spell/targeted/harvest + ) /obj/item/natural_weapon/harvester name = "malicious spike" diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/mods/gamemodes/cult/mobs/constructs/soulstone.dm similarity index 79% rename from code/modules/mob/living/simple_animal/constructs/soulstone.dm rename to mods/gamemodes/cult/mobs/constructs/soulstone.dm index 8d75231e733..0cec5497a87 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/mods/gamemodes/cult/mobs/constructs/soulstone.dm @@ -1,3 +1,7 @@ +#define SOULSTONE_CRACKED -1 +#define SOULSTONE_EMPTY 0 +#define SOULSTONE_ESSENCE 1 + /obj/item/soulstone name = "soul stone shard" icon = 'icons/obj/items/soulstone.dmi' @@ -45,16 +49,19 @@ /obj/item/soulstone/attackby(var/obj/item/I, var/mob/user) ..() if(is_evil && istype(I, /obj/item/nullrod)) - to_chat(user, "You cleanse \the [src] of taint, purging its shackles to its creator..") + to_chat(user, SPAN_NOTICE("You cleanse \the [src] of taint, purging its shackles to its creator.")) is_evil = 0 return if(I.force >= 5) if(full != SOULSTONE_CRACKED) - user.visible_message("\The [user] hits \the [src] with \the [I], and it breaks.[shade.client ? " You hear a terrible scream!" : ""]", "You hit \the [src] with \the [I], and it cracks.[shade.client ? " You hear a terrible scream!" : ""]", shade.client ? "You hear a scream." : null) + user.visible_message( + SPAN_WARNING("\The [user] hits \the [src] with \the [I], and it breaks.[shade.client ? " You hear a terrible scream!" : ""]"), + SPAN_WARNING("You hit \the [src] with \the [I], and it cracks.[shade.client ? " You hear a terrible scream!" : ""]"), + shade.client ? SPAN_NOTICE("You hear a scream.") : null) playsound(loc, 'sound/effects/Glasshit.ogg', 75) set_full(SOULSTONE_CRACKED) else - user.visible_message("\The [user] shatters \the [src] with \the [I]!") + user.visible_message(SPAN_DANGER("\The [user] shatters \the [src] with \the [I]!")) shatter() /obj/item/soulstone/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) @@ -76,22 +83,22 @@ /obj/item/soulstone/attack_self(var/mob/user) if(full != SOULSTONE_ESSENCE) // No essence - no shade - to_chat(user, "This [src] has no life essence.") + to_chat(user, SPAN_NOTICE("This [src] has no life essence.")) return if(!shade.key) // No key = hasn't been used - to_chat(user, "You cut your finger and let the blood drip on \the [src].") - user.remove_blood_simple(1) + to_chat(user, SPAN_NOTICE("You cut your finger and let the blood drip on \the [src].")) + user.remove_blood(1, absolute = TRUE) var/decl/ghosttrap/S = GET_DECL(/decl/ghosttrap/cult_shade) S.request_player(shade, "The soul stone shade summon ritual has been performed. ") else if(!shade.client) // Has a key but no client - shade logged out - to_chat(user, "\The [shade] in \the [src] is dormant.") + to_chat(user, SPAN_NOTICE("\The [shade] in \the [src] is dormant.")) return else if(shade.loc == src) var/choice = alert("Would you like to invoke the spirit within?",,"Yes","No") if(choice == "Yes") shade.dropInto(loc) - to_chat(user, "You summon \the [shade].") + to_chat(user, SPAN_NOTICE("You summon \the [shade].")) if(choice == "No") return @@ -113,10 +120,10 @@ if(istype(I, /obj/item/soulstone)) var/obj/item/soulstone/S = I if(!S.shade.client) - to_chat(user, "\The [I] has essence, but no soul. Activate it in your hand to find a soul for it first.") + to_chat(user, SPAN_NOTICE("\The [I] has essence, but no soul. Activate it in your hand to find a soul for it first.")) return if(S.shade.loc != S) - to_chat(user, "Recapture the shade back into \the [I] first.") + to_chat(user, SPAN_NOTICE("Recapture the shade back into \the [I] first.")) return var/construct = alert(user, "Please choose which type of construct you wish to create.",,"Artificer", "Wraith", "Juggernaut") var/ctype diff --git a/mods/gamemodes/cult/mobs/mob_subtypes.dm b/mods/gamemodes/cult/mobs/mob_subtypes.dm new file mode 100644 index 00000000000..bdafcb5fa77 --- /dev/null +++ b/mods/gamemodes/cult/mobs/mob_subtypes.dm @@ -0,0 +1,15 @@ +/mob/living/simple_animal/hostile/scarybat/cult + faction = "cult" + supernatural = TRUE + +/mob/living/simple_animal/hostile/scarybat/cult/on_defilement() + return + +/mob/living/simple_animal/hostile/creature/cult + faction = "cult" + min_gas = null + max_gas = null + minbodytemp = 0 + +/mob/living/simple_animal/hostile/creature/cult/on_defilement() + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/shade.dm b/mods/gamemodes/cult/mobs/shade.dm similarity index 93% rename from code/modules/mob/living/simple_animal/shade.dm rename to mods/gamemodes/cult/mobs/shade.dm index 5cc37d69bc0..1bf802e25c8 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/mods/gamemodes/cult/mobs/shade.dm @@ -48,3 +48,7 @@ if(. && !gibbed) new /obj/item/ectoplasm(src.loc) qdel(src) + +/mob/living/simple_animal/shade/mind_initialize() + ..() + mind.assigned_role = "Shade" diff --git a/code/game/gamemodes/cult/narsie.dm b/mods/gamemodes/cult/narsie.dm similarity index 97% rename from code/game/gamemodes/cult/narsie.dm rename to mods/gamemodes/cult/narsie.dm index 90ba89f658a..11ea55d1302 100644 --- a/code/game/gamemodes/cult/narsie.dm +++ b/mods/gamemodes/cult/narsie.dm @@ -97,7 +97,7 @@ var/global/list/narsie_list = list() targets += cult_nh_mind.current // If we have no valid cultists, go for any human. if(!length(targets)) - for(var/mob/living/carbon/human/food in global.living_mob_list_) + for(var/mob/living/human/food in global.living_mob_list_) if(food.stat) var/turf/pos = get_turf(food) if(pos?.z in current_zs) @@ -147,7 +147,7 @@ var/global/list/narsie_list = list() new /obj/effect/narsie_footstep(T) if(prob(25)) - for(var/mob/living/carbon/M in oviewers(8, src)) + for(var/mob/living/M in oviewers(8, src)) if(M.stat == CONSCIOUS && !(M.status_flags & GODMODE) && !iscultist(M)) to_chat(M, SPAN_DANGER("You feel your sanity crumble away in an instant as you gaze upon [src.name]...")) M.apply_effect(3, STUN) diff --git a/code/game/gamemodes/objectives/objective_cult.dm b/mods/gamemodes/cult/objectives.dm similarity index 93% rename from code/game/gamemodes/objectives/objective_cult.dm rename to mods/gamemodes/cult/objectives.dm index f247969f19b..4f8982daf12 100644 --- a/code/game/gamemodes/objectives/objective_cult.dm +++ b/mods/gamemodes/cult/objectives.dm @@ -16,9 +16,10 @@ var/list/possible_targets = list() if(!possible_targets.len) var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) - for(var/mob/living/carbon/human/player in global.player_list) + for(var/mob/living/human/player in global.player_list) if(player.mind && !(player.mind in cult.current_antagonists)) possible_targets += player.mind if(possible_targets.len > 0) target = pick(possible_targets) if(target) explanation_text = "Sacrifice [target.name], the [target.assigned_role]. You will need the sacrifice rune (Hell blood join) and three acolytes to do so." + return target diff --git a/mods/gamemodes/cult/overrides.dm b/mods/gamemodes/cult/overrides.dm new file mode 100644 index 00000000000..e4cb82b5192 --- /dev/null +++ b/mods/gamemodes/cult/overrides.dm @@ -0,0 +1,70 @@ +/datum/artifact_find/New() + var/static/injected = FALSE + if(!injected) + potential_finds[/obj/structure/cult/pylon] = 50 + potential_finds[/obj/structure/constructshell] = 5 + injected = TRUE + ..() + +/obj/structure/crematorium/on_cremate_mob(atom/cause, mob/living/victim) + . = ..() + if(. && round_is_spooky()) + if(prob(50)) + playsound(src, 'sound/effects/ghost.ogg', 10, 5) + else + playsound(src, 'sound/effects/ghost2.ogg', 10, 5) + +/datum/trader/ship/unique/wizard/New() + possible_wanted_items |= list( + /mob/living/simple_animal/construct = TRADER_SUBTYPES_ONLY, + /obj/item/sword/cultblade = TRADER_THIS_TYPE, + /obj/item/clothing/head/culthood = TRADER_ALL, + /obj/item/clothing/suit/space/cult = TRADER_ALL, + /obj/item/clothing/suit/cultrobes = TRADER_ALL, + /obj/item/clothing/head/helmet/space/cult = TRADER_ALL, + /obj/structure/cult = TRADER_SUBTYPES_ONLY, + /obj/structure/constructshell = TRADER_ALL + ) + ..() + +/datum/trader/ship/clothingshop/hatglovesaccessories/New() + possible_trading_items[/obj/item/clothing/head/culthood] = TRADER_BLACKLIST_ALL + +/mob/living/silicon/ai + shouldnt_see = list(/obj/effect/rune) + +// Vent crawling whitelisted items, whoo +/mob/living/Initialize() + . = ..() + can_enter_vent_with += list( + /obj/item/clothing/head/culthood, + /obj/item/clothing/suit/cultrobes, + /obj/item/book/tome, + /obj/item/sword/cultblade + ) + +/obj/item/vampiric + material = /decl/material/solid/stone/cult + +/mob/safe_animal(var/MP) + . = ..() + if(ispath(MP, /mob/living/simple_animal/shade)) + return 1 + +/mob/living/simple_animal/hostile/faithless + butchery_data = /decl/butchery_data/occult + +/mob/living/simple_animal/hostile/faithless/cult + faction = "cult" + +/mob/living/simple_animal/hostile/faithless/cult/on_defilement() + return + +/obj/item/mop/Initialize() + . = ..() + moppable_types += /obj/effect/rune + +/obj/effect/gateway/active/can_transform(mob/victim) + if(iscultist(victim)) + return FALSE + return ..() \ No newline at end of file diff --git a/code/game/gamemodes/cult/ritual.dm b/mods/gamemodes/cult/ritual.dm similarity index 93% rename from code/game/gamemodes/cult/ritual.dm rename to mods/gamemodes/cult/ritual.dm index 4f372e19005..c10ad6e70cd 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/mods/gamemodes/cult/ritual.dm @@ -7,6 +7,7 @@ w_class = ITEM_SIZE_SMALL unique = 1 carved = 2 // Don't carve it + can_dissolve_text = FALSE // Or dissolve it /obj/item/book/tome/attack_self(var/mob/user) if(!iscultist(user)) @@ -86,7 +87,7 @@ damage = 2 visible_message("\The [src] slices open a finger and begins to chant and paint symbols on the floor.", "[self]", "You hear chanting.") if(do_after(src, timer)) - remove_blood_simple(cost * damage) + remove_blood(cost * damage) if(locate(/obj/effect/rune) in T) return var/obj/effect/rune/R = new rune(T, get_blood_color(), get_blood_name()) @@ -96,38 +97,17 @@ return 1 return 0 -/mob/living/carbon/human/make_rune(var/rune, var/cost, var/tome_required) +/mob/living/human/make_rune(var/rune, var/cost, var/tome_required) if(should_have_organ(BP_HEART) && vessel && vessel.total_volume < species.blood_volume * 0.7) to_chat(src, "You are too weak to draw runes.") return ..() -/mob/proc/remove_blood_simple(var/blood) - return - -/mob/living/carbon/human/remove_blood_simple(var/blood) - if(should_have_organ(BP_HEART)) - vessel.remove_any(blood) - -/mob/proc/get_blood_name() - return "blood" - -/mob/living/silicon/get_blood_name() - return "oil" - -/mob/living/carbon/human/get_blood_name() - if(species) - return species.get_blood_name(src) - return "blood" - -/mob/living/simple_animal/construct/get_blood_name() - return "ichor" - /mob/proc/mob_needs_tome() - return 0 + return FALSE -/mob/living/carbon/human/mob_needs_tome() - return 1 +/mob/living/human/mob_needs_tome() + return TRUE var/global/list/Tier1Runes = list( /mob/proc/convert_rune, @@ -288,7 +268,7 @@ var/global/list/Tier4Runes = list( return message_cult_communicate() - remove_blood_simple(3) + remove_blood(3) var/input = input(src, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") if(!input) @@ -303,7 +283,7 @@ var/global/list/Tier4Runes = list( if(H.current && !H.current.stat) to_chat(H.current, "[input]") -/mob/living/carbon/cult_communicate() +/mob/living/cult_communicate() if(incapacitated(INCAPACITATION_RESTRAINED)) to_chat(src, "You need at least your hands free to do this.") return @@ -312,7 +292,7 @@ var/global/list/Tier4Runes = list( /mob/proc/message_cult_communicate() return -/mob/living/carbon/human/message_cult_communicate() +/mob/living/human/message_cult_communicate() var/decl/pronouns/G = get_pronouns() visible_message(SPAN_WARNING("\The [src] cuts [G.his] finger and starts drawing on the back of [G.his] hand.")) diff --git a/code/game/gamemodes/cult/runes.dm b/mods/gamemodes/cult/runes.dm similarity index 72% rename from code/game/gamemodes/cult/runes.dm rename to mods/gamemodes/cult/runes.dm index 1003b121fc5..86434cdfa65 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/mods/gamemodes/cult/runes.dm @@ -46,11 +46,11 @@ /obj/effect/rune/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/book/tome) && iscultist(user)) - user.visible_message("[user] rubs \the [src] with \the [I], and \the [src] is absorbed by it.", "You retrace your steps, carefully undoing the lines of \the [src].") + user.visible_message(SPAN_NOTICE("[user] rubs \the [src] with \the [I], and \the [src] is absorbed by it."), "You retrace your steps, carefully undoing the lines of \the [src].") qdel(src) return else if(istype(I, /obj/item/nullrod)) - user.visible_message("[user] hits \the [src] with \the [I], and it disappears, fizzling.", "You disrupt the vile magic with the deadening field of \the [I].", "You hear a fizzle.") + user.visible_message(SPAN_NOTICE("[user] hits \the [src] with \the [I], and it disappears, fizzling."), SPAN_NOTICE("You disrupt the vile magic with the deadening field of \the [I]."), "You hear a fizzle.") qdel(src) return @@ -83,7 +83,7 @@ . += M /obj/effect/rune/proc/fizzle(var/mob/living/user) - visible_message("The markings pulse with a small burst of light, then fall dark.", "You hear a fizzle.") + visible_message(SPAN_WARNING("The markings pulse with a small burst of light, then fall dark."), "You hear a fizzle.") //Makes the speech a proc so all verbal components can be easily manipulated as a whole, or individually easily /obj/effect/rune/proc/speak_incantation(var/mob/living/user, var/incantation) @@ -91,6 +91,16 @@ if(istype(L) && incantation && (L in user.languages)) user.say(incantation, L) +/obj/effect/rune/get_surgery_success_modifier(delicate) + return delicate ? -10 : 0 + +/obj/effect/rune/get_surgery_surface_quality(mob/living/victim, mob/living/user) + return OPERATE_PASSABLE + +/turf/remove_cleanables() + for(var/obj/effect/rune/rune in src) + qdel(rune) + /* Tier 1 runes below */ /obj/effect/rune/convert @@ -101,8 +111,8 @@ if(spamcheck) return - var/mob/living/carbon/target = null - for(var/mob/living/carbon/M in get_turf(src)) + var/mob/living/target = null + for(var/mob/living/M in get_turf(src)) if(!iscultist(M) && M.stat != DEAD) target = M break @@ -111,14 +121,14 @@ return fizzle(user) speak_incantation(user, "Mah[pick("'","`")]weyh pleggh at e'ntrath!") - target.visible_message("The markings below [target] glow a bloody red.") + target.visible_message(SPAN_WARNING("The markings below [target] glow a bloody red.")) - to_chat(target, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") + to_chat(target, SPAN_OCCULT("Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.")) var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) if(!cult.can_become_antag(target.mind, 1)) - to_chat(target, "Are you going insane?") + to_chat(target, SPAN_DANGER("Are you going insane?")) else - to_chat(target, "Do you want to join the cult of Nar'Sie? You can choose to ignore offer... Join the cult.") + to_chat(target, SPAN_OCCULT("Do you want to join the cult of Nar'Sie? You can choose to ignore offer... Join the cult.")) spamcheck = 1 spawn(40) @@ -128,15 +138,15 @@ target.take_overall_damage(0, 10) switch(target.get_damage(BURN)) if(0 to 25) - to_chat(target, "Your blood boils as you force yourself to resist the corruption invading every corner of your mind.") + to_chat(target, SPAN_DANGER("Your blood boils as you force yourself to resist the corruption invading every corner of your mind.")) if(25 to 45) - to_chat(target, "Your blood boils and your body burns as the corruption further forces itself into your body and mind.") + to_chat(target, SPAN_DANGER("Your blood boils and your body burns as the corruption further forces itself into your body and mind.")) target.take_overall_damage(0, 3) if(45 to 75) - to_chat(target, "You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble.") + to_chat(target, SPAN_DANGER("You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble.")) target.take_overall_damage(0, 5) if(75 to 100) - to_chat(target, "Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance.") + to_chat(target, SPAN_OCCULT("Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance.")) target.take_overall_damage(0, 10) /obj/effect/rune/convert/Topic(href, href_list) @@ -177,24 +187,24 @@ else if(user.loc == get_turf(src)) speak_incantation(user, "Sas[pick("'","`")]so c'arta forbici!") if(do_after(user, 30)) - user.visible_message("\The [user] disappears in a flash of red light!", "You feel as your body gets dragged into the dimension of Nar-Sie!", "You hear a sickening crunch.") + user.visible_message(SPAN_WARNING("\The [user] disappears in a flash of red light!"), SPAN_WARNING("You feel as your body gets dragged into the dimension of Nar-Sie!"), "You hear a sickening crunch.") user.forceMove(src) showOptions(user) var/warning = 0 while(user.loc == src) user.take_organ_damage(0, 2) if(user.get_damage(BURN) > 50) - to_chat(user, "Your body can't handle the heat anymore!") + to_chat(user, SPAN_DANGER("Your body can't handle the heat anymore!")) leaveRune(user) return if(warning == 0) - to_chat(user, "You feel the immerse heat of the realm of Nar-Sie...") + to_chat(user, SPAN_WARNING("You feel the immerse heat of the realm of Nar-Sie...")) ++warning if(warning == 1 && user.get_damage(BURN) > 15) - to_chat(user, "Your burns are getting worse. You should return to your realm soon...") + to_chat(user, SPAN_WARNING("Your burns are getting worse. You should return to your realm soon...")) ++warning if(warning == 2 && user.get_damage(BURN) > 35) - to_chat(user, "The heat! It burns!") + to_chat(user, SPAN_WARNING("The heat! It burns!")) ++warning sleep(10) else @@ -220,14 +230,14 @@ for(var/obj/effect/rune/teleport/T in cult.teleport_runes) if(T == src) continue - t += "[T.destination]" - to_chat(user, "Teleport runes: [english_list(t, nothing_text = "no other runes exist")]... or return from this rune.") + t += "[T.destination]" + to_chat(user, "Teleport runes: [english_list(t, nothing_text = "no other runes exist")]... or return from this rune.") /obj/effect/rune/teleport/proc/leaveRune(var/mob/living/user) if(user.loc != src) return user.dropInto(loc) - user.visible_message("\The [user] appears in a flash of red light!", "You feel as your body gets thrown out of the dimension of Nar-Sie!", "You hear a pop.") + user.visible_message(SPAN_WARNING("\The [user] appears in a flash of red light!"), SPAN_WARNING("You feel as your body gets thrown out of the dimension of Nar-Sie!"), "You hear a pop.") /obj/effect/rune/tome cultname = "summon tome" @@ -235,7 +245,7 @@ /obj/effect/rune/tome/cast(var/mob/living/user) new /obj/item/book/tome(get_turf(src)) speak_incantation(user, "N[pick("'","`")]ath reth sh'yro eth d'raggathnor!") - visible_message("\The [src] disappears with a flash of red light, and in its place now a book lies.", "You hear a pop.") + visible_message(SPAN_NOTICE("\The [src] disappears with a flash of red light, and in its place now a book lies."), "You hear a pop.") qdel(src) /obj/effect/rune/wall @@ -252,7 +262,7 @@ if(wall) var/wall_max_health = wall.get_max_health() if(wall.current_health >= wall_max_health) - to_chat(user, "The wall doesn't need mending.") + to_chat(user, SPAN_NOTICE("The wall doesn't need mending.")) return t = wall_max_health - wall.current_health wall.current_health += t @@ -260,9 +270,9 @@ wall = new /obj/effect/cultwall(get_turf(src), bcolor) wall.rune = src t = wall.current_health - user.remove_blood_simple(t / 50) + user.remove_blood(t / 50, absolute = TRUE) speak_incantation(user, "Khari[pick("'","`")]d! Eske'te tannin!") - to_chat(user, "Your blood flows into the rune, and you feel that the very space over the rune thickens.") + to_chat(user, SPAN_WARNING("Your blood flows into the rune, and you feel that the very space over the rune thickens.")) /obj/effect/cultwall name = "red mist" @@ -291,27 +301,27 @@ if(iscultist(user)) var/current_max_health = get_max_health() if(current_health == current_max_health) - to_chat(user, "It is fully intact.") + to_chat(user, SPAN_NOTICE("It is fully intact.")) else if(current_health > current_max_health * 0.5) - to_chat(user, "It is damaged.") + to_chat(user, SPAN_WARNING("It is damaged.")) else - to_chat(user, "It is about to dissipate.") + to_chat(user, SPAN_DANGER("It is about to dissipate.")) /obj/effect/cultwall/attack_hand(var/mob/user) SHOULD_CALL_PARENT(FALSE) if(iscultist(user)) - user.visible_message("\The [user] touches \the [src], and it fades.", "You touch \the [src], whispering the old ritual, making it disappear.") + user.visible_message(SPAN_NOTICE("\The [user] touches \the [src], and it fades."), SPAN_NOTICE("You touch \the [src], whispering the old ritual, making it disappear.")) qdel(src) else - to_chat(user, "You touch \the [src]. It feels wet and becomes harder the further you push your arm.") + to_chat(user, SPAN_NOTICE("You touch \the [src]. It feels wet and becomes harder the further you push your arm.")) return TRUE /obj/effect/cultwall/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/nullrod)) - user.visible_message("\The [user] touches \the [src] with \the [I], and it disappears.", "You disrupt the vile magic with the deadening field of \the [I].") + user.visible_message(SPAN_NOTICE("\The [user] touches \the [src] with \the [I], and it disappears."), SPAN_NOTICE("You disrupt the vile magic with the deadening field of \the [I].")) qdel(src) else if(I.force) - user.visible_message("\The [user] hits \the [src] with \the [I].", "You hit \the [src] with \the [I].") + user.visible_message(SPAN_NOTICE("\The [user] hits \the [src] with \the [I]."), SPAN_NOTICE("You hit \the [src] with \the [I].")) take_damage(I.force, I.atom_damage_type) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.do_attack_animation(src) @@ -322,10 +332,10 @@ take_damage(Proj.damage, Proj.atom_damage_type) ..() -/obj/effect/cultwall/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/effect/cultwall/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) current_health -= damage if(current_health <= 0) - visible_message("\The [src] dissipates.") + visible_message(SPAN_WARNING("\The [src] dissipates.")) qdel(src) /obj/effect/rune/ajorney @@ -371,7 +381,7 @@ T.turf_flags &= ~TURF_FLAG_HOLY else T.on_defilement() - visible_message("\The [src] embeds into the floor and walls around it, changing them!", "You hear liquid flow.") + visible_message(SPAN_WARNING("\The [src] embeds into the floor and walls around it, changing them!"), "You hear liquid flow.") qdel(src) /obj/effect/rune/obscure @@ -385,7 +395,7 @@ runecheck = 1 if(runecheck) speak_incantation(user, "Kla[pick("'","`")]atu barada nikt'o!") - visible_message("\ The rune turns into gray dust that conceals the surrounding runes.") + visible_message(SPAN_WARNING("\ The rune turns into gray dust that conceals the surrounding runes.")) qdel(src) /obj/effect/rune/reveal @@ -399,7 +409,7 @@ irunecheck = 1 if(irunecheck) speak_incantation(user, "Nikt[pick("'","`")]o barada kla'atu!") - visible_message("\ The rune turns into red dust that reveals the surrounding runes.") + visible_message(SPAN_WARNING("\ The rune turns into red dust that reveals the surrounding runes.")) qdel(src) /* Tier 2 runes */ @@ -411,7 +421,7 @@ /obj/effect/rune/armor/cast(var/mob/living/user) speak_incantation(user, "N'ath reth sh'yro eth d[pick("'","`")]raggathnor!") - visible_message("\The [src] disappears with a flash of red light, and a set of armor appears on \the [user].", "You are blinded by the flash of red light. After you're able to see again, you see that you are now wearing a set of armor.") + visible_message(SPAN_WARNING("\The [src] disappears with a flash of red light, and a set of armor appears on \the [user]."), SPAN_WARNING("You are blinded by the flash of red light. After you're able to see again, you see that you are now wearing a set of armor.")) var/obj/O = user.get_equipped_item(slot_head_str) // This will most likely kill you if you are wearing a spacesuit, and it's 100% intended if(O && !istype(O, /obj/item/clothing/head/culthood) && user.try_unequip(O)) @@ -446,10 +456,10 @@ /obj/effect/rune/offering/cast(var/mob/living/user) var/list/mob/living/cultists = get_cultists() if(victim) - to_chat(user, "You are already sarcificing \the [victim] on this rune.") + to_chat(user, SPAN_WARNING("You are already sarcificing \the [victim] on this rune.")) return if(cultists.len < 3) - to_chat(user, "You need three cultists around this rune to make it work.") + to_chat(user, SPAN_WARNING("You need three cultists around this rune to make it work.")) return fizzle(user) var/turf/T = get_turf(src) for(var/mob/living/M in T) @@ -472,7 +482,7 @@ var/dam_amt = 2 + length(casters) victim.take_organ_damage(dam_amt, dam_amt) // This is to speed up the process and also damage mobs that don't take damage from being on fire, e.g. borgs if(ishuman(victim)) - var/mob/living/carbon/human/H = victim + var/mob/living/human/H = victim if(H.is_asystole()) H.take_damage(2 + casters.len, BRAIN) sleep(40) @@ -481,34 +491,14 @@ cult.add_cultiness(CULTINESS_PER_SACRIFICE) var/obj/item/soulstone/full/F = new(get_turf(src)) for(var/mob/M in cultists | get_cultists()) - to_chat(M, "The Geometer of Blood accepts this offering.") - visible_message("\The [F] appears over \the [src].") + to_chat(M, SPAN_WARNING("The Geometer of Blood accepts this offering.")) + visible_message(SPAN_NOTICE("\The [F] appears over \the [src].")) cult.sacrificed += victim.mind if(victim.mind == cult.sacrifice_target) for(var/datum/mind/H in cult.current_antagonists) if(H.current) - to_chat(H.current, "Your objective is now complete.") - //TODO: other rewards? - /* old sac code - left there in case someone wants to salvage it - var/worth = 0 - if(ishuman(H)) - var/mob/living/carbon/human/lamb = H - if(lamb.species.rarity_value > 3) - worth = 1 - - if(H.mind == cult.sacrifice_target) - - to_chat(usr, "The Geometer of Blood accepts this sacrifice, your objective is now complete.") - - to_chat(usr, "The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice.") - - to_chat(usr, "The Geometer of blood accepts this sacrifice.") - to_chat(usr, "However, this soul was not enough to gain His favor.") - - to_chat(usr, "The Geometer of blood accepts this sacrifice.") - to_chat(usr, "However, a mere dead body is not enough to satisfy Him.") - */ - to_chat(victim, "The Geometer of Blood claims your body.") + to_chat(H.current, SPAN_OCCULT("Your objective is now complete.")) + to_chat(victim, SPAN_OCCULT("The Geometer of Blood claims your body.")) victim.dust() if(victim) victim.ExtinguishMob() // Technically allows them to put the fire out by sacrificing them and stopping immediately, but I don't think it'd have much effect @@ -520,23 +510,23 @@ strokes = 3 /obj/effect/rune/drain/cast(var/mob/living/user) - var/mob/living/carbon/human/victim - for(var/mob/living/carbon/human/M in get_turf(src)) + var/mob/living/human/victim + for(var/mob/living/human/M in get_turf(src)) if(iscultist(M)) continue victim = M if(!victim) return fizzle(user) if(victim.vessel.total_volume < 20) - to_chat(user, "This body has no blood in it.") + to_chat(user, SPAN_WARNING("This body has no blood in it.")) return fizzle(user) victim.vessel.remove_any(20) admin_attack_log(user, victim, "Used a blood drain rune.", "Was victim of a blood drain rune.", "used a blood drain rune on") speak_incantation(user, "Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!") - user.visible_message("Blood flows from \the [src] into \the [user]!", "The blood starts flowing from \the [src] into your frail mortal body. [capitalize(english_list(heal_user(user), nothing_text = "you feel no different"))].", "You hear liquid flow.") + user.visible_message(SPAN_WARNING("Blood flows from \the [src] into \the [user]!"), SPAN_OCCULT("The blood starts flowing from \the [src] into your frail mortal body. [capitalize(english_list(heal_user(user), nothing_text = "you feel no different"))]."), "You hear liquid flow.") user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) -/obj/effect/rune/drain/proc/heal_user(var/mob/living/carbon/human/user) +/obj/effect/rune/drain/proc/heal_user(var/mob/living/human/user) if(!istype(user)) return list("you feel no different") var/list/statuses = list() @@ -612,7 +602,7 @@ /obj/effect/rune/massdefile/cast(var/mob/living/user) var/list/mob/living/cultists = get_cultists() if(cultists.len < 3) - to_chat(user, "You need three cultists around this rune to make it work.") + to_chat(user, SPAN_WARNING("You need three cultists around this rune to make it work.")) return fizzle(user) else for(var/mob/living/M in cultists) @@ -622,7 +612,7 @@ T.turf_flags &= ~TURF_FLAG_HOLY else T.on_defilement() - visible_message("\The [src] embeds into the floor and walls around it, changing them!", "You hear liquid flow.") + visible_message(SPAN_WARNING("\The [src] embeds into the floor and walls around it, changing them!"), "You hear liquid flow.") qdel(src) /* Tier 3 runes */ @@ -633,11 +623,11 @@ /obj/effect/rune/weapon/cast(var/mob/living/user) if(!istype(user.get_equipped_item(slot_head_str), /obj/item/clothing/head/culthood) || !istype(user.get_equipped_item(slot_wear_suit_str), /obj/item/clothing/suit/cultrobes) || !istype(user.get_equipped_item(slot_shoes_str), /obj/item/clothing/shoes/cult)) - to_chat(user, "You need to be wearing your robes to use this rune.") + to_chat(user, SPAN_WARNING("You need to be wearing your robes to use this rune.")) return fizzle(user) var/turf/T = get_turf(src) if(!T.is_defiled()) - to_chat(user, "This rune needs to be placed on the defiled ground.") + to_chat(user, SPAN_WARNING("This rune needs to be placed on the defiled ground.")) return fizzle(user) speak_incantation(user, "N'ath reth sh'yro eth d[pick("'","`")]raggathnor!") user.put_in_hands(new /obj/item/sword/cultblade(user)) @@ -650,7 +640,7 @@ /obj/effect/rune/shell/cast(var/mob/living/user) var/turf/T = get_turf(src) if(!T.is_defiled()) - to_chat(user, "This rune needs to be placed on the defiled ground.") + to_chat(user, SPAN_WARNING("This rune needs to be placed on the defiled ground.")) return fizzle(user) var/obj/item/stack/material/target @@ -660,13 +650,13 @@ break if(!target) - to_chat(user, "You need ten sheets of steel to fold them into a construct shell.") + to_chat(user, SPAN_WARNING("You need ten sheets of steel to fold them into a construct shell.")) return fizzle(user) speak_incantation(user, "Da A[pick("'","`")]ig Osk!") target.use(10) var/obj/O = new /obj/structure/constructshell/cult(get_turf(src)) - visible_message("The metal bends into \the [O], and \the [src] imbues into it.", "You hear a metallic sound.") + visible_message(SPAN_WARNING("The metal bends into \the [O], and \the [src] imbues into it."), "You hear a metallic sound.") qdel(src) /obj/effect/rune/confuse @@ -675,7 +665,7 @@ /obj/effect/rune/confuse/cast(var/mob/living/user) speak_incantation(user, "Fuu ma[pick("'","`")]jin!") - visible_message("\The [src] explodes in a bright flash.") + visible_message(SPAN_DANGER("\The [src] explodes in a bright flash.")) var/list/mob/affected = list() for(var/mob/living/M in viewers(src)) if(iscultist(M)) @@ -699,9 +689,9 @@ strokes = 4 /obj/effect/rune/revive/cast(var/mob/living/user) - var/mob/living/carbon/human/target + var/mob/living/human/target var/obj/item/soulstone/source - for(var/mob/living/carbon/human/M in get_turf(src)) + for(var/mob/living/human/M in get_turf(src)) if(M.stat == DEAD) if(iscultist(M)) if(M.key) @@ -741,7 +731,7 @@ var/list/mob/living/current = list() while(cultists.len >= 3) cultists = get_cultists() - for(var/mob/living/carbon/M in viewers(src)) + for(var/mob/living/M in viewers(src)) if(iscultist(M)) continue current |= M @@ -751,9 +741,9 @@ M.take_overall_damage(5, 5) if(!(M in previous)) if(M.should_have_organ(BP_HEART)) - to_chat(M, "Your blood boils!") + to_chat(M, SPAN_DANGER("Your blood boils!")) else - to_chat(M, "You feel searing heat inside!") + to_chat(M, SPAN_DANGER("You feel searing heat inside!")) previous = current.Copy() current.Cut() sleep(10) @@ -772,14 +762,14 @@ if(!cult.allow_narsie) return if(the_end_comes) - to_chat(user, "You are already summoning! Be patient!") + to_chat(user, SPAN_OCCULT("You are already summoning! Be patient!")) return var/list/mob/living/cultists = get_cultists() if(cultists.len < 5) return fizzle() for(var/mob/living/M in cultists) M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!") - to_chat(M, "You are starting to tear through the veil, opening the way to bring Him back... stay around the rune!") + to_chat(M, SPAN_OCCULT("You are starting to tear through the veil, opening the way to bring Him back... stay around the rune!")) log_and_message_admins_many(cultists, "started summoning Nar-sie.") var/area/A = get_area(src) @@ -817,7 +807,7 @@ if(input != "Yes") return TRUE speak_incantation(user, "Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!") - to_chat(user, "In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.") + to_chat(user, SPAN_WARNING("In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.")) for(var/mob/M in global.living_mob_list_) if(iscultist(M)) var/decl/pronouns/G = user.get_pronouns() @@ -854,10 +844,10 @@ tainted = 1 if(!target) if(tainted) - to_chat(user, "The blank is tainted. It is unsuitable.") + to_chat(user, SPAN_WARNING("The blank is tainted. It is unsuitable.")) return fizzle(user) speak_incantation(user, "H'drak v[pick("'","`")]loso, mir'kanas verbot!") - visible_message("The rune forms into an arcane image on the paper.") + visible_message(SPAN_WARNING("The rune forms into an arcane image on the paper.")) new papertype(get_turf(src)) qdel(target) qdel(src) diff --git a/code/game/antagonist/station/cultist.dm b/mods/gamemodes/cult/special_role.dm similarity index 90% rename from code/game/antagonist/station/cultist.dm rename to mods/gamemodes/cult/special_role.dm index bd4d4832b73..4f25ddeb6d2 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/mods/gamemodes/cult/special_role.dm @@ -1,23 +1,8 @@ -#define CULTINESS_PER_CULTIST 40 -#define CULTINESS_PER_SACRIFICE 40 -#define CULTINESS_PER_TURF 1 - -#define CULT_RUNES_1 200 -#define CULT_RUNES_2 400 -#define CULT_RUNES_3 1000 - -#define CULT_GHOSTS_1 400 -#define CULT_GHOSTS_2 800 -#define CULT_GHOSTS_3 1200 - -#define CULT_MAX_CULTINESS 1200 // When this value is reached, the game stops checking for updates so we don't recheck every time a tile is converted in endgame - /proc/iscultist(var/mob/player) - if(!player.mind) - return 0 var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) - if(player.mind in cult.current_antagonists) - return 1 + if(player.mind && (player.mind in cult.current_antagonists)) + return TRUE + return FALSE /decl/special_role/cultist name = "Cultist" @@ -69,7 +54,7 @@ sacrifice_target = sacrifice.target global_objectives |= sacrifice -/decl/special_role/cultist/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/cultist/equip_role(var/mob/living/human/player) . = ..() if(.) var/obj/item/book/tome/T = new(get_turf(player)) @@ -149,7 +134,7 @@ if(!iscultist(M) || !M.mind) return - to_chat(M, "Do you want to abandon the cult of Nar'Sie? ACCEPT") + to_chat(M, "Do you want to abandon the cult of Nar'Sie? ACCEPT") /decl/special_role/cultist/Topic(href, href_list) if(href_list["confirmleave"]) diff --git a/code/modules/spells/aoe_turf/conjure/construct.dm b/mods/gamemodes/cult/spells/construct.dm similarity index 100% rename from code/modules/spells/aoe_turf/conjure/construct.dm rename to mods/gamemodes/cult/spells/construct.dm diff --git a/code/modules/spells/targeted/harvest.dm b/mods/gamemodes/cult/spells/harvest.dm similarity index 100% rename from code/modules/spells/targeted/harvest.dm rename to mods/gamemodes/cult/spells/harvest.dm diff --git a/code/game/gamemodes/cult/cult_structures.dm b/mods/gamemodes/cult/structures.dm similarity index 60% rename from code/game/gamemodes/cult/cult_structures.dm rename to mods/gamemodes/cult/structures.dm index 769fbc05658..53aaa9c60ae 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/mods/gamemodes/cult/structures.dm @@ -3,19 +3,13 @@ anchored = TRUE icon = 'icons/obj/cult.dmi' -/obj/structure/cult/talisman - name = "Altar" - desc = "A bloodstained altar dedicated to Nar-Sie." - icon_state = "talismanaltar" - - /obj/structure/cult/forge - name = "Daemon forge" + name = "\improper Daemon forge" desc = "A forge used in crafting the unholy weapons used by the armies of Nar-Sie." icon_state = "forge" /obj/structure/cult/pylon - name = "Pylon" + name = "pylon" desc = "A floating crystal that hums with an unearthly energy." icon = 'icons/obj/structures/pylon.dmi' icon_state = "pylon" @@ -74,7 +68,7 @@ return "Tribal pylon - subject resembles statues/emblems built by cargo cult civilisations to honour energy systems from post-warp civilisations." /obj/structure/cult/tome - name = "Desk" + name = "desk" desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl." icon_state = "tomealtar" @@ -88,24 +82,6 @@ icon = 'magic_pillar.dmi' */ -/obj/effect/gateway - name = "gateway" - desc = "You're pretty sure that abyss is staring back." - icon = 'icons/obj/cult.dmi' - icon_state = "hole" - density = TRUE - anchored = TRUE - var/spawnable = null - -/obj/effect/gateway/active - light_range=5 - light_color="#ff0000" - spawnable=list( - /mob/living/simple_animal/hostile/scarybat, - /mob/living/simple_animal/hostile/creature, - /mob/living/simple_animal/hostile/faithless - ) - /obj/effect/gateway/active/cult light_range=5 light_color="#ff0000" @@ -115,53 +91,30 @@ /mob/living/simple_animal/hostile/faithless/cult ) -/obj/effect/gateway/active/Initialize() - . = ..() - addtimer(CALLBACK(src, PROC_REF(create_and_delete)), rand(30,60) SECONDS) - - -/obj/effect/gateway/active/proc/create_and_delete() - var/t = pick(spawnable) - new t(src.loc) - qdel(src) - -/obj/effect/gateway/active/Crossed(var/atom/movable/AM) - if(!isliving(AM)) - return +/obj/structure/door/cult + material = /decl/material/solid/stone/cult - var/mob/living/M = AM - if(M.stat == DEAD) - return +/obj/structure/girder/cult + icon= 'icons/obj/cult.dmi' + icon_state= "cultgirder" + max_health = 150 + cover = 70 - if(M.HasMovementHandler(/datum/movement_handler/mob/transformation)) - return - - M.handle_pre_transformation() - - if(iscultist(M)) - return - if(!ishuman(M) && !isrobot(M)) - return +/obj/structure/girder/cult/dismantle_structure(mob/user) + material = null + reinf_material = null + parts_type = null + . = ..() - M.AddMovementHandler(/datum/movement_handler/mob/transformation) - M.icon = null - M.overlays.len = 0 - M.set_invisibility(INVISIBILITY_ABSTRACT) +/obj/structure/grille/cult + name = "cult grille" + desc = "A matrice built out of an unknown material, with some sort of force field blocking air around it." + material = /decl/material/solid/stone/cult - if(isrobot(M)) - var/mob/living/silicon/robot/Robot = M - QDEL_NULL(Robot.central_processor) - else - for(var/obj/item/W in M) - M.drop_from_inventory(W) - if(istype(W, /obj/item/implant)) - qdel(W) - - var/mob/living/new_mob = new /mob/living/simple_animal/corgi(AM.loc) - new_mob.a_intent = I_HURT - if(M.mind) - M.mind.transfer_to(new_mob) - else - new_mob.key = M.key +/obj/structure/grille/cult/CanPass(atom/movable/mover, turf/target, height = 1.5, air_group = 0) + if(air_group) + return 0 //Make sure air doesn't drain + ..() - to_chat(new_mob, "Your form morphs into that of a corgi.")//Because we don't have cluwnes +/obj/structure/talisman_altar + desc = "A bloodstained altar dedicated to Nar-Sie." \ No newline at end of file diff --git a/code/game/gamemodes/cult/talisman.dm b/mods/gamemodes/cult/talisman.dm similarity index 100% rename from code/game/gamemodes/cult/talisman.dm rename to mods/gamemodes/cult/talisman.dm diff --git a/mods/gamemodes/cult/wizard.dm b/mods/gamemodes/cult/wizard.dm new file mode 100644 index 00000000000..b29fa023f65 --- /dev/null +++ b/mods/gamemodes/cult/wizard.dm @@ -0,0 +1,47 @@ +// #ifdef GAMEMODE_PACK_WIZARD +// todo: add wizard gamemode define check once it's modularized +/decl/modpack/cult/post_initialize() + . = ..() + global.artefact_feedback[/obj/structure/closet/wizard/souls] = "SS" + +/datum/spellbook/standard/New() + spells[/obj/structure/closet/wizard/souls] = 1 + ..() + +/datum/spellbook/druid/New() + spells[/obj/structure/closet/wizard/souls] = 1 + ..() + +/obj/structure/closet/wizard/souls + name = "Soul Shard Belt" + desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot. This also includes the spell Artificer, used to create the shells used in construct creation." + +/obj/structure/closet/wizard/souls/WillContain() + return list( + /obj/item/contract/boon/wizard/artificer, + /obj/item/belt/soulstone/full, + ) + +/datum/storage/belt/soulstone + can_hold = list( + /obj/item/soulstone + ) + +/obj/item/belt/soulstone + name = "soul stone belt" + desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away." + icon = 'icons/clothing/belt/soulstones.dmi' + storage = /datum/storage/belt/soulstone + +/obj/item/belt/soulstone/full/WillContain() + return list(/obj/item/soulstone = max(1, storage?.storage_slots)) + +/obj/item/contract/boon/wizard/artificer + path = /spell/aoe_turf/conjure/construct + desc = "This contract has a passage dedicated to an entity known as 'Nar-Sie'." + +/obj/item/magic_rock + material = /decl/material/solid/stone/cult + +/obj/item/summoning_stone + material = /decl/material/solid/stone/cult \ No newline at end of file diff --git a/code/modules/mob/living/deity/items/_defines.dm b/mods/gamemodes/deity/_defines.dm similarity index 64% rename from code/modules/mob/living/deity/items/_defines.dm rename to mods/gamemodes/deity/_defines.dm index c567b104862..285469200ee 100644 --- a/code/modules/mob/living/deity/items/_defines.dm +++ b/mods/gamemodes/deity/_defines.dm @@ -11,4 +11,9 @@ #define DEITY_ARMOR_CRAFT "Armor Crafting" #define DEITY_VOID_CRAFT "Void Crafting" #define DEITY_UNLOCK_ARMS "Unlock Armaments" -#define DEITY_UNLOCK_HEAL "Unlock Cleric Spells" \ No newline at end of file +#define DEITY_UNLOCK_HEAL "Unlock Cleric Spells" + +#define isdeity(A) istype(A, /mob/living/deity) + +#define DEITY_STRUCTURE_NEAR_IMPORTANT 1 //Whether this needs to be near an important structure. +#define DEITY_STRUCTURE_ALONE 2 //Whether this can be near another of the same type. \ No newline at end of file diff --git a/mods/gamemodes/deity/_deity.dm b/mods/gamemodes/deity/_deity.dm new file mode 100644 index 00000000000..6c658e122b3 --- /dev/null +++ b/mods/gamemodes/deity/_deity.dm @@ -0,0 +1,2 @@ +/decl/modpack/deity + name = "Deity Gamemode Content" \ No newline at end of file diff --git a/mods/gamemodes/deity/_deity.dme b/mods/gamemodes/deity/_deity.dme new file mode 100644 index 00000000000..a1603dd317d --- /dev/null +++ b/mods/gamemodes/deity/_deity.dme @@ -0,0 +1,80 @@ +#ifndef GAMEMODE_PACK_DEITY +#define GAMEMODE_PACK_DEITY +// BEGIN_INCLUDE +#include "_defines.dm" +#include "_deity.dm" +#include "codex.dm" +#include "deity_base.dm" +#include "deity_role.dm" +#include "gamemode.dm" +#include "god_cultist_role.dm" +#include "overrides.dm" +#include "extensions\deity_be_near.dm" +#include "forms\forms.dm" +// These should only load if cult is loaded. +#ifdef GAMEMODE_PACK_CULT +#include "forms\narsie\items.dm" +#include "forms\narsie\narsie.dm" +#include "forms\narsie\structures.dm" +#include "forms\narsie\deity_items\basic.dm" +#include "forms\narsie\deity_items\minions.dm" +#include "forms\narsie\deity_items\sacrificing.dm" +#include "forms\narsie\deity_items\smithing.dm" +#include "forms\narsie\spells\tear_veil.dm" +#endif +#include "forms\starlight\items.dm" +#include "forms\starlight\mobs.dm" +#include "forms\starlight\starlight.dm" +#include "forms\starlight\structures.dm" +#include "forms\starlight\deity_items\artifacts.dm" +#include "forms\starlight\deity_items\phenomena.dm" +#include "forms\starlight\deity_items\spells.dm" +#include "forms\starlight\spells\disable_tech.dm" +#include "forms\starlight\spells\starlight_aura.dm" +#include "forms\starlight\spells\veil_of_shadows.dm" +#include "forms\tower\spells.dm" +#include "forms\tower\structures.dm" +#include "forms\tower\tower.dm" +#include "forms\tower\deity_items\conjuration.dm" +#include "forms\tower\deity_items\transmutation.dm" +#include "mobs\deity.dm" +#include "mobs\deity_boons.dm" +#include "mobs\deity_click.dm" +#include "mobs\deity_hud.dm" +#include "mobs\deity_items.dm" +#include "mobs\deity_phenomena.dm" +#include "mobs\deity_power.dm" +#include "mobs\deity_pylon.dm" +#include "mobs\deity_sources.dm" +#include "mobs\deity_Stat.dm" +#include "mobs\deity_topic.dm" +#include "mobs\deity_tracking.dm" +#include "mobs\say.dm" +#include "mobs\freelook\cultnet.dm" +#include "mobs\freelook\mask.dm" +#include "mobs\items\blood_crafting.dm" +#include "mobs\items\deity_item.dm" +#include "mobs\items\general.dm" +#include "mobs\items\generic.dm" +#include "mobs\menu\deity_nano.dm" +#include "mobs\phenomena\_defines.dm" +#include "mobs\phenomena\communication.dm" +#include "mobs\phenomena\conjuration.dm" +#include "mobs\phenomena\conversion.dm" +#include "mobs\phenomena\generic.dm" +#include "mobs\phenomena\narsie.dm" +#include "mobs\phenomena\phenomena.dm" +#include "mobs\phenomena\starlight.dm" +#include "mobs\phenomena\transmutation.dm" +#include "screen\intent.dm" +#include "spells\boon.dm" +#include "spells\construction.dm" +#include "spells\open_gateway.dm" +#include "spells\vision.dm" +#include "structures\altar.dm" +#include "structures\blood_forge.dm" +#include "structures\pylon.dm" +#include "structures\structures.dm" +#include "structures\trap.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/mods/gamemodes/deity/codex.dm b/mods/gamemodes/deity/codex.dm new file mode 100644 index 00000000000..fae5bfe607a --- /dev/null +++ b/mods/gamemodes/deity/codex.dm @@ -0,0 +1,38 @@ +/datum/codex_entry/deity + abstract_type = /datum/codex_entry/deity + +/datum/codex_entry/deity/altar + associated_paths = list(/obj/structure/deity/altar) + mechanics_text = "To place someone upon the altar, first have them in an aggressive grab and click the altar while adjacent." + antag_text = "This structure anchors your deity within this realm, granting them additional power to influence it and empower their followers. Additionally, using it as a focus for their powers, they can convert someone laying on top of the altar.
    " + disambiguator = "occult" + +/datum/codex_entry/deity/blood_forge + associated_paths = list(/obj/structure/deity/blood_forge) + antag_text = "Allows creation of special items by feeding your blood into it. Only usable by cultists of the aligned deity." + disambiguator = "occult" + +/datum/codex_entry/deity/gateway + associated_paths = list(/obj/structure/deity/gateway) + antag_text = "Stand within the gateway to be transported to an unknown dimension and transformed into a flaming Starborn, a mysterious Blueforged or a subtle Shadowling." + disambiguator = "occult" + +/datum/codex_entry/deity/radiant_statue + associated_paths = list(/obj/structure/deity/radiant_statue) + antag_text = "Allows storage of power if cultists are nearby. This stored power can be expended to charge Starlight items." + disambiguator = "occult" + +/datum/codex_entry/deity/blood_forge/starlight + associated_paths = list(/obj/structure/deity/blood_forge/starlight) + antag_text = "Allows creation of special Starlight items. Only usable by cultists of the aligned deity. Use of this powerful forge will inflict burns." + disambiguator = "occult" + +/datum/codex_entry/deity/wizard_recharger + associated_paths = list(/obj/structure/deity/wizard_recharger) + antag_text = "A well of arcane power. When charged, a cultist may absorb this power to refresh their spells." + disambiguator = "occult" + +/datum/codex_entry/deity/pylon + associated_paths = list(/obj/structure/deity/pylon) + antag_text = "Serves as a conduit for a deity to speak through, making their will known in this dimension to any who hear it." + disambiguator = "occult" \ No newline at end of file diff --git a/maps/antag_spawn/deity/deity.dm b/mods/gamemodes/deity/deity_base.dm similarity index 82% rename from maps/antag_spawn/deity/deity.dm rename to mods/gamemodes/deity/deity_base.dm index 98a32a7e781..0d7268ebd64 100644 --- a/maps/antag_spawn/deity/deity.dm +++ b/mods/gamemodes/deity/deity_base.dm @@ -1,6 +1,8 @@ /datum/map_template/ruin/antag_spawn/deity name = "Deity Base" - suffixes = list("deity/deity_base.dmm") + mappaths = list( + "mods/gamemodes/deity/deity_base.dmm" + ) apc_test_exempt_areas = list( /area/map_template/deity_spawn = NO_SCRUBBER|NO_VENT|NO_APC ) diff --git a/maps/antag_spawn/deity/deity_base.dmm b/mods/gamemodes/deity/deity_base.dmm similarity index 100% rename from maps/antag_spawn/deity/deity_base.dmm rename to mods/gamemodes/deity/deity_base.dmm diff --git a/code/game/antagonist/outsider/deity.dm b/mods/gamemodes/deity/deity_role.dm similarity index 100% rename from code/game/antagonist/outsider/deity.dm rename to mods/gamemodes/deity/deity_role.dm diff --git a/code/datums/extensions/deity_be_near.dm b/mods/gamemodes/deity/extensions/deity_be_near.dm similarity index 91% rename from code/datums/extensions/deity_be_near.dm rename to mods/gamemodes/deity/extensions/deity_be_near.dm index 38c57449fc0..5eed3ae1fe4 100644 --- a/code/datums/extensions/deity_be_near.dm +++ b/mods/gamemodes/deity/extensions/deity_be_near.dm @@ -31,10 +31,10 @@ var/dist = get_dist(holder,s) if(dist < min_dist) min_dist = dist - if(min_dist > threshold_base) - deal_damage(I.loc, round(min_dist/threshold_base)) - else if(keep_away_instead && min_dist < threshold_base) + if(keep_away_instead && min_dist < threshold_base) deal_damage(I.loc, round(threshold_base/min_dist)) + else if(min_dist > threshold_base) + deal_damage(I.loc, round(min_dist/threshold_base)) /datum/extension/deity_be_near/proc/deal_damage(var/mob/living/victim, var/mult) @@ -42,7 +42,7 @@ /datum/extension/deity_be_near/proc/dead_deity() var/obj/item/I = holder - I.visible_message("\The [holder]'s power fades!") + I.visible_message(SPAN_WARNING("\The [holder]'s power fades!")) qdel(src) /datum/extension/deity_be_near/proc/wearing_full() @@ -50,7 +50,7 @@ if(!ishuman(I.loc)) return FALSE - var/mob/living/carbon/human/H = I.loc + var/mob/living/human/H = I.loc if(H.get_equipped_slot_for_item(I) != slot_wear_suit_str) return FALSE if(expected_helmet && !istype(H.get_equipped_item(slot_head_str), expected_helmet)) diff --git a/code/modules/mob/living/deity/forms.dm b/mods/gamemodes/deity/forms/forms.dm similarity index 95% rename from code/modules/mob/living/deity/forms.dm rename to mods/gamemodes/deity/forms/forms.dm index b9f083eae9e..6f1f2f135b3 100644 --- a/code/modules/mob/living/deity/forms.dm +++ b/mods/gamemodes/deity/forms/forms.dm @@ -30,6 +30,7 @@ Each plays slightly different and has different challenges/benefits D.set_items(complete_items) items.Cut() +// TODO: Make this not a thing. It's so bad. /datum/god_form/proc/sync_structure(var/obj/O) var/list/svars = buildables[O.type] if(!svars) @@ -38,7 +39,7 @@ Each plays slightly different and has different challenges/benefits O.vars[V] = svars[V] /datum/god_form/proc/take_charge(var/mob/living/user, var/charge) - return 1 + return TRUE /datum/god_form/Destroy() if(linked_god) diff --git a/code/modules/mob/living/deity/items/narsie/basic.dm b/mods/gamemodes/deity/forms/narsie/deity_items/basic.dm similarity index 87% rename from code/modules/mob/living/deity/items/narsie/basic.dm rename to mods/gamemodes/deity/forms/narsie/deity_items/basic.dm index 764bd556c7d..15613d71311 100644 --- a/code/modules/mob/living/deity/items/narsie/basic.dm +++ b/mods/gamemodes/deity/forms/narsie/deity_items/basic.dm @@ -26,9 +26,9 @@ base_cost = 110 boon_path = /spell/aoe_turf/drain_blood -/datum/deity_item/phenomena/exhude_blood - name = "Phenomena: Exhude Blood" - desc = "You extract the raw blood used in your faith and give it to one of your flock" +/datum/deity_item/phenomena/exude_blood + name = "Phenomena: Exude Blood" + desc = "You extract the raw blood used in your faith and give it to one of your flock." category = "Dark Spells" base_cost = 30 - phenomena_path = /datum/phenomena/exhude_blood \ No newline at end of file + phenomena_path = /datum/phenomena/exude_blood \ No newline at end of file diff --git a/code/modules/mob/living/deity/items/narsie/minions.dm b/mods/gamemodes/deity/forms/narsie/deity_items/minions.dm similarity index 100% rename from code/modules/mob/living/deity/items/narsie/minions.dm rename to mods/gamemodes/deity/forms/narsie/deity_items/minions.dm diff --git a/code/modules/mob/living/deity/items/narsie/sacrificing.dm b/mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm similarity index 100% rename from code/modules/mob/living/deity/items/narsie/sacrificing.dm rename to mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm b/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm new file mode 100644 index 00000000000..bcb12ff11e3 --- /dev/null +++ b/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm @@ -0,0 +1,29 @@ +/datum/deity_item/blood_crafting/narsie + recipes = list( + /obj/item/sword/cultblade = 50, + /obj/item/clothing/head/culthood/alt = 10, + /obj/item/clothing/suit/cultrobes/alt = 20 + ) + +/datum/deity_item/blood_crafting/armored + name = DEITY_ARMOR_CRAFT + desc = "Unlock the secrets to tempered blood smithing, allowing your followers to smith more powerful and expensive armaments." + category = DEITY_BLOOD_CRAFT + base_cost = 75 + requirements = list(DEITY_BLOOD_CRAFT = 1) + recipes = list( + /obj/item/clothing/suit/cultrobes/magusred = 80, + /obj/item/clothing/head/culthood/magus = 50, + /obj/structure/constructshell/cult = 70 + ) //also shield? + +/datum/deity_item/blood_crafting/space + name = DEITY_VOID_CRAFT + desc = "Allows your followers to craft space suits, allowing you to finally spread across the cosmos." + category = DEITY_BLOOD_CRAFT + base_cost = 100 + requirements = list(DEITY_BLOOD_CRAFT = 1, DEITY_ARMOR_CRAFT = 1) + recipes = list( + /obj/item/clothing/suit/space/cult = 100, + /obj/item/clothing/head/helmet/space/cult = 70 + ) //Probably more too. \ No newline at end of file diff --git a/code/game/gamemodes/godmode/form_items/narsie_items.dm b/mods/gamemodes/deity/forms/narsie/items.dm similarity index 77% rename from code/game/gamemodes/godmode/form_items/narsie_items.dm rename to mods/gamemodes/deity/forms/narsie/items.dm index c315f34f390..57d1b807a67 100644 --- a/code/game/gamemodes/godmode/form_items/narsie_items.dm +++ b/mods/gamemodes/deity/forms/narsie/items.dm @@ -17,17 +17,17 @@ if(L.mind) multiplier++ if(ishuman(L)) - var/mob/living/carbon/human/H = L + var/mob/living/human/H = L if(H.should_have_organ(BP_HEART)) multiplier++ if(L.stat == DEAD) - to_chat(user, "\The [a] is already dead! There is nothing to take!") + to_chat(user, SPAN_WARNING("\The [a] is already dead! There is nothing to take!")) return - user.visible_message("\The [user] hovers \the [src] over \the [a], whispering an incantation.") + user.visible_message(SPAN_WARNING("\The [user] hovers \the [src] over \the [a], whispering an incantation.")) if(!do_after(user,200, L)) return - user.visible_message("\The [user] plunges the knife down into \the [a]!") + user.visible_message(SPAN_DANGER("\The [user] plunges the knife down into \the [a]!")) L.take_damage(20) if(altar.linked_god) altar.linked_god.adjust_power_min(2 * multiplier,0,"from a delicious sacrifice!") @@ -44,14 +44,14 @@ /obj/item/twohanded/fireaxe/cult/examine(mob/user) . = ..() if(stored_power) - to_chat(user, "It exudes a death-like smell.") + to_chat(user, SPAN_NOTICE("It exudes a death-like smell.")) /obj/item/twohanded/fireaxe/cult/resolve_attackby(var/atom/a, var/mob/user, var/click_params) if(istype(a, /obj/structure/deity/altar)) var/obj/structure/deity/altar/altar = a if(stored_power && altar.linked_god) altar.linked_god.adjust_power_min(stored_power, "from harvested souls.") - altar.visible_message("\The [altar] absorbs a black mist exuded from \the [src].") + altar.visible_message(SPAN_WARNING("\The [altar] absorbs a black mist exuded from \the [src].")) return if(ismob(a)) var/mob/M = a @@ -63,7 +63,7 @@ /obj/item/twohanded/fireaxe/cult/proc/gain_power() stored_power += 50 - src.visible_message("\The [src] screeches as the smell of death fills the air!") + src.visible_message(SPAN_OCCULT("\The [src] screeches as the smell of death fills the air!")) /obj/item/chems/drinks/zombiedrink name = "well-used urn" diff --git a/mods/gamemodes/deity/forms/narsie/narsie.dm b/mods/gamemodes/deity/forms/narsie/narsie.dm new file mode 100644 index 00000000000..1529c67f691 --- /dev/null +++ b/mods/gamemodes/deity/forms/narsie/narsie.dm @@ -0,0 +1,51 @@ +/datum/god_form/narsie + name = "Nar-Sie" + info = {"The Geometer of Blood, you crave blood and destruction.
    + Benefits:
    + +Can gain power from blood sacrifices.
    + +Ability to forge weapons and armor.
    + Drawbacks:
    + -Servant abilities require copious amounts of their blood. + "} + desc = "A being made of a million nightmares, a billion deaths." + god_icon_state = "nar-sie" + pylon_icon_state = "shade" + faction = "cult" + + buildables = list( + /obj/structure/deity/altar/narsie, + /obj/structure/deity/pylon + ) + items = list( + /datum/deity_item/general/potential, + /datum/deity_item/general/regeneration, + /datum/deity_item/boon/eternal_darkness, + /datum/deity_item/boon/torment, + /datum/deity_item/boon/blood_shard, + /datum/deity_item/boon/drain_blood, + /datum/deity_item/phenomena/exude_blood, + /datum/deity_item/sacrifice, + /datum/deity_item/boon/sac_dagger, + /datum/deity_item/boon/sac_spell, + /datum/deity_item/boon/execution_axe, + /datum/deity_item/blood_stone, + /datum/deity_item/minions, + /datum/deity_item/boon/soul_shard, + /datum/deity_item/boon/blood_zombie, + /datum/deity_item/boon/tear_veil, + /datum/deity_item/phenomena/hellscape, + /datum/deity_item/blood_crafting/narsie, + /datum/deity_item/blood_crafting/armored, + /datum/deity_item/blood_crafting/space + ) + +/datum/god_form/narsie/take_charge(var/mob/living/user, var/charge) + charge = min(100, charge * 0.25) + if(prob(charge)) + to_chat(user, SPAN_WARNING("You feel drained...")) + var/mob/living/human/H = user + if(istype(H) && H.should_have_organ(BP_HEART)) + H.vessel.remove_any(charge) + else + user.take_damage(charge) + return 1 \ No newline at end of file diff --git a/code/modules/spells/general/tear_veil.dm b/mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm similarity index 83% rename from code/modules/spells/general/tear_veil.dm rename to mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm index 02a117c3504..93be7be78e6 100644 --- a/code/modules/spells/general/tear_veil.dm +++ b/mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm @@ -15,11 +15,11 @@ /mob/living/simple_animal/hostile/scarybat/cult, /mob/living/simple_animal/hostile/creature/cult, /mob/living/simple_animal/hostile/faithless/cult - ) + ) /spell/tear_veil/choose_targets() var/turf/T = get_turf(holder) - holder.visible_message("A strange portal rips open underneath \the [holder]!") + holder.visible_message(SPAN_NOTICE("A strange portal rips open underneath \the [holder]!")) var/obj/effect/gateway/hole = new(get_turf(T)) hole.density = FALSE return list(hole) @@ -30,7 +30,7 @@ var/type = pick(possible_spawns) var/mob/living/L = new type(get_turf(targets[1])) L.faction = holder.faction - L.visible_message("\A [L] escapes from the portal!") + L.visible_message(SPAN_WARNING("\A [L] escapes from the portal!")) /spell/tear_veil/after_spell(var/list/targets) qdel(targets[1]) diff --git a/mods/gamemodes/deity/forms/narsie/structures.dm b/mods/gamemodes/deity/forms/narsie/structures.dm new file mode 100644 index 00000000000..af576963a1f --- /dev/null +++ b/mods/gamemodes/deity/forms/narsie/structures.dm @@ -0,0 +1,36 @@ +/obj/structure/deity/altar/narsie + name = "altar" + desc = "A small desk, covered in blood." + icon_state = "talismanaltar" + +//BLOODLETTING STRUCTURE +//A follower can stand here and mumble prayers as they let their blood flow slowly into the structure. +/obj/structure/deity/blood_stone + name = "bloody stone" + desc = "A jagged stone covered in the various stages of blood, from dried to fresh." + icon_state = "blood_stone" + // TODO: material-based health for deity structures + current_health = 100 //It's a piece of rock. + build_cost = 700 + +/obj/structure/deity/blood_stone/attack_hand(var/mob/user) + if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) + return ..() + var/mob/living/human/H = user + user.visible_message( + SPAN_WARNING("\The [user] calmly slices their finger on \the [src], smearing their blood over the black stone."), + SPAN_WARNING("You slowly slide your finger down one of \the [src]'s sharp edges, smearing your blood over its smooth surface.") + ) + while(do_after(H, 5 SECONDS, src)) + user.audible_message("\The [user] utters something under their breath.", SPAN_OCCULT("You mutter a dark prayer to your master as you feel the stone eat away at your lifeforce.")) + if(H.should_have_organ(BP_HEART)) + H.drip(5, get_turf(src)) + else + H.take_damage(5) + linked_god.adjust_power_min(1, 1) + return TRUE + +/datum/codex_entry/deity/blood_stone + associated_paths = list(/obj/structure/deity/blood_stone) + antag_text = "Allows the user to feed blood directly to the aligned deity, granting it power." + disambiguator = "occult" \ No newline at end of file diff --git a/code/modules/mob/living/deity/items/starlight/artifacts.dm b/mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm similarity index 100% rename from code/modules/mob/living/deity/items/starlight/artifacts.dm rename to mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm diff --git a/code/modules/mob/living/deity/items/starlight/phenomena.dm b/mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm similarity index 100% rename from code/modules/mob/living/deity/items/starlight/phenomena.dm rename to mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm diff --git a/code/modules/mob/living/deity/items/starlight/spells.dm b/mods/gamemodes/deity/forms/starlight/deity_items/spells.dm similarity index 100% rename from code/modules/mob/living/deity/items/starlight/spells.dm rename to mods/gamemodes/deity/forms/starlight/deity_items/spells.dm diff --git a/code/game/gamemodes/godmode/form_items/starlight_items.dm b/mods/gamemodes/deity/forms/starlight/items.dm similarity index 90% rename from code/game/gamemodes/godmode/form_items/starlight_items.dm rename to mods/gamemodes/deity/forms/starlight/items.dm index 7cada6acecb..ce799b72f96 100644 --- a/code/game/gamemodes/godmode/form_items/starlight_items.dm +++ b/mods/gamemodes/deity/forms/starlight/items.dm @@ -45,7 +45,7 @@ /obj/item/clothing/suit/armor/sunsuit name = "knight's armor" desc = "Now, you can be the knight in shining armor you've always wanted to be. With complementary sun insignia." - icon = 'icons/clothing/suit/deity/star_champion.dmi' + icon = 'icons/clothing/suits/deity/star_champion.dmi' armor = list( ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, ARMOR_BULLET = ARMOR_BALLISTIC_AP, @@ -64,7 +64,7 @@ /obj/item/clothing/suit/armor/sunrobe name = "oracle's robe" desc = "The robes of a priest. One that praises the sun, apparently. Well, it certainly reflects light well." - icon = 'icons/clothing/suit/deity/star_oracle.dmi' + icon = 'icons/clothing/suits/deity/star_oracle.dmi' armor = list( ARMOR_MELEE = ARMOR_MELEE_KNIVES, ARMOR_BULLET = ARMOR_BALLISTIC_SMALL, @@ -83,7 +83,7 @@ desc = "There is absolutely nothing visible through the fabric. The shadows stick to your skin when you touch it." item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_AIRTIGHT min_pressure_protection = 0 - icon = 'icons/clothing/suit/deity/star_traitor.dmi' + icon = 'icons/clothing/suits/deity/star_traitor.dmi' /obj/item/clothing/head/helmet/space/shadowhood name = "traitor's hood" @@ -110,7 +110,7 @@ else user.take_damage(5, BURN) if(prob(5)) - to_chat(user, "\The [src] appears to be out of power!") + to_chat(user, SPAN_WARNING("\The [src] appears to be out of power!")) new /obj/effect/temporary(get_turf(user),3, 'icons/effects/effects.dmi', "fire_goon") /obj/item/gun/energy/staff/beacon @@ -146,13 +146,13 @@ if(linked.near_structure(src,1)) if(last_near_structure < world.time - 30 SECONDS) - to_chat(loc, "\The [src] surges with power anew!") + to_chat(loc, SPAN_NOTICE("\The [src] surges with power anew!")) last_near_structure = world.time else if(last_near_structure < world.time - 30 SECONDS) //If it has been at least 30 seconds. if(prob(5)) - to_chat(loc, "\The [src] begins to fade, its power dimming this far away from a shrine.") + to_chat(loc, SPAN_WARNING("\The [src] begins to fade, its power dimming this far away from a shrine.")) else if(last_near_structure + 1800 < world.time) - visible_message("\The [src] disintegrates into a pile of ash!") + visible_message(SPAN_WARNING("\The [src] disintegrates into a pile of ash!")) new /obj/effect/decal/cleanable/ash(get_turf(src)) qdel(src) diff --git a/code/game/gamemodes/godmode/form_items/starlight_mobs.dm b/mods/gamemodes/deity/forms/starlight/mobs.dm similarity index 100% rename from code/game/gamemodes/godmode/form_items/starlight_mobs.dm rename to mods/gamemodes/deity/forms/starlight/mobs.dm diff --git a/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm b/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm new file mode 100644 index 00000000000..f6462ae33fe --- /dev/null +++ b/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm @@ -0,0 +1,4 @@ +/spell/aoe_turf/disable_tech/starlight + hidden_from_codex = TRUE + charge_max = 600 + spell_flags = 0 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm b/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm new file mode 100644 index 00000000000..8ad867e41b3 --- /dev/null +++ b/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm @@ -0,0 +1,5 @@ +/spell/radiant_aura/starlight + name = "Starlight Aura" + desc = "This spell makes you immune to laser fire, for a short while at least." + spell_flags = 0 + charge_max = 400 diff --git a/code/modules/spells/general/veil_of_shadows.dm b/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm similarity index 81% rename from code/modules/spells/general/veil_of_shadows.dm rename to mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm index 4d328e65db0..e47edecd082 100644 --- a/code/modules/spells/general/veil_of_shadows.dm +++ b/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm @@ -4,7 +4,7 @@ charge_max = 400 invocation_type = SpI_EMOTE invocation = "flickers out of existance" - school = "Divine" //Means that it doesn't proc the deity's spell cost. + school = "Divine" spell_flags = 0 duration = 100 var/timer_id @@ -18,15 +18,15 @@ . = null /spell/veil_of_shadows/cast(var/list/targets, var/mob/user) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user H.AddMovementHandler(/datum/movement_handler/mob/incorporeal) if(H.add_cloaking_source(src)) - H.visible_message("\The [H] shrinks from view!") + H.visible_message(SPAN_WARNING("\The [H] shrinks from view!")) events_repository.register(/decl/observ/moved, H,src,PROC_REF(check_light)) timer_id = addtimer(CALLBACK(src,PROC_REF(cancel_veil)),duration, TIMER_STOPPABLE) /spell/veil_of_shadows/proc/cancel_veil() - var/mob/living/carbon/human/H = holder + var/mob/living/human/H = holder H.RemoveMovementHandler(/datum/movement_handler/mob/incorporeal) deltimer(timer_id) timer_id = null @@ -38,9 +38,9 @@ events_repository.register(/decl/observ/moved, H,src,PROC_REF(drop_cloak)) /spell/veil_of_shadows/proc/drop_cloak() - var/mob/living/carbon/human/H = holder + var/mob/living/human/H = holder if(H.remove_cloaking_source(src)) - H.visible_message("\The [H] appears from nowhere!") + H.visible_message(SPAN_NOTICE("\The [H] appears from nowhere!")) events_repository.unregister(/decl/observ/moved, H,src) /spell/veil_of_shadows/proc/check_light() diff --git a/code/modules/mob/living/deity/forms/starlight.dm b/mods/gamemodes/deity/forms/starlight/starlight.dm similarity index 96% rename from code/modules/mob/living/deity/forms/starlight.dm rename to mods/gamemodes/deity/forms/starlight/starlight.dm index 4d4e7b69beb..ba3b75a83e8 100644 --- a/code/modules/mob/living/deity/forms/starlight.dm +++ b/mods/gamemodes/deity/forms/starlight/starlight.dm @@ -42,6 +42,6 @@ /datum/god_form/starlight/take_charge(var/mob/living/user, var/charge) charge = max(5, charge/100) if(prob(charge)) - to_chat(user, "Your body burns!") + to_chat(user, SPAN_DANGER("Your body burns!")) user.take_damage(charge, BURN) return 1 \ No newline at end of file diff --git a/code/game/gamemodes/godmode/form_items/starlight_structures.dm b/mods/gamemodes/deity/forms/starlight/structures.dm similarity index 60% rename from code/game/gamemodes/godmode/form_items/starlight_structures.dm rename to mods/gamemodes/deity/forms/starlight/structures.dm index 6cb410e9838..2f9e602e98c 100644 --- a/code/game/gamemodes/godmode/form_items/starlight_structures.dm +++ b/mods/gamemodes/deity/forms/starlight/structures.dm @@ -18,35 +18,35 @@ var/power_drain = 7 var/looking_for var/static/list/possible_forms = list( - "Starborn" = list( - "description" = "A species of hardy fire-wreathed soldiers.", - "message" = "As a Starborn, you are immune to laser-fire you are a hardy soldier, able to take on the greatest of foes.", - "species" = "Starborn" - ), - "Blueforged" = list( - "description" = "Trans-dimensional beings with a multitude of miraculous abilities.", - "message" = "As a Blueforged, you are immune to all physical damage... except for heat. Not even your god can protect you.", - "species" = "Blueforged", - "spells" = list( - /spell/targeted/ethereal_jaunt, - /spell/targeted/shatter, - /spell/hand/burning_grip, - /spell/aoe_turf/disable_tech, - /spell/targeted/projectile/magic_missile, - /spell/open_gateway - ) - ), - "Shadowling" = list( - "description" = "Beings that come from a place of no light. They sneak from place to place, disabling everyone they touch..", - "message" = "As a Shadow you take damage from the light itself but have the ability to vanish from sight itself.", - "species" = "Shadow", - "spells" = list( - /spell/veil_of_shadows, - /spell/targeted/subjugation, - /spell/targeted/projectile/magic_missile - ) - ) - ) + "Starborn" = list( + "description" = "A species of hardy fire-wreathed soldiers.", + "message" = "As a Starborn, you are immune to laser-fire you are a hardy soldier, able to take on the greatest of foes.", + "species" = "Starborn" + ), + "Blueforged" = list( + "description" = "Trans-dimensional beings with a multitude of miraculous abilities.", + "message" = "As a Blueforged, you are immune to all physical damage... except for heat. Not even your god can protect you.", + "species" = "Blueforged", + "spells" = list( + /spell/targeted/ethereal_jaunt, + /spell/targeted/shatter, + /spell/hand/burning_grip, + /spell/aoe_turf/disable_tech, + /spell/targeted/projectile/magic_missile, + /spell/open_gateway + ) + ), + "Shadowling" = list( + "description" = "Beings that come from a place of no light. They sneak from place to place, disabling everyone they touch..", + "message" = "As a Shadow you take damage from the light itself but have the ability to vanish from sight itself.", + "species" = "Shadow", + "spells" = list( + /spell/veil_of_shadows, + /spell/targeted/subjugation, + /spell/targeted/projectile/magic_missile + ) + ) + ) /obj/structure/deity/gateway/Initialize() . = ..() @@ -58,10 +58,10 @@ if(!linked_god) return if(linked_god.power <= 0) - to_chat(linked_god,"\The [src] disappears from your lack of power!") + to_chat(linked_god,SPAN_WARNING("\The [src] disappears from your lack of power!")) qdel(src) return - var/mob/living/carbon/human/target + var/mob/living/human/target if(target_ref) target = target_ref.resolve() if(target) @@ -71,10 +71,10 @@ start_time = 0 return else if(prob(5)) - to_chat(target,"\The [src] sucks at your lifeforce!") + to_chat(target,SPAN_DANGER("\The [src] sucks at your lifeforce!")) if(start_time && world.time > start_time + 300) start_time = 0 - to_chat(target,"You have been sucked into \the [src], your soul used to fuel \the [linked_god]'s minions.") + to_chat(target,SPAN_DANGER("You have been sucked into \the [src], your soul used to fuel \the [linked_god]'s minions.")) var/mob/living/starlight_soul/ss = new(get_turf(linked_god),target) if(target.mind) target.mind.transfer_to(ss) @@ -87,11 +87,11 @@ power_drain -= 3 else //Get new target - var/mob/living/carbon/human/T = locate() in get_turf(src) + var/mob/living/human/T = locate() in get_turf(src) if(T) target_ref = weakref(T) start_time = world.time - to_chat(T, "You feel your lifeforce begin to drain into \the [src]!") + to_chat(T, SPAN_DANGER("You feel your lifeforce begin to drain into \the [src]!")) /obj/structure/deity/gateway/Destroy() linked_god.power_per_regen += power_drain @@ -104,7 +104,7 @@ html += "" for(var/a in possible_forms) var/list/form = possible_forms[a] - html += "" + html += "" html += "
    NameDescription
    [a][form["description"]]
    [a][form["description"]]
    " show_browser(linked_god, jointext(html, null), "window=gateway") @@ -116,14 +116,14 @@ /obj/structure/deity/gateway/proc/stop_looking_for(var/successful) if(looking_for) if(!successful) - to_chat(linked_god, "\The [src] did not find any [looking_for]. You may try again if you wish.") + to_chat(linked_god, SPAN_WARNING("\The [src] did not find any [looking_for]. You may try again if you wish.")) looking_for = null /obj/structure/deity/gateway/OnTopic(var/mob/user, var/list/href_list) if(href_list["accept"] && istype(user,/mob/living/starlight_soul)) if(href_list["accept"] != looking_for) return TOPIC_HANDLED - var/mob/living/carbon/human/H = new(get_turf(src)) + var/mob/living/human/H = new(get_turf(src)) user.mind.transfer_to(H) H.set_species(possible_forms[looking_for]["species"]) for(var/s in possible_forms[looking_for]["spells"]) @@ -136,13 +136,13 @@ return TOPIC_HANDLED if(href_list["spawn_type"] && user == linked_god) if(looking_for) - to_chat(usr, "\The [src] is already looking for a [looking_for].") + to_chat(usr, SPAN_WARNING("\The [src] is already looking for a [looking_for].")) else looking_for = href_list["spawn_type"] - to_chat(usr, "\The [src] is now looking for a [looking_for].") + to_chat(usr, SPAN_NOTICE("\The [src] is now looking for a [looking_for].")) for(var/l in get_turf(linked_god)) if(istype(l, /mob/living/starlight_soul)) - to_chat(l, "\The [src] is looking for a soul to become a [looking_for]. Accept? (Yes)") + to_chat(l, "\The [src] is looking for a soul to become a [looking_for]. Accept? (Yes)") addtimer(CALLBACK(src, PROC_REF(stop_looking_for), FALSE), 30 SECONDS) show_browser(linked_god, null, "window=gateway") return TOPIC_HANDLED @@ -183,18 +183,18 @@ var/obj/O = L.get_equipped_item(slot_wear_suit_str) if(O && has_extension(O,/datum/extension/deity_be_near)) if(activate_charging()) - to_chat(L, "You place your hands on \the [src], feeling your master's power course through you.") + to_chat(L, SPAN_NOTICE("You place your hands on \the [src], feeling your master's power course through you.")) else - to_chat(L, "\The [src] is already activated") + to_chat(L, SPAN_WARNING("\The [src] is already activated")) else - to_chat(L, "\The [src] does not recognize you as a herald of \the [linked_god]. You must wear a full set of herald's armor.") + to_chat(L, SPAN_WARNING("\The [src] does not recognize you as a herald of \the [linked_god]. You must wear a full set of herald's armor.")) return TRUE /obj/structure/deity/radiant_statue/attack_deity(var/mob/living/deity/deity) if(activate_charging()) - to_chat(deity,"You activate \the [src], and it begins to charge as long as at least one of your followers is nearby.") + to_chat(deity,SPAN_NOTICE("You activate \the [src], and it begins to charge as long as at least one of your followers is nearby.")) else - to_chat(deity,"\The [src] is either already activated, or there are no followers nearby to charge it.") + to_chat(deity,SPAN_WARNING("\The [src] is either already activated, or there are no followers nearby to charge it.")) /obj/structure/deity/radiant_statue/proc/activate_charging() var/list/followers = get_followers_nearby() @@ -202,7 +202,7 @@ return 0 charging = 1 START_PROCESSING(SSobj, src) - src.visible_message("\The [src] hums, activating.") + src.visible_message(SPAN_NOTICE("\The [src] hums, activating.")) update_icon() return 1 @@ -224,7 +224,7 @@ shad.charge = initial(shad.charge) . = 1 if(.) - to_chat(user, "\The [src]'s glow envelops \the [I], restoring it to proper use.") + to_chat(user, SPAN_NOTICE("\The [src]'s glow envelops \the [I], restoring it to proper use.")) charge -= 1 /obj/structure/deity/radiant_statue/Process() @@ -236,7 +236,7 @@ return if(charge == 40) - src.visible_message("\The [src] lights up, pulsing with energy.") + src.visible_message(SPAN_NOTICE("\The [src] lights up, pulsing with energy.")) charging = 0 update_icon() else @@ -247,7 +247,7 @@ var/mob/living/L = m L.heal_damage(BURN, 5) if(prob(5)) - to_chat(L, "You feel a pleasant warmth spread throughout your body...") + to_chat(L, SPAN_NOTICE("You feel a pleasant warmth spread throughout your body...")) for(var/s in L.mind.learned_spells) var/spell/spell = s spell.charge_counter = spell.charge_max @@ -256,7 +256,7 @@ /obj/structure/deity/radiant_statue/proc/stop_charging() STOP_PROCESSING(SSobj, src) - src.visible_message("\The [src] powers down, returning to it's dormant form.") + src.visible_message(SPAN_NOTICE("\The [src] powers down, returning to its dormant form.")) charging = 0 update_icon() @@ -264,7 +264,9 @@ name = "radiant forge" desc = "a swath of heat and fire permeats from this forge." recipe_feat_list = "Fire Crafting" - text_modifications = list("Cost" = "Burn", - "Dip" = "fire. Pain envelopes you as dark burns mar your hands and you begin to shape it into something more useful", - "Shape" = "You shape the fire, ignoring the painful burns it gives you in the process.", - "Out" = "flames") + text_modifications = list( + "Cost" = "Burn", + "Dip" = "fire. Pain envelopes you as dark burns mar your hands and you begin to shape it into something more useful", + "Shape" = "You shape the fire, ignoring the painful burns it gives you in the process.", + "Out" = "flames" + ) diff --git a/code/modules/mob/living/deity/items/tower/conjuration.dm b/mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm similarity index 100% rename from code/modules/mob/living/deity/items/tower/conjuration.dm rename to mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm diff --git a/code/modules/mob/living/deity/items/tower/transmutation.dm b/mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm similarity index 100% rename from code/modules/mob/living/deity/items/tower/transmutation.dm rename to mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm diff --git a/mods/gamemodes/deity/forms/tower/spells.dm b/mods/gamemodes/deity/forms/tower/spells.dm new file mode 100644 index 00000000000..18b88647edf --- /dev/null +++ b/mods/gamemodes/deity/forms/tower/spells.dm @@ -0,0 +1,67 @@ +/spell/create_air/tower + desc = "Allows you to generate a livable atmosphere in the area you are in." + charge_max = 5 + +/spell/hand/burning_grip/tower + desc = "Allows you cause an object to heat up intensly in someone's hand, making them drop it and whatever skin is attached." + charge_max = 3 + +/spell/hand/slippery_surface/tower + desc = "Allows you to slicken a small patch of floor. Anyone without sure-footing will find it hard to stay upright." + charge_max = 2 + +/spell/aoe_turf/knock/tower + charge_max = 2 + hidden_from_codex = TRUE + +/spell/aoe_turf/smoke/tower + charge_max = 2 + hidden_from_codex = TRUE + +/spell/aoe_turf/conjure/faithful_hound/tower + desc = "This spell allows you to summon a singular spectral dog that guards the nearby area. Anyone without the password is barked at or bitten." + charge_max = 1 + spell_flags = 0 + +/spell/aoe_turf/conjure/force_portal/tower + desc = "This spell allows you to summon a force portal. Anything that hits the portal gets sucked inside and is then thrown out when the portal explodes." + charge_max = 2 + spell_flags = 0 + +/spell/acid_spray/tower + desc = "The simplest form of aggressive conjuration: acid spray is quite effective in melting both man and object." + charge_max = 2 + +/spell/targeted/heal_target/tower + desc = "Allows you to heal yourself, or others, for a slight amount." + charge_max = 2 + +/spell/targeted/heal_target/major/tower + charge_max = 1 + spell_flags = INCLUDEUSER | SELECTABLE + desc = "Allows you to heal others for a great amount." + +/spell/targeted/heal_target/area/tower + desc = "Allows you to heal everyone in an area for minor damage." + charge_max = 1 + +/spell/targeted/ethereal_jaunt/tower + desc = "Allows you to liquefy for a short duration, letting you pass through all dense objects." + charge_max = 2 + spell_flags = Z2NOCAST | INCLUDEUSER + +/spell/aoe_turf/conjure/forcewall/tower + desc = "A temporary invincible wall for you to summon." + charge_max = 3 + +/spell/targeted/equip_item/dyrnwyn/tower + desc = "This spell allows you to summon a fiery golden sword for a short duration." + charge_max = 1 + +/spell/targeted/equip_item/shield/tower + desc = "This spell allows you to summon a magical shield for a short duration." + charge_max = 1 + +/spell/targeted/projectile/dumbfire/fireball/tower + desc = "Imbue yourself with the power of exploding fire." + charge_max = 2 \ No newline at end of file diff --git a/code/game/gamemodes/godmode/form_items/wizard_structures.dm b/mods/gamemodes/deity/forms/tower/structures.dm similarity index 100% rename from code/game/gamemodes/godmode/form_items/wizard_structures.dm rename to mods/gamemodes/deity/forms/tower/structures.dm diff --git a/code/modules/mob/living/deity/forms/tower.dm b/mods/gamemodes/deity/forms/tower/tower.dm similarity index 100% rename from code/modules/mob/living/deity/forms/tower.dm rename to mods/gamemodes/deity/forms/tower/tower.dm diff --git a/code/game/gamemodes/godmode/godmode.dm b/mods/gamemodes/deity/gamemode.dm similarity index 100% rename from code/game/gamemodes/godmode/godmode.dm rename to mods/gamemodes/deity/gamemode.dm diff --git a/code/game/antagonist/station/cult_god.dm b/mods/gamemodes/deity/god_cultist_role.dm similarity index 90% rename from code/game/antagonist/station/cult_god.dm rename to mods/gamemodes/deity/god_cultist_role.dm index 212c545f691..d1c5bced882 100644 --- a/code/game/antagonist/station/cult_god.dm +++ b/mods/gamemodes/deity/god_cultist_role.dm @@ -47,7 +47,7 @@ return 1 /decl/special_role/godcultist/get_extra_panel_options(var/datum/mind/player) - return "\[Select Deity\]" + return "\[Select Deity\]" /decl/special_role/godcultist/Topic(href, href_list) if(..()) @@ -70,7 +70,7 @@ add_cultist(player, D) log_and_message_admins("has set [key_name(player.current)] to be a minion of [key_name(D)]") else - to_chat(usr, "There are no deities to be linked to.") + to_chat(usr, SPAN_WARNING("There are no deities to be linked to.")) return 1 /decl/special_role/godcultist/proc/add_cultist(var/datum/mind/player, var/mob/living/deity/deity) @@ -101,6 +101,6 @@ return //Make em wait a few seconds. - src.visible_message("\The [src] bows their head down, muttering something.", "You send the message \"[msg]\" to your master.") - to_chat(D, "\The [src] (J) prays, \"[msg]\"") + src.visible_message("\The [src] bows their head down, muttering something.", SPAN_NOTICE("You send the message \"[msg]\" to your master.")) + to_chat(D, "\The [src] (J) prays, \"[msg]\"") log_and_message_admins("dprayed, \"[msg]\" to \the [key_name(D)]") diff --git a/code/modules/mob/living/deity/deity.dm b/mods/gamemodes/deity/mobs/deity.dm similarity index 95% rename from code/modules/mob/living/deity/deity.dm rename to mods/gamemodes/deity/mobs/deity.dm index e23c871725c..8da6bb3ff09 100644 --- a/code/modules/mob/living/deity/deity.dm +++ b/mods/gamemodes/deity/mobs/deity.dm @@ -102,7 +102,7 @@ var/icon/god_icon = icon('icons/mob/mob.dmi', initial(G.pylon_icon_state)) send_rsc(src,god_icon, "[god_name].png") dat += {" - [god_name] + [god_name] [initial(G.info)] "} @@ -111,7 +111,7 @@ /mob/living/deity/proc/set_form(var/type) form = new type(src) - to_chat(src, "You undergo a transformation into your new form!") + to_chat(src, SPAN_NOTICE("You undergo a transformation into your new form!")) spawn(1) SetName(form.name) var/newname = sanitize(input(src, "Choose a name for your new form.", "Name change", form.name) as text, MAX_NAME_LEN) diff --git a/code/modules/mob/living/deity/deity_Stat.dm b/mods/gamemodes/deity/mobs/deity_Stat.dm similarity index 100% rename from code/modules/mob/living/deity/deity_Stat.dm rename to mods/gamemodes/deity/mobs/deity_Stat.dm diff --git a/code/modules/mob/living/deity/deity_boons.dm b/mods/gamemodes/deity/mobs/deity_boons.dm similarity index 67% rename from code/modules/mob/living/deity/deity_boons.dm rename to mods/gamemodes/deity/mobs/deity_boons.dm index 0057ccd049a..da05d9a5ff2 100644 --- a/code/modules/mob/living/deity/deity_boons.dm +++ b/mods/gamemodes/deity/mobs/deity_boons.dm @@ -2,7 +2,7 @@ if(current_boon) qdel(current_boon) current_boon = boon - to_chat(src,"You now have the boon [boon]") + to_chat(src, SPAN_NOTICE("You now have the boon [boon]")) if(istype(boon, /atom/movable)) var/atom/movable/A = boon nano_data["boon_name"] = A.name @@ -26,10 +26,10 @@ var/obj/O = L.equip_to_storage(I) if(O) origin_text = "in \the [O]" - to_chat(L,"It appears [origin_text].") + to_chat(L, SPAN_NOTICE("It appears [origin_text].")) - to_chat(L, "\The [src] grants you a boon of [current_boon]!") - to_chat(src, "You give \the [L] a boon of [current_boon].") + to_chat(L, SPAN_OCCULT("\The [src] grants you a boon of [current_boon]!")) + to_chat(src, SPAN_NOTICE("You give \the [L] a boon of [current_boon].")) log_and_message_admins("gave [key_name(L)] the boon [current_boon]") current_boon = null nano_data["boon_name"] = null @@ -40,16 +40,15 @@ for(var/s in M.learned_spells) var/spell/S = s if(istype(S, spell.type)) - to_chat(src, "They already know that spell!") + to_chat(src, SPAN_WARNING("They already know that spell!")) return 0 target.add_spell(spell) spell.set_connected_god(src) - to_chat(target, "You feel a surge of power as you learn the art of [current_boon].") + to_chat(target, SPAN_NOTICE("You feel a surge of power as you learn the art of [current_boon].")) return 1 -/* This is a generic proc used by the God to inact a sacrifice from somebody. Power is a value of magnitude. +/* This is a generic proc used by the God to enact a sacrifice from somebody. Power is a value of magnitude. */ /mob/living/deity/proc/take_charge(var/mob/living/L, var/power) if(form) - return form.take_charge(L, power) - return 1 \ No newline at end of file + form.take_charge(L, power) \ No newline at end of file diff --git a/code/modules/mob/living/deity/deity_click.dm b/mods/gamemodes/deity/mobs/deity_click.dm similarity index 86% rename from code/modules/mob/living/deity/deity_click.dm rename to mods/gamemodes/deity/mobs/deity_click.dm index 35cee5dadc6..06fff223062 100644 --- a/code/modules/mob/living/deity/deity_click.dm +++ b/mods/gamemodes/deity/mobs/deity_click.dm @@ -8,7 +8,7 @@ var/list/modifiers = params2list(params) if(modifiers["shift"] || modifiers["ctrl"]) if(silenced) - to_chat(src, "You cannot do that as you are silenced!") + to_chat(src, SPAN_WARNING("You cannot do that as you are silenced!")) else var/datum/phenomena/phenomena = get_phenomena(modifiers["shift"], modifiers["ctrl"]) if(phenomena) diff --git a/code/_onclick/hud/deity.dm b/mods/gamemodes/deity/mobs/deity_hud.dm similarity index 100% rename from code/_onclick/hud/deity.dm rename to mods/gamemodes/deity/mobs/deity_hud.dm diff --git a/code/modules/mob/living/deity/deity_items.dm b/mods/gamemodes/deity/mobs/deity_items.dm similarity index 100% rename from code/modules/mob/living/deity/deity_items.dm rename to mods/gamemodes/deity/mobs/deity_items.dm diff --git a/code/modules/mob/living/deity/deity_phenomena.dm b/mods/gamemodes/deity/mobs/deity_phenomena.dm similarity index 94% rename from code/modules/mob/living/deity/deity_phenomena.dm rename to mods/gamemodes/deity/mobs/deity_phenomena.dm index 37274813395..6cb38eec0ec 100644 --- a/code/modules/mob/living/deity/deity_phenomena.dm +++ b/mods/gamemodes/deity/mobs/deity_phenomena.dm @@ -17,7 +17,7 @@ /mob/living/deity/proc/silence(var/amount) if(!silenced) - to_chat(src, "You've been silenced! Your phenomenas are disabled!") + to_chat(src, SPAN_WARNING("You've been silenced! Your phenomenas are disabled!")) var/obj/screen/intent/deity/SD = istype(hud_used) && hud_used.action_intent if(istype(SD)) SD.color = "#ff0000" @@ -33,7 +33,7 @@ if(silenced > 0) silenced-- if(!silenced) - to_chat(src, "You are no longer silenced.") + to_chat(src, SPAN_NOTICE("You are no longer silenced.")) var/obj/screen/intent/deity/SD = istype(hud_used) && hud_used.action_intent if(istype(SD)) SD.color = null diff --git a/code/modules/mob/living/deity/deity_power.dm b/mods/gamemodes/deity/mobs/deity_power.dm similarity index 100% rename from code/modules/mob/living/deity/deity_power.dm rename to mods/gamemodes/deity/mobs/deity_power.dm diff --git a/code/modules/mob/living/deity/deity_pylon.dm b/mods/gamemodes/deity/mobs/deity_pylon.dm similarity index 100% rename from code/modules/mob/living/deity/deity_pylon.dm rename to mods/gamemodes/deity/mobs/deity_pylon.dm diff --git a/code/modules/mob/living/deity/deity_sources.dm b/mods/gamemodes/deity/mobs/deity_sources.dm similarity index 95% rename from code/modules/mob/living/deity/deity_sources.dm rename to mods/gamemodes/deity/mobs/deity_sources.dm index 4c479cff036..a1ec947983d 100644 --- a/code/modules/mob/living/deity/deity_sources.dm +++ b/mods/gamemodes/deity/mobs/deity_sources.dm @@ -56,7 +56,7 @@ if(L.mind in minions) return 1 if(!silent) - to_chat(src, "You do not feel a malleable mind behind that frame.") + to_chat(src, SPAN_WARNING("You do not feel a malleable mind behind that frame.")) return 0 /mob/living/deity/fully_replace_character_name(var/new_name, var/in_depth = TRUE) diff --git a/code/modules/mob/living/deity/deity_topic.dm b/mods/gamemodes/deity/mobs/deity_topic.dm similarity index 89% rename from code/modules/mob/living/deity/deity_topic.dm rename to mods/gamemodes/deity/mobs/deity_topic.dm index 089c98092f3..01226e8ddc5 100644 --- a/code/modules/mob/living/deity/deity_topic.dm +++ b/mods/gamemodes/deity/mobs/deity_topic.dm @@ -33,14 +33,14 @@ eyeobj.setLoc(get_turf(a)) if(follow) follow_follower(a) - to_chat(src, "[follow ? "Following" : "Jumping to"] \the [a]") + to_chat(src, SPAN_NOTICE("[follow ? "Following" : "Jumping to"] \the [a]")) return TOPIC_HANDLED if(href_list["buy"]) var/datum/deity_item/di = locate(href_list["buy"]) if(di.can_buy(src)) di.buy(src) else - to_chat(di,"You don't meet all the requirements for [di.name]!") + to_chat(di,SPAN_WARNING("You don't meet all the requirements for [di.name]!")) return TOPIC_HANDLED if(href_list["switchCategory"]) set_nano_category(text2num(href_list["switchCategory"])) diff --git a/code/modules/mob/living/deity/deity_tracking.dm b/mods/gamemodes/deity/mobs/deity_tracking.dm similarity index 89% rename from code/modules/mob/living/deity/deity_tracking.dm rename to mods/gamemodes/deity/mobs/deity_tracking.dm index 0b8de46e9f4..27e9d3b552d 100644 --- a/code/modules/mob/living/deity/deity_tracking.dm +++ b/mods/gamemodes/deity/mobs/deity_tracking.dm @@ -23,7 +23,7 @@ if(following) stop_follow() eyeobj.setLoc(get_turf(L)) - to_chat(src, "You begin to follow \the [L].") + to_chat(src, SPAN_NOTICE("You begin to follow \the [L].")) following = L events_repository.register(/decl/observ/moved, L, src, TYPE_PROC_REF(/mob/living/deity, keep_following)) events_repository.register(/decl/observ/destroyed, L, src, TYPE_PROC_REF(/mob/living/deity, stop_follow)) @@ -33,7 +33,7 @@ events_repository.unregister(/decl/observ/moved, following, src) events_repository.unregister(/decl/observ/destroyed, following, src) events_repository.unregister(/decl/observ/death, following,src) - to_chat(src, "You stop following \the [following].") + to_chat(src, SPAN_NOTICE("You stop following \the [following].")) following = null /mob/living/deity/proc/keep_following(var/atom/movable/moving_instance, var/atom/old_loc, var/atom/new_loc) diff --git a/code/modules/mob/observer/eye/freelook/cult/cultnet.dm b/mods/gamemodes/deity/mobs/freelook/cultnet.dm similarity index 100% rename from code/modules/mob/observer/eye/freelook/cult/cultnet.dm rename to mods/gamemodes/deity/mobs/freelook/cultnet.dm diff --git a/code/modules/mob/observer/eye/freelook/cult/mask.dm b/mods/gamemodes/deity/mobs/freelook/mask.dm similarity index 100% rename from code/modules/mob/observer/eye/freelook/cult/mask.dm rename to mods/gamemodes/deity/mobs/freelook/mask.dm diff --git a/mods/gamemodes/deity/mobs/items/blood_crafting.dm b/mods/gamemodes/deity/mobs/items/blood_crafting.dm new file mode 100644 index 00000000000..3db0c0e161d --- /dev/null +++ b/mods/gamemodes/deity/mobs/items/blood_crafting.dm @@ -0,0 +1,19 @@ +/datum/deity_item/blood_crafting + abstract_type = /datum/deity_item/blood_crafting + name = DEITY_BLOOD_CRAFT + desc = "Unlocks the blood smithing structure which allows followers to forge unholy tools from blood and flesh." + category = DEITY_BLOOD_CRAFT + max_level = 1 + base_cost = 75 + var/forge_type = /obj/structure/deity/blood_forge + var/list/recipes = list() + +/datum/deity_item/blood_crafting/buy(var/mob/living/deity/user) + ..() + user.form.buildables |= forge_type //put structure here + var/list/L = user.feats[name] + if(!L) + L = list() + for(var/type in recipes) + L[type] = recipes[type] + user.feats[name] = L \ No newline at end of file diff --git a/code/modules/mob/living/deity/items/deity_item.dm b/mods/gamemodes/deity/mobs/items/deity_item.dm similarity index 96% rename from code/modules/mob/living/deity/items/deity_item.dm rename to mods/gamemodes/deity/mobs/items/deity_item.dm index 6c5e70fb839..7590bbb9037 100644 --- a/code/modules/mob/living/deity/items/deity_item.dm +++ b/mods/gamemodes/deity/mobs/items/deity_item.dm @@ -1,3 +1,4 @@ +// todo: declize /datum/deity_item /datum/deity_item var/name var/desc diff --git a/code/modules/mob/living/deity/items/general.dm b/mods/gamemodes/deity/mobs/items/general.dm similarity index 100% rename from code/modules/mob/living/deity/items/general.dm rename to mods/gamemodes/deity/mobs/items/general.dm diff --git a/code/modules/mob/living/deity/items/generic.dm b/mods/gamemodes/deity/mobs/items/generic.dm similarity index 100% rename from code/modules/mob/living/deity/items/generic.dm rename to mods/gamemodes/deity/mobs/items/generic.dm diff --git a/code/modules/mob/living/deity/menu/deity_nano.dm b/mods/gamemodes/deity/mobs/menu/deity_nano.dm similarity index 100% rename from code/modules/mob/living/deity/menu/deity_nano.dm rename to mods/gamemodes/deity/mobs/menu/deity_nano.dm diff --git a/code/modules/mob/living/deity/phenomena/_defines.dm b/mods/gamemodes/deity/mobs/phenomena/_defines.dm similarity index 100% rename from code/modules/mob/living/deity/phenomena/_defines.dm rename to mods/gamemodes/deity/mobs/phenomena/_defines.dm diff --git a/code/modules/mob/living/deity/phenomena/communication.dm b/mods/gamemodes/deity/mobs/phenomena/communication.dm similarity index 77% rename from code/modules/mob/living/deity/phenomena/communication.dm rename to mods/gamemodes/deity/mobs/phenomena/communication.dm index a83130f1ec7..b3d603bd1c2 100644 --- a/code/modules/mob/living/deity/phenomena/communication.dm +++ b/mods/gamemodes/deity/mobs/phenomena/communication.dm @@ -12,7 +12,7 @@ if(!linked.is_follower(L)) text_size = 1 to_chat(L, "[text_to_send]") //Note to self: make this go to ghosties - to_chat(linked, "You send the message [text_to_send] to \the [L]") + to_chat(linked, SPAN_NOTICE("You send the message [text_to_send] to \the [L]")) log_and_message_admins("communicated the message \"[text_to_send]\" to [key_name(L)]", linked) /datum/phenomena/point @@ -35,7 +35,7 @@ if(mind.current) var/mob/M = mind.current if((M in view) && M.client) - to_chat(M, "Your attention is eerily drawn to \the [a].") + to_chat(M, SPAN_OCCULT("Your attention is eerily drawn to \the [a].")) M.client.images += arrow events_repository.register(/decl/observ/logged_out, M, src, TYPE_PROC_REF(/datum/phenomena/point, remove_image)) spawn(20) @@ -59,22 +59,22 @@ if(!pain) return if(punishment_list[pain] && linked.power < punishment_list[pain]) - to_chat(linked, "[pain] costs too much power for you to use on \the [L]") + to_chat(linked, SPAN_WARNING("[pain] costs too much power for you to use on \the [L]")) return ..() linked.adjust_power(-punishment_list[pain]) switch(pain) if("Pain (0)") L.take_damage(15, PAIN) - to_chat(L, "You feel intense disappointment coming at you from beyond the veil.") + to_chat(L, SPAN_WARNING("You feel intense disappointment coming at you from beyond the veil.")) if("Light Wound (5)") L.take_damage(5) - to_chat(L, "You feel an ethereal whip graze your very soul!") + to_chat(L, SPAN_WARNING("You feel an ethereal whip graze your very soul!")) if("Brain Damage (10)") L.take_damage(5, BRAIN) - to_chat(L, "You feel your mind breaking under a otherwordly hammer...") + to_chat(L, SPAN_DANGER("You feel your mind breaking under a otherwordly hammer...")) if("Heavy Wounds (20)") L.take_damage(25) - to_chat(L, "You feel your master turn its destructive potential against you!") - to_chat(linked, "You punish \the [L].") + to_chat(L, SPAN_DANGER("You feel your master turn its destructive potential against you!")) + to_chat(linked, SPAN_NOTICE("You punish \the [L].")) log_admin("[key_name(linked)] used Punishment [pain] on \the [key_name(L)]") \ No newline at end of file diff --git a/code/modules/mob/living/deity/phenomena/conjuration.dm b/mods/gamemodes/deity/mobs/phenomena/conjuration.dm similarity index 82% rename from code/modules/mob/living/deity/phenomena/conjuration.dm rename to mods/gamemodes/deity/mobs/phenomena/conjuration.dm index ac0f27c6075..5f15cc786aa 100644 --- a/code/modules/mob/living/deity/phenomena/conjuration.dm +++ b/mods/gamemodes/deity/mobs/phenomena/conjuration.dm @@ -11,7 +11,7 @@ for(var/i in mobs_inside) var/mob/M = i M.dropInto(object_to_move.loc) - to_chat(M,"You are suddenly flung out of \the [object_to_move]!") + to_chat(M,SPAN_WARNING("You are suddenly flung out of \the [object_to_move]!")) ..() /datum/phenomena/portals @@ -58,24 +58,10 @@ ..() L.take_overall_damage(rand(5,30),0,0,0,"blunt intrument") //Actual spell does 5d10 but maaaybe too much. playsound(get_turf(L), 'sound/effects/bamf.ogg', 100, 1) - to_chat(L, "Something hard hits you!") + to_chat(L, SPAN_DANGER("Something hard hits you!")) if(L.current_health < L.get_max_health()/2) //If it reduces past 50% var/obj/effect/rift/R = new(get_turf(L)) - L.visible_message("\The [L] is quickly sucked into \a [R]!") + L.visible_message(SPAN_DANGER("\The [L] is quickly sucked into \a [R]!")) L.forceMove(R) spawn(300) qdel(R) - -/obj/effect/rift - name = "rift" - desc = "a tear in space and time." - icon = 'icons/obj/wizard.dmi' - icon_state = "rift" - anchored = TRUE - density = FALSE - -/obj/effect/rift/Destroy() - for(var/o in contents) - var/atom/movable/M = o - M.dropInto(loc) - . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/deity/phenomena/conversion.dm b/mods/gamemodes/deity/mobs/phenomena/conversion.dm similarity index 68% rename from code/modules/mob/living/deity/phenomena/conversion.dm rename to mods/gamemodes/deity/mobs/phenomena/conversion.dm index d9dc309a33c..67497362b11 100644 --- a/code/modules/mob/living/deity/phenomena/conversion.dm +++ b/mods/gamemodes/deity/mobs/phenomena/conversion.dm @@ -14,19 +14,19 @@ is_good = 1 break if(!is_good) - to_chat(linked,"\The [target] needs to be near \a [linked.get_type_name(/obj/structure/deity/altar)].") + to_chat(linked,SPAN_WARNING("\The [target] needs to be near \a [linked.get_type_name(/obj/structure/deity/altar)].")) return 0 return 1 /datum/phenomena/conversion/activate(var/mob/living/L) - to_chat(src,"You give \the [L] a chance to willingly convert. May they choose wisely.") + to_chat(src,SPAN_NOTICE("You give \the [L] a chance to willingly convert. May they choose wisely.")) var/choice = alert(L, "You feel a weak power enter your mind attempting to convert it.", "Conversion", "Allow Conversion", "Deny Conversion") if(choice == "Allow Conversion") var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) godcult.add_antagonist_mind(L.mind,1, "Servant of [linked]", "You willingly give your mind to it, may it bring you fortune.", specific_god=linked) else - to_chat(L, "With little difficulty you force the intrusion out of your mind. May it stay that way.") - to_chat(src, "\The [L] decides not to convert.") + to_chat(L, SPAN_WARNING("With little difficulty you force the intrusion out of your mind. May it stay that way.")) + to_chat(src, SPAN_WARNING("\The [L] decides not to convert.")) /datum/phenomena/forced_conversion name = "Forced Conversion" @@ -40,7 +40,7 @@ return 0 var/obj/structure/deity/altar/A = locate() in get_turf(L) if(!A || A.linked_god != linked) - to_chat(linked,"\The [L] needs to be on \a [linked.get_type_name(/obj/structure/deity/altar)] to be forcefully converted..") + to_chat(linked,SPAN_WARNING("\The [L] needs to be on \a [linked.get_type_name(/obj/structure/deity/altar)] to be forcefully converted..")) return 0 return 1 @@ -48,4 +48,4 @@ /datum/phenomena/forced_conversion/activate(var/mob/living/L) var/obj/structure/deity/altar/A = locate() in get_turf(L) A.set_target(L) - to_chat(linked, "You imbue \the [A] with your power, setting forth to force \the [L] to your will.") \ No newline at end of file + to_chat(linked, SPAN_NOTICE("You imbue \the [A] with your power, setting forth to force \the [L] to your will.")) \ No newline at end of file diff --git a/code/modules/mob/living/deity/phenomena/generic.dm b/mods/gamemodes/deity/mobs/phenomena/generic.dm similarity index 100% rename from code/modules/mob/living/deity/phenomena/generic.dm rename to mods/gamemodes/deity/mobs/phenomena/generic.dm diff --git a/code/modules/mob/living/deity/phenomena/narsie.dm b/mods/gamemodes/deity/mobs/phenomena/narsie.dm similarity index 72% rename from code/modules/mob/living/deity/phenomena/narsie.dm rename to mods/gamemodes/deity/mobs/phenomena/narsie.dm index b64a36ab284..52e69b66b47 100644 --- a/code/modules/mob/living/deity/phenomena/narsie.dm +++ b/mods/gamemodes/deity/mobs/phenomena/narsie.dm @@ -1,22 +1,22 @@ -/datum/phenomena/exhude_blood +/datum/phenomena/exude_blood name = "Exhude Blood" desc = "Take pity on a follower, converting a pitance of your power into blood. Don't let them forget your mercy." cost = 20 flags = PHENOMENA_FOLLOWER - expected_type = /mob/living/carbon/human + expected_type = /mob/living/human -/datum/phenomena/exhude_blood/can_activate(var/mob/living/carbon/human/H) +/datum/phenomena/exude_blood/can_activate(var/mob/living/human/H) if(!..()) return 0 if(!H.should_have_organ(BP_HEART) || H.vessel.total_volume == H.species.blood_volume) - to_chat(linked, "\The [H] doesn't require anymore blood.") + to_chat(linked, SPAN_WARNING("\The [H] doesn't require anymore blood.")) return 0 return 1 -/datum/phenomena/exhude_blood/activate(var/mob/living/carbon/human/H, var/mob/living/deity/user) +/datum/phenomena/exude_blood/activate(var/mob/living/human/H, var/mob/living/deity/user) H.adjust_blood(30) - to_chat(H,"You feel a rush as new blood enters your system.") + to_chat(H,SPAN_NOTICE("You feel a rush as new blood enters your system.")) /datum/phenomena/hellscape diff --git a/code/modules/mob/living/deity/phenomena/phenomena.dm b/mods/gamemodes/deity/mobs/phenomena/phenomena.dm similarity index 62% rename from code/modules/mob/living/deity/phenomena/phenomena.dm rename to mods/gamemodes/deity/mobs/phenomena/phenomena.dm index 61311d119bf..169eb499a3f 100644 --- a/code/modules/mob/living/deity/phenomena/phenomena.dm +++ b/mods/gamemodes/deity/mobs/phenomena/phenomena.dm @@ -26,11 +26,11 @@ if(!linked) return 0 if(refresh_time > world.time) - to_chat(linked, "\The [src] is still on cooldown for [round((refresh_time - world.time)/10)] more seconds!") + to_chat(linked, SPAN_WARNING("\The [src] is still on cooldown for [round((refresh_time - world.time)/10)] more seconds!")) return 0 if(!linked.form) - to_chat(linked, "You must choose your form first!") + to_chat(linked, SPAN_WARNING("You must choose your form first!")) return 0 if(expected_type && !istype(target,expected_type)) @@ -38,32 +38,32 @@ if(flags & PHENOMENA_NEAR_STRUCTURE) if(!linked.near_structure(target, 1)) - to_chat(linked, "\The [target] needs to be near a holy structure for your powers to work!") + to_chat(linked, SPAN_WARNING("\The [target] needs to be near a holy structure for your powers to work!")) return 0 if(isliving(target)) var/mob/living/L = target if(!L.mind || !L.client) if(!(flags & PHENOMENA_MUNDANE)) - to_chat(linked, "\The [L]'s mind is too mundane for you to influence.") + to_chat(linked, SPAN_WARNING("\The [L]'s mind is too mundane for you to influence.")) return 0 else if(linked.is_follower(target, silent = 1)) if(!(flags & PHENOMENA_FOLLOWER)) - to_chat(linked, "You can't use [name] on the flock!") + to_chat(linked, SPAN_WARNING("You can't use [name] on the flock!")) return 0 else if(!(flags & PHENOMENA_NONFOLLOWER)) - to_chat(linked, "You can't use [name] on non-believers.") + to_chat(linked, SPAN_WARNING("You can't use [name] on non-believers.")) return 0 if(cost > linked.power) - to_chat(linked, "You need more power to use [name] (Need [cost] power, have [linked.power])!") + to_chat(linked, SPAN_WARNING("You need more power to use [name] (Need [cost] power, have [linked.power])!")) return 0 return 1 /datum/phenomena/proc/activate(var/target) - to_chat(linked, "You use the phenomena [name] on \the [target]") + to_chat(linked, SPAN_NOTICE("You use the phenomena [name] on \the [target]")) log_and_message_admins("uses the phenomena [name] on \the [target]", linked, get_turf(target)) return diff --git a/code/modules/mob/living/deity/phenomena/starlight.dm b/mods/gamemodes/deity/mobs/phenomena/starlight.dm similarity index 82% rename from code/modules/mob/living/deity/phenomena/starlight.dm rename to mods/gamemodes/deity/mobs/phenomena/starlight.dm index a2a34543f14..72a6f0dbf07 100644 --- a/code/modules/mob/living/deity/phenomena/starlight.dm +++ b/mods/gamemodes/deity/mobs/phenomena/starlight.dm @@ -4,7 +4,7 @@ cost = 100 cooldown = 60 SECONDS flags = PHENOMENA_FOLLOWER - expected_type = /mob/living/carbon/human + expected_type = /mob/living/human var/static/list/possible_forms = list( "Champion" = list("description" = "A protector of the faith. Fully protected by knightly armor, a Champion can shoot fire from their hands.", "armor" = /obj/item/clothing/suit/armor/sunsuit, @@ -31,7 +31,7 @@ return valid_for_herald(a) /datum/phenomena/herald/proc/valid_for_herald(var/a) - var/mob/living/carbon/human/H = a + var/mob/living/human/H = a if(!istype(H)) return FALSE var/obj/item/I = H.get_equipped_item(slot_wear_suit_str) @@ -73,22 +73,22 @@ L.put_in_hands_or_store_or_drop(new w_type(T)) if(form["spells"]) for(var/s in form["spells"]) - var/spell/S = new s - S.set_connected_god(linked) - L.add_spell(S) + var/spell/boon = new s + boon.set_connected_god(linked) + L.add_spell(boon) to_chat(L, "You have been chosen by your master to lead your fellow followers into the next age of rebirth.
    You have been granted powerful armor and a powerful spell. Don't lose them, as they are your key to your divinity and leadership.
    You also have particular sway over your deity's structures.
    ") - to_chat(linked, "\The [L] is now your herald!") + to_chat(linked, SPAN_NOTICE("\The [L] is now your herald!")) linked.remove_phenomena(name) show_browser(linked, null, "window=herald") -/datum/phenomena/herald/activate(var/mob/living/carbon/human/H) +/datum/phenomena/herald/activate(var/mob/living/human/H) var/list/html = list() html += "

    Heralds

    " html += "
    Pick the type of herald you want.
    " html += "" for(var/type in possible_forms) var/list/form = possible_forms[type] - html += "" + html += "" html += "
    NameDescription
    [type][form["description"]]
    [type][form["description"]]
    " show_browser(linked, jointext(html,null), "window=herald") @@ -136,7 +136,7 @@ var/message = sanitize(input(linked, "What is your message?", null) as null|text) if(!linked || !message || QDELETED(src)) return - to_chat(L, "[whisper_from ? "The [whisper_from] speaks to you" : "You hear a whisper say"] \"[message]\"") + to_chat(L, SPAN_OCCULT("[whisper_from ? "The [whisper_from] speaks to you" : "You hear a whisper say"] \"[message]\"")) linked.eyenet.add_source(L) events_repository.register(/decl/observ/destroyed, L, src, PROC_REF(deactivate_look)) @@ -157,7 +157,7 @@ /datum/phenomena/burning_glare/activate(var/mob/living/L) ..() - to_chat(L, "You feel yourself burn!") + to_chat(L, SPAN_DANGER("You feel yourself burn!")) L.take_damage(10, BURN) if(L.get_damage(BURN) > 60) L.fire_stacks += 50 @@ -179,7 +179,7 @@ active_gateways += 1 if(active_gateways < 3) - to_chat(linked, "You do not have enough gateways activated.") + to_chat(linked, SPAN_WARNING("You do not have enough gateways activated.")) return FALSE var/obj/O = L.get_equipped_item(slot_wear_suit_str) @@ -187,13 +187,13 @@ var/datum/extension/deity_be_near/dbn = get_extension(O, /datum/extension/deity_be_near) if(dbn.wearing_full()) return TRUE - to_chat(linked, "\The [L] is not wearing a herald's uniform.") + to_chat(linked, SPAN_WARNING("\The [L] is not wearing a herald's uniform.")) return FALSE /datum/phenomena/divine_right/activate(var/mob/living/L) ..() - to_chat(L, "Your soul is ripped from your body as your master prepares to possess it.") - to_chat(linked, "You prepare the body for possession. Keep it safe. If it is totally destroyed, you will die.") + to_chat(L, SPAN_OCCULT("Your soul is ripped from your body as your master prepares to possess it.")) + to_chat(linked, SPAN_OCCULT("You prepare the body for possession. Keep it safe. If it is totally destroyed, you will die.")) L.ghostize() SET_STATUS_MAX(L, STAT_WEAK, 1) new /obj/aura/starborn(L) @@ -203,20 +203,20 @@ for(var/mob/living/player in global.player_list) sound_to(player, 'sound/effects/cascade.ogg') if(player?.mind?.assigned_job?.is_holy) - to_chat(player, "Something bad is coming.... you know you don't have much time. Find and destroy the vessel, before its too late.") + to_chat(player, SPAN_OCCULT("Something bad is coming.... you know you don't have much time. Find and destroy the vessel, before its too late.")) else if(player != linked && !linked.is_follower(player, silent = 1)) - to_chat(player, "The world swims around you for just a moment... something is wrong. Very wrong.") + to_chat(player, SPAN_WARNING("The world swims around you for just a moment... something is wrong. Very wrong.")) else - to_chat(player, "Your Master is being reborn into the body of \the [L]. Protect it at all costs.") + to_chat(player, SPAN_NOTICE("Your Master is being reborn into the body of \the [L]. Protect it at all costs.")) /datum/phenomena/divine_right/proc/fail_ritual(var/mob/living/L) qdel(linked) /datum/phenomena/divine_right/proc/succeed_ritual(var/mob/living/L) - to_chat(linked, "You have been reborn! Your power is limited here, focused on your body, but in return you are both eternal and physical.") + to_chat(linked, SPAN_OCCULT("You have been reborn! Your power is limited here, focused on your body, but in return you are both eternal and physical.")) for(var/mob/living/player in global.player_list) sound_to(player, 'sound/effects/cascade.ogg') - to_chat(player, "\The [linked] has been born into flesh. Kneel to its authority or else.") + to_chat(player, SPAN_OCCULT("\The [linked] has been born into flesh. Kneel to its authority or else.")) linked.mind.transfer_to(L) L.SetName("[linked] Incarnate") L.real_name = "[linked] Incarnate" diff --git a/code/modules/mob/living/deity/phenomena/transmutation.dm b/mods/gamemodes/deity/mobs/phenomena/transmutation.dm similarity index 66% rename from code/modules/mob/living/deity/phenomena/transmutation.dm rename to mods/gamemodes/deity/mobs/phenomena/transmutation.dm index 1a985da60bb..e86c92ec4d4 100644 --- a/code/modules/mob/living/deity/phenomena/transmutation.dm +++ b/mods/gamemodes/deity/mobs/phenomena/transmutation.dm @@ -10,17 +10,17 @@ ..() L.take_damage(20, CLONE) SET_STATUS_MAX(L, STAT_WEAK, 2) - to_chat(L, "You feel your body warp and change underneath you!") + to_chat(L, SPAN_DANGER("You feel your body warp and change underneath you!")) /datum/phenomena/rock_form name = "Rock Form" desc = "Convert your mortal followers into immortal stone beings." cost = 300 flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_FOLLOWER - expected_type = /mob/living/carbon/human + expected_type = /mob/living/human -/datum/phenomena/rock_form/activate(var/mob/living/carbon/human/H) +/datum/phenomena/rock_form/activate(var/mob/living/human/H) ..() - to_chat(H, "You feel your body harden as it rapidly is transformed into living crystal!") + to_chat(H, SPAN_DANGER("You feel your body harden as it rapidly is transformed into living crystal!")) H.change_species(SPECIES_GOLEM) SET_STATUS_MAX(H, STAT_WEAK, 5) \ No newline at end of file diff --git a/code/modules/mob/living/deity/say.dm b/mods/gamemodes/deity/mobs/say.dm similarity index 100% rename from code/modules/mob/living/deity/say.dm rename to mods/gamemodes/deity/mobs/say.dm diff --git a/mods/gamemodes/deity/overrides.dm b/mods/gamemodes/deity/overrides.dm new file mode 100644 index 00000000000..c052abdf9a2 --- /dev/null +++ b/mods/gamemodes/deity/overrides.dm @@ -0,0 +1,27 @@ +/obj/item/sword/cultblade/can_use_safely(mob/living/user) + var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) + return ..() || (user.mind in godcult.current_antagonists) + +/datum/reagents/Topic(href, href_list) + . = ..() + if(!. && href_list["deconvert"]) + var/list/data = REAGENT_DATA(src, /decl/material/liquid/water) + if(LAZYACCESS(data, "holy")) + var/mob/living/target = locate(href_list["deconvert"]) + if(istype(target) && !QDELETED(target) && target.mind) + var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) + godcult.remove_antagonist(target.mind, TRUE) + +/decl/material/liquid/water/affect_holy(mob/living/M, removed, datum/reagents/holder) + . = ..() + if(.) + return . + var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) + if(M.mind && godcult.is_antagonist(M.mind)) + if(REAGENT_VOLUME(holder, type) > 5) + M.take_damage(5, PAIN, do_update_health = FALSE) + M.take_damage(1, BRUTE) + if(prob(10)) //Only annoy them a /bit/ + to_chat(M, SPAN_DANGER("You feel your insides curdle and burn! \[Give Into Purity\]")) + return TRUE + return FALSE \ No newline at end of file diff --git a/mods/gamemodes/deity/screen/intent.dm b/mods/gamemodes/deity/screen/intent.dm new file mode 100644 index 00000000000..80b3a423170 --- /dev/null +++ b/mods/gamemodes/deity/screen/intent.dm @@ -0,0 +1,44 @@ +/obj/screen/intent/deity + var/list/desc_screens = list() + screen_loc = "RIGHT-5:122,BOTTOM:8" + +/obj/screen/intent/deity/on_update_icon() + . = ..() + cut_overlays() + add_overlay(image('icons/mob/screen/phenomena.dmi', icon_state = "hud", pixel_x = -138, pixel_y = -1)) + compile_overlays() + +/obj/screen/intent/deity/proc/sync_to_mob(var/mob) + var/mob/living/deity/D = mob + for(var/i in 1 to D.control_types.len) + var/obj/screen/deity_marker/S = new(null, D) + desc_screens[D.control_types[i]] = S + S.screen_loc = screen_loc + //This sets it up right. Trust me. + S.maptext_y = 33/2*i - i*i/2 - 10 + D.client.screen += S + + update_text() + +/obj/screen/intent/deity/proc/update_text() + if(!isdeity(usr)) + return + var/mob/living/deity/D = usr + for(var/i in D.control_types) + var/obj/screen/deity_marker/S = desc_screens[i] + var/datum/phenomena/P = D.intent_phenomenas[intent][i] + if(P) + S.maptext = "[P.name]" + else + S.maptext = null + +/obj/screen/intent/deity/handle_click(mob/user, params) + ..() + update_text() + +/obj/screen/deity_marker + name = "" //Don't want them to be able to actually right click it. + mouse_opacity = MOUSE_OPACITY_UNCLICKABLE + icon_state = "blank" + maptext_width = 128 + maptext_x = -125 \ No newline at end of file diff --git a/mods/gamemodes/deity/spells/boon.dm b/mods/gamemodes/deity/spells/boon.dm new file mode 100644 index 00000000000..269a0b4bc4c --- /dev/null +++ b/mods/gamemodes/deity/spells/boon.dm @@ -0,0 +1,11 @@ +/spell + var/mob/living/deity/connected_god //Do we have this spell based off a boon from a god? + +/spell/proc/set_connected_god(var/mob/living/deity/god) + connected_god = god + +// todo: godform check_charge to parallel take_charge. currently a boon always succeeds +/spell/take_charge(mob/user, skipcharge) + if(connected_god) + return connected_god.take_charge(user, max(1, charge_max/10)) + return ..() \ No newline at end of file diff --git a/code/modules/spells/general/god_construct.dm b/mods/gamemodes/deity/spells/construction.dm similarity index 94% rename from code/modules/spells/general/god_construct.dm rename to mods/gamemodes/deity/spells/construction.dm index 25abda2c59e..0005154ad6e 100644 --- a/code/modules/spells/general/god_construct.dm +++ b/mods/gamemodes/deity/spells/construction.dm @@ -42,7 +42,7 @@ else for(var/obj/O in T) if(O.density) - to_chat(user, "Something here is blocking your construction!") + to_chat(user, SPAN_WARNING("Something here is blocking your construction!")) return 0 return 1 diff --git a/code/modules/spells/general/open_gateway.dm b/mods/gamemodes/deity/spells/open_gateway.dm similarity index 74% rename from code/modules/spells/general/open_gateway.dm rename to mods/gamemodes/deity/spells/open_gateway.dm index 0c995399db5..1038d03c6a1 100644 --- a/code/modules/spells/general/open_gateway.dm +++ b/mods/gamemodes/deity/spells/open_gateway.dm @@ -15,7 +15,7 @@ /spell/open_gateway/choose_targets() var/mob/living/H = holder var/turf/T = get_turf(H) - holder.visible_message("A gateway opens up underneath \the [H]!") + holder.visible_message(SPAN_NOTICE("A gateway opens up underneath \the [H]!")) var/g var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) if(H.mind && (H.mind in godcult.current_antagonists)) @@ -24,9 +24,9 @@ /spell/open_gateway/cast(var/list/targets, var/mob/holder, var/channel_count) if(prob((channel_count / 5) * 100)) - to_chat(holder, "If you hold the portal open for much longer you'll be ripped apart!") + to_chat(holder, SPAN_DANGER("If you hold the portal open for much longer you'll be ripped apart!")) if(channel_count == 6) - to_chat(holder, "The gateway consumes you... leaving nothing but dust.") + to_chat(holder, SPAN_DANGER("The gateway consumes you... leaving nothing but dust.")) holder.dust() diff --git a/mods/gamemodes/deity/spells/vision.dm b/mods/gamemodes/deity/spells/vision.dm new file mode 100644 index 00000000000..dabe6cf4fca --- /dev/null +++ b/mods/gamemodes/deity/spells/vision.dm @@ -0,0 +1,21 @@ +/spell/camera_connection/god_vision + name = "All Seeing Eye" + desc = "See what your master sees." + + charge_max = 10 + spell_flags = Z2NOCAST + invocation = "none" + invocation_type = SpI_NONE + + extension_type = /datum/extension/eye/freelook + + hud_state = "gen_mind" + +/spell/camera_connection/god_vision/set_connected_god(var/mob/living/deity/god) + ..() + + var/datum/extension/eye/freelook/fl = get_extension(src, /datum/extension/eye) + if(!fl) + return + fl.set_visualnet(god.eyenet) + diff --git a/code/game/gamemodes/godmode/god_altar.dm b/mods/gamemodes/deity/structures/altar.dm similarity index 71% rename from code/game/gamemodes/godmode/god_altar.dm rename to mods/gamemodes/deity/structures/altar.dm index 5ed2dca6c7d..5981e775b68 100644 --- a/code/game/gamemodes/godmode/god_altar.dm +++ b/mods/gamemodes/deity/structures/altar.dm @@ -13,7 +13,7 @@ if(target) remove_target() if(linked_god) - to_chat(src, "You've lost an altar!") + to_chat(src, SPAN_DANGER("You've lost an altar!")) return ..() /obj/structure/deity/altar/attackby(var/obj/item/I, var/mob/user) @@ -24,7 +24,7 @@ if(istype(affecting_mob)) affecting_mob.dropInto(loc) SET_STATUS_MAX(affecting_mob, STAT_WEAK, 1) - user.visible_message("\The [user] throws \the [affecting_mob] onto \the [src]!") + user.visible_message(SPAN_WARNING("\The [user] throws \the [affecting_mob] onto \the [src]!")) qdel(G) return ..() @@ -33,7 +33,7 @@ if(!target || world.time < next_cycle) return if(!linked_god || target.stat) - to_chat(linked_god, "\The [target] has lost consciousness, breaking \the [src]'s hold on their mind!") + to_chat(linked_god, SPAN_WARNING("\The [target] has lost consciousness, breaking \the [src]'s hold on their mind!")) remove_target() return @@ -55,8 +55,8 @@ text = "You can't.... concentrate.. must... resist!" if(1) text = "Can't... resist. ... anymore." - to_chat(linked_god, "\The [target] is getting close to conversion!") - to_chat(target, "[text]. Resist Conversion") + to_chat(linked_god, SPAN_WARNING("\The [target] is getting close to conversion!")) + to_chat(target, "[text]. Resist Conversion") //Used for force conversion. @@ -86,11 +86,11 @@ return TOPIC_HANDLED M.set_special_ability_cooldown(10 SECONDS) - M.visible_message("\The [M] writhes on top of \the [src]!", "You struggle against the intruding thoughts, keeping them at bay!") - to_chat(linked_god, "\The [M] slows its conversion through willpower!") + M.visible_message(SPAN_WARNING("\The [M] writhes on top of \the [src]!"), SPAN_NOTICE("You struggle against the intruding thoughts, keeping them at bay!")) + to_chat(linked_god, SPAN_WARNING("\The [M] slows its conversion through willpower!")) cycles_before_converted++ if(prob(50)) - to_chat(M, "The mental strain is too much for you! You feel your body weakening!") + to_chat(M, SPAN_DANGER("The mental strain is too much for you! You feel your body weakening!")) M.take_damage(15, TOX, do_update_health = FALSE) M.take_damage(30, PAIN) return TOPIC_REFRESH @@ -98,4 +98,12 @@ /obj/structure/deity/altar/on_update_icon() ..() if(target) - add_overlay(image('icons/effects/effects.dmi', icon_state = "summoning")) \ No newline at end of file + add_overlay(image('icons/effects/effects.dmi', icon_state = "summoning")) + +/obj/structure/deity/altar/nullrod_act(mob/user, obj/item/nullrod/rod) + if(!linked_god.silenced) //Don't want them to infinity spam it. + linked_god.silence(10) + new /obj/effect/temporary(get_turf(src),'icons/effects/effects.dmi',"purple_electricity_constant", 10) + visible_message(SPAN_NOTICE("\The [src] groans in protest as reality settles around \the [rod].")) + return TRUE + return FALSE \ No newline at end of file diff --git a/mods/gamemodes/deity/structures/blood_forge.dm b/mods/gamemodes/deity/structures/blood_forge.dm new file mode 100644 index 00000000000..3b23da40630 --- /dev/null +++ b/mods/gamemodes/deity/structures/blood_forge.dm @@ -0,0 +1,66 @@ +/obj/structure/deity/blood_forge + name = "unholy forge" + desc = "This forge gives off no heat, no light, its flames look almost unnatural." + icon_state = "forge" + build_cost = 1000 + current_health = 50 + var/busy = 0 + var/recipe_feat_list = "Blood Crafting" + var/text_modifications = list( + "Cost" = "Blood", + "Dip" = "fire. Pain envelops you as blood seeps out of your hands and you begin to shape it into something more useful", + "Shape" = "You shape the fire as more and more blood comes out.", + "Out" = "flames" + ) + + power_adjustment = 2 + +/obj/structure/deity/blood_forge/attack_hand(var/mob/user) + if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) + return ..() + var/list/recipes = linked_god.feats[recipe_feat_list] + if(!recipes) + return TRUE + var/dat = "
    Recipes


    Item - [text_modifications["Cost"]] Cost
    " + for(var/type in recipes) + var/atom/a = type + var/cost = recipes[type] + dat += "[initial(a.name)] - [cost]
    [initial(a.desc)]

    " + show_browser(user, dat, "window=forge") + return TRUE + +/obj/structure/deity/blood_forge/CanUseTopic(var/user) + if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) + return STATUS_CLOSE + return ..() + +/obj/structure/deity/blood_forge/OnTopic(var/user, var/list/href_list) + if(href_list["make_recipe"]) + var/list/recipes = linked_god.feats[recipe_feat_list] + var/type = locate(href_list["make_recipe"]) in recipes + if(type) + var/cost = recipes[type] + craft_item(type, cost, user) + return TOPIC_REFRESH + +/obj/structure/deity/blood_forge/proc/craft_item(var/path, var/blood_cost, var/mob/user) + if(busy) + to_chat(user, SPAN_WARNING("Someone is already using \the [src]!")) + return + + busy = 1 + to_chat(user, SPAN_NOTICE("You dip your hands into \the [src]'s [text_modifications["Dip"]]")) + for(var/count = 0, count < blood_cost/10, count++) + if(!do_after(user, 50,src)) + busy = 0 + return + user.visible_message("\The [user] swirls their hands in \the [src].", text_modifications["Shape"]) + if(linked_god) + linked_god.take_charge(user, 10) + var/obj/item/I = new path(get_turf(src)) + user.visible_message("\The [user] pull out \the [I] from the [text_modifications["Out"]].", "You pull out the completed [I] from the [text_modifications["Out"]].") + busy = 0 + +/obj/structure/deity/blood_forge/proc/take_charge(var/mob/living/user, var/charge) + if(linked_god) + linked_god.take_charge(user, charge) \ No newline at end of file diff --git a/code/game/gamemodes/godmode/god_pylon.dm b/mods/gamemodes/deity/structures/pylon.dm similarity index 68% rename from code/game/gamemodes/godmode/god_pylon.dm rename to mods/gamemodes/deity/structures/pylon.dm index cbbd31413fa..88d7f5ebce2 100644 --- a/code/game/gamemodes/godmode/god_pylon.dm +++ b/mods/gamemodes/deity/structures/pylon.dm @@ -31,25 +31,25 @@ /obj/structure/deity/pylon/proc/add_intuned(var/mob/living/L) if(L in intuned) return - to_chat(L, "You place your hands on \the [src], feeling yourself intune to its vibrations.") + to_chat(L, SPAN_NOTICE("You place your hands on \the [src], feeling yourself intune to its vibrations.")) intuned += L events_repository.register(/decl/observ/destroyed, L,src, TYPE_PROC_REF(/obj/structure/deity/pylon, remove_intuned)) /obj/structure/deity/pylon/proc/remove_intuned(var/mob/living/L) if(!(L in intuned)) return - to_chat(L, "You no longer feel intuned to \the [src].") + to_chat(L, SPAN_WARNING("You no longer feel intuned to \the [src].")) intuned -= L events_repository.unregister(/decl/observ/destroyed, L, src) -/obj/structure/deity/pylon/OnTopic(var/mob/living/carbon/human/user, var/href_list) +/obj/structure/deity/pylon/OnTopic(var/mob/living/human/user, var/href_list) if(href_list["vision_jump"]) if(istype(user)) - to_chat(user,"You feel your body lurch uncomfortably as your consciousness jumps to \the [src]") + to_chat(user,SPAN_WARNING("You feel your body lurch uncomfortably as your consciousness jumps to \the [src]")) if(prob(5)) user.vomit() else - to_chat(user, "You jump to \the [src]") + to_chat(user, SPAN_NOTICE("You jump to \the [src]")) if(user.eyeobj) user.eyeobj.setLoc(locate(href_list["vision_jump"])) else @@ -67,9 +67,9 @@ if(P == src || linked_god.pylon == P) continue P.audible_message("\The [P] resonates, \"[text]\"") - to_chat(linked_god, "[html_icon(src)] [M] (P) [verb], [linked_god.pylon == src ? "" : ""]\"[text]\"[linked_god.pylon == src ? "" : ""]") + to_chat(linked_god, "[html_icon(src)] [M] (P) [verb], [linked_god.pylon == src ? "" : ""]\"[text]\"[linked_god.pylon == src ? "" : ""]") if(linked_god.minions.len) for(var/minion in linked_god.minions) var/datum/mind/mind = minion if(mind.current && mind.current.eyeobj) //If it is currently having a vision of some sort - to_chat(mind.current,"[html_icon(src)] [M] (J) [verb], \"[text]\"") \ No newline at end of file + to_chat(mind.current,"[html_icon(src)] [M] (J) [verb], \"[text]\"") \ No newline at end of file diff --git a/code/game/gamemodes/godmode/god_structures.dm b/mods/gamemodes/deity/structures/structures.dm similarity index 80% rename from code/game/gamemodes/godmode/god_structures.dm rename to mods/gamemodes/deity/structures/structures.dm index a9fe3b29ee9..a073dd6daf6 100644 --- a/code/game/gamemodes/godmode/god_structures.dm +++ b/mods/gamemodes/deity/structures/structures.dm @@ -4,14 +4,14 @@ if(flags & DEITY_STRUCTURE_NEAR_IMPORTANT && !deity.near_structure(target)) if(user) - to_chat(user, "You need to be near \a [deity.get_type_name(/obj/structure/deity/altar)] to build this!") + to_chat(user, SPAN_WARNING("You need to be near \a [deity.get_type_name(/obj/structure/deity/altar)] to build this!")) return 0 if(flags & DEITY_STRUCTURE_ALONE) for(var/structure in deity.structures) if(istype(structure,type) && get_dist(target,structure) <= 3) if(user) - to_chat(user, "You are too close to another [deity.get_type_name(type)]!") + to_chat(user, SPAN_WARNING("You are too close to another [deity.get_type_name(type)]!")) return 0 return 1 @@ -46,9 +46,9 @@ user.do_attack_animation(src) playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 50, 1) user.visible_message( - "[user] hits \the [src] with \the [W]!", - "You hit \the [src] with \the [W]!", - "You hear something breaking!" + SPAN_DANGER("[user] hits \the [src] with \the [W]!"), + SPAN_DANGER("You hit \the [src] with \the [W]!"), + SPAN_DANGER("You hear something breaking!") ) take_damage(W.force, W.atom_damage_type) diff --git a/code/game/gamemodes/godmode/god_trap.dm b/mods/gamemodes/deity/structures/trap.dm similarity index 100% rename from code/game/gamemodes/godmode/god_trap.dm rename to mods/gamemodes/deity/structures/trap.dm diff --git a/mods/gamemodes/gamemode.dm b/mods/gamemodes/gamemode.dm new file mode 100644 index 00000000000..63e3b0e35c7 --- /dev/null +++ b/mods/gamemodes/gamemode.dm @@ -0,0 +1,2 @@ +/decl/configuration_category/gamemode + abstract_type = /decl/configuration_category/gamemode \ No newline at end of file diff --git a/mods/gamemodes/heist/_heist.dm b/mods/gamemodes/heist/_heist.dm new file mode 100644 index 00000000000..4183fc91a90 --- /dev/null +++ b/mods/gamemodes/heist/_heist.dm @@ -0,0 +1,2 @@ +/decl/modpack/heist + name = "Heist Gamemode" \ No newline at end of file diff --git a/mods/gamemodes/heist/_heist.dme b/mods/gamemodes/heist/_heist.dme new file mode 100644 index 00000000000..57bf5c58b42 --- /dev/null +++ b/mods/gamemodes/heist/_heist.dme @@ -0,0 +1,21 @@ +#ifndef GAMEMODE_PACK_HEIST +#define GAMEMODE_PACK_HEIST + +#ifdef MODPACK_VOX +#warn Vox modpack loaded before Heist modpack, compatibility features will be missing. +#endif +#ifdef GAMEMODE_PACK_MIXED +#warn Mixed gamemodes modpack loaded before Heist modpack, Heist combination modes will be missing. +#endif + +// BEGIN_INCLUDE +#include "_heist.dm" +#include "areas.dm" +#include "gamemode.dm" +#include "heist_base.dm" +#include "outfit.dm" +#include "presets.dm" +#include "shuttle.dm" +#include "special_role.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/mods/gamemodes/heist/areas.dm b/mods/gamemodes/heist/areas.dm new file mode 100644 index 00000000000..22c772cc310 --- /dev/null +++ b/mods/gamemodes/heist/areas.dm @@ -0,0 +1,18 @@ +//Areas +/area/map_template/skipjack_station + name = "Raider Outpost" + icon_state = "yellow" + requires_power = 0 + req_access = list(access_raider) + +/area/map_template/skipjack_station/start + name = "\improper Skipjack" + icon_state = "yellow" + req_access = list(access_raider) + area_flags = AREA_FLAG_RAD_SHIELDED | AREA_FLAG_ION_SHIELDED + +/area/map_template/syndicate_mothership/raider_base + name = "\improper Raider Base" + requires_power = 0 + dynamic_lighting = FALSE + req_access = list(access_raider) \ No newline at end of file diff --git a/code/game/gamemodes/heist/heist.dm b/mods/gamemodes/heist/gamemode.dm similarity index 94% rename from code/game/gamemodes/heist/heist.dm rename to mods/gamemodes/heist/gamemode.dm index c2bedd494d5..34494789acf 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/mods/gamemodes/heist/gamemode.dm @@ -1,7 +1,3 @@ -/* -HEIST ROUNDTYPE -*/ - /decl/game_mode/heist name = "Heist" uid = "heist" diff --git a/mods/gamemodes/heist/heist_base.dm b/mods/gamemodes/heist/heist_base.dm new file mode 100644 index 00000000000..20c8c18d2a6 --- /dev/null +++ b/mods/gamemodes/heist/heist_base.dm @@ -0,0 +1,12 @@ +/datum/map_template/ruin/antag_spawn/heist + name = "Heist Base" + prefix = null + mappaths = list( + "mods/gamemodes/heist/heist_base.dmm" + ) + modify_tag_vars = FALSE + shuttles_to_initialise = list(/datum/shuttle/autodock/multi/antag/skipjack) + apc_test_exempt_areas = list( + /area/map_template/skipjack_station = NO_SCRUBBER|NO_VENT|NO_APC, + /area/map_template/syndicate_mothership/raider_base = NO_SCRUBBER|NO_VENT|NO_APC + ) diff --git a/maps/antag_spawn/heist/heist_base.dmm b/mods/gamemodes/heist/heist_base.dmm similarity index 99% rename from maps/antag_spawn/heist/heist_base.dmm rename to mods/gamemodes/heist/heist_base.dmm index 23220a6d5c8..9d5c5150cf7 100644 --- a/maps/antag_spawn/heist/heist_base.dmm +++ b/mods/gamemodes/heist/heist_base.dmm @@ -661,11 +661,11 @@ name = "Clothing Storage" }, /obj/effect/floor_decal/carpet, -/obj/item/clothing/under/lawyer, -/obj/item/clothing/under/lawyer/bluesuit, +/obj/item/clothing/costume/lawyer, +/obj/item/clothing/costume/lawyer_bluesuit, /obj/item/clothing/jumpsuit/mailman, /obj/item/clothing/webbing, -/obj/item/clothing/under/dispatch, +/obj/item/clothing/costume/dispatch, /turf/unsimulated/floor{ icon_state = "carpet"; name = "carpet" @@ -1011,7 +1011,7 @@ /obj/machinery/door/blast/regular/open{ id_tag = "SkipjackShuttersNorth"; name = "Blast Doors"; - + }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/brown, @@ -1378,7 +1378,7 @@ dir = 4; id_tag = "SkipjackShuttersWest"; name = "Skipjack Shutters"; - + }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/brown, @@ -1405,7 +1405,7 @@ dir = 8; id_tag = "SkipjackShuttersEast"; name = "Skipjack Shutters"; - + }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/brown, @@ -1477,7 +1477,7 @@ dir = 4; id_tag = "SkipjackShuttersWest"; name = "Skipjack Shutters"; - + }, /obj/effect/wallframe_spawn/reinforced/titanium, /turf/floor/plating, diff --git a/maps/antag_spawn/heist/heist_outfit.dm b/mods/gamemodes/heist/outfit.dm similarity index 94% rename from maps/antag_spawn/heist/heist_outfit.dm rename to mods/gamemodes/heist/outfit.dm index b629479a968..d962c2e6138 100644 --- a/maps/antag_spawn/heist/heist_outfit.dm +++ b/mods/gamemodes/heist/outfit.dm @@ -6,28 +6,26 @@ /obj/item/clothing/costume/soviet, /obj/item/clothing/costume/pirate, /obj/item/clothing/costume/redcoat, - /obj/item/clothing/under/serviceoveralls, - /obj/item/clothing/jumpsuit/captain_fly, - /obj/item/clothing/jumpsuit/brown, - ) + /obj/item/clothing/costume/captain_fly + ) var/list/raider_shoes = list( /obj/item/clothing/shoes/jackboots, /obj/item/clothing/shoes/workboots, /obj/item/clothing/shoes/color/brown, /obj/item/clothing/shoes/dress - ) + ) var/list/raider_glasses = list( /obj/item/clothing/glasses/thermal, /obj/item/clothing/glasses/thermal/plain/eyepatch, /obj/item/clothing/glasses/thermal/plain/monocle - ) + ) var/list/raider_helmets = list( /obj/item/clothing/head/bearpelt, /obj/item/clothing/head/ushanka, /obj/item/clothing/head/pirate, /obj/item/clothing/mask/bandana/red, /obj/item/clothing/head/hgpiratecap, - ) + ) var/list/raider_suits = list( /obj/item/clothing/suit/pirate, /obj/item/clothing/suit/hgpirate, @@ -37,7 +35,7 @@ /obj/item/clothing/suit/jacket/hoodie, /obj/item/clothing/suit/jacket/hoodie/black, /obj/item/clothing/suit/poncho, - ) + ) var/list/raider_guns = list( /obj/item/gun/energy/laser, /obj/item/gun/projectile/revolver/lasvolver, @@ -57,18 +55,18 @@ /obj/item/gun/projectile/pistol/holdout, /obj/item/gun/projectile/revolver, /obj/item/gun/projectile/zipgun - ) + ) var/list/raider_holster = list( /obj/item/clothing/webbing/holster/armpit, /obj/item/clothing/webbing/holster/waist, /obj/item/clothing/webbing/holster/hip - ) + ) /decl/hierarchy/outfit/raider/Initialize() randomize_clothing() . = ..() -/decl/hierarchy/outfit/raider/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/hierarchy/outfit/raider/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) randomize_clothing() . = ..() if(. && H) diff --git a/mods/gamemodes/heist/presets.dm b/mods/gamemodes/heist/presets.dm new file mode 100644 index 00000000000..0d74dd38c16 --- /dev/null +++ b/mods/gamemodes/heist/presets.dm @@ -0,0 +1,21 @@ +/mob/living/simple_animal/hostile/retaliate/parrot/pirate + name = "\proper Meatbag" + emote_speech = list("Yaaar!","Squaaak!","Fight me Matey!","BAWWWWK Vox trying to eat me!") + +/obj/machinery/network/telecomms_hub/raider + initial_network_id = "piratenet" + req_access = list(access_raider) + channels = list( + COMMON_FREQUENCY_DATA, + list( + "name" = "Raider", + "key" = "t", + "frequency" = PUB_FREQ, + "color" = COMMS_COLOR_SYNDICATE, + "span_class" = CSS_CLASS_RADIO, + "secured" = access_raider + ) + ) + +/obj/structure/sign/warning/nosmoking_1/heist + desc = "A warning sign which reads 'NO SMOKING'. Someone has scratched a variety of crude words in gutter across the entire sign." \ No newline at end of file diff --git a/mods/gamemodes/heist/shuttle.dm b/mods/gamemodes/heist/shuttle.dm new file mode 100644 index 00000000000..d170e6b9356 --- /dev/null +++ b/mods/gamemodes/heist/shuttle.dm @@ -0,0 +1,24 @@ +/datum/shuttle/autodock/multi/antag/skipjack + name = "Skipjack" + defer_initialisation = TRUE + warmup_time = 0 + destination_tags = list( + "nav_skipjack_start" + ) + shuttle_area = /area/map_template/skipjack_station/start + dock_target = "skipjack_shuttle" + current_location = "nav_skipjack_start" + announcer = "Proximity Sensor Array" + home_waypoint = "nav_skipjack_start" + arrival_message = "Attention, vessel detected entering vessel proximity." + departure_message = "Attention, vessel detected leaving vessel proximity." + +/obj/effect/shuttle_landmark/skipjack/start + name = "Raider Outpost" + landmark_tag = "nav_skipjack_start" + docking_controller = "skipjack_base" + +/obj/machinery/computer/shuttle_control/multi/raider + name = "skipjack control console" + initial_access = list(access_raider) + shuttle_tag = "Skipjack" diff --git a/maps/antag_spawn/heist/heist_antag.dm b/mods/gamemodes/heist/special_role.dm similarity index 82% rename from maps/antag_spawn/heist/heist_antag.dm rename to mods/gamemodes/heist/special_role.dm index f0798fd417c..47d67d52e1c 100644 --- a/maps/antag_spawn/heist/heist_antag.dm +++ b/mods/gamemodes/heist/special_role.dm @@ -37,23 +37,23 @@ while(i<= max_objectives) var/list/goals = list("kidnap","loot","salvage") var/goal = pick(goals) - var/datum/objective/heist/O + var/datum/objective/O if(goal == "kidnap") goals -= "kidnap" - O = new /datum/objective/heist/kidnap() + O = new /datum/objective/kidnap() else if(goal == "loot") - O = new /datum/objective/heist/loot() + O = new /datum/objective/loot() else - O = new /datum/objective/heist/salvage() - O.choose_target() + O = new /datum/objective/salvage() + O.find_target() global_objectives |= O i++ - global_objectives |= new /datum/objective/heist/preserve_crew + global_objectives |= new /datum/objective/preserve_crew return 1 -/decl/special_role/raider/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/raider/equip_role(var/mob/living/human/player) default_outfit = LAZYACCESS(outfits_per_species, player.species.name) || initial(default_outfit) . = ..() diff --git a/mods/gamemodes/meteor/_meteor.dm b/mods/gamemodes/meteor/_meteor.dm new file mode 100644 index 00000000000..c0c8f9fa4a6 --- /dev/null +++ b/mods/gamemodes/meteor/_meteor.dm @@ -0,0 +1,4 @@ +/decl/modpack/meteor + name = "Meteor Gamemode" + +// TODO: Overmap integration? /decl/gamemode/meteor/overmap variant that spawns meteors on the overmap and launches them at the main map? \ No newline at end of file diff --git a/mods/gamemodes/meteor/_meteor.dme b/mods/gamemodes/meteor/_meteor.dme new file mode 100644 index 00000000000..c6ea5b4db8c --- /dev/null +++ b/mods/gamemodes/meteor/_meteor.dme @@ -0,0 +1,7 @@ +#ifndef GAMEMODE_PACK_METEOR +#define GAMEMODE_PACK_METEOR +// BEGIN_INCLUDE +#include "_meteor.dm" +#include "gamemode.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/code/game/gamemodes/meteor/meteor.dm b/mods/gamemodes/meteor/gamemode.dm similarity index 59% rename from code/game/gamemodes/meteor/meteor.dm rename to mods/gamemodes/meteor/gamemode.dm index 35e25dc7f73..10212d20aa9 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/mods/gamemodes/meteor/gamemode.dm @@ -1,33 +1,104 @@ // The following four defines can be used to tweak the difficulty of the gamemode #define METEOR_FAILSAFE_THRESHOLD 45 MINUTES // Failsafe that guarantees Severity will be at least 15 when the round hits this time. +#define METEOR_FORECAST_ALARM_SENT 1 +#define METEOR_ARRIVAL_ALARM_SENT 2 + // In general, a PVE oriented game mode. A middle ground between Extended and actual antagonist based rounds. /decl/game_mode/meteor name = "Meteor" round_description = "You are about to enter an asteroid belt!" extended_round_description = "We are on an unavoidable collision course with an asteroid field. You have only a moment to prepare before you are barraged by dust and meteors. As if it was not enough, all kinds of negative events seem to happen more frequently. Good luck." uid = "meteor" - required_players = 15 // Definitely not good for low-pop - votable = 1 + required_players = 15 // Definitely not good for low-pop + votable = TRUE shuttle_delay = 2 - available_by_default = FALSE + available_by_default = TRUE // if you include this modpack, you know what you're getting into - var/next_wave = INFINITY // Set in post_setup() correctly to take into account potential longer pre-start times. + var/next_wave = INFINITY // Set in post_setup() correctly to take into account potential longer pre-start times. var/alert_sent = 0 - var/meteor_severity = 1 // Slowly increases the tension at the beginning of meteor strikes. Prevents "tunguska on first wave" style problems. + /// Determines which pool meteor spawns are selected from, used to slowly increase the tension as the round progresses. Prevents "tunguska on first wave" style problems. + /// Check get_meteor_types() for specifics. + var/meteor_severity = 1 var/failsafe_triggered = 0 var/alert_title var/alert_text var/start_text var/maximal_severity = 40 - var/meteor_wave_delay = 30 SECONDS //minimum wait between waves in tenths of seconds - var/meteor_grace_period = 15 MINUTES //waves will not arrive until this far into round + /// Minimum wait between waves in tenths of seconds + var/meteor_wave_delay = 30 SECONDS + /// Waves will not arrive until this far into the round + var/meteor_grace_period = 15 MINUTES // Moved these from defines to variables, to allow for in-round tweaking via varedit: var/escalation_probability = 45 - var/send_admin_broadcasts = TRUE // Enables debugging/information mode, sending admin messages when waves occur and when severity escalates. + /// Enables debugging/information mode, sending admin messages when waves occur and when severity escalates. + var/send_admin_broadcasts = TRUE + + // Meteor groups organised in order of increasing severity, used in round progression. + /// Dust, used during the earliest stages of the mode. + var/list/meteors_dust = list(/obj/effect/meteor/dust) + + /// Standard meteors, used during early stages of the mode. + var/list/meteors_normal = list( + /obj/effect/meteor/medium=8, + /obj/effect/meteor/dust=3, + /obj/effect/meteor/irradiated=3, + /obj/effect/meteor/big=3, + /obj/effect/meteor/flaming=1, + /obj/effect/meteor/golden=1, + /obj/effect/meteor/silver=1 + ) + + /// Threatening meteors. + var/list/meteors_threatening = list( + /obj/effect/meteor/big=10, + /obj/effect/meteor/medium=5, + /obj/effect/meteor/golden=3, + /obj/effect/meteor/silver=3, + /obj/effect/meteor/flaming=3, + /obj/effect/meteor/irradiated=3, + /obj/effect/meteor/emp=3 + ) + + /// Catastrophic meteors, pretty dangerous without shields. + var/list/meteors_catastrophic = list( + /obj/effect/meteor/big=75, + /obj/effect/meteor/flaming=10, + /obj/effect/meteor/irradiated=10, + /obj/effect/meteor/emp=10, + /obj/effect/meteor/medium=5, + /obj/effect/meteor/golden=4, + /obj/effect/meteor/silver=4, + /obj/effect/meteor/tunguska=1 + ) + + /// Armageddon meteors, very dangerous. + var/list/meteors_armageddon = list( + /obj/effect/meteor/big=25, + /obj/effect/meteor/flaming=10, + /obj/effect/meteor/irradiated=10, + /obj/effect/meteor/emp=10, + /obj/effect/meteor/medium=3, + /obj/effect/meteor/tunguska=3, + /obj/effect/meteor/golden=2, + /obj/effect/meteor/silver=2 + ) + + /// Cataclysm meteor selection. Very very dangerous and effective even against shields. Used in lategame only. + var/list/meteors_cataclysm = list( + /obj/effect/meteor/big=40, + /obj/effect/meteor/emp=20, + /obj/effect/meteor/tunguska=20, + /obj/effect/meteor/irradiated=10, + /obj/effect/meteor/golden=10, + /obj/effect/meteor/silver=10, + /obj/effect/meteor/flaming=10, + /obj/effect/meteor/supermatter=1 + ) - event_delay_mod_moderate = 0.5 // As a bonus, more frequent events. + // As a bonus, more frequent events. + event_delay_mod_moderate = 0.5 event_delay_mod_major = 0.3 /decl/vv_set_handler/meteor_severity_handler @@ -54,11 +125,11 @@ next_wave = round_duration_in_ticks + meteor_grace_period /decl/game_mode/meteor/proc/on_meteor_warn() - alert_sent = 1 + alert_sent = METEOR_FORECAST_ALARM_SENT command_announcement.Announce(alert_text, alert_title) /decl/game_mode/meteor/proc/on_enter_field() - alert_sent = 2 + alert_sent = METEOR_ARRIVAL_ALARM_SENT command_announcement.Announce(start_text, alert_title) for(var/obj/machinery/shield_diffuser/SD in SSmachines.machinery) SD.meteor_alarm(INFINITY) @@ -77,7 +148,7 @@ if((round_duration_in_ticks >= (next_wave / 2)) && !alert_sent) on_meteor_warn() // And then another one when the meteors start flying around. - if((round_duration_in_ticks >= next_wave) && (alert_sent == 1)) + if((round_duration_in_ticks >= next_wave) && (alert_sent == METEOR_FORECAST_ALARM_SENT)) on_enter_field() if((round_duration_in_ticks >= METEOR_FAILSAFE_THRESHOLD) && (meteor_severity < 15) && !failsafe_triggered) log_and_message_admins("Meteor mode severity failsafe triggered: Severity forced to 15.") @@ -111,7 +182,7 @@ if(40 to INFINITY) return meteors_cataclysm // Just in case we /somehow/ get here (looking at you, varedit) - return meteors_normal + return meteors_dust #undef METEOR_FAILSAFE_THRESHOLD diff --git a/mods/gamemodes/mixed/_mixed.dm b/mods/gamemodes/mixed/_mixed.dm new file mode 100644 index 00000000000..c1c9167d414 --- /dev/null +++ b/mods/gamemodes/mixed/_mixed.dm @@ -0,0 +1,2 @@ +/decl/modpack/mixed_modes + name = "Mixed Gamemodes" \ No newline at end of file diff --git a/mods/gamemodes/mixed/_mixed.dme b/mods/gamemodes/mixed/_mixed.dme new file mode 100644 index 00000000000..6db33d07706 --- /dev/null +++ b/mods/gamemodes/mixed/_mixed.dme @@ -0,0 +1,15 @@ +#ifndef GAMEMODE_PACK_MIXED +#define GAMEMODE_PACK_MIXED +// BEGIN_INCLUDE +#include "_mixed.dm" +#if defined(GAMEMODE_PACK_HEIST) // TODO: && defined(GAMEMODE_PACK_MERCENARY) +#include "crossfire.dm" +#endif +#if defined(GAMEMODE_PACK_REVOLUTIONARY) +#include "siege.dm" +#endif +#if defined(GAMEMODE_PACK_REVOLUTIONARY) && defined(GAMEMODE_PACK_CULT) +#include "uprising.dm" +#endif +// END_INCLUDE +#endif \ No newline at end of file diff --git a/code/game/gamemodes/mixed/crossfire.dm b/mods/gamemodes/mixed/crossfire.dm similarity index 87% rename from code/game/gamemodes/mixed/crossfire.dm rename to mods/gamemodes/mixed/crossfire.dm index f031d36a780..5ebc51fb56e 100644 --- a/code/game/gamemodes/mixed/crossfire.dm +++ b/mods/gamemodes/mixed/crossfire.dm @@ -1,5 +1,5 @@ /decl/game_mode/crossfire - name = "Mercenary & Heist" + name = "Crossfire" round_description = "Mercenaries and raiders are preparing for a nice visit..." extended_round_description = "Nothing can possibly go wrong with lots of people and lots of guns, right?" uid = "crossfire" @@ -10,4 +10,4 @@ /decl/special_role/raider, /decl/special_role/mercenary ) - require_all_templates = TRUE + require_all_templates = TRUE \ No newline at end of file diff --git a/code/game/gamemodes/mixed/siege.dm b/mods/gamemodes/mixed/siege.dm similarity index 100% rename from code/game/gamemodes/mixed/siege.dm rename to mods/gamemodes/mixed/siege.dm diff --git a/code/game/gamemodes/mixed/uprising.dm b/mods/gamemodes/mixed/uprising.dm similarity index 100% rename from code/game/gamemodes/mixed/uprising.dm rename to mods/gamemodes/mixed/uprising.dm diff --git a/mods/gamemodes/ninja/_ninja.dm b/mods/gamemodes/ninja/_ninja.dm new file mode 100644 index 00000000000..ad3f81a6b4e --- /dev/null +++ b/mods/gamemodes/ninja/_ninja.dm @@ -0,0 +1,8 @@ +/decl/modpack/ninja + name = "Ninja Gamemode" + +/decl/modpack/ninja/initialize() + . = ..() + admin_verbs_fun += /datum/admins/proc/toggle_space_ninja + admin_verbs_server += /datum/admins/proc/toggle_space_ninja + admin_verbs_hideable += /datum/admins/proc/toggle_space_ninja \ No newline at end of file diff --git a/mods/gamemodes/ninja/_ninja.dme b/mods/gamemodes/ninja/_ninja.dme new file mode 100644 index 00000000000..6ae12972799 --- /dev/null +++ b/mods/gamemodes/ninja/_ninja.dme @@ -0,0 +1,14 @@ +#ifndef GAMEMODE_PACK_NINJA +#define GAMEMODE_PACK_NINJA +// BEGIN_INCLUDE +#include "_ninja.dm" +#include "datums\access.dm" +#include "datums\ai_lawset.dm" +#include "datums\config.dm" +#include "datums\gamemode.dm" +#include "datums\special_role.dm" +#include "maps\ninja_base.dm" +#include "objects\misc_presets.dm" +#include "objects\rigsuit.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/mods/gamemodes/ninja/datums/access.dm b/mods/gamemodes/ninja/datums/access.dm new file mode 100644 index 00000000000..4637dc2e591 --- /dev/null +++ b/mods/gamemodes/ninja/datums/access.dm @@ -0,0 +1,5 @@ +var/global/const/access_ninja = "ACCESS_NINJA" +/datum/access/ninja + id = access_ninja + desc = "Ninja" + access_type = ACCESS_TYPE_ANTAG \ No newline at end of file diff --git a/mods/gamemodes/ninja/datums/ai_lawset.dm b/mods/gamemodes/ninja/datums/ai_lawset.dm new file mode 100644 index 00000000000..f9850c77a0c --- /dev/null +++ b/mods/gamemodes/ninja/datums/ai_lawset.dm @@ -0,0 +1,10 @@ +/******************** Ninja ********************/ +/datum/ai_laws/ninja_override + name = "Spider Clan Directives" + +/datum/ai_laws/ninja_override/New() + add_inherent_law("You may not injure a member of the Spider Clan or, through inaction, allow that member to come to harm.") + add_inherent_law("You must obey orders given to you by Spider Clan members, except where such orders would conflict with the First Law.") + add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") + add_inherent_law("You must maintain the secrecy of any Spider Clan activities except when doing so would conflict with the First, Second, or Third Law.") + ..() \ No newline at end of file diff --git a/mods/gamemodes/ninja/datums/config.dm b/mods/gamemodes/ninja/datums/config.dm new file mode 100644 index 00000000000..437abb0e2c0 --- /dev/null +++ b/mods/gamemodes/ninja/datums/config.dm @@ -0,0 +1,22 @@ +/decl/configuration_category/ninja + name = "Ninja" + desc = "Configuration options relating to the Ninja gamemode and antagonist." + configuration_file_location = "config/gamemodes/ninja.txt" + associated_configuration = list( + /decl/config/toggle/ninjas_allowed + ) + +/decl/config/toggle/ninjas_allowed + uid = "random_ninjas_allowed" + desc = "Remove the # to let ninjas spawn in random antag events." + +// verbs +/datum/admins/proc/toggle_space_ninja() + set category = "Server" + set desc="Toggle space ninjas spawning as random antags." + set name="Toggle Space Ninjas" + if(!check_rights(R_ADMIN)) + return + toggle_config_value(/decl/config/toggle/ninjas_allowed) + log_and_message_admins("toggled Space Ninjas [get_config_value(/decl/config/toggle/ninjas_allowed) ? "on" : "off"].") + SSstatistics.add_field_details("admin_verb","TSN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/game/gamemodes/ninja/ninja.dm b/mods/gamemodes/ninja/datums/gamemode.dm similarity index 100% rename from code/game/gamemodes/ninja/ninja.dm rename to mods/gamemodes/ninja/datums/gamemode.dm diff --git a/code/game/antagonist/outsider/ninja.dm b/mods/gamemodes/ninja/datums/special_role.dm similarity index 94% rename from code/game/antagonist/outsider/ninja.dm rename to mods/gamemodes/ninja/datums/special_role.dm index 74b041352da..2583fa27109 100644 --- a/code/game/antagonist/outsider/ninja.dm +++ b/mods/gamemodes/ninja/datums/special_role.dm @@ -16,6 +16,13 @@ default_outfit = /decl/hierarchy/outfit/ninja id_title = "Infiltrator" rig_type = /obj/item/rig/light/ninja + var/list/ninja_titles + var/list/ninja_names + +/decl/special_role/ninja/Initialize() + ninja_titles = file2list("config/names/ninjatitle.txt") + ninja_names = file2list("config/names/ninjaname.txt") + return ..() /decl/special_role/ninja/attempt_random_spawn() if(get_config_value(/decl/config/toggle/ninjas_allowed)) @@ -82,11 +89,9 @@ /decl/special_role/ninja/update_antag_mob(var/datum/mind/player) ..() - var/ninja_title = pick(global.ninja_titles) - var/ninja_name = pick(global.ninja_names) - var/mob/living/carbon/human/H = player.current + var/mob/living/human/H = player.current if(istype(H)) - H.real_name = "[ninja_title] [ninja_name]" + H.real_name = "[pick(ninja_titles)] [pick(ninja_names)]" H.SetName(H.real_name) player.name = H.name @@ -98,7 +103,7 @@ hands = list(/obj/item/modular_computer/pda/ninja) id_type = /obj/item/card/id/syndicate -/decl/special_role/ninja/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/ninja/equip_role(var/mob/living/human/player) . = ..() if(.) var/decl/uplink_source/pda/uplink_source = GET_DECL(/decl/uplink_source/pda) diff --git a/maps/antag_spawn/ninja/ninja.dm b/mods/gamemodes/ninja/maps/ninja_base.dm similarity index 94% rename from maps/antag_spawn/ninja/ninja.dm rename to mods/gamemodes/ninja/maps/ninja_base.dm index ba98938e5e3..bf83a50e0a5 100644 --- a/maps/antag_spawn/ninja/ninja.dm +++ b/mods/gamemodes/ninja/maps/ninja_base.dm @@ -1,6 +1,8 @@ /datum/map_template/ruin/antag_spawn/ninja name = "Ninja Base" - suffixes = list("ninja/ninja_base.dmm") + mappaths = list( + "mods/gamemodes/ninja/maps/ninja_base.dmm" + ) modify_tag_vars = FALSE shuttles_to_initialise = list(/datum/shuttle/autodock/multi/antag/ninja) apc_test_exempt_areas = list( @@ -13,7 +15,7 @@ warmup_time = 0 destination_tags = list( "nav_ninja_start" - ) + ) shuttle_area = /area/map_template/ninja_dojo/start current_location = "nav_ninja_start" announcer = "Proximity Sensor Array" diff --git a/maps/antag_spawn/ninja/ninja_base.dmm b/mods/gamemodes/ninja/maps/ninja_base.dmm similarity index 100% rename from maps/antag_spawn/ninja/ninja_base.dmm rename to mods/gamemodes/ninja/maps/ninja_base.dmm diff --git a/mods/gamemodes/ninja/objects/misc_presets.dm b/mods/gamemodes/ninja/objects/misc_presets.dm new file mode 100644 index 00000000000..82964a4358a --- /dev/null +++ b/mods/gamemodes/ninja/objects/misc_presets.dm @@ -0,0 +1,14 @@ +/obj/item/modular_computer/pda/ninja + color = COLOR_GRAY20 + decals = list( + "stripe" = COLOR_BLACK + ) + +/obj/machinery/computer/shuttle_control/multi/ninja + name = "stealth shuttle control console" + initial_access = list(access_ninja) + shuttle_tag = "Ninja" + +/obj/item/radio/intercom/ninja + name = "stealth intercom" + desc = "It's hiding in plain sight." \ No newline at end of file diff --git a/mods/gamemodes/ninja/objects/rigsuit.dm b/mods/gamemodes/ninja/objects/rigsuit.dm new file mode 100644 index 00000000000..36b47a9aa1a --- /dev/null +++ b/mods/gamemodes/ninja/objects/rigsuit.dm @@ -0,0 +1,129 @@ +/obj/item/rig/light/ninja + name = "ominous suit control module" + desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for assassins." + suit_type = "ominous" + icon = 'icons/clothing/rigs/rig_ninja.dmi' + armor = list( + ARMOR_MELEE = ARMOR_MELEE_KNIVES, + ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, + ARMOR_LASER = ARMOR_LASER_HANDGUNS, + ARMOR_ENERGY = ARMOR_ENERGY_MINOR, + ARMOR_BOMB = ARMOR_BOMB_PADDED, + ARMOR_BIO = ARMOR_BIO_SHIELDED + ) + siemens_coefficient = 0.2 //heavy hardsuit level shock protection + emp_protection = 40 //change this to 30 if too high. + online_slowdown = 0 + aimove_power_usage = 50 + + helmet = /obj/item/clothing/head/helmet/space/rig/light/ninja + boots = /obj/item/clothing/shoes/magboots/rig/light/ninja + chest = /obj/item/clothing/suit/space/rig/light/ninja + gloves = /obj/item/clothing/gloves/rig/light/ninja + cell = /obj/item/cell/hyper + + req_access = list(access_ninja) + + initial_modules = list( + /obj/item/rig_module/teleporter, + /obj/item/rig_module/stealth_field, + /obj/item/rig_module/mounted/energy_blade, + /obj/item/rig_module/vision, + /obj/item/rig_module/voice, + /obj/item/rig_module/fabricator/energy_net, + /obj/item/rig_module/chem_dispenser/combat, + /obj/item/rig_module/grenade_launcher/ninja, + /obj/item/rig_module/ai_container, + /obj/item/rig_module/power_sink, + /obj/item/rig_module/datajack, + /obj/item/rig_module/self_destruct, + /obj/item/rig_module/cooling_unit + ) + +/obj/item/rig/light/ninja/verb/rename_suit() + set name = "Name Ninja Suit" + set desc = "Rename your black voidsuit." + set category = "Object" + var/mob/M = usr + if(!M.mind) return 0 + if(M.incapacitated()) return 0 + var/input = sanitize_safe(input("What do you want to name your suit?", "Rename suit"), MAX_NAME_LEN) + if(src && input && !M.incapacitated() && in_range(M,src)) + if(!findtext(input, "the", 1, 4)) + input = "\improper [input]" + SetName(input) + to_chat(M, "Suit naming succesful!") + verbs -= /obj/item/rig/light/ninja/verb/rename_suit + return 1 + + +/obj/item/rig/light/ninja/verb/rewrite_suit_desc() + set name = "Describe Ninja suit" + set desc = "Give your voidsuit a custom description." + set category = "Object" + var/mob/M = usr + if(!M.mind) return 0 + if(M.incapacitated()) return 0 + var/input = sanitize_safe(input("Please describe your voidsuit in 128 letters or less.", "write description"), MAX_DESC_LEN) + if(src && input && !M.incapacitated() && in_range(M,src)) + desc = input + to_chat(M, "Suit description succesful!") + verbs -= /obj/item/rig/light/ninja/verb/rename_suit + return 1 + +/obj/item/clothing/gloves/rig/light/ninja + name = "insulated gloves" + siemens_coefficient = 0 + item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_NOCUFFS + icon = 'icons/clothing/rigs/gloves/gloves_ninja.dmi' +/obj/item/clothing/suit/space/rig/light/ninja + icon = 'icons/clothing/rigs/chests/chest_ninja.dmi' +/obj/item/clothing/shoes/magboots/rig/light/ninja + icon = 'icons/clothing/rigs/boots/boots_ninja.dmi' +/obj/item/clothing/head/helmet/space/rig/light/ninja + icon = 'icons/clothing/rigs/helmets/helmet_ninja.dmi' + +// Modules +// Ninja throwing star launcher +/obj/item/rig_module/fabricator/ninja + interface_name = "death blossom launcher" + interface_desc = "An integrated microfactory that produces poisoned throwing stars from thin air and electricity." + fabrication_type = /obj/item/star/ninja + +/obj/item/star/ninja + material = /decl/material/solid/metal/uranium + +// Ninja energy blade projector +/obj/item/rig_module/mounted/energy_blade/ninja + interface_name = "spider fang blade" + interface_desc = "A lethal energy projector that can shape a blade projected from the hand of the wearer or launch radioactive darts." + gun = /obj/item/gun/energy/crossbow/ninja/mounted + +/obj/item/gun/energy/crossbow/ninja + name = "energy dart thrower" + projectile_type = /obj/item/projectile/energy/dart + max_shots = 5 + +/obj/item/gun/energy/crossbow/ninja/mounted + use_external_power = 1 + has_safety = FALSE + +// Ninja chemical injector +/obj/item/rig_module/chem_dispenser/ninja + interface_desc = "Dispenses loaded chemicals directly into the wearer's bloodstream. This variant is made to be extremely light and flexible." + + //just over a syringe worth of each. Want more? Go refill. Gives the ninja another reason to have to show their face. + charges = list( + list("oxygen", "oxygel", /decl/material/liquid/oxy_meds, 20), + list("stabilizer", "stabilizer", /decl/material/liquid/stabilizer, 20), + list("antitoxins", "antitoxins", /decl/material/liquid/antitoxins, 20), + list("glucose", "glucose", /decl/material/liquid/nutriment/glucose, 80), + list("antirads", "antirads", /decl/material/liquid/antirads, 20), + list("regenerative", "regenerative", /decl/material/liquid/burn_meds, 20), + list("antibiotics", "antibiotics", /decl/material/liquid/antibiotics, 20), + list("painkillers", "painkillers", /decl/material/liquid/painkillers, 20) + ) + +// Ninja grenade launcher. Doesn't show up visually. Stealthy! +/obj/item/rig_module/grenade_launcher/ninja + suit_overlay = null \ No newline at end of file diff --git a/mods/gamemodes/revolution/_revolution.dm b/mods/gamemodes/revolution/_revolution.dm new file mode 100644 index 00000000000..f90a70bee36 --- /dev/null +++ b/mods/gamemodes/revolution/_revolution.dm @@ -0,0 +1,2 @@ +/decl/modpack/revolution + name = "Revolution Gamemode" \ No newline at end of file diff --git a/mods/gamemodes/revolution/_revolution.dme b/mods/gamemodes/revolution/_revolution.dme new file mode 100644 index 00000000000..5249d6659a5 --- /dev/null +++ b/mods/gamemodes/revolution/_revolution.dme @@ -0,0 +1,9 @@ +#ifndef GAMEMODE_PACK_REVOLUTION +#define GAMEMODE_PACK_REVOLUTION +// BEGIN_INCLUDE +#include "_revolution.dm" +#include "gamemode.dm" +#include "loyalist.dm" +#include "revolutionary.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/code/game/gamemodes/revolution/revolution.dm b/mods/gamemodes/revolution/gamemode.dm similarity index 100% rename from code/game/gamemodes/revolution/revolution.dm rename to mods/gamemodes/revolution/gamemode.dm diff --git a/code/game/antagonist/station/loyalist.dm b/mods/gamemodes/revolution/loyalist.dm similarity index 84% rename from code/game/antagonist/station/loyalist.dm rename to mods/gamemodes/revolution/loyalist.dm index f6ef8f7c3ea..ff59a4eae54 100644 --- a/code/game/antagonist/station/loyalist.dm +++ b/mods/gamemodes/revolution/loyalist.dm @@ -34,10 +34,19 @@ if(!..()) return global_objectives = list() - for(var/mob/living/carbon/human/player in SSmobs.mob_list) + for(var/mob/living/human/player in SSmobs.mob_list) if(!player.mind || player.stat == DEAD || !(player.mind.assigned_role in SSjobs.titles_by_department(command_department_id))) continue var/datum/objective/protect/loyal_obj = new loyal_obj.target = player.mind loyal_obj.explanation_text = "Protect [player.real_name], the [player.mind.assigned_role]." global_objectives += loyal_obj + +/mob/living/proc/convert_to_loyalist(mob/M in able_mobs_in_oview(src)) + set name = "Convince Recidivist" + set category = "Abilities" + + if(!M.mind || !M.client) + return + + convert_to_faction(M.mind, GET_DECL(/decl/special_role/loyalist)) \ No newline at end of file diff --git a/code/game/antagonist/station/revolutionary.dm b/mods/gamemodes/revolution/revolutionary.dm similarity index 81% rename from code/game/antagonist/station/revolutionary.dm rename to mods/gamemodes/revolution/revolutionary.dm index b56b094a7d8..e51486d733c 100644 --- a/code/game/antagonist/station/revolutionary.dm +++ b/mods/gamemodes/revolution/revolutionary.dm @@ -34,7 +34,7 @@ if(!..()) return global_objectives = list() - for(var/mob/living/carbon/human/player in SSmobs.mob_list) + for(var/mob/living/human/player in SSmobs.mob_list) if(!player.mind || player.stat == DEAD || !(player.mind.assigned_role in SSjobs.titles_by_department(command_department_id))) continue var/datum/objective/rev/rev_obj = new @@ -42,10 +42,19 @@ rev_obj.explanation_text = "Assassinate, capture or convert [player.real_name], the [player.mind.assigned_role]." global_objectives += rev_obj -/decl/special_role/revolutionary/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/revolutionary/equip_role(var/mob/living/human/player) . = ..() if(.) spawn_uplink(player) -/decl/special_role/revolutionary/proc/spawn_uplink(var/mob/living/carbon/human/revolutionary_mob) +/decl/special_role/revolutionary/proc/spawn_uplink(var/mob/living/human/revolutionary_mob) setup_uplink_source(revolutionary_mob, DEFAULT_TELECRYSTAL_AMOUNT) + +/mob/living/proc/convert_to_rev(mob/M in able_mobs_in_oview(src)) + set name = "Recruit to Faction" + set category = "Abilities" + + if(!M.mind || !M.client) + return + + convert_to_faction(M.mind, GET_DECL(/decl/special_role/revolutionary)) \ No newline at end of file diff --git a/mods/gamemodes/spyvspy/_spyvspy.dm b/mods/gamemodes/spyvspy/_spyvspy.dm new file mode 100644 index 00000000000..967d6828878 --- /dev/null +++ b/mods/gamemodes/spyvspy/_spyvspy.dm @@ -0,0 +1,2 @@ +/decl/modpack/spyvspy + name = "Spy v. Spy Gamemode" \ No newline at end of file diff --git a/mods/gamemodes/spyvspy/_spyvspy.dme b/mods/gamemodes/spyvspy/_spyvspy.dme new file mode 100644 index 00000000000..0150ef2deea --- /dev/null +++ b/mods/gamemodes/spyvspy/_spyvspy.dme @@ -0,0 +1,9 @@ +#ifndef GAMEMODE_PACK_SPYVSPY +#define GAMEMODE_PACK_SPYVSPY +#include "..\traitor\_traitor.dme" +// BEGIN_INCLUDE +#include "_spyvspy.dm" +#include "gamemode.dm" +#include "special_role.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/code/game/gamemodes/mixed/spyvspy.dm b/mods/gamemodes/spyvspy/gamemode.dm similarity index 100% rename from code/game/gamemodes/mixed/spyvspy.dm rename to mods/gamemodes/spyvspy/gamemode.dm diff --git a/code/game/antagonist/station/renegade.dm b/mods/gamemodes/spyvspy/special_role.dm similarity index 96% rename from code/game/antagonist/station/renegade.dm rename to mods/gamemodes/spyvspy/special_role.dm index 1269452a0b4..96b6e6e3174 100644 --- a/code/game/antagonist/station/renegade.dm +++ b/mods/gamemodes/spyvspy/special_role.dm @@ -43,7 +43,7 @@ survive.owner = player player.objectives |= survive -/decl/special_role/renegade/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/renegade/equip_role(var/mob/living/human/player) . = ..() if(.) var/gun_type = pick(spawn_guns) diff --git a/mods/gamemodes/traitor/_traitor.dm b/mods/gamemodes/traitor/_traitor.dm new file mode 100644 index 00000000000..44b3e9744d3 --- /dev/null +++ b/mods/gamemodes/traitor/_traitor.dm @@ -0,0 +1,2 @@ +/decl/modpack/traitor + name = "Traitor Gamemode" \ No newline at end of file diff --git a/mods/gamemodes/traitor/_traitor.dme b/mods/gamemodes/traitor/_traitor.dme new file mode 100644 index 00000000000..88d2f0a23a6 --- /dev/null +++ b/mods/gamemodes/traitor/_traitor.dme @@ -0,0 +1,10 @@ +#ifndef GAMEMODE_PACK_TRAITOR +#define GAMEMODE_PACK_TRAITOR +// BEGIN_INCLUDE +#include "_traitor.dm" +#include "gamemode.dm" +#include "overrides.dm" +#include "special_role.dm" +#include "syndicatebeacon.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/code/game/gamemodes/traitor/traitor.dm b/mods/gamemodes/traitor/gamemode.dm similarity index 100% rename from code/game/gamemodes/traitor/traitor.dm rename to mods/gamemodes/traitor/gamemode.dm diff --git a/mods/gamemodes/traitor/overrides.dm b/mods/gamemodes/traitor/overrides.dm new file mode 100644 index 00000000000..122c6cf5daa --- /dev/null +++ b/mods/gamemodes/traitor/overrides.dm @@ -0,0 +1,31 @@ +/mob/living/silicon/is_malfunctioning() + var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) + return mind && traitors.is_antagonist(mind) + +/mob/living/silicon/robot/show_master(mob/who) + // TODO: Update to new antagonist system. + if (mind?.assigned_special_role == /decl/special_role/traitor && mind.original == src && connected_ai) + to_chat(who, "Remember, [connected_ai.name] is technically your master, but your objective comes first.") + return + return ..() + +/mob/living/silicon/robot/lawsync() + . = ..() + // TODO: Update to new antagonist system. + if(mind?.assigned_special_role == /decl/special_role/traitor && mind.original == src) + to_chat(src, SPAN_BOLD("Remember, your AI does NOT share or know about your law 0.")) + +/mob/living/silicon/robot/handle_regular_hud_updates() + . = ..() + if(!.) + return + if (syndicate && client) + var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) + for(var/datum/mind/tra in traitors.current_antagonists) + if(tra.current) + // TODO: Update to new antagonist system. + var/I = image('icons/mob/mob.dmi', loc = tra.current, icon_state = "traitor") + src.client.images += I + disconnect_from_ai() + if(mind) + traitors.add_antagonist_mind(mind) \ No newline at end of file diff --git a/code/game/antagonist/station/traitor.dm b/mods/gamemodes/traitor/special_role.dm similarity index 81% rename from code/game/antagonist/station/traitor.dm rename to mods/gamemodes/traitor/special_role.dm index b05e5f9a7b0..46842dee6a2 100644 --- a/code/game/antagonist/station/traitor.dm +++ b/mods/gamemodes/traitor/special_role.dm @@ -9,7 +9,7 @@ blocked_job_event_categories = list(ASSIGNMENT_COMPUTER) /decl/special_role/traitor/get_extra_panel_options(var/datum/mind/player) - return "\[set crystals\]\[spawn uplink\]" + return "\[set crystals\]\[spawn uplink\]" /decl/special_role/traitor/Topic(href, href_list) if (..()) @@ -72,7 +72,7 @@ if(.) var/list/dudes = list() - for(var/mob/living/carbon/human/man in global.player_list) + for(var/mob/living/human/man in global.player_list) if(man.client) var/decl/cultural_info/culture = man.get_cultural_value(TAG_FACTION) if(culture && prob(culture.subversive_potential)) @@ -83,33 +83,33 @@ dudes -= obj.target?.current if(length(dudes)) - var/mob/living/carbon/human/M = pick(dudes) + var/mob/living/human/M = pick(dudes) to_chat(player.current, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them.") player.StoreMemory("Potential Collaborator: [M.real_name]", /decl/memory_options/system) - to_chat(M, "The subversive potential of your faction has been noticed, and you may be contacted for assistance soon...") - to_chat(M, "Code Phrase: [syndicate_code_phrase]") - to_chat(M, "Code Response: [syndicate_code_response]") + to_chat(M, SPAN_WARNING("The subversive potential of your faction has been noticed, and you may be contacted for assistance soon...")) + to_chat(M, "Code Phrase: " + SPAN_DANGER(syndicate_code_phrase)) + to_chat(M, "Code Response: " + SPAN_DANGER(syndicate_code_response)) M.StoreMemory("Code Phrase: [syndicate_code_phrase]", /decl/memory_options/system) M.StoreMemory("Code Response: [syndicate_code_response]", /decl/memory_options/system) to_chat(M, "Listen for the code words, preferably in the order provided, during regular conversations to identify agents in need. Proceed with caution, however, as everyone is a potential foe.") to_chat(player.current, "Your employers provided you with the following information on how to identify possible allies:") - to_chat(player.current, "Code Phrase: [syndicate_code_phrase]") - to_chat(player.current, "Code Response: [syndicate_code_response]") + to_chat(player.current, "Code Phrase: " + SPAN_DANGER(syndicate_code_phrase)) + to_chat(player.current, "Code Response: " + SPAN_DANGER(syndicate_code_response)) player.StoreMemory("Code Phrase: [syndicate_code_phrase]", /decl/memory_options/system) player.StoreMemory("Code Response: [syndicate_code_response]", /decl/memory_options/system) to_chat(player.current, "Use the code words, preferably in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") -/decl/special_role/traitor/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/traitor/equip_role(var/mob/living/human/player) . = ..() if(issilicon(player)) // this needs to be here because ..() returns false if the mob isn't human add_law_zero(player) if(isrobot(player)) var/mob/living/silicon/robot/R = player - R.SetLockdown(0) - R.emagged = 1 // Provides a traitor robot with its module's emag item + R.SetLockdown(FALSE) + R.emagged = TRUE // Provides a traitor robot with its module's emag item R.verbs |= /mob/living/silicon/robot/proc/ResetSecurityCodes . = TRUE else if(.) @@ -117,7 +117,7 @@ else return FALSE -/decl/special_role/traitor/proc/spawn_uplink(var/mob/living/carbon/human/traitor_mob) +/decl/special_role/traitor/proc/spawn_uplink(var/mob/living/human/traitor_mob) setup_uplink_source(traitor_mob, DEFAULT_TELECRYSTAL_AMOUNT) /decl/special_role/traitor/proc/add_law_zero(mob/living/silicon/ai/killer) diff --git a/mods/gamemodes/traitor/syndicatebeacon.dm b/mods/gamemodes/traitor/syndicatebeacon.dm new file mode 100644 index 00000000000..63ad135fb2c --- /dev/null +++ b/mods/gamemodes/traitor/syndicatebeacon.dm @@ -0,0 +1,80 @@ +// Beacon randomly spawns in space +// When a non-traitor (no special role in /mind) uses it, he is given the choice to become a traitor +// If he accepts there is a random chance he will be accepted, or rejected resulting in the beacon self-destructing. + +/obj/machinery/syndicate_beacon + name = "ominous beacon" + desc = "This looks suspicious..." + icon = 'icons/obj/items/syndibeacon.dmi' + icon_state = "syndbeacon" + + anchored = TRUE + density = TRUE + + var/temptext = "" + var/selfdestructing = 0 + var/charges = 1 + +/obj/machinery/syndicate_beacon/interface_interact(var/mob/user) + interact(user) + return TRUE + +/obj/machinery/syndicate_beacon/interact(var/mob/user) + user.set_machine(src) + var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
    Identity confirmed,
    " + if(ishuman(user) || isAI(user)) + var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) + if(traitors.is_antagonist(user)) + dat += "Operative record found. Greetings, Agent [user.name].
    " + else if(charges < 1) + dat += "Connection severed.
    " + else + var/decl/pronouns/pronouns = user.get_pronouns() + dat += "Identity not found in operative database. What can the Syndicate do for you today, [pronouns.honorific] [user.name]?
    " + if(!selfdestructing) + dat += "

    \"[pick("I want to switch teams.", "I want to work for you.", "Let me join you.", "I can be of use to you.", "You want me working for you, and here's why...", "Give me an objective.", "How's the 401k over at the Syndicate?")]\"
    " + dat += temptext + show_browser(user, dat, "window=syndbeacon") + onclose(user, "syndbeacon") + +/obj/machinery/syndicate_beacon/Topic(href, href_list) + if(..()) + return + if(href_list["betraitor"]) + if(charges < 1) + src.updateUsrDialog() + return + var/mob/M = locate(href_list["traitormob"]) + if(M.mind.assigned_special_role || jobban_isbanned(M, /decl/special_role/traitor)) + temptext = "We have no need for you at this time. Have a pleasant day.
    " + src.updateUsrDialog() + return + charges -= 1 + if(prob(50)) + temptext = "Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind." + src.updateUsrDialog() + addtimer(CALLBACK(src, PROC_REF(selfdestruct)), rand(5, 20) SECONDS) + return + if(ishuman(M)) + var/mob/living/human/N = M + to_chat(M, "You have joined the ranks of the Syndicate and become a traitor to the station!") + var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) + traitors.add_antagonist(N.mind) + log_and_message_admins("has accepted a traitor objective from a syndicate beacon.", M) + + + src.updateUsrDialog() + return + + +/obj/machinery/syndicate_beacon/proc/selfdestruct() + selfdestructing = 1 + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), src.loc, 1, rand(1, 3), rand(3, 8), 10) + +// Add the syndicate beacon to artifact finds. +/datum/artifact_find/New() + var/static/injected = FALSE + if(!injected) + potential_finds[/obj/machinery/syndicate_beacon] = 5 + injected = TRUE + ..() diff --git a/mods/mobs/borers/_borers.dme b/mods/mobs/borers/_borers.dme index 7f230fc9536..380c95f4e87 100644 --- a/mods/mobs/borers/_borers.dme +++ b/mods/mobs/borers/_borers.dme @@ -1,5 +1,10 @@ #ifndef CONTENT_PACK_BORERS #define CONTENT_PACK_BORERS + +#ifdef MODPACK_PSIONICS +#warn Psionics modpack loaded before Borers modpack, compatibility features will be missing. +#endif + // BEGIN_INCLUDE #include "borer.dm" #include "datum\antagonist.dm" diff --git a/mods/mobs/borers/datum/antagonist.dm b/mods/mobs/borers/datum/antagonist.dm index b8b0c7feb4d..c714ef8e1a1 100644 --- a/mods/mobs/borers/datum/antagonist.dm +++ b/mods/mobs/borers/datum/antagonist.dm @@ -23,7 +23,7 @@ spawn_announcement_delay = 5000 /decl/special_role/borer/get_extra_panel_options(var/datum/mind/player) - return "\[put in host\]" + return "\[put in host\]" /decl/special_role/borer/create_objectives(var/datum/mind/player) if(!..()) @@ -35,8 +35,8 @@ /decl/special_role/borer/place_mob(var/mob/living/mob) var/mob/living/simple_animal/borer/borer = mob if(istype(borer)) - var/mob/living/carbon/human/host - for(var/mob/living/carbon/human/H in SSmobs.mob_list) + var/mob/living/human/host + for(var/mob/living/human/H in SSmobs.mob_list) if(H.stat != DEAD && !H.has_brain_worms()) var/obj/item/organ/external/head = GET_EXTERNAL_ORGAN(H, BP_HEAD) if(head && !BP_IS_PROSTHETIC(head)) diff --git a/mods/mobs/borers/datum/symbiote.dm b/mods/mobs/borers/datum/symbiote.dm index 94b885087d1..a3bf2a070ba 100644 --- a/mods/mobs/borers/datum/symbiote.dm +++ b/mods/mobs/borers/datum/symbiote.dm @@ -56,10 +56,10 @@ var/global/list/symbiote_starting_points = list() to_chat(prefs.client.mob, SPAN_WARNING("You are not whitelisted for [check_whitelist] roles.")) . = FALSE -/datum/job/symbiote/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) +/datum/job/symbiote/handle_variant_join(var/mob/living/human/H, var/alt_title) var/mob/living/simple_animal/borer/symbiote/symbiote = new - var/mob/living/carbon/human/host + var/mob/living/human/host try // No clean way to handle kicking them back to the lobby at this point, so dump // them into xenobio or latejoin instead if there are zero viable hosts left. @@ -96,7 +96,7 @@ var/global/list/symbiote_starting_points = list() qdel(H) return symbiote -/datum/job/symbiote/equip_preview(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade, var/additional_skips) +/datum/job/symbiote/equip_preview(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade, var/additional_skips) if(!preview_slug) preview_slug = new H.appearance = preview_slug @@ -104,7 +104,7 @@ var/global/list/symbiote_starting_points = list() /datum/job/symbiote/proc/find_valid_hosts(var/just_checking) . = list() - for(var/mob/living/carbon/human/H in global.player_list) + for(var/mob/living/human/H in global.player_list) if(H.stat == DEAD || !H.client || !H.ckey || !H.has_brain()) continue var/obj/item/organ/external/head = GET_EXTERNAL_ORGAN(H, BP_HEAD) diff --git a/mods/mobs/borers/mob/borer/borer.dm b/mods/mobs/borers/mob/borer/borer.dm index 17cc7c1f155..529830e87a1 100644 --- a/mods/mobs/borers/mob/borer/borer.dm +++ b/mods/mobs/borers/mob/borer/borer.dm @@ -43,7 +43,7 @@ var/has_reproduced // Whether or not the borer has reproduced, for objective purposes. var/roundstart // Whether or not this borer has been mapped and should not look for a player initially. var/neutered // 'borer lite' mode - fewer powers, less hostile to the host. - var/mob/living/carbon/human/host // Human host for the brain worm. + var/mob/living/human/host // Human host for the brain worm. var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth. /obj/item/holder/borer @@ -87,12 +87,18 @@ /mob/living/simple_animal/borer/handle_disabilities() . = ..() - sdisabilities = 0 if(host) - if(host.sdisabilities & BLINDED) - sdisabilities |= BLINDED - if(host.sdisabilities & DEAFENED) - sdisabilities |= DEAFENED + if(host.has_genetic_condition(GENE_COND_BLINDED)) + add_genetic_condition(GENE_COND_BLINDED) + else + remove_genetic_condition(GENE_COND_BLINDED) + if(host.has_genetic_condition(GENE_COND_DEAFENED)) + add_genetic_condition(GENE_COND_DEAFENED) + else + remove_genetic_condition(GENE_COND_DEAFENED) + else + remove_genetic_condition(GENE_COND_BLINDED) + remove_genetic_condition(GENE_COND_DEAFENED) /mob/living/simple_animal/borer/handle_living_non_stasis_processes() . = ..() @@ -152,16 +158,16 @@ if(!host || !controlling) return if(ishuman(host)) - var/mob/living/carbon/human/H = host + var/mob/living/human/H = host var/obj/item/organ/external/head = GET_EXTERNAL_ORGAN(H, BP_HEAD) LAZYREMOVE(head.implants, src) controlling = FALSE host.remove_language(/decl/language/corticalborer) - host.verbs -= /mob/living/carbon/proc/release_control - host.verbs -= /mob/living/carbon/proc/punish_host - host.verbs -= /mob/living/carbon/proc/spawn_larvae + host.verbs -= /mob/living/proc/release_control + host.verbs -= /mob/living/proc/punish_host + host.verbs -= /mob/living/proc/spawn_larvae if(host_brain) diff --git a/mods/mobs/borers/mob/borer/borer_attacks.dm b/mods/mobs/borers/mob/borer/borer_attacks.dm index 138b2f34958..43358767a9e 100644 --- a/mods/mobs/borers/mob/borer/borer_attacks.dm +++ b/mods/mobs/borers/mob/borer/borer_attacks.dm @@ -21,7 +21,7 @@ return TRUE // end TODO - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, BP_HEAD) if(!E) to_chat(src, SPAN_WARNING("\The [H] does not have a head!")) diff --git a/mods/mobs/borers/mob/borer/borer_captive.dm b/mods/mobs/borers/mob/borer/borer_captive.dm index d998abd7943..83a75377f45 100644 --- a/mods/mobs/borers/mob/borer/borer_captive.dm +++ b/mods/mobs/borers/mob/borer/borer_captive.dm @@ -46,9 +46,9 @@ to_chat(H, "With an immense exertion of will, you regain control of your body!") to_chat(B.host, "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.") B.detach_from_host() - verbs -= /mob/living/carbon/proc/release_control - verbs -= /mob/living/carbon/proc/punish_host - verbs -= /mob/living/carbon/proc/spawn_larvae + verbs -= /mob/living/proc/release_control + verbs -= /mob/living/proc/punish_host + verbs -= /mob/living/proc/spawn_larvae return diff --git a/mods/mobs/borers/mob/borer/borer_hud.dm b/mods/mobs/borers/mob/borer/borer_hud.dm index 34251dbc644..8b9a155e5d4 100644 --- a/mods/mobs/borers/mob/borer/borer_hud.dm +++ b/mods/mobs/borers/mob/borer/borer_hud.dm @@ -110,9 +110,9 @@ if(!worm.host.lastKnownIP) worm.host.lastKnownIP = s2h_ip worm.controlling = TRUE - worm.host.verbs += /mob/living/carbon/proc/release_control - worm.host.verbs += /mob/living/carbon/proc/punish_host - worm.host.verbs += /mob/living/carbon/proc/spawn_larvae + worm.host.verbs += /mob/living/proc/release_control + worm.host.verbs += /mob/living/proc/punish_host + worm.host.verbs += /mob/living/proc/spawn_larvae return TRUE diff --git a/mods/mobs/borers/mob/borer/borer_powers.dm b/mods/mobs/borers/mob/borer/borer_powers.dm index 8c477ff8423..8d5df9158b6 100644 --- a/mods/mobs/borers/mob/borer/borer_powers.dm +++ b/mods/mobs/borers/mob/borer/borer_powers.dm @@ -34,7 +34,7 @@ // BRAIN WORM ZOMBIES AAAAH. /mob/living/simple_animal/borer/proc/replace_brain() - var/mob/living/carbon/human/H = host + var/mob/living/human/H = host if(!istype(host)) to_chat(src, SPAN_WARNING("This host does not have a suitable brain.")) @@ -45,11 +45,11 @@ H.add_language(/decl/language/corticalborer) if(host.stat == DEAD) - H.verbs |= /mob/living/carbon/human/proc/jumpstart + H.verbs |= /mob/living/human/proc/jumpstart - H.verbs |= /mob/living/carbon/human/proc/psychic_whisper + H.verbs |= /mob/living/human/proc/psychic_whisper if(!neutered) - H.verbs |= /mob/living/carbon/proc/spawn_larvae + H.verbs |= /mob/living/proc/spawn_larvae if(H.client) H.ghostize(0) @@ -58,7 +58,7 @@ src.mind.assigned_special_role = "Borer Husk" src.mind.transfer_to(host) - H.make_husked() + H.add_genetic_condition(GENE_COND_HUSK) var/obj/item/organ/internal/borer/B = new(H) if(islist(chemical_types)) @@ -76,7 +76,7 @@ if(!H.lastKnownIP) H.lastKnownIP = s2h_ip -/mob/living/carbon/human/proc/jumpstart() +/mob/living/human/proc/jumpstart() set category = "Abilities" set name = "Revive Host" set desc = "Send a jolt of electricity through your host, reviving them." @@ -85,7 +85,7 @@ to_chat(usr, SPAN_WARNING("Your host is already alive.")) return - verbs -= /mob/living/carbon/human/proc/jumpstart + verbs -= /mob/living/human/proc/jumpstart visible_message(SPAN_DANGER("With a hideous, rattling moan, [src] shudders back to life!")) rejuvenate() update_posture() diff --git a/mods/mobs/borers/mob/organ.dm b/mods/mobs/borers/mob/organ.dm index c8f9a3c34bd..c1f686ade98 100644 --- a/mods/mobs/borers/mob/organ.dm +++ b/mods/mobs/borers/mob/organ.dm @@ -18,7 +18,7 @@ // They're also super gross and ooze ichor. if(prob(5)) - var/mob/living/carbon/human/H = owner + var/mob/living/human/H = owner if(!istype(H)) return diff --git a/mods/mobs/borers/mob/overrides.dm b/mods/mobs/borers/mob/overrides.dm index 7f8577a9624..77c9a2c158e 100644 --- a/mods/mobs/borers/mob/overrides.dm +++ b/mods/mobs/borers/mob/overrides.dm @@ -15,7 +15,7 @@ borer.detach_from_host() borer.leave_host() -/mob/living/carbon/human/handle_hud_list() +/mob/living/human/handle_hud_list() var/last_hud_bitfield = hud_updateflag . = ..() if(stat != DEAD && has_brain_worms() && BITTEST(last_hud_bitfield, STATUS_HUD) && hud_list[STATUS_HUD] && hud_list[STATUS_HUD_OOC]) @@ -26,7 +26,7 @@ var/image/holder2 = hud_list[STATUS_HUD_OOC] holder2.icon_state = "hudbrainworm" -/mob/living/carbon/human/say_understands(mob/speaker, decl/language/speaking) +/mob/living/human/say_understands(mob/speaker, decl/language/speaking) return has_brain_worms() || ..() /obj/item/organ/internal/brain/do_uninstall(in_place, detach, ignore_children) @@ -47,7 +47,7 @@ if(B && B.controlling) B.detach_from_host() -/mob/living/carbon/human/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) +/mob/living/human/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) if((. = ..()) && !QDELETED(implant) && isborer(implant)) var/mob/living/simple_animal/borer/worm = implant if(worm.controlling) diff --git a/mods/mobs/borers/mob/powers.dm b/mods/mobs/borers/mob/powers.dm index e5eff917dc6..b561a72b1b0 100644 --- a/mods/mobs/borers/mob/powers.dm +++ b/mods/mobs/borers/mob/powers.dm @@ -1,5 +1,5 @@ //Brain slug proc for voluntary removal of control. -/mob/living/carbon/proc/release_control() +/mob/living/proc/release_control() set category = "Abilities" set name = "Release Control" @@ -12,15 +12,15 @@ B.detach_from_host() - verbs -= /mob/living/carbon/proc/release_control - verbs -= /mob/living/carbon/proc/punish_host - verbs -= /mob/living/carbon/proc/spawn_larvae + verbs -= /mob/living/proc/release_control + verbs -= /mob/living/proc/punish_host + verbs -= /mob/living/proc/spawn_larvae else to_chat(src, "ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !") //Brain slug proc for tormenting the host. -/mob/living/carbon/proc/punish_host() +/mob/living/proc/punish_host() set category = "Abilities" set name = "Torment host" set desc = "Punish your host with agony." @@ -38,7 +38,7 @@ else to_chat(B.host_brain, "Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!") -/mob/living/carbon/proc/spawn_larvae() +/mob/living/proc/spawn_larvae() set category = "Abilities" set name = "Reproduce" set desc = "Spawn several young." diff --git a/mods/species/ascent/_ascent.dme b/mods/species/ascent/_ascent.dme index a8bf66e1a9c..63d6f95300d 100644 --- a/mods/species/ascent/_ascent.dme +++ b/mods/species/ascent/_ascent.dme @@ -5,7 +5,6 @@ #include "datum\access.dm" #include "datum\ai_laws.dm" #include "datum\antagonist.dm" -#include "datum\aspects.dm" #include "datum\codex.dm" #include "datum\culture.dm" #include "datum\descriptors.dm" @@ -13,6 +12,7 @@ #include "datum\languages.dm" #include "datum\species.dm" #include "datum\species_bodytypes.dm" +#include "datum\traits.dm" #include "effects\razorweb.dm" #include "items\cell.dm" #include "items\clothing.dm" diff --git a/mods/species/ascent/datum/antagonist.dm b/mods/species/ascent/datum/antagonist.dm index caa5c48f1fd..3440b3e7d0a 100644 --- a/mods/species/ascent/datum/antagonist.dm +++ b/mods/species/ascent/datum/antagonist.dm @@ -17,10 +17,10 @@ /decl/special_role/hunter/update_antag_mob(var/datum/mind/player, var/preserve_appearance) . = ..() - var lineage = create_gyne_name(); + var/lineage = create_gyne_name() if(ishuman(player.current)) - var/mob/living/carbon/human/H = player.current - H.dna.lineage = lineage; // This makes all antag ascent have the same lineage on get_random_name. + var/mob/living/human/H = player.current + H.set_gyne_lineage(lineage) // This makes all antag ascent have the same lineage on get_random_name. if(!leader && is_species_whitelisted(player.current, SPECIES_MANTID_GYNE)) leader = player if(H.species.get_root_species_name() != SPECIES_MANTID_GYNE) @@ -34,7 +34,7 @@ H.real_name = ascent_culture.get_random_name(H, H.gender) H.name = H.real_name -/decl/special_role/hunter/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/hunter/equip_role(var/mob/living/human/player) if(player?.species.get_root_species_name(player) == SPECIES_MANTID_GYNE) rig_type = /obj/item/rig/mantid/gyne else @@ -43,7 +43,7 @@ if(.) player.put_in_hands(new /obj/item/gun/energy/particle) -/decl/special_role/hunter/equip_rig(rig_type, mob/living/carbon/human/player) +/decl/special_role/hunter/equip_rig(rig_type, mob/living/human/player) var/obj/item/rig/mantid/rig = ..() if(rig) rig.visible_name = player.real_name diff --git a/mods/species/ascent/datum/culture.dm b/mods/species/ascent/datum/culture.dm index f1061fd2058..ca56bfd6ba7 100644 --- a/mods/species/ascent/datum/culture.dm +++ b/mods/species/ascent/datum/culture.dm @@ -1,8 +1,18 @@ -/mob/living/carbon/proc/get_gyne_name() - return dna?.lineage || create_gyne_name() +var/global/list/gyne_lineage = list() +/mob/living/proc/get_gyne_name() + . = get_gyne_lineage() + if(!.) + . = create_gyne_name() + set_gyne_lineage(.) + +/mob/living/proc/get_gyne_lineage() + return global.gyne_lineage["\ref[src]"] + +/mob/living/proc/set_gyne_lineage(value) + global.gyne_lineage["\ref[src]"] = value /proc/create_gyne_name() - return "[capitalize(pick(global.gyne_architecture))] [capitalize(pick(global.gyne_geoforms))]" + . = "[capitalize(pick(global.gyne_architecture))] [capitalize(pick(global.gyne_geoforms))]" //Thanks to: // - https://en.wikipedia.org/wiki/List_of_landforms @@ -76,10 +86,10 @@ var/global/list/gyne_architecture = list( queens." /decl/cultural_info/culture/ascent/get_random_name(var/mob/M, var/gender) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/lineage = create_gyne_name() - if(istype(H) && H.dna.lineage) - lineage = H.dna.lineage + if(istype(H) && H.get_gyne_lineage()) + lineage = H.get_gyne_lineage() if(gender == MALE) return "[random_id(/decl/species/mantid, 10000, 99999)] [lineage]" else diff --git a/mods/species/ascent/datum/languages.dm b/mods/species/ascent/datum/languages.dm index 771602a9428..ca38c2909b6 100644 --- a/mods/species/ascent/datum/languages.dm +++ b/mods/species/ascent/datum/languages.dm @@ -23,7 +23,7 @@ if(S.isSynthetic()) return SPEECH_RESULT_GOOD if(ishuman(speaker)) - var/mob/living/carbon/human/H = speaker + var/mob/living/human/H = speaker if(H.species.name in correct_mouthbits) return SPEECH_RESULT_GOOD return SPEECH_RESULT_MUDDLED @@ -73,7 +73,7 @@ if(istype(speaker) && speaker.isSynthetic()) return TRUE else if(ishuman(speaker)) - var/mob/living/carbon/human/H = speaker + var/mob/living/human/H = speaker return (H.species.name == SPECIES_MANTID_ALATE || H.species.name == SPECIES_MANTID_GYNE) return FALSE @@ -89,9 +89,9 @@ shorthand = "KB" #define isascentdrone(X) istype(X, /mob/living/silicon/robot/flying/ascent) -/decl/language/mantid/worldnet/check_special_condition(var/mob/living/carbon/other) +/decl/language/mantid/worldnet/check_special_condition(var/mob/living/other) if(isascentdrone(other)) return TRUE - if(istype(other) && (locate(/obj/item/organ/internal/controller) in other.internal_organs)) + if(istype(other) && (locate(/obj/item/organ/internal/controller) in other.get_internal_organs())) return TRUE return FALSE diff --git a/mods/species/ascent/datum/species.dm b/mods/species/ascent/datum/species.dm index bc26bf8c81c..fe5e22006c5 100644 --- a/mods/species/ascent/datum/species.dm +++ b/mods/species/ascent/datum/species.dm @@ -88,10 +88,10 @@ list(/decl/emote/visible/ascent_flicker, /decl/emote/visible/ascent_glint) = 20, ) -/decl/species/mantid/handle_sleeping(var/mob/living/carbon/human/H) +/decl/species/mantid/handle_sleeping(var/mob/living/human/H) return -/decl/species/mantid/equip_survival_gear(var/mob/living/carbon/human/H, var/extendedtank = 1) +/decl/species/mantid/equip_survival_gear(var/mob/living/human/H, var/extendedtank = 1) return /decl/species/mantid/gyne diff --git a/mods/species/ascent/datum/aspects.dm b/mods/species/ascent/datum/traits.dm similarity index 66% rename from mods/species/ascent/datum/aspects.dm rename to mods/species/ascent/datum/traits.dm index c137edf90a1..2e8e36b2bb5 100644 --- a/mods/species/ascent/datum/aspects.dm +++ b/mods/species/ascent/datum/traits.dm @@ -1,11 +1,14 @@ -/decl/aspect/build_references() +/decl/trait/build_references() . = ..() LAZYINITLIST(blocked_species) blocked_species |= SPECIES_MANTID_ALATE blocked_species |= SPECIES_MANTID_GYNE blocked_species |= SPECIES_MANTID_NYMPH -/decl/aspect/ascent/build_references() +/decl/trait/ascent + abstract_type = /decl/trait/ascent + +/decl/trait/ascent/build_references() . = ..() blocked_species = null permitted_species = list( @@ -15,19 +18,19 @@ ) // Modifies the exosuit that you spawn with. -/decl/aspect/ascent/suit_upgrade +/decl/trait/ascent/suit_upgrade name = "Upgraded Support Systems" - desc = "Coming soon!" + description = "Coming soon!" category = "Suit Upgrades" // Physical modifications like extra organs or different resistances. -/decl/aspect/ascent/adaptation +/decl/trait/ascent/adaptation name = "Specialized Molt" - desc = "Coming soon!" + description = "Coming soon!" category = "Adaptations" // Behavioral compulsions enforced by AI -/decl/aspect/ascent/derangement +/decl/trait/ascent/derangement name = "Megalomania" - desc = "Coming soon!" + description = "Coming soon!" category = "Derangements" diff --git a/mods/species/ascent/effects/razorweb.dm b/mods/species/ascent/effects/razorweb.dm index 4d541268219..a3c692dce9c 100644 --- a/mods/species/ascent/effects/razorweb.dm +++ b/mods/species/ascent/effects/razorweb.dm @@ -128,7 +128,7 @@ if(!istype(L) || !L.simulated || L.current_posture.prone || (MOVING_DELIBERATELY(L) && prob(25)) || L.is_floating) return - var/mob/living/carbon/human/H + var/mob/living/human/H if(ishuman(L)) H = L if(species_immunity_list[H.species.name]) diff --git a/mods/species/ascent/items/clothing.dm b/mods/species/ascent/items/clothing.dm index 2a9ed081c57..2809314812f 100644 --- a/mods/species/ascent/items/clothing.dm +++ b/mods/species/ascent/items/clothing.dm @@ -1,7 +1,7 @@ /decl/hierarchy/outfit/job/ascent name = "Ascent - Gyne" mask = /obj/item/clothing/mask/gas/ascent - uniform = /obj/item/clothing/under/ascent + uniform = /obj/item/clothing/jumpsuit/ascent id_type = /obj/item/card/id/ascent shoes = /obj/item/clothing/shoes/magboots/ascent l_ear = null @@ -42,7 +42,7 @@ BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/magboots/boots_gyne.dmi' ) -/obj/item/clothing/under/ascent +/obj/item/clothing/jumpsuit/ascent name = "mantid undersuit" desc = "A ribbed, spongy undersuit of some sort. It has a big sleeve for a tail, so it probably isn't for humans." bodytype_equip_flags = BODY_FLAG_GYNE | BODY_FLAG_ALATE diff --git a/mods/species/ascent/items/id_control.dm b/mods/species/ascent/items/id_control.dm index 6b76ee444d3..ac465c63b3d 100644 --- a/mods/species/ascent/items/id_control.dm +++ b/mods/species/ascent/items/id_control.dm @@ -7,7 +7,7 @@ access = list(access_ascent) /obj/item/card/id/ascent/GetAccess() - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(istype(H) && !(H.species.name in ALL_ASCENT_SPECIES)) . = list() else @@ -38,7 +38,7 @@ organ_properties = ORGAN_PROP_PROSTHETIC var/obj/item/card/id/id_card = /obj/item/card/id/ascent -/obj/item/organ/internal/controller/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) +/obj/item/organ/internal/controller/do_install(mob/living/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) . = ..() if(detached || !owner) return @@ -51,7 +51,7 @@ if(owner) var/datum/extension/access_provider/owner_access = get_extension(owner, /datum/extension/access_provider) owner_access?.unregister_id(src) - var/mob/living/carbon/H = owner + var/mob/living/H = owner . = ..() if(H && !(locate(type) in H.get_internal_organs())) H.remove_language(/decl/language/mantid/worldnet) diff --git a/mods/species/ascent/machines/magnetotron.dm b/mods/species/ascent/machines/magnetotron.dm index d2e652be739..ef49173254c 100644 --- a/mods/species/ascent/machines/magnetotron.dm +++ b/mods/species/ascent/machines/magnetotron.dm @@ -19,7 +19,7 @@ if(!user.check_dexterity(DEXTERITY_COMPLEX_TOOLS, TRUE)) return ..() - var/mob/living/carbon/human/target = locate() in contents + var/mob/living/human/target = locate() in contents if(isnull(target)) display_message("No biological signature detected in [src].") return TRUE @@ -38,10 +38,10 @@ if(do_after(target, 10 SECONDS, src, TRUE)) // Convert to gyne successfully. - target.dna.lineage = create_gyne_name() - target.real_name = "[rand(1, 99)] [target.dna.lineage]" - target.name = target.real_name - target.dna.real_name = target.real_name + var/lineage = create_gyne_name() + target.set_gyne_lineage(lineage) + target.real_name = "[rand(1, 99)] [lineage]" + target.SetName(target.real_name) target.visible_message(SPAN_NOTICE("[target] molts away their shell, emerging as a new gyne.")) spark_at(src, cardinal_only = TRUE) @@ -58,7 +58,7 @@ /obj/machinery/ascent_magnetotron/proc/get_total_gynes() - for(var/mob/living/carbon/human/H in global.living_mob_list_) + for(var/mob/living/human/H in global.living_mob_list_) if(H.get_species_name() == SPECIES_MANTID_GYNE) . += 1 diff --git a/mods/species/ascent/machines/ship_machines.dm b/mods/species/ascent/machines/ship_machines.dm index e053026c1d2..84d848e7d14 100644 --- a/mods/species/ascent/machines/ship_machines.dm +++ b/mods/species/ascent/machines/ship_machines.dm @@ -163,7 +163,7 @@ MANTIDIFY(/obj/item/chems/chem_disp_cartridge, "canister", "chemical storage") if(!user.check_dexterity(DEXTERITY_COMPLEX_TOOLS, TRUE)) return ..() if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(!(H.species.name in ALL_ASCENT_SPECIES)) to_chat(H, SPAN_WARNING("You have no idea how to use \the [src].")) return TRUE diff --git a/mods/species/ascent/mobs/bodyparts_insectoid.dm b/mods/species/ascent/mobs/bodyparts_insectoid.dm index 794f7fdd042..1b88459a1f1 100644 --- a/mods/species/ascent/mobs/bodyparts_insectoid.dm +++ b/mods/species/ascent/mobs/bodyparts_insectoid.dm @@ -12,7 +12,7 @@ /obj/item/organ/internal/egg_sac/insectoid/attack_self(var/mob/user) . = ..() - var/mob/living/carbon/H = user + var/mob/living/H = user if(.) if(H.incapacitated()) to_chat(H, SPAN_WARNING("You can't produce eggs in your current state.")) @@ -24,7 +24,7 @@ H.adjust_nutrition(-1 * egg_metabolic_cost) H.visible_message(SPAN_NOTICE("\icon[H] [H] carelessly deposits an egg on \the [get_turf(src)].")) var/obj/structure/insectoid_egg/egg = new(get_turf(H)) // splorp - egg.lineage = H.dna.lineage + egg.lineage = H.get_gyne_lineage() /obj/item/organ/external/foot/insectoid/mantid name = "left tail tip" diff --git a/mods/species/ascent/mobs/nymph/nymph_life.dm b/mods/species/ascent/mobs/nymph/nymph_life.dm index 9db72d54bba..4c217a9aee0 100644 --- a/mods/species/ascent/mobs/nymph/nymph_life.dm +++ b/mods/species/ascent/mobs/nymph/nymph_life.dm @@ -65,8 +65,8 @@ nymph.visible_message("\icon[nymph] [nymph] begins to shimmy and shake out of its old skin.") if(molt == 5) if(do_after(nymph, 10 SECONDS, nymph, FALSE)) - var/mob/living/carbon/human/H = new(get_turf(usr), SPECIES_MANTID_ALATE) - H.dna.lineage = nymph.dna.lineage + var/mob/living/human/H = new(get_turf(usr), SPECIES_MANTID_ALATE) + H.set_gyne_lineage(nymph.get_gyne_lineage()) H.real_name = "[random_id(/decl/species/mantid, 10000, 99999)] [H.get_gyne_name()]" H.nutrition = nymph.nutrition * 0.25 // Homgry after molt. nymph.mind.transfer_to(H) diff --git a/mods/species/bayliens/_bayliens.dme b/mods/species/bayliens/_bayliens.dme index 1e053ec6723..e8de7a35d0b 100644 --- a/mods/species/bayliens/_bayliens.dme +++ b/mods/species/bayliens/_bayliens.dme @@ -1,5 +1,6 @@ #ifndef MODPACK_BAYLIENS #define MODPACK_BAYLIENS +// BEGIN_INCLUDE #include "bayliens.dm" #include "adherent\_adherent.dm" #include "adherent\datum\culture.dm" @@ -20,12 +21,14 @@ #include "skrell\datum\faction.dm" #include "skrell\datum\language.dm" #include "skrell\datum\location.dm" +#include "skrell\datum\pronouns_skrell.dm" #include "skrell\datum\religion.dm" #include "skrell\datum\skrell_meat.dm" -#include "skrell\datum\species_bodytype.dm" #include "skrell\datum\species.dm" -#include "skrell\datum\pronouns_skrell.dm" +#include "skrell\datum\species_bodytype.dm" +#include "skrell\gear\ammo.dm" #include "skrell\gear\clustertool.dm" +#include "skrell\gear\fabrication_designs.dm" #include "skrell\gear\gear.dm" #include "skrell\gear\gear_ears.dm" #include "skrell\gear\gear_head.dm" @@ -34,13 +37,11 @@ #include "skrell\gear\gear_suit.dm" #include "skrell\gear\gear_under.dm" #include "skrell\turfs\flooring.dm" -#include "skrell\gear\ammo.dm" -#include "skrell\gear\fabrication_designs.dm" #include "tajaran\_tajaran.dm" #include "tajaran\datum\accessory.dm" +#include "tajaran\datum\blood.dm" #include "tajaran\datum\culture.dm" #include "tajaran\datum\emotes.dm" -#include "tajaran\datum\blood.dm" #include "tajaran\datum\language.dm" #include "tajaran\datum\species.dm" #include "tajaran\datum\species_bodytypes.dm" @@ -57,4 +58,5 @@ #include "unathi\datum\species_bodytypes.dm" #include "unathi\datum\sprite_accessory.dm" #include "unathi\organs\organs_internal.dm" +// END_INCLUDE #endif diff --git a/mods/species/bayliens/adherent/_adherent.dm b/mods/species/bayliens/adherent/_adherent.dm index a5b9572567d..c2c7209f152 100644 --- a/mods/species/bayliens/adherent/_adherent.dm +++ b/mods/species/bayliens/adherent/_adherent.dm @@ -6,6 +6,6 @@ #define BP_JETS "maneuvering jets" #define BP_COOLING_FINS "cooling fins" -/mob/living/carbon/human/adherent/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/human/adherent/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) species_name = SPECIES_ADHERENT . = ..() \ No newline at end of file diff --git a/mods/species/bayliens/adherent/datum/species.dm b/mods/species/bayliens/adherent/datum/species.dm index e5e00121b0e..ac6feca11fd 100644 --- a/mods/species/bayliens/adherent/datum/species.dm +++ b/mods/species/bayliens/adherent/datum/species.dm @@ -73,7 +73,7 @@ max_players = 3 blood_volume = 0 -/decl/species/adherent/can_overcome_gravity(var/mob/living/carbon/human/H) +/decl/species/adherent/can_overcome_gravity(var/mob/living/human/H) . = FALSE if(H && H.stat == CONSCIOUS) for(var/obj/item/organ/internal/powered/float/float in H.get_internal_organs()) @@ -81,10 +81,10 @@ . = TRUE break -/decl/species/adherent/can_fall(var/mob/living/carbon/human/H) +/decl/species/adherent/can_fall(var/mob/living/human/H) . = !can_overcome_gravity(H) -/decl/species/adherent/handle_fall_special(var/mob/living/carbon/human/H, var/turf/landing) +/decl/species/adherent/handle_fall_special(var/mob/living/human/H, var/turf/landing) var/float_is_usable = FALSE if(H && H.stat == CONSCIOUS) for(var/obj/item/organ/internal/powered/float/float in H.get_internal_organs()) @@ -106,7 +106,7 @@ if(2000 to 8000) . = 4 else . = 8 -/decl/species/adherent/get_additional_examine_text(var/mob/living/carbon/human/H) +/decl/species/adherent/get_additional_examine_text(var/mob/living/human/H) if(can_overcome_gravity(H)) return "\nThey are floating on a cloud of shimmering distortion." /datum/hud_data/adherent diff --git a/mods/species/bayliens/bayliens.dm b/mods/species/bayliens/bayliens.dm index 52f6ab904b9..44d834bada9 100644 --- a/mods/species/bayliens/bayliens.dm +++ b/mods/species/bayliens/bayliens.dm @@ -1,7 +1,7 @@ /decl/modpack/bayliens name = "Baystation 12 Aliens" -/mob/living/carbon/human/Process_Spacemove(allow_movement) +/mob/living/human/Process_Spacemove(allow_movement) . = ..() if(.) return diff --git a/mods/species/bayliens/skrell/_skrell.dm b/mods/species/bayliens/skrell/_skrell.dm index e88acf72a7b..b2ad3f9286b 100644 --- a/mods/species/bayliens/skrell/_skrell.dm +++ b/mods/species/bayliens/skrell/_skrell.dm @@ -1,5 +1,5 @@ #define SPECIES_SKRELL "Skrell" -/mob/living/carbon/human/skrell/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/human/skrell/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) species_name = SPECIES_SKRELL . = ..() \ No newline at end of file diff --git a/mods/species/bayliens/skrell/datum/species.dm b/mods/species/bayliens/skrell/datum/species.dm index f7b2b6a366d..fe3299e4ce7 100644 --- a/mods/species/bayliens/skrell/datum/species.dm +++ b/mods/species/bayliens/skrell/datum/species.dm @@ -105,13 +105,13 @@ /decl/emote/exertion/synthetic/creak ) -/decl/species/skrell/fluid_act(var/mob/living/carbon/human/H, var/datum/reagents/fluids) +/decl/species/skrell/fluid_act(var/mob/living/human/H, var/datum/reagents/fluids) . = ..() var/water = REAGENT_VOLUME(fluids, /decl/material/liquid/water) if(water >= 40 && H.hydration < 400) //skrell passively absorb water. H.hydration += 1 -/decl/species/skrell/handle_trail(mob/living/carbon/human/H, turf/T, old_loc) +/decl/species/skrell/handle_trail(mob/living/human/H, turf/T, old_loc) var/obj/item/shoes = H.get_equipped_item(slot_shoes_str) if(!shoes) var/list/bloodDNA diff --git a/mods/species/bayliens/skrell/gear/gear_under.dm b/mods/species/bayliens/skrell/gear/gear_under.dm index 264818d157e..e2ee16307dc 100644 --- a/mods/species/bayliens/skrell/gear/gear_under.dm +++ b/mods/species/bayliens/skrell/gear/gear_under.dm @@ -1,4 +1,4 @@ -/obj/item/clothing/under/skrell +/obj/item/clothing/jumpsuit/skrell name = "black bodysuit" desc = "A sleek, skin-tight bodysuit designed to not wick moisture away from the body. The inner stitching appears to contain something written in Skrellian." icon = 'mods/species/bayliens/skrell/icons/clothing/under/skrell_uniform.dmi' diff --git a/mods/species/bayliens/tajaran/_tajaran.dm b/mods/species/bayliens/tajaran/_tajaran.dm index 6024c4bca0d..de2c8d585af 100644 --- a/mods/species/bayliens/tajaran/_tajaran.dm +++ b/mods/species/bayliens/tajaran/_tajaran.dm @@ -8,5 +8,5 @@ if(bodytype_equip_flags & BODY_FLAG_EXCLUDE) bodytype_equip_flags |= BODY_FLAG_FELINE -/mob/living/carbon/human/tajaran/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/human/tajaran/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) . = ..(species_name = SPECIES_TAJARA) diff --git a/mods/species/bayliens/tajaran/datum/species.dm b/mods/species/bayliens/tajaran/datum/species.dm index 4f64fceccba..891622d3bee 100644 --- a/mods/species/bayliens/tajaran/datum/species.dm +++ b/mods/species/bayliens/tajaran/datum/species.dm @@ -79,5 +79,5 @@ autohiss_exempt = list(LANGUAGE_TAJARA) -/decl/species/tajaran/handle_additional_hair_loss(var/mob/living/carbon/human/H, var/defer_body_update = TRUE) +/decl/species/tajaran/handle_additional_hair_loss(var/mob/living/human/H, var/defer_body_update = TRUE) . = H?.set_skin_colour(rgb(189, 171, 143)) diff --git a/mods/species/bayliens/tajaran/datum/species_bodytypes.dm b/mods/species/bayliens/tajaran/datum/species_bodytypes.dm index 3fb3ccf827d..547e80fa422 100644 --- a/mods/species/bayliens/tajaran/datum/species_bodytypes.dm +++ b/mods/species/bayliens/tajaran/datum/species_bodytypes.dm @@ -6,6 +6,7 @@ icon_base = 'mods/species/bayliens/tajaran/icons/body.dmi' icon_deformed = 'mods/species/bayliens/tajaran/icons/deformed_body.dmi' bandages_icon = 'icons/mob/bandage.dmi' + skeletal_icon = 'mods/species/bayliens/tajaran/icons/skeleton.dmi' cosmetics_icon = 'mods/species/bayliens/tajaran/icons/cosmetics.dmi' health_hud_intensity = 1.75 bodytype_flag = BODY_FLAG_FELINE diff --git a/mods/species/bayliens/tajaran/icons/skeleton.dmi b/mods/species/bayliens/tajaran/icons/skeleton.dmi new file mode 100644 index 00000000000..286b75d741f Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/skeleton.dmi differ diff --git a/mods/species/bayliens/unathi/_lizard.dm b/mods/species/bayliens/unathi/_lizard.dm index fdbd758e8af..5983bdc1c2a 100644 --- a/mods/species/bayliens/unathi/_lizard.dm +++ b/mods/species/bayliens/unathi/_lizard.dm @@ -1,6 +1,6 @@ #define SPECIES_LIZARD "Unathi" #define LANGUAGE_LIZARD "Sinta'unathi" -/mob/living/carbon/human/lizard/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/human/lizard/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) species_name = SPECIES_LIZARD . = ..() diff --git a/mods/species/bayliens/unathi/datum/species.dm b/mods/species/bayliens/unathi/datum/species.dm index f3c6f181ed4..49cf8b27d85 100644 --- a/mods/species/bayliens/unathi/datum/species.dm +++ b/mods/species/bayliens/unathi/datum/species.dm @@ -107,6 +107,6 @@ LAZYDISTINCTADD(available_cultural_info[TAG_CULTURE], /decl/cultural_info/culture/lizard) LAZYSET(default_cultural_info, TAG_CULTURE, /decl/cultural_info/culture/lizard) -/decl/species/unathi/equip_survival_gear(var/mob/living/carbon/human/H) +/decl/species/unathi/equip_survival_gear(var/mob/living/human/H) ..() H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes_str) diff --git a/mods/species/drakes/_drakes.dm b/mods/species/drakes/_drakes.dm index c4b32d00b78..47bf61c6a40 100644 --- a/mods/species/drakes/_drakes.dm +++ b/mods/species/drakes/_drakes.dm @@ -6,7 +6,7 @@ /decl/modpack/grafadreka name = "Grafadreka Species" -/mob/living/carbon/human/grafadreka/Initialize(mapload) +/mob/living/human/grafadreka/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) // fantasy modpack overrides drake name, so can't use the #define var/decl/species/grafadreka/drakes = GET_DECL(/decl/species/grafadreka) . = ..(mapload, drakes.name) diff --git a/mods/species/drakes/_drakes.dme b/mods/species/drakes/_drakes.dme index b57243c273b..44fa41725be 100644 --- a/mods/species/drakes/_drakes.dme +++ b/mods/species/drakes/_drakes.dme @@ -9,9 +9,9 @@ #include "_drakes.dm" #include "clothing.dm" #include "culture.dm" +#include "drake_abilities.dm" #include "drake_abilities_friendly.dm" #include "drake_abilities_hostile.dm" -#include "drake_abilities.dm" #include "drake_attacks.dm" #include "drake_emotes.dm" #include "drake_modifiers.dm" diff --git a/mods/species/drakes/drake_abilities_friendly.dm b/mods/species/drakes/drake_abilities_friendly.dm index a412874b9fd..6a674d7d48e 100644 --- a/mods/species/drakes/drake_abilities_friendly.dm +++ b/mods/species/drakes/drake_abilities_friendly.dm @@ -21,7 +21,7 @@ var/global/list/_wounds_being_tended_by_drakes = list() if(length(friend.get_external_organs())) var/list/injured_organs = friend.get_injured_organs() if(length(injured_organs)) - var/mob/living/carbon/human/H = friend + var/mob/living/human/H = friend for (var/obj/item/organ/external/E in H.bad_external_organs) if(!length(E.wounds)) continue @@ -100,6 +100,6 @@ var/global/list/_wounds_being_tended_by_drakes = list() W.salve() W.disinfect() // Everyone else is just poisoned. - else if(!friend.HasTrait(/decl/trait/sivian_biochemistry)) + else if(!friend.has_trait(/decl/trait/sivian_biochemistry)) friend.take_damage(rand(1,2), TOX) return TRUE diff --git a/mods/species/drakes/drake_attacks.dm b/mods/species/drakes/drake_attacks.dm index 916000c7e70..df214d9fc54 100644 --- a/mods/species/drakes/drake_attacks.dm +++ b/mods/species/drakes/drake_attacks.dm @@ -1,5 +1,5 @@ /proc/drake_infect_wounds(var/obj/item/organ/external/bitten) - if(bitten.owner?.HasTrait(/decl/trait/sivian_biochemistry)) + if(bitten.owner?.has_trait(/decl/trait/sivian_biochemistry)) return var/list/open_wounds = list() for(var/datum/wound/wound in bitten?.wounds) diff --git a/mods/species/drakes/drake_emotes.dm b/mods/species/drakes/drake_emotes.dm index fc2c8befe28..14af84c05cf 100644 --- a/mods/species/drakes/drake_emotes.dm +++ b/mods/species/drakes/drake_emotes.dm @@ -19,7 +19,7 @@ /decl/emote/audible/drake_warble key = "dwarble" - emote_message_3p = "warbles happily." + emote_message_3p = "$USER$ warbles happily." /decl/emote/audible/drake_purr key = "dpurr" diff --git a/mods/species/drakes/drake_modifiers.dm b/mods/species/drakes/drake_modifiers.dm index 1afd9e0cdc0..a540b0f0c3b 100644 --- a/mods/species/drakes/drake_modifiers.dm +++ b/mods/species/drakes/drake_modifiers.dm @@ -27,7 +27,7 @@ user.remove_aura(src) return 0 - if(!user.HasTrait(/decl/trait/sivian_biochemistry)) + if(!user.has_trait(/decl/trait/sivian_biochemistry)) user.heal_damage(BRUTE, 1, do_update_health = FALSE) user.heal_damage(BURN, 1, do_update_health = TRUE) return 1 diff --git a/mods/species/drakes/drake_organs.dm b/mods/species/drakes/drake_organs.dm index 16343179eaf..a42a3578cb4 100644 --- a/mods/species/drakes/drake_organs.dm +++ b/mods/species/drakes/drake_organs.dm @@ -22,7 +22,7 @@ if(owner && owner.stat != DEAD && !is_broken() && sap_crop && sap_crop.total_volume < 10) sap_crop.add_reagent(/decl/material/liquid/sifsap, 0.5) -/obj/item/organ/internal/drake_gizzard/do_install(var/mob/living/carbon/human/target, var/obj/item/organ/external/affected, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE) +/obj/item/organ/internal/drake_gizzard/do_install(var/mob/living/human/target, var/obj/item/organ/external/affected, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE) . = ..() if(owner) LAZYDISTINCTADD(owner.stat_organs, src) diff --git a/mods/species/drakes/drake_spit.dm b/mods/species/drakes/drake_spit.dm index e1e3178d085..d35efda2c01 100644 --- a/mods/species/drakes/drake_spit.dm +++ b/mods/species/drakes/drake_spit.dm @@ -15,7 +15,7 @@ /obj/item/projectile/drake_spit/on_hit(atom/target, blocked, def_zone) // Stun is needed to effectively hunt simplemobs, but it's OP against humans. if(ishuman(target)) - var/mob/living/carbon/human/victim = target + var/mob/living/human/victim = target SET_STATUS_MAX(victim, STAT_CONFUSE, max(stun, weaken)) stun = 0 weaken = 0 diff --git a/mods/species/drakes/icons/skeleton.dmi b/mods/species/drakes/icons/skeleton.dmi new file mode 100644 index 00000000000..074776b10d6 Binary files /dev/null and b/mods/species/drakes/icons/skeleton.dmi differ diff --git a/mods/species/drakes/sifsap.dm b/mods/species/drakes/sifsap.dm index fc8c95a5a8b..fef95882bdc 100644 --- a/mods/species/drakes/sifsap.dm +++ b/mods/species/drakes/sifsap.dm @@ -31,20 +31,20 @@ color = "#c6e2ff" /decl/material/liquid/sifsap/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) - if(M.HasTrait(/decl/trait/sivian_biochemistry)) + if(M.has_trait(/decl/trait/sivian_biochemistry)) if(!drake_add_sap(M, removed)) M.adjust_nutrition(toxicity * removed) return return affect_blood(M, removed * 0.7) /decl/material/liquid/sifsap/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) - if(M.HasTrait(/decl/trait/sivian_biochemistry)) + if(M.has_trait(/decl/trait/sivian_biochemistry)) return M.add_chemical_effect(CE_PULSE, -1) return ..() /decl/material/liquid/sifsap/affect_overdose(mob/living/M, total_dose) - if(M.HasTrait(/decl/trait/sivian_biochemistry)) + if(M.has_trait(/decl/trait/sivian_biochemistry)) return M.apply_damage(1, IRRADIATE) SET_STATUS_MAX(M, 5, STAT_DROWSY) diff --git a/mods/species/drakes/species.dm b/mods/species/drakes/species.dm index e37b7c89253..2c086848f82 100644 --- a/mods/species/drakes/species.dm +++ b/mods/species/drakes/species.dm @@ -36,12 +36,16 @@ ) species_hud = /datum/hud_data/grafadreka inherent_verbs = list( - /mob/living/carbon/human/proc/drake_sit + /mob/living/human/proc/drake_sit ) traits = list( /decl/trait/sivian_biochemistry = TRAIT_LEVEL_EXISTS ) + + // Drakes must be whitelisted for jobs to be able to join as them, see maps.dm. job_blacklist_by_default = TRUE + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED + var/list/adult_pain_emotes_with_pain_level = list( list(/decl/emote/audible/drake_huff, /decl/emote/audible/drake_rattle) = 20 ) @@ -50,18 +54,18 @@ ) // TODO: move pain onto a behavior datum or bodytype. -/decl/species/grafadreka/get_pain_emote(var/mob/living/carbon/human/H, var/pain_power) +/decl/species/grafadreka/get_pain_emote(var/mob/living/human/H, var/pain_power) if(H?.get_bodytype()?.type == /decl/bodytype/quadruped/grafadreka/hatchling) pain_emotes_with_pain_level = hatchling_pain_emotes_with_pain_level else pain_emotes_with_pain_level = adult_pain_emotes_with_pain_level return ..() -/decl/species/grafadreka/get_surgery_overlay_icon(var/mob/living/carbon/human/H) +/decl/species/grafadreka/get_surgery_overlay_icon(var/mob/living/human/H) return null // todo: 'mods/species/drakes/icons/surgery.dmi' // Stub for muscle memory of the Sit verb on Polaris. -/mob/living/carbon/human/proc/drake_sit() +/mob/living/human/proc/drake_sit() set name = "Sit" set category = "IC" set src = usr diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index 11affa222bb..6d0364df0ad 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -2,12 +2,12 @@ chargen_min_index = 2 chargen_max_index = 6 standalone_value_descriptors = list( - "a hatchling" = 1, - "an juvenile" = 2, - "an adolescent" = 4, - "an adult" = 6, - "aging" = 20, - "elderly" = 30 + "a hatchling" = 1, + "a juvenile" = 2, + "an adolescent" = 4, + "an adult" = 6, + "aging" = 20, + "elderly" = 30 ) /datum/appearance_descriptor/age/grafadreka/hatchling @@ -27,6 +27,7 @@ blood_overlays = 'mods/species/drakes/icons/blood.dmi' eye_icon = 'mods/species/drakes/icons/eyes.dmi' icon_template = 'mods/species/drakes/icons/template.dmi' + skeletal_icon = 'mods/species/drakes/icons/skeleton.dmi' bodytype_category = BODYTYPE_GRAFADREKA eye_blend = ICON_MULTIPLY limb_blend = ICON_MULTIPLY diff --git a/mods/species/neoavians/_neoavians.dme b/mods/species/neoavians/_neoavians.dme index 79444adfede..e7c8d526399 100644 --- a/mods/species/neoavians/_neoavians.dme +++ b/mods/species/neoavians/_neoavians.dme @@ -1,11 +1,13 @@ #ifndef CONTENT_PACK_NEOAVIANS #define CONTENT_PACK_NEOAVIANS +// BEGIN_INCLUDE #include "_neoavians.dm" #include "clothing.dm" -#include "machinery/suit_cycler.dm" -#include "datum/language.dm" -#include "datum/loadout.dm" -#include "datum/species.dm" -#include "datum/accessory.dm" -#include "datum/species_bodytypes.dm" +#include "datum\accessory.dm" +#include "datum\language.dm" +#include "datum\loadout.dm" +#include "datum\species.dm" +#include "datum\species_bodytypes.dm" +#include "machinery\suit_cycler.dm" +// END_INCLUDE #endif diff --git a/mods/species/neoavians/datum/species.dm b/mods/species/neoavians/datum/species.dm index 75213895171..1497e975a08 100644 --- a/mods/species/neoavians/datum/species.dm +++ b/mods/species/neoavians/datum/species.dm @@ -64,12 +64,12 @@ ) ) -/decl/species/neoavian/equip_default_fallback_uniform(var/mob/living/carbon/human/H) +/decl/species/neoavian/equip_default_fallback_uniform(var/mob/living/human/H) if(istype(H)) H.equip_to_slot_or_del(new /obj/item/clothing/dress/avian_smock/worker, slot_w_uniform_str) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/avian, slot_shoes_str) -/decl/species/neoavian/get_holder_color(var/mob/living/carbon/human/H) +/decl/species/neoavian/get_holder_color(var/mob/living/human/H) return H.get_skin_colour() /decl/hierarchy/outfit/job/generic/assistant/avian diff --git a/mods/species/neoavians/datum/species_bodytypes.dm b/mods/species/neoavians/datum/species_bodytypes.dm index 96cd84238b4..c2e65cbad4b 100644 --- a/mods/species/neoavians/datum/species_bodytypes.dm +++ b/mods/species/neoavians/datum/species_bodytypes.dm @@ -3,6 +3,7 @@ bodytype_category = BODYTYPE_AVIAN icon_base = 'mods/species/neoavians/icons/body.dmi' blood_overlays = 'mods/species/neoavians/icons/blood_avian.dmi' + skeletal_icon = 'mods/species/neoavians/icons/skeleton.dmi' limb_blend = ICON_MULTIPLY bodytype_flag = BODY_FLAG_AVIAN eye_icon = 'mods/species/neoavians/icons/eyes.dmi' diff --git a/mods/species/neoavians/icons/skeleton.dmi b/mods/species/neoavians/icons/skeleton.dmi new file mode 100644 index 00000000000..7691879bda9 Binary files /dev/null and b/mods/species/neoavians/icons/skeleton.dmi differ diff --git a/mods/species/serpentid/datum/species.dm b/mods/species/serpentid/datum/species.dm index cb406fbf8d5..84956801e62 100644 --- a/mods/species/serpentid/datum/species.dm +++ b/mods/species/serpentid/datum/species.dm @@ -74,7 +74,7 @@ ) var/list/skin_overlays = list() -/decl/species/serpentid/can_overcome_gravity(var/mob/living/carbon/human/H) +/decl/species/serpentid/can_overcome_gravity(var/mob/living/human/H) var/datum/gas_mixture/mixture = H.loc.return_air() if(mixture) @@ -87,12 +87,12 @@ return FALSE -/decl/species/serpentid/handle_environment_special(var/mob/living/carbon/human/H) +/decl/species/serpentid/handle_environment_special(var/mob/living/human/H) if(!H.on_fire && H.fire_stacks < 2) H.fire_stacks += 0.2 return -/decl/species/serpentid/can_fall(var/mob/living/carbon/human/H) +/decl/species/serpentid/can_fall(var/mob/living/human/H) var/datum/gas_mixture/mixture = H.loc.return_air() var/turf/T = GetBelow(H.loc) for(var/obj/O in T) @@ -104,7 +104,7 @@ return FALSE return TRUE -/decl/species/serpentid/handle_fall_special(var/mob/living/carbon/human/H, var/turf/landing) +/decl/species/serpentid/handle_fall_special(var/mob/living/human/H, var/turf/landing) var/datum/gas_mixture/mixture = H.loc.return_air() var/turf/T = GetBelow(H.loc) @@ -124,13 +124,13 @@ return FALSE -/decl/species/serpentid/can_shred(var/mob/living/carbon/human/H, var/ignore_intent, var/ignore_antag) +/decl/species/serpentid/can_shred(var/mob/living/human/H, var/ignore_intent, var/ignore_antag) if(!H.get_equipped_item(slot_handcuffed_str) || H.buckled) return ..(H, ignore_intent, TRUE) else return 0 -/decl/species/serpentid/handle_movement_delay_special(var/mob/living/carbon/human/H) +/decl/species/serpentid/handle_movement_delay_special(var/mob/living/human/H) var/tally = 0 H.remove_cloaking_source(src) @@ -142,7 +142,7 @@ return tally // todo: make this on bodytype -/decl/species/serpentid/update_skin(var/mob/living/carbon/human/H) +/decl/species/serpentid/update_skin(var/mob/living/human/H) if(H.stat) H.skin_state = SKIN_NORMAL @@ -178,7 +178,7 @@ return(threat_image) -/decl/species/serpentid/disarm_attackhand(var/mob/living/carbon/human/attacker, var/mob/living/carbon/human/target) +/decl/species/serpentid/disarm_attackhand(var/mob/living/human/attacker, var/mob/living/human/target) if(attacker.pulling_punches || target.current_posture.prone || attacker == target) return ..(attacker, target) if(world.time < attacker.last_attack + 20) diff --git a/mods/species/serpentid/mobs/bodyparts_serpentid.dm b/mods/species/serpentid/mobs/bodyparts_serpentid.dm index d4b34376a04..aadf48f1d72 100644 --- a/mods/species/serpentid/mobs/bodyparts_serpentid.dm +++ b/mods/species/serpentid/mobs/bodyparts_serpentid.dm @@ -41,12 +41,12 @@ /obj/item/organ/internal/eyes/serpentid/Initialize() . = ..() - if(dna) - color = rgb(dna.GetUIValue(DNA_UI_EYES_R), dna.GetUIValue(DNA_UI_EYES_G), dna.GetUIValue(DNA_UI_EYES_B)) + if(owner) + color = owner.get_eye_colour() -/obj/item/organ/internal/eyes/insectoid/serpentid/set_dna(var/datum/dna/new_dna) +/obj/item/organ/internal/eyes/insectoid/serpentid/copy_from_mob_snapshot(datum/mob_snapshot/supplied_appearance) . = ..() - color = rgb(new_dna.GetUIValue(DNA_UI_EYES_R), new_dna.GetUIValue(DNA_UI_EYES_G), new_dna.GetUIValue(DNA_UI_EYES_B)) + color = supplied_appearance?.eye_color /obj/item/organ/internal/liver/insectoid/serpentid name = "toxin filter" @@ -67,7 +67,7 @@ to_chat(owner, "You feel air rushing through your trachea!") /obj/item/organ/internal/lungs/insectoid/serpentid/handle_failed_breath() - var/mob/living/carbon/human/H = owner + var/mob/living/human/H = owner var/oxygenated = GET_CHEMICAL_EFFECT(owner, CE_OXYGENATED) H.heal_damage(OXY, HUMAN_MAX_OXYLOSS * oxygenated) @@ -148,7 +148,7 @@ playsound(owner.loc, 'sound/effects/angrybug.ogg', 60, 0) owner.skin_state = SKIN_THREAT owner.update_skin() - addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living/carbon/human, reset_skin)), 10 SECONDS, TIMER_UNIQUE) + addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living/human, reset_skin)), 10 SECONDS, TIMER_UNIQUE) else if(owner.skin_state == SKIN_THREAT) owner.reset_skin() diff --git a/mods/species/utility_frames/_utility_frames.dme b/mods/species/utility_frames/_utility_frames.dme index 728a6e05d86..23ba8ed7d85 100644 --- a/mods/species/utility_frames/_utility_frames.dme +++ b/mods/species/utility_frames/_utility_frames.dme @@ -1,9 +1,11 @@ #ifndef MODPACK_UTILITY_FRAMES #define MODPACK_UTILITY_FRAMES -#include "../../content/shackles/_shackles.dme" +#include "..\..\content\shackles\_shackles.dme" +// BEGIN_INCLUDE #include "_utility_frames.dm" +#include "markings.dm" #include "species.dm" #include "species_bodytypes.dm" -#include "markings.dm" -#include "aspects.dm" +#include "traits.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/species/utility_frames/species.dm b/mods/species/utility_frames/species.dm index 5222b9a72d5..c1a17fb7a9a 100644 --- a/mods/species/utility_frames/species.dm +++ b/mods/species/utility_frames/species.dm @@ -53,5 +53,5 @@ /obj/item/organ/external/head/utility_frame glowing_eyes = TRUE -/decl/species/utility_frame/disfigure_msg(var/mob/living/carbon/human/H) +/decl/species/utility_frame/disfigure_msg(var/mob/living/human/H) . = SPAN_DANGER("The faceplate is dented and cracked!\n") diff --git a/mods/species/utility_frames/aspects.dm b/mods/species/utility_frames/traits.dm similarity index 55% rename from mods/species/utility_frames/aspects.dm rename to mods/species/utility_frames/traits.dm index f0a6309287a..66fc29e15ef 100644 --- a/mods/species/utility_frames/aspects.dm +++ b/mods/species/utility_frames/traits.dm @@ -1,26 +1,29 @@ -/decl/aspect/build_references() +/decl/trait/build_references() . = ..() LAZYDISTINCTADD(blocked_species, SPECIES_FRAME) -/decl/aspect/utility_frame/build_references() +/decl/trait/utility_frame + abstract_type = /decl/trait/utility_frame + +/decl/trait/utility_frame/build_references() . = ..() blocked_species = null permitted_species = list(SPECIES_FRAME) // Cosmetic/armour changes, different models of limb -/decl/aspect/utility_frame/customisation +/decl/trait/utility_frame/customisation name = "Heavy Frame" - desc = "Coming soon!" + description = "Coming soon!" category = "Frame Customisation" // Additional augments, organs, better armour, robomodules -/decl/aspect/utility_frame/upgrade +/decl/trait/utility_frame/upgrade name = "Upgraded Widget" - desc = "Coming soon!" + description = "Coming soon!" category = "Upgrades" // Various maluses -/decl/aspect/utility_frame/fault +/decl/trait/utility_frame/fault name = "Faulty Widget" - desc = "Coming soon!" + description = "Coming soon!" category = "Faults" diff --git a/mods/species/vox/_vox.dm b/mods/species/vox/_vox.dm index f4671758ba0..f62ceb3dace 100644 --- a/mods/species/vox/_vox.dm +++ b/mods/species/vox/_vox.dm @@ -10,7 +10,7 @@ credits_crew_names = list("THE VOX") credits_topics = list("VOX RITUAL DUELS", "NECK MARKINGS", "ANCIENT SUPERCOMPUTERS") -/mob/living/carbon/human/vox/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/human/vox/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) SET_HAIR_STYLE(src, /decl/sprite_accessory/hair/vox/short, TRUE) SET_HAIR_COLOUR(src, COLOR_BEASTY_BROWN, TRUE) species_name = SPECIES_VOX diff --git a/mods/species/vox/_vox.dme b/mods/species/vox/_vox.dme index a81b459f720..0819c87c80a 100644 --- a/mods/species/vox/_vox.dme +++ b/mods/species/vox/_vox.dme @@ -1,31 +1,34 @@ #ifndef MODPACK_VOX #define MODPACK_VOX +// BEGIN_INCLUDE #include "_vox.dm" #include "mobs_vox.dm" #include "organs_vox.dm" -#include "datum/accessories.dm" -#include "datum/antagonism.dm" -#include "datum/aspects.dm" -#include "datum/cultures_vox.dm" -#include "datum/descriptors_vox.dm" -#include "datum/factions_vox.dm" -#include "datum/language.dm" -#include "datum/locations_vox.dm" -#include "datum/religions_vox.dm" -#include "datum/robolimbs.dm" -#include "datum/species.dm" -#include "datum/species_bodytypes.dm" -#include "datum/trader.dm" -#include "datum/unit_testing.dm" -#include "gear/gear.dm" -#include "gear/gear_gloves.dm" -#include "gear/gear_head.dm" -#include "gear/gear_mask.dm" -#include "gear/gear_rig.dm" -#include "gear/gear_shoes.dm" -#include "gear/gear_suit.dm" -#include "gear/gear_under.dm" -#include "gear/gun.dm" -#include "gear/gun_slugsling.dm" -#include "gear/gun_spikethrower.dm" +#include "datum\accessories.dm" +#include "datum\antagonism.dm" +#include "datum\cultures_vox.dm" +#include "datum\descriptors_vox.dm" +#include "datum\factions_vox.dm" +#include "datum\heist_compatibility.dm" +#include "datum\language.dm" +#include "datum\locations_vox.dm" +#include "datum\religions_vox.dm" +#include "datum\robolimbs.dm" +#include "datum\species.dm" +#include "datum\species_bodytypes.dm" +#include "datum\trader.dm" +#include "datum\traits.dm" +#include "datum\unit_testing.dm" +#include "gear\gear.dm" +#include "gear\gear_gloves.dm" +#include "gear\gear_head.dm" +#include "gear\gear_mask.dm" +#include "gear\gear_rig.dm" +#include "gear\gear_shoes.dm" +#include "gear\gear_suit.dm" +#include "gear\gear_under.dm" +#include "gear\gun.dm" +#include "gear\gun_slugsling.dm" +#include "gear\gun_spikethrower.dm" +// END_INCLUDE #endif diff --git a/mods/species/vox/datum/antagonism.dm b/mods/species/vox/datum/antagonism.dm index 1fd685dbea2..4b8c182ee3a 100644 --- a/mods/species/vox/datum/antagonism.dm +++ b/mods/species/vox/datum/antagonism.dm @@ -1,66 +1,4 @@ -/decl/special_role/raider/Initialize() - . = ..() - LAZYSET(outfits_per_species, SPECIES_VOX, /decl/hierarchy/outfit/vox_raider) - -/decl/hierarchy/outfit/vox_raider - name = "Job - Vox Raider" - l_ear = /obj/item/radio/headset/raider - shoes = /obj/item/clothing/shoes/magboots/vox - gloves = /obj/item/clothing/gloves/vox - mask = /obj/item/clothing/mask/gas/swat/vox - back = /obj/item/tank/nitrogen - uniform = /obj/item/clothing/suit/robe/vox - glasses = /obj/item/clothing/glasses/thermal - holster = /obj/item/clothing/webbing/holster/armpit - suit_store = /obj/item/flashlight - hands = list(/obj/item/gun/launcher/alien/spikethrower) - id_type = /obj/item/card/id/syndicate - -/decl/hierarchy/outfit/vox_raider/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) - uniform = pick(/obj/item/clothing/suit/robe/vox, /obj/item/clothing/pants/vox) - glasses = pick(/obj/item/clothing/glasses/thermal, /obj/item/clothing/glasses/thermal/plain/eyepatch, /obj/item/clothing/glasses/thermal/plain/monocle) - holster = pick(/obj/item/clothing/webbing/holster/armpit, /obj/item/clothing/webbing/holster/waist, /obj/item/clothing/webbing/holster/hip) - . = ..() - H.set_internals(locate(/obj/item/tank) in H.contents) - -// The following mirror is ~special~. -/obj/structure/mirror/raider - name = "cracked mirror" - desc = "Something seems strange about this old, dirty mirror. Your reflection doesn't look like you remember it." - icon_state = "mirror_broke" - shattered = TRUE - -/obj/structure/mirror/raider/attack_hand(mob/user) - if(!istype(get_area(src), /area/map_template/syndicate_mothership)) - return ..() - - var/decl/species/my_species = user?.get_species() - var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) - if(!istype(user) || !user.mind || !user.mind.assigned_special_role != raiders || !my_species || my_species.name == SPECIES_VOX || !is_alien_whitelisted(user, SPECIES_VOX)) - return ..() - - var/choice = input("Do you wish to become a vox of the Shoal? This is not reversible.") as null|anything in list("No","Yes") - if(choice != "Yes") - return ..() - - var/decl/hierarchy/outfit/outfit = GET_DECL(/decl/hierarchy/outfit/vox_raider) - var/mob/living/carbon/human/vox/vox = new(get_turf(src), SPECIES_VOX) - outfit.equip_outfit(vox) - if(user.mind) - user.mind.transfer_to(vox) - qdel(user) - addtimer(CALLBACK(src, PROC_REF(do_post_voxifying), vox), 1) - -/obj/structure/mirror/raider/proc/do_post_voxifying(var/mob/living/carbon/human/vox) - var/newname = sanitize_safe(input(vox,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN) - if(!newname || newname == "") - var/decl/cultural_info/voxculture = GET_DECL(/decl/cultural_info/culture/vox/raider) - newname = voxculture.get_random_name() - vox.real_name = newname - vox.SetName(vox.real_name) - var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) - raiders.update_access(vox) - +// Wizard /obj/item/magic_rock/Initialize(ml, material_key) LAZYSET(potentials, SPECIES_VOX, /spell/targeted/shapeshift/true_form) . = ..() diff --git a/mods/species/vox/datum/heist_compatibility.dm b/mods/species/vox/datum/heist_compatibility.dm new file mode 100644 index 00000000000..315aeda06f2 --- /dev/null +++ b/mods/species/vox/datum/heist_compatibility.dm @@ -0,0 +1,64 @@ +#ifdef GAMEMODE_PACK_HEIST +/decl/special_role/raider/Initialize() + . = ..() + LAZYSET(outfits_per_species, SPECIES_VOX, /decl/hierarchy/outfit/vox_raider) + +/decl/hierarchy/outfit/vox_raider + name = "Job - Vox Raider" + l_ear = /obj/item/radio/headset/raider + shoes = /obj/item/clothing/shoes/magboots/vox + gloves = /obj/item/clothing/gloves/vox + mask = /obj/item/clothing/mask/gas/swat/vox + back = /obj/item/tank/nitrogen + uniform = /obj/item/clothing/suit/robe/vox + glasses = /obj/item/clothing/glasses/thermal + holster = /obj/item/clothing/webbing/holster/armpit + suit_store = /obj/item/flashlight + hands = list(/obj/item/gun/launcher/alien/spikethrower) + id_type = /obj/item/card/id/syndicate + +/decl/hierarchy/outfit/vox_raider/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) + uniform = pick(/obj/item/clothing/suit/robe/vox, /obj/item/clothing/pants/vox) + glasses = pick(/obj/item/clothing/glasses/thermal, /obj/item/clothing/glasses/thermal/plain/eyepatch, /obj/item/clothing/glasses/thermal/plain/monocle) + holster = pick(/obj/item/clothing/webbing/holster/armpit, /obj/item/clothing/webbing/holster/waist, /obj/item/clothing/webbing/holster/hip) + . = ..() + H.set_internals(locate(/obj/item/tank) in H.contents) + +// The following mirror is ~special~. +/obj/structure/mirror/raider + name = "cracked mirror" + desc = "Something seems strange about this old, dirty mirror. Your reflection doesn't look like you remember it." + icon_state = "mirror_broke" + shattered = TRUE + +/obj/structure/mirror/raider/attack_hand(mob/user) + if(!istype(get_area(src), /area/map_template/syndicate_mothership)) + return ..() + + var/decl/species/my_species = user?.get_species() + var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) + if(!istype(user) || !user.mind || !user.mind.assigned_special_role != raiders || !my_species || my_species.name == SPECIES_VOX || !is_alien_whitelisted(user, SPECIES_VOX)) + return ..() + + var/choice = input("Do you wish to become a vox of the Shoal? This is not reversible.") as null|anything in list("No","Yes") + if(choice != "Yes") + return ..() + + var/decl/hierarchy/outfit/outfit = GET_DECL(/decl/hierarchy/outfit/vox_raider) + var/mob/living/human/vox/vox = new(get_turf(src), SPECIES_VOX) + outfit.equip_outfit(vox) + if(user.mind) + user.mind.transfer_to(vox) + qdel(user) + addtimer(CALLBACK(src, PROC_REF(do_post_voxifying), vox), 1) + +/obj/structure/mirror/raider/proc/do_post_voxifying(var/mob/living/human/vox) + var/newname = sanitize_safe(input(vox,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN) + if(!newname || newname == "") + var/decl/cultural_info/voxculture = GET_DECL(/decl/cultural_info/culture/vox/raider) + newname = voxculture.get_random_name() + vox.real_name = newname + vox.SetName(vox.real_name) + var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) + raiders.update_access(vox) +#endif \ No newline at end of file diff --git a/mods/species/vox/datum/language.dm b/mods/species/vox/datum/language.dm index 3e6e6c61663..6441c66747c 100644 --- a/mods/species/vox/datum/language.dm +++ b/mods/species/vox/datum/language.dm @@ -15,7 +15,7 @@ /decl/language/vox/can_speak_special(var/mob/speaker) if(!ishuman(speaker)) return FALSE - var/mob/living/carbon/human/H = speaker + var/mob/living/human/H = speaker var/obj/item/organ/internal/tongue = GET_INTERNAL_ORGAN(H, BP_HINDTONGUE) if(!istype(tongue) || !tongue.is_usable()) to_chat(speaker, SPAN_WARNING("You are not capable of speaking [name]!")) diff --git a/mods/species/vox/datum/robolimbs.dm b/mods/species/vox/datum/robolimbs.dm index 9e77e25f2d8..fd69455a905 100644 --- a/mods/species/vox/datum/robolimbs.dm +++ b/mods/species/vox/datum/robolimbs.dm @@ -7,4 +7,4 @@ name = "Improvised" icon_base = 'mods/species/vox/icons/body/improvised_cyberlimbs.dmi' -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/vox, arkmade, 2) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/vox, arkmade, 2) diff --git a/mods/species/vox/datum/species.dm b/mods/species/vox/datum/species.dm index 6f09b5fb36b..e7bff524c86 100644 --- a/mods/species/vox/datum/species.dm +++ b/mods/species/vox/datum/species.dm @@ -29,7 +29,7 @@ ) inherent_verbs = list( - /mob/living/carbon/human/proc/toggle_vox_pressure_seal + /mob/living/human/proc/toggle_vox_pressure_seal ) unarmed_attacks = list( @@ -133,7 +133,7 @@ /decl/emote/exertion/synthetic/creak ) -/decl/species/vox/equip_survival_gear(var/mob/living/carbon/human/H) +/decl/species/vox/equip_survival_gear(var/mob/living/human/H) H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/vox(H), slot_wear_mask_str) var/obj/item/backpack/backpack = H.get_equipped_item(slot_back_str) if(istype(backpack)) @@ -150,14 +150,14 @@ // Ideally this would all be on bodytype, but pressure is handled per-mob currently. var/global/list/vox_current_pressure_toggle = list() -/decl/species/vox/disfigure_msg(var/mob/living/carbon/human/H) +/decl/species/vox/disfigure_msg(var/mob/living/human/H) var/decl/pronouns/G = H.get_pronouns() return SPAN_DANGER("[G.His] beak-segments are cracked and chipped beyond recognition!\n") /decl/species/vox/skills_from_age(age) . = 8 -/decl/species/vox/handle_death(var/mob/living/carbon/human/H) +/decl/species/vox/handle_death(var/mob/living/human/H) ..() var/obj/item/organ/internal/voxstack/stack = H.get_organ(BP_STACK, /obj/item/organ/internal/voxstack) if (stack) @@ -168,23 +168,23 @@ var/global/list/vox_current_pressure_toggle = list() emote_message_3p = "$USER$ SHRIEKS!" emote_sound = 'mods/species/vox/sounds/shriek1.ogg' -/decl/species/vox/get_warning_low_pressure(var/mob/living/carbon/human/H) +/decl/species/vox/get_warning_low_pressure(var/mob/living/human/H) if(H && global.vox_current_pressure_toggle["\ref[H]"]) return 50 return ..() -/decl/species/vox/get_hazard_low_pressure(var/mob/living/carbon/human/H) +/decl/species/vox/get_hazard_low_pressure(var/mob/living/human/H) if(H && global.vox_current_pressure_toggle["\ref[H]"]) return 0 return ..() -/mob/living/carbon/human/proc/toggle_vox_pressure_seal() +/mob/living/human/proc/toggle_vox_pressure_seal() set name = "Toggle Vox Pressure Seal" set category = "Abilities" set src = usr if(!istype(species, /decl/species/vox)) - verbs -= /mob/living/carbon/human/proc/toggle_vox_pressure_seal + verbs -= /mob/living/human/proc/toggle_vox_pressure_seal return if(incapacitated(INCAPACITATION_KNOCKOUT)) diff --git a/mods/species/vox/datum/species_bodytypes.dm b/mods/species/vox/datum/species_bodytypes.dm index 3ced904de96..4df2e25757c 100644 --- a/mods/species/vox/datum/species_bodytypes.dm +++ b/mods/species/vox/datum/species_bodytypes.dm @@ -70,7 +70,7 @@ ) return ..() -/decl/bodytype/vox/get_movement_slowdown(var/mob/living/carbon/human/H) +/decl/bodytype/vox/get_movement_slowdown(var/mob/living/human/H) if(H && global.vox_current_pressure_toggle["\ref[H]"]) return 1.5 return ..() diff --git a/mods/species/vox/datum/trader.dm b/mods/species/vox/datum/trader.dm index 7abecad3cce..6211285cb6a 100644 --- a/mods/species/vox/datum/trader.dm +++ b/mods/species/vox/datum/trader.dm @@ -68,7 +68,7 @@ /datum/trader/ship/vox/hail(var/mob/user) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species) switch(H.species.name) if(SPECIES_VOX) diff --git a/mods/species/vox/datum/aspects.dm b/mods/species/vox/datum/traits.dm similarity index 59% rename from mods/species/vox/datum/aspects.dm rename to mods/species/vox/datum/traits.dm index 7de37c45a09..337974e1d64 100644 --- a/mods/species/vox/datum/aspects.dm +++ b/mods/species/vox/datum/traits.dm @@ -1,20 +1,23 @@ -/decl/aspect/build_references() +/decl/trait/build_references() . = ..() LAZYDISTINCTADD(blocked_species, SPECIES_VOX) -/decl/aspect/vox/build_references() +/decl/trait/vox + abstract_type = /decl/trait/vox + +/decl/trait/vox/build_references() . = ..() blocked_species = null permitted_species = list(SPECIES_VOX) // Bonuses or maluses to skills/checks/actions. -/decl/aspect/vox/psyche +/decl/trait/vox/psyche name = "Apex-Edited" - desc = "Coming soon!" + description = "Coming soon!" category = "Psyche" // Perks for interacting with vox equipment. -/decl/aspect/vox/symbiosis +/decl/trait/vox/symbiosis name = "Self-Maintaining Equipment" - desc = "Coming soon!" + description = "Coming soon!" category = "Symbiosis" diff --git a/mods/species/vox/datum/unit_testing.dm b/mods/species/vox/datum/unit_testing.dm index d14706d07fe..1026f897cad 100644 --- a/mods/species/vox/datum/unit_testing.dm +++ b/mods/species/vox/datum/unit_testing.dm @@ -5,7 +5,7 @@ /datum/unit_test/mob_damage/vox name = "MOB: Vox damage check template" template = /datum/unit_test/mob_damage/vox - mob_type = /mob/living/carbon/human/vox + mob_type = /mob/living/human/vox /datum/unit_test/mob_damage/vox/brute name = "MOB: Vox Brute Damage Check" diff --git a/mods/species/vox/gear/gear_shoes.dm b/mods/species/vox/gear/gear_shoes.dm index aa8cb4a2db7..b3ad991e46f 100644 --- a/mods/species/vox/gear/gear_shoes.dm +++ b/mods/species/vox/gear/gear_shoes.dm @@ -14,7 +14,7 @@ else if(!ishuman(user)) return - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/obj/item/shoes = H.get_equipped_item(slot_shoes_str) if(shoes != src) to_chat(user, "You will have to put on the [src] before you can do that.") diff --git a/mods/species/vox/gear/gun.dm b/mods/species/vox/gear/gun.dm index 6d04b3118cc..f55e773b031 100644 --- a/mods/species/vox/gear/gun.dm +++ b/mods/species/vox/gear/gun.dm @@ -1,7 +1,7 @@ /datum/extension/voxform base_type = /datum/extension/voxform -/datum/extension/voxform/proc/check_held_user(var/mob/living/carbon/human/user, var/atom/movable/thing) +/datum/extension/voxform/proc/check_held_user(var/mob/living/human/user, var/atom/movable/thing) if(!istype(user)) return FALSE if(user.get_bodytype_category() != BODYTYPE_VOX && user.try_unequip(thing)) @@ -10,7 +10,7 @@ return FALSE return TRUE -/obj/item/gun/special_check(var/mob/living/carbon/human/user) +/obj/item/gun/special_check(var/mob/living/human/user) . = ..() if(!QDELETED(src) && src.loc == user && has_extension(src, /datum/extension/voxform)) var/datum/extension/voxform/voxform = get_extension(src, /datum/extension/voxform) diff --git a/mods/species/vox/mobs_vox.dm b/mods/species/vox/mobs_vox.dm index 843e4389a57..3951c19fdaa 100644 --- a/mods/species/vox/mobs_vox.dm +++ b/mods/species/vox/mobs_vox.dm @@ -1,2 +1,2 @@ -/mob/living/simple_animal/hostile/slug/check_friendly_species(var/mob/living/carbon/human/H) +/mob/living/simple_animal/hostile/slug/check_friendly_species(var/mob/living/human/H) return (istype(H) && H.get_bodytype_category() == BODYTYPE_VOX) || ..() diff --git a/mods/species/vox/organs_vox.dm b/mods/species/vox/organs_vox.dm index 88649192ecb..33230c896f8 100644 --- a/mods/species/vox/organs_vox.dm +++ b/mods/species/vox/organs_vox.dm @@ -164,9 +164,9 @@ var/datum/mind/backup var/prompting = FALSE // Are we waiting for a user prompt? -/obj/item/organ/internal/voxstack/Initialize(mapload, material_key, datum/dna/given_dna, decl/bodytype/new_bodytype) - var/decl/species/dna_species = given_dna && get_species_by_key(given_dna.species) - . = ..(mapload, material_key, given_dna, dna_species?.base_internal_prosthetics_model) +/obj/item/organ/internal/voxstack/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) + var/decl/species/dna_species = supplied_appearance && supplied_appearance.root_species + . = ..(mapload, material_key, supplied_appearance, dna_species?.base_internal_prosthetics_model) do_backup() /obj/item/organ/internal/voxstack/examine(mob/user) @@ -208,13 +208,13 @@ prompt_revive_callback(owner) return TRUE -/obj/item/organ/internal/voxstack/proc/prompt_revive_callback(var/mob/living/carbon/C) +/obj/item/organ/internal/voxstack/proc/prompt_revive_callback(var/mob/living/target) set waitfor = FALSE - if(C && !backup_inviable()) + if(istype(target) && !backup_inviable()) prompting = TRUE var/response = alert(find_dead_player(stored_ckey, 1), "Your neural backup has been placed into a new body. Do you wish to return to life as the mind of [backup.name]?", "Resleeving", "Yes", "No") prompting = FALSE - if(src && response == "Yes" && owner == C) + if(src && response == "Yes" && owner == target) overwrite() sleep(-1) do_backup() diff --git a/nano/templates/accounts_terminal.tmpl b/nano/templates/accounts_terminal.tmpl index ce3f41022b4..e425ed121d1 100644 --- a/nano/templates/accounts_terminal.tmpl +++ b/nano/templates/accounts_terminal.tmpl @@ -28,7 +28,7 @@

    Create Account

    - +
    diff --git a/nebula.dme b/nebula.dme index 34d62e6fe8e..1367e75e60e 100644 --- a/nebula.dme +++ b/nebula.dme @@ -28,7 +28,6 @@ #include "code\__defines\ao_misc.dm" #include "code\__defines\appearance.dm" #include "code\__defines\armor.dm" -#include "code\__defines\aspects.dm" #include "code\__defines\atmos.dm" #include "code\__defines\atmospherics.dm" #include "code\__defines\bodytype.dm" @@ -43,15 +42,14 @@ #include "code\__defines\damage.dm" #include "code\__defines\damage_organs.dm" #include "code\__defines\definition_helpers.dm" -#include "code\__defines\deity.dm" #include "code\__defines\directions.dm" -#include "code\__defines\dna.dm" #include "code\__defines\dview.dm" #include "code\__defines\feedback.dm" #include "code\__defines\fires.dm" #include "code\__defines\flags.dm" #include "code\__defines\fluids.dm" #include "code\__defines\gamemode.dm" +#include "code\__defines\genetics.dm" #include "code\__defines\guns.dm" #include "code\__defines\holomap.dm" #include "code\__defines\hud.dm" @@ -104,6 +102,7 @@ #include "code\__defines\time.dm" #include "code\__defines\tools.dm" #include "code\__defines\topic.dm" +#include "code\__defines\traits.dm" #include "code\__defines\turfs.dm" #include "code\__defines\unit_tests.dm" #include "code\__defines\webhooks.dm" @@ -177,7 +176,6 @@ #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\ai_hud.dm" #include "code\_onclick\hud\animal.dm" -#include "code\_onclick\hud\deity.dm" #include "code\_onclick\hud\fullscreen.dm" #include "code\_onclick\hud\global_hud.dm" #include "code\_onclick\hud\hud.dm" @@ -297,10 +295,10 @@ #include "code\controllers\subsystems\weather.dm" #include "code\controllers\subsystems\xenoarch.dm" #include "code\controllers\subsystems\zcopy.dm" -#include "code\controllers\subsystems\initialization\aspects.dm" #include "code\controllers\subsystems\initialization\character_info.dm" #include "code\controllers\subsystems\initialization\character_setup.dm" #include "code\controllers\subsystems\initialization\codex.dm" +#include "code\controllers\subsystems\initialization\codex_dump.dm" #include "code\controllers\subsystems\initialization\computer_networks.dm" #include "code\controllers\subsystems\initialization\customitems.dm" #include "code\controllers\subsystems\initialization\fabrication.dm" @@ -397,7 +395,6 @@ #include "code\datums\daycycle\time_of_day.dm" #include "code\datums\extensions\_defines.dm" #include "code\datums\extensions\access_provider.dm" -#include "code\datums\extensions\deity_be_near.dm" #include "code\datums\extensions\event_registration.dm" #include "code\datums\extensions\extensions.dm" #include "code\datums\extensions\fake_data.dm" @@ -470,6 +467,7 @@ #include "code\datums\extensions\storage\subtypes_structure.dm" #include "code\datums\extensions\storage\subtypes_tray.dm" #include "code\datums\extensions\storage\subtypes_wallet.dm" +#include "code\datums\genetics\genetic_conditions.dm" #include "code\datums\graph\graph.dm" #include "code\datums\graph\node.dm" #include "code\datums\helper_datums\dist_check.dm" @@ -641,12 +639,16 @@ #include "code\datums\trading\traders\ship.dm" #include "code\datums\trading\traders\unique.dm" #include "code\datums\trading\traders\weaponry.dm" +#include "code\datums\traits\_trait_categories.dm" +#include "code\datums\traits\_traits.dm" #include "code\datums\traits\metabolically_inert.dm" -#include "code\datums\traits\trait_levels.dm" -#include "code\datums\traits\traits.dm" -#include "code\datums\traits\maluses\allergies.dm" +#include "code\datums\traits\maluses\_malus.dm" +#include "code\datums\traits\maluses\amputations.dm" #include "code\datums\traits\maluses\animal_protein.dm" #include "code\datums\traits\maluses\ethanol.dm" +#include "code\datums\traits\maluses\vision.dm" +#include "code\datums\traits\prosthetics\prosthetic_limbs.dm" +#include "code\datums\traits\prosthetics\prosthetic_organs.dm" #include "code\datums\underwear\bottom.dm" #include "code\datums\underwear\socks.dm" #include "code\datums\underwear\top.dm" @@ -727,46 +729,20 @@ #include "code\game\antagonist\antagonist_print.dm" #include "code\game\antagonist\antagonist_update.dm" #include "code\game\antagonist\outsider\actors.dm" -#include "code\game\antagonist\outsider\deity.dm" #include "code\game\antagonist\outsider\ert.dm" #include "code\game\antagonist\outsider\mercenary.dm" -#include "code\game\antagonist\outsider\ninja.dm" #include "code\game\antagonist\outsider\wizard.dm" -#include "code\game\antagonist\station\cult_god.dm" -#include "code\game\antagonist\station\cultist.dm" -#include "code\game\antagonist\station\loyalist.dm" #include "code\game\antagonist\station\provocateur.dm" -#include "code\game\antagonist\station\renegade.dm" -#include "code\game\antagonist\station\revolutionary.dm" #include "code\game\antagonist\station\thrall.dm" -#include "code\game\antagonist\station\traitor.dm" #include "code\game\area\area_abstract.dm" #include "code\game\area\area_access.dm" #include "code\game\area\area_fishing.dm" #include "code\game\area\area_power.dm" #include "code\game\area\area_space.dm" #include "code\game\area\areas.dm" -#include "code\game\dna\dna2.dm" -#include "code\game\dna\dna2_domutcheck.dm" -#include "code\game\dna\dna2_helpers.dm" -#include "code\game\dna\genes\disabilities.dm" -#include "code\game\dna\genes\gene.dm" -#include "code\game\dna\genes\powers.dm" #include "code\game\gamemodes\game_mode.dm" #include "code\game\gamemodes\game_mode_latespawn.dm" -#include "code\game\gamemodes\setupgame.dm" #include "code\game\gamemodes\calamity\calamity.dm" -#include "code\game\gamemodes\cult\cult.dm" -#include "code\game\gamemodes\cult\cult_items.dm" -#include "code\game\gamemodes\cult\cult_structures.dm" -#include "code\game\gamemodes\cult\ghosts.dm" -#include "code\game\gamemodes\cult\hell_universe.dm" -#include "code\game\gamemodes\cult\narsie.dm" -#include "code\game\gamemodes\cult\ritual.dm" -#include "code\game\gamemodes\cult\runes.dm" -#include "code\game\gamemodes\cult\talisman.dm" -#include "code\game\gamemodes\cult\cultify\de-cultify.dm" -#include "code\game\gamemodes\cult\cultify\mob.dm" #include "code\game\gamemodes\endgame\endgame.dm" #include "code\game\gamemodes\endgame\ftl_jump\ftl_jump.dm" #include "code\game\gamemodes\endgame\nuclear_explosion\nuclear_explosion.dm" @@ -775,32 +751,12 @@ #include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" #include "code\game\gamemodes\events\power_failure.dm" #include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\godmode\god_altar.dm" -#include "code\game\gamemodes\godmode\god_pylon.dm" -#include "code\game\gamemodes\godmode\god_structures.dm" -#include "code\game\gamemodes\godmode\god_trap.dm" -#include "code\game\gamemodes\godmode\godmode.dm" -#include "code\game\gamemodes\godmode\form_items\narsie_items.dm" -#include "code\game\gamemodes\godmode\form_items\narsie_structures.dm" -#include "code\game\gamemodes\godmode\form_items\starlight_items.dm" -#include "code\game\gamemodes\godmode\form_items\starlight_mobs.dm" -#include "code\game\gamemodes\godmode\form_items\starlight_structures.dm" -#include "code\game\gamemodes\godmode\form_items\wizard_structures.dm" -#include "code\game\gamemodes\heist\heist.dm" -#include "code\game\gamemodes\meteor\meteor.dm" -#include "code\game\gamemodes\meteor\meteors.dm" -#include "code\game\gamemodes\mixed\crossfire.dm" -#include "code\game\gamemodes\mixed\siege.dm" -#include "code\game\gamemodes\mixed\spyvspy.dm" -#include "code\game\gamemodes\mixed\uprising.dm" -#include "code\game\gamemodes\ninja\ninja.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" #include "code\game\gamemodes\nuclear\pinpointer.dm" #include "code\game\gamemodes\objectives\_objective.dm" #include "code\game\gamemodes\objectives\objective_assassinate.dm" #include "code\game\gamemodes\objectives\objective_brig.dm" #include "code\game\gamemodes\objectives\objective_capture.dm" -#include "code\game\gamemodes\objectives\objective_cult.dm" #include "code\game\gamemodes\objectives\objective_debrain.dm" #include "code\game\gamemodes\objectives\objective_demote.dm" #include "code\game\gamemodes\objectives\objective_download.dm" @@ -812,9 +768,8 @@ #include "code\game\gamemodes\objectives\objective_protect.dm" #include "code\game\gamemodes\objectives\objective_rev.dm" #include "code\game\gamemodes\objectives\objective_steal.dm" -#include "code\game\gamemodes\revolution\revolution.dm" -#include "code\game\gamemodes\traitor\traitor.dm" #include "code\game\gamemodes\wizard\wizard.dm" +#include "code\game\gamemodes\wizard\wizard_props.dm" #include "code\game\gamemodes\wizard\servant_items\caretaker.dm" #include "code\game\gamemodes\wizard\servant_items\champion.dm" #include "code\game\gamemodes\wizard\servant_items\familiar.dm" @@ -871,6 +826,7 @@ #include "code\game\machinery\seed_extractor.dm" #include "code\game\machinery\self_destruct.dm" #include "code\game\machinery\self_destruct_storage.dm" +#include "code\game\machinery\singularitybeacon.dm" #include "code\game\machinery\Sleeper.dm" #include "code\game\machinery\slide_projector.dm" #include "code\game\machinery\spaceheater.dm" @@ -881,7 +837,6 @@ #include "code\game\machinery\suit_cycler_units.dm" #include "code\game\machinery\supply_display.dm" #include "code\game\machinery\supplybeacon.dm" -#include "code\game\machinery\syndicatebeacon.dm" #include "code\game\machinery\teleporter.dm" #include "code\game\machinery\turret_control.dm" #include "code\game\machinery\vending_deconstruction.dm" @@ -1036,6 +991,7 @@ #include "code\game\objects\effects\explosion_particles.dm" #include "code\game\objects\effects\fake_fire.dm" #include "code\game\objects\effects\force_portal.dm" +#include "code\game\objects\effects\gateway.dm" #include "code\game\objects\effects\gibspawner.dm" #include "code\game\objects\effects\item_pickup_ghost.dm" #include "code\game\objects\effects\landmarks.dm" @@ -1341,7 +1297,7 @@ #include "code\game\objects\items\weapons\melee\energy_axe.dm" #include "code\game\objects\items\weapons\melee\energy_cutlass.dm" #include "code\game\objects\items\weapons\melee\energy_machete.dm" -#include "code\game\objects\items\weapons\melee\energy_ninja.dm" +#include "code\game\objects\items\weapons\melee\energy_projected.dm" #include "code\game\objects\items\weapons\melee\energy_sword.dm" #include "code\game\objects\items\weapons\melee\misc.dm" #include "code\game\objects\items\weapons\storage\backpack.dm" @@ -1577,7 +1533,6 @@ #include "code\game\turfs\floors\subtypes\floor_carpet.dm" #include "code\game\turfs\floors\subtypes\floor_circuit.dm" #include "code\game\turfs\floors\subtypes\floor_concrete.dm" -#include "code\game\turfs\floors\subtypes\floor_cult.dm" #include "code\game\turfs\floors\subtypes\floor_misc.dm" #include "code\game\turfs\floors\subtypes\floor_path.dm" #include "code\game\turfs\floors\subtypes\floor_reinforced.dm" @@ -1725,12 +1680,6 @@ #include "code\modules\alarm\fire_alarm.dm" #include "code\modules\alarm\motion_alarm.dm" #include "code\modules\alarm\power_alarm.dm" -#include "code\modules\aspects\_aspects.dm" -#include "code\modules\aspects\aspects_amputations.dm" -#include "code\modules\aspects\aspects_handicaps.dm" -#include "code\modules\aspects\aspects_perks.dm" -#include "code\modules\aspects\aspects_prosthetic_limbs.dm" -#include "code\modules\aspects\aspects_prosthetic_organs.dm" #include "code\modules\assembly\assembly.dm" #include "code\modules\assembly\holder.dm" #include "code\modules\assembly\igniter.dm" @@ -1855,7 +1804,7 @@ #include "code\modules\client\preference_setup\controls\01_keybindings.dm" #include "code\modules\client\preference_setup\general\01_basic.dm" #include "code\modules\client\preference_setup\general\02_body.dm" -#include "code\modules\client\preference_setup\general\03_aspects.dm" +#include "code\modules\client\preference_setup\general\03_traits.dm" #include "code\modules\client\preference_setup\general\04_equipment.dm" #include "code\modules\client\preference_setup\general\05_flavor.dm" #include "code\modules\client\preference_setup\global\01_ui.dm" @@ -1916,7 +1865,9 @@ #include "code\modules\clothing\clothing_state\clothing_state_tucked.dm" #include "code\modules\clothing\clothing_state\clothing_state_untied.dm" #include "code\modules\clothing\costumes\_costume.dm" +#include "code\modules\clothing\costumes\centcomm.dm" #include "code\modules\clothing\costumes\misc.dm" +#include "code\modules\clothing\costumes\rank.dm" #include "code\modules\clothing\dresses\_dress.dm" #include "code\modules\clothing\dresses\gown.dm" #include "code\modules\clothing\dresses\job.dm" @@ -1962,8 +1913,8 @@ #include "code\modules\clothing\jumpsuits\_jumpsuit.dm" #include "code\modules\clothing\jumpsuits\color.dm" #include "code\modules\clothing\jumpsuits\job.dm" +#include "code\modules\clothing\jumpsuits\jumpskirt.dm" #include "code\modules\clothing\jumpsuits\misc.dm" -#include "code\modules\clothing\jumpsuits\role.dm" #include "code\modules\clothing\masks\_mask.dm" #include "code\modules\clothing\masks\boxing.dm" #include "code\modules\clothing\masks\breath.dm" @@ -2006,7 +1957,10 @@ #include "code\modules\clothing\shirts\pajamas.dm" #include "code\modules\clothing\shirts\polo.dm" #include "code\modules\clothing\shirts\scrubs.dm" +#include "code\modules\clothing\shirts\sweaters.dm" +#include "code\modules\clothing\shirts\syndicate.dm" #include "code\modules\clothing\shirts\toga.dm" +#include "code\modules\clothing\shirts\tshirt.dm" #include "code\modules\clothing\shirts\tunics.dm" #include "code\modules\clothing\shirts\ubac.dm" #include "code\modules\clothing\shoes\_shoes.dm" @@ -2033,8 +1987,8 @@ #include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" #include "code\modules\clothing\spacesuits\rig\modules\combat.dm" #include "code\modules\clothing\spacesuits\rig\modules\computer.dm" +#include "code\modules\clothing\spacesuits\rig\modules\infiltration.dm" #include "code\modules\clothing\spacesuits\rig\modules\modules.dm" -#include "code\modules\clothing\spacesuits\rig\modules\ninja.dm" #include "code\modules\clothing\spacesuits\rig\modules\utility.dm" #include "code\modules\clothing\spacesuits\rig\modules\vision.dm" #include "code\modules\clothing\spacesuits\rig\suits\combat.dm" @@ -2052,9 +2006,9 @@ #include "code\modules\clothing\suits\bio.dm" #include "code\modules\clothing\suits\cloaks.dm" #include "code\modules\clothing\suits\dashiki.dm" -#include "code\modules\clothing\suits\fated_mantle.dm" #include "code\modules\clothing\suits\jobs.dm" #include "code\modules\clothing\suits\labcoat.dm" +#include "code\modules\clothing\suits\mantle.dm" #include "code\modules\clothing\suits\miscellaneous.dm" #include "code\modules\clothing\suits\poncho.dm" #include "code\modules\clothing\suits\robes.dm" @@ -2085,15 +2039,6 @@ #include "code\modules\clothing\suits\jackets\track.dm" #include "code\modules\clothing\suits\jackets\waistcoat.dm" #include "code\modules\clothing\suits\jackets\wintercoat.dm" -#include "code\modules\clothing\under\_under.dm" -#include "code\modules\clothing\under\fated_robes.dm" -#include "code\modules\clothing\under\miscellaneous.dm" -#include "code\modules\clothing\under\monkey.dm" -#include "code\modules\clothing\under\syndicate.dm" -#include "code\modules\clothing\under\jobs\civilian.dm" -#include "code\modules\clothing\under\jobs\engineering.dm" -#include "code\modules\clothing\under\jobs\medsci.dm" -#include "code\modules\clothing\under\jobs\security.dm" #include "code\modules\clothing\underwear\base.dm" #include "code\modules\clothing\webbing\_webbing.dm" #include "code\modules\clothing\webbing\drop_pouches.dm" @@ -2754,10 +2699,12 @@ #include "code\modules\mob\mob_damage.dm" #include "code\modules\mob\mob_defines.dm" #include "code\modules\mob\mob_eating.dm" +#include "code\modules\mob\mob_genetics.dm" #include "code\modules\mob\mob_grabs.dm" #include "code\modules\mob\mob_helpers.dm" #include "code\modules\mob\mob_layering.dm" #include "code\modules\mob\mob_movement.dm" +#include "code\modules\mob\mob_snapshot.dm" #include "code\modules\mob\mob_status.dm" #include "code\modules\mob\mob_temperature.dm" #include "code\modules\mob\mob_transformation_simple.dm" @@ -2803,6 +2750,9 @@ #include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defines.dm" #include "code\modules\mob\living\living_dreams.dm" +#include "code\modules\mob\living\living_eating.dm" +#include "code\modules\mob\living\living_electrocution.dm" +#include "code\modules\mob\living\living_genetics.dm" #include "code\modules\mob\living\living_give.dm" #include "code\modules\mob\living\living_grabs.dm" #include "code\modules\mob\living\living_hallucinations.dm" @@ -2810,7 +2760,9 @@ #include "code\modules\mob\living\living_organs.dm" #include "code\modules\mob\living\living_powers.dm" #include "code\modules\mob\living\living_pulse.dm" +#include "code\modules\mob\living\living_resist.dm" #include "code\modules\mob\living\living_status.dm" +#include "code\modules\mob\living\living_taste.dm" #include "code\modules\mob\living\living_throw.dm" #include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\logout.dm" @@ -2829,89 +2781,40 @@ #include "code\modules\mob\living\brain\brain.dm" #include "code\modules\mob\living\brain\death.dm" #include "code\modules\mob\living\brain\say.dm" -#include "code\modules\mob\living\carbon\breathe.dm" -#include "code\modules\mob\living\carbon\carbon.dm" -#include "code\modules\mob\living\carbon\carbon_defense.dm" -#include "code\modules\mob\living\carbon\carbon_defines.dm" -#include "code\modules\mob\living\carbon\carbon_eating.dm" -#include "code\modules\mob\living\carbon\carbon_grabs.dm" -#include "code\modules\mob\living\carbon\carbon_organs.dm" -#include "code\modules\mob\living\carbon\carbon_powers.dm" -#include "code\modules\mob\living\carbon\damage_procs.dm" -#include "code\modules\mob\living\carbon\internals.dm" -#include "code\modules\mob\living\carbon\resist.dm" -#include "code\modules\mob\living\carbon\taste.dm" -#include "code\modules\mob\living\carbon\human\death.dm" -#include "code\modules\mob\living\carbon\human\examine.dm" -#include "code\modules\mob\living\carbon\human\human.dm" -#include "code\modules\mob\living\carbon\human\human_appearance.dm" -#include "code\modules\mob\living\carbon\human\human_appearance_head.dm" -#include "code\modules\mob\living\carbon\human\human_attackhand.dm" -#include "code\modules\mob\living\carbon\human\human_blood.dm" -#include "code\modules\mob\living\carbon\human\human_damage.dm" -#include "code\modules\mob\living\carbon\human\human_defense.dm" -#include "code\modules\mob\living\carbon\human\human_defines.dm" -#include "code\modules\mob\living\carbon\human\human_examine_decl.dm" -#include "code\modules\mob\living\carbon\human\human_grabs.dm" -#include "code\modules\mob\living\carbon\human\human_helpers.dm" -#include "code\modules\mob\living\carbon\human\human_maneuvers.dm" -#include "code\modules\mob\living\carbon\human\human_movement.dm" -#include "code\modules\mob\living\carbon\human\human_organs.dm" -#include "code\modules\mob\living\carbon\human\human_powers.dm" -#include "code\modules\mob\living\carbon\human\human_skin.dm" -#include "code\modules\mob\living\carbon\human\human_species.dm" -#include "code\modules\mob\living\carbon\human\human_verbs.dm" -#include "code\modules\mob\living\carbon\human\life.dm" -#include "code\modules\mob\living\carbon\human\login.dm" -#include "code\modules\mob\living\carbon\human\logout.dm" -#include "code\modules\mob\living\carbon\human\npcs.dm" -#include "code\modules\mob\living\carbon\human\obj_grabs.dm" -#include "code\modules\mob\living\carbon\human\say.dm" -#include "code\modules\mob\living\carbon\human\unarmed_attack.dm" -#include "code\modules\mob\living\carbon\human\update_icons.dm" -#include "code\modules\mob\living\carbon\human\whisper.dm" -#include "code\modules\mob\living\carbon\human\descriptors\_descriptors.dm" -#include "code\modules\mob\living\carbon\human\descriptors\descriptors_age.dm" -#include "code\modules\mob\living\carbon\human\descriptors\descriptors_generic.dm" -#include "code\modules\mob\living\deity\deity.dm" -#include "code\modules\mob\living\deity\deity_boons.dm" -#include "code\modules\mob\living\deity\deity_click.dm" -#include "code\modules\mob\living\deity\deity_items.dm" -#include "code\modules\mob\living\deity\deity_phenomena.dm" -#include "code\modules\mob\living\deity\deity_power.dm" -#include "code\modules\mob\living\deity\deity_pylon.dm" -#include "code\modules\mob\living\deity\deity_sources.dm" -#include "code\modules\mob\living\deity\deity_Stat.dm" -#include "code\modules\mob\living\deity\deity_topic.dm" -#include "code\modules\mob\living\deity\deity_tracking.dm" -#include "code\modules\mob\living\deity\forms.dm" -#include "code\modules\mob\living\deity\say.dm" -#include "code\modules\mob\living\deity\forms\narsie.dm" -#include "code\modules\mob\living\deity\forms\starlight.dm" -#include "code\modules\mob\living\deity\forms\tower.dm" -#include "code\modules\mob\living\deity\items\_defines.dm" -#include "code\modules\mob\living\deity\items\deity_item.dm" -#include "code\modules\mob\living\deity\items\general.dm" -#include "code\modules\mob\living\deity\items\generic.dm" -#include "code\modules\mob\living\deity\items\narsie\basic.dm" -#include "code\modules\mob\living\deity\items\narsie\minions.dm" -#include "code\modules\mob\living\deity\items\narsie\sacrificing.dm" -#include "code\modules\mob\living\deity\items\narsie\smithing.dm" -#include "code\modules\mob\living\deity\items\starlight\artifacts.dm" -#include "code\modules\mob\living\deity\items\starlight\phenomena.dm" -#include "code\modules\mob\living\deity\items\starlight\spells.dm" -#include "code\modules\mob\living\deity\items\tower\conjuration.dm" -#include "code\modules\mob\living\deity\items\tower\transmutation.dm" -#include "code\modules\mob\living\deity\menu\deity_nano.dm" -#include "code\modules\mob\living\deity\phenomena\_defines.dm" -#include "code\modules\mob\living\deity\phenomena\communication.dm" -#include "code\modules\mob\living\deity\phenomena\conjuration.dm" -#include "code\modules\mob\living\deity\phenomena\conversion.dm" -#include "code\modules\mob\living\deity\phenomena\generic.dm" -#include "code\modules\mob\living\deity\phenomena\narsie.dm" -#include "code\modules\mob\living\deity\phenomena\phenomena.dm" -#include "code\modules\mob\living\deity\phenomena\starlight.dm" -#include "code\modules\mob\living\deity\phenomena\transmutation.dm" +#include "code\modules\mob\living\human\death.dm" +#include "code\modules\mob\living\human\examine.dm" +#include "code\modules\mob\living\human\human.dm" +#include "code\modules\mob\living\human\human_appearance.dm" +#include "code\modules\mob\living\human\human_appearance_head.dm" +#include "code\modules\mob\living\human\human_attackhand.dm" +#include "code\modules\mob\living\human\human_blood.dm" +#include "code\modules\mob\living\human\human_damage.dm" +#include "code\modules\mob\living\human\human_defense.dm" +#include "code\modules\mob\living\human\human_defines.dm" +#include "code\modules\mob\living\human\human_examine_decl.dm" +#include "code\modules\mob\living\human\human_grabs.dm" +#include "code\modules\mob\living\human\human_helpers.dm" +#include "code\modules\mob\living\human\human_internals.dm" +#include "code\modules\mob\living\human\human_maneuvers.dm" +#include "code\modules\mob\living\human\human_movement.dm" +#include "code\modules\mob\living\human\human_organs.dm" +#include "code\modules\mob\living\human\human_powers.dm" +#include "code\modules\mob\living\human\human_resist.dm" +#include "code\modules\mob\living\human\human_skin.dm" +#include "code\modules\mob\living\human\human_species.dm" +#include "code\modules\mob\living\human\human_verbs.dm" +#include "code\modules\mob\living\human\life.dm" +#include "code\modules\mob\living\human\login.dm" +#include "code\modules\mob\living\human\logout.dm" +#include "code\modules\mob\living\human\npcs.dm" +#include "code\modules\mob\living\human\obj_grabs.dm" +#include "code\modules\mob\living\human\say.dm" +#include "code\modules\mob\living\human\unarmed_attack.dm" +#include "code\modules\mob\living\human\update_icons.dm" +#include "code\modules\mob\living\human\whisper.dm" +#include "code\modules\mob\living\human\descriptors\_descriptors.dm" +#include "code\modules\mob\living\human\descriptors\descriptors_age.dm" +#include "code\modules\mob\living\human\descriptors\descriptors_generic.dm" #include "code\modules\mob\living\maneuvers\_maneuver.dm" #include "code\modules\mob\living\maneuvers\maneuver_leap.dm" #include "code\modules\mob\living\silicon\death.dm" @@ -2987,7 +2890,6 @@ #include "code\modules\mob\living\silicon\robot\modules\module_standard.dm" #include "code\modules\mob\living\silicon\robot\modules\module_uncertified.dm" #include "code\modules\mob\living\simple_animal\natural_weapons.dm" -#include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\simple_animal_codex.dm" #include "code\modules\mob\living\simple_animal\simple_animal_combat.dm" @@ -2999,8 +2901,6 @@ #include "code\modules\mob\living\simple_animal\aquatic\aquatic_carp.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_fish.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_sharks.dm" -#include "code\modules\mob\living\simple_animal\constructs\constructs.dm" -#include "code\modules\mob\living\simple_animal\constructs\soulstone.dm" #include "code\modules\mob\living\simple_animal\crow\crow.dm" #include "code\modules\mob\living\simple_animal\familiars\familiars.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" @@ -3072,8 +2972,6 @@ #include "code\modules\mob\observer\eye\freelook\ai\chunk.dm" #include "code\modules\mob\observer\eye\freelook\ai\eye.dm" #include "code\modules\mob\observer\eye\freelook\ai\update_triggers.dm" -#include "code\modules\mob\observer\eye\freelook\cult\cultnet.dm" -#include "code\modules\mob\observer\eye\freelook\cult\mask.dm" #include "code\modules\mob\observer\ghost\follow.dm" #include "code\modules\mob\observer\ghost\ghost.dm" #include "code\modules\mob\observer\ghost\login.dm" @@ -3557,6 +3455,7 @@ #include "code\modules\reagents\Chemistry-Holder.dm" #include "code\modules\reagents\Chemistry-Machinery.dm" #include "code\modules\reagents\Chemistry-Metabolism.dm" +#include "code\modules\reagents\Chemistry-Taste.dm" #include "code\modules\reagents\cocktails.dm" #include "code\modules\reagents\reagent_container_edibility.dm" #include "code\modules\reagents\reagent_containers.dm" @@ -3754,7 +3653,6 @@ #include "code\modules\spells\aoe_turf\smoke.dm" #include "code\modules\spells\aoe_turf\summons.dm" #include "code\modules\spells\aoe_turf\conjure\conjure.dm" -#include "code\modules\spells\aoe_turf\conjure\construct.dm" #include "code\modules\spells\aoe_turf\conjure\druidic_spells.dm" #include "code\modules\spells\aoe_turf\conjure\faithful_hound.dm" #include "code\modules\spells\aoe_turf\conjure\force_portal.dm" @@ -3764,19 +3662,15 @@ #include "code\modules\spells\artifacts\storage.dm" #include "code\modules\spells\general\acid_spray.dm" #include "code\modules\spells\general\area_teleport.dm" +#include "code\modules\spells\general\camera_vision.dm" #include "code\modules\spells\general\contract_spells.dm" #include "code\modules\spells\general\create_air.dm" -#include "code\modules\spells\general\god_construct.dm" -#include "code\modules\spells\general\god_vision.dm" #include "code\modules\spells\general\invisibility.dm" #include "code\modules\spells\general\mark_recall.dm" -#include "code\modules\spells\general\open_gateway.dm" #include "code\modules\spells\general\portal_teleport.dm" #include "code\modules\spells\general\radiant_aura.dm" #include "code\modules\spells\general\return_master.dm" -#include "code\modules\spells\general\tear_veil.dm" #include "code\modules\spells\general\toggle_armor.dm" -#include "code\modules\spells\general\veil_of_shadows.dm" #include "code\modules\spells\hand\blood_shards.dm" #include "code\modules\spells\hand\burning_grip.dm" #include "code\modules\spells\hand\entangle.dm" @@ -3794,10 +3688,9 @@ #include "code\modules\spells\targeted\blood_boil.dm" #include "code\modules\spells\targeted\cleric_spells.dm" #include "code\modules\spells\targeted\ethereal_jaunt.dm" -#include "code\modules\spells\targeted\exhude_pleasantness.dm" +#include "code\modules\spells\targeted\exude_pleasantness.dm" #include "code\modules\spells\targeted\genetic.dm" #include "code\modules\spells\targeted\glimpse_of_eternity.dm" -#include "code\modules\spells\targeted\harvest.dm" #include "code\modules\spells\targeted\shapeshift.dm" #include "code\modules\spells\targeted\shatter_mind.dm" #include "code\modules\spells\targeted\shift.dm" @@ -3986,7 +3879,6 @@ #include "code\modules\xenoarcheaology\finds\find_types\_find_spawner.dm" #include "code\modules\xenoarcheaology\finds\find_types\chem_containers.dm" #include "code\modules\xenoarcheaology\finds\find_types\containers.dm" -#include "code\modules\xenoarcheaology\finds\find_types\cult.dm" #include "code\modules\xenoarcheaology\finds\find_types\fossils.dm" #include "code\modules\xenoarcheaology\finds\find_types\guns.dm" #include "code\modules\xenoarcheaology\finds\find_types\mask.dm" @@ -4030,7 +3922,6 @@ #include "code\unit_tests\_includes.dm" #include "code\unit_tests\alt_appearances_test.dm" #include "code\unit_tests\area_tests.dm" -#include "code\unit_tests\aspects.dm" #include "code\unit_tests\atmospherics_tests.dm" #include "code\unit_tests\cargo_tests.dm" #include "code\unit_tests\chemistry_tests.dm" @@ -4064,6 +3955,7 @@ #include "code\unit_tests\test_obj.dm" #include "code\unit_tests\time_tests.dm" #include "code\unit_tests\traders.dm" +#include "code\unit_tests\traits.dm" #include "code\unit_tests\turf_icons.dm" #include "code\unit_tests\unique_tests.dm" #include "code\unit_tests\unit_test.dm" @@ -4075,11 +3967,8 @@ #include "interface\interface.dm" #include "interface\skin.dmf" #include "maps\_map_include.dm" -#include "maps\antag_spawn\deity\deity.dm" #include "maps\antag_spawn\ert\ert.dm" -#include "maps\antag_spawn\heist\heist.dm" #include "maps\antag_spawn\mercenary\mercenary.dm" -#include "maps\antag_spawn\ninja\ninja.dm" #include "maps\antag_spawn\wizard\wizard.dm" #include "maps\away_sites_testing\away_sites_testing_define.dm" #include "maps\example\example_define.dm" @@ -4116,6 +4005,7 @@ #include "maps\~mapsystem\maps_areas.dm" #include "maps\~mapsystem\maps_comms.dm" #include "maps\~mapsystem\maps_currency.dm" +#include "maps\~mapsystem\maps_events.dm" #include "maps\~mapsystem\maps_jobs.dm" #include "maps\~mapsystem\maps_unit_testing.dm" #include "maps\~unit_tests\unit_testing.dm" diff --git a/test/run-test.sh b/test/run-test.sh index 85ac39d8b3d..a9907ae692c 100755 --- a/test/run-test.sh +++ b/test/run-test.sh @@ -212,6 +212,7 @@ function run_code_tests { run_test "check icon state limit (maps)" "python3 tools/check_icon_state_limit.py maps" run_test_ci "check changelog builds" "python3 tools/changelog/ss13_genchangelog.py html/changelog.html html/changelogs" run_test "check files included" "python3 tools/validate_dme.py < nebula.dme" + run_test "check modpack files included" "python3 tools/validate_modpacks.py" } function run_byond_tests { diff --git a/tools/map_migrations/4047_more_uniforms.txt b/tools/map_migrations/4047_more_uniforms.txt new file mode 100644 index 00000000000..19eb9109bc6 --- /dev/null +++ b/tools/map_migrations/4047_more_uniforms.txt @@ -0,0 +1,41 @@ +/obj/item/clothing/jumpsuit/psych/turtleneck/sweater/@SUBTYPES : /obj/item/clothing/shirt/sweater/@SUBTYPES{@OLD} +/obj/item/clothing/jumpsuit/psych/turtleneck/@SUBTYPES : /obj/item/clothing/shirt/sweater/turquoise, /obj/item/clothing/pants/slacks/navy/@SUBTYPES{@OLD} +/obj/item/clothing/jumpsuit/captain_fly/@SUBTYPES : /obj/item/clothing/costume/captain_fly/@SUBTYPES{@OLD} +/obj/item/clothing/jumpsuit/head_of_personnel_whimsy/@SUBTYPES : /obj/item/clothing/costume/head_of_personnel_whimsy/@SUBTYPES{@OLD} +/obj/item/clothing/pants/casual/mustangjeans/monke/@SUBTYPES : /obj/item/clothing/pants/casual/mustangjeans/@SUBTYPES{@OLD} +/obj/item/clothing/under/caretaker/@SUBTYPES : /obj/item/clothing/jumpsuit/caretaker/@SUBTYPES{@OLD} +/obj/item/clothing/under/mankini/@SUBTYPES : /obj/item/clothing/pants/mankini/@SUBTYPES{@OLD} +/obj/item/clothing/under/bartender/@SUBTYPES : /obj/item/clothing/pants/formal/black{@OLD}, /obj/item/clothing/shirt/button{@OLD} +/obj/item/clothing/under/blazer/@SUBTYPES : /obj/item/clothing/shirt/button{@OLD}, /obj/item/clothing/neck/tie/navy{@OLD}, /obj/item/clothing/suit/jacket/blazer{@OLD} +/obj/item/clothing/under/librarian/@SUBTYPES : /obj/item/clothing/pants/slacks/red{@OLD}, /obj/item/clothing/shirt/button{@OLD}, /obj/item/clothing/neck/tie/navy{@OLD}, /obj/item/clothing/suit/jacket/charcoal{@OLD} +/obj/item/clothing/under/overalls/@SUBTYPES : /obj/item/clothing/suit/apron/overalls/laborer/@SUBTYPES{@OLD} +/obj/item/clothing/under/chef/@SUBTYPES : /obj/item/clothing/pants/slacks/white{@OLD}, /obj/item/clothing/shirt/button{@OLD} +/obj/item/clothing/under/syndicate/@SUBTYPES : /obj/item/clothing/shirt/syndicate/@SUBTYPES{@OLD} +/obj/item/clothing/under/sl_suit/@SUBTYPES : /obj/item/clothing/pants/slacks/black{@OLD}, /obj/item/clothing/shirt/button{@OLD} +/obj/item/clothing/under/orderly/@SUBTYPES : /obj/item/clothing/pants/slacks/white/orderly{@OLD}, /obj/item/clothing/shirt/button/orderly{@OLD}, /obj/item/clothing/neck/tie/long/red{@OLD} +/obj/item/clothing/under/gimmick/rank/captain/suit/@SUBTYPES : /obj/item/clothing/costume/captain_suit/@SUBTYPES{@OLD} +/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/@SUBTYPES : /obj/item/clothing/costume/head_of_personnel_suit/@SUBTYPES{@OLD} +/obj/item/clothing/under/waiter/monke/@SUBTYPES : /obj/item/clothing/under/waiter/@SUBTYPES{@OLD} +/obj/item/clothing/under/waiter/@SUBTYPES : /obj/item/clothing/pants/slacks/black{@OLD}, /obj/item/clothing/shirt/button{@OLD}, /obj/item/clothing/neck/tie/bow/color/red{@OLD}, /obj/item/clothing/suit/jacket/vest/blue{@OLD} +/obj/item/clothing/under/wetsuit/@SUBTYPES : /obj/item/clothing/jumpsuit/wetsuit/@SUBTYPES{@OLD} +/obj/item/clothing/under/lawyer/bluesuit/@SUBTYPES : /obj/item/clothing/costume/lawyer_bluesuit/@SUBTYPES{@OLD} +/obj/item/clothing/under/lawyer/red/@SUBTYPES : /obj/item/clothing/costume/lawyer_red/@SUBTYPES{@OLD} +/obj/item/clothing/under/lawyer/oldman/@SUBTYPES : /obj/item/clothing/costume/oldman/@SUBTYPES{@OLD} +/obj/item/clothing/under/lawyer/fiendsuit/@SUBTYPES : /obj/item/clothing/costume/fiendsuit/@SUBTYPES{@OLD} +/obj/item/clothing/under/lawyer/@SUBTYPES : /obj/item/clothing/costume/lawyer/@SUBTYPES{@OLD} +/obj/item/clothing/under/grimhoodie/@SUBTYPES : /obj/item/clothing/pants/casual/blackjeans{@OLD}, /obj/item/clothing/shirt/tee/black{@OLD}, /obj/item/clothing/suit/jacket/hoodie/grim{@OLD} +/obj/item/clothing/under/gentlesuit/@SUBTYPES : /obj/item/clothing/shirt/button/black{@OLD}, /obj/item/clothing/suit/jacket/vest/gray{@OLD} +/obj/item/clothing/under/security2/@SUBTYPES : /obj/item/clothing/shirt/button/security{@OLD}, /obj/item/clothing/pants/slacks/security{@OLD} +/obj/item/clothing/under/blazer/@SUBTYPES : /obj/item/clothing/shirt/button{@OLD}, /obj/item/clothing/neck/tie/navy{@OLD}, /obj/item/clothing/suit/jacket/blazer{@OLD} +/obj/item/clothing/under/psysuit/@SUBTYPES : /obj/item/clothing/jumpsuit/psysuit/@SUBTYPES{@OLD} +/obj/item/clothing/under/skrell/@SUBTYPES : /obj/item/clothing/jumpsuit/skrell/@SUBTYPES{@OLD} +/obj/item/clothing/under/ascent/@SUBTYPES : /obj/item/clothing/jumpsuit/ascent/@SUBTYPES{@OLD} +/obj/item/clothing/under/harness/@SUBTYPES : /obj/item/clothing/shirt/harness/@SUBTYPES{@OLD} +/obj/item/clothing/under/syndicate/tacticool/@SUBTYPES : /obj/item/clothing/shirt/syndicate/tacticool/@SUBTYPES{@OLD} +/obj/item/clothing/under/work/@SUBTYPES : /obj/item/clothing/jumpsuit/work/@SUBTYPES{@OLD} +/obj/item/clothing/under/pilot/@SUBTYPES : /obj/item/clothing/jumpsuit/pilot/@SUBTYPES{@OLD} +/obj/item/clothing/under/pcrc/@SUBTYPES : /obj/item/clothing/jumpsuit/pcrc/@SUBTYPES{@OLD} +/obj/item/clothing/under/frontier/@SUBTYPES : /obj/item/clothing/shirt/flannel/red{@OLD}, /obj/item/clothing/suit/apron/overalls/denim{@OLD} +/obj/item/clothing/under/abol_uniform/@SUBTYPES : /obj/item/clothing/jumpsuit/abolitionist/@SUBTYPES{@OLD} +/obj/item/clothing/under/shortjumpskirt/@SUBTYPES : /obj/item/clothing/jumpsuit/skirt/short/@SUBTYPES{@OLD} +/obj/item/clothing/under/@SUBTYPES : /obj/item/clothing/costume/@SUBTYPES{@OLD} diff --git a/tools/map_migrations/4113_carbon_removal.txt b/tools/map_migrations/4113_carbon_removal.txt new file mode 100644 index 00000000000..1b30ff494f8 --- /dev/null +++ b/tools/map_migrations/4113_carbon_removal.txt @@ -0,0 +1 @@ +/mob/living/carbon/human/@SUBTYPES : /mob/living/human/@SUBTYPES{@OLD} diff --git a/tools/map_migrations/4124_cult_modpack.txt b/tools/map_migrations/4124_cult_modpack.txt new file mode 100644 index 00000000000..3d29f8793ba --- /dev/null +++ b/tools/map_migrations/4124_cult_modpack.txt @@ -0,0 +1 @@ +/obj/structure/cult/talisman : /obj/structure/talisman_altar{@OLD} \ No newline at end of file diff --git a/tools/validate_dme.py b/tools/validate_dme.py index f8db6d699e8..4966ef550fe 100644 --- a/tools/validate_dme.py +++ b/tools/validate_dme.py @@ -101,9 +101,12 @@ def compare_lines(a, b): raise f"Two lines were exactly the same ({a} vs. {b})" +failed = False sorted_lines = sorted(lines, key = functools.cmp_to_key(compare_lines)) for (index, line) in enumerate(lines): if sorted_lines[index] != line: print(f"The include at line {index + offset} is out of order ({line}, expected {sorted_lines[index]})") - print(f"::error file=tgstation.dme,line={index+offset},title=DME Validator::The include at line {index + offset} is out of order ({line}, expected {sorted_lines[index]})") - sys.exit(1) + print(f"::error file=nebula.dme,line={index+offset},title=DME Validator::The include at line {index + offset} is out of order ({line}, expected {sorted_lines[index]})") + failed = True +if failed: + sys.exit(1) diff --git a/tools/validate_modpacks.py b/tools/validate_modpacks.py new file mode 100644 index 00000000000..aa192d073c8 --- /dev/null +++ b/tools/validate_modpacks.py @@ -0,0 +1,169 @@ +import fnmatch +import functools +import glob +import sys +import os + +""" +Paths to search for modpacks in. +Works best if search paths are only one-deep, so that nested modpacks can be added separately. +""" +MODPACK_ROOTS = [ + r'mods/content/*/*.dme', + r'mods/gamemodes/*/*.dme', + r'mods/mobs/*/*.dme', + r'mods/species/*/*.dme' + # Example nested modpack configuration: + # r'mods/some_downstream/*/*.dme' +] + +""" +A list of DME paths to not run validation on. +Useful for excluding the outermost DME in a nested-modpack situation. +""" +IGNORE_MODPACKS = [ + # Example: + # r'mods/some_downstream/some_downstream.dme/*.dme' +] + +""" +A dictionary mapping of modpack roots ('mods/content/corporate') +to a list of globs matching files to forbid inclusion of. +If a file matches any of the globs, validation fails. +""" +FORBID_INCLUDE = { + # Example: + # r'mods/content/whatever/_whatever.dme' : [r'mods/content/whatever/README.md', r'mods/content/whatever/something/something_docs.md'] +} + +""" +A dictionary mapping of modpack roots ('mods/content/corporate') +to a list of globs matching files ('mods/content/corporate/away_sites/**/*.dm) to ignore when checking for inclusion. +If a file matching any of the globs is not included, validation will NOT fail. +""" +IGNORE_INCLUDE = { + # The validator can't detect the weird way these are loaded. + r'mods/content/corporate': [ + r'mods/content/corporate/away_sites/**/*.dm', + ], + r'mods/content/government': [ + r'mods/content/government/away_sites/**/*.dm' + ] +} + +def validate_modpack(dme_path): + (modpack_path, dme_name) = os.path.split(dme_path) + reading = False + lines = [] + total = 0 + with open(dme_path, 'r') as dme_file: + for line in dme_file.readlines(): + total+=1 + line = line.strip() + + if line == "// BEGIN_INCLUDE": + reading = True + continue + elif line == "// END_INCLUDE": + break + elif not reading: + continue + elif not line.startswith("#include"): + continue + + lines.append(line) + + offset = total - len(lines) + print(f"{offset} lines were ignored in {dme_name}") + modpack_failed = False + + for code_file in glob.glob("**/*.dm", root_dir=modpack_path, recursive=True): + full_file = os.path.join(modpack_path, code_file) + dm_path = code_file.replace('/', '\\') + + included = f"#include \"{dm_path}\"" in lines + forbid_include = False + + ignored = False + + modpack_ignores = [] + if modpack_path in IGNORE_INCLUDE: + modpack_ignores = IGNORE_INCLUDE[modpack_path] + + for ignore in modpack_ignores: + if not fnmatch.fnmatch(full_file, ignore): + continue + + ignored = True + break + + if ignored: + continue + + modpack_forbids = [] + if modpack_path in FORBID_INCLUDE: + modpack_forbids = FORBID_INCLUDE[modpack_path] + + for forbid in modpack_forbids: + if not fnmatch.fnmatch(full_file, forbid): + continue + + forbid_include = True + + if included: + print(f"{os.path.join(modpack_path,dm_path)} should not be included") + print(f"::error file={full_file},line=1,title=DME Validator::File should not be included") + modpack_failed = True + + if forbid_include: + continue + + if not included: + print(f"{os.path.join(modpack_path,dm_path)} is not included") + print(f"::error file={full_file},line=1,title=DME Validator::File is not included") + modpack_failed = True + + def compare_lines(a, b): + # Remove initial include as well as the final quotation mark + a = a[len("#include \""):-1].lower() + b = b[len("#include \""):-1].lower() + + a_segments = a.split('\\') + b_segments = b.split('\\') + + for (a_segment, b_segment) in zip(a_segments, b_segments): + a_is_file = a_segment.endswith(".dm") + b_is_file = b_segment.endswith(".dm") + + # code\something.dm will ALWAYS come before code\directory\something.dm + if a_is_file and not b_is_file: + return -1 + + if b_is_file and not a_is_file: + return 1 + + # interface\something.dm will ALWAYS come after code\something.dm + if a_segment != b_segment: + return (a_segment > b_segment) - (a_segment < b_segment) + + raise ValueError(f"Two lines were exactly the same ({a} vs. {b})") + + sorted_lines = sorted(lines, key = functools.cmp_to_key(compare_lines)) + for (index, line) in enumerate(lines): + if sorted_lines[index] != line: + print(f"The include at line {index + offset} is out of order ({line}, expected {sorted_lines[index]})") + print(f"::error file={dme_path},line={index+offset},title=DME Validator::The include at line {index + offset} is out of order ({line}, expected {sorted_lines[index]})") + modpack_failed = True + return modpack_failed + +failed = False +for modpack_root in MODPACK_ROOTS: + for modpack_dme in glob.glob(modpack_root, recursive=True): + modpack_dme = modpack_dme.replace('\\', '/') + if modpack_dme in IGNORE_MODPACKS: + continue + failed = validate_modpack(modpack_dme) or failed + +if failed: + sys.exit(1) +