This is the way i come up with to overcome const persistence limitation. So you work with proxy class directly and then on player left you can bake it to const data class and save into weak_map.
SaveSystem
using { /Verse.org/Simulation }
using { Collections }
var SaveData : weak_map(player, player_save) = map{}
save_system := class(i_service, i_initializable, i_player_listener):
AutoSaveIntervalSec : float = 3.0
var ProxySaves : [agent]player_save_proxy = map{}
Initialize<override>() : void =
spawn:
Tick()
AddPlayer<override>(Agent : agent) : void =
if (Data := SaveData[Agent]):
if (set ProxySaves[Agent] = CreateProxyFromSave(Data)){}
else:
if (set ProxySaves[Agent] = player_save_proxy{}){}
RemovePlayer<override>(Agent : agent) : void =
SavePlayer(Agent)
set ProxySaves = ProxySaves.RemoveKey(Agent)
GetPlayerSave<public>(Agent : agent)<decides><transacts> : player_save =
SaveData[Agent]
SavePlayer<public>(Agent : agent) : void =
if (Baked := ProxySaves[Agent].Bake(), set SaveData[player[Agent]] = Baked){}
GetSessionId<public>(Agent : agent)<transacts><decides> : int =
return ProxySaves[Agent].SessionId
Tick<private>()<suspends> : void =
loop:
Sleep(AutoSaveIntervalSec)
for (Agent -> Proxy : ProxySaves, Baked := Proxy.Bake(), set SaveData[player[Agent]] = Baked){}
SaveScheme
player_save := class<persistable><final>:
SessionId : int
SaveVersion : int
Resources : [resource]float
QuestId : int
CompletedQuests : []logic
Achievements : []int
player_save_proxy := class:
var SessionId : int = 0
var SaveVersion : int = 0
var Resources : [resource]float = map{}
var QuestId : int = 0
var CompletedQuests : []logic = array{}
var Achievements : []int = array{}
Bake<public>()<transacts> : player_save =
player_save:
SessionId := SessionId
SaveVersion := SaveVersion
Resources := Resources
QuestId := QuestId
CompletedQuests := CompletedQuests
Achievements := Achievements
CreateProxyFromSave<constructor>(Save : player_save)<transacts> :=
player_save_proxy:
SessionId := Save.SessionId + 1
SaveVersion := Save.SaveVersion
Resources := Save.Resources
QuestId := Save.QuestId
CompletedQuests := Save.CompletedQuests
Achievements := Save.Achievements