pokeapi_importer/editor/evolution_importer.gd

53 lines
2.1 KiB
GDScript

# 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