-
Notifications
You must be signed in to change notification settings - Fork 31
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: ✨ options for game version validation (#536)
* feat: ✨ option to disable game version validation * feat: ✨ added custom validation option * docs: 📝 added missing doc comments * refactor: ♻️ use ENUM * refactor: ♻️ only pass `ml_options` * refactor: ♻️ move `customize_script_path` out of export group * docs: 📝 added example customize script * style: ✏️ improved spelling * docs: 📝 reworked comments * refactor: ♻️ `ml_options_path` as param for easier testing * refactor: 🔥 remove example script moved to docs page * refactor: ♻️ removed example added `@tutorial` * test: 🧪 added custom validation test * fix: 🧪 fixed test setup * fix: 🧪 removed editor override * fix: 🐛 set `customize_script_path` outside of for loop * refactor: 🚚 added sub dir * test: 🧪 added test for game version validation disabled * fix: 🧪 updated custom script path * test: 🧪 added `test_game_verion_validation_default` * fix: 🧪 replace white space chars with `""` * refactor: ♻️ clean up a bit * test: 🧪 added no callable set test * Update addons/mod_loader/resources/options_profile.gd Co-authored-by: steen <steen.rickmer@gmx.de> * Update addons/mod_loader/resources/options_profile.gd --------- Co-authored-by: steen <steen.rickmer@gmx.de>
- Loading branch information
Showing
14 changed files
with
306 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
extends GutTest | ||
|
||
|
||
func load_manifest_test_mod_1() -> ModManifest: | ||
var mod_path := "res://mods-unpacked/test-mod1/" | ||
var manifest_data: Dictionary = _ModLoaderFile.load_manifest_file(mod_path) | ||
|
||
return ModManifest.new(manifest_data, mod_path) | ||
|
||
|
||
func test_customize_script() -> void: | ||
ModLoaderStore._update_ml_options_from_options_resource("res://test_options/customize_script/options_custom_validation.tres") | ||
var manifest := load_manifest_test_mod_1() | ||
|
||
assert_eq( | ||
"".join(manifest.validation_messages_warning), | ||
"! ☞゚ヮ゚)☞ CUSTOM VALIDATION HERE ☜゚ヮ゚☜) !" | ||
) | ||
|
||
|
||
func test_customize_script_no_callable() -> void: | ||
# Clear saved error logs before testing to prevent false positives. | ||
ModLoaderLog.logged_messages.by_type.error.clear() | ||
|
||
ModLoaderStore._update_ml_options_from_options_resource("res://test_options/customize_script_no_callable_set/options_custom_validation_no_callable_set.tres") | ||
var manifest := load_manifest_test_mod_1() | ||
|
||
var logs := ModLoaderLog.get_by_type_as_string("error") | ||
|
||
assert_string_contains("".join(logs), "No custom game version validation callable detected. Please provide a valid validation callable.") | ||
|
||
|
||
func test_game_verion_validation_disabled() -> void: | ||
ModLoaderStore._update_ml_options_from_options_resource("res://test_options/game_version_validation_disabled/options_game_version_validation_disabled.tres") | ||
var manifest := load_manifest_test_mod_1() | ||
|
||
assert_true(manifest.validation_messages_error.size() == 0) | ||
|
||
|
||
func test_game_verion_validation_default() -> void: | ||
ModLoaderStore._update_ml_options_from_options_resource("res://test_options/game_version_validation_default/options_game_version_validation_default.tres") | ||
var manifest := load_manifest_test_mod_1() | ||
|
||
assert_eq( | ||
"".join(manifest.validation_messages_error).replace("\r", "").replace("\n", "").replace("\t", ""), | ||
"The mod \"test-mod1\" is incompatible with the current game version.(current game version: 1000.0.0, mod compatible with game versions: [\"0.0.1\"])" | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
[gd_resource type="Resource" script_class="ModLoaderOptionsProfile" load_steps=2 format=3 uid="uid://dky5648t3gmp2"] | ||
|
||
[ext_resource type="Script" path="res://addons/mod_loader/resources/options_profile.gd" id="1_3rpjy"] | ||
|
||
[resource] | ||
script = ExtResource("1_3rpjy") | ||
enable_mods = true | ||
locked_mods = Array[String]([]) | ||
disabled_mods = Array[String]([]) | ||
allow_modloader_autoloads_anywhere = false | ||
customize_script_path = "res://test_options/customize_script/customize_script.gd" | ||
log_level = 3 | ||
ignore_deprecated_errors = false | ||
ignored_mod_names_in_log = Array[String]([]) | ||
steam_id = 0 | ||
semantic_version = "0.0.0" | ||
load_from_steam_workshop = false | ||
load_from_local = true | ||
override_path_to_mods = "" | ||
override_path_to_configs = "" | ||
override_path_to_workshop = "" | ||
override_path_to_hook_pack = "" | ||
override_hook_pack_name = "" | ||
restart_notification_scene_path = "res://addons/mod_loader/restart_notification.tscn" | ||
disable_restart = false | ||
game_version_validation = 2 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
extends RefCounted | ||
|
||
# This is an example script for the ModLoaderOptionsProfile `customize_script_path`. | ||
# Ideally, place this script outside the `mod_loader` directory to simplify the update process. | ||
|
||
|
||
# This script is loaded after `mod_loader_store.ml_options` has been initialized. | ||
# It receives `ml_options` as an argument, allowing you to apply settings | ||
# that cannot be configured through the editor UI. | ||
func _init(ml_options: ModLoaderOptionsProfile) -> void: | ||
# Use OS.has_feature() to apply changes only for specific platforms, | ||
# or create multiple customization scripts and set their paths accordingly in the option profiles. | ||
if OS.has_feature("Steam"): | ||
pass | ||
elif OS.has_feature("Epic"): | ||
pass | ||
else: | ||
# Set `custom_game_version_validation_callable` to use a custom validation function. | ||
ml_options.custom_game_version_validation_callable = custom_is_game_version_compatible | ||
|
||
|
||
# Custom validation function | ||
# See `ModManifest._is_game_version_compatible()` for the default validation logic. | ||
func custom_is_game_version_compatible(manifest: ModManifest) -> bool: | ||
manifest.validation_messages_warning.push_back("! ☞゚ヮ゚)☞ CUSTOM VALIDATION HERE ☜゚ヮ゚☜) !") | ||
return true |
9 changes: 9 additions & 0 deletions
9
test/test_options/customize_script/options_custom_validation.tres
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
[gd_resource type="Resource" script_class="ModLoaderCurrentOptions" load_steps=3 format=3 uid="uid://d08kklljebrnh"] | ||
|
||
[ext_resource type="Resource" uid="uid://dky5648t3gmp2" path="res://test_options/customize_script/custom_validation.tres" id="1_s4sec"] | ||
[ext_resource type="Script" path="res://addons/mod_loader/resources/options_current.gd" id="2_1rct1"] | ||
|
||
[resource] | ||
script = ExtResource("2_1rct1") | ||
current_options = ExtResource("1_s4sec") | ||
feature_override_options = {} |
26 changes: 26 additions & 0 deletions
26
test/test_options/customize_script_no_callable_set/custom_validation_no_callable_set.tres
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
[gd_resource type="Resource" script_class="ModLoaderOptionsProfile" load_steps=2 format=3 uid="uid://1gab2n8lgi60"] | ||
|
||
[ext_resource type="Script" path="res://addons/mod_loader/resources/options_profile.gd" id="1_d2tfu"] | ||
|
||
[resource] | ||
script = ExtResource("1_d2tfu") | ||
enable_mods = true | ||
locked_mods = Array[String]([]) | ||
disabled_mods = Array[String]([]) | ||
allow_modloader_autoloads_anywhere = false | ||
customize_script_path = "res://test_options/customize_script_no_callable_set/customize_script_no_callable_set.gd" | ||
log_level = 3 | ||
ignore_deprecated_errors = false | ||
ignored_mod_names_in_log = Array[String]([]) | ||
steam_id = 0 | ||
semantic_version = "0.0.0" | ||
load_from_steam_workshop = false | ||
load_from_local = true | ||
override_path_to_mods = "" | ||
override_path_to_configs = "" | ||
override_path_to_workshop = "" | ||
override_path_to_hook_pack = "" | ||
override_hook_pack_name = "" | ||
restart_notification_scene_path = "res://addons/mod_loader/restart_notification.tscn" | ||
disable_restart = false | ||
game_version_validation = 2 |
27 changes: 27 additions & 0 deletions
27
test/test_options/customize_script_no_callable_set/customize_script_no_callable_set.gd
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
extends RefCounted | ||
|
||
# This is an example script for the ModLoaderOptionsProfile `customize_script_path`. | ||
# Ideally, place this script outside the `mod_loader` directory to simplify the update process. | ||
|
||
|
||
# This script is loaded after `mod_loader_store.ml_options` has been initialized. | ||
# It receives `ml_options` as an argument, allowing you to apply settings | ||
# that cannot be configured through the editor UI. | ||
func _init(ml_options: ModLoaderOptionsProfile) -> void: | ||
# Use OS.has_feature() to apply changes only for specific platforms, | ||
# or create multiple customization scripts and set their paths accordingly in the option profiles. | ||
if OS.has_feature("Steam"): | ||
pass | ||
elif OS.has_feature("Epic"): | ||
pass | ||
else: | ||
pass | ||
# Set `custom_game_version_validation_callable` to use a custom validation function. | ||
#ml_options.custom_game_version_validation_callable = custom_is_game_version_compatible | ||
|
||
|
||
# Custom validation function | ||
# See `ModManifest._is_game_version_compatible()` for the default validation logic. | ||
func custom_is_game_version_compatible(manifest: ModManifest) -> bool: | ||
manifest.validation_messages_warning.push_back("! ☞゚ヮ゚)☞ CUSTOM VALIDATION HERE ☜゚ヮ゚☜) !") | ||
return true |
9 changes: 9 additions & 0 deletions
9
...t_options/customize_script_no_callable_set/options_custom_validation_no_callable_set.tres
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
[gd_resource type="Resource" script_class="ModLoaderCurrentOptions" load_steps=3 format=3 uid="uid://c25j7kt7y8ora"] | ||
|
||
[ext_resource type="Resource" uid="uid://1gab2n8lgi60" path="res://test_options/customize_script_no_callable_set/custom_validation_no_callable_set.tres" id="1_xrqi6"] | ||
[ext_resource type="Script" path="res://addons/mod_loader/resources/options_current.gd" id="2_4o6bw"] | ||
|
||
[resource] | ||
script = ExtResource("2_4o6bw") | ||
current_options = ExtResource("1_xrqi6") | ||
feature_override_options = {} |
26 changes: 26 additions & 0 deletions
26
test/test_options/game_version_validation_default/game_version_validation_default.tres
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
[gd_resource type="Resource" script_class="ModLoaderOptionsProfile" load_steps=2 format=3 uid="uid://bnc6gslxpnx3y"] | ||
|
||
[ext_resource type="Script" path="res://addons/mod_loader/resources/options_profile.gd" id="1_kdajl"] | ||
|
||
[resource] | ||
script = ExtResource("1_kdajl") | ||
enable_mods = true | ||
locked_mods = Array[String]([]) | ||
disabled_mods = Array[String]([]) | ||
allow_modloader_autoloads_anywhere = false | ||
customize_script_path = "" | ||
log_level = 3 | ||
ignore_deprecated_errors = false | ||
ignored_mod_names_in_log = Array[String]([]) | ||
steam_id = 0 | ||
semantic_version = "1000.0.0" | ||
load_from_steam_workshop = false | ||
load_from_local = true | ||
override_path_to_mods = "" | ||
override_path_to_configs = "" | ||
override_path_to_workshop = "" | ||
override_path_to_hook_pack = "" | ||
override_hook_pack_name = "" | ||
restart_notification_scene_path = "res://addons/mod_loader/restart_notification.tscn" | ||
disable_restart = false | ||
game_version_validation = 0 |
9 changes: 9 additions & 0 deletions
9
...test_options/game_version_validation_default/options_game_version_validation_default.tres
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
[gd_resource type="Resource" script_class="ModLoaderCurrentOptions" load_steps=3 format=3 uid="uid://emmn66l0e1n0"] | ||
|
||
[ext_resource type="Resource" uid="uid://bnc6gslxpnx3y" path="res://test_options/game_version_validation_default/game_version_validation_default.tres" id="1_ey6sk"] | ||
[ext_resource type="Script" path="res://addons/mod_loader/resources/options_current.gd" id="2_0ultl"] | ||
|
||
[resource] | ||
script = ExtResource("2_0ultl") | ||
current_options = ExtResource("1_ey6sk") | ||
feature_override_options = {} |
26 changes: 26 additions & 0 deletions
26
test/test_options/game_version_validation_disabled/game_version_validation_disabled.tres
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
[gd_resource type="Resource" script_class="ModLoaderOptionsProfile" load_steps=2 format=3 uid="uid://d2ktmje1gd5vb"] | ||
|
||
[ext_resource type="Script" path="res://addons/mod_loader/resources/options_profile.gd" id="1_vd02r"] | ||
|
||
[resource] | ||
script = ExtResource("1_vd02r") | ||
enable_mods = true | ||
locked_mods = Array[String]([]) | ||
disabled_mods = Array[String]([]) | ||
allow_modloader_autoloads_anywhere = false | ||
customize_script_path = "" | ||
log_level = 3 | ||
ignore_deprecated_errors = false | ||
ignored_mod_names_in_log = Array[String]([]) | ||
steam_id = 0 | ||
semantic_version = "1000.0.0" | ||
load_from_steam_workshop = false | ||
load_from_local = true | ||
override_path_to_mods = "" | ||
override_path_to_configs = "" | ||
override_path_to_workshop = "" | ||
override_path_to_hook_pack = "" | ||
override_hook_pack_name = "" | ||
restart_notification_scene_path = "res://addons/mod_loader/restart_notification.tscn" | ||
disable_restart = false | ||
game_version_validation = 1 |
9 changes: 9 additions & 0 deletions
9
...st_options/game_version_validation_disabled/options_game_version_validation_disabled.tres
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
[gd_resource type="Resource" script_class="ModLoaderCurrentOptions" load_steps=3 format=3 uid="uid://dsegljus5l2qm"] | ||
|
||
[ext_resource type="Resource" uid="uid://d2ktmje1gd5vb" path="res://test_options/game_version_validation_disabled/game_version_validation_disabled.tres" id="1_18vx8"] | ||
[ext_resource type="Script" path="res://addons/mod_loader/resources/options_current.gd" id="2_5hgrx"] | ||
|
||
[resource] | ||
script = ExtResource("2_5hgrx") | ||
current_options = ExtResource("1_18vx8") | ||
feature_override_options = {} |