pokeapi_importer/editor/move_importer.gd
2026-10-18 11:00:06 +02:00

82 lines
3.1 KiB
GDScript

# editor/move_importer.gd
@tool
class_name PokeApiMoveImporter
extends RefCounted
signal message(text : String)
var _client : PokeApiClient
var _overwrite : bool
var _languages : PackedStringArray
var _dir : String
func _init(client : PokeApiClient, overwrite : bool) -> void:
_client = client
_overwrite = overwrite
_languages = PokeApiSettings.languages()
_dir = PokeApiSettings.moves_dir()
func run() -> void:
DirAccess.make_dir_recursive_absolute(_dir)
var list = await _client.get_json(PokeApiClient.API + "move?limit=2000")
if list == null:
message.emit("[color=red]Impossible de récupérer la liste des capacités.[/color]")
return
var entries : Array = []
for r in list["results"]:
var id : int = int(String(r["url"]).trim_suffix("/").get_file())
if id < 10000: entries.append(r) # ignore les capacités "shadow" (Colosseum/XD)
message.emit("%d capacités à traiter..." % entries.size())
await _client.run_parallel(entries, _import_move)
message.emit("Capacités terminées.")
func _import_move(entry : Dictionary) -> void:
var path : String = _dir + entry["name"] + ".tres"
if !_overwrite and FileAccess.file_exists(path): return
var j = await _client.get_json(entry["url"])
if j == null:
message.emit("[color=red]Échec : %s[/color]" % entry["name"])
return
var m := MoveData.new()
m.id = PokeApiJson.get_int(j, "id")
m.api_name = PokeApiJson.get_str(j, "name", entry["name"])
m.names = PokeApiText.names(PokeApiJson.get_array(j, "names"), _languages)
m.descriptions = PokeApiText.flavors(PokeApiJson.get_array(j, "flavor_text_entries"), _languages)
m.type = PokeApiJson.get_dict_name(j, "type")
m.category = PokeApiJson.get_dict_name(j, "damage_class")
m.power = PokeApiJson.get_int(j, "power")
m.accuracy = PokeApiJson.get_int(j, "accuracy")
m.pp = PokeApiJson.get_int(j, "pp")
m.priority = PokeApiJson.get_int(j, "priority")
m.target = PokeApiJson.get_dict_name(j, "target")
m.effect_chance = PokeApiJson.get_int(j, "effect_chance")
# effets : PokeAPI les range dans "meta" (absent sur certaines capacites) et "stat_changes"
var meta := PokeApiJson.get_dict(j, "meta")
m.meta_category = PokeApiJson.get_dict_name(meta, "category")
m.ailment = PokeApiJson.get_dict_name(meta, "ailment", "none")
m.ailment_chance = PokeApiJson.get_int(meta, "ailment_chance")
m.flinch_chance = PokeApiJson.get_int(meta, "flinch_chance")
m.stat_chance = PokeApiJson.get_int(meta, "stat_chance")
m.min_hits = PokeApiJson.get_int(meta, "min_hits")
m.max_hits = PokeApiJson.get_int(meta, "max_hits")
m.min_turns = PokeApiJson.get_int(meta, "min_turns")
m.max_turns = PokeApiJson.get_int(meta, "max_turns")
m.drain = PokeApiJson.get_int(meta, "drain")
m.healing = PokeApiJson.get_int(meta, "healing")
m.crit_rate = PokeApiJson.get_int(meta, "crit_rate")
var changes : Array[StatChange] = []
for move_entry in PokeApiJson.get_array(j, "stat_changes"):
var sc := StatChange.new()
sc.stat = PokeApiJson.get_dict_name(move_entry, "stat")
sc.change = PokeApiJson.get_int(move_entry, "change")
if sc.stat != "" and sc.change != 0: changes.append(sc)
m.stat_changes = changes
ResourceSaver.save(m, path)