Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/GridEngine.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -653,6 +653,7 @@ describe("GridEngine", () => {
result: "NO_PATH_FOUND",
description: "NoPathFoundStrategy STOP: No path found.",
layer: undefined,
finishedEvent: "START_MOVEMENT",
});
done();
});
Expand Down
1 change: 1 addition & 0 deletions src/GridEngineHeadless.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,7 @@ describe("GridEngineHeadless", () => {
result: "NO_PATH_FOUND",
description: "NoPathFoundStrategy STOP: No path found.",
layer: undefined,
finishedEvent: "START_MOVEMENT",
});
done();
});
Expand Down
1 change: 1 addition & 0 deletions src/GridEngineHeadless.ts
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,7 @@ export class GridEngineHeadless implements IGridEngine {
result: finished.result,
description: finished.description,
layer: finished.layer,
finishedEvent: finished.finishedEvent,
})),
);
}
Expand Down
167 changes: 166 additions & 1 deletion src/Movement/TargetMovement/TargetMovement.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,96 @@ describe("TargetMovement", () => {
expect(mockChar.getTilePos()).toEqual(layerPos(new Vector2(1, 1)));
});

it("should turn towards target if distance is reached", () => {
const charPos = layerPos(new Vector2(3, 0));
const mockChar = createMockChar("char", charPos);
tilemapMock = mockLayeredBlockMap([
{
layer: "lowerCharLayer",
blockMap: [
// prettier-ignore
"..#p",
".t#.",
".##.",
"....",
],
},
]);
gridTilemap = new GridTilemap(
tilemapMock,
"ge_collide",
CollisionStrategy.BLOCK_TWO_TILES,
);

targetMovement = new TargetMovement(
mockChar,
gridTilemap,
layerPos(new Vector2(1, 1)),
{
distance: 4,
config: {
algorithm: shortestPathAlgo,
},
},
);
targetMovement.init();
chunkUpdate(targetMovement, mockChar, CHUNKS_PER_SECOND);
chunkUpdate(targetMovement, mockChar, CHUNKS_PER_SECOND);
chunkUpdate(targetMovement, mockChar, CHUNKS_PER_SECOND);
chunkUpdate(targetMovement, mockChar, CHUNKS_PER_SECOND);
chunkUpdate(targetMovement, mockChar, CHUNKS_PER_SECOND);

expect(mockChar.getTilePos()).toEqual(layerPos(new Vector2(1, 3)));
expect(mockChar.getFacingDirection()).toEqual(Direction.UP);

chunkUpdate(targetMovement, mockChar, CHUNKS_PER_SECOND);

expect(mockChar.getTilePos()).toEqual(layerPos(new Vector2(1, 3)));
});

it("should turn towards target if closest to target is reached", () => {
const charPos = layerPos(new Vector2(1, 0));
const mockChar = createMockChar("char", charPos);
tilemapMock = mockLayeredBlockMap([
{
layer: "lowerCharLayer",
blockMap: [
// prettier-ignore
".p#.",
"..#.",
"..#.",
"..#t",
],
},
]);
gridTilemap = new GridTilemap(
tilemapMock,
"ge_collide",
CollisionStrategy.BLOCK_TWO_TILES,
);

targetMovement = new TargetMovement(
mockChar,
gridTilemap,
layerPos(new Vector2(3, 3)),
{
config: {
algorithm: shortestPathAlgo,
noPathFoundStrategy: NoPathFoundStrategy.CLOSEST_REACHABLE,
},
},
);
targetMovement.init();
chunkUpdate(targetMovement, mockChar, CHUNKS_PER_SECOND);
chunkUpdate(targetMovement, mockChar, CHUNKS_PER_SECOND);
chunkUpdate(targetMovement, mockChar, CHUNKS_PER_SECOND);
chunkUpdate(targetMovement, mockChar, CHUNKS_PER_SECOND);
chunkUpdate(targetMovement, mockChar, CHUNKS_PER_SECOND);

expect(mockChar.getTilePos()).toEqual(layerPos(new Vector2(1, 3)));
expect(mockChar.getFacingDirection()).toEqual(Direction.RIGHT);
});

