1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2025-12-14 02:31:51 +00:00

Support for string building ids for mods

This commit is contained in:
tobspr 2022-01-14 06:14:37 +01:00
parent 7e2501ea6e
commit 8777e4c6ea
4 changed files with 70 additions and 10 deletions

View File

@ -19,7 +19,7 @@ import { Vector } from "../core/vector";
/** /**
* Stores a lookup table for all building variants (for better performance) * Stores a lookup table for all building variants (for better performance)
* @type {Object<number, BuildingVariantIdentifier>} * @type {Object<number|string, BuildingVariantIdentifier>}
*/ */
export const gBuildingVariants = { export const gBuildingVariants = {
// Set later // Set later
@ -27,13 +27,13 @@ export const gBuildingVariants = {
/** /**
* Mapping from 'metaBuildingId/variant/rotationVariant' to building code * Mapping from 'metaBuildingId/variant/rotationVariant' to building code
* @type {Map<string, number>} * @type {Map<string, number|string>}
*/ */
const variantsCache = new Map(); const variantsCache = new Map();
/** /**
* Registers a new variant * Registers a new variant
* @param {number} code * @param {number|string} code
* @param {typeof MetaBuilding} meta * @param {typeof MetaBuilding} meta
* @param {string} variant * @param {string} variant
* @param {number} rotationVariant * @param {number} rotationVariant
@ -54,9 +54,20 @@ export function registerBuildingVariant(
}; };
} }
/**
* Hashes the combination of buildng, variant and rotation variant
* @param {string} buildingId
* @param {string} variant
* @param {number} rotationVariant
* @returns
*/
function generateBuildingHash(buildingId, variant, rotationVariant) {
return buildingId + "/" + variant + "/" + rotationVariant;
}
/** /**
* *
* @param {number} code * @param {string|number} code
* @returns {BuildingVariantIdentifier} * @returns {BuildingVariantIdentifier}
*/ */
export function getBuildingDataFromCode(code) { export function getBuildingDataFromCode(code) {
@ -70,8 +81,8 @@ export function getBuildingDataFromCode(code) {
export function buildBuildingCodeCache() { export function buildBuildingCodeCache() {
for (const code in gBuildingVariants) { for (const code in gBuildingVariants) {
const data = gBuildingVariants[code]; const data = gBuildingVariants[code];
const hash = data.metaInstance.getId() + "/" + data.variant + "/" + data.rotationVariant; const hash = generateBuildingHash(data.metaInstance.getId(), data.variant, data.rotationVariant);
variantsCache.set(hash, +code); variantsCache.set(hash, isNaN(+code) ? code : +code);
} }
} }
@ -80,10 +91,10 @@ export function buildBuildingCodeCache() {
* @param {MetaBuilding} metaBuilding * @param {MetaBuilding} metaBuilding
* @param {string} variant * @param {string} variant
* @param {number} rotationVariant * @param {number} rotationVariant
* @returns {number} * @returns {number|string}
*/ */
export function getCodeFromBuildingData(metaBuilding, variant, rotationVariant) { export function getCodeFromBuildingData(metaBuilding, variant, rotationVariant) {
const hash = metaBuilding.getId() + "/" + variant + "/" + rotationVariant; const hash = generateBuildingHash(metaBuilding.getId(), variant, rotationVariant);
const result = variantsCache.get(hash); const result = variantsCache.get(hash);
if (G_IS_DEV) { if (G_IS_DEV) {
if (!result) { if (!result) {

View File

@ -19,7 +19,7 @@ export class StaticMapEntityComponent extends Component {
originalRotation: types.float, originalRotation: types.float,
// See building_codes.js // See building_codes.js
code: types.uint, code: types.uintOrString,
}; };
} }
@ -99,7 +99,7 @@ export class StaticMapEntityComponent extends Component {
* @param {Vector=} param0.tileSize Size of the entity in tiles * @param {Vector=} param0.tileSize Size of the entity in tiles
* @param {number=} param0.rotation Rotation in degrees. Must be multiple of 90 * @param {number=} param0.rotation Rotation in degrees. Must be multiple of 90
* @param {number=} param0.originalRotation Original Rotation in degrees. Must be multiple of 90 * @param {number=} param0.originalRotation Original Rotation in degrees. Must be multiple of 90
* @param {number=} param0.code Building code * @param {number|string=} param0.code Building code
*/ */
constructor({ constructor({
origin = new Vector(), origin = new Vector(),

View File

@ -22,6 +22,7 @@ import {
TypeString, TypeString,
TypeStructuredObject, TypeStructuredObject,
TypeVector, TypeVector,
TypePositiveIntegerOrString,
} from "./serialization_data_types"; } from "./serialization_data_types";
const logger = createLogger("serialization"); const logger = createLogger("serialization");
@ -38,6 +39,7 @@ export const types = {
vector: new TypeVector(), vector: new TypeVector(),
tileVector: new TypeVector(), tileVector: new TypeVector(),
bool: new TypeBoolean(), bool: new TypeBoolean(),
uintOrString: new TypePositiveIntegerOrString(),
/** /**
* @param {BaseDataType} wrapped * @param {BaseDataType} wrapped

View File

@ -213,6 +213,53 @@ export class TypePositiveInteger extends BaseDataType {
} }
} }
export class TypePositiveIntegerOrString extends BaseDataType {
serialize(value) {
if (Number.isInteger(value)) {
assert(value >= 0, "type integer got negative value: " + value);
} else if (typeof value === "string") {
// all good
} else {
assertAlways(false, "Type integer|string got non integer or string for serialize: " + value);
}
return value;
}
/**
* @see BaseDataType.deserialize
* @param {any} value
* @param {GameRoot} root
* @param {object} targetObject
* @param {string|number} targetKey
* @returns {string|void} String error code or null on success
*/
deserialize(value, targetObject, targetKey, root) {
targetObject[targetKey] = value;
}
getAsJsonSchemaUncached() {
return {
oneOf: [{ type: "integer", minimum: 0 }, { type: "string" }],
};
}
verifySerializedValue(value) {
if (Number.isInteger(value)) {
if (value < 0) {
return "Negative value for positive integer";
}
} else if (typeof value === "string") {
// all good
} else {
return "Not a valid number or string: " + value;
}
}
getCacheKey() {
return "uint_str";
}
}
export class TypeBoolean extends BaseDataType { export class TypeBoolean extends BaseDataType {
serialize(value) { serialize(value) {
assert(value === true || value === false, "Type bool got non bool for serialize: " + value); assert(value === true || value === false, "Type bool got non bool for serialize: " + value);