Skip to content

Commit

Permalink
Merge pull request #33 from Sinetheta/seed
Browse files Browse the repository at this point in the history
Add project seed task
  • Loading branch information
Sinetheta authored Apr 24, 2023
2 parents e955a84 + 7cc742b commit 76e4bda
Show file tree
Hide file tree
Showing 33 changed files with 450,121 additions and 263,643 deletions.
15 changes: 8 additions & 7 deletions app/api/batch/add-info-icons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,15 @@ import { ImageSource, BuildableElement, BuildMenuCategory, BuildMenuItem, BSprit
import { InfoIcon, BlueprintItemInfo } from '../../../lib/src/blueprint/blueprint-item-info';


export class AddInfoIcons
{
export class AddInfoIcons {


constructor() {
constructor(inputPath?: string) {

console.log('Running batch FixHtmlLabels')

// Read database
let databaseToFix = './assets/database/' + process.argv[2];
let databaseToFix = inputPath || './assets/database/' + process.argv[2];
console.log('Adding info icons srpite infos and sprite modifiers to ' + databaseToFix);


Expand Down Expand Up @@ -47,7 +46,7 @@ export class AddInfoIcons
for (let i = 0; i < spriteModifiersNames.length; i++) {
let spriteModifier = new BSpriteModifier();
spriteModifier.name = spriteModifiersNames[i];
spriteModifier.spriteInfoName = spriteModifiersNames[i];
spriteModifier.spriteInfoName = spriteModifiersNames[i];
spriteModifier.rotation = 0;
spriteModifier.translation = Vector2.zero();
spriteModifier.scale = Vector2.one();
Expand All @@ -73,5 +72,7 @@ export class AddInfoIcons
}
}

// npm run addInfoIcons -- database.json
new AddInfoIcons()
// Only execute this script if loaded directly with node
if (require.main === module) {
new AddInfoIcons();
}
38 changes: 38 additions & 0 deletions app/api/batch/database-massager.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import * as fs from 'fs';

import { BExport } from "../../../lib/index";

interface BuildMenuItem {
category: number;
buildingId: string;
}

interface BuildingTranslator {
buildMenuItems: {
from: BuildMenuItem,
to: BuildMenuItem
}[];
}

const readJson = (filePath: string) => JSON.parse(fs.readFileSync(filePath).toString());
const writeJson = (filePath: string, data: object) => fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
export const updateJsonFile = (filePath: string, mutator: Function) => writeJson(filePath, mutator(readJson(filePath)))

// Uses a list of "alterations" needed for the build menu items
// Each entry contains an optional from and to.
// No "to" present? Delete the menu item.
// No "from" present? TODO: new building?
// Both present? Update the buildingId accordingly.
export const renameBuildings = (database: BExport, instructionsPath: string) => {
const instructions = readJson(instructionsPath) as BuildingTranslator;
instructions.buildMenuItems.forEach(({ from, to }) => {
const finder = (b: BuildMenuItem) => b.buildingId == from.buildingId;
const menuItem = database.buildMenuItems.find(finder);
if (from && to) {
menuItem!.buildingId = to.buildingId;
} else if (from && !to) {
database.buildMenuItems.splice(database.buildMenuItems.findIndex(finder), 1);
}
});
return database
}
70 changes: 70 additions & 0 deletions app/api/batch/extract-export.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import * as fs from 'fs';
import {
copySync // fs.cpSync available in Node v16.7.0
} from 'fs-extra';
import path from 'path';
import AdmZip from 'adm-zip';
import { BExport } from "../../../lib/index";
import { FixHtmlLabels } from "./fix-html-labels";
import { AddInfoIcons } from './add-info-icons';
import { GenerateIcons } from './generate-icons';
import { GenerateGroups } from './generate-groups';
import { GenerateWhite } from './generate-white';
import { GenerateRepack } from './generate-repack';
import { renameBuildings, updateJsonFile } from './database-massager';


const projectRoot = path.join(__dirname, '../../../../');
// Transform project relative path to absolute paths
const absolutePath = (projectPathFromRoot: string) => path.join(projectRoot, projectPathFromRoot);
const databasePath = absolutePath('export/database/database.json');
// Clean working export dir and unzip extract export.zip
const freshExport = () => {
fs.rmdirSync(absolutePath('export'), { recursive: true });
const zip = new AdmZip(absolutePath('export.zip'));
zip.extractAllTo(absolutePath('/'));
}

// Move newly extracted images to the backend images directory
const replaceImages = () => {
fs.rmdirSync(absolutePath('assets/images'), { recursive: true });
fs.renameSync(absolutePath('export/images'), absolutePath('assets/images'))
copySync(absolutePath('assets/manual'), absolutePath('assets/images'));
}

const generateDatabase = () => {
new FixHtmlLabels(databasePath);
new AddInfoIcons(databasePath);
updateJsonFile(databasePath, (database: BExport) => {
return renameBuildings(database, absolutePath('assets/manual-buildMenuRename.json'));
})
}

const processImages = () => {
new GenerateIcons(databasePath);
new GenerateGroups(databasePath);
new GenerateWhite(databasePath);
new GenerateRepack(databasePath);
}

const replaceDatabase = () => {
var zip = new AdmZip();
zip.addLocalFile(databasePath);
zip.writeZip('assets/database/database.zip');
fs.copyFileSync('assets/database/database.zip', 'frontend/src/assets/database/database.zip');
fs.copyFileSync('assets/database/database-repack.json', 'frontend/src/assets/database.json');
}

export const extractExport = () => {
freshExport();
replaceImages();
generateDatabase();
processImages();
replaceDatabase();
}

// Only execute this script if loaded directly with node
if (require.main === module) {
extractExport();
console.log('extractExport complete')
}
16 changes: 8 additions & 8 deletions app/api/batch/fix-html-labels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,20 @@ import { JSDOM } from 'jsdom'
import { ImageSource, BuildableElement, BuildMenuCategory, BuildMenuItem, BSpriteInfo, SpriteInfo, BSpriteModifier, SpriteModifier, BBuilding, OniItem, MdbBlueprint } from '../../../lib';


export class FixHtmlLabels
{
export class FixHtmlLabels {

dom: JSDOM

constructor() {
constructor(inputPath?: string) {

console.log('Running batch FixHtmlLabels')

this.dom = new JSDOM('<!DOCTYPE html>');

// Read database
let databaseToFix = './frontend/src/assets/database/' + process.argv[2];
const compatibilityPath = './frontend/src/assets/database/' + process.argv[2];
let databaseToFix = inputPath || compatibilityPath;
console.log('Removing html tags from ' + databaseToFix);


this.fixHtmlLabels(databaseToFix);
}

Expand Down Expand Up @@ -77,5 +75,7 @@ export class FixHtmlLabels
}
}

// npm run fixHtmlLabels -- database.json
new FixHtmlLabels()
// Only execute this script if loaded directly with node
if (require.main === module) {
new FixHtmlLabels();
}
27 changes: 14 additions & 13 deletions app/api/batch/generate-groups.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,8 @@ import { ImageSource, BuildableElement, BuildMenuCategory, BuildMenuItem, BSprit
import { PixiNodeUtil } from '../pixi-node-util';


export class GenerateGroups
{
constructor() {
export class GenerateGroups {
constructor(databasePath: string) {

console.log('Running batch GenerateGroups')

Expand All @@ -20,7 +19,7 @@ export class GenerateGroups
console.log(process.env.ENV_NAME);

// Read database
let rawdata = fs.readFileSync('./assets/database/database.json').toString();
let rawdata = fs.readFileSync(databasePath).toString();
let json = JSON.parse(rawdata);

ImageSource.init();
Expand Down Expand Up @@ -54,7 +53,7 @@ export class GenerateGroups

async generateGroups(database: BExport) {

let pixiNodeUtil = new PixiNodeUtil({forceCanvas: true, preserveDrawingBuffer: true});
let pixiNodeUtil = new PixiNodeUtil({ forceCanvas: true, preserveDrawingBuffer: true });
await pixiNodeUtil.initTextures();

for (let oniItem of OniItem.oniItems) {
Expand All @@ -70,8 +69,8 @@ export class GenerateGroups
if (spriteModifier == undefined) console.log(oniItem);

if (spriteModifier.tags.indexOf(SpriteTag.solid) != -1 &&
spriteModifier.tags.indexOf(SpriteTag.tileable) == -1 &&
spriteModifier.tags.indexOf(SpriteTag.connection) == -1)
spriteModifier.tags.indexOf(SpriteTag.tileable) == -1 &&
spriteModifier.tags.indexOf(SpriteTag.connection) == -1)
spritesToGroup.push(spriteModifier);
}

Expand Down Expand Up @@ -111,7 +110,7 @@ export class GenerateGroups

let texture = spriteInfo.getTexture(pixiNodeUtil);
let sprite = pixiNodeUtil.getSpriteFrom(texture);
sprite.anchor.set(spriteInfo.pivot.x, 1-spriteInfo.pivot.y);
sprite.anchor.set(spriteInfo.pivot.x, 1 - spriteInfo.pivot.y);
sprite.x = 0 + (spriteModifier.translation.x);
sprite.y = 0 - (spriteModifier.translation.y);
sprite.width = spriteInfo.realSize.x;
Expand Down Expand Up @@ -164,7 +163,7 @@ export class GenerateGroups
newSpriteInfo.uvSize = new Vector2(bounds.width, bounds.height);
database.uiSprites.push(newSpriteInfo);

let brt = pixiNodeUtil.getNewBaseRenderTexture({width: bounds.width, height: bounds.height});
let brt = pixiNodeUtil.getNewBaseRenderTexture({ width: bounds.width, height: bounds.height });
let rt = pixiNodeUtil.getNewRenderTexture(brt);

pixiNodeUtil.pixiApp.renderer.render(container, rt);
Expand All @@ -180,9 +179,9 @@ export class GenerateGroups
brt = null;
rt.destroy();
rt = null;
container.destroy({children: true});
container.destroy({ children: true });
container = null;
global.gc();
global.gc && global.gc();
}
else console.log(oniItem.id + ' should not be grouped')

Expand All @@ -195,5 +194,7 @@ export class GenerateGroups

}

// npm run generateGroups
new GenerateGroups()
// Only execute this script if loaded directly with node
if (require.main === module) {
new GenerateGroups('./assets/database/database.json');
}
26 changes: 12 additions & 14 deletions app/api/batch/generate-icons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,8 @@ import * as jimp from 'jimp';
import { ImageSource, BuildableElement, BuildMenuCategory, BuildMenuItem, BSpriteInfo, SpriteInfo, BSpriteModifier, SpriteModifier, BBuilding, OniItem } from '../../../lib';
import { PixiNodeUtil } from '../pixi-node-util';



export class GenerateIcons
{
constructor() {
export class GenerateIcons {
constructor(databasePath: string) {

console.log('Running batch GenerateIcons')

Expand All @@ -17,7 +14,7 @@ export class GenerateIcons
console.log(process.env.ENV_NAME);

// Read database
let rawdata = fs.readFileSync('./assets/database/database.json').toString();
let rawdata = fs.readFileSync(databasePath).toString();
let json = JSON.parse(rawdata);

ImageSource.init();
Expand Down Expand Up @@ -51,12 +48,11 @@ export class GenerateIcons

async generateIcons() {

let pixiNodeUtil = new PixiNodeUtil({forceCanvas: true, preserveDrawingBuffer: true});
let pixiNodeUtil = new PixiNodeUtil({ forceCanvas: true, preserveDrawingBuffer: true });
await pixiNodeUtil.initTextures();

console.log('start generating icons')
for (let k of SpriteInfo.keys.filter(s => SpriteInfo.getSpriteInfo(s).isIcon && !SpriteInfo.getSpriteInfo(s).isInputOutput))
{
for (let k of SpriteInfo.keys.filter(s => SpriteInfo.getSpriteInfo(s).isIcon && !SpriteInfo.getSpriteInfo(s).isInputOutput)) {
let uiSpriteInfo = SpriteInfo.getSpriteInfo(k);

// Only generate icons for sprite not in the texture atlases
Expand All @@ -83,7 +79,7 @@ export class GenerateIcons
if (texture.width > texture.height) uiSprite.y += (texture.width / 2 - texture.height / 2);
if (texture.height > texture.width) uiSprite.x += (texture.height / 2 - texture.width / 2);

let brt = pixiNodeUtil.getNewBaseRenderTexture({width: size, height: size});
let brt = pixiNodeUtil.getNewBaseRenderTexture({ width: size, height: size });
let rt = pixiNodeUtil.getNewRenderTexture(brt);

pixiNodeUtil.pixiApp.renderer.render(container, rt, true);
Expand All @@ -102,13 +98,15 @@ export class GenerateIcons
brt = null;
rt.destroy();
rt = null;
container.destroy({children: true});
container.destroy({ children: true });
container = null;
global.gc();
global.gc && global.gc();
}
console.log('done generating icons')
}
}

// npm run generateIcons
new GenerateIcons()
// Only execute this script if loaded directly with node
if (require.main === module) {
new GenerateIcons('./assets/database/database.json');
}
19 changes: 10 additions & 9 deletions app/api/batch/generate-repack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@ import { BinController } from './bin-packing/bin-controller';
import { PixiNodeUtil } from '../pixi-node-util';


export class GenerateRepack
{
constructor() {
export class GenerateRepack {
constructor(databasePath: string) {

console.log('Running batch GenerateRepack')

Expand All @@ -18,7 +17,7 @@ export class GenerateRepack
console.log(process.env.ENV_NAME);

// Read database
let rawdata = fs.readFileSync('./assets/database/database.json').toString();
let rawdata = fs.readFileSync(databasePath).toString();
let json = JSON.parse(rawdata);

ImageSource.init();
Expand Down Expand Up @@ -52,7 +51,7 @@ export class GenerateRepack

async generateRepack(database: BExport) {

let pixiNodeUtil = new PixiNodeUtil({forceCanvas: true, preserveDrawingBuffer: true});
let pixiNodeUtil = new PixiNodeUtil({ forceCanvas: true, preserveDrawingBuffer: true });
await pixiNodeUtil.initTextures();

// Tests bintrays
Expand Down Expand Up @@ -95,7 +94,7 @@ export class GenerateRepack
newSpriteInfos = newSpriteInfos.sort((i1, i2) => { return i2.uvSize.y - i1.uvSize.y; });

for (let spriteInfo of newSpriteInfos) {
let itemAdded = binController.addItem(spriteInfo.name, Vector2.cloneNullToZero(spriteInfo.uvSize), bleed);
let itemAdded = binController.addItem(spriteInfo.name, Vector2.cloneNullToZero(spriteInfo.uvSize), bleed);
if (itemAdded != null) {
spriteInfo.uvMin = Vector2.cloneNullToZero(itemAdded.uvStart);
spriteInfo.textureName = textureBaseString + itemAdded.trayIndex;
Expand All @@ -106,7 +105,7 @@ export class GenerateRepack
database.uiSprites = newSpriteInfos;

for (let trayIndex = 0; trayIndex < binController.binTrays.length; trayIndex++) {
let brt = pixiNodeUtil.getNewBaseRenderTexture({width: binController.binTrays[trayIndex].binSize.x, height: binController.binTrays[trayIndex].binSize.y});
let brt = pixiNodeUtil.getNewBaseRenderTexture({ width: binController.binTrays[trayIndex].binSize.x, height: binController.binTrays[trayIndex].binSize.y });
let rt = pixiNodeUtil.getNewRenderTexture(brt);

let graphics = pixiNodeUtil.getNewGraphics();
Expand Down Expand Up @@ -148,5 +147,7 @@ export class GenerateRepack
}
}

// npm run generateRepack
new GenerateRepack()
// Only execute this script if loaded directly with node
if (require.main === module) {
new GenerateRepack('./assets/database/database.json');
}
Loading

0 comments on commit 76e4bda

Please sign in to comment.