Persistence Usage

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
7 Likes