VriskaSerket51 / eastward.js

Library for export/import Eastward assets.
https://www.npmjs.com/package/eastward.js
GNU General Public License v3.0
1 stars 1 forks source link
asset-extraction eastward import-export reverse-engineering video-game

eastward.js

Typescript library for imort/export assets of the video game Eastward.

No Browser Support

Installation into an existing project

To install eastward.js as a dependency of your Node.js project:

npm install eastward.js

eastward.js is made with TypeScript.

How to use

Command Line usage

npx eastward --help for help.

If you installed eastward.js globally,

npm install -g eastward.js

you can just use eastward --help

Usage: eastward [MODE] [OPTION]... [FILE]...
Mode and Option:
        extract         Extract all assets with types from game root directory to output directory. Without explicit --type option, all assets will be extracted.
                --root          game root directory
                -T, --type      asset type; eastward --help type to get list
                --out           output directory
        unzip           Extract data from .g files to output directory.
                --out           output directory
                [FILE]          .g files
        zip             Archive all data from root directory to output .g file.
                --root          root directory
                --out           output .g file
        hmg2png         Read hmg files and convert to png files.
                -r              Read recursive in directory
                --in            Input directory or file
                --out           Output directory or file
        png2hmg         Read png files and convert to hmg files.
                -r              Read recursive in directory
                --in            Input directory or file
                --out           Output directory or file
        json2msg                Read JSON files and convert to msgpack files.
                -r              Read recursive in directory
                --in            Input directory or file
                --out           Output directory or file
        inject          Read files from root and inject them into .g file.
                --root          Input directory
                --in            Input .g file
                --out           Output .g file

Source code usage

Example for extract some assets from the root game folder.

import { Eastward, registerAll } from "eastward.js";

const root = "C:/SteamLibrary/steamapps/common/Eastward";
const eastward = new Eastward({ root });
await eastward.init();
registerAll(eastward); // register all asset types

await eastward.extractTo("./extract");

console.log("extracting finished");

Or you can just extract some types of assets.

import { Eastward, LocalePackAsset } from "eastward.js";

const root = "C:/SteamLibrary/steamapps/common/Eastward";
const eastward = new Eastward({ root });
await eastward.init();
eastward.registerAssetLoader("locale_pack", LocalePackAsset);

await eastward.extractTo("./extract_locale_pack");

console.log("extracting locale_pack finished");

Example for extract certain assets from the root game folder.

import { Eastward, TextureAsset, registerAll } from "eastward.js";

const root = "C:/SteamLibrary/steamapps/common/Eastward";
const eastward = new Eastward({ root });
await eastward.init();
registerAll(eastward); // register all asset types

const texture = await eastward.loadAsset<TextureAsset>("texture/ui/icon/miniSam.png");
if (texture) {
  await texture.saveFile("./miniSam.png")
}

console.log("extracting finished");

Example for reading asset from archive.

import { GArchive } from "eastward.js";
import { writeFile } from "fs/promises";

const archive = new GArchive();
await archive.load(
  "C:/SteamLibrary/steamapps/common/Eastward/content/game/locale.g"
);

const data = await archive.getFileData("1fbba5dfab829f507358f58c1c2dc59a");
if (data == null) {
  process.exit(-1);
}
writeFile("./CH1.lua", data);

Example for writing asset to archive.

import { GArchive } from "eastward.js";
import { readFile } from "fs/promises";

const archive = new GArchive();
await archive.load(
  "C:/SteamLibrary/steamapps/common/Eastward/content/game/locale.g"
);
const data = await readFile("./CH1.lua");

await archive.setFileData("1fbba5dfab829f507358f58c1c2dc59a", data);

await archive.saveFile("./locale.g");