it("should move if closestToTarget is further than distance", () => {
const charPos = layerPos(new Vector2(1, 0));
const mockChar = createMockChar("char", charPos);
Expand Down Expand Up @@ -786,6 +876,7 @@ describe("TargetMovement", () => {
description:
"NoPathFoundStrategy RETRY: Maximum retries of 2 exceeded.",
layer: "lowerCharLayer",
finishedEvent: "START_MOVEMENT",
});
expect(finishedObsCompleteMock).toHaveBeenCalled();
});
Expand Down Expand Up @@ -962,6 +1053,7 @@ describe("TargetMovement", () => {
result: MoveToResult.NO_PATH_FOUND,
description: "NoPathFoundStrategy STOP: No path found.",
layer: "lowerCharLayer",
finishedEvent: "START_MOVEMENT",
});
expect(finishedObsCompleteMock).toHaveBeenCalled();
});
Expand Down Expand Up @@ -1050,6 +1142,7 @@ describe("TargetMovement", () => {
result: MoveToResult.PATH_BLOCKED_WAIT_TIMEOUT,
description: "PathBlockedStrategy WAIT: Wait timeout of 2000ms exceeded.",
layer: "lowerCharLayer",
finishedEvent: "START_MOVEMENT",
});
expect(finishedObsCompleteMock).toHaveBeenCalled();
});
Expand Down Expand Up @@ -1332,6 +1425,7 @@ describe("TargetMovement", () => {
description:
"PathBlockedStrategy RETRY: Maximum retries of 2 exceeded.",
layer: "lowerCharLayer",
finishedEvent: "START_MOVEMENT",
});
expect(finishedObsCompleteMock).toHaveBeenCalled();
});
Expand Down Expand Up @@ -1385,6 +1479,7 @@ describe("TargetMovement", () => {
result: MoveToResult.PATH_BLOCKED,
description: `PathBlockedStrategy STOP: Path blocked.`,
layer: "lowerCharLayer",
finishedEvent: "START_MOVEMENT",
});
expect(finishedObsCompleteMock).toHaveBeenCalled();
});
Expand Down Expand Up @@ -1474,6 +1569,7 @@ describe("TargetMovement", () => {
description:
"Movement of character has been replaced before destination was reached.",
layer: "lowerCharLayer",
finishedEvent: "START_MOVEMENT",
});
});

Expand Down Expand Up @@ -1506,7 +1602,7 @@ describe("TargetMovement", () => {
expect(mockCall).toHaveBeenCalled();
});

it("should fire when char arrives", () => {
it("should fire when char does last step", () => {
const mockCall = jest.fn();
const targetPos = { position: new Vector2(0, 0), layer: "testCharLayer" };
gridTilemap.setTransition(
Expand All @@ -1529,6 +1625,7 @@ describe("TargetMovement", () => {
result: MoveToResult.SUCCESS,
description: "Successfully arrived.",
layer: "testCharLayer",
finishedEvent: "START_MOVEMENT",
});
});

Expand All @@ -1544,6 +1641,73 @@ describe("TargetMovement", () => {
mockChar.update(1000);
expect(mockCall).toHaveBeenCalledTimes(1);
});

it("should fire after char does last step", () => {
const mockCall = jest.fn();
const targetPos = {
position: new Vector2(2, 0),
layer: "lowerCharLayer",
};
targetMovement = new TargetMovement(mockChar, gridTilemap, targetPos, {
config: {
algorithm: shortestPathAlgo,
emitFinishedEvent: "END_MOVEMENT",
},
});
mockChar.setMovement(targetMovement);
targetMovement.init();
targetMovement.finishedObs().subscribe(mockCall);

mockChar.update(500);
mockChar.update(500);
mockChar.update(500);

expect(mockCall).toHaveBeenCalledWith({
position: targetPos.position,
result: MoveToResult.SUCCESS,
description: "Successfully arrived.",
layer: "lowerCharLayer",
finishedEvent: "END_MOVEMENT",
});
});

it("should fire before and after char does last step", () => {
const mockCall = jest.fn();
const targetPos = {
position: new Vector2(2, 0),
layer: "lowerCharLayer",
};
targetMovement = new TargetMovement(mockChar, gridTilemap, targetPos, {
config: {
algorithm: shortestPathAlgo,
emitFinishedEvent: "BOTH",
},
});
mockChar.setMovement(targetMovement);
targetMovement.init();
targetMovement.finishedObs().subscribe(mockCall);

mockChar.update(500);
mockChar.update(200);
expect(mockCall).toHaveBeenCalledWith({
position: targetPos.position,
result: MoveToResult.SUCCESS,
description: "Successfully arrived.",
layer: "lowerCharLayer",
finishedEvent: "START_MOVEMENT",
});
expect(mockCall).toHaveBeenCalledTimes(1);

mockChar.update(500);

expect(mockCall).toHaveBeenCalledWith({
position: targetPos.position,
result: MoveToResult.SUCCESS,
description: "Successfully arrived.",
layer: "lowerCharLayer",
finishedEvent: "END_MOVEMENT",
});
});
});

describe("8 directions", () => {
Expand Down Expand Up @@ -2434,6 +2598,7 @@ describe("TargetMovement", () => {
result: MoveToResult.NO_PATH_FOUND,
description: "NoPathFoundStrategy STOP: No path found.",
layer: "lowerCharLayer",
finishedEvent: "START_MOVEMENT",
});
expect(finishedObsCompleteMock).toHaveBeenCalled();
});
Expand Down
Loading
Loading