Split client code from server

This commit is contained in:
2026-03-20 23:13:27 +01:00
parent eb3910d7ea
commit 1fc21d700e
117 changed files with 850 additions and 762 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
import '../lib';
import { expect } from 'chai';
import { resizeCanvas, resizeCanvasWithRatio } from '../../client/canvasUtils';
import { resizeCanvas, resizeCanvasWithRatio } from '../../common/canvasUtils';
describe('canvasUtils', () => {
describe('resizeCanvas()', () => {
+2 -1
View File
@@ -20,9 +20,10 @@ import { createCamera } from '../../common/camera';
import { commonPalettes } from '../../graphics/graphicsUtils';
import { Model } from '../../components/services/model';
import { createRegion } from '../../common/region';
import { getTile, addEntity, setRegion, createWorldMap } from '../../common/worldMap';
import { addEntity, setRegion, createWorldMap } from '../../client/worldMap';
import { createServerRegion } from '../../server/serverRegion';
import { ServerRegion } from '../../server/serverInterfaces';
import { getTile } from '../../common/tileUtils';
describe('ClientActions', () => {
let zone: NgZone;
+2 -1
View File
@@ -1,11 +1,12 @@
import '../lib';
import { expect } from 'chai';
import {
cleanName, cleanMessage, filterString, isSpamMessage, toSocialSiteInfo
isSpamMessage, toSocialSiteInfo
} from '../../client/clientUtils';
import { repeat, removeItem } from '../../common/utils';
import { SAY_MAX_LENGTH } from '../../common/constants';
import { oauthProviders } from '../../client/data';
import { cleanMessage, cleanName, filterString } from '../../common/stringUtils';
const cleanNameTests: [string | undefined, string, string][] = [
[undefined, '', 'undefined'],
+1 -1
View File
@@ -1,6 +1,6 @@
import '../lib';
import { expect } from 'chai';
import { splitEmojis, findEmoji, replaceEmojis, emojis, hasEmojis, autocompleteMesssage } from '../../client/emoji';
import { splitEmojis, findEmoji, replaceEmojis, emojis, hasEmojis, autocompleteMesssage } from '../../common/emoji';
describe('emotes', () => {
describe('findEmote()', () => {
+2 -2
View File
@@ -2,10 +2,10 @@
import { compareCanvases, loadSprites, loadImageAsCanvas, clearCompareResults } from '../lib';
import * as path from 'path';
import { TRANSPARENT, blushColor, WHITE } from '../../common/colors';
import { defaultPonyState, defaultDrawPonyOptions } from '../../client/ponyHelpers';
import { defaultPonyState, defaultDrawPonyOptions } from '../../common/ponyHelpers';
import { mockPaletteManager, createDefaultPony } from '../../common/ponyInfo';
import { PonyState, PalettePonyInfo, PonyInfo, DrawPonyOptions, NoDraw } from '../../common/interfaces';
import { sit, trot, sitDown, laugh, fly } from '../../client/ponyAnimations';
import { sit, trot, sitDown, laugh, fly } from '../../common/ponyAnimations';
import { drawCanvas } from '../../graphics/contextSpriteBatch';
import { parseExpression } from '../../common/expressionUtils';
import { compressPonyString, decodePonyInfo } from '../../common/compressPony';
+2 -2
View File
@@ -4,9 +4,9 @@ import {
trotting, flying, standing, lying, sitting, hovering, toBoopState, booping, boopingSitting,
boopingLying, boopingFlying, sittingDown, isFlyingUp, flyingUp, trottingToFlying, flyingToTrotting,
flyingDown, isFlyingUpOrDown, isFlyingDown
} from '../../client/ponyStates';
} from '../../common/ponyStates';
import { EntityState } from '../../common/interfaces';
import { flagsToState } from '../../common/pony';
import { flagsToState } from '../../client/pony';
describe('ponyStates', () => {
describe('flagsToState()', () => {
+1 -1
View File
@@ -1,7 +1,7 @@
import { compareCanvases, loadSprites, loadImageAsCanvas, clearCompareResults } from '../lib';
import { expect } from 'chai';
import { WHITE, BLACK } from '../../common/colors';
import { fontPal } from '../../client/fonts';
import { fontPal } from '../../common/fonts';
import { drawCanvas, ContextSpriteBatch } from '../../graphics/contextSpriteBatch';
import { pathTo } from '../../server/paths';
import { paletteSpriteSheet } from '../../generated/sprites';
+3 -3
View File
@@ -2,15 +2,15 @@ import '../lib';
import { Subject } from 'rxjs';
import { expect } from 'chai';
import { useFakeTimers, SinonFakeTimers } from 'sinon';
import { getRegion, addEntity, setRegion, createWorldMap } from '../../common/worldMap';
import { addEntity, setRegion, createWorldMap } from '../../client/worldMap';
import { PonyTownGame } from '../../client/game';
import { MessageType, Entity, Pony, TileType, EntityState, DecodedUpdate } from '../../common/interfaces';
import { entity, mock } from '../mocks';
import { rect } from '../../common/rect';
import { pony, apple } from '../../common/entities';
import { createAnimator } from '../../common/animator';
import { defaultPonyState } from '../../client/ponyHelpers';
import { createRegion } from '../../common/region';
import { defaultPonyState } from '../../common/ponyHelpers';
import { createRegion, getRegion } from '../../common/region';
import { createCamera } from '../../common/camera';
import { chatAnimationDuration } from '../../graphics/graphicsUtils';
import { handleUpdateEntity, handleSays } from '../../client/handlers';
+1 -1
View File
@@ -8,7 +8,7 @@ import { ServerRegion } from '../../server/serverInterfaces';
import { PONY_TYPE, tileWidth, tileHeight } from '../../common/constants';
import { generateRegionCollider } from '../../common/region';
import { ponyColliders } from '../../common/mixins';
import { updateTileIndices } from '../../client/tileUtils';
import { updateTileIndices } from '../../common/tileUtils';
export function colliders(x: number, y: number, w: number, h: number, tall = true, exact = false): Collider[] {
return [{ x, y, w, h, tall, exact }];
+1 -1
View File
@@ -4,7 +4,7 @@ import { parseExpression, expression } from '../../common/expressionUtils';
import { expressions } from '../../common/expressions';
import { Expression, Iris, Eye, Muzzle, ExpressionExtra } from '../../common/interfaces';
import { decodeExpression, encodeExpression } from '../../common/encoders/expressionEncoder';
import { flipIris } from '../../client/ponyUtils';
import { flipIris } from '../../common/ponyUtils';
function toExpression([right, left, muzzle, rightIris = 0, leftIris = 0, extra = 0]: any): Expression {
return { left, right, muzzle, rightIris, leftIris, extra };
+1 -1
View File
@@ -1,6 +1,6 @@
import '../lib';
import { expect } from 'chai';
import { defaultPonyState, isStateEqual } from '../../client/ponyHelpers';
import { defaultPonyState, isStateEqual } from '../../common/ponyHelpers';
describe('interfaces', () => {
describe('isStateEqual()', () => {
@@ -2,7 +2,7 @@ import '../lib';
import { expect } from 'chai';
import { stub, assert } from 'sinon';
import { createTexturesForSpriteSheets } from '../../graphics/spriteSheetUtils';
import { createCanvas } from '../../client/canvasUtils';
import { createCanvas } from '../../common/canvasUtils';
import { SpriteSheet } from '../../common/interfaces';
function createImageData() {
+1 -1
View File
@@ -8,13 +8,13 @@ import * as del from 'del';
import { once, mapValues } from 'lodash';
import { spawnSync } from 'child_process';
import { createStubInstance, SinonStubbedInstance, stub } from 'sinon';
import { loadAndInitSheets } from '../client/spriteUtils';
import '../server/canvasUtilsNode';
import { setPaletteManager } from '../common/mixins';
import { mockPaletteManager } from '../common/ponyInfo';
import { spriteSheets } from '../generated/sprites';
import { pathTo } from '../server/paths';
import { loadImage, loadImageSync, createCanvas } from '../server/canvasUtilsNode';
import { loadAndInitSheets } from '../client/loadSprites';
require('chai').use(require('chai-as-promised'));
+3 -3
View File
@@ -4,14 +4,14 @@ import { Subject } from 'rxjs';
import { SinonStubbedInstance, stub } from 'sinon';
import { IClient, Reporter, ServerEntity, ServerRegion } from '../server/serverInterfaces';
import { IAccount, ICharacter, IAuth } from '../server/db';
import { ClientActions } from '../client/clientActions';
import { Entity, IMap, defaultWorldState } from '../common/interfaces';
import { createServerMap } from '../server/serverMap';
import { createCamera } from '../common/camera';
import { getRegionGlobal } from '../common/worldMap';
import { mixColliderRect } from '../common/mixins';
import { createBinaryWriter } from 'ag-sockets';
import { PONY_TYPE } from '../common/constants';
import { getRegionGlobal } from '../common/region';
import { ClientActionsTemplate } from '../common/clientActionsTemplte';
export function auth(item: Partial<IAuth>): IAuth {
return item as IAuth;
@@ -106,7 +106,7 @@ export function mockClient(fields: any = {}): IClient {
...fields,
};
const client = mock(ClientActions, partial) as IClient;
const client = mock(ClientActionsTemplate, partial) as IClient;
client.pony.client = client;
return client;
+1 -1
View File
@@ -4,7 +4,7 @@ import { createServerMap, findEntities, findClosestEntity } from '../../server/s
import { serverEntity } from '../mocks';
import { ServerEntity, ServerMap, ServerRegion } from '../../server/serverInterfaces';
import { addEntityToRegion } from '../../server/serverRegion';
import { getRegion } from '../../common/worldMap';
import { getRegion } from '../../common/region';
describe('mapUtils', () => {
let map: ServerMap;
+1 -1
View File
@@ -17,11 +17,11 @@ import { createServerRegion } from '../../server/serverRegion';
import { rect } from '../../common/rect';
import { CounterService } from '../../server/services/counter';
import { createCamera } from '../../common/camera';
import { getRegion } from '../../common/worldMap';
import { createServerMap } from '../../server/serverMap';
import { createBinaryWriter, getWriterBuffer } from 'ag-sockets';
import { sendAction } from '../../server/entityUtils';
import { updateColliders } from '../common/collision.spec';
import { getRegion } from '../../common/region';
describe('playerUtils', () => {
const def = { x: 0, y: 0, vx: 0, vy: 0, action: 0, playerState: 0, options: undefined };
+1 -1
View File
@@ -10,8 +10,8 @@ import { IClient, ServerRegion } from '../../server/serverInterfaces';
import { addEntityToRegion, createServerRegion } from '../../server/serverRegion';
import { createServerMap } from '../../server/serverMap';
import { mockClient, serverEntity } from '../mocks';
import { getRegion } from '../../common/worldMap';
import { EntityFlags } from '../../common/interfaces';
import { getRegion } from '../../common/region';
describe('regionUtils', () => {
let client: IClient;
+1 -1
View File
@@ -1,8 +1,8 @@
import '../lib';
import { expect } from 'chai';
import { createServerMap } from '../../server/serverMap';
import { getRegion, getRegionGlobal } from '../../common/worldMap';
import { ServerMap } from '../../server/serverInterfaces';
import { getRegion, getRegionGlobal } from '../../common/region';
describe('serverMap', () => {
let map: ServerMap;