extends Node # Autoload : GameData signal selected_pokemon_changed signal battle_requested(sent : SentPokemon, target : Node) #emis par ThrowState : BattleLauncher s'y branche signal battle_started #emis par BattleLauncher au debut d'un combat (avant la pause du monde) signal battle_finished(outcome : int, target : Node) #emis par BattleLauncher (outcome = valeur de Battle.Outcome) signal save_started signal save_finished(success : bool) signal load_started signal load_finished(success : bool) var story_progress : int = 0 # 0 = début, 1 = après 1er badge, 2 = après 2e badge, etc. var player_team : PokemonTeam = PokemonTeam.new() var player_storage : PokemonStorage = PokemonStorage.new() var in_battle : bool = false #true pendant un combat (le monde est en pause) var selected_index : int = -1 #pokemon de l'equipe choisi pour etre envoye (HUD), -1 = aucun func give_pokemon(pokemon : PokemonInstance) -> PokemonStorage.ReceiveResult: #point d'entree unique pour obtenir un pokemon (starter, cadeau, capture...) : #equipe si elle a de la place, sinon PC. A l'appelant d'informer le joueur selon le resultat. return player_storage.receive_pokemon(player_team, pokemon) #---------- pokemon selectionne (a envoyer) ---------- #seuls les pokemon aptes au combat (non K.O.) peuvent etre selectionnes func get_selected_pokemon() -> PokemonInstance: validate_selection() return player_team.get_pokemon(selected_index) func validate_selection() -> void: #corrige la selection si le pokemon n'existe plus, est K.O., ou a change de place var p : PokemonInstance = player_team.get_pokemon(selected_index) if p != null and !p.is_fainted(): return _set_selected(player_team.get_first_able_index()) func select_pokemon(index : int) -> bool: var p : PokemonInstance = player_team.get_pokemon(index) if p == null or p.is_fainted(): return false _set_selected(index) return true func cycle_selection(direction : int) -> void: validate_selection() var able : Array[int] = [] for i in player_team.size(): if !player_team.get_pokemon(i).is_fainted(): able.append(i) if able.size() < 2: return var pos : int = able.find(selected_index) _set_selected(able[posmod(pos + direction, able.size())]) func _set_selected(index : int) -> void: if index == selected_index: return selected_index = index selected_pokemon_changed.emit() #---------- Système de Save ---------- func save() -> void: save_started.emit() await get_tree().process_frame var config := ConfigFile.new() config.set_value("progress", "story_progress", story_progress) config.set_value("team", "data", player_team.to_dict()) config.set_value("storage", "data", player_storage.to_dict()) var err := config.save("user://save.cfg") save_finished.emit(err == OK) func has_save() -> bool: return FileAccess.file_exists("user://save.cfg") func load_data() -> void: if not has_save(): load_finished.emit(false) return load_started.emit() await get_tree().process_frame var config := ConfigFile.new() var err : Error = config.load("user://save.cfg") var success := err == OK if success: story_progress = config.get_value("progress", "story_progress", 0) var team_data : Variant = config.get_value("team", "data", {}) player_team = PokemonTeam.from_dict(team_data) if team_data is Dictionary else PokemonTeam.new() var storage_data : Variant = config.get_value("storage", "data", {}) player_storage = PokemonStorage.from_dict(storage_data) if storage_data is Dictionary else PokemonStorage.new() load_finished.emit(success)