diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/config/project_settings.cpp | 19 | ||||
-rw-r--r-- | core/string/ustring.cpp | 2 | ||||
-rw-r--r-- | core/variant/array.cpp | 6 | ||||
-rw-r--r-- | core/variant/array.h | 1 | ||||
-rw-r--r-- | core/variant/variant_call.cpp | 1 |
5 files changed, 26 insertions, 3 deletions
diff --git a/core/config/project_settings.cpp b/core/config/project_settings.cpp index 001a351e0b..beef773699 100644 --- a/core/config/project_settings.cpp +++ b/core/config/project_settings.cpp @@ -153,8 +153,23 @@ const PackedStringArray ProjectSettings::_trim_to_supported_features(const Packe #endif // TOOLS_ENABLED String ProjectSettings::localize_path(const String &p_path) const { - if (resource_path.is_empty() || p_path.begins_with("res://") || p_path.begins_with("user://") || - (p_path.is_absolute_path() && !p_path.begins_with(resource_path))) { + if (resource_path.is_empty() || (p_path.is_absolute_path() && !p_path.begins_with(resource_path))) { + return p_path.simplify_path(); + } + + // Check if we have a special path (like res://) or a protocol identifier. + int p = p_path.find("://"); + bool found = false; + if (p > 0) { + found = true; + for (int i = 0; i < p; i++) { + if (!is_ascii_alphanumeric_char(p_path[i])) { + found = false; + break; + } + } + } + if (found) { return p_path.simplify_path(); } diff --git a/core/string/ustring.cpp b/core/string/ustring.cpp index 2e0ad94fcf..c86c8316fe 100644 --- a/core/string/ustring.cpp +++ b/core/string/ustring.cpp @@ -3675,7 +3675,7 @@ String String::simplify_path() const { if (p > 0) { bool only_chars = true; for (int i = 0; i < p; i++) { - if (!is_ascii_char(s[i])) { + if (!is_ascii_alphanumeric_char(s[i])) { only_chars = false; break; } diff --git a/core/variant/array.cpp b/core/variant/array.cpp index 8b958814db..c6bbd43dc4 100644 --- a/core/variant/array.cpp +++ b/core/variant/array.cpp @@ -31,6 +31,7 @@ #include "array.h" #include "container_type_validate.h" +#include "core/math/math_funcs.h" #include "core/object/class_db.h" #include "core/object/script_language.h" #include "core/templates/hashfuncs.h" @@ -299,6 +300,11 @@ Variant Array::back() const { return operator[](_p->array.size() - 1); } +Variant Array::pick_random() const { + ERR_FAIL_COND_V_MSG(_p->array.size() == 0, Variant(), "Can't take value from empty array."); + return operator[](Math::rand() % _p->array.size()); +} + int Array::find(const Variant &p_value, int p_from) const { ERR_FAIL_COND_V(!_p->typed.validate(p_value, "find"), -1); return _p->array.find(p_value, p_from); diff --git a/core/variant/array.h b/core/variant/array.h index 3d9a794969..ee265a9ffd 100644 --- a/core/variant/array.h +++ b/core/variant/array.h @@ -79,6 +79,7 @@ public: Variant front() const; Variant back() const; + Variant pick_random() const; void sort(); void sort_custom(const Callable &p_callable); diff --git a/core/variant/variant_call.cpp b/core/variant/variant_call.cpp index 900e3d8e77..ef4807ba71 100644 --- a/core/variant/variant_call.cpp +++ b/core/variant/variant_call.cpp @@ -2053,6 +2053,7 @@ static void _register_variant_builtin_methods() { bind_method(Array, erase, sarray("value"), varray()); bind_method(Array, front, sarray(), varray()); bind_method(Array, back, sarray(), varray()); + bind_method(Array, pick_random, sarray(), varray()); bind_method(Array, find, sarray("what", "from"), varray(0)); bind_method(Array, rfind, sarray("what", "from"), varray(-1)); bind_method(Array, find_last, sarray("value"), varray()); |