From ba8b1a29fd5d196d108ea5c2669200a8f7211b43 Mon Sep 17 00:00:00 2001 From: schmelczerandras Date: Tue, 6 Oct 2020 14:08:43 +0200 Subject: [PATCH] Simplify types --- .devcontainer/devcontainer.json | 2 +- backend/src/objects/character-physical.ts | 10 +++++++++- backend/src/objects/lamp-physical.ts | 3 ++- backend/src/objects/tunnel-physical.ts | 3 ++- .../physics/containers/bounding-box-list.ts | 2 +- backend/src/players/player.ts | 3 ++- frontend/.vscode/settings.json | 8 -------- .../src/scripts/commands/types/move-to.ts | 2 -- frontend/src/scripts/commands/types/render.ts | 2 -- frontend/src/scripts/transport/deserialize.ts | 6 +++--- shared/src/commands/command-receiver.ts | 2 +- shared/src/commands/command.ts | 8 ++------ shared/src/commands/types/create-objects.ts | 2 -- shared/src/commands/types/create-player.ts | 2 -- shared/src/commands/types/delete-objects.ts | 2 -- shared/src/commands/types/move-action.ts | 2 -- shared/src/commands/types/primary-action.ts | 2 -- shared/src/commands/types/secondary-action.ts | 2 -- .../commands/types/set-view-area-action.ts | 2 -- shared/src/commands/types/step.ts | 2 -- shared/src/commands/types/ternary-action.ts | 2 -- shared/src/commands/types/update-objects.ts | 2 -- shared/src/main.ts | 1 + shared/src/objects/game-object.ts | 6 +++++- shared/src/objects/types/character-base.ts | 3 --- shared/src/objects/types/lamp-base.ts | 2 -- shared/src/objects/types/tunnel-base.ts | 3 --- shared/src/transport/identity-manager.ts | 8 -------- shared/src/transport/type-to-base-type.ts | 14 +++++++++++++ shared/src/transport/typed.ts | 20 +++++++++---------- 30 files changed, 52 insertions(+), 76 deletions(-) delete mode 100644 frontend/.vscode/settings.json delete mode 100644 shared/src/transport/identity-manager.ts create mode 100644 shared/src/transport/type-to-base-type.ts diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 940af91..882c26b 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ 3000, 8080 ], - "postCreateCommand": "npm install && npx lerna run initialize", + "postCreateCommand": "npm install && npx lerna run initialize" } \ No newline at end of file diff --git a/backend/src/objects/character-physical.ts b/backend/src/objects/character-physical.ts index 3c3204d..3bc0bd2 100644 --- a/backend/src/objects/character-physical.ts +++ b/backend/src/objects/character-physical.ts @@ -6,6 +6,7 @@ import { settings, CommandExecutors, MoveActionCommand, + typeToBaseType, } from 'shared'; import { ImmutableBoundingBox } from '../physics/bounding-boxes/immutable-bounding-box'; @@ -14,6 +15,7 @@ import { CirclePhysical } from './circle-physical'; import { Physical } from '../physics/physical'; import { PhysicalContainer } from '../physics/containers/physical-container'; +@typeToBaseType export class CharacterPhysical extends CharacterBase implements Physical { public readonly canCollide = true; public readonly isInverted = false; @@ -34,7 +36,7 @@ export class CharacterPhysical extends CharacterBase implements Physical { private static readonly leftFootOffset = vec2.fromValues(-20, -10); private static readonly rightFootOffset = vec2.fromValues(20, -10); - constructor(container: PhysicalContainer) { + constructor(private readonly container: PhysicalContainer) { super( id(), new CirclePhysical(vec2.clone(CharacterPhysical.headOffset), 50, null, container), @@ -159,6 +161,12 @@ export class CharacterPhysical extends CharacterBase implements Physical { );*/ } + public destroy() { + this.container.removeObject(this.head); + this.container.removeObject(this.leftFoot); + this.container.removeObject(this.rightFoot); + } + public toJSON(): any { const { type, id, head, leftFoot, rightFoot } = this; return [type, id, head, leftFoot, rightFoot]; diff --git a/backend/src/objects/lamp-physical.ts b/backend/src/objects/lamp-physical.ts index c9e2994..ebd8924 100644 --- a/backend/src/objects/lamp-physical.ts +++ b/backend/src/objects/lamp-physical.ts @@ -1,10 +1,11 @@ import { vec2, vec3 } from 'gl-matrix'; -import { LampBase, settings, id } from 'shared'; +import { LampBase, settings, id, typeToBaseType } from 'shared'; import { ImmutableBoundingBox } from '../physics/bounding-boxes/immutable-bounding-box'; import { Physical } from '../physics/physical'; +@typeToBaseType export class LampPhysical extends LampBase implements Physical { public readonly canCollide = false; public readonly isInverted = false; diff --git a/backend/src/objects/tunnel-physical.ts b/backend/src/objects/tunnel-physical.ts index b1e3400..a72c49a 100644 --- a/backend/src/objects/tunnel-physical.ts +++ b/backend/src/objects/tunnel-physical.ts @@ -1,9 +1,10 @@ import { vec2 } from 'gl-matrix'; -import { clamp01, mix, TunnelBase, id } from 'shared'; +import { clamp01, mix, TunnelBase, id, typeToBaseType } from 'shared'; import { ImmutableBoundingBox } from '../physics/bounding-boxes/immutable-bounding-box'; import { StaticPhysical } from '../physics/containers/static-physical-object'; +@typeToBaseType export class TunnelPhysical extends TunnelBase implements StaticPhysical { public readonly canCollide = true; public readonly isInverted = true; diff --git a/backend/src/physics/containers/bounding-box-list.ts b/backend/src/physics/containers/bounding-box-list.ts index d9a5cec..3e6c8f9 100644 --- a/backend/src/physics/containers/bounding-box-list.ts +++ b/backend/src/physics/containers/bounding-box-list.ts @@ -2,7 +2,7 @@ import { Physical } from '../physical'; import { BoundingBoxBase } from '../bounding-boxes/bounding-box-base'; export class BoundingBoxList { - constructor(private objects: Array = []) {} + constructor(private objects: Array = []) { } public insert(object: Physical) { this.objects.push(object); diff --git a/backend/src/players/player.ts b/backend/src/players/player.ts index a9f5b49..2df28dc 100644 --- a/backend/src/players/player.ts +++ b/backend/src/players/player.ts @@ -35,7 +35,7 @@ export class Player extends CommandReceiver { }, }; - protected defaultCommandExecutor(command: Command) {} + protected defaultCommandExecutor(command: Command) { } constructor( private readonly objects: PhysicalContainer, @@ -118,6 +118,7 @@ export class Player extends CommandReceiver { public destroy() { this.isActive = false; + this.character.destroy(); this.objects.removeObject(this.character); } } diff --git a/frontend/.vscode/settings.json b/frontend/.vscode/settings.json deleted file mode 100644 index 20b972e..0000000 --- a/frontend/.vscode/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "typescript.tsdk": "node_modules\\typescript\\lib", - "editor.tabSize": 2, - "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "source.organizeImports": true - } -} diff --git a/frontend/src/scripts/commands/types/move-to.ts b/frontend/src/scripts/commands/types/move-to.ts index c062b4c..ed15ddb 100644 --- a/frontend/src/scripts/commands/types/move-to.ts +++ b/frontend/src/scripts/commands/types/move-to.ts @@ -2,8 +2,6 @@ import { vec2 } from 'gl-matrix'; import { Command } from 'shared'; export class MoveToCommand extends Command { - public static readonly type = 'MoveToCommand'; - public constructor(public readonly position: vec2) { super(); } diff --git a/frontend/src/scripts/commands/types/render.ts b/frontend/src/scripts/commands/types/render.ts index 027e111..54a7563 100644 --- a/frontend/src/scripts/commands/types/render.ts +++ b/frontend/src/scripts/commands/types/render.ts @@ -2,8 +2,6 @@ import { Renderer } from 'sdf-2d'; import { Command } from 'shared'; export class RenderCommand extends Command { - public static readonly type = 'RenderCommand'; - public constructor(public readonly renderer: Renderer) { super(); } diff --git a/frontend/src/scripts/transport/deserialize.ts b/frontend/src/scripts/transport/deserialize.ts index 5705673..cfe0f56 100644 --- a/frontend/src/scripts/transport/deserialize.ts +++ b/frontend/src/scripts/transport/deserialize.ts @@ -22,7 +22,7 @@ export const deserialize = (json: string): GameObject => { }; export const deserializeJsonArray = (json: string): Array => { - return (JSON.parse(json) as Array).map( - ([type, ...values]) => new constructors[type](...values) - ); + return (JSON.parse(json) as Array).map(([type, ...values]) => { + return new constructors[type](...values); + }); }; diff --git a/shared/src/commands/command-receiver.ts b/shared/src/commands/command-receiver.ts index 139dcfd..7aa255b 100644 --- a/shared/src/commands/command-receiver.ts +++ b/shared/src/commands/command-receiver.ts @@ -7,7 +7,7 @@ export type CommandExecutors = { export abstract class CommandReceiver { protected commandExecutors: CommandExecutors = {}; - protected defaultCommandExecutor(command: Command) {} + protected defaultCommandExecutor(command: Command) { } public reactsToCommand(commandType: string): boolean { return Object.prototype.hasOwnProperty.call(this.commandExecutors, commandType); diff --git a/shared/src/commands/command.ts b/shared/src/commands/command.ts index b835dd5..9beb114 100644 --- a/shared/src/commands/command.ts +++ b/shared/src/commands/command.ts @@ -1,7 +1,3 @@ -import { Id } from '../transport/identity'; +import { Typed } from '../transport/typed'; -export abstract class Command { - public get type(): string { - return (this as any).constructor.type; - } -} +export abstract class Command extends Typed { } diff --git a/shared/src/commands/types/create-objects.ts b/shared/src/commands/types/create-objects.ts index 7d4aa59..80f3267 100644 --- a/shared/src/commands/types/create-objects.ts +++ b/shared/src/commands/types/create-objects.ts @@ -1,8 +1,6 @@ import { Command } from '../command'; export class CreateObjectsCommand extends Command { - public static readonly type = 'CreateObjectsCommand'; - public constructor(public readonly serializedObjects: string) { super(); } diff --git a/shared/src/commands/types/create-player.ts b/shared/src/commands/types/create-player.ts index 6dce44e..7778edd 100644 --- a/shared/src/commands/types/create-player.ts +++ b/shared/src/commands/types/create-player.ts @@ -1,8 +1,6 @@ import { Command } from '../command'; export class CreatePlayerCommand extends Command { - public static readonly type = 'CreatePlayerCommand'; - public constructor(public readonly serializedPlayer: string) { super(); } diff --git a/shared/src/commands/types/delete-objects.ts b/shared/src/commands/types/delete-objects.ts index 8d140f0..2999916 100644 --- a/shared/src/commands/types/delete-objects.ts +++ b/shared/src/commands/types/delete-objects.ts @@ -2,8 +2,6 @@ import { Id } from '../../transport/identity'; import { Command } from '../command'; export class DeleteObjectsCommand extends Command { - public static readonly type = 'DeleteObjectsCommand'; - public constructor(public readonly ids: Array) { super(); } diff --git a/shared/src/commands/types/move-action.ts b/shared/src/commands/types/move-action.ts index cde42ea..131a6d9 100644 --- a/shared/src/commands/types/move-action.ts +++ b/shared/src/commands/types/move-action.ts @@ -2,8 +2,6 @@ import { vec2 } from 'gl-matrix'; import { Command } from '../command'; export class MoveActionCommand extends Command { - public static readonly type = 'MoveActionCommand'; - public constructor(public readonly delta: vec2) { super(); } diff --git a/shared/src/commands/types/primary-action.ts b/shared/src/commands/types/primary-action.ts index b57ddef..8b322b6 100644 --- a/shared/src/commands/types/primary-action.ts +++ b/shared/src/commands/types/primary-action.ts @@ -2,8 +2,6 @@ import { vec2 } from 'gl-matrix'; import { Command } from '../command'; export class PrimaryActionCommand extends Command { - public static readonly type = 'PrimaryActionCommand'; - public constructor(public readonly position: vec2) { super(); } diff --git a/shared/src/commands/types/secondary-action.ts b/shared/src/commands/types/secondary-action.ts index d7bb9e4..d16c347 100644 --- a/shared/src/commands/types/secondary-action.ts +++ b/shared/src/commands/types/secondary-action.ts @@ -2,8 +2,6 @@ import { vec2 } from 'gl-matrix'; import { Command } from '../command'; export class SecondaryActionCommand extends Command { - public static readonly type = 'SecondaryActionCommand'; - public constructor(public readonly position: vec2) { super(); } diff --git a/shared/src/commands/types/set-view-area-action.ts b/shared/src/commands/types/set-view-area-action.ts index 03ccc11..3ab9061 100644 --- a/shared/src/commands/types/set-view-area-action.ts +++ b/shared/src/commands/types/set-view-area-action.ts @@ -2,8 +2,6 @@ import { Rectangle } from '../../helper/rectangle'; import { Command } from '../command'; export class SetViewAreaActionCommand extends Command { - public static readonly type = 'SetViewAreaAction'; - public constructor(public readonly viewArea: Rectangle) { super(); } diff --git a/shared/src/commands/types/step.ts b/shared/src/commands/types/step.ts index ba62a0e..fd32dda 100644 --- a/shared/src/commands/types/step.ts +++ b/shared/src/commands/types/step.ts @@ -1,8 +1,6 @@ import { Command } from '../command'; export class StepCommand extends Command { - public static readonly type = 'StepCommand'; - public constructor(public readonly deltaTimeInMiliseconds: DOMHighResTimeStamp) { super(); } diff --git a/shared/src/commands/types/ternary-action.ts b/shared/src/commands/types/ternary-action.ts index 9cd2d69..041387d 100644 --- a/shared/src/commands/types/ternary-action.ts +++ b/shared/src/commands/types/ternary-action.ts @@ -2,8 +2,6 @@ import { vec2 } from 'gl-matrix'; import { Command } from '../command'; export class TernaryActionCommand extends Command { - public static readonly type = 'TernaryActionCommand'; - public constructor(public readonly position: vec2) { super(); } diff --git a/shared/src/commands/types/update-objects.ts b/shared/src/commands/types/update-objects.ts index 31beece..32732dc 100644 --- a/shared/src/commands/types/update-objects.ts +++ b/shared/src/commands/types/update-objects.ts @@ -1,8 +1,6 @@ import { Command } from '../command'; export class UpdateObjectsCommand extends Command { - public static readonly type = 'UpdateObjectsCommand'; - public constructor(public readonly serializedObjects: string) { super(); } diff --git a/shared/src/main.ts b/shared/src/main.ts index 4480f84..b9e9a54 100644 --- a/shared/src/main.ts +++ b/shared/src/main.ts @@ -29,3 +29,4 @@ export * from './objects/types/tunnel-base'; export * from './settings'; export * from './transport/transport-events'; export * from './transport/identity'; +export * from './transport/type-to-base-type'; diff --git a/shared/src/objects/game-object.ts b/shared/src/objects/game-object.ts index 468907a..347fed2 100644 --- a/shared/src/objects/game-object.ts +++ b/shared/src/objects/game-object.ts @@ -2,8 +2,12 @@ import { CommandReceiver } from '../commands/command-receiver'; import { Id } from '../transport/identity'; export abstract class GameObject extends CommandReceiver { + public static get type(): string { + return (this as any).name; + } + public get type(): string { - return (this as any).constructor.type; + return (this as any).constructor.name; } constructor(public readonly id: Id) { diff --git a/shared/src/objects/types/character-base.ts b/shared/src/objects/types/character-base.ts index 88a2ed7..5be52c6 100644 --- a/shared/src/objects/types/character-base.ts +++ b/shared/src/objects/types/character-base.ts @@ -1,11 +1,8 @@ -import { vec2 } from 'gl-matrix'; import { Circle } from '../../helper/circle'; import { Id } from '../../main'; import { GameObject } from '../game-object'; export abstract class CharacterBase extends GameObject { - public static readonly type = 'Character'; - constructor( id: Id, public head: Circle, diff --git a/shared/src/objects/types/lamp-base.ts b/shared/src/objects/types/lamp-base.ts index 1552478..f4d3e71 100644 --- a/shared/src/objects/types/lamp-base.ts +++ b/shared/src/objects/types/lamp-base.ts @@ -3,8 +3,6 @@ import { Id } from '../../main'; import { GameObject } from '../game-object'; export abstract class LampBase extends GameObject { - public static readonly type = 'Lamp'; - constructor(id: Id, public center: vec2, public color: vec3, public lightness: number) { super(id); } diff --git a/shared/src/objects/types/tunnel-base.ts b/shared/src/objects/types/tunnel-base.ts index f227d83..53d30ca 100644 --- a/shared/src/objects/types/tunnel-base.ts +++ b/shared/src/objects/types/tunnel-base.ts @@ -1,10 +1,7 @@ import { vec2 } from 'gl-matrix'; import { GameObject, Id } from '../../main'; -import { typed } from '../../transport/typed'; export abstract class TunnelBase extends GameObject { - public static readonly type = 'Tunnel'; - constructor( id: Id, public readonly from: vec2, diff --git a/shared/src/transport/identity-manager.ts b/shared/src/transport/identity-manager.ts deleted file mode 100644 index b743b9c..0000000 --- a/shared/src/transport/identity-manager.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { v4 } from 'uuid'; -import { Id } from './identity'; - -export class IdentityManager { - public static generateId(): Id { - return v4(); - } -} diff --git a/shared/src/transport/type-to-base-type.ts b/shared/src/transport/type-to-base-type.ts new file mode 100644 index 0000000..1cf8012 --- /dev/null +++ b/shared/src/transport/type-to-base-type.ts @@ -0,0 +1,14 @@ +export const typeToBaseType = ( + constructor: T +) => { + const parent = constructor; + return class extends constructor { + public static get type(): string { + return Object.getPrototypeOf((parent as any).prototype).constructor.name; + } + + public get type(): string { + return Object.getPrototypeOf((parent as any).prototype).constructor.name; + } + }; +}; diff --git a/shared/src/transport/typed.ts b/shared/src/transport/typed.ts index c2bdc7d..b9663ef 100644 --- a/shared/src/transport/typed.ts +++ b/shared/src/transport/typed.ts @@ -1,11 +1,9 @@ -/** - * static type: string must be implemented - * @param constructor - */ -export const typed = (constructor: T) => { - return class extends constructor { - public get type(): string { - return (this as any).constructor.type; - } - }; -}; +export abstract class Typed { + public static get type(): string { + return (this as any).name; + } + + public get type(): string { + return (this as any).constructor.name; + } +}