From 7186f283ef9ef87d61989032e8be925ce975dcdb Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 17 Apr 2026 18:27:39 +0500 Subject: [PATCH 1/2] chore: optimization world --- src/core/manager.ts | 4 ++-- .../core/engine/classes-engine.interfaces.ts | 3 ++- src/middlewares/entity/pickup-guard.middleare.ts | 2 +- src/utils/geometry/getters/getters.ts | 14 -------------- src/utils/logic/getters/world-getters.ts | 5 ++--- .../geometry-guards/position-is.type-guards.ts | 11 ++++++++++- src/world/entities/entity.ts | 2 +- src/world/map.ts | 7 +++---- 8 files changed, 21 insertions(+), 27 deletions(-) diff --git a/src/core/manager.ts b/src/core/manager.ts index 2a49c6f..09514a8 100644 --- a/src/core/manager.ts +++ b/src/core/manager.ts @@ -7,7 +7,7 @@ import type { } from "@interfaces"; import type { GridPosition, Position } from "@types"; import { Entity, GameMap } from "@world"; -import { checkCollisions, convertPositionToGridPosition, getInPosition } from "@utils"; +import { checkCollisions, convertPositionToGridPosition } from "@utils"; import { FactoryKeys } from "@enums"; export class EntityManager implements Manager { @@ -165,7 +165,7 @@ export class EntityManager implements Manager { const entity = this.get(id) if (!entity) return false - if (!getInPosition(entity.position, Array.from(this.entities.values()))) return false + if (!(this.gameMap.getAllInPosition(entity.position, 'ENTITES').find(e => e.id === entity.id))) return false return !checkCollisions(this.gameMap.getAllInPosition(entity.position), entity) } diff --git a/src/interfaces/core/engine/classes-engine.interfaces.ts b/src/interfaces/core/engine/classes-engine.interfaces.ts index 23c934f..fb1fd26 100644 --- a/src/interfaces/core/engine/classes-engine.interfaces.ts +++ b/src/interfaces/core/engine/classes-engine.interfaces.ts @@ -15,6 +15,7 @@ import type { AnyPosition, CustomEventCallback, EventCallback, + GridPosition, MiddlewareFn, Position, Quad, @@ -267,7 +268,7 @@ export interface IGameMap { /** * Get one object by id * @param id - ID of object - * @returns { GameObject | undefined } - GameObject if founded, else false + * @returns { GameObject | undefined } - GameObject if founded, else undefined */ readonly getObject: (id: number) => GameObject | undefined; diff --git a/src/middlewares/entity/pickup-guard.middleare.ts b/src/middlewares/entity/pickup-guard.middleare.ts index ac907e8..33f4cea 100644 --- a/src/middlewares/entity/pickup-guard.middleare.ts +++ b/src/middlewares/entity/pickup-guard.middleare.ts @@ -19,7 +19,7 @@ export const PickUpGuard: MiddlewareFn = (cmd, next, game, ctx) => { position } - const item = getItemInPosition(position, game.options.map.getAllItems()) + const item = getItemInPosition(game.options.map.getAllInPosition(position, 'OBJECTS')) if (!item) anyErrorData = { reason: ITERACTION_ERRORS.NOT_FOUND, diff --git a/src/utils/geometry/getters/getters.ts b/src/utils/geometry/getters/getters.ts index fb34c83..1150c81 100644 --- a/src/utils/geometry/getters/getters.ts +++ b/src/utils/geometry/getters/getters.ts @@ -1,18 +1,4 @@ import type { Position, Quad } from "@types" -import { checkTwoPositions } from "@utils" -import type { Entity, GameObject } from "@world" - -/** - * Find one Target in provided Position - * @param position - Position to find Target - * @param entities - Targets array to searching - * @returns {Target | undefined} - Target if founded, else undefined - */ -export function getInPosition(position: Position, objects: GameObject[]): GameObject | undefined -export function getInPosition(position: Position, entities: Entity[]): Entity | undefined -export function getInPosition(position: Position, entities: (Entity | GameObject)[]): (Entity | GameObject) | undefined { - return entities.find((entity) => checkTwoPositions(position, entity.position)) -} /** * Get a central position of Quad diff --git a/src/utils/logic/getters/world-getters.ts b/src/utils/logic/getters/world-getters.ts index 42fab33..af5a513 100644 --- a/src/utils/logic/getters/world-getters.ts +++ b/src/utils/logic/getters/world-getters.ts @@ -5,12 +5,11 @@ import type { GameObject } from "@world" /** * Return a Item in provided Position, else undefined if not found - * @param position - Position to search * @param objects - GameObject to searching in * @returns {IWorldItem | undefined} - Item if found, else undefined */ -export function getItemInPosition(position: Position, objects: (IWorldItem & IGameObject)[]): IWorldItem | undefined { - const obj = objects.find((obj) => (checkTwoPositions(position, obj.position) && gameObjectIsItem(obj))) +export function getItemInPosition(objects: (IWorldItem & IGameObject)[]): IWorldItem | undefined { + const obj = objects.find((obj) => gameObjectIsItem(obj)) return obj ? convertGameObjectToInventoryItem(obj) : undefined } diff --git a/src/utils/types-guards/geometry-guards/position-is.type-guards.ts b/src/utils/types-guards/geometry-guards/position-is.type-guards.ts index a9a64a2..341c0b7 100644 --- a/src/utils/types-guards/geometry-guards/position-is.type-guards.ts +++ b/src/utils/types-guards/geometry-guards/position-is.type-guards.ts @@ -1,4 +1,4 @@ -import type { AnyPosition, Position, Quad } from "@types" +import type { AnyPosition, GridPosition, Position, Quad } from "@types" /** * Check AnyPosition is Quad @@ -26,4 +26,13 @@ export function positionIsPosition(position: AnyPosition): position is Position if (x === undefined || y === undefined) return false else return (!isNaN(x) && !isNaN(y) && position.length === 2) ? true : false +} + +/** + * Checks given position is GridPosition + * @param position - Position to check + * @returns { boolean } - True if provided position is GridPosition, else false + */ +export function positionIsGridPosition(position: Position | GridPosition): position is GridPosition { + return typeof position === "string" && position.split(":").length > 0 } \ No newline at end of file diff --git a/src/world/entities/entity.ts b/src/world/entities/entity.ts index 822bd17..2bfdde5 100644 --- a/src/world/entities/entity.ts +++ b/src/world/entities/entity.ts @@ -193,7 +193,7 @@ export class Entity implements ITarget { * @returns { IWorldItem } - IWorldItem */ public pickUp(position: Position): IWorldItem { - const item = getItemInPosition(position, this.map.getAllItems())! + const item = getItemInPosition(this.map.getAllInPosition(position, 'OBJECTS'))! this.inventory.push(item) this.map.deleteObject(item.id) diff --git a/src/world/map.ts b/src/world/map.ts index b54a78b..42103ad 100644 --- a/src/world/map.ts +++ b/src/world/map.ts @@ -23,11 +23,10 @@ import type { } from "@types"; import { convertAnyPositionToPosition, - gameObjectIsItem, - getInPosition, + gameObjectIsItem, createQuadFromPosition, checkCollisions, - convertPositionToGridPosition + convertPositionToGridPosition, } from "@utils"; import { Entity, GameObject } from "@world"; import { BASE_HEARING_RADIUS } from "@const"; @@ -323,7 +322,7 @@ export class GameMap implements Map { const object = this.getObject(id) if (!object) return false - if (!getInPosition(object.position, Array.from(this.objects.values()))) return false + if (!(this.grid.get(convertPositionToGridPosition(object.position))?.has(object))) return false return !checkCollisions(this.getAllInPosition(object.position), object) } From 77bd624e8fee432d2bad8236503e938590b70807 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 17 Apr 2026 18:28:41 +0500 Subject: [PATCH 2/2] chore: remove unused import --- src/interfaces/core/engine/classes-engine.interfaces.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/interfaces/core/engine/classes-engine.interfaces.ts b/src/interfaces/core/engine/classes-engine.interfaces.ts index fb1fd26..3894827 100644 --- a/src/interfaces/core/engine/classes-engine.interfaces.ts +++ b/src/interfaces/core/engine/classes-engine.interfaces.ts @@ -15,7 +15,6 @@ import type { AnyPosition, CustomEventCallback, EventCallback, - GridPosition, MiddlewareFn, Position, Quad,