# editor/evolution_importer.gd @tool class_name PokeApiEvolutionImporter extends RefCounted var _client : PokeApiClient var _overwrite : bool var _cache : Dictionary = {} # id de chaîne -> EvolutionNode, pour ce run func _init(client : PokeApiClient, overwrite : bool) -> void: _client = client _overwrite = overwrite DirAccess.make_dir_recursive_absolute(PokeApiSettings.evolution_dir()) ## Retourne la racine de la chaîne (déjà sauvegardée sur disque au retour). func get_or_build(chain_url : String) -> EvolutionNode: var chain_id := int(String(chain_url).trim_suffix("/").get_file()) if _cache.has(chain_id): return _cache[chain_id] var path := PokeApiSettings.evolution_dir() + str(chain_id) + ".tres" if !_overwrite and ResourceLoader.exists(path): var existing := load(path) as EvolutionNode _cache[chain_id] = existing return existing var j = await _client.get_json(chain_url) if j == null: return null var root := _build_node(j["chain"]) ResourceSaver.save(root, path) _cache[chain_id] = root return root func _build_node(link : Dictionary) -> EvolutionNode: var node := EvolutionNode.new() node.species_name = link["species"]["name"] for evo in link["evolves_to"]: var edge := EvolutionEdge.new() var details : Array = evo["evolution_details"] if !details.is_empty(): var det : Dictionary = details[0] # première méthode si plusieurs sont possibles edge.trigger = det["trigger"]["name"] if det["trigger"] != null else "" edge.min_level = int(det["min_level"]) if det["min_level"] != null else 0 edge.item = det["item"]["name"] if det["item"] != null else "" edge.held_item = det["held_item"]["name"] if det["held_item"] != null else "" edge.known_move = det["known_move"]["name"] if det["known_move"] != null else "" edge.min_happiness = int(det["min_happiness"]) if det["min_happiness"] != null else 0 edge.time_of_day = String(det["time_of_day"]) if det["time_of_day"] != null else "" edge.trade_species = det["trade_species"]["name"] if det["trade_species"] != null else "" edge.target = _build_node(evo) node.evolves_to.append(edge) return node