UNPKG

grid-engine

Version:

Phaser3 plugin for grid based movement on a 2D game board.

609 lines (608 loc) 21.2 kB
import { CollisionStrategy } from "./Collisions/CollisionStrategy.js"; import { Finished, MoveToConfig, MoveToInfo, MoveToResult } from "./Movement/TargetMovement/TargetMovement.js"; import { PositionChange } from "./GridCharacter/GridCharacter.js"; import { Direction, NumberOfDirections, directionFromPos } from "./Direction/Direction.js"; import { Observable } from "rxjs"; import { NoPathFoundStrategy } from "./Pathfinding/NoPathFoundStrategy.js"; import { PathBlockedStrategy } from "./Pathfinding/PathBlockedStrategy.js"; import { MovementInfo } from "./Movement/Movement.js"; import { CharacterIndex, FrameRow } from "./GridCharacter/CharacterAnimation/CharacterAnimation.js"; import { CharacterFilteringOptions } from "./GridCharacter/CharacterFilter/CharacterFilter.js"; import { ShortestPathAlgorithmType } from "./Pathfinding/ShortestPathAlgorithm.js"; import { GridEngineHeadless, TileSizePerSecond, GridEngineConfigHeadless, CollisionConfig, CharacterDataHeadless } from "./GridEngineHeadless.js"; import { PhaserTilemap, TiledProject } from "./GridTilemap/Phaser/PhaserTilemap.js"; import { Orientation, Tile, TileLayer, Tilemap } from "./GridTilemap/Tilemap.js"; import { PhaserTileLayer } from "./GridTilemap/Phaser/PhaserTileLayer.js"; import { PhaserTile } from "./GridTilemap/Phaser/PhaserTile.js"; import { QueueMovementConfig, QueuedPathBlockedStrategy, Finished as QueueMovementFinished, QueueMovementResult, QueueMovementEntry } from "./Movement/QueueMovement/QueueMovement.js"; import { CharacterShift, CharacterShiftAction, FollowOptions, IGridEngine, PathfindingResult } from "./IGridEngine.js"; import { ArrayTilemap, ArrayTilemapInputLayer } from "./GridTilemap/ArrayTilemap/ArrayTilemap.js"; import { TiledTilemap } from "./GridTilemap/TiledTilemap/TiledTilemap.js"; import { TiledLayer } from "./GridTilemap/TiledTilemap/TiledLayer.js"; import { TiledTile } from "./GridTilemap/TiledTilemap/TiledTile.js"; import { GridEngineState } from "./GridEngineState.js"; import { GridCharacterState } from "./GridCharacter/GridCharacterState.js"; import { GridEngineStatePhaser } from "./GridEnginePhaser/GridEngineStatePhaser.js"; import { IsPositionAllowedFn, PathfindingOptions } from "./Pathfinding/PathfindingOptions.js"; import { CharLayer, LayerPosition, Position } from "./Position.js"; import { Concrete } from "./Utils/TypeUtils.js"; import { GridCharacterStatePhaser } from "./GridEnginePhaser/GridCharacterStatePhaser.js"; import { RawTiledLayer, RawTiledTileset, RawTiledTilesetTile, RawTiledTilesetTileProp } from "./GridTilemap/TiledTilemap/TiledMap.js"; export { ArrayTilemap, ArrayTilemapInputLayer, CharacterDataHeadless, CharacterFilteringOptions, CharacterShift, CharacterShiftAction, CharLayer, CollisionConfig, CollisionStrategy, Concrete, Direction, Finished, FollowOptions, FrameRow, GridCharacterState, GridCharacterStatePhaser, GridEngineConfigHeadless, GridEngineHeadless, GridEngineState, GridEngineStatePhaser, IGridEngine, IsPositionAllowedFn, LayerPosition, MovementInfo, MoveToConfig, MoveToInfo, MoveToResult, NoPathFoundStrategy, NumberOfDirections, Orientation, PathBlockedStrategy, PathfindingOptions, PathfindingResult, Position, PositionChange, PhaserTile, PhaserTileLayer, PhaserTilemap, QueueMovementConfig, QueueMovementEntry, QueueMovementFinished, QueueMovementResult, QueuedPathBlockedStrategy, RawTiledLayer, RawTiledTileset, RawTiledTilesetTile, RawTiledTilesetTileProp, ShortestPathAlgorithmType, Tile, TiledProject, TiledTilemap, TiledLayer, TiledTile, TileLayer, Tilemap, TileSizePerSecond, directionFromPos, }; /** * Configuration object for initializing GridEngine. * * @category Configuration */ export interface GridEngineConfig extends GridEngineConfigHeadless { /** An array of character data. Each describing a character on the map. */ characters: CharacterData[]; /** * Enables experimental * {@link https://annoraaq.github.io/grid-engine/p/layer-overlay/ | layer overlay feature}. * * @defaultValue `false` * * @beta */ layerOverlay?: boolean; /** * Object, parsed from Tiled project file. This is used to provide Tiled * project features like tile classes. */ tiledProject?: TiledProject; } export interface WalkingAnimationMapping { /** FrameRow for moving up */ [Direction.UP]: FrameRow; /** FrameRow for moving right */ [Direction.RIGHT]: FrameRow; /** FrameRow for moving down */ [Direction.DOWN]: FrameRow; /** FrameRow for moving left */ [Direction.LEFT]: FrameRow; /** FrameRow for moving up-left */ [Direction.UP_LEFT]?: FrameRow; /** FrameRow for moving up-right */ [Direction.UP_RIGHT]?: FrameRow; /** FrameRow for moving down-left */ [Direction.DOWN_LEFT]?: FrameRow; /** FrameRow for moving down-right */ [Direction.DOWN_RIGHT]?: FrameRow; } /** * Configuration object used to initialize a new character in GridEngine. * * @category Configuration */ export interface CharacterData extends CharacterDataHeadless { /** The character’s sprite. */ sprite?: Phaser.GameObjects.Sprite; /** * If not set, automatic walking animation will be disabed. Do this if you * want to use a custom animation. In case of number: The 0-based index of * the character on the spritesheet. Here is an * {@link https://github.com/Annoraaq/grid-engine/raw/master/images/charIndex.png | example image showing the character indices}. * In case of {@link WalkingAnimationMapping}: Alternatively to providing a * characterIndex you can also provide a custom frame mapping. This is * especially handy if your spritesheet has a different arrangement of frames * than you can see in the {@link https://github.com/Annoraaq/grid-engine/raw/master/images/charIndex.png | example image} * (4 rows with 3 columns). You can provide the frame number for every state * of the character. * * For more details see the {@link https://annoraaq.github.io/grid-engine/example/custom-walking-animation-mapping/ | custom walking animation mapping example}. */ walkingAnimationMapping?: CharacterIndex | WalkingAnimationMapping; /** * A container that holds the character’s sprite. This can be used in order * to move more game objects along with the sprite (for example a character’s * name or health bar). In order to position the container correctly on the * tiles, it is necessary that you position the character’s sprite on * position (0, 0) in the container. * * If you pass both, a container and a sprite, only the container's pixel * position will be changed on movement. That is only relevant if you pass a * sprite that is not included in the container. * * The height of the container is needed for depth sorting. Because * calculating the container height is an expensive operation, it will be * cached in Grid Engine. If you change the height of the container, make sure * to set it to for character again to refresh the cached height. * * For more details see the {@link https://annoraaq.github.io/grid-engine/example/phaser-containers/ | container example}. */ container?: Phaser.GameObjects.Container; /** * A custom x-offset for the sprite/container. * * @defaultValue `0` */ offsetX?: number; /** * A custom y-offset for the sprite/container. * * @defaultValue `0` */ offsetY?: number; /** * A custom y-offset for the sprite/container depth. In GridEngine the depth * sorting of characters depends on their character layer and on their y pixel * position. By setting a depthOffset you can change the y pixel position for * the depth sorting without changing the actual y pixel position. * * For example: Consider two characters A and B that are on the same character * layer. If char A is on y pixel position 100 and char B is on y pixel * position 120, then char B would be rendered in front of char A. If you set * `depthOffset = -50` for char B then char A would be rendered on top of char * B instead (because the depth relevant y pos of char B is 120 - 50 = 80 and * that of char A is 100). * * @defaultValue `0` */ depthOffset?: number; } /** * @category Main Modules */ export declare class GridEngine implements IGridEngine { private scene; static welcomeMessagePrinted: boolean; private geHeadless; private config?; private gridCharacters?; private gridTilemap?; private isCreatedInternal; /** * Should only be called by Phaser and never directly. * @internal */ constructor(scene: Phaser.Scene); /** @internal */ boot(): void; /** * {@inheritDoc IGridEngine.getCharLayer} * * @category Character */ getCharLayer(charId: string): string | undefined; /** * {@inheritDoc IGridEngine.getTransition} * * @category Tilemap */ getTransition(position: Position, fromLayer: string): string | undefined; /** * {@inheritDoc IGridEngine.setTransition} * * @category Tilemap */ setTransition(position: Position, fromLayer: string, toLayer: string): void; /** * Initializes GridEngine. Must be called before any other methods of * GridEngine are called. * * @category Grid Engine */ create(tilemap: Phaser.Tilemaps.Tilemap, config: GridEngineConfig): void; /** * {@inheritDoc IGridEngine.getPosition} * * @category Character */ getPosition(charId: string): Position; /** * {@inheritDoc IGridEngine.move} * * @category Basic Movement */ move(charId: string, direction: Direction): void; /** * {@inheritDoc IGridEngine.moveRandomly} * * @category Random Movement */ moveRandomly(charId: string, delay?: number, radius?: number): void; /** * {@inheritDoc IGridEngine.getMovement} * * @category Character */ getMovement(charId: string): MovementInfo; /** * {@inheritDoc IGridEngine.moveTo} * * @category Pathfinding */ moveTo(charId: string, targetPos: Position, config?: MoveToConfig): Observable<{ charId: string; } & Finished>; /** * {@inheritDoc IGridEngine.stopMovement} * * @category Basic Movement */ stopMovement(charId: string): void; /** * {@inheritDoc IGridEngine.setSpeed} * * @category Character */ setSpeed(charId: string, speed: number): void; /** * {@inheritDoc IGridEngine.getSpeed} * * @category Character */ getSpeed(charId: string): number; /** * Sets the container for a character. * * @category Character */ setContainer(charId: string, container?: Phaser.GameObjects.Container): void; /** * @returns Container for a character. * * @category Character */ getContainer(charId: string): Phaser.GameObjects.Container | undefined; /** * @returns X-offset for a character. * * @category Character */ getOffsetX(charId: string): number; /** * Set custom x-offset for the sprite/container. * * @category Character */ setOffsetX(charId: string, offsetX: number): void; /** * @returns Y-offset for a character. * * @category Character */ getOffsetY(charId: string): number; /** * Set custom y-offset for the sprite/container. * * @category Character */ setOffsetY(charId: string, offsetY: number): void; /** * @returns depth-offset for a character. * * @category Character */ getDepthOffset(charId: string): number; /** * {@inheritDoc IGridEngine.collidesWithTiles} * * @category Character */ collidesWithTiles(charId: string): boolean; /** * @returns {@link WalkingAnimationMapping} for a character. If a character * index was set, it will be returned instead. * * @category Character */ getWalkingAnimationMapping(charId: string): WalkingAnimationMapping | number | undefined; /** * @returns `true` if {@link https://annoraaq.github.io/grid-engine/p/layer-overlay/ | layer overlay} * is activated. * * @category Grid Engine */ hasLayerOverlay(): boolean; /** * Sets the {@link WalkingAnimationMapping} for a character. Alternatively you * can provide a number which is the character index (see also * {@link CharacterData | Character Config}). If you provide `undefined`, it * will disable walking animations for the character. * * @category Character */ setWalkingAnimationMapping(charId: string, walkingAnimationMapping?: WalkingAnimationMapping | number): void; /** @internal */ update(time: number, delta: number): void; /** * Adds a character after calling {@link create}. * * @category Grid Engine */ addCharacter(charData: CharacterData): void; /** * {@inheritDoc IGridEngine.hasCharacter} * * @category Grid Engine */ hasCharacter(charId: string): boolean; /** * {@inheritDoc IGridEngine.removeCharacter} * * @category Grid Engine */ removeCharacter(charId: string): void; /** * {@inheritDoc IGridEngine.removeAllCharacters} * * @category Grid Engine */ removeAllCharacters(): void; /** * {@inheritDoc IGridEngine.getAllCharacters} * * @category Character */ getAllCharacters(options?: CharacterFilteringOptions): string[]; /** * {@inheritDoc IGridEngine.getLabels} * * @category Character */ getLabels(charId: string): string[]; /** * {@inheritDoc IGridEngine.addLabels} * * @category Character */ addLabels(charId: string, labels: string[]): void; /** * {@inheritDoc IGridEngine.removeLabels} * * @category Character */ removeLabels(charId: string, labels: string[]): void; /** * {@inheritDoc IGridEngine.clearLabels} * * @category Character */ clearLabels(charId: string): void; /** * {@inheritDoc IGridEngine.follow} * * @category Pathfinding */ follow(charId: string, charIdToFollow: string, options?: FollowOptions): void; follow(charId: string, charIdToFollow: string, distance?: number, closestPointIfBlocked?: boolean): void; /** * {@inheritDoc IGridEngine.isMoving} * * @category Character */ isMoving(charId: string): boolean; /** * {@inheritDoc IGridEngine.getFacingDirection} * * @category Character */ getFacingDirection(charId: string): Direction; /** * {@inheritDoc IGridEngine.getFacingPosition} * * @category Character */ getFacingPosition(charId: string): Position; /** * {@inheritDoc IGridEngine.turnTowards} * * @category Basic Movement */ turnTowards(charId: string, direction: Direction): void; /** * {@inheritDoc IGridEngine.getCharactersAt} * * @category Tilemap */ getCharactersAt(position: Position, layer?: string): string[]; /** * {@inheritDoc IGridEngine.setPosition} * * @category Character */ setPosition(charId: string, pos: Position, layer?: string): void; /** * @returns Sprite of given character * * @category Character */ getSprite(charId: string): Phaser.GameObjects.Sprite | undefined; /** * Sets the sprite for a character. * * @category Character */ setSprite(charId: string, sprite: Phaser.GameObjects.Sprite): void; /** * {@inheritDoc IGridEngine.isBlocked} * * @category Tilemap */ isBlocked(position: Position, layer?: string, collisionGroups?: string[]): boolean; /** * {@inheritDoc IGridEngine.isTileBlocked} * * @category Tilemap */ isTileBlocked(position: Position, layer?: string): boolean; /** * {@inheritDoc IGridEngine.getCollisionGroups} * * @category Character */ getCollisionGroups(charId: string): string[]; /** * {@inheritDoc IGridEngine.setCollisionGroups} * * @category Character */ setCollisionGroups(charId: string, collisionGroups: string[]): void; /** * {@inheritDoc IGridEngine.getIgnoreCollisionGroups} * * @category Character */ getIgnoreCollisionGroups(charId: string): string[]; /** * {@inheritDoc IGridEngine.setIgnoreCollisionGroups} * * @category Character */ setIgnoreCollisionGroups(charId: string, ignoreCollisionGroups: string[]): void; /** * {@inheritDoc IGridEngine.getTilePosInDirection} * * @category Tilemap */ getTilePosInDirection(position: Position, charLayer: string | undefined, direction: Direction): LayerPosition; /** * {@inheritDoc IGridEngine.findShortestPath} * @alpha * * @category Pathfinding */ findShortestPath(source: LayerPosition, dest: LayerPosition, options?: PathfindingOptions): PathfindingResult; /** * {@inheritDoc IGridEngine.steppedOn} * * @category Basic Movement */ steppedOn(charIds: string[], tiles: Position[], layer?: CharLayer[]): Observable<{ charId: string; } & PositionChange>; /** * {@inheritDoc IGridEngine.characterShifted} * * @category GridEngine */ characterShifted(): Observable<CharacterShift>; /** * {@inheritDoc IGridEngine.movementStarted} * * @category Character */ movementStarted(): Observable<{ charId: string; direction: Direction; }>; /** * {@inheritDoc IGridEngine.movementStopped} * * @category Character */ movementStopped(): Observable<{ charId: string; direction: Direction; }>; /** * {@inheritDoc IGridEngine.directionChanged} * * @category Character */ directionChanged(): Observable<{ charId: string; direction: Direction; }>; /** * {@inheritDoc IGridEngine.positionChangeStarted} * * @category Character */ positionChangeStarted(): Observable<{ charId: string; } & PositionChange>; /** * {@inheritDoc IGridEngine.positionChangeFinished} * * @category Character */ positionChangeFinished(): Observable<{ charId: string; } & PositionChange>; /** * {@inheritDoc IGridEngine.getMovementProgress} * * @category Character */ getMovementProgress(charId: string): number; /** * {@inheritDoc IGridEngine.rebuildTileCollisionCache} * * @category Grid Engine */ rebuildTileCollisionCache(x: number, y: number, width: number, height: number): void; /** * {@inheritDoc IGridEngine.addQueueMovements} * * @category Queue Movement */ addQueueMovements(charId: string, positions: Array<LayerPosition | Direction>, options?: QueueMovementConfig): void; /** * {@inheritDoc IGridEngine.getEnqueuedMovements} * * @category Queue Movement */ getEnqueuedMovements(charId: string): QueueMovementEntry[]; /** * {@inheritDoc IGridEngine.queueMovementFinished} * * @category Queue Movement */ queueMovementFinished(): Observable<{ charId: string; } & QueueMovementFinished>; /** * {@inheritDoc IGridEngine.clearEnqueuedMovements} * * @category Queue Movement */ clearEnqueuedMovements(charId: string): void; /** * Returns the current state of Grid Engine. This is useful for persiting or * sharing the state. * * @category GridEngine * * @beta */ getState(): GridEngineStatePhaser; /** * Sets the given state for Grid Engine. Be aware that it will **not** remove * any characters from Grid Engine. If you want to completely reset the state, * you should call {@link GridEngine.create} * or remove all characters via * {@link GridEngine.removeAllCharacters}. * * @category GridEngine * * @beta */ setState(state: GridEngineStatePhaser): void; /** * {@inheritDoc IGridEngine.getTileCost} * * @category Pathfinding */ getTileCost(position: Position, charLayer?: string, srcDirection?: Direction): number; /** * {@inheritDoc IGridEngine.revertCurrentMovement} * * @category Basic Movement */ revertCurrentMovement(charId: string): void; /** * {@inheritDoc IGridEngine.isCurrentMovementReverted} * * @category Basic Movement */ isCurrentMovementReverted(charId: string): boolean; private setConfigDefaults; private initGuard; private createUninitializedErr; private addCharacters; private createCharUnknownErr; private addCharacterInternal; }