# 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() edge.target = _build_node(evo) for det in evo["evolution_details"]: edge.conditions.append(_build_condition(det)) node.evolves_to.append(edge) return node func _build_condition(det : Dictionary) -> EvolutionCondition: var c := EvolutionCondition.new() c.trigger = det["trigger"]["name"] if det["trigger"] != null else "" c.min_level = int(det["min_level"]) if det["min_level"] != null else 0 c.item = det["item"]["name"] if det["item"] != null else "" c.held_item = det["held_item"]["name"] if det["held_item"] != null else "" c.known_move = det["known_move"]["name"] if det["known_move"] != null else "" c.known_move_type = det["known_move_type"]["name"] if det["known_move_type"] != null else "" c.min_happiness = int(det["min_happiness"]) if det["min_happiness"] != null else 0 c.min_beauty = int(det["min_beauty"]) if det["min_beauty"] != null else 0 c.min_affection = int(det["min_affection"]) if det["min_affection"] != null else 0 c.time_of_day = String(det["time_of_day"]) if det["time_of_day"] != null and det["time_of_day"] != "" else "" c.location = det["location"]["name"] if det["location"] != null else "" c.trade_species = det["trade_species"]["name"] if det["trade_species"] != null else "" c.party_species = det["party_species"]["name"] if det["party_species"] != null else "" c.party_type = det["party_type"]["name"] if det["party_type"] != null else "" c.relative_physical_stats = int(det["relative_physical_stats"]) if det["relative_physical_stats"] != null else 0 c.needs_overworld_rain = det["needs_overworld_rain"] c.turn_upside_down = det["turn_upside_down"] c.gender = int(det["gender"]) if det["gender"] != null else -1 return c