mirror of
https://github.com/tobspr/shapez.io.git
synced 2024-10-27 20:34:29 +00:00
Properly process belt dependencies and fix items not travelling linear on belts
This commit is contained in:
parent
ca0e17f3dd
commit
260ba892c8
@ -23,7 +23,7 @@ export const globalConfig = {
|
|||||||
statisticsGraphSlices: 100,
|
statisticsGraphSlices: 100,
|
||||||
analyticsSliceDurationSeconds: 10,
|
analyticsSliceDurationSeconds: 10,
|
||||||
|
|
||||||
minimumTickRate: 30,
|
minimumTickRate: 25,
|
||||||
maximumTickRate: 500,
|
maximumTickRate: 500,
|
||||||
|
|
||||||
// Map
|
// Map
|
||||||
@ -71,7 +71,7 @@ export const globalConfig = {
|
|||||||
|
|
||||||
debug: {
|
debug: {
|
||||||
/* dev:start */
|
/* dev:start */
|
||||||
// fastGameEnter: true,
|
fastGameEnter: true,
|
||||||
noArtificialDelays: true,
|
noArtificialDelays: true,
|
||||||
// disableSavegameWrite: true,
|
// disableSavegameWrite: true,
|
||||||
showEntityBounds: false,
|
showEntityBounds: false,
|
||||||
@ -85,6 +85,7 @@ export const globalConfig = {
|
|||||||
allBuildingsUnlocked: true,
|
allBuildingsUnlocked: true,
|
||||||
upgradesNoCost: true,
|
upgradesNoCost: true,
|
||||||
disableUnlockDialog: true,
|
disableUnlockDialog: true,
|
||||||
|
// framePausesBetweenTicks: 40,
|
||||||
// testTranslations: true,
|
// testTranslations: true,
|
||||||
/* dev:end */
|
/* dev:end */
|
||||||
},
|
},
|
||||||
|
@ -60,7 +60,7 @@ export class BeltComponent extends Component {
|
|||||||
/**
|
/**
|
||||||
* Returns if the belt can currently accept an item from the given direction
|
* Returns if the belt can currently accept an item from the given direction
|
||||||
*/
|
*/
|
||||||
canAcceptNewItem() {
|
canAcceptNewItem(leftoverProgress = 0.0) {
|
||||||
const firstItem = this.sortedItems[0];
|
const firstItem = this.sortedItems[0];
|
||||||
if (!firstItem) {
|
if (!firstItem) {
|
||||||
return true;
|
return true;
|
||||||
@ -73,8 +73,19 @@ export class BeltComponent extends Component {
|
|||||||
* Pushes a new item to the belt
|
* Pushes a new item to the belt
|
||||||
* @param {BaseItem} item
|
* @param {BaseItem} item
|
||||||
*/
|
*/
|
||||||
takeNewItem(item) {
|
takeNewItem(item, leftoverProgress = 0.0) {
|
||||||
this.sortedItems.unshift([0, item]);
|
if (G_IS_DEV) {
|
||||||
|
assert(
|
||||||
|
this.sortedItems.length === 0 ||
|
||||||
|
leftoverProgress <= this.sortedItems[0][0] - globalConfig.itemSpacingOnBelts + 0.001,
|
||||||
|
"Invalid leftover: " +
|
||||||
|
leftoverProgress +
|
||||||
|
" items are " +
|
||||||
|
this.sortedItems.map(item => item[0])
|
||||||
|
);
|
||||||
|
assert(leftoverProgress < 1.0, "Invalid leftover: " + leftoverProgress);
|
||||||
|
}
|
||||||
|
this.sortedItems.unshift([leftoverProgress, item]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -14,15 +14,11 @@ export class DynamicTickrate {
|
|||||||
constructor(root) {
|
constructor(root) {
|
||||||
this.root = root;
|
this.root = root;
|
||||||
|
|
||||||
this.setTickRate(120);
|
|
||||||
|
|
||||||
this.currentTickStart = null;
|
this.currentTickStart = null;
|
||||||
this.capturedTicks = [];
|
this.capturedTicks = [];
|
||||||
this.averageTickDuration = 0;
|
this.averageTickDuration = 0;
|
||||||
|
|
||||||
// Exposed
|
this.setTickRate(60);
|
||||||
this.deltaSeconds = 0;
|
|
||||||
this.deltaMs = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,14 +36,14 @@ export class DynamicTickrate {
|
|||||||
* Increases the tick rate marginally
|
* Increases the tick rate marginally
|
||||||
*/
|
*/
|
||||||
increaseTickRate() {
|
increaseTickRate() {
|
||||||
this.setTickRate(Math_round(Math_min(globalConfig.maximumTickRate, this.currentTickRate * 1.1)));
|
this.setTickRate(Math_round(Math_min(globalConfig.maximumTickRate, this.currentTickRate * 1.2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decreases the tick rate marginally
|
* Decreases the tick rate marginally
|
||||||
*/
|
*/
|
||||||
decreaseTickRate() {
|
decreaseTickRate() {
|
||||||
this.setTickRate(Math_round(Math_min(globalConfig.maximumTickRate, this.currentTickRate * 0.9)));
|
this.setTickRate(Math_round(Math_max(globalConfig.minimumTickRate, this.currentTickRate * 0.8)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -57,7 +53,7 @@ export class DynamicTickrate {
|
|||||||
assert(this.currentTickStart === null, "BeginTick called twice");
|
assert(this.currentTickStart === null, "BeginTick called twice");
|
||||||
this.currentTickStart = performanceNow();
|
this.currentTickStart = performanceNow();
|
||||||
|
|
||||||
if (this.capturedTicks.length > this.currentTickRate * 4) {
|
if (this.capturedTicks.length > this.currentTickRate * 2) {
|
||||||
// Take only a portion of the ticks
|
// Take only a portion of the ticks
|
||||||
this.capturedTicks.sort();
|
this.capturedTicks.sort();
|
||||||
this.capturedTicks.splice(0, 10);
|
this.capturedTicks.splice(0, 10);
|
||||||
|
@ -12,9 +12,14 @@ import { gMetaBuildingRegistry } from "../../core/global_registries";
|
|||||||
import { MetaBeltBaseBuilding } from "../buildings/belt_base";
|
import { MetaBeltBaseBuilding } from "../buildings/belt_base";
|
||||||
import { defaultBuildingVariant } from "../meta_building";
|
import { defaultBuildingVariant } from "../meta_building";
|
||||||
import { GameRoot } from "../root";
|
import { GameRoot } from "../root";
|
||||||
|
import { createLogger } from "../../core/logging";
|
||||||
|
|
||||||
const BELT_ANIM_COUNT = 6;
|
const BELT_ANIM_COUNT = 6;
|
||||||
|
|
||||||
|
const logger = createLogger("belt");
|
||||||
|
|
||||||
|
/** @typedef {Array<{ entity: Entity, followUp: Entity }>} BeltCache */
|
||||||
|
|
||||||
export class BeltSystem extends GameSystemWithFilter {
|
export class BeltSystem extends GameSystemWithFilter {
|
||||||
constructor(root) {
|
constructor(root) {
|
||||||
super(root, [BeltComponent]);
|
super(root, [BeltComponent]);
|
||||||
@ -26,7 +31,7 @@ export class BeltSystem extends GameSystemWithFilter {
|
|||||||
[enumDirection.left]: Loader.getSprite("sprites/belt/left_0.png"),
|
[enumDirection.left]: Loader.getSprite("sprites/belt/left_0.png"),
|
||||||
[enumDirection.right]: Loader.getSprite("sprites/belt/right_0.png"),
|
[enumDirection.right]: Loader.getSprite("sprites/belt/right_0.png"),
|
||||||
};
|
};
|
||||||
/**
|
/**b
|
||||||
* @type {Object.<enumDirection, Array<AtlasSprite>>}
|
* @type {Object.<enumDirection, Array<AtlasSprite>>}
|
||||||
*/
|
*/
|
||||||
this.beltAnimations = {
|
this.beltAnimations = {
|
||||||
@ -58,6 +63,11 @@ export class BeltSystem extends GameSystemWithFilter {
|
|||||||
|
|
||||||
this.root.signals.entityAdded.add(this.updateSurroundingBeltPlacement, this);
|
this.root.signals.entityAdded.add(this.updateSurroundingBeltPlacement, this);
|
||||||
this.root.signals.entityDestroyed.add(this.updateSurroundingBeltPlacement, this);
|
this.root.signals.entityDestroyed.add(this.updateSurroundingBeltPlacement, this);
|
||||||
|
|
||||||
|
this.cacheNeedsUpdate = true;
|
||||||
|
|
||||||
|
/** @type {BeltCache} */
|
||||||
|
this.beltCache = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -74,6 +84,10 @@ export class BeltSystem extends GameSystemWithFilter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (entity.components.Belt) {
|
||||||
|
this.cacheNeedsUpdate = true;
|
||||||
|
}
|
||||||
|
|
||||||
const metaBelt = gMetaBuildingRegistry.findByClass(MetaBeltBaseBuilding);
|
const metaBelt = gMetaBuildingRegistry.findByClass(MetaBeltBaseBuilding);
|
||||||
|
|
||||||
// Compute affected area
|
// Compute affected area
|
||||||
@ -98,6 +112,7 @@ export class BeltSystem extends GameSystemWithFilter {
|
|||||||
);
|
);
|
||||||
targetStaticComp.rotation = rotation;
|
targetStaticComp.rotation = rotation;
|
||||||
metaBelt.updateVariants(targetEntity, rotationVariant, defaultBuildingVariant);
|
metaBelt.updateVariants(targetEntity, rotationVariant, defaultBuildingVariant);
|
||||||
|
this.cacheNeedsUpdate = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -110,97 +125,155 @@ export class BeltSystem extends GameSystemWithFilter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates a given entity
|
* Finds the follow up entity for a given belt. Used for building the dependencies
|
||||||
* @param {Entity} entity
|
* @param {Entity} entity
|
||||||
* @param {Set} processedEntities
|
|
||||||
*/
|
*/
|
||||||
updateBelt(entity, processedEntities) {
|
findFollowUpEntity(entity) {
|
||||||
if (processedEntities.has(entity.uid)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
processedEntities.add(entity.uid);
|
|
||||||
|
|
||||||
// Divide by item spacing on belts since we use throughput and not speed
|
|
||||||
const beltSpeed =
|
|
||||||
this.root.hubGoals.getBeltBaseSpeed() *
|
|
||||||
this.root.dynamicTickrate.deltaSeconds *
|
|
||||||
globalConfig.itemSpacingOnBelts;
|
|
||||||
const beltComp = entity.components.Belt;
|
|
||||||
const staticComp = entity.components.StaticMapEntity;
|
const staticComp = entity.components.StaticMapEntity;
|
||||||
const items = beltComp.sortedItems;
|
const beltComp = entity.components.Belt;
|
||||||
|
|
||||||
if (items.length === 0) {
|
const followUpDirection = staticComp.localDirectionToWorld(beltComp.direction);
|
||||||
// Fast out for performance
|
const followUpVector = enumDirectionToVector[followUpDirection];
|
||||||
|
|
||||||
|
const followUpTile = staticComp.origin.add(followUpVector);
|
||||||
|
const followUpEntity = this.root.map.getTileContent(followUpTile);
|
||||||
|
|
||||||
|
if (followUpEntity) {
|
||||||
|
const followUpBeltComp = followUpEntity.components.Belt;
|
||||||
|
if (followUpBeltComp) {
|
||||||
|
return followUpEntity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a single entity to the cache
|
||||||
|
* @param {Entity} entity
|
||||||
|
* @param {BeltCache} cache
|
||||||
|
* @param {Set} visited
|
||||||
|
*/
|
||||||
|
computeSingleBeltCache(entity, cache, visited) {
|
||||||
|
// Check for double visit
|
||||||
|
if (visited.has(entity.uid)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
visited.add(entity.uid);
|
||||||
|
|
||||||
const ejectorComp = entity.components.ItemEjector;
|
const followUp = this.findFollowUpEntity(entity);
|
||||||
let maxProgress = 1;
|
if (followUp) {
|
||||||
|
// Process followup first
|
||||||
// When ejecting, we can not go further than the item spacing since it
|
this.computeSingleBeltCache(followUp, cache, visited);
|
||||||
// will be on the corner
|
|
||||||
if (ejectorComp.isAnySlotEjecting()) {
|
|
||||||
maxProgress = 1 - globalConfig.itemSpacingOnBelts;
|
|
||||||
} else {
|
|
||||||
// Find follow up belt to make sure we don't clash items
|
|
||||||
const followUpDirection = staticComp.localDirectionToWorld(beltComp.direction);
|
|
||||||
const followUpVector = enumDirectionToVector[followUpDirection];
|
|
||||||
|
|
||||||
const followUpTile = staticComp.origin.add(followUpVector);
|
|
||||||
const followUpEntity = this.root.map.getTileContent(followUpTile);
|
|
||||||
|
|
||||||
if (followUpEntity) {
|
|
||||||
const followUpBeltComp = followUpEntity.components.Belt;
|
|
||||||
if (followUpBeltComp) {
|
|
||||||
// Update follow up belt first
|
|
||||||
this.updateBelt(followUpEntity, processedEntities);
|
|
||||||
|
|
||||||
const spacingOnBelt = followUpBeltComp.getDistanceToFirstItemCenter();
|
|
||||||
maxProgress = Math_min(1, 1 - globalConfig.itemSpacingOnBelts + spacingOnBelt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let speedMultiplier = 1;
|
cache.push({ entity, followUp });
|
||||||
if (beltComp.direction !== enumDirection.top) {
|
}
|
||||||
// Shaped belts are longer, thus being quicker
|
|
||||||
speedMultiplier = 1.41;
|
computeBeltCache() {
|
||||||
|
logger.log("Updating belt cache");
|
||||||
|
|
||||||
|
let cache = [];
|
||||||
|
let visited = new Set();
|
||||||
|
for (let i = 0; i < this.allEntities.length; ++i) {
|
||||||
|
this.computeSingleBeltCache(this.allEntities[i], cache, visited);
|
||||||
}
|
}
|
||||||
|
assert(
|
||||||
|
cache.length === this.allEntities.length,
|
||||||
|
"Belt cache mismatch: Has " + cache.length + " entries but should have " + this.allEntities.length
|
||||||
|
);
|
||||||
|
|
||||||
for (let itemIndex = items.length - 1; itemIndex >= 0; --itemIndex) {
|
this.beltCache = cache;
|
||||||
const itemAndProgress = items[itemIndex];
|
|
||||||
|
|
||||||
const newProgress = itemAndProgress[0] + speedMultiplier * beltSpeed;
|
|
||||||
if (newProgress >= 1.0) {
|
|
||||||
// Try to give this item to a new belt
|
|
||||||
const freeSlot = ejectorComp.getFirstFreeSlot();
|
|
||||||
|
|
||||||
if (freeSlot === null) {
|
|
||||||
// So, we don't have a free slot - damned!
|
|
||||||
itemAndProgress[0] = 1.0;
|
|
||||||
maxProgress = 1 - globalConfig.itemSpacingOnBelts;
|
|
||||||
} else {
|
|
||||||
// We got a free slot, remove this item and keep it on the ejector slot
|
|
||||||
if (!ejectorComp.tryEject(freeSlot, itemAndProgress[1])) {
|
|
||||||
assert(false, "Ejection failed");
|
|
||||||
}
|
|
||||||
items.splice(itemIndex, 1);
|
|
||||||
maxProgress = 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
itemAndProgress[0] = Math_min(newProgress, maxProgress);
|
|
||||||
maxProgress = itemAndProgress[0] - globalConfig.itemSpacingOnBelts;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
update() {
|
update() {
|
||||||
const processedEntities = new Set();
|
if (this.cacheNeedsUpdate) {
|
||||||
|
this.cacheNeedsUpdate = false;
|
||||||
|
this.computeBeltCache();
|
||||||
|
}
|
||||||
|
|
||||||
for (let i = 0; i < this.allEntities.length; ++i) {
|
for (let i = 0; i < this.beltCache.length; ++i) {
|
||||||
const entity = this.allEntities[i];
|
const { entity, followUp } = this.beltCache[i];
|
||||||
this.updateBelt(entity, processedEntities);
|
|
||||||
|
// Divide by item spacing on belts since we use throughput and not speed
|
||||||
|
const beltSpeed =
|
||||||
|
this.root.hubGoals.getBeltBaseSpeed() *
|
||||||
|
this.root.dynamicTickrate.deltaSeconds *
|
||||||
|
globalConfig.itemSpacingOnBelts;
|
||||||
|
const beltComp = entity.components.Belt;
|
||||||
|
const items = beltComp.sortedItems;
|
||||||
|
|
||||||
|
if (items.length === 0) {
|
||||||
|
// Fast out for performance
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ejectorComp = entity.components.ItemEjector;
|
||||||
|
let maxProgress = 1;
|
||||||
|
|
||||||
|
// When ejecting, we can not go further than the item spacing since it
|
||||||
|
// will be on the corner
|
||||||
|
if (ejectorComp.isAnySlotEjecting()) {
|
||||||
|
maxProgress = 1 - globalConfig.itemSpacingOnBelts;
|
||||||
|
} else {
|
||||||
|
// Otherwise our progress depends on the follow up
|
||||||
|
if (followUp) {
|
||||||
|
const spacingOnBelt = followUp.components.Belt.getDistanceToFirstItemCenter();
|
||||||
|
maxProgress = Math_min(2, 1 - globalConfig.itemSpacingOnBelts + spacingOnBelt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let speedMultiplier = 1;
|
||||||
|
if (beltComp.direction !== enumDirection.top) {
|
||||||
|
// Shaped belts are longer, thus being quicker
|
||||||
|
speedMultiplier = 1.41;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not really nice. haven't found the reason for this yet.
|
||||||
|
if (items.length > 2 / globalConfig.itemSpacingOnBelts) {
|
||||||
|
logger.error("Fixing broken belt:", entity, items);
|
||||||
|
beltComp.sortedItems = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let itemIndex = items.length - 1; itemIndex >= 0; --itemIndex) {
|
||||||
|
const progressAndItem = items[itemIndex];
|
||||||
|
|
||||||
|
progressAndItem[0] = Math_min(maxProgress, progressAndItem[0] + speedMultiplier * beltSpeed);
|
||||||
|
|
||||||
|
if (progressAndItem[0] >= 1.0) {
|
||||||
|
if (followUp) {
|
||||||
|
const followUpBelt = followUp.components.Belt;
|
||||||
|
if (followUpBelt.canAcceptNewItem()) {
|
||||||
|
followUpBelt.takeNewItem(progressAndItem[1], progressAndItem[0] - 1.0);
|
||||||
|
items.splice(itemIndex, 1);
|
||||||
|
} else {
|
||||||
|
// Well, we couldn't really take it to a follow up belt, keep it at
|
||||||
|
// max progress
|
||||||
|
progressAndItem[0] = 1.0;
|
||||||
|
maxProgress = 1 - globalConfig.itemSpacingOnBelts;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Try to give this item to a new belt
|
||||||
|
const freeSlot = ejectorComp.getFirstFreeSlot();
|
||||||
|
if (freeSlot === null) {
|
||||||
|
// So, we don't have a free slot - damned!
|
||||||
|
progressAndItem[0] = 1.0;
|
||||||
|
maxProgress = 1 - globalConfig.itemSpacingOnBelts;
|
||||||
|
} else {
|
||||||
|
// We got a free slot, remove this item and keep it on the ejector slot
|
||||||
|
if (!ejectorComp.tryEject(freeSlot, progressAndItem[1])) {
|
||||||
|
assert(false, "Ejection failed");
|
||||||
|
}
|
||||||
|
items.splice(itemIndex, 1);
|
||||||
|
// Do not override max progress at all
|
||||||
|
// maxProgress = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// We just moved this item forward, so determine the maximum progress of other items
|
||||||
|
maxProgress = progressAndItem[0] - globalConfig.itemSpacingOnBelts;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,7 +285,6 @@ export class BeltSystem extends GameSystemWithFilter {
|
|||||||
drawChunk(parameters, chunk) {
|
drawChunk(parameters, chunk) {
|
||||||
if (parameters.zoomLevel < globalConfig.mapChunkOverviewMinZoom) {
|
if (parameters.zoomLevel < globalConfig.mapChunkOverviewMinZoom) {
|
||||||
return;
|
return;
|
||||||
1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const speedMultiplier = this.root.hubGoals.getBeltBaseSpeed();
|
const speedMultiplier = this.root.hubGoals.getBeltBaseSpeed();
|
||||||
|
@ -112,10 +112,14 @@ export class GameTime extends BasicSerializableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check for too big pile of updates -> reduce it to 1
|
// Check for too big pile of updates -> reduce it to 1
|
||||||
const maxLogicSteps = Math_max(
|
let maxLogicSteps = Math_max(
|
||||||
3,
|
3,
|
||||||
(this.speed.getMaxLogicStepsInQueue() * this.root.dynamicTickrate.currentTickRate) / 60
|
(this.speed.getMaxLogicStepsInQueue() * this.root.dynamicTickrate.currentTickRate) / 60
|
||||||
);
|
);
|
||||||
|
if (G_IS_DEV && globalConfig.debug.framePausesBetweenTicks) {
|
||||||
|
maxLogicSteps *= 1 + globalConfig.debug.framePausesBetweenTicks;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.logicTimeBudget > this.root.dynamicTickrate.deltaMs * maxLogicSteps) {
|
if (this.logicTimeBudget > this.root.dynamicTickrate.deltaMs * maxLogicSteps) {
|
||||||
// logger.warn("Skipping logic time steps since more than", maxLogicSteps, "are in queue");
|
// logger.warn("Skipping logic time steps since more than", maxLogicSteps, "are in queue");
|
||||||
this.logicTimeBudget = this.root.dynamicTickrate.deltaMs * maxLogicSteps;
|
this.logicTimeBudget = this.root.dynamicTickrate.deltaMs * maxLogicSteps;
|
||||||
@ -132,9 +136,14 @@ export class GameTime extends BasicSerializableObject {
|
|||||||
|
|
||||||
const speedAtStart = this.root.time.getSpeed();
|
const speedAtStart = this.root.time.getSpeed();
|
||||||
|
|
||||||
|
let effectiveDelta = this.root.dynamicTickrate.deltaMs;
|
||||||
|
if (G_IS_DEV && globalConfig.debug.framePausesBetweenTicks) {
|
||||||
|
effectiveDelta += globalConfig.debug.framePausesBetweenTicks * this.root.dynamicTickrate.deltaMs;
|
||||||
|
}
|
||||||
|
|
||||||
// Update physics & logic
|
// Update physics & logic
|
||||||
while (this.logicTimeBudget >= this.root.dynamicTickrate.deltaMs) {
|
while (this.logicTimeBudget >= effectiveDelta) {
|
||||||
this.logicTimeBudget -= this.root.dynamicTickrate.deltaMs;
|
this.logicTimeBudget -= effectiveDelta;
|
||||||
|
|
||||||
if (!updateMethod()) {
|
if (!updateMethod()) {
|
||||||
// Gameover happened or so, do not update anymore
|
// Gameover happened or so, do not update anymore
|
||||||
|
@ -16,19 +16,19 @@ export const UPGRADES = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: "CpCpCpCp", amount: 15000 }],
|
required: [{ shape: "CpCpCpCp", amount: 15000 }],
|
||||||
improvement: 4,
|
improvement: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: "SrSrSrSr:CyCyCyCy", amount: 40000 }],
|
required: [{ shape: "SrSrSrSr:CyCyCyCy", amount: 40000 }],
|
||||||
improvement: 4,
|
improvement: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", amount: 40000 }],
|
required: [{ shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", amount: 40000 }],
|
||||||
improvement: 4,
|
improvement: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: finalGameShape, amount: 150000 }],
|
required: [{ shape: finalGameShape, amount: 150000 }],
|
||||||
improvement: 4,
|
improvement: 5,
|
||||||
excludePrevious: true,
|
excludePrevious: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -46,19 +46,19 @@ export const UPGRADES = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: "ScScScSc", amount: 20000 }],
|
required: [{ shape: "ScScScSc", amount: 20000 }],
|
||||||
improvement: 4,
|
improvement: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: "CwCwCwCw:WbWbWbWb", amount: 40000 }],
|
required: [{ shape: "CwCwCwCw:WbWbWbWb", amount: 40000 }],
|
||||||
improvement: 4,
|
improvement: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", amount: 40000 }],
|
required: [{ shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", amount: 40000 }],
|
||||||
improvement: 4,
|
improvement: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: finalGameShape, amount: 150000 }],
|
required: [{ shape: finalGameShape, amount: 150000 }],
|
||||||
improvement: 4,
|
improvement: 5,
|
||||||
excludePrevious: true,
|
excludePrevious: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -76,19 +76,19 @@ export const UPGRADES = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: "CgScScCg", amount: 25000 }],
|
required: [{ shape: "CgScScCg", amount: 25000 }],
|
||||||
improvement: 4,
|
improvement: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: "CwCrCwCr:SgSgSgSg", amount: 40000 }],
|
required: [{ shape: "CwCrCwCr:SgSgSgSg", amount: 40000 }],
|
||||||
improvement: 4,
|
improvement: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", amount: 40000 }],
|
required: [{ shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", amount: 40000 }],
|
||||||
improvement: 4,
|
improvement: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: finalGameShape, amount: 150000 }],
|
required: [{ shape: finalGameShape, amount: 150000 }],
|
||||||
improvement: 4,
|
improvement: 5,
|
||||||
excludePrevious: true,
|
excludePrevious: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -106,19 +106,19 @@ export const UPGRADES = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: "RpRpRpRp:CwCwCwCw", amount: 30000 }],
|
required: [{ shape: "RpRpRpRp:CwCwCwCw", amount: 30000 }],
|
||||||
improvement: 4,
|
improvement: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp", amount: 40000 }],
|
required: [{ shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp", amount: 40000 }],
|
||||||
improvement: 4,
|
improvement: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp:CwCwCwCw", amount: 40000 }],
|
required: [{ shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp:CwCwCwCw", amount: 40000 }],
|
||||||
improvement: 4,
|
improvement: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: finalGameShape, amount: 150000 }],
|
required: [{ shape: finalGameShape, amount: 150000 }],
|
||||||
improvement: 4,
|
improvement: 5,
|
||||||
excludePrevious: true,
|
excludePrevious: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
737
src/js/game_analytics.d.ts
vendored
737
src/js/game_analytics.d.ts
vendored
@ -1,737 +0,0 @@
|
|||||||
declare module gameanalytics {
|
|
||||||
enum EGAErrorSeverity {
|
|
||||||
Undefined = 0,
|
|
||||||
Debug = 1,
|
|
||||||
Info = 2,
|
|
||||||
Warning = 3,
|
|
||||||
Error = 4,
|
|
||||||
Critical = 5,
|
|
||||||
}
|
|
||||||
enum EGAProgressionStatus {
|
|
||||||
Undefined = 0,
|
|
||||||
Start = 1,
|
|
||||||
Complete = 2,
|
|
||||||
Fail = 3,
|
|
||||||
}
|
|
||||||
enum EGAResourceFlowType {
|
|
||||||
Undefined = 0,
|
|
||||||
Source = 1,
|
|
||||||
Sink = 2,
|
|
||||||
}
|
|
||||||
module http {
|
|
||||||
enum EGAHTTPApiResponse {
|
|
||||||
NoResponse = 0,
|
|
||||||
BadResponse = 1,
|
|
||||||
RequestTimeout = 2,
|
|
||||||
JsonEncodeFailed = 3,
|
|
||||||
JsonDecodeFailed = 4,
|
|
||||||
InternalServerError = 5,
|
|
||||||
BadRequest = 6,
|
|
||||||
Unauthorized = 7,
|
|
||||||
UnknownResponseCode = 8,
|
|
||||||
Ok = 9,
|
|
||||||
Created = 10,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
module events {
|
|
||||||
enum EGASdkErrorCategory {
|
|
||||||
Undefined = 0,
|
|
||||||
EventValidation = 1,
|
|
||||||
Database = 2,
|
|
||||||
Init = 3,
|
|
||||||
Http = 4,
|
|
||||||
Json = 5,
|
|
||||||
}
|
|
||||||
enum EGASdkErrorArea {
|
|
||||||
Undefined = 0,
|
|
||||||
BusinessEvent = 1,
|
|
||||||
ResourceEvent = 2,
|
|
||||||
ProgressionEvent = 3,
|
|
||||||
DesignEvent = 4,
|
|
||||||
ErrorEvent = 5,
|
|
||||||
InitHttp = 9,
|
|
||||||
EventsHttp = 10,
|
|
||||||
ProcessEvents = 11,
|
|
||||||
AddEventsToStore = 12,
|
|
||||||
}
|
|
||||||
enum EGASdkErrorAction {
|
|
||||||
Undefined = 0,
|
|
||||||
InvalidCurrency = 1,
|
|
||||||
InvalidShortString = 2,
|
|
||||||
InvalidEventPartLength = 3,
|
|
||||||
InvalidEventPartCharacters = 4,
|
|
||||||
InvalidStore = 5,
|
|
||||||
InvalidFlowType = 6,
|
|
||||||
StringEmptyOrNull = 7,
|
|
||||||
NotFoundInAvailableCurrencies = 8,
|
|
||||||
InvalidAmount = 9,
|
|
||||||
NotFoundInAvailableItemTypes = 10,
|
|
||||||
WrongProgressionOrder = 11,
|
|
||||||
InvalidEventIdLength = 12,
|
|
||||||
InvalidEventIdCharacters = 13,
|
|
||||||
InvalidProgressionStatus = 15,
|
|
||||||
InvalidSeverity = 16,
|
|
||||||
InvalidLongString = 17,
|
|
||||||
DatabaseTooLarge = 18,
|
|
||||||
DatabaseOpenOrCreate = 19,
|
|
||||||
JsonError = 25,
|
|
||||||
FailHttpJsonDecode = 29,
|
|
||||||
FailHttpJsonEncode = 30,
|
|
||||||
}
|
|
||||||
enum EGASdkErrorParameter {
|
|
||||||
Undefined = 0,
|
|
||||||
Currency = 1,
|
|
||||||
CartType = 2,
|
|
||||||
ItemType = 3,
|
|
||||||
ItemId = 4,
|
|
||||||
Store = 5,
|
|
||||||
FlowType = 6,
|
|
||||||
Amount = 7,
|
|
||||||
Progression01 = 8,
|
|
||||||
Progression02 = 9,
|
|
||||||
Progression03 = 10,
|
|
||||||
EventId = 11,
|
|
||||||
ProgressionStatus = 12,
|
|
||||||
Severity = 13,
|
|
||||||
Message = 14,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export declare var EGAErrorSeverity: typeof gameanalytics.EGAErrorSeverity;
|
|
||||||
export declare var EGAProgressionStatus: typeof gameanalytics.EGAProgressionStatus;
|
|
||||||
export declare var EGAResourceFlowType: typeof gameanalytics.EGAResourceFlowType;
|
|
||||||
declare module gameanalytics {
|
|
||||||
module logging {
|
|
||||||
class GALogger {
|
|
||||||
private static readonly instance;
|
|
||||||
private infoLogEnabled;
|
|
||||||
private infoLogVerboseEnabled;
|
|
||||||
private static debugEnabled;
|
|
||||||
private static readonly Tag;
|
|
||||||
private constructor();
|
|
||||||
static setInfoLog(value: boolean): void;
|
|
||||||
static setVerboseLog(value: boolean): void;
|
|
||||||
static i(format: string): void;
|
|
||||||
static w(format: string): void;
|
|
||||||
static e(format: string): void;
|
|
||||||
static ii(format: string): void;
|
|
||||||
static d(format: string): void;
|
|
||||||
private sendNotificationMessage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module gameanalytics {
|
|
||||||
module utilities {
|
|
||||||
class GAUtilities {
|
|
||||||
static getHmac(key: string, data: string): string;
|
|
||||||
static stringMatch(s: string, pattern: RegExp): boolean;
|
|
||||||
static joinStringArray(v: Array<string>, delimiter: string): string;
|
|
||||||
static stringArrayContainsString(array: Array<string>, search: string): boolean;
|
|
||||||
private static readonly keyStr;
|
|
||||||
static encode64(input: string): string;
|
|
||||||
static decode64(input: string): string;
|
|
||||||
static timeIntervalSince1970(): number;
|
|
||||||
static createGuid(): string;
|
|
||||||
private static s4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module gameanalytics {
|
|
||||||
module validators {
|
|
||||||
import EGASdkErrorCategory = gameanalytics.events.EGASdkErrorCategory;
|
|
||||||
import EGASdkErrorArea = gameanalytics.events.EGASdkErrorArea;
|
|
||||||
import EGASdkErrorAction = gameanalytics.events.EGASdkErrorAction;
|
|
||||||
import EGASdkErrorParameter = gameanalytics.events.EGASdkErrorParameter;
|
|
||||||
class ValidationResult {
|
|
||||||
category: EGASdkErrorCategory;
|
|
||||||
area: EGASdkErrorArea;
|
|
||||||
action: EGASdkErrorAction;
|
|
||||||
parameter: EGASdkErrorParameter;
|
|
||||||
reason: string;
|
|
||||||
constructor(
|
|
||||||
category: EGASdkErrorCategory,
|
|
||||||
area: EGASdkErrorArea,
|
|
||||||
action: EGASdkErrorAction,
|
|
||||||
parameter: EGASdkErrorParameter,
|
|
||||||
reason: string
|
|
||||||
);
|
|
||||||
}
|
|
||||||
class GAValidator {
|
|
||||||
static validateBusinessEvent(
|
|
||||||
currency: string,
|
|
||||||
amount: number,
|
|
||||||
cartType: string,
|
|
||||||
itemType: string,
|
|
||||||
itemId: string
|
|
||||||
): ValidationResult;
|
|
||||||
static validateResourceEvent(
|
|
||||||
flowType: EGAResourceFlowType,
|
|
||||||
currency: string,
|
|
||||||
amount: number,
|
|
||||||
itemType: string,
|
|
||||||
itemId: string,
|
|
||||||
availableCurrencies: Array<string>,
|
|
||||||
availableItemTypes: Array<string>
|
|
||||||
): ValidationResult;
|
|
||||||
static validateProgressionEvent(
|
|
||||||
progressionStatus: EGAProgressionStatus,
|
|
||||||
progression01: string,
|
|
||||||
progression02: string,
|
|
||||||
progression03: string
|
|
||||||
): ValidationResult;
|
|
||||||
static validateDesignEvent(eventId: string): ValidationResult;
|
|
||||||
static validateErrorEvent(severity: EGAErrorSeverity, message: string): ValidationResult;
|
|
||||||
static validateSdkErrorEvent(
|
|
||||||
gameKey: string,
|
|
||||||
gameSecret: string,
|
|
||||||
category: EGASdkErrorCategory,
|
|
||||||
area: EGASdkErrorArea,
|
|
||||||
action: EGASdkErrorAction
|
|
||||||
): boolean;
|
|
||||||
static validateKeys(gameKey: string, gameSecret: string): boolean;
|
|
||||||
static validateCurrency(currency: string): boolean;
|
|
||||||
static validateEventPartLength(eventPart: string, allowNull: boolean): boolean;
|
|
||||||
static validateEventPartCharacters(eventPart: string): boolean;
|
|
||||||
static validateEventIdLength(eventId: string): boolean;
|
|
||||||
static validateEventIdCharacters(eventId: string): boolean;
|
|
||||||
static validateAndCleanInitRequestResponse(
|
|
||||||
initResponse: {
|
|
||||||
[key: string]: any;
|
|
||||||
},
|
|
||||||
configsCreated: boolean
|
|
||||||
): {
|
|
||||||
[key: string]: any;
|
|
||||||
};
|
|
||||||
static validateBuild(build: string): boolean;
|
|
||||||
static validateSdkWrapperVersion(wrapperVersion: string): boolean;
|
|
||||||
static validateEngineVersion(engineVersion: string): boolean;
|
|
||||||
static validateUserId(uId: string): boolean;
|
|
||||||
static validateShortString(shortString: string, canBeEmpty: boolean): boolean;
|
|
||||||
static validateString(s: string, canBeEmpty: boolean): boolean;
|
|
||||||
static validateLongString(longString: string, canBeEmpty: boolean): boolean;
|
|
||||||
static validateConnectionType(connectionType: string): boolean;
|
|
||||||
static validateCustomDimensions(customDimensions: Array<string>): boolean;
|
|
||||||
static validateResourceCurrencies(resourceCurrencies: Array<string>): boolean;
|
|
||||||
static validateResourceItemTypes(resourceItemTypes: Array<string>): boolean;
|
|
||||||
static validateDimension01(dimension01: string, availableDimensions: Array<string>): boolean;
|
|
||||||
static validateDimension02(dimension02: string, availableDimensions: Array<string>): boolean;
|
|
||||||
static validateDimension03(dimension03: string, availableDimensions: Array<string>): boolean;
|
|
||||||
static validateArrayOfStrings(
|
|
||||||
maxCount: number,
|
|
||||||
maxStringLength: number,
|
|
||||||
allowNoValues: boolean,
|
|
||||||
logTag: string,
|
|
||||||
arrayOfStrings: Array<string>
|
|
||||||
): boolean;
|
|
||||||
static validateClientTs(clientTs: number): boolean;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module gameanalytics {
|
|
||||||
module device {
|
|
||||||
class NameValueVersion {
|
|
||||||
name: string;
|
|
||||||
value: string;
|
|
||||||
version: string;
|
|
||||||
constructor(name: string, value: string, version: string);
|
|
||||||
}
|
|
||||||
class NameVersion {
|
|
||||||
name: string;
|
|
||||||
version: string;
|
|
||||||
constructor(name: string, version: string);
|
|
||||||
}
|
|
||||||
class GADevice {
|
|
||||||
private static readonly sdkWrapperVersion;
|
|
||||||
private static readonly osVersionPair;
|
|
||||||
static readonly buildPlatform: string;
|
|
||||||
static readonly deviceModel: string;
|
|
||||||
static readonly deviceManufacturer: string;
|
|
||||||
static readonly osVersion: string;
|
|
||||||
static readonly browserVersion: string;
|
|
||||||
static sdkGameEngineVersion: string;
|
|
||||||
static gameEngineVersion: string;
|
|
||||||
private static connectionType;
|
|
||||||
static touch(): void;
|
|
||||||
static getRelevantSdkVersion(): string;
|
|
||||||
static getConnectionType(): string;
|
|
||||||
static updateConnectionType(): void;
|
|
||||||
private static getOSVersionString;
|
|
||||||
private static runtimePlatformToString;
|
|
||||||
private static getBrowserVersionString;
|
|
||||||
private static getDeviceModel;
|
|
||||||
private static getDeviceManufacturer;
|
|
||||||
private static matchItem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module gameanalytics {
|
|
||||||
module threading {
|
|
||||||
class TimedBlock {
|
|
||||||
readonly deadline: Date;
|
|
||||||
block: () => void;
|
|
||||||
readonly id: number;
|
|
||||||
ignore: boolean;
|
|
||||||
async: boolean;
|
|
||||||
running: boolean;
|
|
||||||
private static idCounter;
|
|
||||||
constructor(deadline: Date);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module gameanalytics {
|
|
||||||
module threading {
|
|
||||||
interface IComparer<T> {
|
|
||||||
compare(x: T, y: T): number;
|
|
||||||
}
|
|
||||||
class PriorityQueue<TItem> {
|
|
||||||
_subQueues: {
|
|
||||||
[key: number]: Array<TItem>;
|
|
||||||
};
|
|
||||||
_sortedKeys: Array<number>;
|
|
||||||
private comparer;
|
|
||||||
constructor(priorityComparer: IComparer<number>);
|
|
||||||
enqueue(priority: number, item: TItem): void;
|
|
||||||
private addQueueOfPriority;
|
|
||||||
peek(): TItem;
|
|
||||||
hasItems(): boolean;
|
|
||||||
dequeue(): TItem;
|
|
||||||
private dequeueFromHighPriorityQueue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module gameanalytics {
|
|
||||||
module store {
|
|
||||||
enum EGAStoreArgsOperator {
|
|
||||||
Equal = 0,
|
|
||||||
LessOrEqual = 1,
|
|
||||||
NotEqual = 2,
|
|
||||||
}
|
|
||||||
enum EGAStore {
|
|
||||||
Events = 0,
|
|
||||||
Sessions = 1,
|
|
||||||
Progression = 2,
|
|
||||||
}
|
|
||||||
class GAStore {
|
|
||||||
private static readonly instance;
|
|
||||||
private static storageAvailable;
|
|
||||||
private static readonly MaxNumberOfEntries;
|
|
||||||
private eventsStore;
|
|
||||||
private sessionsStore;
|
|
||||||
private progressionStore;
|
|
||||||
private storeItems;
|
|
||||||
private static readonly StringFormat;
|
|
||||||
private static readonly KeyFormat;
|
|
||||||
private static readonly EventsStoreKey;
|
|
||||||
private static readonly SessionsStoreKey;
|
|
||||||
private static readonly ProgressionStoreKey;
|
|
||||||
private static readonly ItemsStoreKey;
|
|
||||||
private constructor();
|
|
||||||
static isStorageAvailable(): boolean;
|
|
||||||
static isStoreTooLargeForEvents(): boolean;
|
|
||||||
static select(
|
|
||||||
store: EGAStore,
|
|
||||||
args?: Array<[string, EGAStoreArgsOperator, any]>,
|
|
||||||
sort?: boolean,
|
|
||||||
maxCount?: number
|
|
||||||
): Array<{
|
|
||||||
[key: string]: any;
|
|
||||||
}>;
|
|
||||||
static update(
|
|
||||||
store: EGAStore,
|
|
||||||
setArgs: Array<[string, any]>,
|
|
||||||
whereArgs?: Array<[string, EGAStoreArgsOperator, any]>
|
|
||||||
): boolean;
|
|
||||||
static delete(store: EGAStore, args: Array<[string, EGAStoreArgsOperator, any]>): void;
|
|
||||||
static insert(
|
|
||||||
store: EGAStore,
|
|
||||||
newEntry: {
|
|
||||||
[key: string]: any;
|
|
||||||
},
|
|
||||||
replace?: boolean,
|
|
||||||
replaceKey?: string
|
|
||||||
): void;
|
|
||||||
static save(gameKey: string): void;
|
|
||||||
static load(gameKey: string): void;
|
|
||||||
static setItem(gameKey: string, key: string, value: string): void;
|
|
||||||
static getItem(gameKey: string, key: string): string;
|
|
||||||
private static getStore;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module gameanalytics {
|
|
||||||
module state {
|
|
||||||
class GAState {
|
|
||||||
private static readonly CategorySdkError;
|
|
||||||
private static readonly MAX_CUSTOM_FIELDS_COUNT;
|
|
||||||
private static readonly MAX_CUSTOM_FIELDS_KEY_LENGTH;
|
|
||||||
private static readonly MAX_CUSTOM_FIELDS_VALUE_STRING_LENGTH;
|
|
||||||
static readonly instance: GAState;
|
|
||||||
private constructor();
|
|
||||||
private userId;
|
|
||||||
static setUserId(userId: string): void;
|
|
||||||
private identifier;
|
|
||||||
static getIdentifier(): string;
|
|
||||||
private initialized;
|
|
||||||
static isInitialized(): boolean;
|
|
||||||
static setInitialized(value: boolean): void;
|
|
||||||
sessionStart: number;
|
|
||||||
static getSessionStart(): number;
|
|
||||||
private sessionNum;
|
|
||||||
static getSessionNum(): number;
|
|
||||||
private transactionNum;
|
|
||||||
static getTransactionNum(): number;
|
|
||||||
sessionId: string;
|
|
||||||
static getSessionId(): string;
|
|
||||||
private currentCustomDimension01;
|
|
||||||
static getCurrentCustomDimension01(): string;
|
|
||||||
private currentCustomDimension02;
|
|
||||||
static getCurrentCustomDimension02(): string;
|
|
||||||
private currentCustomDimension03;
|
|
||||||
static getCurrentCustomDimension03(): string;
|
|
||||||
private gameKey;
|
|
||||||
static getGameKey(): string;
|
|
||||||
private gameSecret;
|
|
||||||
static getGameSecret(): string;
|
|
||||||
private availableCustomDimensions01;
|
|
||||||
static getAvailableCustomDimensions01(): Array<string>;
|
|
||||||
static setAvailableCustomDimensions01(value: Array<string>): void;
|
|
||||||
private availableCustomDimensions02;
|
|
||||||
static getAvailableCustomDimensions02(): Array<string>;
|
|
||||||
static setAvailableCustomDimensions02(value: Array<string>): void;
|
|
||||||
private availableCustomDimensions03;
|
|
||||||
static getAvailableCustomDimensions03(): Array<string>;
|
|
||||||
static setAvailableCustomDimensions03(value: Array<string>): void;
|
|
||||||
private availableResourceCurrencies;
|
|
||||||
static getAvailableResourceCurrencies(): Array<string>;
|
|
||||||
static setAvailableResourceCurrencies(value: Array<string>): void;
|
|
||||||
private availableResourceItemTypes;
|
|
||||||
static getAvailableResourceItemTypes(): Array<string>;
|
|
||||||
static setAvailableResourceItemTypes(value: Array<string>): void;
|
|
||||||
private build;
|
|
||||||
static getBuild(): string;
|
|
||||||
static setBuild(value: string): void;
|
|
||||||
private useManualSessionHandling;
|
|
||||||
static getUseManualSessionHandling(): boolean;
|
|
||||||
private _isEventSubmissionEnabled;
|
|
||||||
static isEventSubmissionEnabled(): boolean;
|
|
||||||
sdkConfigCached: {
|
|
||||||
[key: string]: any;
|
|
||||||
};
|
|
||||||
private configurations;
|
|
||||||
private remoteConfigsIsReady;
|
|
||||||
private remoteConfigsListeners;
|
|
||||||
initAuthorized: boolean;
|
|
||||||
clientServerTimeOffset: number;
|
|
||||||
configsHash: string;
|
|
||||||
abId: string;
|
|
||||||
static getABTestingId(): string;
|
|
||||||
abVariantId: string;
|
|
||||||
static getABTestingVariantId(): string;
|
|
||||||
private defaultUserId;
|
|
||||||
private setDefaultId;
|
|
||||||
static getDefaultId(): string;
|
|
||||||
sdkConfigDefault: {
|
|
||||||
[key: string]: string;
|
|
||||||
};
|
|
||||||
sdkConfig: {
|
|
||||||
[key: string]: any;
|
|
||||||
};
|
|
||||||
static getSdkConfig(): {
|
|
||||||
[key: string]: any;
|
|
||||||
};
|
|
||||||
private progressionTries;
|
|
||||||
static readonly DefaultUserIdKey: string;
|
|
||||||
static readonly SessionNumKey: string;
|
|
||||||
static readonly TransactionNumKey: string;
|
|
||||||
private static readonly Dimension01Key;
|
|
||||||
private static readonly Dimension02Key;
|
|
||||||
private static readonly Dimension03Key;
|
|
||||||
static readonly SdkConfigCachedKey: string;
|
|
||||||
static isEnabled(): boolean;
|
|
||||||
static setCustomDimension01(dimension: string): void;
|
|
||||||
static setCustomDimension02(dimension: string): void;
|
|
||||||
static setCustomDimension03(dimension: string): void;
|
|
||||||
static incrementSessionNum(): void;
|
|
||||||
static incrementTransactionNum(): void;
|
|
||||||
static incrementProgressionTries(progression: string): void;
|
|
||||||
static getProgressionTries(progression: string): number;
|
|
||||||
static clearProgressionTries(progression: string): void;
|
|
||||||
static setKeys(gameKey: string, gameSecret: string): void;
|
|
||||||
static setManualSessionHandling(flag: boolean): void;
|
|
||||||
static setEnabledEventSubmission(flag: boolean): void;
|
|
||||||
static getEventAnnotations(): {
|
|
||||||
[key: string]: any;
|
|
||||||
};
|
|
||||||
static getSdkErrorEventAnnotations(): {
|
|
||||||
[key: string]: any;
|
|
||||||
};
|
|
||||||
static getInitAnnotations(): {
|
|
||||||
[key: string]: any;
|
|
||||||
};
|
|
||||||
static getClientTsAdjusted(): number;
|
|
||||||
static sessionIsStarted(): boolean;
|
|
||||||
private static cacheIdentifier;
|
|
||||||
static ensurePersistedStates(): void;
|
|
||||||
static calculateServerTimeOffset(serverTs: number): number;
|
|
||||||
static validateAndCleanCustomFields(fields: {
|
|
||||||
[id: string]: any;
|
|
||||||
}): {
|
|
||||||
[id: string]: any;
|
|
||||||
};
|
|
||||||
static validateAndFixCurrentDimensions(): void;
|
|
||||||
static getConfigurationStringValue(key: string, defaultValue: string): string;
|
|
||||||
static isRemoteConfigsReady(): boolean;
|
|
||||||
static addRemoteConfigsListener(listener: { onRemoteConfigsUpdated: () => void }): void;
|
|
||||||
static removeRemoteConfigsListener(listener: { onRemoteConfigsUpdated: () => void }): void;
|
|
||||||
static getRemoteConfigsContentAsString(): string;
|
|
||||||
static populateConfigurations(sdkConfig: { [key: string]: any }): void;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module gameanalytics {
|
|
||||||
module tasks {
|
|
||||||
class SdkErrorTask {
|
|
||||||
private static readonly MaxCount;
|
|
||||||
private static readonly countMap;
|
|
||||||
private static readonly timestampMap;
|
|
||||||
static execute(url: string, type: string, payloadData: string, secretKey: string): void;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module gameanalytics {
|
|
||||||
module http {
|
|
||||||
import EGASdkErrorCategory = gameanalytics.events.EGASdkErrorCategory;
|
|
||||||
import EGASdkErrorArea = gameanalytics.events.EGASdkErrorArea;
|
|
||||||
import EGASdkErrorAction = gameanalytics.events.EGASdkErrorAction;
|
|
||||||
import EGASdkErrorParameter = gameanalytics.events.EGASdkErrorParameter;
|
|
||||||
class GAHTTPApi {
|
|
||||||
static readonly instance: GAHTTPApi;
|
|
||||||
private protocol;
|
|
||||||
private hostName;
|
|
||||||
private version;
|
|
||||||
private remoteConfigsVersion;
|
|
||||||
private baseUrl;
|
|
||||||
private remoteConfigsBaseUrl;
|
|
||||||
private initializeUrlPath;
|
|
||||||
private eventsUrlPath;
|
|
||||||
private useGzip;
|
|
||||||
private static readonly MAX_ERROR_MESSAGE_LENGTH;
|
|
||||||
private constructor();
|
|
||||||
requestInit(
|
|
||||||
configsHash: string,
|
|
||||||
callback: (
|
|
||||||
response: EGAHTTPApiResponse,
|
|
||||||
json: {
|
|
||||||
[key: string]: any;
|
|
||||||
}
|
|
||||||
) => void
|
|
||||||
): void;
|
|
||||||
sendEventsInArray(
|
|
||||||
eventArray: Array<{
|
|
||||||
[key: string]: any;
|
|
||||||
}>,
|
|
||||||
requestId: string,
|
|
||||||
callback: (
|
|
||||||
response: EGAHTTPApiResponse,
|
|
||||||
json: {
|
|
||||||
[key: string]: any;
|
|
||||||
},
|
|
||||||
requestId: string,
|
|
||||||
eventCount: number
|
|
||||||
) => void
|
|
||||||
): void;
|
|
||||||
sendSdkErrorEvent(
|
|
||||||
category: EGASdkErrorCategory,
|
|
||||||
area: EGASdkErrorArea,
|
|
||||||
action: EGASdkErrorAction,
|
|
||||||
parameter: EGASdkErrorParameter,
|
|
||||||
reason: string,
|
|
||||||
gameKey: string,
|
|
||||||
secretKey: string
|
|
||||||
): void;
|
|
||||||
private static sendEventInArrayRequestCallback;
|
|
||||||
private static sendRequest;
|
|
||||||
private static initRequestCallback;
|
|
||||||
private createPayloadData;
|
|
||||||
private processRequestResponse;
|
|
||||||
private static sdkErrorCategoryString;
|
|
||||||
private static sdkErrorAreaString;
|
|
||||||
private static sdkErrorActionString;
|
|
||||||
private static sdkErrorParameterString;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module gameanalytics {
|
|
||||||
module events {
|
|
||||||
class GAEvents {
|
|
||||||
private static readonly CategorySessionStart;
|
|
||||||
private static readonly CategorySessionEnd;
|
|
||||||
private static readonly CategoryDesign;
|
|
||||||
private static readonly CategoryBusiness;
|
|
||||||
private static readonly CategoryProgression;
|
|
||||||
private static readonly CategoryResource;
|
|
||||||
private static readonly CategoryError;
|
|
||||||
private static readonly MaxEventCount;
|
|
||||||
private constructor();
|
|
||||||
static addSessionStartEvent(): void;
|
|
||||||
static addSessionEndEvent(): void;
|
|
||||||
static addBusinessEvent(
|
|
||||||
currency: string,
|
|
||||||
amount: number,
|
|
||||||
itemType: string,
|
|
||||||
itemId: string,
|
|
||||||
cartType: string,
|
|
||||||
fields: {
|
|
||||||
[id: string]: any;
|
|
||||||
}
|
|
||||||
): void;
|
|
||||||
static addResourceEvent(
|
|
||||||
flowType: EGAResourceFlowType,
|
|
||||||
currency: string,
|
|
||||||
amount: number,
|
|
||||||
itemType: string,
|
|
||||||
itemId: string,
|
|
||||||
fields: {
|
|
||||||
[id: string]: any;
|
|
||||||
}
|
|
||||||
): void;
|
|
||||||
static addProgressionEvent(
|
|
||||||
progressionStatus: EGAProgressionStatus,
|
|
||||||
progression01: string,
|
|
||||||
progression02: string,
|
|
||||||
progression03: string,
|
|
||||||
score: number,
|
|
||||||
sendScore: boolean,
|
|
||||||
fields: {
|
|
||||||
[id: string]: any;
|
|
||||||
}
|
|
||||||
): void;
|
|
||||||
static addDesignEvent(
|
|
||||||
eventId: string,
|
|
||||||
value: number,
|
|
||||||
sendValue: boolean,
|
|
||||||
fields: {
|
|
||||||
[id: string]: any;
|
|
||||||
}
|
|
||||||
): void;
|
|
||||||
static addErrorEvent(
|
|
||||||
severity: EGAErrorSeverity,
|
|
||||||
message: string,
|
|
||||||
fields: {
|
|
||||||
[id: string]: any;
|
|
||||||
}
|
|
||||||
): void;
|
|
||||||
static processEvents(category: string, performCleanUp: boolean): void;
|
|
||||||
private static processEventsCallback;
|
|
||||||
private static cleanupEvents;
|
|
||||||
private static fixMissingSessionEndEvents;
|
|
||||||
private static addEventToStore;
|
|
||||||
private static updateSessionStore;
|
|
||||||
private static addDimensionsToEvent;
|
|
||||||
private static addFieldsToEvent;
|
|
||||||
private static resourceFlowTypeToString;
|
|
||||||
private static progressionStatusToString;
|
|
||||||
private static errorSeverityToString;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module gameanalytics {
|
|
||||||
module threading {
|
|
||||||
class GAThreading {
|
|
||||||
private static readonly instance;
|
|
||||||
readonly blocks: PriorityQueue<TimedBlock>;
|
|
||||||
private readonly id2TimedBlockMap;
|
|
||||||
private static runTimeoutId;
|
|
||||||
private static readonly ThreadWaitTimeInMs;
|
|
||||||
private static ProcessEventsIntervalInSeconds;
|
|
||||||
private keepRunning;
|
|
||||||
private isRunning;
|
|
||||||
private constructor();
|
|
||||||
static createTimedBlock(delayInSeconds?: number): TimedBlock;
|
|
||||||
static performTaskOnGAThread(taskBlock: () => void, delayInSeconds?: number): void;
|
|
||||||
static performTimedBlockOnGAThread(timedBlock: TimedBlock): void;
|
|
||||||
static scheduleTimer(interval: number, callback: () => void): number;
|
|
||||||
static getTimedBlockById(blockIdentifier: number): TimedBlock;
|
|
||||||
static ensureEventQueueIsRunning(): void;
|
|
||||||
static endSessionAndStopQueue(): void;
|
|
||||||
static stopEventQueue(): void;
|
|
||||||
static ignoreTimer(blockIdentifier: number): void;
|
|
||||||
static setEventProcessInterval(interval: number): void;
|
|
||||||
private addTimedBlock;
|
|
||||||
private static run;
|
|
||||||
private static startThread;
|
|
||||||
private static getNextBlock;
|
|
||||||
private static processEventQueue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module gameanalytics {
|
|
||||||
class GameAnalytics {
|
|
||||||
private static initTimedBlockId;
|
|
||||||
static methodMap: {
|
|
||||||
[id: string]: (...args: any[]) => void;
|
|
||||||
};
|
|
||||||
static init(): void;
|
|
||||||
static gaCommand(...args: any[]): void;
|
|
||||||
static configureAvailableCustomDimensions01(customDimensions?: Array<string>): void;
|
|
||||||
static configureAvailableCustomDimensions02(customDimensions?: Array<string>): void;
|
|
||||||
static configureAvailableCustomDimensions03(customDimensions?: Array<string>): void;
|
|
||||||
static configureAvailableResourceCurrencies(resourceCurrencies?: Array<string>): void;
|
|
||||||
static configureAvailableResourceItemTypes(resourceItemTypes?: Array<string>): void;
|
|
||||||
static configureBuild(build?: string): void;
|
|
||||||
static configureSdkGameEngineVersion(sdkGameEngineVersion?: string): void;
|
|
||||||
static configureGameEngineVersion(gameEngineVersion?: string): void;
|
|
||||||
static configureUserId(uId?: string): void;
|
|
||||||
static initialize(gameKey?: string, gameSecret?: string): void;
|
|
||||||
static addBusinessEvent(
|
|
||||||
currency?: string,
|
|
||||||
amount?: number,
|
|
||||||
itemType?: string,
|
|
||||||
itemId?: string,
|
|
||||||
cartType?: string
|
|
||||||
): void;
|
|
||||||
static addResourceEvent(
|
|
||||||
flowType?: EGAResourceFlowType,
|
|
||||||
currency?: string,
|
|
||||||
amount?: number,
|
|
||||||
itemType?: string,
|
|
||||||
itemId?: string
|
|
||||||
): void;
|
|
||||||
static addProgressionEvent(
|
|
||||||
progressionStatus?: EGAProgressionStatus,
|
|
||||||
progression01?: string,
|
|
||||||
progression02?: string,
|
|
||||||
progression03?: string,
|
|
||||||
score?: any
|
|
||||||
): void;
|
|
||||||
static addDesignEvent(eventId: string, value?: any): void;
|
|
||||||
static addErrorEvent(severity?: EGAErrorSeverity, message?: string): void;
|
|
||||||
static setEnabledInfoLog(flag?: boolean): void;
|
|
||||||
static setEnabledVerboseLog(flag?: boolean): void;
|
|
||||||
static setEnabledManualSessionHandling(flag?: boolean): void;
|
|
||||||
static setEnabledEventSubmission(flag?: boolean): void;
|
|
||||||
static setCustomDimension01(dimension?: string): void;
|
|
||||||
static setCustomDimension02(dimension?: string): void;
|
|
||||||
static setCustomDimension03(dimension?: string): void;
|
|
||||||
static setEventProcessInterval(intervalInSeconds: number): void;
|
|
||||||
static startSession(): void;
|
|
||||||
static endSession(): void;
|
|
||||||
static onStop(): void;
|
|
||||||
static onResume(): void;
|
|
||||||
static getRemoteConfigsValueAsString(key: string, defaultValue?: string): string;
|
|
||||||
static isRemoteConfigsReady(): boolean;
|
|
||||||
static addRemoteConfigsListener(listener: { onRemoteConfigsUpdated: () => void }): void;
|
|
||||||
static removeRemoteConfigsListener(listener: { onRemoteConfigsUpdated: () => void }): void;
|
|
||||||
static getRemoteConfigsContentAsString(): string;
|
|
||||||
static getABTestingId(): string;
|
|
||||||
static getABTestingVariantId(): string;
|
|
||||||
private static internalInitialize;
|
|
||||||
private static newSession;
|
|
||||||
private static startNewSessionCallback;
|
|
||||||
private static resumeSessionAndStartQueue;
|
|
||||||
private static isSdkReady;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare var GameAnalyticsCommand: typeof gameanalytics.GameAnalytics.gaCommand;
|
|
||||||
export declare var GameAnalytics: typeof gameanalytics.GameAnalytics;
|
|
||||||
export default GameAnalytics;
|
|
Loading…
Reference in New Issue
Block a user