feat: Support for Escoria and Game migrations (#473)
Co-authored-by: Dennis Ploeger <develop@dieploegers.de>
This commit is contained in:
@@ -1,300 +0,0 @@
|
||||
extends Control
|
||||
|
||||
|
||||
func _test_basic() -> bool:
|
||||
var esc = """
|
||||
:test
|
||||
# first group
|
||||
>
|
||||
say player "Test"
|
||||
# Second group
|
||||
> [test]
|
||||
say player "Test2 BLANK"
|
||||
say player "Test3" [test2]
|
||||
# Third group
|
||||
>
|
||||
|
||||
say player "Test4"
|
||||
# Fourth group
|
||||
>
|
||||
say player "Test5"
|
||||
say player "Test 6"
|
||||
say player TEST:"Test 7"
|
||||
"""
|
||||
var script = escoria.esc_compiler.compile(esc.split("\n"))
|
||||
|
||||
var subject = script
|
||||
assert(subject is ESCScript)
|
||||
|
||||
subject = script.events.keys()
|
||||
assert(subject.size() == 1)
|
||||
assert(subject[0] == "test")
|
||||
|
||||
subject = script.events["test"].statements
|
||||
assert(subject.size() == 2)
|
||||
|
||||
subject = script.events["test"].statements[0]
|
||||
assert(subject is ESCGroup)
|
||||
assert(subject.statements.size() == 4)
|
||||
|
||||
subject = script.events["test"].statements[0].statements[0]
|
||||
assert(subject is ESCCommand)
|
||||
assert(subject.name == "say")
|
||||
assert(subject.parameters.size() == 2)
|
||||
assert(subject.parameters[0] == "player")
|
||||
assert(subject.parameters[1] == '"Test"')
|
||||
|
||||
subject = script.events["test"].statements[0].statements[1]
|
||||
assert(subject is ESCGroup)
|
||||
assert(subject.conditions.size() == 1)
|
||||
assert(subject.conditions[0] is ESCCondition)
|
||||
assert(subject.conditions[0].flag == "test")
|
||||
|
||||
subject = script.events["test"].statements[0].statements[1].statements[0]
|
||||
assert(subject is ESCCommand)
|
||||
assert(subject.name == "say")
|
||||
assert(subject.parameters.size() == 2)
|
||||
assert(subject.parameters[0] == "player")
|
||||
assert(subject.parameters[1] == '"Test2 BLANK"')
|
||||
|
||||
subject = script.events["test"].statements[0].statements[2]
|
||||
assert(subject is ESCCommand)
|
||||
assert(subject.name == "say")
|
||||
assert(subject.parameters.size() == 2)
|
||||
assert(subject.parameters[0] == "player")
|
||||
assert(subject.parameters[1] == '"Test3"')
|
||||
assert(subject.conditions.size() == 1)
|
||||
assert(subject.conditions[0].flag == "test2")
|
||||
|
||||
subject = script.events["test"].statements[0].statements[3]
|
||||
assert(subject is ESCGroup)
|
||||
assert(subject.statements.size() == 1)
|
||||
|
||||
subject = script.events["test"].statements[1]
|
||||
assert(subject is ESCGroup)
|
||||
assert(subject.statements.size() == 3)
|
||||
|
||||
subject = script.events["test"].statements[1].statements[1]
|
||||
assert(subject is ESCCommand)
|
||||
assert(subject.name == "say")
|
||||
assert(subject.parameters[1] == '"Test 6"')
|
||||
|
||||
subject = script.events["test"].statements[1].statements[2]
|
||||
assert(subject is ESCCommand)
|
||||
assert(subject.name == "say")
|
||||
assert(subject.parameters[1] == "TEST:\"Test 7\"")
|
||||
|
||||
return true
|
||||
|
||||
|
||||
func _test_conditions() -> bool:
|
||||
var esc = """
|
||||
:test
|
||||
say player "Test" [flag]
|
||||
say player "Test" [flag1,flag2]
|
||||
say player "Test" [!flag]
|
||||
say player "Test" [i/flag]
|
||||
say player "Test" [i/flag,flag]
|
||||
say player "Test" [i/flag,flag,!flag2]
|
||||
say player "Test" [eq flag 3]
|
||||
say player "Test" [eq flag 3,gt flag 5]
|
||||
say player "Test" [!eq flag 3]
|
||||
"""
|
||||
var script = escoria.esc_compiler.compile(esc.split("\n"))
|
||||
|
||||
var subject = script.events["test"].statements[0]
|
||||
assert(subject is ESCCommand)
|
||||
assert(subject.conditions.size() == 1)
|
||||
|
||||
subject = script.events["test"].statements[0].conditions[0]
|
||||
assert(subject.flag == "flag")
|
||||
assert(not subject.negated)
|
||||
assert(not subject.inventory)
|
||||
assert(subject.comparison == ESCCondition.COMPARISON_NONE)
|
||||
|
||||
subject = script.events["test"].statements[1].conditions
|
||||
assert(subject.size() == 2)
|
||||
assert(subject[0].flag == "flag1")
|
||||
assert(subject[1].flag == "flag2")
|
||||
|
||||
subject = script.events["test"].statements[2].conditions
|
||||
assert(subject.size() == 1)
|
||||
assert(subject[0].flag == "flag")
|
||||
assert(subject[0].negated)
|
||||
|
||||
subject = script.events["test"].statements[3].conditions
|
||||
assert(subject.size() == 1)
|
||||
assert(subject[0].flag == "flag")
|
||||
assert(subject[0].inventory)
|
||||
|
||||
subject = script.events["test"].statements[4].conditions
|
||||
assert(subject.size() == 2)
|
||||
assert(subject[0].flag == "flag")
|
||||
assert(subject[0].inventory)
|
||||
assert(subject[1].flag == "flag")
|
||||
assert(not subject[1].inventory)
|
||||
|
||||
subject = script.events["test"].statements[5].conditions
|
||||
assert(subject.size() == 3)
|
||||
assert(subject[0].flag == "flag")
|
||||
assert(subject[0].inventory)
|
||||
assert(subject[1].flag == "flag")
|
||||
assert(not subject[1].inventory)
|
||||
assert(subject[2].flag == "flag2")
|
||||
assert(not subject[2].inventory)
|
||||
assert(subject[2].negated)
|
||||
|
||||
subject = script.events["test"].statements[6].conditions
|
||||
assert(subject.size() == 1)
|
||||
assert(subject[0].flag == "flag")
|
||||
assert(subject[0].comparison == ESCCondition.COMPARISON_EQ)
|
||||
assert(subject[0].comparison_value == 3)
|
||||
|
||||
subject = script.events["test"].statements[7].conditions
|
||||
assert(subject.size() == 2)
|
||||
assert(subject[0].flag == "flag")
|
||||
assert(subject[0].comparison == ESCCondition.COMPARISON_EQ)
|
||||
assert(subject[0].comparison_value == 3)
|
||||
assert(subject[1].flag == "flag")
|
||||
assert(subject[1].comparison == ESCCondition.COMPARISON_GT)
|
||||
assert(subject[1].comparison_value == 5)
|
||||
|
||||
subject = script.events["test"].statements[8].conditions
|
||||
assert(subject.size() == 1)
|
||||
assert(subject[0].flag == "flag")
|
||||
assert(subject[0].comparison == ESCCondition.COMPARISON_EQ)
|
||||
assert(subject[0].comparison_value == 3)
|
||||
assert(subject[0].negated)
|
||||
|
||||
return true
|
||||
|
||||
|
||||
func _test_event_flags() -> bool:
|
||||
var esc = """
|
||||
:test | TK
|
||||
:test2 | TK NO_TT
|
||||
:test3 | TK NO_TT NO_UI
|
||||
"""
|
||||
var script = escoria.esc_compiler.compile(esc.split("\n"))
|
||||
|
||||
var subject = script.events
|
||||
assert(subject.keys().size() == 3)
|
||||
assert("test" in subject.keys())
|
||||
assert("test2" in subject.keys())
|
||||
assert("test3" in subject.keys())
|
||||
|
||||
subject = script.events["test"]
|
||||
assert(subject.name == "test")
|
||||
assert(subject.flags & ESCEvent.FLAG_TK != 0)
|
||||
assert(subject.flags & ESCEvent.FLAG_NO_TT == 0)
|
||||
|
||||
subject = script.events["test2"]
|
||||
assert(subject.name == "test2")
|
||||
assert(subject.flags & ESCEvent.FLAG_TK != 0)
|
||||
assert(subject.flags & ESCEvent.FLAG_NO_TT != 0)
|
||||
|
||||
subject = script.events["test3"]
|
||||
assert(subject.name == "test3")
|
||||
assert(subject.flags & ESCEvent.FLAG_TK != 0)
|
||||
assert(subject.flags & ESCEvent.FLAG_NO_TT != 0)
|
||||
assert(subject.flags & ESCEvent.FLAG_NO_UI != 0)
|
||||
|
||||
return true
|
||||
|
||||
|
||||
func _test_dialog() -> bool:
|
||||
var esc = """
|
||||
:test
|
||||
?
|
||||
- "Option 1"
|
||||
say player "test"
|
||||
say player "testb"
|
||||
say player "testb?"
|
||||
- "Option 2" [flag]
|
||||
say player "test2"
|
||||
?
|
||||
- "Suboption 1"
|
||||
say player "test21"
|
||||
- "Suboption 2"
|
||||
say player "test22"
|
||||
!
|
||||
- "Option 3"
|
||||
>
|
||||
say player "test3"
|
||||
- TEST:"Option 4"
|
||||
say player "test4"
|
||||
!
|
||||
"""
|
||||
var script = escoria.esc_compiler.compile(esc.split("\n"))
|
||||
|
||||
var subject = script.events["test"].statements
|
||||
assert(subject.size() == 1)
|
||||
|
||||
assert(subject[0] is ESCDialog)
|
||||
assert(subject[0].options.size() == 4)
|
||||
|
||||
subject = script.events["test"].statements[0].options[0]
|
||||
assert(subject is ESCDialogOption)
|
||||
assert(subject.option == "Option 1")
|
||||
|
||||
subject = script.events["test"].statements[0].options[0].statements
|
||||
assert(subject.size() == 3)
|
||||
assert(subject[0] is ESCCommand)
|
||||
assert(subject[0].name == "say")
|
||||
assert(subject[0].parameters.size() == 2)
|
||||
assert(subject[1] is ESCCommand)
|
||||
assert(subject[1].name == "say")
|
||||
assert(subject[1].parameters.size() == 2)
|
||||
assert(subject[1].parameters[1] == '"testb"')
|
||||
assert(subject[2] is ESCCommand)
|
||||
assert(subject[2].name == "say")
|
||||
assert(subject[2].parameters.size() == 2)
|
||||
assert(subject[2].parameters[1] == '"testb?"')
|
||||
|
||||
subject = script.events["test"].statements[0].options[1]
|
||||
assert(subject is ESCDialogOption)
|
||||
assert(subject.option == "Option 2")
|
||||
assert(subject.conditions.size() == 1)
|
||||
assert(subject.conditions[0].flag == "flag")
|
||||
|
||||
subject = script.events["test"].statements[0].options[1].statements
|
||||
assert(subject.size() == 2)
|
||||
assert(subject[0] is ESCCommand)
|
||||
assert(subject[0].name == "say")
|
||||
assert(subject[0].parameters.size() == 2)
|
||||
|
||||
assert(subject[1] is ESCDialog)
|
||||
assert(subject[1].options.size() == 2)
|
||||
|
||||
subject = script.events["test"].statements[0].options[2]
|
||||
assert(subject is ESCDialogOption)
|
||||
assert(subject.option == "Option 3")
|
||||
|
||||
subject = script.events["test"].statements[0].options[2].statements
|
||||
assert(subject.size() == 1)
|
||||
assert(subject[0] is ESCGroup)
|
||||
assert(subject[0].statements.size() == 1)
|
||||
assert(subject[0].statements[0] is ESCCommand)
|
||||
assert(subject[0].statements[0].parameters.size() == 2)
|
||||
|
||||
subject = script.events["test"].statements[0].options[3]
|
||||
assert(subject is ESCDialogOption)
|
||||
assert(subject.option == "TEST")
|
||||
|
||||
return true
|
||||
|
||||
|
||||
func _on_BasicFunctionality_pressed():
|
||||
$VBoxContainer/VBoxContainer/BasicFunctionality.pressed = self._test_basic()
|
||||
|
||||
|
||||
func _on_Conditions_pressed():
|
||||
$VBoxContainer/VBoxContainer/Conditions.pressed = self._test_conditions()
|
||||
|
||||
|
||||
func _on_EventFlags_pressed():
|
||||
$VBoxContainer/VBoxContainer/EventFlags.pressed = self._test_event_flags()
|
||||
|
||||
|
||||
func _on_Dialog_pressed():
|
||||
$VBoxContainer/VBoxContainer/Dialog.pressed = self._test_dialog()
|
||||
@@ -1,58 +0,0 @@
|
||||
[gd_scene load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://addons/escoria-core/game/core-scripts/esc/_test/test_esc_compiler.gd" type="Script" id=1]
|
||||
|
||||
[node name="Testsuite" type="Control"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_right = 1.0
|
||||
margin_bottom = 1.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer"]
|
||||
margin_right = 1281.0
|
||||
margin_bottom = 172.0
|
||||
|
||||
[node name="BasicFunctionality" type="CheckButton" parent="VBoxContainer/VBoxContainer"]
|
||||
margin_right = 1281.0
|
||||
margin_bottom = 40.0
|
||||
text = "Basic Functionality"
|
||||
align = 1
|
||||
|
||||
[node name="Conditions" type="CheckButton" parent="VBoxContainer/VBoxContainer"]
|
||||
margin_top = 44.0
|
||||
margin_right = 1281.0
|
||||
margin_bottom = 84.0
|
||||
text = "Check conditions"
|
||||
align = 1
|
||||
|
||||
[node name="EventFlags" type="CheckButton" parent="VBoxContainer/VBoxContainer"]
|
||||
margin_top = 88.0
|
||||
margin_right = 1281.0
|
||||
margin_bottom = 128.0
|
||||
text = "Check event flags"
|
||||
align = 1
|
||||
|
||||
[node name="Dialog" type="CheckButton" parent="VBoxContainer/VBoxContainer"]
|
||||
margin_top = 132.0
|
||||
margin_right = 1281.0
|
||||
margin_bottom = 172.0
|
||||
text = "Check dialogs"
|
||||
align = 1
|
||||
|
||||
[connection signal="pressed" from="VBoxContainer/VBoxContainer/BasicFunctionality" to="." method="_on_BasicFunctionality_pressed"]
|
||||
[connection signal="pressed" from="VBoxContainer/VBoxContainer/Conditions" to="." method="_on_Conditions_pressed"]
|
||||
[connection signal="pressed" from="VBoxContainer/VBoxContainer/EventFlags" to="." method="_on_EventFlags_pressed"]
|
||||
[connection signal="pressed" from="VBoxContainer/VBoxContainer/Dialog" to="." method="_on_Dialog_pressed"]
|
||||
@@ -0,0 +1,27 @@
|
||||
# Base class for all migration version scripts. Extending scripts should be
|
||||
# named like the version they migrate the savegame to. (e.g. 1.0.0.gd, 1.0.1.gd)
|
||||
extends Object
|
||||
class_name ESCMigration
|
||||
|
||||
|
||||
var _savegame: ESCSaveGame
|
||||
|
||||
|
||||
# Set the savegame
|
||||
#
|
||||
# #### Parameters
|
||||
# - savegame: Savegame to modify
|
||||
func set_savegame(savegame: ESCSaveGame):
|
||||
_savegame = savegame
|
||||
|
||||
|
||||
# Get the savegame
|
||||
# **Returns** Savegame
|
||||
func get_savegame():
|
||||
return _savegame
|
||||
|
||||
|
||||
# Override this function in the version script with
|
||||
# the things that need to be applied to the savegame
|
||||
func migrate():
|
||||
pass
|
||||
@@ -0,0 +1,172 @@
|
||||
# Class that handles migrations between different game or escoria versions
|
||||
extends Object
|
||||
class_name ESCMigrationManager
|
||||
|
||||
|
||||
# Regular expression that matches a simple semver version string
|
||||
const VERSION_REGEX = "^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$"
|
||||
|
||||
|
||||
# Compiled regex
|
||||
var version_regex: RegEx
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
version_regex = RegEx.new()
|
||||
version_regex.compile(VERSION_REGEX)
|
||||
|
||||
|
||||
# Migrates the specified savegame from a specified version to another version
|
||||
# based on a directory of migration scripts.
|
||||
#
|
||||
# The migration manager searches for scripts from after the given version up
|
||||
# to the target version in this directory, loads them and applies the version.
|
||||
#
|
||||
# Each migration will return a modified version of the given savegame
|
||||
func migrate(
|
||||
savegame: ESCSaveGame,
|
||||
from: String,
|
||||
to: String,
|
||||
versions_directory: String
|
||||
) -> ESCSaveGame:
|
||||
escoria.logger.info("Migrating from version %s to %s" % [
|
||||
from,
|
||||
to
|
||||
])
|
||||
|
||||
var from_info = version_regex.search(from)
|
||||
var to_info = version_regex.search(to)
|
||||
|
||||
var wrong_version: bool = false
|
||||
if from_info.get_string("major") > to_info.get_string("major"):
|
||||
wrong_version = true
|
||||
elif from_info.get_string("major") == to_info.get_string("major") and\
|
||||
from_info.get_string("minor") > to_info.get_string("minor"):
|
||||
wrong_version = true
|
||||
elif from_info.get_string("major") == to_info.get_string("major") and\
|
||||
from_info.get_string("minor") == to_info.get_string("minor") and\
|
||||
from_info.get_string("patch") > to_info.get_string("patch"):
|
||||
wrong_version = true
|
||||
|
||||
if wrong_version:
|
||||
escoria.logger.report_errors(
|
||||
"esc_migration_manager:migrate",
|
||||
[
|
||||
"Can not migrate savegame from version %s to version %s" % [
|
||||
from,
|
||||
to
|
||||
]
|
||||
]
|
||||
)
|
||||
|
||||
var versions = _find_versions(versions_directory, from, to)
|
||||
versions.sort_custom(self, "_compare_version")
|
||||
if versions[0].get_file().get_basename() == from:
|
||||
versions.pop_front()
|
||||
|
||||
for version in versions:
|
||||
var migration_script = load(version).new()
|
||||
if not migration_script is ESCMigration:
|
||||
escoria.logger.report_errors(
|
||||
"esc_migration_manager:migrate",
|
||||
[
|
||||
"File %s is not a valid migration script" % version
|
||||
]
|
||||
)
|
||||
escoria.logger.debug("Migrating using %s" % version)
|
||||
(migration_script as ESCMigration).set_savegame(savegame)
|
||||
(migration_script as ESCMigration).migrate()
|
||||
savegame = (migration_script as ESCMigration).get_savegame()
|
||||
|
||||
return savegame
|
||||
|
||||
|
||||
# Find all fitting version scripts between the given versions in a directory
|
||||
# and all its subdirectories
|
||||
#
|
||||
# #### Parameters
|
||||
# - directory: Directory to search in
|
||||
# - from: Start version to check
|
||||
# - to: End version to check
|
||||
# **Returns** A list of version scripts
|
||||
func _find_versions(directory: String, from: String, to: String) -> Array:
|
||||
escoria.logger.trace("Searching directory %s" % directory)
|
||||
var versions = []
|
||||
var dir = Directory.new()
|
||||
dir.open(directory)
|
||||
dir.list_dir_begin(true, true)
|
||||
var file_name = dir.get_next()
|
||||
while file_name != "":
|
||||
var version = file_name.get_basename()
|
||||
var regex_result = version_regex.search(version)
|
||||
if dir.current_is_dir():
|
||||
versions += _find_versions(
|
||||
directory.plus_file(file_name),
|
||||
from,
|
||||
to
|
||||
)
|
||||
elif regex_result and _version_between(version, from, to):
|
||||
escoria.logger.trace("Found fitting migration script %s" % version)
|
||||
versions.append(
|
||||
directory.plus_file(file_name)
|
||||
)
|
||||
file_name = dir.get_next()
|
||||
return versions
|
||||
|
||||
|
||||
# Check, whether the given version is >= from and <= to
|
||||
#
|
||||
# #### Parameters
|
||||
# - version: Version to check
|
||||
# - from: Start version
|
||||
# - to: End version
|
||||
# **Returns** Whether the version matches
|
||||
func _version_between(version: String, from: String, to: String) -> bool:
|
||||
var version_info = version_regex.search(version)
|
||||
var from_info = version_regex.search(from)
|
||||
var to_info = version_regex.search(to)
|
||||
|
||||
if from_info.get_string("major") < version_info.get_string("major") and \
|
||||
version_info.get_string("major") < to_info.get_string("major"):
|
||||
return true
|
||||
elif from_info.get_string("major") == version_info.get_string("major") and \
|
||||
from_info.get_string("minor") < version_info.get_string("minor"):
|
||||
return true
|
||||
elif from_info.get_string("major") == version_info.get_string("major") and \
|
||||
from_info.get_string("minor") == \
|
||||
version_info.get_string("minor") and \
|
||||
from_info.get_string("patch") < version_info.get_string("patch"):
|
||||
return true
|
||||
elif to_info.get_string("major") == version_info.get_string("major") and \
|
||||
to_info.get_string("minor") > version_info.get_string("minor"):
|
||||
return true
|
||||
elif to_info.get_string("major") == version_info.get_string("major") and \
|
||||
to_info.get_string("minor") == version_info.get_string("minor") and\
|
||||
to_info.get_string("patch") > version_info.get_string("patch"):
|
||||
return true
|
||||
|
||||
return false
|
||||
|
||||
|
||||
# Compare to version strings
|
||||
#
|
||||
# #### Parameters
|
||||
# - version_a: First version to compare
|
||||
# - version_b: Second version to compare
|
||||
# **Returns** true when version_b should be sorted after version_a
|
||||
func _compare_version(version_a: String, version_b: String) -> bool:
|
||||
var a_info = version_regex.search(version_a.get_file().get_basename())
|
||||
var b_info = version_regex.search(version_b.get_file().get_basename())
|
||||
|
||||
if a_info.get_string("major") < b_info.get_string("major"):
|
||||
return true
|
||||
elif a_info.get_string("major") == b_info.get_string("major") and \
|
||||
a_info.get_string("minor") < b_info.get_string("minor"):
|
||||
return true
|
||||
elif a_info.get_string("major") == b_info.get_string("major") and \
|
||||
a_info.get_string("minor") == b_info.get_string("minor") and \
|
||||
a_info.get_string("patch") < b_info.get_string("patch"):
|
||||
return true
|
||||
|
||||
return false
|
||||
|
||||
@@ -174,7 +174,39 @@ func load_game(id: int):
|
||||
"esc_save_manager.gd:load_game()",
|
||||
["Loading savegame %s" % str(id)])
|
||||
|
||||
var save_game: Resource = ResourceLoader.load(save_file_path)
|
||||
var save_game: ESCSaveGame = ResourceLoader.load(save_file_path)
|
||||
|
||||
var plugin_config = ConfigFile.new()
|
||||
plugin_config.load("res://addons/escoria-core/plugin.cfg")
|
||||
var escoria_version = plugin_config.get_value("plugin", "version")
|
||||
|
||||
# Migrate savegame through escoria versions
|
||||
|
||||
if escoria_version != save_game.escoria_version:
|
||||
var migration_manager: ESCMigrationManager = ESCMigrationManager.new()
|
||||
save_game = migration_manager.migrate(
|
||||
save_game,
|
||||
save_game.escoria_version,
|
||||
escoria_version,
|
||||
"res://addons/escoria-core/game/core-scripts/migrations/versions"
|
||||
)
|
||||
|
||||
# Migrate savegame through game versions
|
||||
|
||||
if ProjectSettings.get_setting("escoria/main/game_version") != \
|
||||
save_game.game_version and \
|
||||
ProjectSettings.get_setting(
|
||||
"escoria/main/game_migration_path"
|
||||
) != "":
|
||||
var migration_manager: ESCMigrationManager = ESCMigrationManager.new()
|
||||
save_game = migration_manager.migrate(
|
||||
save_game,
|
||||
save_game.game_version,
|
||||
ProjectSettings.get_setting("escoria/main/game_version"),
|
||||
ProjectSettings.get_setting(
|
||||
"escoria/main/game_migration_path"
|
||||
)
|
||||
)
|
||||
|
||||
escoria.event_manager.interrupt_running_event()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user