pokeapi_importer/editor/evolution_importer.gd

66 lines
2.9 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()
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