1
0
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:
teoxoy 2020-12-12 17:04:32 +08:00
parent ed92acb864
commit 45d6d6ab85
46 changed files with 5765 additions and 457 deletions

2
.gitignore vendored
View File

@ -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

View File

@ -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"
]
}

View File

@ -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\"",

View File

@ -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",

View File

@ -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()

View File

@ -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'

View File

@ -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

View File

@ -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

View File

@ -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 {

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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 => {

View File

@ -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,
}

View File

@ -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()

View File

@ -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)

View File

@ -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)
}
}

View File

@ -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

View File

@ -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) {

View File

@ -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 {

View File

@ -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 {

View File

@ -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)
}
}

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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 =>

View File

@ -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'

View File

@ -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

View File

@ -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('/')

File diff suppressed because it is too large Load Diff

View File

@ -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'

View File

@ -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

File diff suppressed because it is too large Load Diff

View 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

Binary file not shown.

View 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)

View 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

View 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"]
}

View 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")
}

View 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(())
}

View File

@ -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",

View File

@ -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>' +

View File

@ -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) => {

View File

@ -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
View File

@ -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"