mirror of
https://github.com/barthuijgen/factorio-sites.git
synced 2025-03-29 22:55:16 +02:00
commit
c4851e9b49
1
.gitignore
vendored
1
.gitignore
vendored
@ -45,4 +45,3 @@ Thumbs.db
|
|||||||
.local.env
|
.local.env
|
||||||
.env
|
.env
|
||||||
local.readme.md
|
local.readme.md
|
||||||
.yalc
|
|
4
.yalc/@fbe/editor/.yalcignore
Normal file
4
.yalc/@fbe/editor/.yalcignore
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
*.md
|
||||||
|
tsconfig.json
|
||||||
|
/src
|
||||||
|
rollup.config.js
|
21
.yalc/@fbe/editor/dist/Editor.d.ts
vendored
Normal file
21
.yalc/@fbe/editor/dist/Editor.d.ts
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import { Blueprint, IOilOutpostSettings } from './core/Blueprint';
|
||||||
|
import { GridPattern } from './containers/BlueprintContainer';
|
||||||
|
export declare class Editor {
|
||||||
|
init(canvas: HTMLCanvasElement): Promise<void>;
|
||||||
|
setRendererSize(width: number, height: number): void;
|
||||||
|
get moveSpeed(): number;
|
||||||
|
set moveSpeed(speed: number);
|
||||||
|
get gridColor(): number;
|
||||||
|
set gridColor(color: number);
|
||||||
|
get gridPattern(): GridPattern;
|
||||||
|
set gridPattern(pattern: GridPattern);
|
||||||
|
get quickbarItems(): string[];
|
||||||
|
set quickbarItems(items: string[]);
|
||||||
|
get oilOutpostSettings(): IOilOutpostSettings;
|
||||||
|
set oilOutpostSettings(settings: IOilOutpostSettings);
|
||||||
|
get debug(): boolean;
|
||||||
|
set debug(debug: boolean);
|
||||||
|
getPicture(): Promise<Blob>;
|
||||||
|
loadBlueprint(bp: Blueprint): Promise<void>;
|
||||||
|
private registerActions;
|
||||||
|
}
|
6
.yalc/@fbe/editor/dist/UI/DebugContainer.d.ts
vendored
Normal file
6
.yalc/@fbe/editor/dist/UI/DebugContainer.d.ts
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
export declare class DebugContainer extends PIXI.Container {
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
constructor();
|
||||||
|
}
|
13
.yalc/@fbe/editor/dist/UI/EntityInfoPanel.d.ts
vendored
Normal file
13
.yalc/@fbe/editor/dist/UI/EntityInfoPanel.d.ts
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import { Entity } from '../core/Entity';
|
||||||
|
import { Panel } from './controls/Panel';
|
||||||
|
export declare class EntityInfoPanel extends Panel {
|
||||||
|
private title;
|
||||||
|
private m_EntityName;
|
||||||
|
private m_entityInfo;
|
||||||
|
private m_RecipeContainer;
|
||||||
|
private m_RecipeIOContainer;
|
||||||
|
constructor();
|
||||||
|
updateVisualization(entity?: Entity): void;
|
||||||
|
protected setPosition(): void;
|
||||||
|
private findNearbyBeacons;
|
||||||
|
}
|
11
.yalc/@fbe/editor/dist/UI/InventoryDialog.d.ts
vendored
Normal file
11
.yalc/@fbe/editor/dist/UI/InventoryDialog.d.ts
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { Dialog } from './controls/Dialog';
|
||||||
|
export declare class InventoryDialog extends Dialog {
|
||||||
|
private readonly m_InventoryGroups;
|
||||||
|
private readonly m_InventoryItems;
|
||||||
|
private readonly m_RecipeLabel;
|
||||||
|
private readonly m_RecipeContainer;
|
||||||
|
private m_hoveredItem;
|
||||||
|
constructor(title?: string, itemsFilter?: string[], selectedCallBack?: (selectedItem: string) => void);
|
||||||
|
protected setPosition(): void;
|
||||||
|
private updateRecipeVisualization;
|
||||||
|
}
|
15
.yalc/@fbe/editor/dist/UI/QuickbarPanel.d.ts
vendored
Normal file
15
.yalc/@fbe/editor/dist/UI/QuickbarPanel.d.ts
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { Panel } from './controls/Panel';
|
||||||
|
export declare class QuickbarPanel extends Panel {
|
||||||
|
private iWidth;
|
||||||
|
private iHeight;
|
||||||
|
private rows;
|
||||||
|
private slots;
|
||||||
|
private slotsContainer;
|
||||||
|
constructor(rows?: number, itemNames?: string[]);
|
||||||
|
private static createTriangleButton;
|
||||||
|
generateSlots(itemNames?: string[]): void;
|
||||||
|
bindKeyToSlot(slot: number): void;
|
||||||
|
changeActiveQuickbar(): void;
|
||||||
|
serialize(): string[];
|
||||||
|
protected setPosition(): void;
|
||||||
|
}
|
16
.yalc/@fbe/editor/dist/UI/UIContainer.d.ts
vendored
Normal file
16
.yalc/@fbe/editor/dist/UI/UIContainer.d.ts
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { Entity } from '../core/Entity';
|
||||||
|
import { QuickbarPanel } from './QuickbarPanel';
|
||||||
|
export declare class UIContainer extends PIXI.Container {
|
||||||
|
private debugContainer;
|
||||||
|
quickbarPanel: QuickbarPanel;
|
||||||
|
private entityInfoPanel;
|
||||||
|
private dialogsContainer;
|
||||||
|
private paintIconContainer;
|
||||||
|
constructor();
|
||||||
|
updateEntityInfoPanel(entity: Entity): void;
|
||||||
|
addPaintIcon(icon: PIXI.DisplayObject): void;
|
||||||
|
set showDebuggingLayer(visible: boolean);
|
||||||
|
createEditor(entity: Entity): void;
|
||||||
|
createInventory(title?: string, itemsFilter?: string[], selectedCallBack?: (selectedItem: string) => void): void;
|
||||||
|
}
|
18
.yalc/@fbe/editor/dist/UI/controls/Button.d.ts
vendored
Normal file
18
.yalc/@fbe/editor/dist/UI/controls/Button.d.ts
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
export declare class Button extends PIXI.Container {
|
||||||
|
private readonly m_Background;
|
||||||
|
private readonly m_Active;
|
||||||
|
private readonly m_Hover;
|
||||||
|
private m_Content;
|
||||||
|
private m_Data;
|
||||||
|
constructor(width?: number, height?: number, border?: number);
|
||||||
|
get active(): boolean;
|
||||||
|
set active(active: boolean);
|
||||||
|
get content(): PIXI.DisplayObject;
|
||||||
|
set content(content: PIXI.DisplayObject);
|
||||||
|
get data(): unknown;
|
||||||
|
set data(value: unknown);
|
||||||
|
protected get background(): number;
|
||||||
|
protected get hover(): number;
|
||||||
|
protected get pressed(): boolean;
|
||||||
|
}
|
11
.yalc/@fbe/editor/dist/UI/controls/Checkbox.d.ts
vendored
Normal file
11
.yalc/@fbe/editor/dist/UI/controls/Checkbox.d.ts
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
export declare class Checkbox extends PIXI.Container {
|
||||||
|
private static readonly CHECK_POLYGON;
|
||||||
|
private m_Checkbox;
|
||||||
|
private m_Hover;
|
||||||
|
private m_Checked;
|
||||||
|
constructor(checked?: boolean, text?: string);
|
||||||
|
private static drawGraphic;
|
||||||
|
get checked(): boolean;
|
||||||
|
set checked(checked: boolean);
|
||||||
|
}
|
15
.yalc/@fbe/editor/dist/UI/controls/Dialog.d.ts
vendored
Normal file
15
.yalc/@fbe/editor/dist/UI/controls/Dialog.d.ts
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { Panel } from './Panel';
|
||||||
|
export declare abstract class Dialog extends Panel {
|
||||||
|
protected static s_openDialogs: Dialog[];
|
||||||
|
constructor(width: number, height: number, title?: string);
|
||||||
|
static closeLast(): void;
|
||||||
|
static closeAll(): void;
|
||||||
|
static anyOpen(): boolean;
|
||||||
|
static isOpen<T extends Dialog>(dialog: T): boolean;
|
||||||
|
protected static capitalize(text: string): string;
|
||||||
|
protected setPosition(): void;
|
||||||
|
close(): void;
|
||||||
|
protected addLabel(x?: number, y?: number, text?: string, style?: PIXI.TextStyle): PIXI.Text;
|
||||||
|
protected addLine(x: number, y: number, width: number, height: number, border?: number): PIXI.Graphics;
|
||||||
|
}
|
10
.yalc/@fbe/editor/dist/UI/controls/Enable.d.ts
vendored
Normal file
10
.yalc/@fbe/editor/dist/UI/controls/Enable.d.ts
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
export declare class Enable extends PIXI.Container {
|
||||||
|
private readonly m_TextText;
|
||||||
|
private readonly m_HoverText;
|
||||||
|
private readonly m_ActiveText;
|
||||||
|
private m_Active;
|
||||||
|
constructor(active: boolean, text: string);
|
||||||
|
get active(): boolean;
|
||||||
|
set active(value: boolean);
|
||||||
|
}
|
10
.yalc/@fbe/editor/dist/UI/controls/Panel.d.ts
vendored
Normal file
10
.yalc/@fbe/editor/dist/UI/controls/Panel.d.ts
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
export declare abstract class Panel extends PIXI.Container {
|
||||||
|
private readonly m_Background;
|
||||||
|
private _setPosition;
|
||||||
|
constructor(width: number, height: number, background?: number, alpha?: number, border?: number);
|
||||||
|
destroy(): void;
|
||||||
|
get width(): number;
|
||||||
|
get height(): number;
|
||||||
|
protected abstract setPosition(): void;
|
||||||
|
}
|
18
.yalc/@fbe/editor/dist/UI/controls/Slider.d.ts
vendored
Normal file
18
.yalc/@fbe/editor/dist/UI/controls/Slider.d.ts
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
export declare class Slider extends PIXI.Container {
|
||||||
|
private static readonly SLIDER_WIDTH;
|
||||||
|
private static readonly SLIDER_HEIGHT;
|
||||||
|
private readonly m_SliderButton;
|
||||||
|
private readonly m_SliderValue;
|
||||||
|
private m_Dragging;
|
||||||
|
private m_Dragpoint;
|
||||||
|
private p_Value;
|
||||||
|
constructor(value?: number);
|
||||||
|
get value(): number;
|
||||||
|
set value(value: number);
|
||||||
|
private updateButtonPosition;
|
||||||
|
private updateSliderValue;
|
||||||
|
private readonly onButtonDragStart;
|
||||||
|
private readonly onButtonDragMove;
|
||||||
|
private readonly onButtonDragEnd;
|
||||||
|
}
|
6
.yalc/@fbe/editor/dist/UI/controls/Slot.d.ts
vendored
Normal file
6
.yalc/@fbe/editor/dist/UI/controls/Slot.d.ts
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import { Button } from './Button';
|
||||||
|
export declare class Slot extends Button {
|
||||||
|
get hover(): number;
|
||||||
|
get pressed(): boolean;
|
||||||
|
constructor(width?: number, height?: number, border?: number);
|
||||||
|
}
|
10
.yalc/@fbe/editor/dist/UI/controls/Switch.d.ts
vendored
Normal file
10
.yalc/@fbe/editor/dist/UI/controls/Switch.d.ts
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
export declare class Switch extends PIXI.Container {
|
||||||
|
private readonly m_Button;
|
||||||
|
private readonly m_Values;
|
||||||
|
private m_Value;
|
||||||
|
constructor(values: string[], value?: string);
|
||||||
|
get value(): string;
|
||||||
|
set value(value: string);
|
||||||
|
private updateButtonPosition;
|
||||||
|
}
|
20
.yalc/@fbe/editor/dist/UI/controls/Textbox.d.ts
vendored
Normal file
20
.yalc/@fbe/editor/dist/UI/controls/Textbox.d.ts
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
export declare class Textbox extends PIXI.Container {
|
||||||
|
private readonly m_Background;
|
||||||
|
private readonly m_Active;
|
||||||
|
private readonly m_Text;
|
||||||
|
private readonly m_Length;
|
||||||
|
private readonly m_Filter;
|
||||||
|
private readonly m_CaretGraphic;
|
||||||
|
private p_CaretPosition;
|
||||||
|
private m_MouseInside;
|
||||||
|
constructor(width: number, text?: string, length?: number, filter?: string);
|
||||||
|
get text(): string;
|
||||||
|
set text(text: string);
|
||||||
|
private get caretPosition();
|
||||||
|
private set caretPosition(value);
|
||||||
|
private instertCharacter;
|
||||||
|
private removeCharacter;
|
||||||
|
private readonly onPointerUp;
|
||||||
|
private readonly keyPressedCallback;
|
||||||
|
}
|
19
.yalc/@fbe/editor/dist/UI/controls/functions.d.ts
vendored
Normal file
19
.yalc/@fbe/editor/dist/UI/controls/functions.d.ts
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { IngredientOrResult, ColorWithAlpha } from '../../core/factorioData';
|
||||||
|
declare function ShadeColor(color: number, percent: number): number;
|
||||||
|
declare function DrawRectangle(width: number, height: number, background: number, alpha?: number, border?: number, pressed?: boolean): PIXI.Graphics;
|
||||||
|
declare function DrawControlFace(w: number, h: number, f: number, c: number, a: number, p0: number, p1: number, p2: number, p3: number): PIXI.Graphics;
|
||||||
|
declare function CreateIcon(itemName: string, maxSize?: number, setAnchor?: boolean, darkBackground?: boolean): PIXI.DisplayObject;
|
||||||
|
declare function CreateIconWithAmount(host: PIXI.Container, x: number, y: number, name: string, amount: number): void;
|
||||||
|
declare function CreateRecipe(host: PIXI.Container, x: number, y: number, ingredients: IngredientOrResult[], results: IngredientOrResult[], time: number): void;
|
||||||
|
declare function applyTint(s: PIXI.Sprite, tint: ColorWithAlpha): void;
|
||||||
|
declare const _default: {
|
||||||
|
ShadeColor: typeof ShadeColor;
|
||||||
|
DrawRectangle: typeof DrawRectangle;
|
||||||
|
DrawControlFace: typeof DrawControlFace;
|
||||||
|
CreateIcon: typeof CreateIcon;
|
||||||
|
CreateIconWithAmount: typeof CreateIconWithAmount;
|
||||||
|
CreateRecipe: typeof CreateRecipe;
|
||||||
|
applyTint: typeof applyTint;
|
||||||
|
};
|
||||||
|
export default _default;
|
5
.yalc/@fbe/editor/dist/UI/editors/BeaconEditor.d.ts
vendored
Normal file
5
.yalc/@fbe/editor/dist/UI/editors/BeaconEditor.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import { Entity } from '../../core/Entity';
|
||||||
|
import { Editor } from './Editor';
|
||||||
|
export declare class BeaconEditor extends Editor {
|
||||||
|
constructor(entity: Entity);
|
||||||
|
}
|
7
.yalc/@fbe/editor/dist/UI/editors/ChestEditor.d.ts
vendored
Normal file
7
.yalc/@fbe/editor/dist/UI/editors/ChestEditor.d.ts
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import { Entity } from '../../core/Entity';
|
||||||
|
import { Editor } from './Editor';
|
||||||
|
export declare class ChestEditor extends Editor {
|
||||||
|
private readonly m_Amount;
|
||||||
|
private m_Filter;
|
||||||
|
constructor(entity: Entity);
|
||||||
|
}
|
16
.yalc/@fbe/editor/dist/UI/editors/Editor.d.ts
vendored
Normal file
16
.yalc/@fbe/editor/dist/UI/editors/Editor.d.ts
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { Entity } from '../../core/Entity';
|
||||||
|
import { Dialog } from '../controls/Dialog';
|
||||||
|
import { Preview } from './components/Preview';
|
||||||
|
import { Recipe } from './components/Recipe';
|
||||||
|
import { Modules } from './components/Modules';
|
||||||
|
import { Filters } from './components/Filters';
|
||||||
|
export declare abstract class Editor extends Dialog {
|
||||||
|
protected readonly m_Entity: Entity;
|
||||||
|
protected readonly m_Preview: Preview;
|
||||||
|
constructor(width: number, height: number, entity: Entity);
|
||||||
|
protected addRecipe(x?: number, y?: number): Recipe;
|
||||||
|
protected addModules(x?: number, y?: number): Modules;
|
||||||
|
protected addFilters(x?: number, y?: number, amount?: boolean): Filters;
|
||||||
|
protected onEntityChange(event: string, fn: (...args: any[]) => void): void;
|
||||||
|
destroy(): void;
|
||||||
|
}
|
5
.yalc/@fbe/editor/dist/UI/editors/InserterEditor.d.ts
vendored
Normal file
5
.yalc/@fbe/editor/dist/UI/editors/InserterEditor.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import { Entity } from '../../core/Entity';
|
||||||
|
import { Editor } from './Editor';
|
||||||
|
export declare class InserterEditor extends Editor {
|
||||||
|
constructor(entity: Entity);
|
||||||
|
}
|
5
.yalc/@fbe/editor/dist/UI/editors/MachineEditor.d.ts
vendored
Normal file
5
.yalc/@fbe/editor/dist/UI/editors/MachineEditor.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import { Entity } from '../../core/Entity';
|
||||||
|
import { Editor } from './Editor';
|
||||||
|
export declare class MachineEditor extends Editor {
|
||||||
|
constructor(entity: Entity);
|
||||||
|
}
|
5
.yalc/@fbe/editor/dist/UI/editors/MiningEditor.d.ts
vendored
Normal file
5
.yalc/@fbe/editor/dist/UI/editors/MiningEditor.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import { Entity } from '../../core/Entity';
|
||||||
|
import { Editor } from './Editor';
|
||||||
|
export declare class MiningEditor extends Editor {
|
||||||
|
constructor(entity: Entity);
|
||||||
|
}
|
5
.yalc/@fbe/editor/dist/UI/editors/SplitterEditor.d.ts
vendored
Normal file
5
.yalc/@fbe/editor/dist/UI/editors/SplitterEditor.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import { Entity } from '../../core/Entity';
|
||||||
|
import { Editor } from './Editor';
|
||||||
|
export declare class SplitterEditor extends Editor {
|
||||||
|
constructor(entity: Entity);
|
||||||
|
}
|
5
.yalc/@fbe/editor/dist/UI/editors/TempEditor.d.ts
vendored
Normal file
5
.yalc/@fbe/editor/dist/UI/editors/TempEditor.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import { Entity } from '../../core/Entity';
|
||||||
|
import { Editor } from './Editor';
|
||||||
|
export declare class TempEditor extends Editor {
|
||||||
|
constructor(entity: Entity);
|
||||||
|
}
|
15
.yalc/@fbe/editor/dist/UI/editors/components/Filters.d.ts
vendored
Normal file
15
.yalc/@fbe/editor/dist/UI/editors/components/Filters.d.ts
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { Entity } from '../../../core/Entity';
|
||||||
|
export declare class Filters extends PIXI.Container {
|
||||||
|
private readonly m_Entity;
|
||||||
|
private readonly m_Amount;
|
||||||
|
private m_Filters;
|
||||||
|
constructor(entity: Entity, amount?: boolean);
|
||||||
|
private onEntityChange;
|
||||||
|
destroy(opts?: boolean | PIXI.IDestroyOptions): void;
|
||||||
|
updateFilter(index: number, count: number): void;
|
||||||
|
getFilterCount(index: number): number;
|
||||||
|
private m_UpdateFilters;
|
||||||
|
private m_UpdateSlots;
|
||||||
|
private readonly onSlotPointerDown;
|
||||||
|
}
|
11
.yalc/@fbe/editor/dist/UI/editors/components/Modules.d.ts
vendored
Normal file
11
.yalc/@fbe/editor/dist/UI/editors/components/Modules.d.ts
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { Entity } from '../../../core/Entity';
|
||||||
|
export declare class Modules extends PIXI.Container {
|
||||||
|
private readonly m_Entity;
|
||||||
|
private readonly m_Modules;
|
||||||
|
constructor(entity: Entity);
|
||||||
|
private onEntityChange;
|
||||||
|
destroy(opts?: boolean | PIXI.IDestroyOptions): void;
|
||||||
|
private updateContent;
|
||||||
|
private onSlotPointerDown;
|
||||||
|
}
|
12
.yalc/@fbe/editor/dist/UI/editors/components/Preview.d.ts
vendored
Normal file
12
.yalc/@fbe/editor/dist/UI/editors/components/Preview.d.ts
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { Entity } from '../../../core/Entity';
|
||||||
|
export declare class Preview extends PIXI.Container {
|
||||||
|
private readonly m_Entity;
|
||||||
|
private readonly m_Size;
|
||||||
|
private m_Preview;
|
||||||
|
constructor(entity: Entity, size: number);
|
||||||
|
private onEntityChange;
|
||||||
|
destroy(opts?: boolean | PIXI.IDestroyOptions): void;
|
||||||
|
private generatePreview;
|
||||||
|
private readonly onEntityChanged;
|
||||||
|
}
|
11
.yalc/@fbe/editor/dist/UI/editors/components/Recipe.d.ts
vendored
Normal file
11
.yalc/@fbe/editor/dist/UI/editors/components/Recipe.d.ts
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { Entity } from '../../../core/Entity';
|
||||||
|
import { Slot } from '../../controls/Slot';
|
||||||
|
export declare class Recipe extends Slot {
|
||||||
|
private readonly m_Entity;
|
||||||
|
constructor(entity: Entity);
|
||||||
|
private onEntityChange;
|
||||||
|
destroy(opts?: boolean | PIXI.IDestroyOptions): void;
|
||||||
|
private updateContent;
|
||||||
|
private onSlotPointerDown;
|
||||||
|
}
|
3
.yalc/@fbe/editor/dist/UI/editors/factory.d.ts
vendored
Normal file
3
.yalc/@fbe/editor/dist/UI/editors/factory.d.ts
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
import { Entity } from '../../core/Entity';
|
||||||
|
import { Editor } from './Editor';
|
||||||
|
export declare function createEditor(entity: Entity): Editor;
|
183
.yalc/@fbe/editor/dist/UI/style.d.ts
vendored
Normal file
183
.yalc/@fbe/editor/dist/UI/style.d.ts
vendored
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
import { TextStyle } from 'pixi.js';
|
||||||
|
declare const colors: {
|
||||||
|
text: {
|
||||||
|
title: number;
|
||||||
|
normal: number;
|
||||||
|
link: number;
|
||||||
|
accent: number;
|
||||||
|
};
|
||||||
|
controls: {
|
||||||
|
button: {
|
||||||
|
border: number;
|
||||||
|
background: {
|
||||||
|
color: number;
|
||||||
|
alpha: number;
|
||||||
|
};
|
||||||
|
hover: {
|
||||||
|
color: number;
|
||||||
|
alpha: number;
|
||||||
|
};
|
||||||
|
active: {
|
||||||
|
color: number;
|
||||||
|
alpha: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
checkbox: {
|
||||||
|
foreground: {
|
||||||
|
color: number;
|
||||||
|
};
|
||||||
|
background: {
|
||||||
|
color: number;
|
||||||
|
alpha: number;
|
||||||
|
};
|
||||||
|
checkmark: {
|
||||||
|
color: number;
|
||||||
|
alpha: number;
|
||||||
|
};
|
||||||
|
hover: {
|
||||||
|
color: number;
|
||||||
|
alpha: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
enable: {
|
||||||
|
text: {
|
||||||
|
color: number;
|
||||||
|
};
|
||||||
|
hover: {
|
||||||
|
color: number;
|
||||||
|
};
|
||||||
|
active: {
|
||||||
|
color: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
panel: {
|
||||||
|
background: {
|
||||||
|
color: number;
|
||||||
|
alpha: number;
|
||||||
|
border: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
slider: {
|
||||||
|
slidebar: {
|
||||||
|
color: number;
|
||||||
|
p0: number;
|
||||||
|
p1: number;
|
||||||
|
p2: number;
|
||||||
|
p3: number;
|
||||||
|
};
|
||||||
|
button: {
|
||||||
|
color: number;
|
||||||
|
p0: number;
|
||||||
|
p1: number;
|
||||||
|
p2: number;
|
||||||
|
p3: number;
|
||||||
|
};
|
||||||
|
hover: {
|
||||||
|
color: number;
|
||||||
|
p0: number;
|
||||||
|
p1: number;
|
||||||
|
p2: number;
|
||||||
|
p3: number;
|
||||||
|
};
|
||||||
|
value: {
|
||||||
|
color: number;
|
||||||
|
p0: number;
|
||||||
|
p1: number;
|
||||||
|
p2: number;
|
||||||
|
p3: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
slot: {
|
||||||
|
hover: {
|
||||||
|
color: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
switch: {
|
||||||
|
background: {
|
||||||
|
color: number;
|
||||||
|
p0: number;
|
||||||
|
p1: number;
|
||||||
|
p2: number;
|
||||||
|
p3: number;
|
||||||
|
};
|
||||||
|
hover: {
|
||||||
|
color: number;
|
||||||
|
p0: number;
|
||||||
|
p1: number;
|
||||||
|
p2: number;
|
||||||
|
p3: number;
|
||||||
|
};
|
||||||
|
line: {
|
||||||
|
color: number;
|
||||||
|
p0: number;
|
||||||
|
p1: number;
|
||||||
|
p2: number;
|
||||||
|
p3: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
textbox: {
|
||||||
|
foreground: {
|
||||||
|
color: number;
|
||||||
|
};
|
||||||
|
background: {
|
||||||
|
color: number;
|
||||||
|
alpha: number;
|
||||||
|
};
|
||||||
|
active: {
|
||||||
|
color: number;
|
||||||
|
alpha: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
dialog: {
|
||||||
|
background: {
|
||||||
|
color: number;
|
||||||
|
alpha: number;
|
||||||
|
border: number;
|
||||||
|
};
|
||||||
|
line: {
|
||||||
|
background: {
|
||||||
|
color: number;
|
||||||
|
alpha: number;
|
||||||
|
border: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
editor: {
|
||||||
|
sprite: {
|
||||||
|
background: {
|
||||||
|
color: number;
|
||||||
|
alpha: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
quickbar: {
|
||||||
|
background: {
|
||||||
|
color: number;
|
||||||
|
alpha: number;
|
||||||
|
border: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
declare const styles: {
|
||||||
|
controls: {
|
||||||
|
checkbox: TextStyle;
|
||||||
|
enable: {
|
||||||
|
text: TextStyle;
|
||||||
|
hover: TextStyle;
|
||||||
|
active: TextStyle;
|
||||||
|
};
|
||||||
|
textbox: TextStyle;
|
||||||
|
};
|
||||||
|
dialog: {
|
||||||
|
title: TextStyle;
|
||||||
|
label: TextStyle;
|
||||||
|
};
|
||||||
|
icon: {
|
||||||
|
amount: TextStyle;
|
||||||
|
};
|
||||||
|
debug: {
|
||||||
|
text: TextStyle;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
export { colors, styles };
|
35
.yalc/@fbe/editor/dist/actions.d.ts
vendored
Normal file
35
.yalc/@fbe/editor/dist/actions.d.ts
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import keyboardJS from 'keyboardjs';
|
||||||
|
declare function initActions(canvas: HTMLCanvasElement): void;
|
||||||
|
declare function passtroughAllEvents(cb: (e: keyboardJS.KeyEvent) => boolean): void;
|
||||||
|
declare class Action {
|
||||||
|
readonly name: string;
|
||||||
|
private readonly defaultKeyCombo;
|
||||||
|
private m_active;
|
||||||
|
private m_keyCombo;
|
||||||
|
private handlers;
|
||||||
|
private _pressed;
|
||||||
|
constructor(name: string, defaultKeyCombo: string);
|
||||||
|
get prettyName(): string;
|
||||||
|
private get active();
|
||||||
|
private set active(value);
|
||||||
|
get keyCombo(): string;
|
||||||
|
set keyCombo(value: string);
|
||||||
|
get pressed(): boolean;
|
||||||
|
get usesDefaultKeyCombo(): boolean;
|
||||||
|
resetKeyCombo(): void;
|
||||||
|
bind(opts: {
|
||||||
|
press?: (e: keyboardJS.KeyEvent) => void;
|
||||||
|
release?: (e: keyboardJS.KeyEvent) => void;
|
||||||
|
once?: boolean;
|
||||||
|
repeat?: boolean;
|
||||||
|
}): void;
|
||||||
|
call(): void;
|
||||||
|
}
|
||||||
|
declare function registerAction(name: string, keyCombo: string): Action;
|
||||||
|
declare function callAction(name: string): void;
|
||||||
|
declare function isActionActive(name: string): boolean;
|
||||||
|
declare function forEachAction(cb: (action: Action, actionName: string) => void): void;
|
||||||
|
declare function resetKeybinds(): void;
|
||||||
|
declare function importKeybinds(keybinds: Record<string, string>): void;
|
||||||
|
declare function exportKeybinds(changedOnly?: boolean): Record<string, string>;
|
||||||
|
export { initActions, passtroughAllEvents, registerAction, callAction, isActionActive, forEachAction, resetKeybinds, importKeybinds, exportKeybinds, };
|
17
.yalc/@fbe/editor/dist/common/globals.d.ts
vendored
Normal file
17
.yalc/@fbe/editor/dist/common/globals.d.ts
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { Blueprint } from '../core/Blueprint';
|
||||||
|
import { UIContainer } from '../UI/UIContainer';
|
||||||
|
import { BlueprintContainer } from '../containers/BlueprintContainer';
|
||||||
|
declare function waitForLoader(): Promise<void>;
|
||||||
|
declare function getTexture(path: string, x?: number, y?: number, w?: number, h?: number): PIXI.Texture;
|
||||||
|
declare const _default: {
|
||||||
|
debug: boolean;
|
||||||
|
hr: boolean;
|
||||||
|
BPC: BlueprintContainer;
|
||||||
|
UI: UIContainer;
|
||||||
|
app: PIXI.Application;
|
||||||
|
bp: Blueprint;
|
||||||
|
getTexture: typeof getTexture;
|
||||||
|
waitForLoader: typeof waitForLoader;
|
||||||
|
};
|
||||||
|
export default _default;
|
23
.yalc/@fbe/editor/dist/common/util.d.ts
vendored
Normal file
23
.yalc/@fbe/editor/dist/common/util.d.ts
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
declare const _default: {
|
||||||
|
duplicate: <T>(obj: T) => T;
|
||||||
|
getRandomInt: (min: number, max: number) => number;
|
||||||
|
getRandomItem: <T_1>(array: T_1[]) => T_1;
|
||||||
|
getRelativeDirection: (position: IPoint) => 0 | 2 | 4 | 6;
|
||||||
|
rotatePointBasedOnDir: (p: IPoint | number[], dir: number) => IPoint;
|
||||||
|
transformConnectionPosition: (position: IPoint, direction: number) => IPoint;
|
||||||
|
switchSizeBasedOnDirection: (size: {
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
}, direction: number) => IPoint;
|
||||||
|
intToDir: (i: number) => "north" | "east" | "south" | "west";
|
||||||
|
nearestPowerOf2: (n: number) => number;
|
||||||
|
uniqueInArray: <T_2>(array: T_2[]) => T_2[];
|
||||||
|
equalArrays: <T_3>(array1: T_3[], array2: T_3[]) => boolean;
|
||||||
|
areObjectsEquivalent: <T_4 extends Record<string, any>>(a: T_4, b: T_4) => boolean;
|
||||||
|
areArraysEquivalent: <T_5>(a: T_5[], b: T_5[]) => boolean;
|
||||||
|
timer: (name: string) => {
|
||||||
|
stop: () => void;
|
||||||
|
};
|
||||||
|
objectHasOwnProperty: (obj: Record<string, unknown>, key: string) => boolean;
|
||||||
|
};
|
||||||
|
export default _default;
|
88
.yalc/@fbe/editor/dist/containers/BlueprintContainer.d.ts
vendored
Normal file
88
.yalc/@fbe/editor/dist/containers/BlueprintContainer.d.ts
vendored
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { Entity } from '../core/Entity';
|
||||||
|
import { Blueprint } from '../core/Blueprint';
|
||||||
|
import { EntitySprite } from './EntitySprite';
|
||||||
|
import { WiresContainer } from './WiresContainer';
|
||||||
|
import { UnderlayContainer } from './UnderlayContainer';
|
||||||
|
import { EntityContainer } from './EntityContainer';
|
||||||
|
import { OverlayContainer } from './OverlayContainer';
|
||||||
|
import { PaintContainer } from './PaintContainer';
|
||||||
|
import { GridData } from './GridData';
|
||||||
|
export declare type GridPattern = 'checker' | 'grid';
|
||||||
|
export declare enum EditorMode {
|
||||||
|
NONE = 0,
|
||||||
|
EDIT = 1,
|
||||||
|
PAINT = 2,
|
||||||
|
PAN = 3,
|
||||||
|
COPY = 4,
|
||||||
|
DELETE = 5
|
||||||
|
}
|
||||||
|
export declare class BlueprintContainer extends PIXI.Container {
|
||||||
|
private readonly chunks;
|
||||||
|
private readonly chunkOffset;
|
||||||
|
private readonly size;
|
||||||
|
private readonly anchor;
|
||||||
|
private readonly viewport;
|
||||||
|
private _moveSpeed;
|
||||||
|
private _gridColor;
|
||||||
|
private _gridPattern;
|
||||||
|
private _mode;
|
||||||
|
readonly bp: Blueprint;
|
||||||
|
readonly gridData: GridData;
|
||||||
|
private grid;
|
||||||
|
private readonly chunkGrid;
|
||||||
|
private readonly tileSprites;
|
||||||
|
private readonly tilePaintSlot;
|
||||||
|
readonly underlayContainer: UnderlayContainer;
|
||||||
|
private readonly entitySprites;
|
||||||
|
readonly wiresContainer: WiresContainer;
|
||||||
|
readonly overlayContainer: OverlayContainer;
|
||||||
|
private readonly entityPaintSlot;
|
||||||
|
hoverContainer: EntityContainer;
|
||||||
|
paintContainer: PaintContainer;
|
||||||
|
private _entityForCopyData;
|
||||||
|
private copyModeEntities;
|
||||||
|
private deleteModeEntities;
|
||||||
|
private copyModeUpdateFn;
|
||||||
|
private deleteModeUpdateFn;
|
||||||
|
viewportCulling: boolean;
|
||||||
|
readonly interactive = true;
|
||||||
|
readonly interactiveChildren = false;
|
||||||
|
readonly hitArea: PIXI.Rectangle;
|
||||||
|
constructor(bp: Blueprint);
|
||||||
|
get entityForCopyData(): Entity;
|
||||||
|
copyEntitySettings(): void;
|
||||||
|
pasteEntitySettings(): void;
|
||||||
|
getViewportScale(): number;
|
||||||
|
toWorld(x: number, y: number): [number, number];
|
||||||
|
render(renderer: PIXI.Renderer): void;
|
||||||
|
get mode(): EditorMode;
|
||||||
|
private setMode;
|
||||||
|
enterCopyMode(): void;
|
||||||
|
exitCopyMode(cancel?: boolean): void;
|
||||||
|
enterDeleteMode(): void;
|
||||||
|
exitDeleteMode(cancel?: boolean): void;
|
||||||
|
enterPanMode(): void;
|
||||||
|
exitPanMode(): void;
|
||||||
|
zoom(zoomIn?: boolean): void;
|
||||||
|
private get isPointerInside();
|
||||||
|
private updateHoverContainer;
|
||||||
|
get moveSpeed(): number;
|
||||||
|
set moveSpeed(speed: number);
|
||||||
|
get gridColor(): number;
|
||||||
|
set gridColor(color: number);
|
||||||
|
get gridPattern(): GridPattern;
|
||||||
|
set gridPattern(pattern: GridPattern);
|
||||||
|
private generateGrid;
|
||||||
|
private generateChunkGrid;
|
||||||
|
initBP(): void;
|
||||||
|
destroy(): void;
|
||||||
|
addEntitySprites(entitySprites: EntitySprite[], sort?: boolean): void;
|
||||||
|
addTileSprites(tileSprites: EntitySprite[]): void;
|
||||||
|
private sortEntities;
|
||||||
|
transparentEntities(bool?: boolean): void;
|
||||||
|
centerViewport(): void;
|
||||||
|
getBlueprintBounds(): PIXI.Rectangle;
|
||||||
|
getPicture(): Promise<Blob>;
|
||||||
|
spawnPaintContainer(itemNameOrEntities: string | Entity[], direction?: number): void;
|
||||||
|
}
|
43
.yalc/@fbe/editor/dist/containers/DynamicSpritesheet.d.ts
vendored
Normal file
43
.yalc/@fbe/editor/dist/containers/DynamicSpritesheet.d.ts
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { EventEmitter } from 'eventemitter3';
|
||||||
|
interface IOptions {
|
||||||
|
maxSize: number;
|
||||||
|
alpha: boolean;
|
||||||
|
scaleMode: PIXI.SCALE_MODES;
|
||||||
|
padding: number;
|
||||||
|
extrude: boolean;
|
||||||
|
testBoxes: boolean;
|
||||||
|
show: boolean;
|
||||||
|
}
|
||||||
|
export declare class DynamicSpritesheet extends EventEmitter {
|
||||||
|
private testBoxes;
|
||||||
|
private maxSize;
|
||||||
|
private padding;
|
||||||
|
private show;
|
||||||
|
private extrude;
|
||||||
|
private maxLoading;
|
||||||
|
private baseTextures;
|
||||||
|
private entries;
|
||||||
|
private canvasesDiv;
|
||||||
|
private packer;
|
||||||
|
private loading;
|
||||||
|
private nrOfBinsOnLastRepack;
|
||||||
|
private textureToEntry;
|
||||||
|
private rendering;
|
||||||
|
private rerender;
|
||||||
|
private firstRender;
|
||||||
|
private alpha;
|
||||||
|
private subtextures;
|
||||||
|
private waitingQueue;
|
||||||
|
constructor(options?: Partial<IOptions>);
|
||||||
|
progress(tick: (loaded: number, total: number) => void): void;
|
||||||
|
awaitSprites(): Promise<void>;
|
||||||
|
private add;
|
||||||
|
get(filename: string, x?: number, y?: number, width?: number, height?: number): PIXI.Texture;
|
||||||
|
getSubtexture(mainTexture: PIXI.Texture, filename: string, x: number, y: number, width: number, height: number): PIXI.Texture;
|
||||||
|
onAllLoaded(textures: PIXI.Texture[]): Promise<void>;
|
||||||
|
render(): Promise<void>;
|
||||||
|
private randomColor;
|
||||||
|
private extrudeEntry;
|
||||||
|
}
|
||||||
|
export {};
|
26
.yalc/@fbe/editor/dist/containers/EntityContainer.d.ts
vendored
Normal file
26
.yalc/@fbe/editor/dist/containers/EntityContainer.d.ts
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { CursorBoxType } from '../core/factorioData';
|
||||||
|
import { Entity } from '../core/Entity';
|
||||||
|
export declare class EntityContainer {
|
||||||
|
static readonly mappings: Map<number, EntityContainer>;
|
||||||
|
private static _updateGroups;
|
||||||
|
private static get updateGroups();
|
||||||
|
private visualizationArea;
|
||||||
|
private entityInfo;
|
||||||
|
private entitySprites;
|
||||||
|
private cursorBoxContainer;
|
||||||
|
private undergroundLine;
|
||||||
|
private readonly m_Entity;
|
||||||
|
constructor(entity: Entity, sort?: boolean);
|
||||||
|
private static generateUpdateGroups;
|
||||||
|
get entity(): Entity;
|
||||||
|
get position(): IPoint;
|
||||||
|
set cursorBox(type: CursorBoxType);
|
||||||
|
private createUndergroundLine;
|
||||||
|
private destroyUndergroundLine;
|
||||||
|
private updateUndergroundLine;
|
||||||
|
private redrawEntityInfo;
|
||||||
|
pointerOverEventHandler(): void;
|
||||||
|
pointerOutEventHandler(): void;
|
||||||
|
private redrawSurroundingEntities;
|
||||||
|
redraw(ignoreConnections?: boolean, sort?: boolean): void;
|
||||||
|
}
|
37
.yalc/@fbe/editor/dist/containers/EntitySprite.d.ts
vendored
Normal file
37
.yalc/@fbe/editor/dist/containers/EntitySprite.d.ts
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { Entity } from '../core/Entity';
|
||||||
|
import { PositionGrid } from '../core/PositionGrid';
|
||||||
|
import { ISpriteData } from '../core/spriteDataBuilder';
|
||||||
|
interface IEntityData {
|
||||||
|
name: string;
|
||||||
|
type?: string;
|
||||||
|
direction?: number;
|
||||||
|
position?: IPoint;
|
||||||
|
generateConnector?: boolean;
|
||||||
|
directionType?: string;
|
||||||
|
operator?: string;
|
||||||
|
assemblerCraftsWithFluid?: boolean;
|
||||||
|
assemblerPipeDirection?: string;
|
||||||
|
trainStopColor?: {
|
||||||
|
r: number;
|
||||||
|
g: number;
|
||||||
|
b: number;
|
||||||
|
a: number;
|
||||||
|
};
|
||||||
|
chemicalPlantDontConnectOutput?: boolean;
|
||||||
|
modules?: string[];
|
||||||
|
}
|
||||||
|
export declare class EntitySprite extends PIXI.Sprite {
|
||||||
|
private static nextID;
|
||||||
|
private id;
|
||||||
|
zIndex: number;
|
||||||
|
private zOrder;
|
||||||
|
cachedBounds: [number, number, number, number];
|
||||||
|
private readonly entityPos;
|
||||||
|
constructor(texture: PIXI.Texture, data: ISpriteData, position?: IPoint);
|
||||||
|
private static getNextID;
|
||||||
|
static getParts(entity: IEntityData | Entity, position?: IPoint, positionGrid?: PositionGrid): EntitySprite[];
|
||||||
|
static compareFn(a: EntitySprite, b: EntitySprite): number;
|
||||||
|
private cacheBounds;
|
||||||
|
}
|
||||||
|
export {};
|
23
.yalc/@fbe/editor/dist/containers/GridData.d.ts
vendored
Normal file
23
.yalc/@fbe/editor/dist/containers/GridData.d.ts
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { EventEmitter } from 'eventemitter3';
|
||||||
|
import { BlueprintContainer } from './BlueprintContainer';
|
||||||
|
export declare class GridData extends EventEmitter {
|
||||||
|
private readonly bpc;
|
||||||
|
private _x;
|
||||||
|
private _y;
|
||||||
|
private _x16;
|
||||||
|
private _y16;
|
||||||
|
private _x32;
|
||||||
|
private _y32;
|
||||||
|
private lastMousePosX;
|
||||||
|
private lastMousePosY;
|
||||||
|
constructor(bpc: BlueprintContainer);
|
||||||
|
get x(): number;
|
||||||
|
get y(): number;
|
||||||
|
get x16(): number;
|
||||||
|
get y16(): number;
|
||||||
|
get x32(): number;
|
||||||
|
get y32(): number;
|
||||||
|
destroy(): void;
|
||||||
|
recalculate(): void;
|
||||||
|
private update;
|
||||||
|
}
|
10
.yalc/@fbe/editor/dist/containers/OptimizedContainer.d.ts
vendored
Normal file
10
.yalc/@fbe/editor/dist/containers/OptimizedContainer.d.ts
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { EntitySprite } from './EntitySprite';
|
||||||
|
import { BlueprintContainer } from './BlueprintContainer';
|
||||||
|
export declare class OptimizedContainer extends PIXI.Container {
|
||||||
|
private bpc;
|
||||||
|
children: EntitySprite[];
|
||||||
|
constructor(bpc: BlueprintContainer);
|
||||||
|
updateTransform(): void;
|
||||||
|
render(renderer: PIXI.Renderer): void;
|
||||||
|
}
|
23
.yalc/@fbe/editor/dist/containers/OverlayContainer.d.ts
vendored
Normal file
23
.yalc/@fbe/editor/dist/containers/OverlayContainer.d.ts
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { CursorBoxType } from '../core/factorioData';
|
||||||
|
import { Entity } from '../core/Entity';
|
||||||
|
import { BlueprintContainer } from './BlueprintContainer';
|
||||||
|
export declare class OverlayContainer extends PIXI.Container {
|
||||||
|
private readonly bpc;
|
||||||
|
private readonly entityInfos;
|
||||||
|
private readonly cursorBoxes;
|
||||||
|
private readonly undergroundLines;
|
||||||
|
private readonly selectionArea;
|
||||||
|
private copyCursorBox;
|
||||||
|
private selectionAreaUpdateFn;
|
||||||
|
constructor(bpc: BlueprintContainer);
|
||||||
|
static createEntityInfo(entity: Entity, position: IPoint): PIXI.Container;
|
||||||
|
createCopyCursorBox(): void;
|
||||||
|
destroyCopyCursorBox(): void;
|
||||||
|
toggleEntityInfoVisibility(): void;
|
||||||
|
createEntityInfo(entity: Entity, position: IPoint): PIXI.Container;
|
||||||
|
createCursorBox(position: IPoint, size: IPoint, type?: CursorBoxType): PIXI.Container;
|
||||||
|
createUndergroundLine(name: string, position: IPoint, direction: number, searchDirection: number): PIXI.Container;
|
||||||
|
showSelectionArea(color: number): void;
|
||||||
|
hideSelectionArea(): void;
|
||||||
|
}
|
19
.yalc/@fbe/editor/dist/containers/PaintBlueprintContainer.d.ts
vendored
Normal file
19
.yalc/@fbe/editor/dist/containers/PaintBlueprintContainer.d.ts
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import { Entity } from '../core/Entity';
|
||||||
|
import { EntitySprite } from './EntitySprite';
|
||||||
|
import { PaintContainer } from './PaintContainer';
|
||||||
|
import { BlueprintContainer } from './BlueprintContainer';
|
||||||
|
export declare class PaintBlueprintContainer extends PaintContainer {
|
||||||
|
private readonly bp;
|
||||||
|
private readonly entities;
|
||||||
|
children: EntitySprite[];
|
||||||
|
constructor(bpc: BlueprintContainer, entities: Entity[]);
|
||||||
|
hide(): void;
|
||||||
|
show(): void;
|
||||||
|
destroy(): void;
|
||||||
|
getItemName(): string;
|
||||||
|
rotate(): void;
|
||||||
|
moveAtCursor(): void;
|
||||||
|
protected redraw(): void;
|
||||||
|
placeEntityContainer(): void;
|
||||||
|
removeContainerUnder(): void;
|
||||||
|
}
|
24
.yalc/@fbe/editor/dist/containers/PaintBlueprintEntityContainer.d.ts
vendored
Normal file
24
.yalc/@fbe/editor/dist/containers/PaintBlueprintEntityContainer.d.ts
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import { Entity } from '../core/Entity';
|
||||||
|
import { Blueprint } from '../core/Blueprint';
|
||||||
|
import { EntitySprite } from './EntitySprite';
|
||||||
|
import { BlueprintContainer } from './BlueprintContainer';
|
||||||
|
import { PaintBlueprintContainer } from './PaintBlueprintContainer';
|
||||||
|
export declare class PaintBlueprintEntityContainer {
|
||||||
|
private readonly pbpc;
|
||||||
|
private readonly bpc;
|
||||||
|
private readonly bp;
|
||||||
|
private readonly entity;
|
||||||
|
private readonly visualizationArea;
|
||||||
|
readonly entitySprites: EntitySprite[];
|
||||||
|
private undergroundLine;
|
||||||
|
constructor(pbpc: PaintBlueprintContainer, bpc: BlueprintContainer, bp: Blueprint, entity: Entity);
|
||||||
|
private get entityPosition();
|
||||||
|
private get position();
|
||||||
|
destroy(): void;
|
||||||
|
private checkBuildable;
|
||||||
|
private updateUndergroundLine;
|
||||||
|
private destroyUndergroundLine;
|
||||||
|
moveAtCursor(): void;
|
||||||
|
removeContainerUnder(): void;
|
||||||
|
placeEntityContainer(): Entity;
|
||||||
|
}
|
23
.yalc/@fbe/editor/dist/containers/PaintContainer.d.ts
vendored
Normal file
23
.yalc/@fbe/editor/dist/containers/PaintContainer.d.ts
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { BlueprintContainer } from './BlueprintContainer';
|
||||||
|
export declare abstract class PaintContainer extends PIXI.Container {
|
||||||
|
protected readonly bpc: BlueprintContainer;
|
||||||
|
private readonly icon;
|
||||||
|
private _blocked;
|
||||||
|
private tint;
|
||||||
|
protected constructor(bpc: BlueprintContainer, name: string);
|
||||||
|
protected get blocked(): boolean;
|
||||||
|
protected set blocked(value: boolean);
|
||||||
|
hide(): void;
|
||||||
|
show(): void;
|
||||||
|
destroy(): void;
|
||||||
|
protected getGridPosition(): IPoint;
|
||||||
|
protected setNewPosition(size: IPoint): void;
|
||||||
|
private readonly updateIconPos;
|
||||||
|
abstract getItemName(): string;
|
||||||
|
abstract rotate(ccw?: boolean): void;
|
||||||
|
protected abstract redraw(): void;
|
||||||
|
abstract moveAtCursor(): void;
|
||||||
|
abstract removeContainerUnder(): void;
|
||||||
|
abstract placeEntityContainer(): void;
|
||||||
|
}
|
23
.yalc/@fbe/editor/dist/containers/PaintEntityContainer.d.ts
vendored
Normal file
23
.yalc/@fbe/editor/dist/containers/PaintEntityContainer.d.ts
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { PaintContainer } from './PaintContainer';
|
||||||
|
import { BlueprintContainer } from './BlueprintContainer';
|
||||||
|
export declare class PaintEntityContainer extends PaintContainer {
|
||||||
|
private visualizationArea;
|
||||||
|
private directionType;
|
||||||
|
private direction;
|
||||||
|
private undergroundLine;
|
||||||
|
constructor(bpc: BlueprintContainer, name: string, direction: number);
|
||||||
|
private get size();
|
||||||
|
hide(): void;
|
||||||
|
show(): void;
|
||||||
|
destroy(): void;
|
||||||
|
getItemName(): string;
|
||||||
|
private checkBuildable;
|
||||||
|
private updateUndergroundBeltRotation;
|
||||||
|
private updateUndergroundLine;
|
||||||
|
private destroyUndergroundLine;
|
||||||
|
rotate(ccw?: boolean): void;
|
||||||
|
protected redraw(): void;
|
||||||
|
moveAtCursor(): void;
|
||||||
|
removeContainerUnder(): void;
|
||||||
|
placeEntityContainer(): void;
|
||||||
|
}
|
18
.yalc/@fbe/editor/dist/containers/PaintTileContainer.d.ts
vendored
Normal file
18
.yalc/@fbe/editor/dist/containers/PaintTileContainer.d.ts
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { PaintContainer } from './PaintContainer';
|
||||||
|
import { BlueprintContainer } from './BlueprintContainer';
|
||||||
|
export declare class PaintTileContainer extends PaintContainer {
|
||||||
|
private static size;
|
||||||
|
constructor(bpc: BlueprintContainer, name: string);
|
||||||
|
private static getTilePositions;
|
||||||
|
hide(): void;
|
||||||
|
show(): void;
|
||||||
|
destroy(): void;
|
||||||
|
getItemName(): string;
|
||||||
|
increaseSize(): void;
|
||||||
|
decreaseSize(): void;
|
||||||
|
rotate(): void;
|
||||||
|
protected redraw(): void;
|
||||||
|
moveAtCursor(): void;
|
||||||
|
removeContainerUnder(): void;
|
||||||
|
placeEntityContainer(): void;
|
||||||
|
}
|
8
.yalc/@fbe/editor/dist/containers/TileContainer.d.ts
vendored
Normal file
8
.yalc/@fbe/editor/dist/containers/TileContainer.d.ts
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import { Tile } from '../core/Tile';
|
||||||
|
import { EntitySprite } from './EntitySprite';
|
||||||
|
export declare class TileContainer {
|
||||||
|
private readonly tileSprites;
|
||||||
|
constructor(tile: Tile);
|
||||||
|
static generateSprite(name: string, x: number, y: number): EntitySprite;
|
||||||
|
static generateSprites(name: string, position: IPoint, positions: IPoint[]): EntitySprite[];
|
||||||
|
}
|
16
.yalc/@fbe/editor/dist/containers/UnderlayContainer.d.ts
vendored
Normal file
16
.yalc/@fbe/editor/dist/containers/UnderlayContainer.d.ts
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { VisualizationArea } from './VisualizationArea';
|
||||||
|
export declare class UnderlayContainer extends PIXI.Container {
|
||||||
|
private active;
|
||||||
|
private readonly logistics0;
|
||||||
|
private readonly logistics1;
|
||||||
|
private readonly poles;
|
||||||
|
private readonly beacons;
|
||||||
|
private readonly drills;
|
||||||
|
private readonly dummyVisualizationArea;
|
||||||
|
constructor();
|
||||||
|
private static getDataForVisualizationArea;
|
||||||
|
activateRelatedAreas(entityName: string): void;
|
||||||
|
deactivateActiveAreas(): void;
|
||||||
|
create(entityName: string, position: IPoint): VisualizationArea;
|
||||||
|
}
|
28
.yalc/@fbe/editor/dist/containers/Viewport.d.ts
vendored
Normal file
28
.yalc/@fbe/editor/dist/containers/Viewport.d.ts
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
export declare class Viewport {
|
||||||
|
private size;
|
||||||
|
private viewPortSize;
|
||||||
|
private anchor;
|
||||||
|
private maxZoom;
|
||||||
|
private dirty;
|
||||||
|
private positionX;
|
||||||
|
private positionY;
|
||||||
|
private scaleX;
|
||||||
|
private scaleY;
|
||||||
|
private scaleCenterX;
|
||||||
|
private scaleCenterY;
|
||||||
|
private origTransform;
|
||||||
|
private transform;
|
||||||
|
constructor(size: IPoint, viewPortSize: IPoint, anchor: IPoint, maxZoom: number);
|
||||||
|
private _updateMatrix;
|
||||||
|
centerViewPort(focusObjectSize: IPoint, offset: IPoint): void;
|
||||||
|
update(): boolean;
|
||||||
|
getTransform(): PIXI.Matrix;
|
||||||
|
setSize(x: number, y: number): void;
|
||||||
|
setPosition(posX: number, posY: number): void;
|
||||||
|
zoomBy(deltaX: number, deltaY?: number): void;
|
||||||
|
translateBy(deltaX: number, deltaY: number): void;
|
||||||
|
setCurrentScale(newScale: number): void;
|
||||||
|
getCurrentScale(): number;
|
||||||
|
setScaleCenter(posX: number, posY: number): void;
|
||||||
|
}
|
11
.yalc/@fbe/editor/dist/containers/VisualizationArea.d.ts
vendored
Normal file
11
.yalc/@fbe/editor/dist/containers/VisualizationArea.d.ts
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
export declare class VisualizationArea {
|
||||||
|
static ALPHA: number;
|
||||||
|
private readonly sprites;
|
||||||
|
constructor(sprites: PIXI.Sprite[]);
|
||||||
|
destroy(): void;
|
||||||
|
show(): void;
|
||||||
|
hide(): void;
|
||||||
|
highlight(): void;
|
||||||
|
moveTo(position: IPoint): void;
|
||||||
|
}
|
17
.yalc/@fbe/editor/dist/containers/WiresContainer.d.ts
vendored
Normal file
17
.yalc/@fbe/editor/dist/containers/WiresContainer.d.ts
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
import { Blueprint } from '../core/Blueprint';
|
||||||
|
import { IConnection } from '../core/WireConnections';
|
||||||
|
export declare class WiresContainer extends PIXI.Container {
|
||||||
|
private readonly bp;
|
||||||
|
private connectionToSprite;
|
||||||
|
constructor(bp: Blueprint);
|
||||||
|
private static createWire;
|
||||||
|
connect(hash: string, connection: IConnection): void;
|
||||||
|
disconnect(hash: string, connection: IConnection): void;
|
||||||
|
add(hash: string, connection: IConnection): void;
|
||||||
|
remove(hash: string): void;
|
||||||
|
update(entityNumber: number): void;
|
||||||
|
private updateConnectedEntities;
|
||||||
|
private redrawEntityConnections;
|
||||||
|
private getWireSprite;
|
||||||
|
}
|
59
.yalc/@fbe/editor/dist/core/Blueprint.d.ts
vendored
Normal file
59
.yalc/@fbe/editor/dist/core/Blueprint.d.ts
vendored
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import { EventEmitter } from 'eventemitter3';
|
||||||
|
import { Entity } from './Entity';
|
||||||
|
import { WireConnections } from './WireConnections';
|
||||||
|
import { PositionGrid } from './PositionGrid';
|
||||||
|
import { History } from './History';
|
||||||
|
import { Tile } from './Tile';
|
||||||
|
interface IOilOutpostSettings extends Record<string, string | boolean | number> {
|
||||||
|
DEBUG: boolean;
|
||||||
|
PUMPJACK_MODULE: string;
|
||||||
|
MIN_GAP_BETWEEN_UNDERGROUNDS: number;
|
||||||
|
BEACONS: boolean;
|
||||||
|
MIN_AFFECTED_ENTITIES: number;
|
||||||
|
BEACON_MODULE: string;
|
||||||
|
}
|
||||||
|
declare const oilOutpostSettings: IOilOutpostSettings;
|
||||||
|
declare const getFactorioVersion: (main?: number, major?: number, minor?: number) => number;
|
||||||
|
declare class OurMap<K, V> extends Map<K, V> {
|
||||||
|
constructor(values?: V[], mapFn?: (value: V) => K);
|
||||||
|
isEmpty(): boolean;
|
||||||
|
valuesArray(): V[];
|
||||||
|
find(predicate: (value: V, key: K) => boolean): V;
|
||||||
|
filter(predicate: (value: V, key: K) => boolean): V[];
|
||||||
|
}
|
||||||
|
interface IEntityData extends Omit<BPS.IEntity, 'entity_number'> {
|
||||||
|
entity_number?: number;
|
||||||
|
}
|
||||||
|
export declare class Blueprint extends EventEmitter {
|
||||||
|
name: string;
|
||||||
|
private readonly icons;
|
||||||
|
readonly wireConnections: WireConnections;
|
||||||
|
readonly entityPositionGrid: PositionGrid;
|
||||||
|
readonly entities: OurMap<number, Entity>;
|
||||||
|
readonly tiles: OurMap<string, Tile>;
|
||||||
|
readonly history: History;
|
||||||
|
private readonly description?;
|
||||||
|
private readonly schedules?;
|
||||||
|
private readonly absolute_snapping?;
|
||||||
|
private readonly snap_to_grid?;
|
||||||
|
private readonly position_relative_to_grid?;
|
||||||
|
private m_nextEntityNumber;
|
||||||
|
constructor(data?: Partial<BPS.IBlueprint>);
|
||||||
|
createEntity(rawData: IEntityData, connectPowerPole?: boolean): Entity;
|
||||||
|
removeEntity(entity: Entity): void;
|
||||||
|
removeEntities(entities: Entity[]): void;
|
||||||
|
fastReplaceEntity(name: string, direction: number, position: IPoint): boolean;
|
||||||
|
private onCreateOrRemoveEntity;
|
||||||
|
createTiles(name: string, positions: IPoint[]): void;
|
||||||
|
removeTiles(positions: IPoint[]): void;
|
||||||
|
private onCreateOrRemoveTile;
|
||||||
|
private get nextEntityNumber();
|
||||||
|
getFirstRailRelatedEntity(): Entity;
|
||||||
|
isEmpty(): boolean;
|
||||||
|
private getCenter;
|
||||||
|
generatePipes(): string;
|
||||||
|
private generateIcons;
|
||||||
|
private processRawEntities;
|
||||||
|
serialize(): BPS.IBlueprint;
|
||||||
|
}
|
||||||
|
export { oilOutpostSettings, getFactorioVersion, IOilOutpostSettings };
|
16
.yalc/@fbe/editor/dist/core/Book.d.ts
vendored
Normal file
16
.yalc/@fbe/editor/dist/core/Book.d.ts
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { Blueprint } from './Blueprint';
|
||||||
|
declare class Book {
|
||||||
|
private _active;
|
||||||
|
private _activeIndex;
|
||||||
|
private readonly blueprints;
|
||||||
|
private readonly label?;
|
||||||
|
private readonly description?;
|
||||||
|
private readonly icons?;
|
||||||
|
constructor(data: BPS.IBlueprintBook);
|
||||||
|
get activeIndex(): number;
|
||||||
|
get lastBookIndex(): number;
|
||||||
|
private saveActiveBlueprint;
|
||||||
|
selectBlueprint(index?: number): Blueprint;
|
||||||
|
serialize(): BPS.IBlueprintBook;
|
||||||
|
}
|
||||||
|
export { Book };
|
75
.yalc/@fbe/editor/dist/core/Entity.d.ts
vendored
Normal file
75
.yalc/@fbe/editor/dist/core/Entity.d.ts
vendored
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import { EventEmitter } from 'eventemitter3';
|
||||||
|
import { Entity as FD_Entity } from './factorioData';
|
||||||
|
import { Blueprint } from './Blueprint';
|
||||||
|
export interface IFilter {
|
||||||
|
index: number;
|
||||||
|
name: string;
|
||||||
|
count?: number;
|
||||||
|
}
|
||||||
|
export declare class Entity extends EventEmitter {
|
||||||
|
private readonly m_rawEntity;
|
||||||
|
private readonly m_BP;
|
||||||
|
constructor(rawEntity: BPS.IEntity, blueprint: Blueprint);
|
||||||
|
static getItemName(name: string): string;
|
||||||
|
destroy(): void;
|
||||||
|
get Blueprint(): Blueprint;
|
||||||
|
get entityNumber(): number;
|
||||||
|
get name(): string;
|
||||||
|
get type(): string;
|
||||||
|
get entityData(): FD_Entity;
|
||||||
|
get size(): IPoint;
|
||||||
|
get position(): IPoint;
|
||||||
|
set position(position: IPoint);
|
||||||
|
get maxWireDistance(): number;
|
||||||
|
moveBy(offset: IPoint): void;
|
||||||
|
get direction(): number;
|
||||||
|
set direction(direction: number);
|
||||||
|
get directionType(): 'input' | 'output';
|
||||||
|
set directionType(type: 'input' | 'output');
|
||||||
|
get recipe(): string;
|
||||||
|
set recipe(recipe: string);
|
||||||
|
get acceptedRecipes(): string[];
|
||||||
|
get moduleSlots(): number;
|
||||||
|
get acceptedModules(): string[];
|
||||||
|
get acceptedFilters(): string[];
|
||||||
|
get modules(): string[];
|
||||||
|
set modules(modules: string[]);
|
||||||
|
get filterSlots(): number;
|
||||||
|
get filters(): IFilter[];
|
||||||
|
set filters(list: IFilter[]);
|
||||||
|
get splitterInputPriority(): string;
|
||||||
|
set splitterInputPriority(priority: string);
|
||||||
|
get splitterOutputPriority(): string;
|
||||||
|
set splitterOutputPriority(priority: string);
|
||||||
|
private get splitterFilter();
|
||||||
|
private set splitterFilter(value);
|
||||||
|
get filterMode(): 'whitelist' | 'blacklist';
|
||||||
|
set filterMode(filterMode: 'whitelist' | 'blacklist');
|
||||||
|
private get inserterFilters();
|
||||||
|
private set inserterFilters(value);
|
||||||
|
private get logisticChestFilters();
|
||||||
|
private set logisticChestFilters(value);
|
||||||
|
private get infinityChestFilters();
|
||||||
|
private get infinityPipeFilters();
|
||||||
|
get requestFromBufferChest(): boolean;
|
||||||
|
set requestFromBufferChest(request: boolean);
|
||||||
|
get inserterStackSize(): number;
|
||||||
|
get constantCombinatorFilters(): BPS.IConstantCombinatorFilter[];
|
||||||
|
get deciderCombinatorConditions(): BPS.IDeciderCondition;
|
||||||
|
get arithmeticCombinatorConditions(): BPS.IArithmeticCondition;
|
||||||
|
get generateConnector(): boolean;
|
||||||
|
private get connectToLogisticNetwork();
|
||||||
|
private get hasConnections();
|
||||||
|
get chemicalPlantDontConnectOutput(): boolean;
|
||||||
|
get trainStopColor(): BPS.IColor;
|
||||||
|
get operator(): string;
|
||||||
|
private get canBeRotated();
|
||||||
|
rotate(ccw?: boolean, rotateOpposingUB?: boolean): void;
|
||||||
|
canPasteSettings(sourceEntity: Entity): boolean;
|
||||||
|
pasteSettings(sourceEntity: Entity): void;
|
||||||
|
get assemblerCraftsWithFluid(): boolean;
|
||||||
|
get mayCraftWithFluid(): boolean;
|
||||||
|
get assemblerPipeDirection(): 'input' | 'output';
|
||||||
|
getWireConnectionPoint(color: string, side: number, direction?: number): number[];
|
||||||
|
serialize(entNrWhitelist?: Set<number>): BPS.IEntity;
|
||||||
|
}
|
37
.yalc/@fbe/editor/dist/core/History.d.ts
vendored
Normal file
37
.yalc/@fbe/editor/dist/core/History.d.ts
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
declare enum HistoryValue {
|
||||||
|
New = 0,
|
||||||
|
Old = 1
|
||||||
|
}
|
||||||
|
declare class Action<V> {
|
||||||
|
readonly oldValue: V;
|
||||||
|
readonly newValue: V;
|
||||||
|
readonly text: string;
|
||||||
|
private readonly applyFn;
|
||||||
|
private readonly emits;
|
||||||
|
private readonly history;
|
||||||
|
applyImmediate: boolean;
|
||||||
|
constructor(history: History, oldValue: V, newValue: V, text: string, applyFn: (value: V) => void);
|
||||||
|
commit(): this;
|
||||||
|
apply(value?: HistoryValue): void;
|
||||||
|
onDone(f: (newValue: V, oldValue: V) => void): Action<V>;
|
||||||
|
}
|
||||||
|
export declare class History {
|
||||||
|
logging: boolean;
|
||||||
|
private readonly MAX_HISTORY_LENGTH;
|
||||||
|
private readonly MIN_HISTORY_LENGTH;
|
||||||
|
private transactionCount;
|
||||||
|
private historyIndex;
|
||||||
|
private activeTransaction;
|
||||||
|
private transactionHistory;
|
||||||
|
reset(): void;
|
||||||
|
updateValue<T, V>(target: T, path: string[], value: V, text: string): Action<V>;
|
||||||
|
updateMap<K, V>(target: Map<K, V>, key: K, value: V, text: string): Action<V>;
|
||||||
|
undo(): boolean;
|
||||||
|
redo(): boolean;
|
||||||
|
startTransaction(text?: string, applyImmediate?: boolean): boolean;
|
||||||
|
commitTransaction(): boolean;
|
||||||
|
private GetValue;
|
||||||
|
private SetValue;
|
||||||
|
private DeleteValue;
|
||||||
|
}
|
||||||
|
export {};
|
33
.yalc/@fbe/editor/dist/core/PositionGrid.d.ts
vendored
Normal file
33
.yalc/@fbe/editor/dist/core/PositionGrid.d.ts
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import { Blueprint } from './Blueprint';
|
||||||
|
import { Entity } from './Entity';
|
||||||
|
interface IArea {
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
w: number;
|
||||||
|
h: number;
|
||||||
|
}
|
||||||
|
interface INeighbourData extends IPoint {
|
||||||
|
relDir: number;
|
||||||
|
entity: Entity;
|
||||||
|
}
|
||||||
|
export declare class PositionGrid {
|
||||||
|
private bp;
|
||||||
|
private grid;
|
||||||
|
constructor(bp: Blueprint);
|
||||||
|
private tileDataAction;
|
||||||
|
getEntityAtPosition(x: number, y: number): Entity;
|
||||||
|
setTileData(entity: Entity, position?: IPoint): void;
|
||||||
|
removeTileData(entity: Entity, position?: IPoint): void;
|
||||||
|
canMoveTo(entity: Entity, newPosition: IPoint): boolean;
|
||||||
|
isAreaAvalible(name: string, pos: IPoint, direction?: number): boolean;
|
||||||
|
checkFastReplaceableGroup(name: string, direction: number, pos: IPoint): Entity;
|
||||||
|
checkSameEntityAndDifferentDirection(name: string, direction: number, pos: IPoint): Entity;
|
||||||
|
getOpposingEntity(name: string, direction: number, position: IPoint, searchDirection: number, maxDistance: number): number;
|
||||||
|
sharesCell(area: IArea): boolean;
|
||||||
|
isAreaEmpty(area: IArea): boolean;
|
||||||
|
findInArea(area: IArea, fn: (entity: Entity) => boolean): Entity;
|
||||||
|
getEntitiesInArea(area: IArea): Entity[];
|
||||||
|
getSurroundingEntities(area: IArea): Entity[];
|
||||||
|
getNeighbourData(point: IPoint): INeighbourData[];
|
||||||
|
}
|
||||||
|
export {};
|
13
.yalc/@fbe/editor/dist/core/Tile.d.ts
vendored
Normal file
13
.yalc/@fbe/editor/dist/core/Tile.d.ts
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import { EventEmitter } from 'eventemitter3';
|
||||||
|
export declare class Tile extends EventEmitter {
|
||||||
|
private readonly _name;
|
||||||
|
private readonly _x;
|
||||||
|
private readonly _y;
|
||||||
|
constructor(name: string, x: number, y: number);
|
||||||
|
static getItemName(name: string): string;
|
||||||
|
get name(): string;
|
||||||
|
get x(): number;
|
||||||
|
get y(): number;
|
||||||
|
get hash(): string;
|
||||||
|
destroy(): void;
|
||||||
|
}
|
8
.yalc/@fbe/editor/dist/core/WireConnectionMap.d.ts
vendored
Normal file
8
.yalc/@fbe/editor/dist/core/WireConnectionMap.d.ts
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import { IConnection } from './WireConnections';
|
||||||
|
export declare class WireConnectionMap extends Map<string, IConnection> {
|
||||||
|
private entNrToConnHash;
|
||||||
|
getEntityConnectionHashes(entityNumber: number): string[];
|
||||||
|
getEntityConnections(entityNumber: number): IConnection[];
|
||||||
|
set(hash: string, connection: IConnection): this;
|
||||||
|
delete(hash: string): boolean;
|
||||||
|
}
|
37
.yalc/@fbe/editor/dist/core/WireConnections.d.ts
vendored
Normal file
37
.yalc/@fbe/editor/dist/core/WireConnections.d.ts
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import { EventEmitter } from 'eventemitter3';
|
||||||
|
import { Blueprint } from './Blueprint';
|
||||||
|
export interface IConnection {
|
||||||
|
color: string;
|
||||||
|
entityNumber1: number;
|
||||||
|
entityNumber2: number;
|
||||||
|
entitySide1: number;
|
||||||
|
entitySide2: number;
|
||||||
|
}
|
||||||
|
export declare class WireConnections extends EventEmitter {
|
||||||
|
private bp;
|
||||||
|
private readonly connections;
|
||||||
|
constructor(bp: Blueprint);
|
||||||
|
private static hash;
|
||||||
|
static deserialize(entityNumber: number, connections: BPS.IConnection, neighbours: number[]): IConnection[];
|
||||||
|
static serialize(entityNumber: number, connections: IConnection[], getType: (entityNumber: number) => string, entNrWhitelist?: Set<number>): {
|
||||||
|
connections: BPS.IConnection;
|
||||||
|
neighbours: number[];
|
||||||
|
};
|
||||||
|
private static toPoleConnection;
|
||||||
|
create(connection: IConnection): void;
|
||||||
|
private remove;
|
||||||
|
private onCreateOrRemoveConnection;
|
||||||
|
get(hash: string): IConnection;
|
||||||
|
forEach(fn: (value: IConnection, key: string) => void): void;
|
||||||
|
createEntityConnections(entityNumber: number, connections: BPS.IConnection, neighbours: number[]): void;
|
||||||
|
removeEntityConnections(entityNumber: number): void;
|
||||||
|
getEntityConnectionHashes(entityNumber: number): string[];
|
||||||
|
getEntityConnections(entityNumber: number): IConnection[];
|
||||||
|
serializeConnectionData(entityNumber: number, entNrWhitelist?: Set<number>): {
|
||||||
|
connections: BPS.IConnection;
|
||||||
|
neighbours: number[];
|
||||||
|
};
|
||||||
|
connectPowerPole(entityNumber: number): void;
|
||||||
|
generatePowerPoleWires(): void;
|
||||||
|
getPowerPoleDirection(entityNumber: number): number;
|
||||||
|
}
|
19
.yalc/@fbe/editor/dist/core/bpString.d.ts
vendored
Normal file
19
.yalc/@fbe/editor/dist/core/bpString.d.ts
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import Ajv from 'ajv';
|
||||||
|
import { Blueprint } from './Blueprint';
|
||||||
|
import { Book } from './Book';
|
||||||
|
declare class CorruptedBlueprintStringError {
|
||||||
|
error: unknown;
|
||||||
|
constructor(error: unknown);
|
||||||
|
}
|
||||||
|
declare class ModdedBlueprintError {
|
||||||
|
errors: Ajv.ErrorObject[];
|
||||||
|
constructor(errors: Ajv.ErrorObject[]);
|
||||||
|
}
|
||||||
|
declare class TrainBlueprintError {
|
||||||
|
errors: Ajv.ErrorObject[];
|
||||||
|
constructor(errors: Ajv.ErrorObject[]);
|
||||||
|
}
|
||||||
|
declare function decodeToBlueprint(str: string): Promise<Blueprint>;
|
||||||
|
declare function encode(bpOrBook: Blueprint | Book): Promise<string>;
|
||||||
|
declare function getBlueprintOrBookFromSource(source: string): Promise<Blueprint | Book>;
|
||||||
|
export { ModdedBlueprintError, TrainBlueprintError, CorruptedBlueprintStringError, encode, getBlueprintOrBookFromSource, decodeToBlueprint, };
|
1097
.yalc/@fbe/editor/dist/core/factorioData.d.ts
vendored
Normal file
1097
.yalc/@fbe/editor/dist/core/factorioData.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load Diff
16
.yalc/@fbe/editor/dist/core/generators/beacon.d.ts
vendored
Normal file
16
.yalc/@fbe/editor/dist/core/generators/beacon.d.ts
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { IVisualization } from './index';
|
||||||
|
export declare function generateBeacons(entities: {
|
||||||
|
position: IPoint;
|
||||||
|
size: number;
|
||||||
|
effect: boolean;
|
||||||
|
}[], minAffectedEntities?: number): {
|
||||||
|
beacons: {
|
||||||
|
name: string;
|
||||||
|
position: IPoint;
|
||||||
|
}[];
|
||||||
|
info: {
|
||||||
|
totalBeacons: number;
|
||||||
|
effectsGiven: number;
|
||||||
|
};
|
||||||
|
visualizations: IVisualization[];
|
||||||
|
};
|
10
.yalc/@fbe/editor/dist/core/generators/index.d.ts
vendored
Normal file
10
.yalc/@fbe/editor/dist/core/generators/index.d.ts
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { generatePipes } from './pipe';
|
||||||
|
import { generateBeacons } from './beacon';
|
||||||
|
import { generatePoles } from './pole';
|
||||||
|
export interface IVisualization {
|
||||||
|
path: IPoint[];
|
||||||
|
size: number;
|
||||||
|
alpha: number;
|
||||||
|
color?: number;
|
||||||
|
}
|
||||||
|
export { generatePipes, generateBeacons, generatePoles };
|
22
.yalc/@fbe/editor/dist/core/generators/pipe.d.ts
vendored
Normal file
22
.yalc/@fbe/editor/dist/core/generators/pipe.d.ts
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import { IVisualization } from './index';
|
||||||
|
declare function generatePipes(pumpjacks: {
|
||||||
|
entity_number: number;
|
||||||
|
position: IPoint;
|
||||||
|
}[], minGapBetweenUndergrounds?: number): {
|
||||||
|
pumpjacksToRotate: {
|
||||||
|
entity_number: number;
|
||||||
|
direction: number;
|
||||||
|
}[];
|
||||||
|
pipes: {
|
||||||
|
name: string;
|
||||||
|
position: IPoint;
|
||||||
|
direction: number;
|
||||||
|
}[];
|
||||||
|
info: {
|
||||||
|
nrOfPipes: number;
|
||||||
|
nrOfUPipes: number;
|
||||||
|
nrOfPipesReplacedByUPipes: number;
|
||||||
|
};
|
||||||
|
visualizations: IVisualization[];
|
||||||
|
};
|
||||||
|
export { generatePipes };
|
15
.yalc/@fbe/editor/dist/core/generators/pole.d.ts
vendored
Normal file
15
.yalc/@fbe/editor/dist/core/generators/pole.d.ts
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { IVisualization } from './index';
|
||||||
|
export declare function generatePoles(entities: {
|
||||||
|
position: IPoint;
|
||||||
|
size: number;
|
||||||
|
power: boolean;
|
||||||
|
}[]): {
|
||||||
|
poles: {
|
||||||
|
name: string;
|
||||||
|
position: IPoint;
|
||||||
|
}[];
|
||||||
|
info: {
|
||||||
|
totalPoles: number;
|
||||||
|
};
|
||||||
|
visualizations: IVisualization[];
|
||||||
|
};
|
17
.yalc/@fbe/editor/dist/core/generators/util.d.ts
vendored
Normal file
17
.yalc/@fbe/editor/dist/core/generators/util.d.ts
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
declare const _default: {
|
||||||
|
hashPoint: (p: IPoint) => string;
|
||||||
|
equalPoints: <T extends IPoint>(a: T) => (b: T) => boolean;
|
||||||
|
uniqPoints: <T_1 extends IPoint>(list: T_1[]) => T_1[];
|
||||||
|
arrayToPoint: (array: number[]) => IPoint;
|
||||||
|
pointToArray: (point: IPoint) => number[];
|
||||||
|
manhattenDistance: (p0: IPoint, p1: IPoint) => number;
|
||||||
|
euclideanDistance: (p0: IPoint, p1: IPoint) => number;
|
||||||
|
pointInCircle: (point: IPoint, origin: IPoint, r: number) => boolean;
|
||||||
|
pointsToLines: <T_2 extends IPoint>(nodes: T_2[]) => T_2[][];
|
||||||
|
pointsToTriangles: <T_3 extends IPoint>(nodes: T_3[]) => T_3[][];
|
||||||
|
range: (from: number, to: number) => number[];
|
||||||
|
getAngle: (cX: number, cY: number, pX: number, pY: number) => number;
|
||||||
|
getReflectedPoint: (p: IPoint, lp0: IPoint, lp1: IPoint) => IPoint;
|
||||||
|
findSide: (p: IPoint, lp0: IPoint, lp1: IPoint) => number;
|
||||||
|
};
|
||||||
|
export default _default;
|
43
.yalc/@fbe/editor/dist/core/spriteDataBuilder.d.ts
vendored
Normal file
43
.yalc/@fbe/editor/dist/core/spriteDataBuilder.d.ts
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import { PositionGrid } from './PositionGrid';
|
||||||
|
interface IDrawData {
|
||||||
|
hr: boolean;
|
||||||
|
dir: number;
|
||||||
|
name: string;
|
||||||
|
positionGrid: PositionGrid;
|
||||||
|
position: IPoint;
|
||||||
|
generateConnector: boolean;
|
||||||
|
assemblerPipeDirection: string;
|
||||||
|
dirType: string;
|
||||||
|
operator: string;
|
||||||
|
assemblerCraftsWithFluid: boolean;
|
||||||
|
trainStopColor: {
|
||||||
|
r: number;
|
||||||
|
g: number;
|
||||||
|
b: number;
|
||||||
|
a: number;
|
||||||
|
};
|
||||||
|
chemicalPlantDontConnectOutput: boolean;
|
||||||
|
modules: string[];
|
||||||
|
}
|
||||||
|
interface ISpriteData {
|
||||||
|
filename: string;
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
scale?: number;
|
||||||
|
x?: number;
|
||||||
|
y?: number;
|
||||||
|
shift?: number[];
|
||||||
|
tint?: {
|
||||||
|
r: number;
|
||||||
|
g: number;
|
||||||
|
b: number;
|
||||||
|
a: number;
|
||||||
|
};
|
||||||
|
anchorX?: number;
|
||||||
|
anchorY?: number;
|
||||||
|
squishY?: number;
|
||||||
|
rotAngle?: number;
|
||||||
|
}
|
||||||
|
declare function getSpriteData(data: IDrawData): ISpriteData[];
|
||||||
|
declare function getBeltWireConnectionIndex(positionGrid: PositionGrid, position: IPoint, dir: number): 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
||||||
|
export { ISpriteData, getSpriteData, getBeltWireConnectionIndex };
|
18
.yalc/@fbe/editor/dist/index.d.ts
vendored
Normal file
18
.yalc/@fbe/editor/dist/index.d.ts
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { Book } from './core/Book';
|
||||||
|
import { Blueprint } from './core/Blueprint';
|
||||||
|
import { GridPattern } from './containers/BlueprintContainer';
|
||||||
|
import { registerAction, callAction, forEachAction, resetKeybinds, importKeybinds, exportKeybinds } from './actions';
|
||||||
|
import { Editor } from './Editor';
|
||||||
|
import FD from './core/factorioData';
|
||||||
|
export * from './core/bpString';
|
||||||
|
export { Editor, Book, Blueprint, GridPattern, FD };
|
||||||
|
declare const _default: {
|
||||||
|
registerAction: typeof registerAction;
|
||||||
|
callAction: typeof callAction;
|
||||||
|
forEachAction: typeof forEachAction;
|
||||||
|
resetKeybinds: typeof resetKeybinds;
|
||||||
|
importKeybinds: typeof importKeybinds;
|
||||||
|
exportKeybinds: typeof exportKeybinds;
|
||||||
|
waitForLoader: () => Promise<void>;
|
||||||
|
};
|
||||||
|
export default _default;
|
330
.yalc/@fbe/editor/dist/index.js
vendored
Normal file
330
.yalc/@fbe/editor/dist/index.js
vendored
Normal file
File diff suppressed because one or more lines are too long
26
.yalc/@fbe/editor/package.json
Normal file
26
.yalc/@fbe/editor/package.json
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"name": "@fbe/editor",
|
||||||
|
"version": "1.0.0+4ce98ad6",
|
||||||
|
"description": "A Factorio blueprint editor and renderer webapp",
|
||||||
|
"author": "Teoxoy",
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "dist/index.js",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/Teoxoy/factorio-blueprint-editor.git"
|
||||||
|
},
|
||||||
|
"bugs": "https://github.com/Teoxoy/factorio-blueprint-editor/issues",
|
||||||
|
"homepage": "https://github.com/Teoxoy/factorio-blueprint-editor",
|
||||||
|
"dependencies": {
|
||||||
|
"@pixi/basis": "^6.0.0-rc.2",
|
||||||
|
"ajv": "^6.12.2",
|
||||||
|
"delaunator": "^4.0.1",
|
||||||
|
"eventemitter3": "^4.0.4",
|
||||||
|
"keyboardjs": "^2.5.1",
|
||||||
|
"maxrects-packer": "^2.6.0",
|
||||||
|
"pako": "^1.0.11",
|
||||||
|
"pathfinding": "^0.4.18",
|
||||||
|
"pixi.js": "^6.0.0-rc.2"
|
||||||
|
},
|
||||||
|
"yalcSig": "4ce98ad61ee9927a6bee4eb976d9403a"
|
||||||
|
}
|
1
.yalc/@fbe/editor/yalc.sig
Normal file
1
.yalc/@fbe/editor/yalc.sig
Normal file
@ -0,0 +1 @@
|
|||||||
|
4ce98ad61ee9927a6bee4eb976d9403a
|
@ -127,7 +127,7 @@ export const functionPubSubHandler: PubSubHandler = async (message, _context, ca
|
|||||||
await saveBlueprintImage(blueprint.image_hash, min_image, "300");
|
await saveBlueprintImage(blueprint.image_hash, min_image, "300");
|
||||||
log(`Saved image with image hash ${blueprint.image_hash}`);
|
log(`Saved image with image hash ${blueprint.image_hash}`);
|
||||||
|
|
||||||
await saveBlueprintImage(blueprint.image_hash, image, "original");
|
// await saveBlueprintImage(blueprint.image_hash, image, "original");
|
||||||
|
|
||||||
callback();
|
callback();
|
||||||
} catch (reason) {
|
} catch (reason) {
|
||||||
|
@ -11,6 +11,7 @@ import { renderImage } from "./image-renderer";
|
|||||||
|
|
||||||
export async function subscribeToPubSub() {
|
export async function subscribeToPubSub() {
|
||||||
const topic = getBlueprintImageRequestTopic();
|
const topic = getBlueprintImageRequestTopic();
|
||||||
|
if (!topic) throw Error("PubSub Topic not found");
|
||||||
const [subscription] = await topic
|
const [subscription] = await topic
|
||||||
.subscription("blueprint-image-function-app", {
|
.subscription("blueprint-image-function-app", {
|
||||||
flowControl: { allowExcessMessages: false, maxMessages: 1, maxExtension: 3600 },
|
flowControl: { allowExcessMessages: false, maxMessages: 1, maxExtension: 3600 },
|
||||||
|
@ -6,10 +6,11 @@ module.exports = {
|
|||||||
images: {
|
images: {
|
||||||
domains: ["storage.googleapis.com"],
|
domains: ["storage.googleapis.com"],
|
||||||
},
|
},
|
||||||
|
assetPrefix: process.env.ASSET_PREFIX ? process.env.ASSET_PREFIX : "",
|
||||||
webpack(config, options) {
|
webpack(config, options) {
|
||||||
const { dev, isServer } = options;
|
const { dev, isServer } = options;
|
||||||
|
|
||||||
// Do not run type checking twice:
|
// Do not run type checking twice
|
||||||
if (dev && isServer) {
|
if (dev && isServer) {
|
||||||
const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");
|
const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");
|
||||||
config.plugins.push(new ForkTsCheckerWebpackPlugin());
|
config.plugins.push(new ForkTsCheckerWebpackPlugin());
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "blueprint_page" ADD FOREIGN KEY ("user_id") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
@ -60,6 +60,7 @@ model blueprint_page {
|
|||||||
blueprint_book blueprint_book? @relation(fields: [blueprint_book_id], references: [id])
|
blueprint_book blueprint_book? @relation(fields: [blueprint_book_id], references: [id])
|
||||||
blueprint blueprint? @relation(fields: [blueprint_id], references: [id])
|
blueprint blueprint? @relation(fields: [blueprint_id], references: [id])
|
||||||
user_favorites user_favorites[]
|
user_favorites user_favorites[]
|
||||||
|
user user? @relation(fields: [user_id], references: [id])
|
||||||
}
|
}
|
||||||
|
|
||||||
model session {
|
model session {
|
||||||
@ -92,6 +93,7 @@ model user {
|
|||||||
updated_at DateTime @updatedAt
|
updated_at DateTime @updatedAt
|
||||||
session session[]
|
session session[]
|
||||||
user_favorites user_favorites[]
|
user_favorites user_favorites[]
|
||||||
|
blueprint_pages blueprint_page[]
|
||||||
}
|
}
|
||||||
|
|
||||||
model user_favorites {
|
model user_favorites {
|
||||||
|
BIN
apps/blueprints/public/favicon.ico
Normal file
BIN
apps/blueprints/public/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
BIN
apps/blueprints/public/favicon.png
Normal file
BIN
apps/blueprints/public/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.9 KiB |
59
apps/blueprints/src/components/BBCode.tsx
Normal file
59
apps/blueprints/src/components/BBCode.tsx
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import parser, { Tag } from "bbcode-to-react";
|
||||||
|
import { FactorioIcon } from "./FactorioIcon";
|
||||||
|
|
||||||
|
class ImgTag extends Tag {
|
||||||
|
toReact() {
|
||||||
|
const content = this.getContent(true);
|
||||||
|
const img = (this.params as any).img;
|
||||||
|
const [type, item] = img.split("/");
|
||||||
|
if (type === "item") {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<FactorioIcon type={type} icon={item} size={20} />
|
||||||
|
{content && <span>{content}</span>}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ItemTag extends Tag {
|
||||||
|
toReact() {
|
||||||
|
const content = this.getContent(true);
|
||||||
|
const item = (this.params as any).item;
|
||||||
|
if (item) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<FactorioIcon type="item" icon={item} size={20} />
|
||||||
|
{content && <span>{content}</span>}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class VirtualSignalTag extends Tag {
|
||||||
|
toReact() {
|
||||||
|
const signal = (this.params as any)["virtual-signal"];
|
||||||
|
const content = this.getContent(true);
|
||||||
|
if (signal) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<FactorioIcon type="signal" icon={signal} size={20} />
|
||||||
|
{content && <span>{content}</span>}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parser.registerTag("img", ImgTag as any);
|
||||||
|
parser.registerTag("item", ItemTag as any);
|
||||||
|
parser.registerTag("virtual-signal", VirtualSignalTag as any);
|
||||||
|
|
||||||
|
export const BBCode: React.FC<{ code: string }> = ({ code }) => {
|
||||||
|
return <>{parser.toReact(code)}</>;
|
||||||
|
};
|
@ -68,8 +68,7 @@ export const BlueprintLink: React.FC<BlueprintLinkProps> = ({
|
|||||||
type = "tile",
|
type = "tile",
|
||||||
}) => {
|
}) => {
|
||||||
const [imageError, setImageError] = useState(false);
|
const [imageError, setImageError] = useState(false);
|
||||||
const onImageError = (error: unknown) => {
|
const onImageError = () => {
|
||||||
console.log(error);
|
|
||||||
setImageError(true);
|
setImageError(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { css } from "@emotion/react";
|
import { css } from "@emotion/react";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import BBCode from "bbcode-to-react";
|
|
||||||
import { FactorioIcon } from "./FactorioIcon";
|
|
||||||
import { ChildTreeBlueprintBookEnriched } from "@factorio-sites/web-utils";
|
import { ChildTreeBlueprintBookEnriched } from "@factorio-sites/web-utils";
|
||||||
|
import { FactorioIcon } from "./FactorioIcon";
|
||||||
|
import { BBCode } from "./BBCode";
|
||||||
|
|
||||||
const componentStyles = css`
|
const componentStyles = css`
|
||||||
.blueprint,
|
.blueprint,
|
||||||
@ -50,7 +50,9 @@ export const BookChildTree: React.FC<BookChildTreeProps> = ({
|
|||||||
size={20}
|
size={20}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
<span className="label">{BBCode.toReact(blueprint_book.name || "")}</span>
|
<span className="label">
|
||||||
|
<BBCode code={blueprint_book.name || ""} />
|
||||||
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</Link>
|
</Link>
|
||||||
<div css={{ marginLeft: `20px` }}>
|
<div css={{ marginLeft: `20px` }}>
|
||||||
@ -58,15 +60,18 @@ export const BookChildTree: React.FC<BookChildTreeProps> = ({
|
|||||||
return child.type === "blueprint" ? (
|
return child.type === "blueprint" ? (
|
||||||
<Link key={child.id} href={`${base_url}?selected=${child.id}`}>
|
<Link key={child.id} href={`${base_url}?selected=${child.id}`}>
|
||||||
<a className={"blueprint" + (selected_id === child.id ? " active" : "")}>
|
<a className={"blueprint" + (selected_id === child.id ? " active" : "")}>
|
||||||
{child.icons.map((icon, index) => (
|
{child.icons &&
|
||||||
<FactorioIcon
|
child.icons.map((icon, index) => (
|
||||||
key={index}
|
<FactorioIcon
|
||||||
type={icon.signal.type}
|
key={index}
|
||||||
icon={icon.signal.name}
|
type={icon.signal.type}
|
||||||
size={20}
|
icon={icon.signal.name}
|
||||||
/>
|
size={20}
|
||||||
))}
|
/>
|
||||||
<span className="label"> {BBCode.toReact(child.name || "")}</span>
|
))}
|
||||||
|
<span className="label">
|
||||||
|
<BBCode code={child.name || ""} />
|
||||||
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</Link>
|
</Link>
|
||||||
) : child.type === "blueprint_book" ? (
|
) : child.type === "blueprint_book" ? (
|
||||||
|
@ -4,10 +4,9 @@ import { MdCheck, MdClose } from "react-icons/md";
|
|||||||
|
|
||||||
const SUCCESS_ICON_DURATION = 2000;
|
const SUCCESS_ICON_DURATION = 2000;
|
||||||
|
|
||||||
export const CopyButton: React.FC<Omit<ButtonProps, "children"> & { content: string }> = ({
|
export const CopyButton: React.FC<
|
||||||
content,
|
Omit<ButtonProps, "children"> & { content: string; label?: string }
|
||||||
...props
|
> = ({ content, label, ...props }) => {
|
||||||
}) => {
|
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const [icon, setIcon] = useState<"red" | "green" | null>(null);
|
const [icon, setIcon] = useState<"red" | "green" | null>(null);
|
||||||
|
|
||||||
@ -47,7 +46,7 @@ export const CopyButton: React.FC<Omit<ButtonProps, "children"> & { content: str
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
copy
|
{label || "copy"}
|
||||||
</Button>
|
</Button>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { IconSignalTypes } from "@factorio-sites/types";
|
import { IconSignalTypes } from "@factorio-sites/types";
|
||||||
|
|
||||||
interface FactorioIconProps {
|
interface FactorioIconProps {
|
||||||
type: IconSignalTypes;
|
type: IconSignalTypes | "signal";
|
||||||
icon: string;
|
icon: string;
|
||||||
size: number;
|
size: number;
|
||||||
}
|
}
|
||||||
@ -12,6 +12,11 @@ function getUrlByType(type: FactorioIconProps["type"], icon: string) {
|
|||||||
return `https://storage.googleapis.com/factorio-blueprints-assets/factorio/graphics/icons/${icon}.png`;
|
return `https://storage.googleapis.com/factorio-blueprints-assets/factorio/graphics/icons/${icon}.png`;
|
||||||
case "fluid":
|
case "fluid":
|
||||||
return `https://storage.googleapis.com/factorio-blueprints-assets/factorio/graphics/icons/fluid/${icon}.png`;
|
return `https://storage.googleapis.com/factorio-blueprints-assets/factorio/graphics/icons/fluid/${icon}.png`;
|
||||||
|
case "signal":
|
||||||
|
return `https://storage.googleapis.com/factorio-blueprints-assets/factorio/graphics/icons/signal/${icon.replace(
|
||||||
|
/-/,
|
||||||
|
"_"
|
||||||
|
)}.png`;
|
||||||
case "virtual":
|
case "virtual":
|
||||||
return null;
|
return null;
|
||||||
default:
|
default:
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { Box, Heading, Flex, Text, Input, InputGroup, InputLeftElement } from "@chakra-ui/react";
|
import { Box, Heading, Flex, Text } from "@chakra-ui/react";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
import { useAuth } from "../providers/auth";
|
import { useAuth } from "../providers/auth";
|
||||||
import { MdSearch } from "react-icons/md";
|
|
||||||
|
|
||||||
const MenuItem: React.FC<{ href: string }> = ({ children, href }) => (
|
const MenuItem: React.FC<{ href: string }> = ({ children, href }) => (
|
||||||
<Link href={href} passHref>
|
<Link href={href} passHref>
|
||||||
@ -20,13 +19,8 @@ export const Header: React.FC = (props) => {
|
|||||||
const auth = useAuth();
|
const auth = useAuth();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const [show, setShow] = useState(false);
|
const [show, setShow] = useState(false);
|
||||||
const [searchQuery, setSearchQuery] = useState("");
|
|
||||||
const handleToggle = () => setShow(!show);
|
const handleToggle = () => setShow(!show);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setSearchQuery((router.query.q as string) || "");
|
|
||||||
}, [router.query.q]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flex
|
<Flex
|
||||||
as="header"
|
as="header"
|
||||||
@ -46,14 +40,12 @@ export const Header: React.FC = (props) => {
|
|||||||
</Link>
|
</Link>
|
||||||
</Heading>
|
</Heading>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
<Box display={{ base: "block", md: "none" }} onClick={handleToggle}>
|
<Box display={{ base: "block", md: "none" }} onClick={handleToggle}>
|
||||||
<svg fill="white" width="12px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
|
<svg fill="white" width="12px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
|
||||||
<title>Menu</title>
|
<title>Menu</title>
|
||||||
<path d="M0 3h20v2H0V3zm0 6h20v2H0V9zm0 6h20v2H0v-2z" />
|
<path d="M0 3h20v2H0V3zm0 6h20v2H0V9zm0 6h20v2H0v-2z" />
|
||||||
</svg>
|
</svg>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<Box
|
<Box
|
||||||
as="nav"
|
as="nav"
|
||||||
display={{
|
display={{
|
||||||
|
@ -1,9 +1,28 @@
|
|||||||
|
import { css } from "@emotion/react";
|
||||||
import { parseBlueprintStringClient } from "@factorio-sites/web-utils";
|
import { parseBlueprintStringClient } from "@factorio-sites/web-utils";
|
||||||
import { useEffect, useRef, useState } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
|
|
||||||
type FBE = typeof import("@fbe/editor");
|
type FBE = typeof import("@fbe/editor");
|
||||||
type Editor = InstanceType<FBE["Editor"]>;
|
type Editor = InstanceType<FBE["Editor"]>;
|
||||||
|
|
||||||
|
const editorCss = css`
|
||||||
|
position: relative;
|
||||||
|
.error {
|
||||||
|
position: absolute;
|
||||||
|
top: 10%;
|
||||||
|
left: 10%;
|
||||||
|
background: rgba(0, 0, 0, 0.5);
|
||||||
|
padding: 10px 20px;
|
||||||
|
border-radius: 40px;
|
||||||
|
width: 450px;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
interface ImageEditorProps {
|
interface ImageEditorProps {
|
||||||
string: string;
|
string: string;
|
||||||
}
|
}
|
||||||
@ -13,6 +32,7 @@ export const ImageEditor: React.FC<ImageEditorProps> = ({ string }) => {
|
|||||||
// const [image, setImage] = useState<string | undefined>();
|
// const [image, setImage] = useState<string | undefined>();
|
||||||
const FbeRef = useRef<FBE>();
|
const FbeRef = useRef<FBE>();
|
||||||
const editorRef = useRef<Editor>();
|
const editorRef = useRef<Editor>();
|
||||||
|
const [renderError, setRenderError] = useState(false);
|
||||||
const [editorLoaded, setEditorLoaded] = useState(false);
|
const [editorLoaded, setEditorLoaded] = useState(false);
|
||||||
|
|
||||||
// Load editor async, it does not work server side
|
// Load editor async, it does not work server side
|
||||||
@ -30,35 +50,8 @@ export const ImageEditor: React.FC<ImageEditorProps> = ({ string }) => {
|
|||||||
editorRef.current = editor;
|
editorRef.current = editor;
|
||||||
setEditorLoaded(true);
|
setEditorLoaded(true);
|
||||||
})();
|
})();
|
||||||
}, []);
|
|
||||||
|
|
||||||
useEffect(() => {
|
const resizeFn = () => {
|
||||||
(async () => {
|
|
||||||
if (!parseBlueprintStringClient(string)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const FBE = FbeRef.current;
|
|
||||||
const editor = editorRef.current;
|
|
||||||
if (!editorLoaded || !FBE || !editor) return;
|
|
||||||
|
|
||||||
const bpOrBook = await FBE.getBlueprintOrBookFromSource(string);
|
|
||||||
const blueprint = bpOrBook instanceof FBE.Book ? bpOrBook.selectBlueprint(0) : bpOrBook;
|
|
||||||
|
|
||||||
await editor.loadBlueprint(blueprint);
|
|
||||||
// await FBE.default.waitForLoader();
|
|
||||||
|
|
||||||
// Wait a little extra, sometimes even after textures are loaded it neeeds a moment to render
|
|
||||||
// await new Promise((resolve) => setTimeout(resolve, 10));
|
|
||||||
|
|
||||||
// const picture = await editor.getPicture();
|
|
||||||
// setImage(URL.createObjectURL(picture));
|
|
||||||
})();
|
|
||||||
}, [string, editorLoaded]);
|
|
||||||
|
|
||||||
window.addEventListener(
|
|
||||||
"resize",
|
|
||||||
() => {
|
|
||||||
if (!canvasRef.current || !editorRef.current) return;
|
if (!canvasRef.current || !editorRef.current) return;
|
||||||
canvasRef.current.style.width = "100%";
|
canvasRef.current.style.width = "100%";
|
||||||
canvasRef.current.style.height = "auto";
|
canvasRef.current.style.height = "auto";
|
||||||
@ -66,12 +59,55 @@ export const ImageEditor: React.FC<ImageEditorProps> = ({ string }) => {
|
|||||||
canvasRef.current.offsetWidth,
|
canvasRef.current.offsetWidth,
|
||||||
canvasRef.current.offsetHeight
|
canvasRef.current.offsetHeight
|
||||||
);
|
);
|
||||||
},
|
};
|
||||||
false
|
window.addEventListener("resize", resizeFn, false);
|
||||||
);
|
return () => window.removeEventListener("resize", resizeFn);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
(async () => {
|
||||||
|
try {
|
||||||
|
setRenderError(false);
|
||||||
|
|
||||||
|
if (!parseBlueprintStringClient(string)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FBE = FbeRef.current;
|
||||||
|
const editor = editorRef.current;
|
||||||
|
if (!editorLoaded || !FBE || !editor) return;
|
||||||
|
|
||||||
|
const bp = await FBE.decodeToBlueprint(string);
|
||||||
|
|
||||||
|
await editor.loadBlueprint(bp);
|
||||||
|
// await FBE.default.waitForLoader();
|
||||||
|
|
||||||
|
// Wait a little extra, sometimes even after textures are loaded it neeeds a moment to render
|
||||||
|
// await new Promise((resolve) => setTimeout(resolve, 10));
|
||||||
|
|
||||||
|
// const picture = await editor.getPicture();
|
||||||
|
// setImage(URL.createObjectURL(picture));
|
||||||
|
} catch (reason) {
|
||||||
|
setRenderError(true);
|
||||||
|
if (Array.isArray(reason.errors)) {
|
||||||
|
return console.error("Blueprint string not supported by FBE", reason.errors);
|
||||||
|
}
|
||||||
|
console.error("Failed to render blueprint", reason);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}, [string, editorLoaded]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div css={editorCss}>
|
||||||
|
{renderError && (
|
||||||
|
<div className="error">
|
||||||
|
<h3>Failed to render blueprint</h3>
|
||||||
|
<p>
|
||||||
|
This happens when there are modded entities or in some cases blueprint properties that
|
||||||
|
FBE does not yet support
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
<canvas id="pbe" ref={canvasRef} style={{ width: "100%", height: "auto" }} />
|
<canvas id="pbe" ref={canvasRef} style={{ width: "100%", height: "auto" }} />
|
||||||
{/* <img src={image} alt="blueprint" style={{ width: "500px" }}></img> */}
|
{/* <img src={image} alt="blueprint" style={{ width: "500px" }}></img> */}
|
||||||
</div>
|
</div>
|
||||||
|
12
apps/blueprints/src/components/SteamLogin.tsx
Normal file
12
apps/blueprints/src/components/SteamLogin.tsx
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import Link from "next/link";
|
||||||
|
import { Image } from "@chakra-ui/react";
|
||||||
|
|
||||||
|
export const SteamLogin: React.FC = () => {
|
||||||
|
return (
|
||||||
|
<Link href={`/api/openid/steam`}>
|
||||||
|
<a>
|
||||||
|
<Image src="https://steamcdn-a.akamaihd.net/steamcommunity/public/images/steamworks_docs/english/sits_large_noborder.png" />
|
||||||
|
</a>
|
||||||
|
</Link>
|
||||||
|
);
|
||||||
|
};
|
@ -53,11 +53,9 @@ const BlueprintsApp = ({
|
|||||||
<AuthContext.Provider value={auth.data?.auth || null}>
|
<AuthContext.Provider value={auth.data?.auth || null}>
|
||||||
<Global styles={globalStyles} />
|
<Global styles={globalStyles} />
|
||||||
<Head>
|
<Head>
|
||||||
<title>Welcome to blueprints!</title>
|
<title>Factorio Blueprints</title>
|
||||||
<link
|
<link rel="shortcut icon" href="/favicon.png" />
|
||||||
href="https://cdn.factorio.com/assets/fonts/titillium-web.css"
|
<link href="https://cdn.factorio.com/assets/fonts/titillium-web.css" rel="stylesheet" />
|
||||||
rel="stylesheet"
|
|
||||||
></link>
|
|
||||||
</Head>
|
</Head>
|
||||||
<div>
|
<div>
|
||||||
{!auth.loading && (
|
{!auth.loading && (
|
||||||
|
@ -96,21 +96,26 @@ export const Index: NextPage = () => {
|
|||||||
</Box>
|
</Box>
|
||||||
<Box>
|
<Box>
|
||||||
<ul css={listCss}>
|
<ul css={listCss}>
|
||||||
|
<li>Make a good tags list</li>
|
||||||
|
<li>Add a "copy url" button</li>
|
||||||
|
<li>Fix "auhor" field in blueprint pages and filter blueprints by user</li>
|
||||||
|
<li>Add book preview when creating blueprints</li>
|
||||||
|
<li>Improve modded blueprint support in FBE</li>
|
||||||
|
<li>Improve blueprint title icon (bbcode) support</li>
|
||||||
|
<li>Make entity/recipe/item dropdown be based on blueprint data in the site</li>
|
||||||
|
<li>Add a Wysiwyg editor for descriptions</li>
|
||||||
|
<li>Change thumbnail generation method to be more reliable</li>
|
||||||
|
<li>Add tag fixing moderators role</li>
|
||||||
|
<li>Add a landing page on steam sign up to change username before submitting</li>
|
||||||
|
<li>Add tracking of blueprint views</li>
|
||||||
|
<li>Add blueprint history</li>
|
||||||
<li className="strike">Add creating new blueprints</li>
|
<li className="strike">Add creating new blueprints</li>
|
||||||
<li className="strike">Add search</li>
|
<li className="strike">Add search</li>
|
||||||
<li>Add a landing page on steam sign up to change username before submitting</li>
|
|
||||||
<li>Add book preview when creating blueprints</li>
|
|
||||||
<li className="strike">Add blueprint tags</li>
|
<li className="strike">Add blueprint tags</li>
|
||||||
<li className="strike">Expand search with tags</li>
|
<li className="strike">Expand search with tags</li>
|
||||||
<li>Add tracking of blueprint views</li>
|
|
||||||
<li className="strike">Add favorites</li>
|
<li className="strike">Add favorites</li>
|
||||||
<li className="strike">Add sorting by views/favorites</li>
|
<li className="strike">Add sorting by views/favorites</li>
|
||||||
<li className="strike">Add thumbnails</li>
|
<li className="strike">Add thumbnails</li>
|
||||||
<li>Change thumbnail generation method to be more reliable</li>
|
|
||||||
<li>Add tag fixing moderators</li>
|
|
||||||
<li>Improve modded blueprint support</li>
|
|
||||||
<li>Add blueprint title icon support</li>
|
|
||||||
<li>Add blueprint history</li>
|
|
||||||
<li className="strike">
|
<li className="strike">
|
||||||
Add search filter for blueprint entities/recipes without manual tagging
|
Add search filter for blueprint entities/recipes without manual tagging
|
||||||
</li>
|
</li>
|
||||||
|
@ -9,6 +9,8 @@ import { parseDatabaseError } from "../../../utils/api.utils";
|
|||||||
import { apiHandler } from "../../../utils/api-handler";
|
import { apiHandler } from "../../../utils/api-handler";
|
||||||
|
|
||||||
const handler = apiHandler(async (req, res, { session }) => {
|
const handler = apiHandler(async (req, res, { session }) => {
|
||||||
|
if (req.method !== "POST") return res.status(400).json({ error: "method must be POST" });
|
||||||
|
|
||||||
if (!session) {
|
if (!session) {
|
||||||
return res.status(401).json({ status: "Not authenticated" });
|
return res.status(401).json({ status: "Not authenticated" });
|
||||||
}
|
}
|
||||||
@ -70,3 +72,11 @@ const handler = apiHandler(async (req, res, { session }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
||||||
|
export const config = {
|
||||||
|
api: {
|
||||||
|
bodyParser: {
|
||||||
|
sizeLimit: "2mb",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
@ -4,6 +4,8 @@ import { parseDatabaseError } from "../../../utils/api.utils";
|
|||||||
import { apiHandler } from "../../../utils/api-handler";
|
import { apiHandler } from "../../../utils/api-handler";
|
||||||
|
|
||||||
const handler = apiHandler(async (req, res, { session }) => {
|
const handler = apiHandler(async (req, res, { session }) => {
|
||||||
|
if (req.method !== "POST") return res.status(400).json({ error: "method must be POST" });
|
||||||
|
|
||||||
if (!session) {
|
if (!session) {
|
||||||
return res.status(401).json({ status: "Not authenticated" });
|
return res.status(401).json({ status: "Not authenticated" });
|
||||||
}
|
}
|
||||||
|
@ -16,9 +16,11 @@ const handler: NextApiHandler = apiHandler(async (req, res) => {
|
|||||||
const blueprintImageRequestTopic = getBlueprintImageRequestTopic();
|
const blueprintImageRequestTopic = getBlueprintImageRequestTopic();
|
||||||
|
|
||||||
if (blueprintPage.blueprint_id) {
|
if (blueprintPage.blueprint_id) {
|
||||||
blueprintImageRequestTopic.publishJSON({
|
if (blueprintImageRequestTopic) {
|
||||||
blueprintId: blueprintPage.blueprint_id,
|
blueprintImageRequestTopic.publishJSON({
|
||||||
});
|
blueprintId: blueprintPage.blueprint_id,
|
||||||
|
});
|
||||||
|
}
|
||||||
return res.json({ blueprint_id: blueprintPage.blueprint_id });
|
return res.json({ blueprint_id: blueprintPage.blueprint_id });
|
||||||
} else if (blueprintPage.blueprint_book_id) {
|
} else if (blueprintPage.blueprint_book_id) {
|
||||||
const blueprintBook = await getBlueprintBookById(blueprintPage.blueprint_book_id);
|
const blueprintBook = await getBlueprintBookById(blueprintPage.blueprint_book_id);
|
||||||
@ -26,9 +28,11 @@ const handler: NextApiHandler = apiHandler(async (req, res) => {
|
|||||||
const firstBlueprintId = getFirstBlueprintFromChildTree(blueprintBook.child_tree);
|
const firstBlueprintId = getFirstBlueprintFromChildTree(blueprintBook.child_tree);
|
||||||
const firstBlueprint = await getBlueprintById(firstBlueprintId);
|
const firstBlueprint = await getBlueprintById(firstBlueprintId);
|
||||||
if (!firstBlueprint) throw new ApiError(500, "Failed to find blueprint");
|
if (!firstBlueprint) throw new ApiError(500, "Failed to find blueprint");
|
||||||
blueprintImageRequestTopic.publishJSON({
|
if (blueprintImageRequestTopic) {
|
||||||
blueprintId: firstBlueprintId,
|
blueprintImageRequestTopic.publishJSON({
|
||||||
});
|
blueprintId: firstBlueprintId,
|
||||||
|
});
|
||||||
|
}
|
||||||
return res.json({ blueprint_id: firstBlueprintId });
|
return res.json({ blueprint_id: firstBlueprintId });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
63
apps/blueprints/src/pages/api/blueprint/validate.ts
Normal file
63
apps/blueprints/src/pages/api/blueprint/validate.ts
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import { NextApiHandler } from "next";
|
||||||
|
import { getBlueprintPageById, getBlueprintStringByHash, prisma } from "@factorio-sites/database";
|
||||||
|
import { parseBlueprintString } from "@factorio-sites/node-utils";
|
||||||
|
import { apiHandler, ApiError } from "../../../utils/api-handler";
|
||||||
|
import { ChildTree } from "@factorio-sites/types";
|
||||||
|
|
||||||
|
const validateBlueprintBook = async (blueprint_book_id: string) => {
|
||||||
|
const book = await prisma.blueprint_book.findUnique({
|
||||||
|
where: { id: blueprint_book_id },
|
||||||
|
include: {
|
||||||
|
blueprint_books: true,
|
||||||
|
blueprints: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!book) return false;
|
||||||
|
|
||||||
|
const string = await getBlueprintStringByHash(book.blueprint_hash);
|
||||||
|
if (!string) {
|
||||||
|
throw new ApiError(500, "failed to fetch string", { id: book.id, hash: book.blueprint_hash });
|
||||||
|
}
|
||||||
|
const { data } = await parseBlueprintString(string);
|
||||||
|
|
||||||
|
if (!data.blueprint_book || !book.child_tree) return;
|
||||||
|
|
||||||
|
const child_tree = (book.child_tree as unknown) as ChildTree;
|
||||||
|
|
||||||
|
data.blueprint_book?.blueprints.forEach((data_bp, index) => {
|
||||||
|
console.log(data_bp);
|
||||||
|
console.log(child_tree[index]);
|
||||||
|
});
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
const DISABLED = true;
|
||||||
|
const handler: NextApiHandler = apiHandler(async (req, res) => {
|
||||||
|
if (DISABLED) throw new ApiError(400, "disabled");
|
||||||
|
if (!req.query.id) throw new ApiError(400, "No id in query");
|
||||||
|
if (!req.query.type) throw new ApiError(400, "No type in query");
|
||||||
|
|
||||||
|
if (req.query.type === "page") {
|
||||||
|
const blueprintPage = await getBlueprintPageById(req.query.id as string);
|
||||||
|
if (!blueprintPage) return res.status(404).json({ error: "Blueprint page not found" });
|
||||||
|
|
||||||
|
console.log(`Validate page ${blueprintPage.id}`);
|
||||||
|
|
||||||
|
if (blueprintPage.blueprint_id) {
|
||||||
|
return res.json({ valid: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (blueprintPage.blueprint_book_id) {
|
||||||
|
const valid = await validateBlueprintBook(blueprintPage.blueprint_book_id);
|
||||||
|
return res.json({ valid });
|
||||||
|
}
|
||||||
|
} else if (req.query.type === "book") {
|
||||||
|
const valid = await validateBlueprintBook(req.query.id as string);
|
||||||
|
return res.json({ valid });
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.json({ valid: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
export default handler;
|
@ -1,16 +0,0 @@
|
|||||||
import { NextApiHandler } from "next";
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
||||||
import { init, prisma } from "@factorio-sites/database";
|
|
||||||
|
|
||||||
const handler: NextApiHandler = async (_, res) => {
|
|
||||||
await init();
|
|
||||||
|
|
||||||
if (process.env.NODE_ENV === "development") {
|
|
||||||
const bp = await prisma.blueprint.findFirst({ where: { id: "uuid" } });
|
|
||||||
console.log({ bp });
|
|
||||||
}
|
|
||||||
|
|
||||||
res.status(200).end("db sync");
|
|
||||||
};
|
|
||||||
|
|
||||||
export default handler;
|
|
@ -1,25 +1,40 @@
|
|||||||
import { NextApiHandler } from "next";
|
import { NextApiHandler } from "next";
|
||||||
|
|
||||||
|
const BLOCKED_HEADERS = [
|
||||||
|
"content-encoding",
|
||||||
|
"connection",
|
||||||
|
"server",
|
||||||
|
"transfer-encoding",
|
||||||
|
"vary",
|
||||||
|
"report-to",
|
||||||
|
"nel",
|
||||||
|
"expect-ct",
|
||||||
|
"set-cookie",
|
||||||
|
"cache-control",
|
||||||
|
"expires",
|
||||||
|
];
|
||||||
|
|
||||||
const handler: NextApiHandler = async (req, res) => {
|
const handler: NextApiHandler = async (req, res) => {
|
||||||
const path = req.query.proxy ? (req.query.proxy as string[]).join("/") : "";
|
const path = req.query.proxy ? (req.query.proxy as string[]).join("/") : "";
|
||||||
|
|
||||||
// console.log("[fbe-proxy]", path);
|
|
||||||
|
|
||||||
const result = await fetch(
|
const result = await fetch(
|
||||||
"https://static-fbe.teoxoy.com/file/factorio-blueprint-editor/" + path
|
"https://static-fbe.teoxoy.com/file/factorio-blueprint-editor/" + path
|
||||||
);
|
);
|
||||||
|
|
||||||
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
||||||
|
|
||||||
result.headers.forEach((val, key) => {
|
result.headers.forEach((val, key) => {
|
||||||
if (
|
if (
|
||||||
!res.hasHeader(key) &&
|
!res.hasHeader(key) &&
|
||||||
!["content-encoding", "connection", "server", "transfer-encoding", "vary"].includes(key)
|
!BLOCKED_HEADERS.includes(key) &&
|
||||||
|
!key.startsWith("x-") &&
|
||||||
|
!key.startsWith("cf-")
|
||||||
) {
|
) {
|
||||||
res.setHeader(key, val);
|
res.setHeader(key, val);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
res.setHeader("Access-Control-Allow-Origin", "*");
|
||||||
|
res.setHeader("cache-control", "max-age=108000");
|
||||||
|
|
||||||
if (result.headers.get("content-type") === "application/octet-stream") {
|
if (result.headers.get("content-type") === "application/octet-stream") {
|
||||||
const output = Buffer.from(await result.arrayBuffer());
|
const output = Buffer.from(await result.arrayBuffer());
|
||||||
res.end(output);
|
res.end(output);
|
||||||
|
@ -7,11 +7,13 @@ import {
|
|||||||
hasBlueprintImage,
|
hasBlueprintImage,
|
||||||
} from "@factorio-sites/database";
|
} from "@factorio-sites/database";
|
||||||
import { Blueprint } from "@factorio-sites/types";
|
import { Blueprint } from "@factorio-sites/types";
|
||||||
|
import { apiHandler } from "../../utils/api-handler";
|
||||||
|
|
||||||
const DISABLED = true;
|
const DISABLED = true;
|
||||||
|
|
||||||
const getOneMessage = async (): Promise<Blueprint> => {
|
const getOneMessage = async (): Promise<Blueprint> => {
|
||||||
const topic = getBlueprintImageRequestTopic();
|
const topic = getBlueprintImageRequestTopic();
|
||||||
|
if (!topic) throw Error("Pubsub TOPIC not found");
|
||||||
const [subscription] = await topic
|
const [subscription] = await topic
|
||||||
.subscription("blueprint-image-function-app", {
|
.subscription("blueprint-image-function-app", {
|
||||||
flowControl: { allowExcessMessages: false, maxMessages: 1 },
|
flowControl: { allowExcessMessages: false, maxMessages: 1 },
|
||||||
@ -44,7 +46,7 @@ const getOneMessage = async (): Promise<Blueprint> => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const handler: NextApiHandler = async (req, res) => {
|
const handler: NextApiHandler = apiHandler(async (req, res) => {
|
||||||
if (DISABLED) return res.status(400).send("Method not availablee");
|
if (DISABLED) return res.status(400).send("Method not availablee");
|
||||||
|
|
||||||
// Allow the url to be used in the blueprint editor
|
// Allow the url to be used in the blueprint editor
|
||||||
@ -67,6 +69,6 @@ const handler: NextApiHandler = async (req, res) => {
|
|||||||
string: string,
|
string: string,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
};
|
});
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
@ -7,6 +7,7 @@ import {
|
|||||||
import { NextApiHandler } from "next";
|
import { NextApiHandler } from "next";
|
||||||
import { fetchSteamProfile, steamAuthenticate } from "../../../utils/openid_steam";
|
import { fetchSteamProfile, steamAuthenticate } from "../../../utils/openid_steam";
|
||||||
import { setUserToken } from "@factorio-sites/node-utils";
|
import { setUserToken } from "@factorio-sites/node-utils";
|
||||||
|
import { apiHandler } from "../../../utils/api-handler";
|
||||||
|
|
||||||
export const COOKIE_SESSION_NAME = "session-token";
|
export const COOKIE_SESSION_NAME = "session-token";
|
||||||
export const COOKIE_SESSION_OPTIONS = {
|
export const COOKIE_SESSION_OPTIONS = {
|
||||||
@ -16,13 +17,11 @@ export const COOKIE_SESSION_OPTIONS = {
|
|||||||
sameSite: "strict" as const,
|
sameSite: "strict" as const,
|
||||||
};
|
};
|
||||||
|
|
||||||
const handler: NextApiHandler = async (req, res) => {
|
const handler: NextApiHandler = apiHandler(async (req, res, { ip, useragent, url }) => {
|
||||||
console.log({ return_url: req.url });
|
console.log({ return_url: req.url });
|
||||||
if (!req.url) return;
|
if (!req.url) return;
|
||||||
|
|
||||||
const steam_id = await steamAuthenticate(req.url);
|
const steam_id = await steamAuthenticate(req.url, url);
|
||||||
const ip = (req.headers["x-forwarded-for"] || (req as any).ip) as string;
|
|
||||||
const useragent = req.headers["user-agent"] as string;
|
|
||||||
console.log({ steam_id, useragent, ip });
|
console.log({ steam_id, useragent, ip });
|
||||||
|
|
||||||
await init();
|
await init();
|
||||||
@ -52,9 +51,9 @@ const handler: NextApiHandler = async (req, res) => {
|
|||||||
res.setHeader("content-type", "text/html");
|
res.setHeader("content-type", "text/html");
|
||||||
return res.status(200).end(`
|
return res.status(200).end(`
|
||||||
<html><head>
|
<html><head>
|
||||||
<meta http-equiv="refresh" content="0;url=${process.env.BASE_URL}" />
|
<meta http-equiv="refresh" content="0;url=/" />
|
||||||
</head></html>
|
</head></html>
|
||||||
`);
|
`);
|
||||||
};
|
});
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
@ -2,21 +2,24 @@ import { NextApiHandler } from "next";
|
|||||||
import cookie from "cookie";
|
import cookie from "cookie";
|
||||||
import { getSteamRedirectUrl } from "../../../utils/openid_steam";
|
import { getSteamRedirectUrl } from "../../../utils/openid_steam";
|
||||||
import { COOKIE_SESSION_NAME } from "./return";
|
import { COOKIE_SESSION_NAME } from "./return";
|
||||||
|
import { apiHandler, ApiError } from "../../../utils/api-handler";
|
||||||
|
|
||||||
const handler: NextApiHandler = async (req, res) => {
|
const handler: NextApiHandler = apiHandler(async (req, res, { url }) => {
|
||||||
try {
|
try {
|
||||||
const cookies = cookie.parse(req.headers.cookie || "");
|
const cookies = cookie.parse(req.headers.cookie || "");
|
||||||
|
|
||||||
if (cookies[COOKIE_SESSION_NAME]) {
|
if (cookies[COOKIE_SESSION_NAME]) {
|
||||||
return res.status(400).json({ error: "User already logged in" });
|
throw new ApiError(400, "User already logged in");
|
||||||
}
|
}
|
||||||
|
|
||||||
const url = await getSteamRedirectUrl();
|
const steam_url = await getSteamRedirectUrl(url);
|
||||||
res.setHeader("location", url);
|
|
||||||
|
res.setHeader("location", steam_url);
|
||||||
res.status(302).end();
|
res.status(302).end();
|
||||||
} catch (reason) {
|
} catch (reason) {
|
||||||
console.error("creating steam redirect failed", reason);
|
console.error("creating steam redirect failed", reason);
|
||||||
res.status(500).end("Failed to authenticate with steam, please go back and try again.");
|
throw new ApiError(500, "Failed to authenticate with steam, please go back and try again.");
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
@ -1,20 +1,17 @@
|
|||||||
import { NextApiHandler } from "next";
|
import { NextApiHandler } from "next";
|
||||||
import { getBlueprintStringByHash } from "@factorio-sites/database";
|
import { getBlueprintStringByHash } from "@factorio-sites/database";
|
||||||
|
import { apiHandler } from "../../../utils/api-handler";
|
||||||
|
|
||||||
const handler: NextApiHandler = async (req, res) => {
|
const handler: NextApiHandler = apiHandler(async (req, res) => {
|
||||||
if (!req.query.hash) {
|
if (!req.query.hash) {
|
||||||
return res.status(400).end("No string hash provided");
|
return res.status(400).end("No string hash provided");
|
||||||
}
|
}
|
||||||
|
|
||||||
const blueprintString = await getBlueprintStringByHash(req.query.hash as string);
|
const blueprintString = await getBlueprintStringByHash(req.query.hash as string);
|
||||||
|
|
||||||
// Allow the url to be used in the blueprint editor
|
|
||||||
if (req.headers.origin === "https://teoxoy.github.io") {
|
|
||||||
res.setHeader("Access-Control-Allow-Origin", "https://teoxoy.github.io");
|
|
||||||
}
|
|
||||||
res.setHeader("Cache-Control", "public, max-age=86400");
|
res.setHeader("Cache-Control", "public, max-age=86400");
|
||||||
res.setHeader("Content-Type", "text/plain");
|
res.setHeader("Content-Type", "text/plain");
|
||||||
res.status(200).end(blueprintString);
|
res.status(200).end(blueprintString);
|
||||||
};
|
});
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user