Update Currency for Player Object and UI

You can use the new Callable to update the Player Object...

Store.gd

var player

func init():
    self.player = $'../../'.get_node("Player")

func _on_purchase():
    self.player.data.currency.copper -= $Item/Cost.text.to_init()
    # Create a Callable to the Remote Player.gd _on_currency_changed function
    var _on_currency_changed = Callable(self.player, "_on_currency_changed") 
    _on_currency_changed.call() # <-- Call the Callable

...and then use a signal to notify all subscribers (observers) connected to that signal when something is updated...

Player.gd

var player_id
var data

# Create a Signal for Subscribers to Know when the Player's currency has changed
signal currency_changed 

func init():
    var players_data = PlayerData.load_savegame("user://players_db.json")
    
    self.data = players_data.players[self.player_id]
    self.calculate_currency()
    
func calculate_currency():
    var currency = self.data.currency
    
    while (currency.copper >= 100):
        currency.silver += 1
        currency.copper -= 100
        
    while (currency.silver >= 100):
        currency.gold += 1
        currency.silver -= 100
        
func _on_currency_changed(): # <-- This is remotely called by the Store.gd
    self.calculate_currency()
    # Emit to all subscribers that the Player's currency has changed and needs updated
    self.emit_signal("currency_changed") 

...such as a Currency UI...

Currency.gd

Last updated