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("
"
+ html += "Back
"
html += "Time till start: [round(event_time / 600, 0.1)]
"
html += "
Name | Type | Weight | OneShot | ||||
[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 += "
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 += "
", "\n
")
+ . = replacetext(., "
", "\n
") + . = replacetext(., "