53 lines
2.1 KiB
GDScript
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
|