mirror of
https://github.com/teoxoy/factorio-blueprint-editor.git
synced 2024-11-28 08:39:10 +02:00
update to PIXI v5.4.0-rc.3
make use of BASIS universal generate assets at build time - add new exporter package (removes the need for a backend) - move factorioData inside editor package
This commit is contained in:
parent
ed92acb864
commit
45d6d6ab85
2
.gitignore
vendored
2
.gitignore
vendored
@ -3,6 +3,8 @@ dist
|
||||
packages/website/tools/.fusebox
|
||||
packages/backend/data
|
||||
packages/backend/target
|
||||
packages/exporter/data
|
||||
packages/exporter/target
|
||||
packages/lua-runtime/tools/emsdk
|
||||
packages/lua-runtime/tools/cache
|
||||
!packages/lua-runtime/dist
|
||||
|
5
.vscode/settings.json
vendored
5
.vscode/settings.json
vendored
@ -9,5 +9,8 @@
|
||||
"packages/lua-runtime/dist": true,
|
||||
"packages/lua-runtime/vendor": true
|
||||
},
|
||||
"rust-analyzer.linkedProjects": ["./packages/backend/Cargo.toml"]
|
||||
"rust-analyzer.linkedProjects": [
|
||||
"./packages/backend/Cargo.toml",
|
||||
"./packages/exporter/Cargo.toml"
|
||||
]
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
"scripts": {
|
||||
"start:website": "yarn workspace @fbe/website run start",
|
||||
"start:backend": "cd ./packages/backend && systemfd --no-pid -s http::8888 -- cargo watch -w ./src -x \"run --features dev\"",
|
||||
"start:exporter": "cd ./packages/exporter && systemfd --no-pid -s http::8888 -- cargo watch -w ./src -x \"run --features dev\"",
|
||||
"build:website": "yarn workspace @fbe/website run build",
|
||||
"build:backend": "cd ./packages/backend && cargo build --release",
|
||||
"start": "concurrently \"yarn:start:backend\" \"yarn:start:website\"",
|
||||
|
@ -11,7 +11,7 @@
|
||||
"bugs": "https://github.com/Teoxoy/factorio-blueprint-editor/issues",
|
||||
"homepage": "https://github.com/Teoxoy/factorio-blueprint-editor",
|
||||
"dependencies": {
|
||||
"@fbe/factorio-data": "*",
|
||||
"@pixi/basis": "^5.4.0-rc.3",
|
||||
"ajv": "^6.12.2",
|
||||
"delaunator": "^4.0.1",
|
||||
"eventemitter3": "^4.0.4",
|
||||
@ -19,7 +19,7 @@
|
||||
"maxrects-packer": "^2.6.0",
|
||||
"pako": "^1.0.11",
|
||||
"pathfinding": "^0.4.18",
|
||||
"pixi.js": "^5.3.2"
|
||||
"pixi.js": "^5.4.0-rc.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/delaunator": "^3.0.0",
|
||||
|
@ -1,5 +1,8 @@
|
||||
import * as PIXI from 'pixi.js'
|
||||
import FD from '@fbe/factorio-data'
|
||||
import { BasisLoader } from '@pixi/basis'
|
||||
import basisTranscoderJS from '@pixi/basis/assets/basis_transcoder.js'
|
||||
import basisTranscoderWASM from '@pixi/basis/assets/basis_transcoder.wasm'
|
||||
import { loadData } from './core/factorioData'
|
||||
import G from './common/globals'
|
||||
import { Entity } from './core/Entity'
|
||||
import { Blueprint, oilOutpostSettings, IOilOutpostSettings } from './core/Blueprint'
|
||||
@ -11,9 +14,14 @@ import { initActions, registerAction } from './actions'
|
||||
|
||||
export class Editor {
|
||||
public async init(canvas: HTMLCanvasElement): Promise<void> {
|
||||
await fetch('./api/bundle')
|
||||
.then(res => res.json())
|
||||
.then(modules => FD.loadData(modules))
|
||||
await Promise.all([
|
||||
fetch(`${G.STATIC_URL}data.json`)
|
||||
.then(res => res.text())
|
||||
.then(modules => loadData(modules)),
|
||||
BasisLoader.loadTranscoder(basisTranscoderJS, basisTranscoderWASM),
|
||||
])
|
||||
|
||||
BasisLoader.TRANSCODER_WORKER_POOL_LIMIT = 2
|
||||
|
||||
PIXI.settings.MIPMAP_TEXTURES = PIXI.MIPMAP_MODES.ON
|
||||
PIXI.settings.ROUND_PIXELS = true
|
||||
@ -115,7 +123,7 @@ export class Editor {
|
||||
G.bp = bp
|
||||
|
||||
G.BPC = new BlueprintContainer(bp)
|
||||
await G.BPC.initBP()
|
||||
G.BPC.initBP()
|
||||
Dialog.closeAll()
|
||||
G.app.stage.addChildAt(G.BPC, i)
|
||||
last.destroy()
|
||||
|
@ -1,5 +1,5 @@
|
||||
import * as PIXI from 'pixi.js'
|
||||
import FD from '@fbe/factorio-data'
|
||||
import FD from '../core/factorioData'
|
||||
import G from '../common/globals'
|
||||
import util from '../common/util'
|
||||
import { Entity } from '../core/Entity'
|
||||
|
@ -1,5 +1,5 @@
|
||||
import * as PIXI from 'pixi.js'
|
||||
import FD from '@fbe/factorio-data'
|
||||
import FD from '../core/factorioData'
|
||||
import G from '../common/globals'
|
||||
import F from './controls/functions'
|
||||
import { Dialog } from './controls/Dialog'
|
||||
@ -96,7 +96,7 @@ export class InventoryDialog extends Dialog {
|
||||
const button: Button = new Button(36, 36)
|
||||
button.position.set(itemColIndex * 38, itemRowIndex * 38)
|
||||
button.content = F.CreateIcon(item.name)
|
||||
button.on('pointerdown', (e: PIXI.interaction.InteractionEvent) => {
|
||||
button.on('pointerdown', (e: PIXI.InteractionEvent) => {
|
||||
e.stopPropagation()
|
||||
if (e.data.button === 0) {
|
||||
selectedCallBack(item.name)
|
||||
@ -135,9 +135,9 @@ export class InventoryDialog extends Dialog {
|
||||
const button = new Button(68, 68, 3)
|
||||
button.active = groupIndex === 0
|
||||
button.position.set(groupIndex * 70, 0)
|
||||
button.content = F.CreateIcon(group.name)
|
||||
button.content = F.CreateIcon(group.name, group.name === 'creative' ? 32 : 64)
|
||||
button.data = inventoryGroupItems
|
||||
button.on('pointerdown', (e: PIXI.interaction.InteractionEvent) => {
|
||||
button.on('pointerdown', (e: PIXI.InteractionEvent) => {
|
||||
if (e.data.button === 0) {
|
||||
if (!button.active) {
|
||||
for (const inventoryGroup of this.m_InventoryGroups
|
||||
|
@ -89,7 +89,7 @@ export class QuickbarPanel extends Panel {
|
||||
quickbarSlot.assignItem(itemNames[r * 10 + i])
|
||||
}
|
||||
|
||||
quickbarSlot.on('pointerdown', (e: PIXI.interaction.InteractionEvent) => {
|
||||
quickbarSlot.on('pointerdown', (e: PIXI.InteractionEvent) => {
|
||||
// Use Case 1: Left Click & Slot=Empty & Mouse=Painting >> Assign Mouse Item to Slot
|
||||
// Use Case 2: Left Click & Slot=Item & Mouse=Painting >> Assign Slot Item to Mouse
|
||||
// Use Case 3: Left Click & Slot=Empty & Mouse=Empty >> Assign Slot Item to Selected Inv item
|
||||
|
@ -52,16 +52,13 @@ export class UIContainer extends PIXI.Container {
|
||||
}
|
||||
}
|
||||
|
||||
public async createInventory(
|
||||
public createInventory(
|
||||
title?: string,
|
||||
itemsFilter?: string[],
|
||||
selectedCallBack?: (selectedItem: string) => void
|
||||
): Promise<void> {
|
||||
): void {
|
||||
const inv = new InventoryDialog(title, itemsFilter, selectedCallBack)
|
||||
G.BPC.cursor = 'wait'
|
||||
await G.sheet.awaitSprites()
|
||||
G.BPC.cursor = 'inherit'
|
||||
if (Dialog.isOpen(inv)) this.dialogsContainer.addChild(inv)
|
||||
this.dialogsContainer.addChild(inv)
|
||||
}
|
||||
|
||||
// public changeQuickbarRows(rows: number): void {
|
||||
|
@ -166,7 +166,7 @@ export class Slider extends PIXI.Container {
|
||||
}
|
||||
|
||||
/** Drag start event responder */
|
||||
private readonly onButtonDragStart = (event: PIXI.interaction.InteractionEvent): void => {
|
||||
private readonly onButtonDragStart = (event: PIXI.InteractionEvent): void => {
|
||||
if (!this.m_Dragging) {
|
||||
this.m_Dragging = true
|
||||
this.m_Dragpoint =
|
||||
@ -176,7 +176,7 @@ export class Slider extends PIXI.Container {
|
||||
}
|
||||
|
||||
/** Drag move event callback */
|
||||
private readonly onButtonDragMove = (event: PIXI.interaction.InteractionEvent): void => {
|
||||
private readonly onButtonDragMove = (event: PIXI.InteractionEvent): void => {
|
||||
if (this.m_Dragging) {
|
||||
const position: PIXI.Point = event.data.getLocalPosition(this.m_SliderButton.parent)
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
import * as PIXI from 'pixi.js'
|
||||
import FD, { IngredientOrResult, ColorWithAlpha, Item, Icon } from '@fbe/factorio-data'
|
||||
import FD, { IngredientOrResult, ColorWithAlpha, Item, Icon } from '../../core/factorioData'
|
||||
import { styles } from '../style'
|
||||
import G from '../../common/globals'
|
||||
|
||||
@ -141,6 +141,7 @@ function DrawControlFace(
|
||||
/** Create Icon from Sprite Item information */
|
||||
function CreateIcon(
|
||||
itemName: string,
|
||||
maxSize = 32,
|
||||
setAnchor = true,
|
||||
darkBackground = false
|
||||
): PIXI.DisplayObject {
|
||||
@ -162,20 +163,9 @@ function CreateIcon(
|
||||
const icon =
|
||||
darkBackground && data.dark_background_icon ? data.dark_background_icon : data.icon
|
||||
|
||||
let texture: PIXI.Texture
|
||||
|
||||
if (data.icon_mipmaps) {
|
||||
const targetSize = 32
|
||||
let xOffset = 0
|
||||
for (let i = Math.log2(data.icon_size); i > Math.log2(targetSize); i--) {
|
||||
xOffset += Math.pow(2, i)
|
||||
}
|
||||
texture = G.sheet.get(icon, xOffset, 0, targetSize, targetSize)
|
||||
} else {
|
||||
texture = G.sheet.get(icon)
|
||||
}
|
||||
|
||||
const texture = G.getTexture(icon, 0, 0, data.icon_size, data.icon_size)
|
||||
const sprite = new PIXI.Sprite(texture)
|
||||
sprite.scale.set(maxSize / data.icon_size)
|
||||
if (setAnchor) {
|
||||
sprite.anchor.set(0.5)
|
||||
}
|
||||
@ -226,7 +216,7 @@ function CreateIconWithAmount(
|
||||
name: string,
|
||||
amount: number
|
||||
): void {
|
||||
const icon: PIXI.DisplayObject = CreateIcon(name, false)
|
||||
const icon: PIXI.DisplayObject = CreateIcon(name, undefined, false)
|
||||
icon.position.set(x, y)
|
||||
host.addChild(icon)
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
import * as PIXI from 'pixi.js'
|
||||
import FD from '@fbe/factorio-data'
|
||||
import FD from '../../../core/factorioData'
|
||||
import G from '../../../common/globals'
|
||||
import F from '../../controls/functions'
|
||||
import { Slot } from '../../controls/Slot'
|
||||
@ -194,7 +194,7 @@ export class Filters extends PIXI.Container {
|
||||
}
|
||||
|
||||
/** Slot pointer down event handler */
|
||||
private readonly onSlotPointerDown = (e: PIXI.interaction.InteractionEvent): void => {
|
||||
private readonly onSlotPointerDown = (e: PIXI.InteractionEvent): void => {
|
||||
e.stopPropagation()
|
||||
const slot: Slot = e.target as Slot
|
||||
const index: number = slot.data as number
|
||||
|
@ -35,9 +35,7 @@ export class Modules extends PIXI.Container {
|
||||
const slot: Slot = new Slot()
|
||||
slot.position.set(slotIndex * 38, 0)
|
||||
slot.data = slotIndex
|
||||
slot.on('pointerdown', (e: PIXI.interaction.InteractionEvent) =>
|
||||
this.onSlotPointerDown(e)
|
||||
)
|
||||
slot.on('pointerdown', (e: PIXI.InteractionEvent) => this.onSlotPointerDown(e))
|
||||
if (this.m_Modules[slotIndex] !== undefined) {
|
||||
slot.content = F.CreateIcon(this.m_Modules[slotIndex])
|
||||
}
|
||||
@ -68,7 +66,7 @@ export class Modules extends PIXI.Container {
|
||||
}
|
||||
|
||||
/** Event handler for click on slot */
|
||||
private onSlotPointerDown(e: PIXI.interaction.InteractionEvent): void {
|
||||
private onSlotPointerDown(e: PIXI.InteractionEvent): void {
|
||||
e.stopPropagation()
|
||||
const slot: Slot = e.target as Slot
|
||||
const index: number = slot.data as number
|
||||
|
@ -1,3 +1,4 @@
|
||||
import * as PIXI from 'pixi.js'
|
||||
import G from '../../../common/globals'
|
||||
import { Entity } from '../../../core/Entity'
|
||||
import { Slot } from '../../controls/Slot'
|
||||
@ -13,7 +14,7 @@ export class Recipe extends Slot {
|
||||
|
||||
this.m_Entity = entity
|
||||
this.updateContent(this.m_Entity.recipe)
|
||||
this.on('pointerdown', (e: PIXI.interaction.InteractionEvent) => this.onSlotPointerDown(e))
|
||||
this.on('pointerdown', (e: PIXI.InteractionEvent) => this.onSlotPointerDown(e))
|
||||
|
||||
this.m_Entity.on('recipe', recipe => this.updateContent(recipe))
|
||||
}
|
||||
@ -31,7 +32,7 @@ export class Recipe extends Slot {
|
||||
}
|
||||
|
||||
/** Event handler for click on slot */
|
||||
private onSlotPointerDown(e: PIXI.interaction.InteractionEvent): void {
|
||||
private onSlotPointerDown(e: PIXI.InteractionEvent): void {
|
||||
e.stopPropagation()
|
||||
if (e.data.button === 0) {
|
||||
G.UI.createInventory('Select Recipe', this.m_Entity.acceptedRecipes, name => {
|
||||
|
@ -2,7 +2,6 @@ import * as PIXI from 'pixi.js'
|
||||
import { Blueprint } from '../core/Blueprint'
|
||||
import { UIContainer } from '../UI/UIContainer'
|
||||
import { BlueprintContainer } from '../containers/BlueprintContainer'
|
||||
import { DynamicSpritesheet } from '../containers/DynamicSpritesheet'
|
||||
|
||||
const hr = true
|
||||
const debug = false
|
||||
@ -11,21 +10,58 @@ let app: PIXI.Application
|
||||
let BPC: BlueprintContainer
|
||||
let UI: UIContainer
|
||||
let bp: Blueprint
|
||||
/** general purpose dynamic spritesheet */
|
||||
const sheet = new DynamicSpritesheet()
|
||||
/** tiles only dynamic spritesheet */
|
||||
const sheet2 = new DynamicSpritesheet({
|
||||
extrude: true,
|
||||
alpha: false,
|
||||
})
|
||||
|
||||
const started = new Map<string, Promise<PIXI.BaseTexture>>()
|
||||
const textureCache = new Map<string, PIXI.Texture>()
|
||||
|
||||
let count = 0
|
||||
let T: number
|
||||
|
||||
function getBT(path: string): Promise<PIXI.BaseTexture> {
|
||||
if (count === 0) {
|
||||
T = performance.now()
|
||||
}
|
||||
count += 1
|
||||
return new Promise(resolve => {
|
||||
const l = new PIXI.Loader()
|
||||
l.add(path, path).load(() => {
|
||||
resolve(PIXI.utils.BaseTextureCache[path])
|
||||
count -= 1
|
||||
if (count <= 0) {
|
||||
console.log('done', performance.now() - T)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function getTexture(path: string, x = 0, y = 0, w = 0, h = 0): PIXI.Texture {
|
||||
const key = `${STATIC_URL}${path.replace('.png', '.basis')}`
|
||||
const KK = `${key}-${x}-${y}-${w}-${h}`
|
||||
let t = textureCache.get(KK)
|
||||
if (t) return t
|
||||
t = new PIXI.Texture(PIXI.Texture.EMPTY.baseTexture)
|
||||
textureCache.set(KK, t)
|
||||
let prom = started.get(key)
|
||||
if (!prom) {
|
||||
prom = getBT(key)
|
||||
started.set(key, prom)
|
||||
}
|
||||
prom.then(bt => {
|
||||
t.baseTexture = bt
|
||||
t.frame = new PIXI.Rectangle(x, y, w || bt.width, h || bt.height)
|
||||
})
|
||||
return t
|
||||
}
|
||||
|
||||
const STATIC_URL = 'data/'
|
||||
|
||||
export default {
|
||||
STATIC_URL,
|
||||
debug,
|
||||
hr,
|
||||
BPC,
|
||||
UI,
|
||||
app,
|
||||
bp,
|
||||
sheet,
|
||||
sheet2,
|
||||
getTexture,
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
import * as PIXI from 'pixi.js'
|
||||
import FD from '@fbe/factorio-data'
|
||||
import FD from '../core/factorioData'
|
||||
import G from '../common/globals'
|
||||
import { Tile } from '../core/Tile'
|
||||
import { Entity } from '../core/Entity'
|
||||
@ -531,7 +531,7 @@ export class BlueprintContainer extends PIXI.Container {
|
||||
return grid
|
||||
}
|
||||
|
||||
public async initBP(): Promise<void> {
|
||||
public initBP(): void {
|
||||
// Render Bp
|
||||
for (const [, e] of this.bp.entities) {
|
||||
new EntityContainer(e, false)
|
||||
@ -580,8 +580,6 @@ export class BlueprintContainer extends PIXI.Container {
|
||||
this.bp.wireConnections.off('remove', onConnectionRemoved)
|
||||
})
|
||||
|
||||
await Promise.all([G.sheet.awaitSprites(), G.sheet2.awaitSprites()])
|
||||
|
||||
this.sortEntities()
|
||||
this.wiresContainer.updatePassiveWires()
|
||||
this.centerViewport()
|
||||
|
@ -29,7 +29,7 @@ interface IEntry {
|
||||
}
|
||||
|
||||
const getCanvas = (baseTexture: PIXI.BaseTexture): HTMLCanvasElement => {
|
||||
const resource = baseTexture.resource as PIXI.resources.CanvasResource
|
||||
const resource = baseTexture.resource as PIXI.CanvasResource
|
||||
return resource.source as HTMLCanvasElement
|
||||
}
|
||||
|
||||
@ -284,7 +284,7 @@ export class DynamicSpritesheet extends EventEmitter {
|
||||
baseTexture.resource.update()
|
||||
} else {
|
||||
oldBaseTextures.set(i, baseTexture)
|
||||
baseTexture = new PIXI.BaseTexture(new PIXI.resources.CanvasResource(canvas))
|
||||
baseTexture = new PIXI.BaseTexture(new PIXI.CanvasResource(canvas))
|
||||
this.baseTextures.set(i, baseTexture)
|
||||
}
|
||||
G.app.renderer.plugins.prepare.add(baseTexture)
|
||||
|
@ -1,5 +1,5 @@
|
||||
import * as PIXI from 'pixi.js'
|
||||
import FD, { CursorBoxType } from '@fbe/factorio-data'
|
||||
import FD, { CursorBoxType } from '../core/factorioData'
|
||||
import G from '../common/globals'
|
||||
import { Entity } from '../core/Entity'
|
||||
import { EntitySprite } from './EntitySprite'
|
||||
@ -26,9 +26,6 @@ export class EntityContainer {
|
||||
|
||||
private readonly m_Entity: Entity
|
||||
|
||||
/** mechanism to make sure that the result of the promise is still needed */
|
||||
private getPartsPromise: Promise<EntitySprite[]>
|
||||
|
||||
public constructor(entity: Entity, sort = true) {
|
||||
this.m_Entity = entity
|
||||
|
||||
@ -87,7 +84,6 @@ export class EntityContainer {
|
||||
const onEntityDestroy = (): void => {
|
||||
this.redrawSurroundingEntities()
|
||||
|
||||
this.getPartsPromise = null
|
||||
for (const s of this.entitySprites) {
|
||||
s.destroy()
|
||||
}
|
||||
@ -339,21 +335,14 @@ export class EntityContainer {
|
||||
}
|
||||
|
||||
public redraw(ignoreConnections?: boolean, sort?: boolean): void {
|
||||
const promise = EntitySprite.getPartsAsync(
|
||||
for (const s of this.entitySprites) {
|
||||
s.destroy()
|
||||
}
|
||||
this.entitySprites = EntitySprite.getParts(
|
||||
this.m_Entity,
|
||||
this.position,
|
||||
ignoreConnections ? undefined : G.bp.entityPositionGrid
|
||||
)
|
||||
this.getPartsPromise = promise
|
||||
|
||||
promise.then(sprites => {
|
||||
if (this.getPartsPromise !== promise) return
|
||||
|
||||
for (const s of this.entitySprites) {
|
||||
s.destroy()
|
||||
}
|
||||
this.entitySprites = sprites
|
||||
G.BPC.addEntitySprites(this.entitySprites, sort)
|
||||
})
|
||||
G.BPC.addEntitySprites(this.entitySprites, sort)
|
||||
}
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ export class EntitySprite extends PIXI.Sprite {
|
||||
for (let i = 0; i < spriteData.length; i++) {
|
||||
const data = spriteData[i]
|
||||
|
||||
const texture = G.sheet.get(data.filename, data.x, data.y, data.width, data.height)
|
||||
const texture = G.getTexture(data.filename, data.x, data.y, data.width, data.height)
|
||||
const sprite = new EntitySprite(texture, data, position)
|
||||
|
||||
if (data.filename.includes('circuit-connector')) {
|
||||
@ -160,15 +160,6 @@ export class EntitySprite extends PIXI.Sprite {
|
||||
return parts
|
||||
}
|
||||
|
||||
public static getPartsAsync(
|
||||
entity: IEntityData | Entity,
|
||||
position?: IPoint,
|
||||
positionGrid?: PositionGrid
|
||||
): Promise<EntitySprite[]> {
|
||||
const parts = EntitySprite.getParts(entity, position, positionGrid)
|
||||
return G.sheet.onAllLoaded(parts.map(s => s.texture)).then(() => parts)
|
||||
}
|
||||
|
||||
public static compareFn(a: EntitySprite, b: EntitySprite): number {
|
||||
const dZ = a.zIndex - b.zIndex
|
||||
if (dZ !== 0) return dZ
|
||||
|
@ -1,5 +1,5 @@
|
||||
import * as PIXI from 'pixi.js'
|
||||
import FD, { FluidBox, CursorBoxType, SpriteData } from '@fbe/factorio-data'
|
||||
import FD, { FluidBox, CursorBoxType, SpriteData } from '../core/factorioData'
|
||||
import F from '../UI/controls/functions'
|
||||
import G from '../common/globals'
|
||||
import util from '../common/util'
|
||||
@ -396,9 +396,11 @@ export class OverlayContainer extends PIXI.Container {
|
||||
itemName: string,
|
||||
position?: IPoint
|
||||
): void {
|
||||
const icon = F.CreateIcon(itemName, true, true)
|
||||
const icon = F.CreateIcon(itemName, undefined, true, true)
|
||||
const data = FD.utilitySprites.entity_info_dark_background
|
||||
const background = new PIXI.Sprite(G.sheet.get(data.filename))
|
||||
const background = new PIXI.Sprite(
|
||||
G.getTexture(data.filename, data.x, data.y, data.width, data.height)
|
||||
)
|
||||
background.anchor.set(0.5, 0.5)
|
||||
if (position) {
|
||||
icon.position.set(position.x, position.y)
|
||||
@ -425,7 +427,10 @@ export class OverlayContainer extends PIXI.Container {
|
||||
return FD.utilitySprites.fluid_indication_arrow_both_ways
|
||||
}
|
||||
}
|
||||
const arrow = new PIXI.Sprite(G.sheet.get(typeToPath(type).filename))
|
||||
const data = typeToPath(type)
|
||||
const arrow = new PIXI.Sprite(
|
||||
G.getTexture(data.filename, data.x, data.y, data.width, data.height)
|
||||
)
|
||||
arrow.anchor.set(0.5, 0.5)
|
||||
arrow.position.set(position.x, position.y)
|
||||
return arrow
|
||||
@ -481,7 +486,7 @@ export class OverlayContainer extends PIXI.Container {
|
||||
|
||||
if (size.x === 1 && size.y === 1) {
|
||||
const data = FD.utilitySprites.cursor_box[type][0].sprite
|
||||
const texture = G.sheet.get(data.filename, data.x, data.y, data.width, data.height)
|
||||
const texture = G.getTexture(data.filename, data.x, data.y, data.width, data.height)
|
||||
const s = new PIXI.Sprite(texture)
|
||||
s.anchor.set(0.5, 0.5)
|
||||
cursorBox.addChild(s)
|
||||
@ -496,7 +501,7 @@ export class OverlayContainer extends PIXI.Container {
|
||||
const data = (
|
||||
boxes.find(t => t.max_side_length > minSideLength) || boxes[boxes.length - 1]
|
||||
).sprite
|
||||
const texture = G.sheet.get(data.filename, data.x, data.y, data.width, data.height)
|
||||
const texture = G.getTexture(data.filename, data.x, data.y, data.width, data.height)
|
||||
|
||||
const c0 = new PIXI.Sprite(texture)
|
||||
const c1 = new PIXI.Sprite(texture)
|
||||
@ -562,7 +567,7 @@ export class OverlayContainer extends PIXI.Container {
|
||||
? FD.utilitySprites.underground_pipe_connection
|
||||
: fd.underground_sprite
|
||||
const s = new PIXI.Sprite(
|
||||
G.sheet.get(data.filename, data.x, data.y, data.width, data.height)
|
||||
G.getTexture(data.filename, data.x, data.y, data.width, data.height)
|
||||
)
|
||||
s.rotation = direction * Math.PI * 0.25
|
||||
if (data.scale) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
import * as PIXI from 'pixi.js'
|
||||
import FD from '@fbe/factorio-data'
|
||||
import FD from '../core/factorioData'
|
||||
import util from '../common/util'
|
||||
import { Entity } from '../core/Entity'
|
||||
import { EntitySprite } from './EntitySprite'
|
||||
@ -14,9 +14,6 @@ export class PaintEntityContainer extends PaintContainer {
|
||||
/** This is only a reference */
|
||||
private undergroundLine: PIXI.Container
|
||||
|
||||
/** mechanism to make sure that the result of the promise is still needed */
|
||||
private getPartsPromise: Promise<EntitySprite[]>
|
||||
|
||||
public constructor(bpc: BlueprintContainer, name: string, direction: number) {
|
||||
super(bpc, name)
|
||||
|
||||
@ -134,22 +131,13 @@ export class PaintEntityContainer extends PaintContainer {
|
||||
}
|
||||
|
||||
protected redraw(): void {
|
||||
this.bpc.cursor = 'wait'
|
||||
this.removeChildren()
|
||||
|
||||
const promise = EntitySprite.getPartsAsync({
|
||||
const sprites = EntitySprite.getParts({
|
||||
name: this.name,
|
||||
direction: this.directionType === 'input' ? this.direction : (this.direction + 4) % 8,
|
||||
directionType: this.directionType,
|
||||
})
|
||||
this.getPartsPromise = promise
|
||||
|
||||
promise.then(sprites => {
|
||||
if (this.getPartsPromise !== promise) return
|
||||
|
||||
this.addChild(...sprites)
|
||||
this.bpc.cursor = 'pointer'
|
||||
})
|
||||
this.addChild(...sprites)
|
||||
}
|
||||
|
||||
public moveAtCursor(): void {
|
||||
|
@ -1,16 +1,12 @@
|
||||
import FD from '@fbe/factorio-data'
|
||||
import FD from '../core/factorioData'
|
||||
import { Tile } from '../core/Tile'
|
||||
import { TileContainer } from './TileContainer'
|
||||
import { PaintContainer } from './PaintContainer'
|
||||
import { BlueprintContainer } from './BlueprintContainer'
|
||||
import { EntitySprite } from './EntitySprite'
|
||||
|
||||
export class PaintTileContainer extends PaintContainer {
|
||||
private static size = 2
|
||||
|
||||
/** mechanism to make sure that the result of the promise is still needed */
|
||||
private getPartsPromise: Promise<EntitySprite[]>
|
||||
|
||||
public constructor(bpc: BlueprintContainer, name: string) {
|
||||
super(bpc, name)
|
||||
|
||||
@ -72,22 +68,13 @@ export class PaintTileContainer extends PaintContainer {
|
||||
}
|
||||
|
||||
protected redraw(): void {
|
||||
this.bpc.cursor = 'wait'
|
||||
this.removeChildren()
|
||||
|
||||
const promise = TileContainer.generateSprites(
|
||||
const sprites = TileContainer.generateSprites(
|
||||
this.name,
|
||||
this.position,
|
||||
PaintTileContainer.getTilePositions()
|
||||
)
|
||||
this.getPartsPromise = promise
|
||||
|
||||
promise.then(sprites => {
|
||||
if (this.getPartsPromise !== promise) return
|
||||
|
||||
this.addChild(...sprites)
|
||||
this.bpc.cursor = 'pointer'
|
||||
})
|
||||
this.addChild(...sprites)
|
||||
}
|
||||
|
||||
public moveAtCursor(): void {
|
||||
|
@ -1,4 +1,4 @@
|
||||
import FD from '@fbe/factorio-data'
|
||||
import FD from '../core/factorioData'
|
||||
import G from '../common/globals'
|
||||
import { Tile } from '../core/Tile'
|
||||
import { EntitySprite } from './EntitySprite'
|
||||
@ -50,15 +50,7 @@ export class TileContainer {
|
||||
if (Math.sign(y) === -1) Y = (countY - Y) % countY
|
||||
}
|
||||
|
||||
const mainTexture = G.sheet2.get(filename, 0, 0, countX * width, countY * height)
|
||||
const texture = G.sheet2.getSubtexture(
|
||||
mainTexture,
|
||||
filename,
|
||||
X * width,
|
||||
Y * height,
|
||||
width,
|
||||
height
|
||||
)
|
||||
const texture = G.getTexture(filename, X * width, Y * height, width, height)
|
||||
|
||||
return new EntitySprite(
|
||||
texture,
|
||||
@ -79,13 +71,12 @@ export class TileContainer {
|
||||
name: string,
|
||||
position: IPoint,
|
||||
positions: IPoint[]
|
||||
): Promise<EntitySprite[]> {
|
||||
const parts = positions.map(p => {
|
||||
): EntitySprite[] {
|
||||
return positions.map(p => {
|
||||
const s = TileContainer.generateSprite(name, p.x + position.x, p.y + position.y)
|
||||
s.position.set(p.x * 32, p.y * 32)
|
||||
s.alpha = 0.5
|
||||
return s
|
||||
})
|
||||
return G.sheet2.onAllLoaded(parts.map(s => s.texture)).then(() => parts)
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
import * as PIXI from 'pixi.js'
|
||||
import FD from '@fbe/factorio-data'
|
||||
import FD from '../core/factorioData'
|
||||
import { VisualizationArea } from './VisualizationArea'
|
||||
|
||||
type Type = 'logistics0' | 'logistics1' | 'poles' | 'beacons' | 'drills'
|
||||
|
@ -1,5 +1,5 @@
|
||||
import * as PIXI from 'pixi.js'
|
||||
import FD from '@fbe/factorio-data'
|
||||
import FD from '../core/factorioData'
|
||||
import U from '../core/generators/util'
|
||||
import { Entity } from '../core/Entity'
|
||||
import { Blueprint } from '../core/Blueprint'
|
||||
|
@ -1,8 +1,8 @@
|
||||
import EventEmitter from 'eventemitter3'
|
||||
import * as PIXI from 'pixi.js'
|
||||
import FD from '@fbe/factorio-data'
|
||||
import G from '../common/globals'
|
||||
import util from '../common/util'
|
||||
import FD from './factorioData'
|
||||
import { Entity } from './Entity'
|
||||
import { WireConnections } from './WireConnections'
|
||||
import { PositionGrid } from './PositionGrid'
|
||||
|
@ -1,6 +1,6 @@
|
||||
import EventEmitter from 'eventemitter3'
|
||||
import FD, { Entity as FD_Entity, getModulesFor } from '@fbe/factorio-data'
|
||||
import util from '../common/util'
|
||||
import FD, { Entity as FD_Entity } from './factorioData'
|
||||
import { Blueprint } from './Blueprint'
|
||||
import { getBeltWireConnectionIndex } from './spriteDataBuilder'
|
||||
import U from './generators/util'
|
||||
@ -196,7 +196,7 @@ export class Entity extends EventEmitter {
|
||||
if (this.entityData.module_specification === undefined) return []
|
||||
|
||||
return (
|
||||
getModulesFor(this.name)
|
||||
FD.getModulesFor(this.name)
|
||||
// filter modules based on module limitation
|
||||
.filter(
|
||||
item =>
|
||||
|
@ -1,5 +1,5 @@
|
||||
import FD from '@fbe/factorio-data'
|
||||
import util from '../common/util'
|
||||
import FD from './factorioData'
|
||||
import { Blueprint } from './Blueprint'
|
||||
import { Entity } from './Entity'
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
import EventEmitter from 'eventemitter3'
|
||||
import FD from '@fbe/factorio-data'
|
||||
import FD from './factorioData'
|
||||
|
||||
export class Tile extends EventEmitter {
|
||||
private readonly _name: string
|
||||
|
@ -1,6 +1,6 @@
|
||||
import Ajv, { KeywordDefinition } from 'ajv'
|
||||
import pako from 'pako'
|
||||
import FD from '@fbe/factorio-data'
|
||||
import FD from './factorioData'
|
||||
import blueprintSchema from './blueprintSchema.json'
|
||||
import { Blueprint } from './Blueprint'
|
||||
import { Book } from './Book'
|
||||
@ -148,7 +148,7 @@ function getBlueprintOrBookFromSource(source: string): Promise<Blueprint | Book>
|
||||
reject(e)
|
||||
}
|
||||
}).then((url: URL) => {
|
||||
const corsProxy = './api/proxy?url='
|
||||
const corsProxy = 'https://api.allorigins.win/raw?url='
|
||||
|
||||
console.log(`Loading data from: ${url}`)
|
||||
const pathParts = url.pathname.slice(1).split('/')
|
||||
|
1275
packages/editor/src/core/factorioData.ts
Normal file
1275
packages/editor/src/core/factorioData.ts
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,4 @@
|
||||
import util from '../common/util'
|
||||
import FD, {
|
||||
Entity as FD_Entity,
|
||||
SpriteData,
|
||||
@ -15,8 +16,7 @@ import FD, {
|
||||
PipePictures,
|
||||
UndergroundBeltStructure,
|
||||
CircuitConnectorSprites,
|
||||
} from '@fbe/factorio-data'
|
||||
import util from '../common/util'
|
||||
} from './factorioData'
|
||||
import { PositionGrid } from './PositionGrid'
|
||||
import { Entity } from './Entity'
|
||||
|
||||
|
@ -10,9 +10,10 @@ import {
|
||||
exportKeybinds,
|
||||
} from './actions'
|
||||
import { Editor } from './Editor'
|
||||
import FD from './core/factorioData'
|
||||
|
||||
export * from './core/bpString'
|
||||
export { Editor, Book, Blueprint, GridPattern }
|
||||
export { Editor, Book, Blueprint, GridPattern, FD }
|
||||
export default {
|
||||
registerAction,
|
||||
callAction,
|
||||
|
2932
packages/exporter/Cargo.lock
generated
Normal file
2932
packages/exporter/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
32
packages/exporter/Cargo.toml
Normal file
32
packages/exporter/Cargo.toml
Normal file
@ -0,0 +1,32 @@
|
||||
[package]
|
||||
name = "factorio_data_exporter"
|
||||
version = "0.1.0"
|
||||
edition = "2018"
|
||||
|
||||
[profile.dev]
|
||||
opt-level = 2
|
||||
debug-assertions = true
|
||||
|
||||
[features]
|
||||
dev = ["dotenv", "listenfd"]
|
||||
|
||||
[dependencies]
|
||||
image = "0.23.8"
|
||||
actix-rt = "1.1.1"
|
||||
actix-web = "3.0.0-alpha.2"
|
||||
actix-http = "2.0.0-alpha.3"
|
||||
actix-files = "0.4.0"
|
||||
futures = "0.3.5"
|
||||
serde = { version = "1.0.114", features = ["derive"] }
|
||||
serde_json = "1.0.57"
|
||||
reqwest = { version = "0.10", features = ["json", "stream"] }
|
||||
tokio = { version = "0.2", features = ["full"] }
|
||||
regex = "1.3.9"
|
||||
globset = "0.4.5"
|
||||
async-recursion = "0.3.1"
|
||||
lazy_static = "1.4.0"
|
||||
async-compression = { version = "0.3.5", features = ["stream", "lzma"] }
|
||||
indicatif = "0.15.0"
|
||||
listenfd = { version = "0.3", optional = true }
|
||||
dotenv = { version = "0.15.0", optional = true }
|
||||
async-tar = "0.2.0"
|
BIN
packages/exporter/basisu
Normal file
BIN
packages/exporter/basisu
Normal file
Binary file not shown.
11
packages/exporter/src/export-data/control.lua
Normal file
11
packages/exporter/src/export-data/control.lua
Normal file
@ -0,0 +1,11 @@
|
||||
script.on_init(function()
|
||||
-- EXTRACT SERIALIZED DATA
|
||||
local l = tonumber(game.entity_prototypes["DATA"].localised_name)
|
||||
local serialized = ""
|
||||
for i = 1, l, 1 do
|
||||
serialized = serialized .. game.entity_prototypes[tostring(i)].localised_name
|
||||
end
|
||||
local data = load(serialized)()
|
||||
game.write_file('data.json', game.table_to_json(data), false, 0)
|
||||
error("!EXIT!")
|
||||
end)
|
626
packages/exporter/src/export-data/data-final-fixes.lua
Normal file
626
packages/exporter/src/export-data/data-final-fixes.lua
Normal file
@ -0,0 +1,626 @@
|
||||
-- start util functions
|
||||
local function table_merge(t1, t2)
|
||||
for k, v in pairs(t2) do
|
||||
t1[k] = v
|
||||
end
|
||||
end
|
||||
|
||||
local function list_iter(t)
|
||||
local i = 0
|
||||
local n = #t
|
||||
return function ()
|
||||
i = i + 1
|
||||
if i <= n then
|
||||
return t[i]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function list_includes(t, v)
|
||||
for value in list_iter(t) do
|
||||
if value == v then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
local function table_filter(t, blacklist)
|
||||
for key in pairs(t) do
|
||||
if list_includes(blacklist, key) then
|
||||
t[key] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function char_generator()
|
||||
local nextIndex = 0
|
||||
return function()
|
||||
local char = string.char(string.byte('a') + nextIndex)
|
||||
nextIndex = nextIndex + 1
|
||||
return char
|
||||
end
|
||||
end
|
||||
|
||||
local function deep_copy(obj, seen)
|
||||
-- Handle non-tables and previously-seen tables.
|
||||
if type(obj) ~= 'table' then return obj end
|
||||
if seen and seen[obj] then return seen[obj] end
|
||||
|
||||
-- New table; mark it as seen and copy recursively.
|
||||
local s = seen or {}
|
||||
local res = {}
|
||||
s[obj] = res
|
||||
for k, v in pairs(obj) do res[deep_copy(k, s)] = deep_copy(v, s) end
|
||||
return setmetatable(res, getmetatable(obj))
|
||||
end
|
||||
|
||||
-- end util functions
|
||||
|
||||
local locale = require('locale')
|
||||
|
||||
local function localise(obj, type)
|
||||
local function localiseTemplate(t)
|
||||
local template = locale[t[1]]
|
||||
local args = t[2]
|
||||
if args ~= nil then
|
||||
for i = 1, #args do
|
||||
template = template:gsub('__'..i..'__', locale[args[i]])
|
||||
end
|
||||
end
|
||||
return template
|
||||
end
|
||||
|
||||
if obj.localised_name ~= nil then
|
||||
obj.localised_name = localiseTemplate(obj.localised_name)
|
||||
else
|
||||
local str = locale[type..'-name.'..obj.name]
|
||||
if str ~= nil then
|
||||
obj.localised_name = str
|
||||
else
|
||||
obj.localised_name = obj.name:gsub('^%l', string.upper):gsub('-', ' ')
|
||||
end
|
||||
end
|
||||
|
||||
if obj.localised_description ~= nil then
|
||||
obj.localised_description = localiseTemplate(obj.localised_description)
|
||||
else
|
||||
local str = locale[type..'-description.'..obj.name]
|
||||
if str ~= nil then
|
||||
obj.localised_description = str
|
||||
end
|
||||
end
|
||||
|
||||
if obj.limitation_message_key ~= nil then
|
||||
local str = locale[type..'-limitation.'..obj.limitation_message_key]
|
||||
if str ~= nil then
|
||||
obj.limitation_message = str
|
||||
end
|
||||
obj.limitation_message_key = nil
|
||||
end
|
||||
end
|
||||
|
||||
local creativeEntities = {
|
||||
'loader',
|
||||
'fast-loader',
|
||||
'express-loader',
|
||||
'infinity-chest',
|
||||
'heat-interface',
|
||||
'infinity-pipe',
|
||||
'electric-energy-interface'
|
||||
}
|
||||
|
||||
local output = {}
|
||||
|
||||
-- ITEMS
|
||||
do
|
||||
local items = {}
|
||||
|
||||
local itemPrototypes = {
|
||||
'item',
|
||||
'ammo',
|
||||
'gun',
|
||||
'capsule',
|
||||
'item-with-entity-data',
|
||||
'blueprint',
|
||||
'module',
|
||||
'rail-planner',
|
||||
'tool',
|
||||
'armor',
|
||||
'repair-tool'
|
||||
}
|
||||
|
||||
local itemKeyBlacklist = {
|
||||
'ammo_type',
|
||||
'attack_parameters',
|
||||
'capsule_action',
|
||||
'durability_description_key',
|
||||
'durability_description_value',
|
||||
'flags',
|
||||
'pictures',
|
||||
'resistances',
|
||||
'robot_action'
|
||||
}
|
||||
|
||||
local getOrder = char_generator()
|
||||
|
||||
for proto in list_iter(itemPrototypes) do
|
||||
for _, item in pairs(deep_copy(data.raw[proto])) do
|
||||
if list_includes(creativeEntities, item.name) then
|
||||
item.subgroup = 'creative'
|
||||
item.order = getOrder()
|
||||
item.flags = nil
|
||||
end
|
||||
|
||||
if (item.icon ~= nil or item.icons ~= nil) and not (item.flags ~= nil and list_includes(item.flags, 'hidden')) then
|
||||
localise(item, 'item')
|
||||
table_filter(item, itemKeyBlacklist)
|
||||
items[item.name] = item
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
output.items = items
|
||||
end
|
||||
|
||||
-- FLUIDS
|
||||
do
|
||||
local fluids = {}
|
||||
|
||||
local fluidKeyBlacklist = {
|
||||
'auto_barrel'
|
||||
}
|
||||
|
||||
for _, fluid in pairs(deep_copy(data.raw.fluid)) do
|
||||
localise(fluid, 'fluid')
|
||||
table_filter(fluid, fluidKeyBlacklist)
|
||||
fluids[fluid.name] = fluid
|
||||
end
|
||||
|
||||
output.fluids = fluids
|
||||
end
|
||||
|
||||
-- SIGNALS
|
||||
do
|
||||
local signals = {}
|
||||
|
||||
for _, signal in pairs(deep_copy(data.raw['virtual-signal'])) do
|
||||
localise(signal, 'virtual-signal')
|
||||
signals[signal.name] = signal
|
||||
end
|
||||
|
||||
output.signals = signals
|
||||
end
|
||||
|
||||
-- RECIPES
|
||||
do
|
||||
local recipes = {}
|
||||
|
||||
for _, recipe in pairs(deep_copy(data.raw.recipe)) do
|
||||
if not list_includes(creativeEntities, recipe.name) then
|
||||
if recipe.normal ~= nil then
|
||||
table_merge(recipe, recipe.normal)
|
||||
end
|
||||
|
||||
local ingredients = {}
|
||||
local results = {}
|
||||
|
||||
local function process_items(input, output)
|
||||
for _, val in pairs(input) do
|
||||
if #val > 0 then
|
||||
table.insert(output, {
|
||||
name = val[1],
|
||||
amount = val[2]
|
||||
})
|
||||
else
|
||||
table.insert(output, val)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
process_items(recipe.ingredients, ingredients)
|
||||
|
||||
if recipe.result ~= nil then
|
||||
results = {
|
||||
{
|
||||
name = recipe.result,
|
||||
amount = recipe.result_count or 1
|
||||
}
|
||||
}
|
||||
else
|
||||
process_items(recipe.results, results)
|
||||
end
|
||||
|
||||
local outRecipe = {
|
||||
name = recipe.name,
|
||||
icon = recipe.icon,
|
||||
icons = recipe.icons,
|
||||
icon_size = recipe.icon_size,
|
||||
icon_mipmaps = recipe.icon_mipmaps,
|
||||
category = recipe.category or 'crafting',
|
||||
hidden = recipe.hidden,
|
||||
time = recipe.energy_required or 0.5,
|
||||
ingredients = ingredients,
|
||||
results = results,
|
||||
requester_paste_multiplier = recipe.requester_paste_multiplier,
|
||||
crafting_machine_tint = recipe.crafting_machine_tint
|
||||
}
|
||||
|
||||
localise(outRecipe, 'recipe')
|
||||
recipes[recipe.name] = outRecipe
|
||||
end
|
||||
end
|
||||
|
||||
output.recipes = recipes
|
||||
end
|
||||
|
||||
--ENTITIES
|
||||
do
|
||||
local entities = {}
|
||||
|
||||
local placeableEntityPrototypes = {
|
||||
'accumulator',
|
||||
'artillery-turret',
|
||||
'beacon',
|
||||
'boiler',
|
||||
'arithmetic-combinator',
|
||||
'decider-combinator',
|
||||
'constant-combinator',
|
||||
'container',
|
||||
'logistic-container',
|
||||
'infinity-container',
|
||||
'assembling-machine',
|
||||
'rocket-silo',
|
||||
'furnace',
|
||||
'electric-energy-interface',
|
||||
'electric-pole',
|
||||
'gate',
|
||||
'generator',
|
||||
'heat-interface',
|
||||
'heat-pipe',
|
||||
'inserter',
|
||||
'lab',
|
||||
'lamp',
|
||||
'land-mine',
|
||||
'mining-drill',
|
||||
'offshore-pump',
|
||||
'pipe',
|
||||
'infinity-pipe',
|
||||
'pipe-to-ground',
|
||||
'power-switch',
|
||||
'programmable-speaker',
|
||||
'pump',
|
||||
'radar',
|
||||
'curved-rail',
|
||||
'straight-rail',
|
||||
'rail-chain-signal',
|
||||
'rail-signal',
|
||||
'reactor',
|
||||
'roboport',
|
||||
'solar-panel',
|
||||
'storage-tank',
|
||||
'train-stop',
|
||||
'loader',
|
||||
'splitter',
|
||||
'transport-belt',
|
||||
'underground-belt',
|
||||
'turret',
|
||||
'ammo-turret',
|
||||
'electric-turret',
|
||||
'fluid-turret',
|
||||
'wall'
|
||||
}
|
||||
|
||||
local entityBlacklist = {
|
||||
'bait-chest',
|
||||
'compilatron-chest',
|
||||
'crash-site-chest-1',
|
||||
'crash-site-chest-2',
|
||||
'big-ship-wreck-1',
|
||||
'big-ship-wreck-2',
|
||||
'big-ship-wreck-3',
|
||||
'red-chest',
|
||||
'blue-chest',
|
||||
'compi-logistics-chest',
|
||||
'crash-site-assembling-machine-1-repaired',
|
||||
'crash-site-assembling-machine-2-repaired',
|
||||
'crash-site-generator',
|
||||
'hidden-electric-energy-interface',
|
||||
'crash-site-electric-pole',
|
||||
'crash-site-lab-repaired',
|
||||
'compi-roboport',
|
||||
'small-worm-turret',
|
||||
'medium-worm-turret',
|
||||
'big-worm-turret',
|
||||
'behemoth-worm-turret',
|
||||
'cutscene-gun-turret'
|
||||
}
|
||||
|
||||
local entityKeyBlacklist = {
|
||||
'subgroup',
|
||||
'repair_sound',
|
||||
'vehicle_impact_sound',
|
||||
'resistances',
|
||||
'action',
|
||||
'meltdown_action',
|
||||
'ammo_type',
|
||||
'attack_parameters',
|
||||
'fluid_wagon_connector_graphics',
|
||||
'cannon_base_shiftings',
|
||||
'cannon_barrel_recoil_shiftings',
|
||||
'folded_muzzle_animation_shift',
|
||||
'preparing_muzzle_animation_shift',
|
||||
'prepared_muzzle_animation_shift',
|
||||
'attacking_muzzle_animation_shift',
|
||||
'ending_attack_muzzle_animation_shift',
|
||||
'folding_muzzle_animation_shift'
|
||||
}
|
||||
|
||||
for proto in list_iter(placeableEntityPrototypes) do
|
||||
for _, entity in pairs(deep_copy(data.raw[proto])) do
|
||||
if not list_includes(entityBlacklist, entity.name) then
|
||||
|
||||
-- add size
|
||||
entity.size = {
|
||||
width = math.ceil(math.abs(entity.selection_box[1][1]) + math.abs(entity.selection_box[2][1])),
|
||||
height = math.ceil(math.abs(entity.selection_box[1][2]) + math.abs(entity.selection_box[2][2]))
|
||||
}
|
||||
|
||||
-- add possible_rotations
|
||||
if list_includes({
|
||||
'pipe-to-ground',
|
||||
'train-stop',
|
||||
'arithmetic-combinator',
|
||||
'decider-combinator',
|
||||
'constant-combinator',
|
||||
'gun-turret',
|
||||
'artillery-turret',
|
||||
'laser-turret',
|
||||
'flamethrower-turret',
|
||||
'offshore-pump',
|
||||
'pump'
|
||||
}, entity.name) or list_includes({
|
||||
'underground-belt',
|
||||
'transport-belt',
|
||||
'splitter',
|
||||
'inserter',
|
||||
'boiler',
|
||||
'mining-drill',
|
||||
'assembling-machine',
|
||||
'loader'
|
||||
}, entity.type) then
|
||||
|
||||
entity.possible_rotations = { 0, 2, 4, 6 }
|
||||
|
||||
elseif list_includes({
|
||||
'storage-tank',
|
||||
'gate',
|
||||
'straight-rail'
|
||||
}, entity.name) or list_includes({
|
||||
'generator'
|
||||
}, entity.type) then
|
||||
|
||||
entity.possible_rotations = { 0, 2 }
|
||||
|
||||
elseif list_includes({
|
||||
'rail-signal',
|
||||
'rail-chain-signal'
|
||||
}, entity.name) then
|
||||
|
||||
entity.possible_rotations = { 0, 1, 2, 3, 4, 5, 6, 7 }
|
||||
end
|
||||
|
||||
-- modify fast_replaceable_group
|
||||
if entity.type == 'splitter' then
|
||||
entity.fast_replaceable_group = 'splitter'
|
||||
elseif entity.type == 'underground-belt' then
|
||||
entity.fast_replaceable_group = 'underground-belt'
|
||||
end
|
||||
|
||||
-- move off_when_no_fluid_recipe outside of fluid_boxes props
|
||||
if entity.fluid_boxes ~= nil and entity.fluid_boxes.off_when_no_fluid_recipe ~= nil then
|
||||
entity.fluid_boxes_off_when_no_fluid_recipe = entity.fluid_boxes.off_when_no_fluid_recipe
|
||||
entity.fluid_boxes.off_when_no_fluid_recipe = nil
|
||||
end
|
||||
|
||||
localise(entity, 'entity')
|
||||
table_filter(entity, entityKeyBlacklist)
|
||||
entities[entity.name] = entity
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
entities['offshore-pump'].size = { width = 1, height = 1 }
|
||||
|
||||
entities['centrifuge'].possible_directions = nil
|
||||
entities['assembling-machine-1'].possible_directions = nil
|
||||
|
||||
-- fix shifts
|
||||
entities['storage-tank'].pictures.window_background.shift = { 0, 1 }
|
||||
entities['storage-tank'].pictures.window_background.hr_version.shift = { 0, 1 }
|
||||
|
||||
-- fix inconsistent radius
|
||||
entities.beacon.supply_area_distance = entities.beacon.supply_area_distance + 1
|
||||
|
||||
local function add_to_Y_shift(y_shift, layer)
|
||||
layer.shift[2] = layer.shift[2] + y_shift
|
||||
if layer.hr_version ~= nil then
|
||||
layer.hr_version.shift[2] = layer.hr_version.shift[2] + y_shift
|
||||
end
|
||||
end
|
||||
|
||||
add_to_Y_shift(-0.6875, entities['artillery-turret'].base_picture.layers[1])
|
||||
add_to_Y_shift(-0.6875, entities['artillery-turret'].cannon_barrel_pictures.layers[1])
|
||||
add_to_Y_shift(-0.6875, entities['artillery-turret'].cannon_base_pictures.layers[1])
|
||||
|
||||
-- keep pictures consistent
|
||||
entities['pipe-to-ground'].pictures = {
|
||||
north = entities['pipe-to-ground'].pictures.up,
|
||||
east = entities['pipe-to-ground'].pictures.right,
|
||||
south = entities['pipe-to-ground'].pictures.down,
|
||||
west = entities['pipe-to-ground'].pictures.left
|
||||
}
|
||||
|
||||
output.entities = entities
|
||||
end
|
||||
|
||||
-- TILES
|
||||
do
|
||||
local tiles = {}
|
||||
|
||||
local tileKeyBlacklist = {
|
||||
'autoplace'
|
||||
}
|
||||
|
||||
for _, tile in pairs(deep_copy(data.raw.tile)) do
|
||||
if tile.minable ~= nil or tile.name == 'landfill' then
|
||||
localise(tile, 'tile')
|
||||
table_filter(tile, tileKeyBlacklist)
|
||||
tiles[tile.name] = tile
|
||||
end
|
||||
end
|
||||
|
||||
output.tiles = tiles
|
||||
end
|
||||
|
||||
-- INVENTORY LAYOUT
|
||||
do
|
||||
local inventoryLayout = {}
|
||||
|
||||
local groupBlacklist = {
|
||||
'environment',
|
||||
'enemies',
|
||||
'effects',
|
||||
'other'
|
||||
}
|
||||
|
||||
local function comp_func(a, b)
|
||||
return a.order < b.order
|
||||
end
|
||||
|
||||
local subgroups = {
|
||||
creative = {
|
||||
name = 'creative',
|
||||
group = 'creative',
|
||||
order = 'z',
|
||||
items = {}
|
||||
}
|
||||
}
|
||||
|
||||
for _, subgroup in pairs(deep_copy(data.raw['item-subgroup'])) do
|
||||
subgroups[subgroup.name] = {
|
||||
name = subgroup.name,
|
||||
group = subgroup.group,
|
||||
order = subgroup.order,
|
||||
items = {}
|
||||
}
|
||||
end
|
||||
|
||||
local function addEntriesToSubroups(t, defaultSubgroup)
|
||||
for _, entry in pairs(t) do
|
||||
local subgroup = entry.subgroup or defaultSubgroup
|
||||
if subgroup ~= nil and entry.order ~= nil and subgroups[subgroup] ~= nil then
|
||||
-- some fluid recipes are missing their icon and order
|
||||
-- local fluid = data.raw.fluid[entry.name] or {}
|
||||
table.insert(subgroups[subgroup].items, {
|
||||
name = entry.name,
|
||||
icon = entry.icon, -- or fluid.icon,
|
||||
icons = entry.icons,
|
||||
icon_size = entry.icon_size,
|
||||
icon_mipmaps = entry.icon_mipmaps,
|
||||
order = entry.order -- or fluid.order
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
addEntriesToSubroups(output.items)
|
||||
addEntriesToSubroups(deep_copy(data.raw.recipe))
|
||||
addEntriesToSubroups(deep_copy(data.raw.fluid), 'fluid')
|
||||
addEntriesToSubroups(deep_copy(data.raw['virtual-signal']))
|
||||
|
||||
local infinityChest = output.items['infinity-chest']
|
||||
local groups = {
|
||||
creative = {
|
||||
name = 'creative',
|
||||
icon = infinityChest.icon,
|
||||
icons = infinityChest.icons,
|
||||
icon_size = infinityChest.icon_size,
|
||||
icon_mipmaps = infinityChest.icon_mipmaps,
|
||||
order = 'z',
|
||||
subgroups = {}
|
||||
}
|
||||
}
|
||||
|
||||
for _, group in pairs(deep_copy(data.raw['item-group'])) do
|
||||
if not list_includes(groupBlacklist, group.name) then
|
||||
groups[group.name] = {
|
||||
name = group.name,
|
||||
icon = group.icon,
|
||||
icons = group.icons,
|
||||
icon_size = group.icon_size,
|
||||
icon_mipmaps = group.icon_mipmaps,
|
||||
order = group.order,
|
||||
subgroups = {}
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
for _, subgroup in pairs(subgroups) do
|
||||
if groups[subgroup.group] ~= nil and #subgroup.items ~= 0 then
|
||||
table.sort(subgroup.items, comp_func)
|
||||
table.insert(groups[subgroup.group].subgroups, subgroup)
|
||||
end
|
||||
end
|
||||
|
||||
for _, group in pairs(groups) do
|
||||
localise(group, 'item-group')
|
||||
table.sort(group.subgroups, comp_func)
|
||||
table.insert(inventoryLayout, group)
|
||||
end
|
||||
|
||||
table.sort(inventoryLayout, comp_func)
|
||||
|
||||
output.inventoryLayout = inventoryLayout
|
||||
end
|
||||
|
||||
-- UTILITY SPRITES
|
||||
do
|
||||
local utilitySprites = deep_copy(data.raw['utility-sprites'].default)
|
||||
utilitySprites.type = nil
|
||||
utilitySprites.name = nil
|
||||
output.utilitySprites = utilitySprites
|
||||
end
|
||||
|
||||
-- PASSTROUGH OUTPUT DATA
|
||||
do
|
||||
local serialized = serpent.dump(output)
|
||||
|
||||
-- workaround Factorio's limitation of 200 characters per string
|
||||
-- by splitting the serialized data into chunks and embedding it
|
||||
-- into dummy entities
|
||||
|
||||
local function embed_data(key, value)
|
||||
data:extend({{
|
||||
type = "simple-entity",
|
||||
name = key,
|
||||
icon = "-",
|
||||
icon_size = 1,
|
||||
picture = {
|
||||
filename = "-",
|
||||
width = 1,
|
||||
height = 1
|
||||
},
|
||||
localised_name = value
|
||||
}})
|
||||
end
|
||||
|
||||
local l = string.len(serialized)
|
||||
local total_parts = 0
|
||||
for i = 1, l, 200 do
|
||||
total_parts = total_parts + 1
|
||||
embed_data(total_parts, string.sub(serialized, i, i + 199))
|
||||
end
|
||||
|
||||
embed_data('DATA', total_parts)
|
||||
end
|
8
packages/exporter/src/export-data/info.json
Normal file
8
packages/exporter/src/export-data/info.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "export-data",
|
||||
"version": "0.0.0",
|
||||
"title": "export-data",
|
||||
"author": "",
|
||||
"factorio_version": "1.0.0",
|
||||
"dependencies": ["base >= 1.0.0"]
|
||||
}
|
50
packages/exporter/src/main.rs
Normal file
50
packages/exporter/src/main.rs
Normal file
@ -0,0 +1,50 @@
|
||||
use actix_web::{web, App, HttpResponse, HttpServer};
|
||||
use std::path::PathBuf;
|
||||
|
||||
mod setup;
|
||||
|
||||
#[macro_use]
|
||||
extern crate lazy_static;
|
||||
|
||||
static FACTORIO_VERSION: &str = "1.0.0";
|
||||
|
||||
lazy_static! {
|
||||
static ref DATA_DIR: PathBuf = PathBuf::from("./data");
|
||||
static ref FACTORIO_DATA: PathBuf = DATA_DIR.join("factorio/data");
|
||||
}
|
||||
|
||||
#[actix_rt::main]
|
||||
async fn main() -> std::io::Result<()> {
|
||||
#[cfg(feature = "dev")]
|
||||
dotenv::dotenv().ok();
|
||||
|
||||
setup::download_factorio(&DATA_DIR, &FACTORIO_DATA, FACTORIO_VERSION)
|
||||
.await
|
||||
.unwrap();
|
||||
setup::extract(&DATA_DIR, &FACTORIO_DATA).await.unwrap();
|
||||
|
||||
let mut server = HttpServer::new(move || {
|
||||
App::new()
|
||||
.service(actix_files::Files::new("/data", "./data/output").show_files_listing())
|
||||
.default_service(web::to(|| not_found()))
|
||||
});
|
||||
|
||||
#[cfg(feature = "dev")]
|
||||
let listener = listenfd::ListenFd::from_env().take_tcp_listener(0).unwrap();
|
||||
#[cfg(not(feature = "dev"))]
|
||||
let listener = None;
|
||||
|
||||
server = if let Some(l) = listener {
|
||||
server.listen(l)?
|
||||
} else {
|
||||
server.bind("0.0.0.0:85")?
|
||||
};
|
||||
|
||||
server.run().await
|
||||
}
|
||||
|
||||
fn not_found() -> HttpResponse {
|
||||
HttpResponse::NotFound()
|
||||
.content_type("text/plain")
|
||||
.body("404 Not Found")
|
||||
}
|
358
packages/exporter/src/setup.rs
Normal file
358
packages/exporter/src/setup.rs
Normal file
@ -0,0 +1,358 @@
|
||||
use async_compression::stream::LzmaDecoder;
|
||||
use async_recursion::async_recursion;
|
||||
use globset::{Glob, GlobSetBuilder};
|
||||
use globset::{GlobBuilder, GlobMatcher};
|
||||
use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
|
||||
use regex::Regex;
|
||||
use serde::Deserialize;
|
||||
use std::error::Error;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::{collections::HashSet, env};
|
||||
use tokio::process::Command;
|
||||
|
||||
macro_rules! get_env_var {
|
||||
($name:expr) => {
|
||||
env::var($name).map_err(|_| format!("{} env variable is missing", $name))
|
||||
};
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct Info {
|
||||
// name: String,
|
||||
version: String,
|
||||
// title: String,
|
||||
// author: String,
|
||||
// contact: String,
|
||||
// homepage: String,
|
||||
// dependencies: Vec<String>,
|
||||
}
|
||||
|
||||
async fn get_info<P: AsRef<Path>>(path: P) -> Result<Info, Box<dyn Error>> {
|
||||
let contents = tokio::fs::read_to_string(path).await?;
|
||||
let p: Info = serde_json::from_str(&contents)?;
|
||||
Ok(p)
|
||||
}
|
||||
|
||||
fn get_download_url(buid_type: &str, version: &str, username: &str, token: &str) -> String {
|
||||
format!(
|
||||
"https://www.factorio.com/get-download/{}/{}/linux64?username={}&token={}",
|
||||
version, buid_type, username, token
|
||||
)
|
||||
}
|
||||
|
||||
async fn make_img_pow2(path: &PathBuf, tmp_dir: &PathBuf) -> Result<PathBuf, Box<dyn Error>> {
|
||||
let (w, h) = image::image_dimensions(path)?;
|
||||
let w_log = f32::log2(w as f32);
|
||||
let h_log = f32::log2(h as f32);
|
||||
|
||||
if w_log.fract() != 0.0 || h_log.fract() != 0.0 {
|
||||
let mut file = tokio::fs::File::open(path).await?;
|
||||
let len = file.metadata().await?.len();
|
||||
let mut buffer = Vec::with_capacity(len as usize);
|
||||
use tokio::io::AsyncReadExt;
|
||||
file.read_to_end(&mut buffer).await?;
|
||||
let format = image::guess_format(&buffer)?;
|
||||
let mut out = image::DynamicImage::new_rgba8(
|
||||
u32::pow(2, f32::ceil(w_log) as u32),
|
||||
u32::pow(2, f32::ceil(h_log) as u32),
|
||||
);
|
||||
let img = image::load_from_memory_with_format(&buffer, format)?;
|
||||
image::imageops::replace(&mut out, &img, 0, 0);
|
||||
buffer.clear();
|
||||
out.write_to(&mut buffer, format)?;
|
||||
|
||||
let tmp_path = tmp_dir.join(path);
|
||||
tokio::fs::create_dir_all(tmp_path.parent().unwrap()).await?;
|
||||
tokio::fs::write(&tmp_path, &buffer).await?;
|
||||
Ok(tmp_path)
|
||||
} else {
|
||||
Ok(path.clone())
|
||||
}
|
||||
}
|
||||
|
||||
async fn content_to_lines(path: &Path) -> Result<Vec<String>, Box<dyn Error>> {
|
||||
let file = tokio::fs::File::open(path).await?;
|
||||
let buf = tokio::io::BufReader::new(file);
|
||||
use tokio::io::AsyncBufReadExt;
|
||||
use tokio::stream::StreamExt;
|
||||
let lines_stream = buf.lines();
|
||||
|
||||
let mut group = String::new();
|
||||
let content = lines_stream
|
||||
.filter_map(|line| {
|
||||
let line = line.ok()?;
|
||||
if line.is_empty() || line.starts_with(';') {
|
||||
return None;
|
||||
}
|
||||
if line.starts_with('[') {
|
||||
group = line[1..line.len() - 1].to_string();
|
||||
return None;
|
||||
}
|
||||
let idx = line.find('=')?;
|
||||
let sep = match group.len() {
|
||||
0 => "",
|
||||
_ => ".",
|
||||
};
|
||||
let val = line[idx + 1..].to_string().replace("'", r"\'");
|
||||
let subgroup = &line[..idx];
|
||||
Some(format!("['{}{}{}']='{}'", group, sep, subgroup, val))
|
||||
})
|
||||
.collect()
|
||||
.await;
|
||||
Ok(content)
|
||||
}
|
||||
|
||||
#[async_recursion]
|
||||
async fn glob(
|
||||
path: &Path,
|
||||
matcher: &GlobMatcher,
|
||||
) -> Result<Vec<std::path::PathBuf>, Box<dyn Error>> {
|
||||
let mut entries = tokio::fs::read_dir(path).await?;
|
||||
let mut paths = Vec::<std::path::PathBuf>::new();
|
||||
|
||||
while let Some(entry) = entries.next_entry().await? {
|
||||
let file_type = entry.file_type().await?;
|
||||
let entry_path = entry.path();
|
||||
if file_type.is_file() && matcher.is_match(&entry_path) {
|
||||
paths.push(entry_path.clone())
|
||||
} else if file_type.is_dir() {
|
||||
let mut inner_paths = glob(&entry_path, matcher).await?;
|
||||
paths.append(&mut inner_paths);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(paths)
|
||||
}
|
||||
|
||||
async fn generate_locale(factorio_data: &PathBuf) -> Result<String, Box<dyn Error>> {
|
||||
let matcher = GlobBuilder::new("**/*/locale/en/*.cfg")
|
||||
.literal_separator(true)
|
||||
.build()?
|
||||
.compile_matcher();
|
||||
let paths = glob(factorio_data, &matcher).await?;
|
||||
let content = futures::future::try_join_all(paths.iter().map(|path| content_to_lines(&path)))
|
||||
.await?
|
||||
.concat()
|
||||
.join(",");
|
||||
Ok(format!("return {{{}}}", content))
|
||||
}
|
||||
|
||||
pub async fn extract(data_dir: &PathBuf, factorio_data: &PathBuf) -> Result<(), Box<dyn Error>> {
|
||||
let mod_dir = data_dir.join("factorio/mods/export-data");
|
||||
let scenario_dir = mod_dir.join("scenarios/export-data");
|
||||
let extracted_data_path = data_dir.join("factorio/script-output/data.json");
|
||||
let factorio_executable = data_dir.join("factorio/bin/x64/factorio");
|
||||
|
||||
let info = include_str!("export-data/info.json");
|
||||
let script = include_str!("export-data/control.lua");
|
||||
let data = include_str!("export-data/data-final-fixes.lua");
|
||||
let locale = generate_locale(factorio_data).await?;
|
||||
|
||||
tokio::fs::create_dir_all(&scenario_dir).await?;
|
||||
tokio::fs::write(mod_dir.join("info.json"), info).await?;
|
||||
tokio::fs::write(mod_dir.join("locale.lua"), locale).await?;
|
||||
tokio::fs::write(mod_dir.join("data-final-fixes.lua"), data).await?;
|
||||
tokio::fs::write(scenario_dir.join("control.lua"), script).await?;
|
||||
|
||||
println!("Generating defines.lua");
|
||||
|
||||
Command::new(factorio_executable)
|
||||
.args(&["--start-server-load-scenario", "export-data/export-data"])
|
||||
.stdout(std::process::Stdio::null())
|
||||
.spawn()?
|
||||
.await?;
|
||||
|
||||
let content = tokio::fs::read_to_string(&extracted_data_path).await?;
|
||||
|
||||
lazy_static! {
|
||||
static ref IMG_REGEX: Regex = Regex::new(r#""([^"]+?\.png)""#).unwrap();
|
||||
}
|
||||
let iter: HashSet<String> = IMG_REGEX
|
||||
.captures_iter(&content)
|
||||
.map(|cap| cap[1].to_string())
|
||||
.collect();
|
||||
|
||||
let file_paths = iter
|
||||
.into_iter()
|
||||
.map(|s| {
|
||||
let out_path = data_dir
|
||||
.join("output")
|
||||
.join(s.replace(".png", ".basis").as_str());
|
||||
let in_path =
|
||||
factorio_data.join(s.replace("__core__", "core").replace("__base__", "base"));
|
||||
|
||||
(in_path, out_path)
|
||||
})
|
||||
.collect::<Vec<(PathBuf, PathBuf)>>();
|
||||
|
||||
let progress = ProgressBar::new(file_paths.len() as u64);
|
||||
progress.set_style(ProgressStyle::default_bar().template("{wide_bar} {pos}/{len} ({elapsed})"));
|
||||
|
||||
let file_paths = Arc::new(Mutex::new(file_paths));
|
||||
|
||||
let tmp_dir = std::env::temp_dir().join("__FBE__");
|
||||
tokio::fs::create_dir_all(&tmp_dir).await?;
|
||||
|
||||
futures::future::try_join_all(
|
||||
(0..20).map(|_| compress_next_img(file_paths.clone(), tmp_dir.clone(), progress.clone())),
|
||||
)
|
||||
.await?;
|
||||
|
||||
progress.finish();
|
||||
|
||||
tokio::fs::remove_dir_all(&tmp_dir).await?;
|
||||
println!("DONE!");
|
||||
|
||||
tokio::fs::write(data_dir.join("output").join("data.json"), &content).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[async_recursion]
|
||||
async fn compress_next_img(
|
||||
file_paths: Arc<Mutex<Vec<(PathBuf, PathBuf)>>>,
|
||||
tmp_dir: PathBuf,
|
||||
progress: ProgressBar,
|
||||
) -> Result<(), Box<dyn Error>> {
|
||||
let file_path = { file_paths.lock().unwrap().pop() };
|
||||
if let Some((in_path, out_path)) = file_path {
|
||||
let path = make_img_pow2(&in_path, &tmp_dir).await?;
|
||||
|
||||
tokio::fs::create_dir_all(out_path.parent().unwrap()).await?;
|
||||
|
||||
let basisu_executable = "./basisu";
|
||||
let status = Command::new(basisu_executable)
|
||||
// .args(&["-comp_level", "2"])
|
||||
.args(&["-mipmap"])
|
||||
.args(&["-file", path.to_str().ok_or("PathBuf to &str failed")?])
|
||||
.args(&[
|
||||
"-output_file",
|
||||
out_path.to_str().ok_or("PathBuf to &str failed")?,
|
||||
])
|
||||
.stdout(std::process::Stdio::null())
|
||||
.spawn()?
|
||||
.await?;
|
||||
|
||||
if !status.success() {
|
||||
println!("FAILED: {:?}", path);
|
||||
}
|
||||
|
||||
progress.inc(1);
|
||||
} else {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
compress_next_img(file_paths, tmp_dir, progress).await
|
||||
}
|
||||
|
||||
// TODO: look into using https://wiki.factorio.com/Download_API
|
||||
pub async fn download_factorio(
|
||||
data_dir: &PathBuf,
|
||||
factorio_data: &PathBuf,
|
||||
factorio_version: &str,
|
||||
) -> Result<(), Box<dyn Error>> {
|
||||
let username = get_env_var!("FACTORIO_USERNAME")?;
|
||||
let token = get_env_var!("FACTORIO_TOKEN")?;
|
||||
|
||||
let info_path = factorio_data.join("base/info.json");
|
||||
|
||||
let same_version = get_info(info_path)
|
||||
.await
|
||||
.map(|info| info.version == factorio_version)
|
||||
.unwrap_or(false);
|
||||
|
||||
if same_version {
|
||||
println!("Downloaded Factorio version matches required version");
|
||||
} else {
|
||||
println!("Downloading Factorio v{}", factorio_version);
|
||||
if data_dir.is_dir() {
|
||||
tokio::fs::remove_dir_all(data_dir).await?;
|
||||
}
|
||||
tokio::fs::create_dir_all(data_dir).await?;
|
||||
|
||||
let mpb = MultiProgress::new();
|
||||
|
||||
let d0 = download(
|
||||
get_download_url("alpha", factorio_version, &username, &token),
|
||||
data_dir,
|
||||
&["factorio/data/*"],
|
||||
mpb.add(ProgressBar::new(0)),
|
||||
);
|
||||
let d1 = download(
|
||||
get_download_url("headless", factorio_version, &username, &token),
|
||||
data_dir,
|
||||
&["factorio/bin/*", "factorio/config-path.cfg"],
|
||||
mpb.add(ProgressBar::new(0)),
|
||||
);
|
||||
|
||||
async fn wait_for_progress_bar(mpb: MultiProgress) -> Result<(), Box<dyn Error>> {
|
||||
tokio::task::spawn_blocking(move || mpb.join())
|
||||
.await?
|
||||
.map_err(|e| Box::from(e))
|
||||
}
|
||||
|
||||
tokio::try_join!(d0, d1, wait_for_progress_bar(mpb))?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn download<I, S>(
|
||||
url: String,
|
||||
out_dir: &PathBuf,
|
||||
filter: I,
|
||||
pb: ProgressBar,
|
||||
) -> Result<(), Box<dyn Error>>
|
||||
where
|
||||
I: IntoIterator<Item = S>,
|
||||
S: AsRef<str>,
|
||||
{
|
||||
let client = reqwest::Client::new();
|
||||
let res = client.get(&url).send().await?;
|
||||
|
||||
if !res.status().is_success() {
|
||||
panic!("Status code was not successful");
|
||||
}
|
||||
|
||||
if let Some(content_length) = res.content_length() {
|
||||
pb.set_length(content_length);
|
||||
pb.set_style(
|
||||
ProgressStyle::default_bar()
|
||||
.template("[{elapsed_precise}] [{bar:40.cyan/blue}] {bytes}/{total_bytes} ({eta})")
|
||||
.progress_chars("=> "),
|
||||
);
|
||||
} else {
|
||||
pb.set_style(ProgressStyle::default_spinner());
|
||||
}
|
||||
|
||||
use futures::stream::TryStreamExt;
|
||||
let stream = res
|
||||
.bytes_stream()
|
||||
.map_err(|e| futures::io::Error::new(futures::io::ErrorKind::Other, e));
|
||||
|
||||
let stream = stream.inspect_ok(|chunk| {
|
||||
pb.inc(chunk.len() as u64);
|
||||
});
|
||||
|
||||
let decompressor = LzmaDecoder::new(stream);
|
||||
|
||||
let mut builder = GlobSetBuilder::new();
|
||||
for pattern in filter.into_iter() {
|
||||
builder.add(Glob::new(pattern.as_ref())?);
|
||||
}
|
||||
let matcher = builder.build()?;
|
||||
|
||||
let stream_reader = decompressor.into_async_read();
|
||||
let ar = async_tar::Archive::new(stream_reader);
|
||||
let mut entries = ar.entries()?;
|
||||
use futures::stream::StreamExt;
|
||||
while let Some(Ok(mut file)) = entries.next().await {
|
||||
if matcher.is_match(file.path()?.to_path_buf()) {
|
||||
file.unpack_in(out_dir).await?;
|
||||
}
|
||||
}
|
||||
|
||||
pb.finish();
|
||||
|
||||
Ok(())
|
||||
}
|
@ -8,10 +8,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@fbe/editor": "*",
|
||||
"@fbe/factorio-data": "*",
|
||||
"dat.gui": "^0.7.7",
|
||||
"file-saver": "^2.0.2",
|
||||
"pixi.js": "^5.3.2"
|
||||
"@pixi/settings": "^5.4.0-rc.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/dat.gui": "^0.7.5",
|
||||
|
@ -1,6 +1,6 @@
|
||||
import './index.styl'
|
||||
|
||||
import { utils as pixiUtils } from 'pixi.js'
|
||||
import { isMobile } from '@pixi/settings'
|
||||
import FileSaver from 'file-saver'
|
||||
import EDITOR, {
|
||||
Editor,
|
||||
@ -48,7 +48,7 @@ console.log(
|
||||
initFeedbackButton()
|
||||
const createToast = initToasts()
|
||||
|
||||
if (pixiUtils.isMobile.any) {
|
||||
if (isMobile.any) {
|
||||
createToast({
|
||||
text:
|
||||
'Application is not compatible with mobile devices.<br>' +
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { GUI } from 'dat.gui'
|
||||
import { getModulesFor } from '@fbe/factorio-data'
|
||||
import EDITOR, { Blueprint, Book, GridPattern, Editor } from '@fbe/editor'
|
||||
import EDITOR, { Blueprint, Book, GridPattern, Editor, FD } from '@fbe/editor'
|
||||
|
||||
GUI.TEXT_CLOSED = 'Close Settings'
|
||||
GUI.TEXT_OPEN = 'Open Settings'
|
||||
@ -115,7 +114,7 @@ export function initSettingsPane(
|
||||
})
|
||||
|
||||
function getModulesObjFor(entityName: string): Record<string, string> {
|
||||
return getModulesFor(entityName)
|
||||
return FD.getModulesFor(entityName)
|
||||
.sort((a, b) => a.order.localeCompare(b.order))
|
||||
.reduce<Record<string, string>>(
|
||||
(obj, item) => {
|
||||
|
@ -35,17 +35,15 @@ class Context {
|
||||
resources: {
|
||||
resourcePublicRoot: '/assets',
|
||||
},
|
||||
plugins: [this.luaPlugin, pluginLink(/\.wasm/, { useDefault: true })],
|
||||
plugins: [
|
||||
this.luaPlugin,
|
||||
pluginLink(/(\.wasm|basis_transcoder\.js)$/, { useDefault: true }),
|
||||
],
|
||||
cache: { root: this.paths.cache },
|
||||
hmr: { plugin: p('./hmr.ts') },
|
||||
// sourceMap: { sourceRoot: '' },
|
||||
watcher: {
|
||||
root: [
|
||||
p('../src'),
|
||||
p('../../editor/src'),
|
||||
p('../../factorio-data/src'),
|
||||
p('../../lua-runtime/dist'),
|
||||
],
|
||||
root: [p('../src'), p('../../editor/src')],
|
||||
},
|
||||
}
|
||||
}
|
||||
@ -55,7 +53,7 @@ class Context {
|
||||
hmrServer: { port },
|
||||
proxy: [
|
||||
{
|
||||
path: '/api',
|
||||
path: '/data',
|
||||
options: {
|
||||
target: `http://localhost:8888`,
|
||||
// pathRewrite: { '^/api': '' },
|
||||
|
616
yarn.lock
616
yarn.lock
@ -39,315 +39,338 @@
|
||||
"@nodelib/fs.scandir" "2.1.3"
|
||||
fastq "^1.6.0"
|
||||
|
||||
"@pixi/accessibility@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/accessibility/-/accessibility-5.3.2.tgz#d722095128e5a4ae794ef2d9c833afeda087067b"
|
||||
integrity sha512-L56/Yr/gXyjs5Pgww6djg+nzBcMhi0ywmdXVZ2NEvlIk8spZwZHp9xb3t1xQvl7nXkIcdEvwBDBtgAPrwPJTRg==
|
||||
"@pixi/accessibility@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/accessibility/-/accessibility-5.4.0-rc.3.tgz#c57816b02bbb57e5c13807c07296ae6b8974396a"
|
||||
integrity sha512-1M4IrXqRPsrWyKei7WzgsRjIQHjQrv2ZOvmdAFNlAgER3VTqV+D2waLlX6NQ5pxnkBEQw5eW5yns0pNdXQOQaQ==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/app@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/app/-/app-5.3.2.tgz#f5bce8ab70095c6b35966c0566ded174a8f5551c"
|
||||
integrity sha512-jsLVe01q0QvxWv1dJql1lgl+vMqVb5YCbgxlbGHKkV3hYGmWaOd1fd31U+IMfiLgy5CgrRyoORjGuUf+HhYP3g==
|
||||
"@pixi/app@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/app/-/app-5.4.0-rc.3.tgz#af114c6e71818212b4d1a73cf1bac1483ea901bb"
|
||||
integrity sha512-CZ8/hcqPFsxWqUSxmkV/RxtdnAldxDLEsUH0Tgm+Ay+Jz8Ky+pfLDoFk+MQ49dxh937GkH5cqqvhgvvwJsjyfw==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/constants@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/constants/-/constants-5.3.2.tgz#c2c3b15337f11c3ec14fb4892ac09b69dcb89c30"
|
||||
integrity sha512-wJGPCNHF8LyWIStUujLlEg63Gkt7NzOO7E3O0jWYuikmYvBzi4dYWTGg9Ws9OULPwSbM9/Cu9l1zjJUWMCytYg==
|
||||
|
||||
"@pixi/core@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/core/-/core-5.3.2.tgz#5e0728f020b4879141ffc9399032ad47f9c6dcde"
|
||||
integrity sha512-BMd8gag7bcXWASfAkMER9lP43/5jVrjM+DhnqKv/KBK/G4wtSr+LJZJqBcNr6tox3Lquh8P5oGtVu0tAuHOXHA==
|
||||
"@pixi/basis@^5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/basis/-/basis-5.4.0-rc.3.tgz#323ed7ca192a927192a7193d7ca50225ba669a74"
|
||||
integrity sha512-HUyqS/+CSDKvM/n4P6OOz6L4DMizHEdwMokKau+YKzNdbOvxBWY9AjCrIU4AHggeNi+YZfcyk914OFJ+g9sYoA==
|
||||
dependencies:
|
||||
"@pixi/constants" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/runner" "5.3.2"
|
||||
"@pixi/settings" "5.3.2"
|
||||
"@pixi/ticker" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/compressed-textures" "5.4.0-rc.3"
|
||||
"@pixi/constants" "5.4.0-rc.3"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/loaders" "5.4.0-rc.3"
|
||||
"@pixi/runner" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/display@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/display/-/display-5.3.2.tgz#3e7e2bfbf63ec749631dbcb1e6ee5bbe1139fda8"
|
||||
integrity sha512-a/VnecfB6Pt9shOuZ19cUBO+6+esG/DUGacwHdkO9czue1h8kmD01vrXai6vXwVGj8bmGi/Pm8Zq7tSLO/hWLw==
|
||||
"@pixi/compressed-textures@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/compressed-textures/-/compressed-textures-5.4.0-rc.3.tgz#b2bf0f8f554d1d89065210cc1edf21a86e07f25f"
|
||||
integrity sha512-RlgOLWbBwE4W7gIgIHQETJa9l2wvf7rDG58wv/jgWcdaD78W2r7tb/YxSqGsEOGWfCG/lLkNdj5LBLZKvpCwMA==
|
||||
dependencies:
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/settings" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/constants" "5.4.0-rc.3"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/loaders" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/extract@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/extract/-/extract-5.3.2.tgz#70182495183d6af60d977ff5eefcfb36b3157b5d"
|
||||
integrity sha512-JPjOQ0eSfugiOdXmR7lPt1w2JdgBYzzdKqnAG5j2kWnfi7UDViyUKWbLRlns6POhyK4Qmw7Iulqy0M71HCzYxw==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/constants@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/constants/-/constants-5.4.0-rc.3.tgz#2fc3d8b04f2ce6c8502f339cf17390c3563b9e73"
|
||||
integrity sha512-88A8qz0HGcMHpNMqO+h2X9OJZnbaI7u/MevySRlr1Q9MW8rOndoodBIf+RBs2pmFJpyBt1jNfETs2nFWGd5RQg==
|
||||
|
||||
"@pixi/filter-alpha@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/filter-alpha/-/filter-alpha-5.3.2.tgz#bc7c759a8e28cd164c166dd6df2add14abed0e42"
|
||||
integrity sha512-TzLvngPA6jUXQ071GJzC6Pz37tBxuBgzhdw+lUqrVuf0AdSbz3tXrb9+rPmTI4F1JtYPI8SaTwwOmPhiZ0BAqw==
|
||||
"@pixi/core@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/core/-/core-5.4.0-rc.3.tgz#1646f9652e18b339bbdc1f6423e92101c9964e5f"
|
||||
integrity sha512-qtRY6/EpzkAlUq5kDT0Frj1ezJfE6t4Wy5pN7A3QbfvQZK4IOLn2nUMh1ZVOooukWESEg3b5zqkrzjK1kHLx0g==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/constants" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/runner" "5.4.0-rc.3"
|
||||
"@pixi/settings" "5.4.0-rc.3"
|
||||
"@pixi/ticker" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/filter-blur@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/filter-blur/-/filter-blur-5.3.2.tgz#f851391e15f0a663af699b24d9a0e29fe3ad0fc1"
|
||||
integrity sha512-Lzb2TMAPA1ODoRbQOrb7R0TJDy+dEC9rZo44/xbR4zfk7Ewu0LWpSumKcsLnZcB31oc/fwhdaJK00qqdaGwelQ==
|
||||
"@pixi/display@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/display/-/display-5.4.0-rc.3.tgz#7f0fd02a3c8a109ec5fc7025dc406ab98ee0abf5"
|
||||
integrity sha512-0e4RElsHMPj+2sAm1A4NwNpXWrUF2Tn3BQMu5WH0YUSP+sT6I4s09kV4rMPobpjNQuL/zKc1RtpSwhHzVmZmgg==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/settings" "5.3.2"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/settings" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/filter-color-matrix@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/filter-color-matrix/-/filter-color-matrix-5.3.2.tgz#085bfc144a598e6d4d39193484bf37ae0d3596a4"
|
||||
integrity sha512-dESNx44C/27IXfkIYQnxfgQbqlWrhVkaM9lprYQH8Ou57QE+uoJ4dwrYaUCanVVjRSHbDNg8uXxZozjFb9NkLw==
|
||||
"@pixi/extract@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/extract/-/extract-5.4.0-rc.3.tgz#7a13099c0cd0a7f5e0440f104e203989c9260405"
|
||||
integrity sha512-wevyluZTwrVCqFeiwjSKgcpT7XuLDB0/jtJ77MzPghpWOlGPtKTfRo5Z8PFDlLHQLudhbZjOcrEFHZQo2RvDcQ==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/filter-displacement@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/filter-displacement/-/filter-displacement-5.3.2.tgz#09f11ae5f88a306fc9f32f0dc6260604dab82d0d"
|
||||
integrity sha512-mo6N/99dgfkDKcHo2K2Kck/DOel1YWiTd6vdI0WZ7iJbBHAf8exU3dUnePjM+Z3Xj05W7YzL9S2nHupPuTC1bA==
|
||||
"@pixi/filter-alpha@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/filter-alpha/-/filter-alpha-5.4.0-rc.3.tgz#f252c2bcaf87a7ad940ebb2e62fb25b943a7de6a"
|
||||
integrity sha512-5nS2R08mbPRuFwAc0x0Ja/vjBt6eYxjPObT+Rtplm+bGidd4KC4MPbQUuZ6zjauWxdDDSnj95Lt5x1iOHahnxA==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/filter-fxaa@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/filter-fxaa/-/filter-fxaa-5.3.2.tgz#d1307872972a750c20ba100517faefc072c6568b"
|
||||
integrity sha512-uZTi402jTgj01QiKNZ+kTuoFzu7qn4fXmKVlMBHA493TUE7l+8ffPjdsIdJXZL6QQ5s9PAJ9Coaxl9cM/1oDOA==
|
||||
"@pixi/filter-blur@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/filter-blur/-/filter-blur-5.4.0-rc.3.tgz#b860567ceb072f7e9ce556403b7ed65325418a69"
|
||||
integrity sha512-F6FY3vkyVYlAIe8WdOIFxCqVHSKpDTiO7o7ZLFDnb21CHyjkahSMu6gTXYi9I7Eqd8qvNt0N1fuhMv/eaIfSag==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/settings" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/filter-noise@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/filter-noise/-/filter-noise-5.3.2.tgz#f1dcd72686a51b662cb556f47c90fdbfca68c65b"
|
||||
integrity sha512-DmbggbTuo6Sa/HTA3JxezgW32UsZYvTnp2pcM7Nf3EqebD0+ahpVK6CtiZM9js7NMtUttfJgOCGYy8AZ6SjDfg==
|
||||
"@pixi/filter-color-matrix@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/filter-color-matrix/-/filter-color-matrix-5.4.0-rc.3.tgz#88e02d29a64dd92259207534dcc3a0533128e17b"
|
||||
integrity sha512-NW2tfvOIWfu5E+2yW+eSZfJCSfdUgGHAhn2IxFdQdmaam1R+EMBJsu7QBt2VoAsNJlC+IIsOOfoIu1lIXAfaCQ==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/graphics@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/graphics/-/graphics-5.3.2.tgz#c18e55658a4189b5f761faa43de399800615bc73"
|
||||
integrity sha512-K3F8qVDHqnK7X1WoP87h8QtK7nLi5EiJA044L0nObho1PUSbVi6mzJqBBWtcFnGraHGT5IgbFEDB3PXnXnY4mA==
|
||||
"@pixi/filter-displacement@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/filter-displacement/-/filter-displacement-5.4.0-rc.3.tgz#9b16e336c2cf67aef00576c3bbbb9327462a4b9b"
|
||||
integrity sha512-Y7SgcoHWTwVMe4dg+ZyVdyZwYJGO5XJgbcV25LHxVzRO4SrTSXXZ/zOIm/Bdo/QYQSfLvqSSu42ejzLuRvSAyA==
|
||||
dependencies:
|
||||
"@pixi/constants" "5.3.2"
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/sprite" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/interaction@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/interaction/-/interaction-5.3.2.tgz#a8f2857fdce76ff8aabd9bf7d466b148f933335a"
|
||||
integrity sha512-fOFfNQUBJ0vCRq5dmrunIt3W63QnP3z8qvILnDNX2oP8SotCEtTuZreHeGKEVBQhrMCi5hoJgDCA9R8ca2o6AQ==
|
||||
"@pixi/filter-fxaa@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/filter-fxaa/-/filter-fxaa-5.4.0-rc.3.tgz#1de8c3a346ca120973beeceaff879a73ed951e25"
|
||||
integrity sha512-2kgxNIMzHlITVqx3tb5bCS7qF9C31zvjI3Q/RgVB/qe+gIe0L+bqM+gK/TgdW04zC6qMK9bQFOFJ72Ox7q07iQ==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/ticker" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/loaders@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/loaders/-/loaders-5.3.2.tgz#dadb5c5c9f5a0ee1c6ffe88fd6c5a5840a453490"
|
||||
integrity sha512-w8wBdI587g7SLIAXNtncEAZxgohekGrP9rS44q1aotfo1ongiftTy77lYLWGSpYfyyWXcY+v6R1Qc40buNrGVA==
|
||||
"@pixi/filter-noise@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/filter-noise/-/filter-noise-5.4.0-rc.3.tgz#c6b22021e510a7f91403cc677fcacd59f84a09b8"
|
||||
integrity sha512-xwcl2EBNY3tr3FrFLxnwhqNEEuttINnoCtdpbiYB1Ya2jPakSuKRMwIM0DnogUk3nrshR/72hGD1GiBIjehIjQ==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/graphics@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/graphics/-/graphics-5.4.0-rc.3.tgz#9fa086f2dfbfd0c8df19981f2c2d5df320346bd6"
|
||||
integrity sha512-pfNOxrSXtQ1XA9fGy3WD8VzhrU8iQ4kkANTd0+NUoaKIyaGmouFfsrNKNm3nlqdhpHCmMWfrYIMXVStV20U6Vw==
|
||||
dependencies:
|
||||
"@pixi/constants" "5.4.0-rc.3"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/sprite" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/interaction@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/interaction/-/interaction-5.4.0-rc.3.tgz#3ba5741abae28ffbfa14feafb454c62ecc1f3644"
|
||||
integrity sha512-5QVwZ/kQywF+nmCDvLqOiW3wcv9/uueadTFnoxPAI2TZFK9npd2pEJc02tc3zhntelPtvELFT8Rob8Ux4tUMyg==
|
||||
dependencies:
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/ticker" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/loaders@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/loaders/-/loaders-5.4.0-rc.3.tgz#8c37846d355f4c017637c29533779b16f1383fa3"
|
||||
integrity sha512-c2tA7o/QTdhFBz5HmT+gYwEZRJBHNbQ//Dmz30CzbXyBza+tpS3HI/c1UJWqo83jhj7fC2hMKaqCW3TU1se3qw==
|
||||
dependencies:
|
||||
"@pixi/constants" "5.4.0-rc.3"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
resource-loader "^3.0.1"
|
||||
|
||||
"@pixi/math@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/math/-/math-5.3.2.tgz#a5f3b4f598794752e4783b1c1880f8fbbb305f57"
|
||||
integrity sha512-vddmG9pn6sfTs2V5BLn/1Jvk+6jReaHNdxZG5HzgvEMvFTTBB8VbfMg+Lg1GocWt198nnoq8NyP7O+PaqQPlig==
|
||||
"@pixi/math@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/math/-/math-5.4.0-rc.3.tgz#2f68d3cfc2dbfe961084e05776a30c6ea0d8f9a9"
|
||||
integrity sha512-lwsW45y8jaR6VY20tFYAhTRha62rmtarEbR5RBk4qUIyXgXm0e2LRoerx82uboyvF0ieyhWSnFBvjWLWFuol/Q==
|
||||
|
||||
"@pixi/mesh-extras@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/mesh-extras/-/mesh-extras-5.3.2.tgz#3e73fdd789ade7fc63d6b0ecaf027fdebf23c920"
|
||||
integrity sha512-K3JSGA9vvSMFBB68hvmYolf9tg5ZFc3cVDODGdz5c+aoC5hR8neJeCRtJCbZ820vLM/hknaqz0nOAG8aJAm5yQ==
|
||||
"@pixi/mesh-extras@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/mesh-extras/-/mesh-extras-5.4.0-rc.3.tgz#782d036e5881329b27ccbcf143d4595e5d1613d2"
|
||||
integrity sha512-4YYn2cmhvuzJuispaaUjWLft1n7PoUur/1BLUG79mUqPM/7oE75JfY2dkNd/c0WcLOdCZ+Qxn+mb6oSQS2oPdA==
|
||||
dependencies:
|
||||
"@pixi/constants" "5.3.2"
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/mesh" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/constants" "5.4.0-rc.3"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/mesh" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/mesh@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/mesh/-/mesh-5.3.2.tgz#1a113df8cae269d6b6d1841053dd7afad5de5bc6"
|
||||
integrity sha512-tz4FaaxCYTidOjobGEIBoNiHCeHt9G8T9j0hJqCO4HmYWEu22eMwrrudv0Q8lEJYT743AJEk8XFn4v8wWrEFQA==
|
||||
"@pixi/mesh@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/mesh/-/mesh-5.4.0-rc.3.tgz#24cba059312a9bd5691bba19cf6c47abd600d4cc"
|
||||
integrity sha512-bzBarR2MIFZP2MVDAgVYjEOKEsS9NkbNrOWQYj5IAD/IIKGzloVR8oNs/js/5GTlIvkzqMIP4vVBVflAdYonlw==
|
||||
dependencies:
|
||||
"@pixi/constants" "5.3.2"
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/settings" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/constants" "5.4.0-rc.3"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/settings" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/mixin-cache-as-bitmap@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-5.3.2.tgz#6d21d156dcfc495f7f03ff849709ddbaffca0603"
|
||||
integrity sha512-MST8irfUjFbbFLzCqkUbLcBusI24iQE2Wbu/nx3RNJ5Fd7b661YCYqFM6TZ/y4LHqmEKcWrPK/6PAAicX9Teeg==
|
||||
"@pixi/mixin-cache-as-bitmap@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-5.4.0-rc.3.tgz#bb3f91b20b65c3b6cdf4ad9a72f3dd47b0b686cd"
|
||||
integrity sha512-dCQnA4Kf1I42hqfRiSalbUcgeiLB51h0wvxcjftPYcs3n0ZYJ4vmUZ3q7J+RXDCUkcBj+A9qMm1auBesgmpp4w==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/settings" "5.3.2"
|
||||
"@pixi/sprite" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/settings" "5.4.0-rc.3"
|
||||
"@pixi/sprite" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/mixin-get-child-by-name@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-5.3.2.tgz#1556774e8cde29a3d68e5a8a17624d89c371dd40"
|
||||
integrity sha512-i21BtVtYu71nKMShfRnCf1VXaPCAGV2Cm203lp3SxkVyFvyHl4ex1bpzhKK0la4X7UK6gQIV8XHUAGqT4mzAiw==
|
||||
"@pixi/mixin-get-child-by-name@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-5.4.0-rc.3.tgz#d1f5a90f4ab4a05a92128ef3b3e0241d4ac54fd7"
|
||||
integrity sha512-M8ypn9xfEImbriyrn8HZ+u+PkA2OFdZa3D2HGM7rXj/ee89XskBp6kvuHdhJ5HU/EGuBEqYhwSpipzKsOUPdRw==
|
||||
dependencies:
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/mixin-get-global-position@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/mixin-get-global-position/-/mixin-get-global-position-5.3.2.tgz#481bf9c099a538382ef6b4cc801380e0ef5a0ac0"
|
||||
integrity sha512-IhdjMiGlYwabYpYs5GpOVKUCWYiz1ejK2Cj8Sddjzgb5T1puSOwvxnziolZeLodfshw+NX7FINeHwx6bbUV3cA==
|
||||
"@pixi/mixin-get-global-position@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/mixin-get-global-position/-/mixin-get-global-position-5.4.0-rc.3.tgz#f3eaeca78fce8bde0301897e1a91ae7d0ecbe245"
|
||||
integrity sha512-JDr76UpGqYAe9kTHxTeae8Z88vwpk1Uog5ORTIQ/SLEM5v1Gxndg9hmUxXLByl0voY0w+6zfKhGe34tcrqPuNw==
|
||||
dependencies:
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/particles@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/particles/-/particles-5.3.2.tgz#0b7956cbf07517b625404fb19efecdfd0f4001b1"
|
||||
integrity sha512-RiFJ7ORTGIVHdboXUEJCLP1sS7lmTumv7QJBj5xYxM/RwRb0d2SrU+U3XcfNCXC3VVk48EiDBo4DdfQR1oPYLA==
|
||||
"@pixi/particles@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/particles/-/particles-5.4.0-rc.3.tgz#f57f69dad8d9466d10b679ae6ef536955c6b3463"
|
||||
integrity sha512-1IPcMoDDwcicvb9g7IM/36N9XnFvYjN7M7esN27oW22JSsq9OkMZKAFSXVn6SKUbMLiyLKx4mNtIGWnnYql5/Q==
|
||||
dependencies:
|
||||
"@pixi/constants" "5.3.2"
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/constants" "5.4.0-rc.3"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/polyfill@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/polyfill/-/polyfill-5.3.2.tgz#2fb6f1ec218403d0727d19bab22c3d6df7ddaba8"
|
||||
integrity sha512-KXRlW1KEPfbxdrgxggFblSu7Nm7BTm9AH9kIO4+zGcyFsX1fVuq/PMlX60oekZTeJkpGlrJqQ219dW4kgG4spg==
|
||||
"@pixi/polyfill@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/polyfill/-/polyfill-5.4.0-rc.3.tgz#290643da2b4ff35b07ac4eed6d4eeeed4bcdd8a4"
|
||||
integrity sha512-JpXX3WaHXoQfKoXjKxxrgINR92faVZNdw79KcjcEP6HURptkdAisTadtaPHY657xyzd87q3jBdN9H+/npIxTgQ==
|
||||
dependencies:
|
||||
es6-promise-polyfill "^1.2.0"
|
||||
object-assign "^4.1.1"
|
||||
promise-polyfill "^8.2.0"
|
||||
|
||||
"@pixi/prepare@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/prepare/-/prepare-5.3.2.tgz#328a09da3c9f124ca2779c51cf99e026dd29b064"
|
||||
integrity sha512-ffNLm3zVWDd2YCvJcKgCLgi1xokMXqkUUhBzoulIS3BRiHuda9RE0gDzVP3twj9jPx6HZmewSu2Qp7m8L6TfcA==
|
||||
"@pixi/prepare@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/prepare/-/prepare-5.4.0-rc.3.tgz#d0f888de75055a31c0b549ea787ea1490c822900"
|
||||
integrity sha512-u5kceVVeQt4AQCDxh+wDXuqTIirG4NGLdKB5NCasydx6b4c9wDQM1ADaLJUilrSUCGLq8b3AD795xjyfLgrKag==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/graphics" "5.3.2"
|
||||
"@pixi/settings" "5.3.2"
|
||||
"@pixi/text" "5.3.2"
|
||||
"@pixi/ticker" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
"@pixi/graphics" "5.4.0-rc.3"
|
||||
"@pixi/settings" "5.4.0-rc.3"
|
||||
"@pixi/text" "5.4.0-rc.3"
|
||||
"@pixi/ticker" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/runner@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/runner/-/runner-5.3.2.tgz#d6243d0913cb2396f61757d0bc3eae7c7313ccc4"
|
||||
integrity sha512-otRRrob5ooExmvEI2m1WtIpPuAqaN2a2qofyVI9LOKqWIbzgdG4URQI3LmpUHOxyHZLPCJxxBEf+rf8Yxn/xnQ==
|
||||
"@pixi/runner@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/runner/-/runner-5.4.0-rc.3.tgz#a9d248cce41a2c67fd51463eb4b8708b36cbe9b7"
|
||||
integrity sha512-JfIFJ5axVKTTwZqZBllKrXg2+n7cZBijH/f6ozydK7ssRjIzBsRf1Y+HT0vCUz8hnweXME6ZQVzFl2ObcKn1GA==
|
||||
|
||||
"@pixi/settings@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/settings/-/settings-5.3.2.tgz#a6f8c3ecf81bd3acf3952cba18ccbea436f83a0c"
|
||||
integrity sha512-XuLyLBtvDu7UspzI9PmMtyfTh8F7pihC9NLaVv2VV8wyAeLO7wdjZN8JrIMiuqibzd7bJ93yoK1Xz0CsGfKz9g==
|
||||
"@pixi/settings@5.4.0-rc.3", "@pixi/settings@^5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/settings/-/settings-5.4.0-rc.3.tgz#adb3586d8c30f857dcf51650b2a606429e33186c"
|
||||
integrity sha512-P5QpvxTjabvscbYljFpQQa0abYyQ8b2HYWbfvfM4OHuG55BWtw2VjvlFtwtf7Wxg07akNHT5c/X+o2uR/sVJuA==
|
||||
dependencies:
|
||||
ismobilejs "^1.1.0"
|
||||
|
||||
"@pixi/sprite-animated@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/sprite-animated/-/sprite-animated-5.3.2.tgz#39765684eec5738114e198cc3453a294389c956d"
|
||||
integrity sha512-TO+Vi2KAL5EAUygmxjV6vKImCV6FTMNErC44/3VCzHSylW/ZBChk0zuImQOG8qB0+gFcSSWRZEIhP34hS6dMhQ==
|
||||
"@pixi/sprite-animated@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/sprite-animated/-/sprite-animated-5.4.0-rc.3.tgz#1dd51d22e71b2da4a06145c2abbeb26db3e3ad3b"
|
||||
integrity sha512-iJ66jYnAP94NBts8q+EjGgs7V03TB4HsBTFd0bqw9IgE3iweR4fQY3qZ/hapfu+eNz8Y5kGX+UdhIsus/JH0lA==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/sprite" "5.3.2"
|
||||
"@pixi/ticker" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/sprite" "5.4.0-rc.3"
|
||||
"@pixi/ticker" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/sprite-tiling@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/sprite-tiling/-/sprite-tiling-5.3.2.tgz#782b5be75b65df355b46532df1a3cc51b4552b14"
|
||||
integrity sha512-lS+xNjF43mLxo/bsJpRH9iIYdrSRzQ54vH1Yss9X/p2O57ISwBFaIzfYJAKFkQLumGLEeUg9hj7qcfJJRMOOYA==
|
||||
"@pixi/sprite-tiling@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/sprite-tiling/-/sprite-tiling-5.4.0-rc.3.tgz#0309e42b28a34784e5c08cf7a49488e0577a28d8"
|
||||
integrity sha512-TrQ+v0c3RtTwsIwOJACmpMetAK1pc6v17tWeoZ2d6xdJEZD9O1a0xtnK4WPWgglBvEW5x4i+FoMZs3IrAGHr6A==
|
||||
dependencies:
|
||||
"@pixi/constants" "5.3.2"
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/sprite" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/constants" "5.4.0-rc.3"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/sprite" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/sprite@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/sprite/-/sprite-5.3.2.tgz#dda4bfc517eab049a338dd9f30a7ca4de5781e66"
|
||||
integrity sha512-DKacTS+TzCDptW4N7jkL+2m7Xz3IeEv0C3JDffJaFk9R4WR7iUzNkXF2tUQfci5aBKobK0djFh7iFORPB6r0tg==
|
||||
"@pixi/sprite@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/sprite/-/sprite-5.4.0-rc.3.tgz#2d00537801150fbaf868ca9e2b7c094a8bca4ce4"
|
||||
integrity sha512-3Q3nqL1LLExjR0GiEAzp511y1N01Z8RrfIcE3kgQ/wNOO0OT0QcZPgq3SOzJIqOobsDOUEAZ7o57d+iMXHesgg==
|
||||
dependencies:
|
||||
"@pixi/constants" "5.3.2"
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/settings" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/constants" "5.4.0-rc.3"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/settings" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/spritesheet@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/spritesheet/-/spritesheet-5.3.2.tgz#d2470d4d0066886d0144c3379fcac2c419743c09"
|
||||
integrity sha512-FgOKJW0d/4wYCEJTyAfHRSZ972gZ50QtUTyy1GQIYKkZAwiLVnXkpVj7jBumaL9BbOt8AyCWIXsMk47C1DLcpg==
|
||||
"@pixi/spritesheet@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/spritesheet/-/spritesheet-5.4.0-rc.3.tgz#02c5aa69f8ad2293a015c324ceae25baf4a18a1e"
|
||||
integrity sha512-lwDpHmexLwtiro0zb9DEQt8NSpytRsarEXORcZuioH5lyGD/ygJxSIgnMbK4xlBcCG9FjNGi3oOUSYm2T+l+7g==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/loaders" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/loaders" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/text-bitmap@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/text-bitmap/-/text-bitmap-5.3.2.tgz#259bfe9222c0cd5dabb29a0a7ae2e0b24d33497e"
|
||||
integrity sha512-dbHzkjPp2BcbtK3fKlouJ2DanSOj1VWuutDIM1wTNqu9WsjjrT8n6STEQ2qn0Uzna0xypBaEKbin4o2dtTonWg==
|
||||
"@pixi/text-bitmap@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/text-bitmap/-/text-bitmap-5.4.0-rc.3.tgz#2e9393e9f0e86dd2f9d6ebf369c53197fdb70c91"
|
||||
integrity sha512-wIkptZ1W9NM6KAHSroTZzRdNltJBtR4jMITqpVPPtbtT7zAdMbBm7mZgpDtxSXlAjset77LUCLy+zyfdEYjy0g==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/loaders" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/mesh" "5.3.2"
|
||||
"@pixi/settings" "5.3.2"
|
||||
"@pixi/text" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
"@pixi/loaders" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/mesh" "5.4.0-rc.3"
|
||||
"@pixi/settings" "5.4.0-rc.3"
|
||||
"@pixi/text" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/text@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/text/-/text-5.3.2.tgz#13c8e174cfcd7d43d7312ac22a2e269e3e95ddf2"
|
||||
integrity sha512-NGGxN4LbkUqhQ0j19WwCjE3ELFPZBlDX8U85Z1xZbK1pOcI/k6k8h30+vsI4PRUMfNYo5s1NiOgEoZqflEMuog==
|
||||
"@pixi/text@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/text/-/text-5.4.0-rc.3.tgz#e61e017ede38984d3540388f2968d23d1dba075e"
|
||||
integrity sha512-/nv7Z3DnQpvPC3KlkMRSJRvYyjg02odpAFrSSu8/1HjTmIa+23scYTdeRA3kZdFkjd3+qvuBNuhlfmoYq0Fz7A==
|
||||
dependencies:
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/settings" "5.3.2"
|
||||
"@pixi/sprite" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/settings" "5.4.0-rc.3"
|
||||
"@pixi/sprite" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/ticker@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/ticker/-/ticker-5.3.2.tgz#8c714d144e10dccee15b7542eed53a894868e899"
|
||||
integrity sha512-5fc3A3XZbHpX8ho07ryTz5sLHx29ZlhRppmkR/fyzN8MTTFwERxyNjfb8SOfsm2xMmf3mQdjdWjZ0ClbhSSjzQ==
|
||||
"@pixi/ticker@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/ticker/-/ticker-5.4.0-rc.3.tgz#b07baa49e973bffdbc7c2adc18b72be34627011c"
|
||||
integrity sha512-TeU9vzzdOG1Io79pp+spopQpXHuFSYjntRcyBvUb9iQueAO7z2JQx6zA1O+A8axe62AS9+R5LcpA0EfoptxgsA==
|
||||
dependencies:
|
||||
"@pixi/settings" "5.3.2"
|
||||
"@pixi/settings" "5.4.0-rc.3"
|
||||
|
||||
"@pixi/utils@5.3.2":
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/utils/-/utils-5.3.2.tgz#643657780e204dbe2c072350627ffcc13b7b2b18"
|
||||
integrity sha512-/xt+05/U0ucvwSNZv+jT+/U+RYS+JCZu6r9tInQfIngZtKlemZbHinW9V641YqFVsfsLrsqZalL9hnhtJhXVHA==
|
||||
"@pixi/utils@5.4.0-rc.3":
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/@pixi/utils/-/utils-5.4.0-rc.3.tgz#ebaff0cc45c0dc9c07a28cab5479e3f1e7199096"
|
||||
integrity sha512-BtvswTnJqPLqAHxONeqEifMjXphNFNij3bBX0XzDqJ7bN4ZeR14JIgc21yWM4582nCwe6D31zmCuwDA61zoNWQ==
|
||||
dependencies:
|
||||
"@pixi/constants" "5.3.2"
|
||||
"@pixi/settings" "5.3.2"
|
||||
earcut "^2.1.5"
|
||||
"@pixi/constants" "5.4.0-rc.3"
|
||||
"@pixi/settings" "5.4.0-rc.3"
|
||||
"@types/earcut" "^2.1.0"
|
||||
css-color-names "^1.0.1"
|
||||
earcut "^2.2.2"
|
||||
eventemitter3 "^3.1.0"
|
||||
url "^0.11.0"
|
||||
|
||||
@ -361,6 +384,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/delaunator/-/delaunator-3.0.0.tgz#217475640c604def83709f18f652bb372e3897ca"
|
||||
integrity sha512-x8XXE/QqXUPafkqFXeJCQCq/S81IW/t49Nnhgx3yKmGwL89qFRxnXn5qtcil9GO3gVkjGy4SwgacOjCN1B6b7w==
|
||||
|
||||
"@types/earcut@^2.1.0":
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/earcut/-/earcut-2.1.1.tgz#573a0af609f17005c751f6f4ffec49cfe358ea51"
|
||||
integrity sha512-w8oigUCDjElRHRRrMvn/spybSMyX8MTkKA5Dv+tS1IE/TgmNZPqUYtvYBXGY8cieSE66gm+szeK+bnbxC2xHTQ==
|
||||
|
||||
"@types/emscripten@^1.39.4":
|
||||
version "1.39.4"
|
||||
resolved "https://registry.yarnpkg.com/@types/emscripten/-/emscripten-1.39.4.tgz#d61990c0cee72c4e475de737a140b51fe925a2c8"
|
||||
@ -811,6 +839,11 @@ cross-spawn@^6.0.5:
|
||||
shebang-command "^1.2.0"
|
||||
which "^1.2.9"
|
||||
|
||||
css-color-names@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz#6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67"
|
||||
integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==
|
||||
|
||||
css-parse@~2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4"
|
||||
@ -923,10 +956,10 @@ doctrine@^3.0.0:
|
||||
dependencies:
|
||||
esutils "^2.0.2"
|
||||
|
||||
earcut@^2.1.5:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.1.tgz#3bae0b1b6fec41853b56b126f03a42a34b28f1d5"
|
||||
integrity sha512-5jIMi2RB3HtGPHcYd9Yyl0cczo84y+48lgKPxMijliNQaKAHEZJbdzLmKmdxG/mCdS/YD9DQ1gihL8mxzR0F9w==
|
||||
earcut@^2.2.2:
|
||||
version "2.2.2"
|
||||
resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.2.tgz#41b0bc35f63e0fe80da7cddff28511e7e2e80d11"
|
||||
integrity sha512-eZoZPPJcUHnfRZ0PjLvx2qBordSiO8ofC3vt+qACLM95u+4DovnbYNpQtJh0DNsWj8RnxrQytD4WA8gj5cRIaQ==
|
||||
|
||||
ee-first@1.1.1:
|
||||
version "1.1.1"
|
||||
@ -981,11 +1014,6 @@ es-to-primitive@^1.2.1:
|
||||
is-date-object "^1.0.1"
|
||||
is-symbol "^1.0.2"
|
||||
|
||||
es6-promise-polyfill@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz#f38925f23cb3e3e8ce6cda8ff774fcebbb090cde"
|
||||
integrity sha1-84kl8jyz4+jObNqP93T867sJDN4=
|
||||
|
||||
escape-html@~1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
|
||||
@ -2184,45 +2212,46 @@ pify@^3.0.0:
|
||||
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
|
||||
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
|
||||
|
||||
pixi.js@^5.3.2:
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/pixi.js/-/pixi.js-5.3.2.tgz#3df3d0f9822eec0ba39f129c58867cd1e156aade"
|
||||
integrity sha512-j0lqv/njYveGJgWgtLW2BjuiGtWyPKAVq5aFs3lxWcEnxmVk7OX2BI3jRlkYB3v+gBXm2SPzQswblMsShHvyLQ==
|
||||
pixi.js@^5.4.0-rc.3:
|
||||
version "5.4.0-rc.3"
|
||||
resolved "https://registry.yarnpkg.com/pixi.js/-/pixi.js-5.4.0-rc.3.tgz#4f9e37239826759af87de2c3cf99e6ae4d3a8721"
|
||||
integrity sha512-XWSkiboUfOLPo/K4GsNi6dV3+syAABIezRTNtdQFOqedWjJUC6hktMQyROHrfQjAEK03EYgko0hLxQd2gwWstQ==
|
||||
dependencies:
|
||||
"@pixi/accessibility" "5.3.2"
|
||||
"@pixi/app" "5.3.2"
|
||||
"@pixi/constants" "5.3.2"
|
||||
"@pixi/core" "5.3.2"
|
||||
"@pixi/display" "5.3.2"
|
||||
"@pixi/extract" "5.3.2"
|
||||
"@pixi/filter-alpha" "5.3.2"
|
||||
"@pixi/filter-blur" "5.3.2"
|
||||
"@pixi/filter-color-matrix" "5.3.2"
|
||||
"@pixi/filter-displacement" "5.3.2"
|
||||
"@pixi/filter-fxaa" "5.3.2"
|
||||
"@pixi/filter-noise" "5.3.2"
|
||||
"@pixi/graphics" "5.3.2"
|
||||
"@pixi/interaction" "5.3.2"
|
||||
"@pixi/loaders" "5.3.2"
|
||||
"@pixi/math" "5.3.2"
|
||||
"@pixi/mesh" "5.3.2"
|
||||
"@pixi/mesh-extras" "5.3.2"
|
||||
"@pixi/mixin-cache-as-bitmap" "5.3.2"
|
||||
"@pixi/mixin-get-child-by-name" "5.3.2"
|
||||
"@pixi/mixin-get-global-position" "5.3.2"
|
||||
"@pixi/particles" "5.3.2"
|
||||
"@pixi/polyfill" "5.3.2"
|
||||
"@pixi/prepare" "5.3.2"
|
||||
"@pixi/runner" "5.3.2"
|
||||
"@pixi/settings" "5.3.2"
|
||||
"@pixi/sprite" "5.3.2"
|
||||
"@pixi/sprite-animated" "5.3.2"
|
||||
"@pixi/sprite-tiling" "5.3.2"
|
||||
"@pixi/spritesheet" "5.3.2"
|
||||
"@pixi/text" "5.3.2"
|
||||
"@pixi/text-bitmap" "5.3.2"
|
||||
"@pixi/ticker" "5.3.2"
|
||||
"@pixi/utils" "5.3.2"
|
||||
"@pixi/accessibility" "5.4.0-rc.3"
|
||||
"@pixi/app" "5.4.0-rc.3"
|
||||
"@pixi/compressed-textures" "5.4.0-rc.3"
|
||||
"@pixi/constants" "5.4.0-rc.3"
|
||||
"@pixi/core" "5.4.0-rc.3"
|
||||
"@pixi/display" "5.4.0-rc.3"
|
||||
"@pixi/extract" "5.4.0-rc.3"
|
||||
"@pixi/filter-alpha" "5.4.0-rc.3"
|
||||
"@pixi/filter-blur" "5.4.0-rc.3"
|
||||
"@pixi/filter-color-matrix" "5.4.0-rc.3"
|
||||
"@pixi/filter-displacement" "5.4.0-rc.3"
|
||||
"@pixi/filter-fxaa" "5.4.0-rc.3"
|
||||
"@pixi/filter-noise" "5.4.0-rc.3"
|
||||
"@pixi/graphics" "5.4.0-rc.3"
|
||||
"@pixi/interaction" "5.4.0-rc.3"
|
||||
"@pixi/loaders" "5.4.0-rc.3"
|
||||
"@pixi/math" "5.4.0-rc.3"
|
||||
"@pixi/mesh" "5.4.0-rc.3"
|
||||
"@pixi/mesh-extras" "5.4.0-rc.3"
|
||||
"@pixi/mixin-cache-as-bitmap" "5.4.0-rc.3"
|
||||
"@pixi/mixin-get-child-by-name" "5.4.0-rc.3"
|
||||
"@pixi/mixin-get-global-position" "5.4.0-rc.3"
|
||||
"@pixi/particles" "5.4.0-rc.3"
|
||||
"@pixi/polyfill" "5.4.0-rc.3"
|
||||
"@pixi/prepare" "5.4.0-rc.3"
|
||||
"@pixi/runner" "5.4.0-rc.3"
|
||||
"@pixi/settings" "5.4.0-rc.3"
|
||||
"@pixi/sprite" "5.4.0-rc.3"
|
||||
"@pixi/sprite-animated" "5.4.0-rc.3"
|
||||
"@pixi/sprite-tiling" "5.4.0-rc.3"
|
||||
"@pixi/spritesheet" "5.4.0-rc.3"
|
||||
"@pixi/text" "5.4.0-rc.3"
|
||||
"@pixi/text-bitmap" "5.4.0-rc.3"
|
||||
"@pixi/ticker" "5.4.0-rc.3"
|
||||
"@pixi/utils" "5.4.0-rc.3"
|
||||
|
||||
pkg-dir@^2.0.0:
|
||||
version "2.0.0"
|
||||
@ -2280,6 +2309,11 @@ progress@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
|
||||
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
|
||||
|
||||
promise-polyfill@^8.2.0:
|
||||
version "8.2.0"
|
||||
resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.2.0.tgz#367394726da7561457aba2133c9ceefbd6267da0"
|
||||
integrity sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==
|
||||
|
||||
proxy-addr@~2.0.5:
|
||||
version "2.0.5"
|
||||
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34"
|
||||
|
Loading…
Reference in New Issue
Block a user