@cccode/create-fxr
Version:
An easy way to start using the @cccode/fxr library.
116 lines (90 loc) • 3.17 kB
JavaScript
import fs from 'node:fs/promises'
import path from 'node:path'
import { parseArgs } from 'node:util'
import child_process from 'node:child_process'
const { positionals } = parseArgs({
args: process.argv.slice(2),
strict: false
})
const cwd = process.cwd()
const targetDir = positionals[0] || 'fxr-project'
const root = path.resolve(path.join(cwd, targetDir))
const projectName = path.basename(root)
if (await fs.access(root).then(() => true).catch(() => false) && (await fs.readdir(root)).length > 0) {
console.clear()
console.error(`
\x1b[97m'${root}' already exists and it is not empty.\x1b[0m
Please specify an empty folder, or one that does not already exist when running the create command:
\x1b[90m>\x1b[0m \x1b[92mnpm create @cccode/fxr@latest example_folder_name\x1b[0m
`)
process.exit(1)
}
function exec(command) {
return new Promise((fulfil, reject) => {
child_process.exec(command, { cwd: root }, error => {
if (error) {
reject(error)
} else {
fulfil()
}
})
})
}
const reloadExample = /*js*/`
import { FXR, BasicNode, BillboardEx } from '@cccode/fxr'
import reloadFXR, { Weapon, Affinity } from 'fxr-reloader'
const fxr = new FXR(1)
fxr.root.nodes = [
new BasicNode([
new BillboardEx({
color1: [0, 1, 0.8, 1]
})
])
]
await reloadFXR(fxr, true, Weapon.ShortSword + Affinity.Standard)
`.trim() + '\n'
const saveAsExample = /*js*/`
import { FXR, Game, BasicNode, BillboardEx } from '@cccode/fxr'
const fxr = new FXR(1)
fxr.root.nodes = [
new BasicNode([
new BillboardEx({
color1: [0, 1, 0.8, 1]
})
])
]
await fxr.saveAs('example.fxr', Game.EldenRing)
`.trim() + '\n'
const installCmd = 'npm i fxr-reloader@latest @cccode/fxr@latest --omit=dev'
try {
await fs.mkdir(root, { recursive: true })
await fs.writeFile(path.join(root, 'package.json'), JSON.stringify({
name: projectName
.replace(/\s+/g, '-')
.replace(/[^a-z0-9-]/gi, '')
.toLowerCase()
.replace(/^[-]+|[-]+$/, '')
|| 'fxr-project',
version: '1.0.0',
type: 'module',
}, null, 2))
await exec(installCmd + ' > nul 2>&1')
await fs.writeFile(path.join(root, 'example_reload.js'), reloadExample)
await fs.writeFile(path.join(root, 'example_save.js'), saveAsExample)
await fs.writeFile(path.join(root, 'update.bat'), installCmd)
console.clear()
console.log(`
\x1b[97mProject folder '${projectName}' created!\x1b[0m
In this new folder, create new .js files with your code in them and run them
using this command with your .js file name from the project folder:
\x1b[90m>\x1b[0m \x1b[92mnode my_script.js\x1b[0m
See the two example scripts in the folder to get started.
\x1b[90m- The reloader example requires fxr-ws-reloader.dll to be installed
in Elden Ring: https://github.com/EvenTorset/fxr-ws-reloader\x1b[0m
If a new update to the FXR or reloader libraries comes out and you want to
update, double click on the update.bat file in the project folder.
`)
} catch (err) {
console.error(err)
}