@haelp/teto
Version:
A typescript-based controllable TETR.IO client.
594 lines • 19.8 kB
TypeScript
import { type BagType, Engine, type KickTable } from "../engine";
export declare namespace Game {
/** Handling config interface (test on TETR.IO for limits) */
interface Handling {
arr: number;
das: number;
dcd: number;
sdf: number;
safelock: boolean;
cancel: boolean;
may20g: boolean;
irs: "off" | "hold" | "tap";
ihs: "off" | "hold" | "tap";
}
/** Game config preset */
type Preset = "default" | "tetra league" | "tetra league (season 1)" | "enforced delays" | "4wide" | "100 battle royale" | "classic" | "arcade" | "bombs" | "quickplay";
/** Way the garbage enters the board. `continuous` and `delayed` not yet supported */
type GarbageEntry = "instant" | "continuous" | "delayed";
/** When garbage enters the board. only `combo blocking` is currently supported */
type GarbageBlocking = "combo blocking" | "limited blocking" | "none";
/** Garbage target bonus not yet supported. Used in royale mode */
type GarbageTargetBonus = "offensive" | "defensive" | "none";
/** Only `zero` passthrough supported */
type Passthrough = "zero" | "limited" | "consistent" | "full";
/** Only `T-spins` supported */
type SpinBonuses = "T-spins" | "T-spins+" | "all" | "all+" | "all-mini" | "all-mini+" | "mini-only" | "handheld" | "stupid" | "none";
/** Whether decimal garbage is rounded down or weighted RNG rounding */
type RoundingMode = "down" | "rng";
/** Only `multiplier` is currently supported */
type ComboTable = "none" | "multiplier" | "classic guideline" | "modern guideline";
/** Only `versus` supported. Client will run in `practice` but undoing is not yet implemented. */
type GameMode = "versus" | "royale" | "practice";
/** Topout: Player tops themself out. Garbage smash: Player received garbage that causes them to top out. Winner: Player wins (does not die) */
type GameOverReason = "topout" | "garbagesmash" | "winner";
interface Options {
version: number;
seed_random: boolean;
seed: number;
g: number;
stock: number;
countdown: boolean;
countdown_count: number;
countdown_interval: number;
precountdown: number;
prestart: number;
mission: string;
mission_type: string;
zoominto: string;
slot_counter1: string;
slot_counter2: string;
slot_counter3: string;
slot_counter5: string;
slot_bar1: string;
display_fire: boolean;
display_username: boolean;
hasgarbage: boolean;
bgmnoreset: boolean;
neverstopbgm: boolean;
display_next: boolean;
display_hold: boolean;
infinite_hold: boolean;
gmargin: number;
gincrease: number;
garbagemultiplier: number;
garbagemargin: number;
garbageincrease: number;
garbagecap: number;
garbagecapincrease: number;
garbagecapmargin: number;
garbagecapmax: number;
garbageabsolutecap: boolean;
garbageholesize: number;
garbagephase: number;
garbagequeue: boolean;
garbageare: number;
garbageentry: GarbageEntry;
garbageblocking: GarbageBlocking;
garbagetargetbonus: GarbageTargetBonus;
garbagespecialbonus: boolean;
presets: Preset;
bagtype: BagType;
spinbonuses: SpinBonuses;
combotable: ComboTable;
kickset: KickTable;
nextcount: number;
allow_harddrop: boolean;
display_shadow: boolean;
locktime: number;
garbagespeed: number;
forfeit_time: number;
are: number;
lineclear_are: number;
infinitemovement: boolean;
lockresets: number;
allow180: boolean;
objective: {
type: string;
};
room_handling: boolean;
room_handling_arr: number;
room_handling_das: number;
room_handling_sdf: number;
manual_allowed: boolean;
b2bchaining: boolean;
allclears: boolean;
clutch: boolean;
nolockout: boolean;
passthrough: Passthrough;
can_undo: boolean;
can_retry: boolean;
retryisclear: boolean;
noextrawidth: boolean;
stride: boolean;
boardwidth: number;
boardheight: number;
new_payback: boolean;
messiness_change: number;
messiness_inner: number;
messiness_nosame: boolean;
messiness_timeout: number;
}
interface ReadyOptions {
version: number;
seed: number;
seed_random: boolean;
are: number;
lineclear_are: number;
g: number;
gincrease: number;
gmargin: number;
gravitymay20g: boolean;
shielded: boolean;
hasgarbage: boolean;
usebombs: boolean;
garbagespeed: number;
garbagefavor: number;
garbagemultiplier: number;
receivemultiplier: number;
garbagemargin: number;
garbageincrease: number;
garbageholesize: number;
garbagephase: number;
garbagequeue: boolean;
garbageentry: GarbageEntry;
garbageare: number;
garbagecap: number;
garbagecapincrease: number;
garbagecapmargin: number;
garbagecapmax: number;
garbageabsolutecap: number;
garbageattackcap: number;
garbagetargetbonus: GarbageTargetBonus;
garbageblocking: GarbageBlocking;
garbagespecialbonus: boolean;
passthrough: Passthrough;
openerphase: number;
roundmode: RoundingMode;
spinbonuses: SpinBonuses;
combotable: ComboTable;
kickset: KickTable;
bagtype: BagType;
messiness_change: number;
messiness_inner: number;
messiness_center?: boolean;
messiness_nosame: boolean;
messiness_timeout: number;
b2bchaining: boolean;
b2bcharging: boolean;
b2bextras: boolean;
b2bcharge_at: number;
b2bcharge_base: number;
allclears: boolean;
allclear_garbage: number;
allclear_b2b: number;
allclear_b2b_sends: boolean;
allclear_b2b_dupes: boolean;
allclear_charges: boolean;
allow_harddrop: boolean;
allow180: boolean;
infinite_hold: boolean;
infinite_movement: boolean;
nextcount: number;
clutch: boolean;
no_szo: boolean;
nolockout: boolean;
manual_allowed: boolean;
new_payback: boolean;
can_undo: boolean;
boardwidth: number;
boardheight: number;
boardbuffer: number;
stock: number;
infinite_stock: boolean;
locktime: number;
lockresets: number;
prestart: number;
precountdown: number;
countdown: boolean;
countdown_count: number;
countdown_interval: number;
inverted: boolean;
mission: string;
mission_type: string;
no_mission_sound: boolean;
objective_type: string;
objective_count: number;
objective_time: number;
objective_result: string;
zoominto: string;
noextrawidth: boolean;
stride: boolean;
pro: boolean;
pro_alert: boolean;
pro_retry: boolean;
can_retry: boolean;
slot_counter1: string;
slot_counter2: string;
slot_counter3: string;
slot_counter4: string;
slot_counter5: string;
slot_bar1: string;
slot_bar2: string;
absolute_lines: boolean;
display_zen: boolean;
display_username: boolean;
display_fire: boolean;
display_replay: boolean;
display_next: boolean;
display_hold: boolean;
display_shadow: boolean;
levels: boolean;
masterlevels: boolean;
startinglevel: number;
levelspeed: number;
levelstatic: boolean;
levelstaticspeed: number;
levelgbase: number;
levelgspeed: number;
minoskin: {
z: string;
l: string;
o: string;
s: string;
i: string;
j: string;
t: string;
other: string;
ghost: string;
};
boardskin: string;
map: string;
handling: Handling;
room_handling: boolean;
room_handling_arr: number;
room_handling_das: number;
room_handling_sdf: number;
noreplay: boolean;
nosound: boolean;
bgmnoreset: boolean;
neverstopbgm: boolean;
song: string;
survivalmode: string;
survival_messiness: number;
survival_layer_amt: number;
survival_layer_non: boolean;
survival_layer_min: number;
survival_timer_itv: number;
survival_cap: number;
usezenconfig: boolean;
zenlevels: boolean;
zenlevel: number;
zenprogress: number;
nosiren: boolean;
anchorseed: boolean;
forfeit_time: number;
username: string;
latencymode: string;
fulloffset: number;
fullinterval: number;
fromretry: boolean;
retryisclear: boolean;
topoutisclear: boolean;
zenith: boolean;
zenith_expert: boolean;
zenith_doublehole: boolean;
zenith_volatile: boolean;
zenith_gravity: boolean;
zenith_messy: boolean;
zenith_invisible: boolean;
zenith_allspin: boolean;
zenith_duo: boolean;
zenith_mods: any[];
zenith_ally: any[];
zenith_allyexpert: boolean;
TEMP_zenith_rng: boolean;
TEMP_zenith_grace: string;
}
interface Ready {
players: {
gameid: number;
userid: string;
options: ReadyOptions;
alive: boolean;
naturalorder: number;
}[];
isNew: boolean;
}
namespace IGEs {
type all = Target | AllowTargeting | Interaction | KEV;
interface Target {
type: "target";
data: {
targets: number[];
};
}
interface AllowTargeting {
type: "allow_targeting";
data: {
value: boolean;
};
}
namespace Interactions {
type all = Garbage | Targeted;
interface Garbage {
type: "garbage";
frame: number;
gameid: number;
iid: number;
cid: number;
ackiid: number;
amt: number;
x: number;
y: number;
size: number;
zthalt?: any;
}
interface Targeted {
type: "targeted";
value: boolean;
}
}
interface Interaction {
type: "interaction" | "interaction_confirm";
data: Interactions.all;
}
interface KEV {
type: "kev";
data: {
victim: {
gameid: number;
};
killer: {
gameid: number;
};
fire: number;
};
}
}
interface IGEBase {
id: number;
frame: number;
}
type IGE = IGEBase & IGEs.all;
interface Leaderboard {
id: string;
username: string;
active: boolean;
naturalorder: number;
shadows: any[];
shadowedBy: (null | any)[];
wins: number;
stats: {
apm: number | null;
pps: number | null;
vsscore: number | null;
garbagesent: number;
garbagereceived: number;
kills: number;
altitude: number;
rank: number;
targetingfactor: number;
targetinggrace: number;
btb: number;
revives: number;
escapeartist: number;
blockrationing_app: number;
blockrationing_final: number;
};
}
type Key = "moveLeft" | "moveRight" | "rotateCW" | "rotateCCW" | "rotate180" | "softDrop" | "hardDrop" | "hold";
namespace Replay {
namespace Frames {
type all = Start | Full | IGE | Keypress | End | Strategy | ManualTarget;
interface Start {
type: "start";
data: {};
}
interface Full {
type: "full";
data: {
game: {
board: BoardSquare[][];
bag: Mino[];
hold: {
piece: null | Mino;
locked: boolean;
};
g: number;
controlling: {
lShift: {
held: boolean;
arr: number;
das: number;
dir: -1;
};
rShift: {
held: boolean;
arr: number;
das: number;
dir: 1;
};
lastshift: 1 | -1;
inputSoftdrop: boolean;
};
falling: {
type: Mino;
x: number;
y: number;
r: number;
hy: number;
irs: number;
kick: number;
keys: number;
flags: number;
safelock: number;
locking: number;
lockresets: number;
rotresets: number;
skip: number[];
};
handling: Handling;
playing: boolean;
};
stats: {
lines: number;
level_lines: number;
level_lines_needed: number;
inputs: number;
holds: number;
score: number;
zenlevel: number;
zenprogress: number;
level: number;
combo: number;
topcombo: number;
combopower: number;
btb: number;
topbtb: number;
btbpower: number;
tspins: number;
piecesplaced: number;
clears: {
singles: number;
doubles: number;
triples: number;
quads: number;
pentas: number;
realtspins: number;
minitspins: number;
minitspinsingles: number;
tspinsingles: number;
minitspindoubles: number;
tspindoubles: number;
minitspintriples: number;
tspintriples: number;
minitspinquads: number;
tspinquads: number;
tspinpentas: number;
allclear: number;
};
garbage: {
sent: number;
sent_nomult: number;
maxspike: number;
maxspike_nomult: number;
received: number;
attack: number;
cleared: number;
};
kills: number;
finesse: {
combo: number;
faults: number;
perfectpieces: number;
};
zenith: {
altitude: number;
rank: number;
peakrank: number;
avgrankpts: number;
floor: number;
targetingfactor: number;
targetinggrace: number;
totalbonus: number;
revives: number;
revivesTotal: number;
revivesMaxOfBoth: number;
speedrun: boolean;
speedrun_seen: boolean;
splits: number[];
};
};
diyusi: number;
};
}
interface IGE {
type: "ige";
data: IGEs.all;
}
interface Keypress {
type: "keydown" | "keyup";
data: {
key: Key;
subframe: number;
hoisted?: boolean;
};
}
interface End {
type: "end";
data: any;
}
interface Strategy {
type: "strategy";
/** Even, Eliminations, Random, and Payback (0, 1, 2, 3) */
data: 0 | 1 | 2 | 3;
}
interface ManualTarget {
type: "manual_target";
data: number;
}
}
type Frame = Frames.all & {
frame: number;
};
}
type Mino = "s" | "z" | "j" | "l" | "i" | "t" | "o";
type BoardSquare = Mino | "gb" | null;
namespace Client {
type Event = Garbage | Frameset;
/** @deprecated */
type Events = Event;
interface Frameset {
type: "frameset";
provisioned: number;
frames: Game.Replay.Frame[];
}
interface Garbage {
type: "garbage";
frame: number;
amount: number;
size: number;
column: number;
}
}
type Target = {
strategy: "even" | "elims" | "random" | "payback";
} | {
strategy: "manual";
target: number;
};
namespace Tick {
interface In {
gameid: number;
frame: number;
events: Client.Events[];
engine: Engine;
}
interface Keypress {
type: "keydown" | "keyup";
frame: number;
data: {
key: Key;
/** The 1-digit decimal part of the frame (`.0 | .1 | .2 | .3 | .4 | .5 | .6 | .7 | .8 | .9`) */
subframe: number;
};
}
interface Out {
keys?: Keypress[];
runAfter?: (() => void)[];
}
type Func = (data: In) => Promise<Out> | Out;
}
}
//# sourceMappingURL=game.d.ts.map