From a1dcc55be9f6edb91012f681cd79f42658209217 Mon Sep 17 00:00:00 2001 From: spookerton Date: Wed, 6 Jul 2022 09:37:19 +0100 Subject: [PATCH 1/3] added abstract_type, D.IsAbstract(), is_abstract() --- code/core/datum/IsAbstract.dm | 23 +++++++++++++++++++++++ polaris.dme | 1 + 2 files changed, 24 insertions(+) create mode 100644 code/core/datum/IsAbstract.dm diff --git a/code/core/datum/IsAbstract.dm b/code/core/datum/IsAbstract.dm new file mode 100644 index 0000000000..12263dc098 --- /dev/null +++ b/code/core/datum/IsAbstract.dm @@ -0,0 +1,23 @@ +/** +* Abstract-ness is a meta-property of a class that is used to indicate +* that the class is intended to be used as a base class for others, and +* should not (or cannot) be instantiated. +* We have no such language concept in DM, and so we provide a datum member +* that can be used to hint at abstractness for circumstances where we would +* like that to be the case, such as base behavior providers. +*/ + +/// If set, a path at/above this one that expects not to be instantiated. +/datum/var/abstract_type + +/// If true, this datum is an instance of an abstract type. Oops. +/datum/proc/IsAbstract() + SHOULD_NOT_OVERRIDE(TRUE) + return type == abstract_type + +/// Passed a path or instance, returns whether it is abstract. Otherwise null. +/proc/is_abstract(datum/thing) + if (ispath(thing)) + return thing == initial(thing.abstract_type) + if (istype(thing)) + return thing.IsAbstract() diff --git a/polaris.dme b/polaris.dme index 42c15d8c08..c6e881bbbd 100644 --- a/polaris.dme +++ b/polaris.dme @@ -256,6 +256,7 @@ #include "code\controllers\subsystems\processing\processing.dm" #include "code\controllers\subsystems\processing\projectiles.dm" #include "code\controllers\subsystems\processing\turfs.dm" +#include "code\core\datum\IsAbstract.dm" #include "code\datums\ai_law_sets.dm" #include "code\datums\ai_laws.dm" #include "code\datums\beam.dm" From b67fe40cc08e245c5bf126929e0524964a95dcba Mon Sep 17 00:00:00 2001 From: spookerton Date: Wed, 6 Jul 2022 09:41:00 +0100 Subject: [PATCH 2/3] transform behavior- A|I.Clear|Set & M.Clear|Update --- code/core/atom/Transform.dm | 53 +++++++++++++++++++++++++++++++++++ code/core/image/Transform.dm | 53 +++++++++++++++++++++++++++++++++++ code/core/matrix/Transform.dm | 27 ++++++++++++++++++ polaris.dme | 3 ++ 4 files changed, 136 insertions(+) create mode 100644 code/core/atom/Transform.dm create mode 100644 code/core/image/Transform.dm create mode 100644 code/core/matrix/Transform.dm diff --git a/code/core/atom/Transform.dm b/code/core/atom/Transform.dm new file mode 100644 index 0000000000..8a914a52ed --- /dev/null +++ b/code/core/atom/Transform.dm @@ -0,0 +1,53 @@ +/// The atom's base transform scale for width. +/atom/var/tf_scale_x + +/// The atom's base transform scale for height. +/atom/var/tf_scale_y + +/// The atom's base transform scale for rotation. +/atom/var/tf_rotation + +/// The atom's base transform scale for horizontal offset. +/atom/var/tf_offset_x + +/// The atom's base transform scale for vertical offset. +/atom/var/tf_offset_y + + +/// Clear the atom's tf_* variables and the current transform state. +/atom/proc/ClearTransform() + tf_scale_x = null + tf_scale_y = null + tf_rotation = null + tf_offset_x = null + tf_offset_y = null + transform = null + + +/// Sets the atom's tf_* variables and the current transform state, also applying others if supplied. +/atom/proc/SetTransform( + scale, + scale_x = tf_scale_x, + scale_y = tf_scale_y, + rotation = tf_rotation, + offset_x = tf_offset_x, + offset_y = tf_offset_y, + list/others +) + if (!isnull(scale)) + tf_scale_x = scale + tf_scale_y = scale + else + tf_scale_x = scale_x + tf_scale_y = scale_y + tf_rotation = rotation + tf_offset_x = offset_x + tf_offset_y = offset_y + transform = matrix().Update( + scale_x = tf_scale_x, + scale_y = tf_scale_y, + rotation = tf_rotation, + offset_x = tf_offset_x, + offset_y = tf_offset_y, + others = others + ) diff --git a/code/core/image/Transform.dm b/code/core/image/Transform.dm new file mode 100644 index 0000000000..8129952939 --- /dev/null +++ b/code/core/image/Transform.dm @@ -0,0 +1,53 @@ +/// The image's base transform scale for width. +/image/var/tf_scale_x + +/// The image's base transform scale for height. +/image/var/tf_scale_y + +/// The image's base transform scale for rotation. +/image/var/tf_rotation + +/// The image's base transform scale for horizontal offset. +/image/var/tf_offset_x + +/// The image's base transform scale for vertical offset. +/image/var/tf_offset_y + + +/// Clear the image's tf_* variables and the current transform state. +/image/proc/ClearTransform() + tf_scale_x = null + tf_scale_y = null + tf_rotation = null + tf_offset_x = null + tf_offset_y = null + transform = null + + +/// Sets the image's tf_* variables and the current transform state, also applying others if supplied. +/image/proc/SetTransform( + scale, + scale_x = tf_scale_x, + scale_y = tf_scale_y, + rotation = tf_rotation, + offset_x = tf_offset_x, + offset_y = tf_offset_y, + list/others +) + if (!isnull(scale)) + tf_scale_x = scale + tf_scale_y = scale + else + tf_scale_x = scale_x + tf_scale_y = scale_y + tf_rotation = rotation + tf_offset_x = offset_x + tf_offset_y = offset_y + transform = matrix().Update( + scale_x = tf_scale_x, + scale_y = tf_scale_y, + rotation = tf_rotation, + offset_x = tf_offset_x, + offset_y = tf_offset_y, + others = others + ) diff --git a/code/core/matrix/Transform.dm b/code/core/matrix/Transform.dm new file mode 100644 index 0000000000..c3efc59d9a --- /dev/null +++ b/code/core/matrix/Transform.dm @@ -0,0 +1,27 @@ +/// Clears the matrix's a-f variables to identity. +/matrix/proc/Clear() + a = 1 + b = 0 + c = 0 + d = 0 + e = 1 + f = 0 + return src + + +/// Runs Scale, Turn, and Translate if supplied parameters, then multiplies by others if set. +/matrix/proc/Update(scale_x, scale_y, rotation, offset_x, offset_y, list/others) + var/x_null = isnull(scale_x) + var/y_null = isnull(scale_y) + if (!x_null || !y_null) + Scale(x_null ? 1 : scale_x, y_null ? 1 : scale_y) + if (!isnull(rotation)) + Turn(rotation) + if (offset_x || offset_y) + Translate(offset_x || 0, offset_y || 0) + if (islist(others)) + for (var/other in others) + Multiply(other) + else if (others) + Multiply(others) + return src diff --git a/polaris.dme b/polaris.dme index c6e881bbbd..14db8388da 100644 --- a/polaris.dme +++ b/polaris.dme @@ -256,7 +256,10 @@ #include "code\controllers\subsystems\processing\processing.dm" #include "code\controllers\subsystems\processing\projectiles.dm" #include "code\controllers\subsystems\processing\turfs.dm" +#include "code\core\atom\Transform.dm" #include "code\core\datum\IsAbstract.dm" +#include "code\core\image\Transform.dm" +#include "code\core\matrix\Transform.dm" #include "code\datums\ai_law_sets.dm" #include "code\datums\ai_laws.dm" #include "code\datums\beam.dm" From e2b345a023fd3beca39004722c5dda913761f0da Mon Sep 17 00:00:00 2001 From: spookerton Date: Wed, 6 Jul 2022 09:46:29 +0100 Subject: [PATCH 3/3] hides base Physical/Mental traits from prefs --- code/modules/client/preference_setup/traits/trait_defines.dm | 3 +++ code/modules/client/preference_setup/traits/traits.dm | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/client/preference_setup/traits/trait_defines.dm b/code/modules/client/preference_setup/traits/trait_defines.dm index aaca85b086..225e690e71 100644 --- a/code/modules/client/preference_setup/traits/trait_defines.dm +++ b/code/modules/client/preference_setup/traits/trait_defines.dm @@ -2,6 +2,7 @@ // The actual modifiers (if used) for these are stored inside code/modules/mob/_modifiers/traits.dm /datum/trait/modifier + abstract_type = /datum/trait/modifier var/modifier_type = null // Type to add to the mob post spawn. /datum/trait/modifier/apply_trait_post_spawn(mob/living/L) @@ -26,6 +27,7 @@ // Physical traits are what they sound like, and involve the character's physical body, as opposed to their mental state. /datum/trait/modifier/physical + abstract_type = /datum/trait/modifier/physical name = "Physical" category = "Physical" @@ -198,6 +200,7 @@ // 'Mental' traits are just those that only sapients can have, for now, and generally involves fears. // So far, all of them are just for fluff/don't have mechanical effects. /datum/trait/modifier/mental + abstract_type = /datum/trait/modifier/mental name = "Mental" category = "Mental" diff --git a/code/modules/client/preference_setup/traits/traits.dm b/code/modules/client/preference_setup/traits/traits.dm index 795b0f1269..7d9441aaec 100644 --- a/code/modules/client/preference_setup/traits/traits.dm +++ b/code/modules/client/preference_setup/traits/traits.dm @@ -5,7 +5,9 @@ var/global/list/trait_categories = list() // The categories available for the tr /hook/startup/proc/populate_trait_list() //create a list of trait datums - for(var/trait_type in typesof(/datum/trait) - list(/datum/trait, /datum/trait/modifier)) + for(var/trait_type as anything in subtypesof(/datum/trait)) + if (is_abstract(trait_type)) + continue var/datum/trait/T = new trait_type if(!T.is_available()) qdel(T) @@ -144,6 +146,7 @@ var/global/list/trait_categories = list() // The categories available for the tr /datum/trait + abstract_type = /datum/trait var/name = null // Name to show on UI var/desc = null // Description of what it does, also shown on UI. var/list/mutually_exclusive = list() // List of trait types which cannot be taken alongside this trait.