@haelp/teto
Version:
A typescript-based controllable TETR.IO client.
147 lines (146 loc) • 4.2 kB
JavaScript
export const garbageData = {
single: 0,
double: 1,
triple: 2,
quad: 4,
penta: 5,
tspinMini: 0,
tspin: 0,
tspinMiniSingle: 0,
tspinSingle: 2,
tspinMiniDouble: 1,
tspinMiniTriple: 2,
tspinDouble: 4,
tspinTriple: 6,
tspinQuad: 10,
tspinPenta: 12,
backtobackBonus: 1,
backtobackBonusLog: 0.8,
comboMinifier: 1,
comboMinifierLog: 1.25,
comboBonus: 0.25,
allClear: 10,
comboTable: {
none: [
0
],
"classic guideline": [
0,
1,
1,
2,
2,
3,
3,
4,
4,
4,
5
],
"modern guideline": [
0,
1,
1,
2,
2,
2,
3,
3,
3,
3,
3,
3,
4
]
}
};
export const garbageCalcV2 = (data, config)=>{
let garbage = 0;
const { spin: rawSpin, lines, piece, combo, b2b, enemies } = data;
const { spinBonuses, comboTable, garbageTargetBonus, b2b: b2bOptions } = config;
const spin = rawSpin === "none" ? null : rawSpin;
switch(lines){
case 0:
garbage = spin === "mini" ? garbageData.tspinMini : spin === "normal" ? garbageData.tspin : 0;
break;
case 1:
garbage = spin === "mini" ? garbageData.tspinMiniSingle : spin === "normal" ? garbageData.tspinSingle : garbageData.single;
break;
case 2:
garbage = spin === "mini" ? garbageData.tspinMiniDouble : spin === "normal" ? garbageData.tspinDouble : garbageData.double;
break;
case 3:
garbage = spin === "mini" ? garbageData.tspinMiniTriple : spin === "normal" ? garbageData.tspinTriple : garbageData.triple;
break;
case 4:
garbage = spin ? garbageData.tspinQuad : garbageData.quad;
break;
case 5:
garbage = spin ? garbageData.tspinPenta : garbageData.penta;
break;
default:
{
const t = lines - 5;
garbage = spin ? garbageData.tspinPenta + 2 * t : garbageData.penta + t;
break;
}
}
if (spin && spinBonuses === "handheld" && piece.toUpperCase() !== "T") {
garbage /= 2;
}
if (lines > 0 && b2b > 0) {
if (b2bOptions.chaining) {
const b2bGains = garbageData.backtobackBonus * (Math.floor(1 + Math.log1p(b2b * garbageData.backtobackBonusLog)) + (b2b == 1 ? 0 : (1 + Math.log1p(b2b * garbageData.backtobackBonusLog) % 1) / 3));
garbage += b2bGains;
} else {
garbage += garbageData.backtobackBonus;
}
}
if (combo > 0) {
if (comboTable === "multiplier") {
garbage *= 1 + garbageData.comboBonus * combo;
if (combo > 1) {
garbage = Math.max(Math.log1p(garbageData.comboMinifier * combo * garbageData.comboMinifierLog), garbage);
}
} else {
const comboTableData = garbageData.comboTable[comboTable] || [
0
];
garbage += comboTableData[Math.max(0, Math.min(combo - 1, comboTableData.length - 1))];
}
}
let garbageBonus = 0;
if (lines > 0 && garbageTargetBonus !== "none") {
let targetBonus = 0;
switch(enemies){
case 0:
case 1:
break;
case 2:
targetBonus += 1;
break;
case 3:
targetBonus += 3;
break;
case 4:
targetBonus += 5;
break;
case 5:
targetBonus += 7;
break;
default:
targetBonus += 9;
}
if (garbageTargetBonus === "normal") {
garbage += targetBonus;
} else {
garbageBonus = targetBonus;
}
}
// TODO: how to bonus
return {
garbage,
bonus: garbageBonus
};
};
//# sourceMappingURL=index.js.map