Hello !
En fouillant un peu dans les sources du jeu (décompiler
DofusInvoker.swf
avec
ffdec), on trouve rapidement les classes associées à ce fichier, à savoir:
com.ankamagames.dofus.logic.game.common.frames.AveragePricesFrame
com.ankamagames.jerakine.managers.StoreDataManager
com.ankamagames.jerakine.types.CustomSharedObject
Ce qui mène à la fonction responsable de la lecture du fichier:
private function getDataFromFile() : void
{
if(!this._file)
{
this._file = new File(COMMON_FOLDER + this._name + "." + DATAFILE_EXTENSION);
this._fileStream = new FileStream();
}
if(this._file.exists)
{
try
{
this._fileStream.objectEncoding = ObjectEncoding.AMF3;
this._fileStream.open(this._file,FileMode.READ);
this.data = this._fileStream.readObject();
this._fileStream.close();
}
catch(e:Error)
{
if(_fileStream)
{
_fileStream.close();
}
_log.error("Impossible d\'ouvrir le fichier " + _file.url);
if(throwException)
{
throw new CustomSharedObjectFileFormatError("Malformated file : " + _file.url);
}
}
}
if(!this.data)
{
this.data = new Object();
}
}
Ça utilise donc l'encodage AMF3.
Il reste plus qu'à trouver un outil qui permette de décoder ça (ou d'en faire un sois-même).
Après avoir essayé 2-3 truc j'ai eu du succès avec ce package node.js: libamf.
Le code est assez simple:
const fs = require('node:fs');
const path = require('node:path');
const libamf = require('libamf');
const itemAveragePricesPath = path.join(process.env.APPDATA, "Dofus/itemAveragePrices.dat");
const buf = fs.readFileSync(itemAveragePricesPath);
const data = libamf.deserialize(buf, libamf.ENCODING.AMF3);
console.log(data);