From 8bd86d0384775d497d23229e22d73b38d729cde9 Mon Sep 17 00:00:00 2001 From: evanpelle Date: Tue, 20 Aug 2024 08:11:41 -0700 Subject: [PATCH] trying to build protos --- TODO.txt | 7 +- generated/protos.d.ts | 219 +++++++++++ generated/protos.js | 532 +++++++++++++++++++++++++ package-lock.json | 613 ++++++++++++++++++++++++++++- package.json | 9 +- proto/Terrain.proto | 13 + src/core/TerrainMapLoader.ts | 3 + src/scripts/TerrainMapGenerator.js | 43 ++ src/scripts/TerrainMapGenerator.ts | 27 ++ tsconfig.json | 6 +- webpack.config.js | 5 +- 11 files changed, 1461 insertions(+), 16 deletions(-) create mode 100644 generated/protos.d.ts create mode 100644 generated/protos.js create mode 100644 proto/Terrain.proto create mode 100644 src/scripts/TerrainMapGenerator.js create mode 100644 src/scripts/TerrainMapGenerator.ts diff --git a/TODO.txt b/TODO.txt index 5ede03dda..debad45d2 100644 --- a/TODO.txt +++ b/TODO.txt @@ -34,11 +34,12 @@ * BUG: invert zoom DONE 8/19/2024 * better algorithm for name render placement DONE 8/19/2024 * show how many players in each lobby DONE 8/19/2024 -* make boats larger -* boats same color as owner +* make boats larger DONE 8/19/2024 +* boats same color as owner 8/19/2024 +* store map as proto * make coasts look better * have boats not get close to shore -* BUG: boat doesn't work if on lake on other player not on lake +* BUG: boat doesn't work if on lake if other player not on same lake * Allow boats to attack TerraNullius * add shader to dim border * remove player.info() diff --git a/generated/protos.d.ts b/generated/protos.d.ts new file mode 100644 index 000000000..22347400a --- /dev/null +++ b/generated/protos.d.ts @@ -0,0 +1,219 @@ +import * as $protobuf from "protobufjs"; +import Long = require("long"); +/** Properties of a TerrainMap. */ +export interface ITerrainMap { + + /** TerrainMap height */ + height?: (number|null); + + /** TerrainMap width */ + width?: (number|null); + + /** TerrainMap terrain */ + terrain?: (ITerrainTile[]|null); +} + +/** Represents a TerrainMap. */ +export class TerrainMap implements ITerrainMap { + + /** + * Constructs a new TerrainMap. + * @param [properties] Properties to set + */ + constructor(properties?: ITerrainMap); + + /** TerrainMap height. */ + public height: number; + + /** TerrainMap width. */ + public width: number; + + /** TerrainMap terrain. */ + public terrain: ITerrainTile[]; + + /** + * Creates a new TerrainMap instance using the specified properties. + * @param [properties] Properties to set + * @returns TerrainMap instance + */ + public static create(properties?: ITerrainMap): TerrainMap; + + /** + * Encodes the specified TerrainMap message. Does not implicitly {@link TerrainMap.verify|verify} messages. + * @param message TerrainMap message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: ITerrainMap, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified TerrainMap message, length delimited. Does not implicitly {@link TerrainMap.verify|verify} messages. + * @param message TerrainMap message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: ITerrainMap, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a TerrainMap message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns TerrainMap + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): TerrainMap; + + /** + * Decodes a TerrainMap message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns TerrainMap + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): TerrainMap; + + /** + * Verifies a TerrainMap message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a TerrainMap message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns TerrainMap + */ + public static fromObject(object: { [k: string]: any }): TerrainMap; + + /** + * Creates a plain object from a TerrainMap message. Also converts values to other types if specified. + * @param message TerrainMap + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: TerrainMap, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this TerrainMap to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for TerrainMap + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; +} + +/** Properties of a TerrainTile. */ +export interface ITerrainTile { + + /** TerrainTile name */ + name?: (string|null); + + /** TerrainTile age */ + age?: (number|null); + + /** TerrainTile email */ + email?: (string|null); +} + +/** Represents a TerrainTile. */ +export class TerrainTile implements ITerrainTile { + + /** + * Constructs a new TerrainTile. + * @param [properties] Properties to set + */ + constructor(properties?: ITerrainTile); + + /** TerrainTile name. */ + public name: string; + + /** TerrainTile age. */ + public age: number; + + /** TerrainTile email. */ + public email: string; + + /** + * Creates a new TerrainTile instance using the specified properties. + * @param [properties] Properties to set + * @returns TerrainTile instance + */ + public static create(properties?: ITerrainTile): TerrainTile; + + /** + * Encodes the specified TerrainTile message. Does not implicitly {@link TerrainTile.verify|verify} messages. + * @param message TerrainTile message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: ITerrainTile, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified TerrainTile message, length delimited. Does not implicitly {@link TerrainTile.verify|verify} messages. + * @param message TerrainTile message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: ITerrainTile, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a TerrainTile message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns TerrainTile + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): TerrainTile; + + /** + * Decodes a TerrainTile message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns TerrainTile + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): TerrainTile; + + /** + * Verifies a TerrainTile message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a TerrainTile message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns TerrainTile + */ + public static fromObject(object: { [k: string]: any }): TerrainTile; + + /** + * Creates a plain object from a TerrainTile message. Also converts values to other types if specified. + * @param message TerrainTile + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: TerrainTile, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this TerrainTile to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for TerrainTile + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; +} diff --git a/generated/protos.js b/generated/protos.js new file mode 100644 index 000000000..f24b7f72f --- /dev/null +++ b/generated/protos.js @@ -0,0 +1,532 @@ +/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/ +import * as $protobuf from "protobufjs/minimal"; + +// Common aliases +const $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util; + +// Exported root namespace +const $root = $protobuf.roots["default"] || ($protobuf.roots["default"] = {}); + +export const TerrainMap = $root.TerrainMap = (() => { + + /** + * Properties of a TerrainMap. + * @exports ITerrainMap + * @interface ITerrainMap + * @property {number|null} [height] TerrainMap height + * @property {number|null} [width] TerrainMap width + * @property {Array.|null} [terrain] TerrainMap terrain + */ + + /** + * Constructs a new TerrainMap. + * @exports TerrainMap + * @classdesc Represents a TerrainMap. + * @implements ITerrainMap + * @constructor + * @param {ITerrainMap=} [properties] Properties to set + */ + function TerrainMap(properties) { + this.terrain = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TerrainMap height. + * @member {number} height + * @memberof TerrainMap + * @instance + */ + TerrainMap.prototype.height = 0; + + /** + * TerrainMap width. + * @member {number} width + * @memberof TerrainMap + * @instance + */ + TerrainMap.prototype.width = 0; + + /** + * TerrainMap terrain. + * @member {Array.} terrain + * @memberof TerrainMap + * @instance + */ + TerrainMap.prototype.terrain = $util.emptyArray; + + /** + * Creates a new TerrainMap instance using the specified properties. + * @function create + * @memberof TerrainMap + * @static + * @param {ITerrainMap=} [properties] Properties to set + * @returns {TerrainMap} TerrainMap instance + */ + TerrainMap.create = function create(properties) { + return new TerrainMap(properties); + }; + + /** + * Encodes the specified TerrainMap message. Does not implicitly {@link TerrainMap.verify|verify} messages. + * @function encode + * @memberof TerrainMap + * @static + * @param {ITerrainMap} message TerrainMap message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TerrainMap.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.height != null && Object.hasOwnProperty.call(message, "height")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.height); + if (message.width != null && Object.hasOwnProperty.call(message, "width")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.width); + if (message.terrain != null && message.terrain.length) + for (let i = 0; i < message.terrain.length; ++i) + $root.TerrainTile.encode(message.terrain[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified TerrainMap message, length delimited. Does not implicitly {@link TerrainMap.verify|verify} messages. + * @function encodeDelimited + * @memberof TerrainMap + * @static + * @param {ITerrainMap} message TerrainMap message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TerrainMap.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TerrainMap message from the specified reader or buffer. + * @function decode + * @memberof TerrainMap + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {TerrainMap} TerrainMap + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TerrainMap.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.TerrainMap(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.height = reader.int32(); + break; + } + case 2: { + message.width = reader.int32(); + break; + } + case 3: { + if (!(message.terrain && message.terrain.length)) + message.terrain = []; + message.terrain.push($root.TerrainTile.decode(reader, reader.uint32())); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TerrainMap message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof TerrainMap + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {TerrainMap} TerrainMap + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TerrainMap.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TerrainMap message. + * @function verify + * @memberof TerrainMap + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TerrainMap.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.height != null && message.hasOwnProperty("height")) + if (!$util.isInteger(message.height)) + return "height: integer expected"; + if (message.width != null && message.hasOwnProperty("width")) + if (!$util.isInteger(message.width)) + return "width: integer expected"; + if (message.terrain != null && message.hasOwnProperty("terrain")) { + if (!Array.isArray(message.terrain)) + return "terrain: array expected"; + for (let i = 0; i < message.terrain.length; ++i) { + let error = $root.TerrainTile.verify(message.terrain[i]); + if (error) + return "terrain." + error; + } + } + return null; + }; + + /** + * Creates a TerrainMap message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof TerrainMap + * @static + * @param {Object.} object Plain object + * @returns {TerrainMap} TerrainMap + */ + TerrainMap.fromObject = function fromObject(object) { + if (object instanceof $root.TerrainMap) + return object; + let message = new $root.TerrainMap(); + if (object.height != null) + message.height = object.height | 0; + if (object.width != null) + message.width = object.width | 0; + if (object.terrain) { + if (!Array.isArray(object.terrain)) + throw TypeError(".TerrainMap.terrain: array expected"); + message.terrain = []; + for (let i = 0; i < object.terrain.length; ++i) { + if (typeof object.terrain[i] !== "object") + throw TypeError(".TerrainMap.terrain: object expected"); + message.terrain[i] = $root.TerrainTile.fromObject(object.terrain[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a TerrainMap message. Also converts values to other types if specified. + * @function toObject + * @memberof TerrainMap + * @static + * @param {TerrainMap} message TerrainMap + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + TerrainMap.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.terrain = []; + if (options.defaults) { + object.height = 0; + object.width = 0; + } + if (message.height != null && message.hasOwnProperty("height")) + object.height = message.height; + if (message.width != null && message.hasOwnProperty("width")) + object.width = message.width; + if (message.terrain && message.terrain.length) { + object.terrain = []; + for (let j = 0; j < message.terrain.length; ++j) + object.terrain[j] = $root.TerrainTile.toObject(message.terrain[j], options); + } + return object; + }; + + /** + * Converts this TerrainMap to JSON. + * @function toJSON + * @memberof TerrainMap + * @instance + * @returns {Object.} JSON object + */ + TerrainMap.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for TerrainMap + * @function getTypeUrl + * @memberof TerrainMap + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + TerrainMap.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/TerrainMap"; + }; + + return TerrainMap; +})(); + +export const TerrainTile = $root.TerrainTile = (() => { + + /** + * Properties of a TerrainTile. + * @exports ITerrainTile + * @interface ITerrainTile + * @property {string|null} [name] TerrainTile name + * @property {number|null} [age] TerrainTile age + * @property {string|null} [email] TerrainTile email + */ + + /** + * Constructs a new TerrainTile. + * @exports TerrainTile + * @classdesc Represents a TerrainTile. + * @implements ITerrainTile + * @constructor + * @param {ITerrainTile=} [properties] Properties to set + */ + function TerrainTile(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TerrainTile name. + * @member {string} name + * @memberof TerrainTile + * @instance + */ + TerrainTile.prototype.name = ""; + + /** + * TerrainTile age. + * @member {number} age + * @memberof TerrainTile + * @instance + */ + TerrainTile.prototype.age = 0; + + /** + * TerrainTile email. + * @member {string} email + * @memberof TerrainTile + * @instance + */ + TerrainTile.prototype.email = ""; + + /** + * Creates a new TerrainTile instance using the specified properties. + * @function create + * @memberof TerrainTile + * @static + * @param {ITerrainTile=} [properties] Properties to set + * @returns {TerrainTile} TerrainTile instance + */ + TerrainTile.create = function create(properties) { + return new TerrainTile(properties); + }; + + /** + * Encodes the specified TerrainTile message. Does not implicitly {@link TerrainTile.verify|verify} messages. + * @function encode + * @memberof TerrainTile + * @static + * @param {ITerrainTile} message TerrainTile message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TerrainTile.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); + if (message.age != null && Object.hasOwnProperty.call(message, "age")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.age); + if (message.email != null && Object.hasOwnProperty.call(message, "email")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.email); + return writer; + }; + + /** + * Encodes the specified TerrainTile message, length delimited. Does not implicitly {@link TerrainTile.verify|verify} messages. + * @function encodeDelimited + * @memberof TerrainTile + * @static + * @param {ITerrainTile} message TerrainTile message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TerrainTile.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TerrainTile message from the specified reader or buffer. + * @function decode + * @memberof TerrainTile + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {TerrainTile} TerrainTile + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TerrainTile.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.TerrainTile(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.name = reader.string(); + break; + } + case 2: { + message.age = reader.int32(); + break; + } + case 3: { + message.email = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TerrainTile message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof TerrainTile + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {TerrainTile} TerrainTile + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TerrainTile.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TerrainTile message. + * @function verify + * @memberof TerrainTile + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TerrainTile.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.age != null && message.hasOwnProperty("age")) + if (!$util.isInteger(message.age)) + return "age: integer expected"; + if (message.email != null && message.hasOwnProperty("email")) + if (!$util.isString(message.email)) + return "email: string expected"; + return null; + }; + + /** + * Creates a TerrainTile message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof TerrainTile + * @static + * @param {Object.} object Plain object + * @returns {TerrainTile} TerrainTile + */ + TerrainTile.fromObject = function fromObject(object) { + if (object instanceof $root.TerrainTile) + return object; + let message = new $root.TerrainTile(); + if (object.name != null) + message.name = String(object.name); + if (object.age != null) + message.age = object.age | 0; + if (object.email != null) + message.email = String(object.email); + return message; + }; + + /** + * Creates a plain object from a TerrainTile message. Also converts values to other types if specified. + * @function toObject + * @memberof TerrainTile + * @static + * @param {TerrainTile} message TerrainTile + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + TerrainTile.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.name = ""; + object.age = 0; + object.email = ""; + } + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.age != null && message.hasOwnProperty("age")) + object.age = message.age; + if (message.email != null && message.hasOwnProperty("email")) + object.email = message.email; + return object; + }; + + /** + * Converts this TerrainTile to JSON. + * @function toJSON + * @memberof TerrainTile + * @instance + * @returns {Object.} JSON object + */ + TerrainTile.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for TerrainTile + * @function getTypeUrl + * @memberof TerrainTile + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + TerrainTile.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/TerrainTile"; + }; + + return TerrainTile; +})(); + +export {$root as default}; diff --git a/package-lock.json b/package-lock.json index 8efb1a9e7..e019368ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "name": "warfront-client", "dependencies": { "@types/express": "^4.17.21", + "@types/google-protobuf": "^3.15.12", "@types/jimp": "^0.2.28", "colord": "^2.9.3", "crypto": "^1.0.1", @@ -15,6 +16,7 @@ "node-addon-api": "^8.1.0", "node-gyp": "^10.2.0", "priority-queue-typescript": "^1.0.1", + "protobufjs": "^7.3.2", "typia": "^6.5.2", "ws": "^8.18.0", "zod": "^3.23.8" @@ -26,6 +28,7 @@ "@types/chai": "^4.3.17", "@types/jest": "^29.5.12", "@types/mocha": "^10.0.7", + "@types/node": "^22.4.1", "@types/sinon": "^17.0.3", "@types/ws": "^8.5.11", "babel-jest": "^29.7.0", @@ -46,6 +49,7 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", + "tsx": "^4.17.0", "typescript": "^5.5.4", "webpack": "^5.91.0", "webpack-cli": "^5.1.4", @@ -2161,6 +2165,414 @@ "node": ">=10.0.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -3249,6 +3661,70 @@ "node": ">=14" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, "node_modules/@samchon/openapi": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@samchon/openapi/-/openapi-0.4.2.tgz", @@ -3469,6 +3945,12 @@ "@types/send": "*" } }, + "node_modules/@types/google-protobuf": { + "version": "3.15.12", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.12.tgz", + "integrity": "sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==", + "license": "MIT" + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -3571,11 +4053,12 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.5.tgz", - "integrity": "sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==", + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.4.1.tgz", + "integrity": "sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==", + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/node-forge": { @@ -5740,6 +6223,46 @@ "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", "dev": true }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -6305,6 +6828,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/gifwrap": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.10.1.tgz", @@ -8372,6 +8908,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "license": "Apache-2.0" + }, "node_modules/loupe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", @@ -9829,6 +10371,30 @@ "node": ">= 6" } }, + "node_modules/protobufjs": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", + "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -10151,6 +10717,16 @@ "node": ">=8" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -11427,6 +12003,7 @@ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -11484,6 +12061,26 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/tsx": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.17.0.tgz", + "integrity": "sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -11520,6 +12117,7 @@ "version": "5.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11555,9 +12153,10 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", diff --git a/package.json b/package.json index d9ebccfa9..bb7418631 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,8 @@ { "name": "warfront-client", "scripts": { - "prebuild": "tsc --project scripts", + "build-world-terrain-map": "GAME_ENV=prod node --loader ts-node/esm --experimental-specifier-resolution=node src/scripts/TerrainMapGenerator.ts", + "generate-proto": "npx pbjs -t static-module -w es6 -o generated/protos.js proto/**/*.proto && npx pbts -o generated/protos.d.ts generated/protos.js", "build-dev": "webpack --config webpack.config.js --mode development", "build-prod": "webpack --config webpack.config.js --mode production", "start:client": "webpack serve --open --node-env development", @@ -17,6 +18,7 @@ "@types/chai": "^4.3.17", "@types/jest": "^29.5.12", "@types/mocha": "^10.0.7", + "@types/node": "^22.4.1", "@types/sinon": "^17.0.3", "@types/ws": "^8.5.11", "babel-jest": "^29.7.0", @@ -37,6 +39,7 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", + "tsx": "^4.17.0", "typescript": "^5.5.4", "webpack": "^5.91.0", "webpack-cli": "^5.1.4", @@ -44,6 +47,7 @@ }, "dependencies": { "@types/express": "^4.17.21", + "@types/google-protobuf": "^3.15.12", "@types/jimp": "^0.2.28", "colord": "^2.9.3", "crypto": "^1.0.1", @@ -52,9 +56,10 @@ "node-addon-api": "^8.1.0", "node-gyp": "^10.2.0", "priority-queue-typescript": "^1.0.1", + "protobufjs": "^7.3.2", "typia": "^6.5.2", "ws": "^8.18.0", "zod": "^3.23.8" }, "type": "module" -} +} \ No newline at end of file diff --git a/proto/Terrain.proto b/proto/Terrain.proto new file mode 100644 index 000000000..7c790728b --- /dev/null +++ b/proto/Terrain.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +message TerrainMap { + int32 height = 1; + int32 width = 2; + repeated TerrainTile terrain = 3; +} + +message TerrainTile { + string name = 1; + int32 age = 2; + string email = 3; +} \ No newline at end of file diff --git a/src/core/TerrainMapLoader.ts b/src/core/TerrainMapLoader.ts index 543c2c086..729c00264 100644 --- a/src/core/TerrainMapLoader.ts +++ b/src/core/TerrainMapLoader.ts @@ -2,6 +2,8 @@ import {Jimp as JimpType, JimpConstructors} from '@jimp/core'; import 'jimp'; import {TerrainMap, TerrainType, TerrainTypes} from './Game'; import {TerrainMapImpl} from './GameImpl'; +import {TerrainTile} from '../../generated/protos'; + declare const Jimp: JimpType & JimpConstructors; @@ -14,6 +16,7 @@ export async function loadTerrainMap(): Promise { const terrain: TerrainType[][] = Array(width).fill(null).map(() => Array(height).fill(TerrainTypes.Water)); image.scan(0, 0, width, height, function (x: number, y: number, idx: number) { + const t: TerrainTile = new TerrainTile() const red = this.bitmap.data[idx + 0]; if (red > 100) { diff --git a/src/scripts/TerrainMapGenerator.js b/src/scripts/TerrainMapGenerator.js new file mode 100644 index 000000000..22bf449bf --- /dev/null +++ b/src/scripts/TerrainMapGenerator.js @@ -0,0 +1,43 @@ +import Jimp from 'jimp'; +import * as $protobuf from 'protobufjs/minimal.js'; +// import {TerrainTile} from '../generated/protos'; + +async function generateTerrainMap(imagePath, outputDir) { + const terrain = new TerrainTile() + try { + // const imageModule = await import(imagePath); + // const imageUrl = imageModule.default; + // const image = await Jimp.read(imageUrl); + // const {width, height} = image.bitmap; + + // const map = new TerrainMap(); + // map.TerrainTile + + // image.scan(0, 0, width, height, function (x, y, idx) { + // const terrain = new TerrainTile(); + // const red = this.bitmap.data[idx + 0]; + + // if (red > 100) { + // // terrain[x][y] = TerrainTypes.Land; + // } + // }); + + // return new TerrainMapImpl(terrain); + console.log('Terrain map generated successfully'); + } catch (error) { + console.error('Error generating terrain map:', error); + } +} + +// Usage +const imagePath = process.argv[2]; +const outputDir = process.argv[3] || 'generated'; + +if (!imagePath) { + console.error('Usage: node TerrainMapGenerator.js [outputDir]'); + process.exit(1); +} + +generateTerrainMap(imagePath, outputDir).catch(console.error); + +export {generateTerrainMap}; \ No newline at end of file diff --git a/src/scripts/TerrainMapGenerator.ts b/src/scripts/TerrainMapGenerator.ts new file mode 100644 index 000000000..778439e73 --- /dev/null +++ b/src/scripts/TerrainMapGenerator.ts @@ -0,0 +1,27 @@ +import {Jimp as JimpType, JimpConstructors} from '@jimp/core'; +import 'jimp'; +import {TerrainMap, TerrainTile} from '../../generated/protos'; + + +declare const Jimp: JimpType & JimpConstructors; + +export async function loadTerrainMap(): Promise { + const imageModule = await import(`../../resources/maps/World.png`); + const imageUrl = imageModule.default; + const image = await Jimp.read(imageUrl) + const {width, height} = image.bitmap; + + + image.scan(0, 0, width, height, function (x: number, y: number, idx: number) { + const t: TerrainTile = new TerrainTile() + const red = this.bitmap.data[idx + 0]; + + if (red > 100) { + } + }) + + return new TerrainMap() + +} + +// loadTerrainMap() \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 8411451d5..b340c5af2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,9 +11,9 @@ "include": [ "src/**/*", "resources/**/*", - "src/**/*.ts", - "src/**/*.css", - "test/core/GameImpl.test.ts" + "generated/**/*", + "test/core/GameImpl.test.ts", + "src/scripts" ], "exclude": [ "node_modules" diff --git a/webpack.config.js b/webpack.config.js index fcddb7149..5a116322a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -53,7 +53,10 @@ export default (env, argv) => { ], }, resolve: { - extensions: ['.ts', '.js'], + extensions: ['.tsx', '.ts', '.js'], + alias: { + 'protobufjs/minimal': path.resolve(__dirname, 'node_modules/protobufjs/minimal.js') + } }, plugins: [ new HtmlWebpackPlugin({