forked from circlecloud/tera
100 lines
2.9 KiB
TypeScript
100 lines
2.9 KiB
TypeScript
/*
|
|
* @project: TERA
|
|
* @version: Development (beta)
|
|
* @license: MIT (not for evil)
|
|
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
|
* Web: https://terafoundation.org
|
|
* Twitter: https://twitter.com/terafoundation
|
|
* Telegram: https://t.me/terafoundation
|
|
*/
|
|
|
|
|
|
function DoRest(RestData, Data, BlockNum) {
|
|
var Prev = RestData.Arr[0];
|
|
var BlockNum0 = Math.floor(BlockNum / global.REST_BLOCK_SCALE);
|
|
if (BlockNum0 !== Math.floor((Prev.BlockNum - 1) / global.REST_BLOCK_SCALE)) {
|
|
var arr = GetRestArr(BlockNum0);
|
|
var arr2 = [];
|
|
for (var i = arr.length - 2; i >= 0; i--) {
|
|
arr2.push(arr[i] * global.REST_BLOCK_SCALE);
|
|
}
|
|
RestPush(RestData, arr2, BlockNum, 1);
|
|
}
|
|
RestData.Arr[0] = { BlockNum: BlockNum, Value: Data.Value };
|
|
};
|
|
|
|
function RestPush(RestData, ArrRest, BlockNum, Index) {
|
|
var Prev = RestData.Arr[Index - 1];
|
|
var Cur = RestData.Arr[Index];
|
|
if (Index > 1) {
|
|
var RestNum = ArrRest[Index - 2];
|
|
if (Prev.BlockNum > RestNum)
|
|
return;
|
|
}
|
|
if ((Cur.BlockNum && Cur.BlockNum >= BlockNum) || Prev.BlockNum >= BlockNum) {
|
|
Cur.BlockNum = 0;
|
|
Cur.Value = {};
|
|
return;
|
|
}
|
|
if (Cur.BlockNum) {
|
|
if (Index < RestData.Arr.length - 1) {
|
|
RestPush(RestData, ArrRest, BlockNum, Index + 1);
|
|
}
|
|
}
|
|
RestData.Arr[Index] = Prev;
|
|
};
|
|
|
|
function GetRestArr(CurBlockNum) {
|
|
var Arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
var ArrLength = Arr.length;
|
|
var StartNum = 0;
|
|
for (var num = StartNum; num <= CurBlockNum; num++) {
|
|
var maska = 0;
|
|
var CurNum = num;
|
|
for (var i = ArrLength - 1; i >= 0; i--) {
|
|
var PosNum = Arr[i];
|
|
Arr[i] = CurNum;
|
|
CurNum = PosNum;
|
|
maska = (maska << 4) | 15;
|
|
if ((maska & num) === 0)
|
|
break;
|
|
if ((maska & CurNum) !== 0)
|
|
break;
|
|
}
|
|
}
|
|
return Arr;
|
|
};
|
|
var RestArrMap = {};
|
|
|
|
function GetCurrentRestArr() {
|
|
var BlockNum = global.GetCurrentBlockNumByTime();
|
|
var BlockNum0 = Math.floor(BlockNum / global.REST_BLOCK_SCALE);
|
|
var arr = RestArrMap[BlockNum0];
|
|
if (arr === undefined) {
|
|
RestArrMap = {};
|
|
arr = GetRestArr(BlockNum0);
|
|
arr.length = arr.length - 1;
|
|
for (var i = 0; i < arr.length; i++) {
|
|
arr[i] = arr[i] * global.REST_BLOCK_SCALE;
|
|
}
|
|
RestArrMap[BlockNum0] = arr;
|
|
}
|
|
return arr;
|
|
};
|
|
|
|
function GetCurrentRestNum(NumDelta) {
|
|
var BlockNum = global.GetCurrentBlockNumByTime();
|
|
var BlockNumMin = BlockNum - NumDelta;
|
|
var arr = GetCurrentRestArr();
|
|
for (var i = arr.length - 1; i >= 0; i--) {
|
|
if (arr[i] <= BlockNumMin) {
|
|
return arr[i];
|
|
}
|
|
}
|
|
return 0;
|
|
};
|
|
global.DoRest = DoRest;
|
|
global.GetRestArr = GetRestArr;
|
|
global.GetCurrentRestArr = GetCurrentRestArr;
|
|
global.GetCurrentRestNum = GetCurrentRestNum;
|