ygocore-interface
Version:
[WIP] ygocore interface (message definitions, constants, api signatures)
1,951 lines (1,808 loc) • 97.1 kB
text/typescript
export type Optional<T> = T | undefined;
class BufferReader {
constructor(
private buffer: Buffer,
private off: number = 0
) { }
nextI8() {
return this.buffer.readInt8(this.off++);
}
nextU8() {
return this.buffer.readUInt8(this.off++);
}
nextI16() {
return this.buffer.readInt16LE((this.off += 2) - 2);
}
nextU16() {
return this.buffer.readUInt16LE((this.off += 2) - 2);
}
nextI32() {
return this.buffer.readInt32LE((this.off += 4) - 4);
}
nextU32() {
return this.buffer.readUInt32LE((this.off += 4) - 4);
}
finished() {
return this.off >= this.buffer.length;
}
}
export interface MsgRetry {
msgtype: 'MSG_RETRY';
}
export interface MsgHint {
msgtype: 'MSG_HINT';
type: number;
player: number;
data: number;
}
export interface MsgWin {
msgtype: 'MSG_WIN';
player: number;
type: number;
}
export interface MsgWaiting {
msgtype: 'MSG_WAITING';
}
export interface MsgStart {
msgtype: 'MSG_START';
player_type: number;
start_lp: Array<number>;
deck_count: Array<{
main_deck: number;
extra_deck: number;
}>;
}
export interface MsgUpdateData {
msgtype: 'MSG_UPDATE_DATA';
player: number;
location: number;
cards: Array<{
query_flag: number;
code: Optional<number>;
info: Optional<{
controller: number;
location: number;
position: number;
sequence: number;
}>;
alias: Optional<number>;
type: Optional<number>;
level: Optional<number>;
rank: Optional<number>;
attribute: Optional<number>;
race: Optional<number>;
attack: Optional<number>;
defense: Optional<number>;
base_attack: Optional<number>;
base_defense: Optional<number>;
reason: Optional<number>;
reason_card: Optional<{
controller: number;
location: number;
position: number;
sequence: number;
}>;
equip_card: Optional<{
controller: number;
location: number;
position: number;
sequence: number;
}>;
target_cards: Array<{
controller: number;
location: number;
position: number;
sequence: number;
}>;
overlay_cards: Array<number>;
counters: Array<{
type: number;
count: number;
}>;
owner: Optional<number>;
status: Optional<number>;
lscale: Optional<number>;
rscale: Optional<number>;
link: Optional<number>;
link_marker: Optional<number>;
}>;
}
export interface MsgUpdateCard {
msgtype: 'MSG_UPDATE_CARD';
player: number;
location: number;
sequence: number;
query_flag: number;
code: Optional<number>;
alias: Optional<number>;
info: Optional<{
controller: number;
location: number;
position: number;
sequence: number;
}>;
type: Optional<number>;
level: Optional<number>;
rank: Optional<number>;
attribute: Optional<number>;
race: Optional<number>;
attack: Optional<number>;
defense: Optional<number>;
base_attack: Optional<number>;
base_defense: Optional<number>;
reason: Optional<number>;
reason_card: Optional<{
controller: number;
location: number;
position: number;
sequence: number;
}>;
equip_card: Optional<{
controller: number;
location: number;
position: number;
sequence: number;
}>;
target_cards: Array<{
controller: number;
location: number;
position: number;
sequence: number;
}>;
overlay_cards: Array<number>;
counters: Array<{
type: number;
count: number;
}>;
owner: Optional<number>;
status: Optional<number>;
lscale: Optional<number>;
rscale: Optional<number>;
link: Optional<number>;
link_marker: Optional<number>;
}
export interface MsgSelectBattleCmd {
msgtype: 'MSG_SELECT_BATTLECMD';
player: number;
activatable: Array<{
code_and_flags: number;
controller: number;
location: number;
sequence: number;
description: number;
}>;
attackable: Array<{
code: number;
controller: number;
location: number;
sequence: number;
directly: number;
}>;
to_main_phase2: number;
to_end_phase: number;
}
export interface MsgSelectIdleCmd {
msgtype: 'MSG_SELECT_IDLECMD';
player: number;
summonables: Array<{
code: number;
controller: number;
location: number;
sequence: number;
}>;
special_summonables: Array<{
code: number;
controller: number;
location: number;
sequence: number;
}>;
reposables: Array<{
code: number;
controller: number;
location: number;
sequence: number;
}>;
setable_monsters: Array<{
code: number;
controller: number;
location: number;
sequence: number;
}>;
setable_spells: Array<{
code: number;
controller: number;
location: number;
sequence: number;
}>;
activatables: Array<{
code: number;
controller: number;
location: number;
sequence: number;
description: number;
}>;
to_battle_phase: number;
to_end_phase: number;
shuffle_hand: number;
}
export interface MsgSelectEffectyn {
msgtype: 'MSG_SELECT_EFFECTYN';
player: number;
code: number;
controller: number;
location: number;
sequence: number;
ignore: number;
desc: number;
}
export interface MsgSelectYesno {
msgtype: 'MSG_SELECT_YESNO';
player: number;
desc: number;
}
export interface MsgSelectOption {
msgtype: 'MSG_SELECT_OPTION';
player: number;
options: Array<number>;
}
export interface MsgSelectCard {
msgtype: 'MSG_SELECT_CARD';
player: number;
non_cancelable: number;
range: {
minimal: number;
maximal: number;
};
selections: Array<{
code: number;
controller: number;
location: number;
sequence: number;
subsequence: number;
}>;
}
export interface MsgSelectUnselectCard {
msgtype: 'MSG_SELECT_UNSELECT_CARD';
player: number;
should_continue: number;
non_cancelable: number;
range: {
minimal: number;
maximal: number;
};
not_selected: Array<{
code: number;
controller: number;
location: number;
sequence: number;
subsequence: number;
}>;
selected: Array<{
code: number;
controller: number;
location: number;
sequence: number;
subsequence: number;
}>;
}
export interface MsgSelectChain {
msgtype: 'MSG_SELECT_CHAIN';
player: number;
c1: number;
spe_count: number;
forced: number;
hint0: number;
hint1: number;
activatables: Array<{
flag: number;
code: number;
controller: number;
location: number;
sequence: number;
subsequence: number;
desc: number;
}>;
}
export interface MsgSelectPlace {
msgtype: 'MSG_SELECT_PLACE';
player: number;
minimal_selection: number;
pattern: number;
}
export interface MsgSelectDisfield {
msgtype: 'MSG_SELECT_DISFIELD';
player: number;
minimal_selection: number;
pattern: number;
}
export interface MsgSelectPosition {
msgtype: 'MSG_SELECT_POSITION';
player: number;
code: number;
positions: number;
}
export interface MsgSelectTribute {
msgtype: 'MSG_SELECT_TRIBUTE';
player: number;
non_cancelable: number;
range: {
minimal: number;
maximal: number;
};
selections: Array<{
code: number;
controller: number;
location: number;
sequence: number;
operation_param: number;
}>;
}
export interface MsgSelectCounter {
msgtype: 'MSG_SELECT_COUNTER';
player: number;
type: number;
count: number;
selections: Array<{
code: number;
controller: number;
location: number;
sequence: number;
operation_param: number;
}>;
}
export interface MsgSelectSum {
msgtype: 'MSG_SELECT_SUM';
select_mode: number;
player: number;
sum_up_to: number;
range: {
minimal: number;
maximal: number;
};
includes: Array<{
code: number;
controller: number;
location: number;
sequence: number;
value: number;
}>;
optionals: Array<{
code: number;
controller: number;
location: number;
sequence: number;
value: number;
}>;
}
export interface MsgSortCard {
msgtype: 'MSG_SORT_CARD';
player: number;
selection: Array<{
code: number;
controller: number;
location: number;
sequence: number;
}>;
}
export interface MsgSortChain {
msgtype: 'MSG_SORT_CHAIN';
player: number;
selection: Array<{
code: number;
controller: number;
location: number;
sequence: number;
}>;
}
export interface MsgConfirmDeckTop {
msgtype: 'MSG_CONFIRM_DECKTOP';
player: number;
cards: Array<{
code: number;
controller: number;
location: number;
sequence: number;
}>;
}
export interface MsgConfirmExtratop {
msgtype: 'MSG_CONFIRM_EXTRATOP';
player: number;
cards: Array<{
code: number;
controller: number;
location: number;
sequence: number;
}>;
}
export interface MsgConfirmCards {
msgtype: 'MSG_CONFIRM_CARDS';
player: number;
cards: Array<{
code: number;
controller: number;
location: number;
sequence: number;
}>;
}
export interface MsgShuffleDeck {
msgtype: 'MSG_SHUFFLE_DECK';
player: number;
}
export interface MsgRefreshDeck {
msgtype: 'MSG_REFRESH_DECK';
player: number;
}
export interface MsgSwapGraveDeck {
msgtype: 'MSG_SWAP_GRAVE_DECK';
player: number;
}
export interface MsgNewTurn {
msgtype: 'MSG_NEW_TURN';
player: number;
}
export interface MsgShuffleHand {
msgtype: 'MSG_SHUFFLE_HAND';
player: number;
cards: Array<number>;
}
export interface MsgShuffleExtra {
msgtype: 'MSG_SHUFFLE_EXTRA';
player: number;
cards: Array<number>;
}
export interface MsgDraw {
msgtype: 'MSG_DRAW';
player: number;
cards: Array<number>;
}
export interface MsgReverseDeck {
msgtype: 'MSG_REVERSE_DECK';
}
export interface MsgDeckTop {
msgtype: 'MSG_DECK_TOP';
player: number;
sequence: number;
code: number;
}
export interface MsgShuffleSetCard {
msgtype: 'MSG_SHUFFLE_SET_CARD';
location: number;
c1: number;
pass1: Array<{
controller: number;
location: number;
sequence: number;
ignore: number;
}>;
pass2: Array<{
controller: number;
location: number;
sequence: number;
ignore: number;
}>;
}
export interface MsgNewPhase {
msgtype: 'MSG_NEW_PHASE';
phase: number;
}
export interface MsgMove {
msgtype: 'MSG_MOVE';
code: number;
previous: {
controller: number;
location: number;
sequence: number;
position: number;
};
current: {
controller: number;
location: number;
sequence: number;
position: number;
};
reason: number;
}
export interface MsgPosChange {
msgtype: 'MSG_POS_CHANGE';
code: number;
current_controller: number;
current_location: number;
current_sequence: number;
previous_position: number;
current_position: number;
}
export interface MsgSet {
msgtype: 'MSG_SET';
code: number;
controller: number;
location: number;
sequence: number;
position: number;
}
export interface MsgSwap {
msgtype: 'MSG_SWAP';
first: {
code: number;
controller: number;
location: number;
sequence: number;
position: number;
};
second: {
code: number;
controller: number;
location: number;
sequence: number;
position: number;
};
}
export interface MsgFieldDisabled {
msgtype: 'MSG_FIELD_DISABLED';
pattern: number;
}
export interface MsgSummoning {
msgtype: 'MSG_SUMMONING';
code: number;
controller: number;
location: number;
sequence: number;
position: number;
}
export interface MsgSpsummoning {
msgtype: 'MSG_SPSUMMONING';
code: number;
controller: number;
location: number;
sequence: number;
position: number;
}
export interface MsgFlipsummoning {
msgtype: 'MSG_FLIPSUMMONING';
code: number;
controller: number;
location: number;
sequence: number;
position: number;
}
export interface MsgSummoned {
msgtype: 'MSG_SUMMONED';
}
export interface MsgSpsummoned {
msgtype: 'MSG_SPSUMMONED';
}
export interface MsgFlipsummoned {
msgtype: 'MSG_FLIPSUMMONED';
}
export interface MsgChaining {
msgtype: 'MSG_CHAINING';
code: number;
previous_controller: number;
previous_location: number;
previous_sequence: number;
subsequence: number;
controller: number;
location: number;
sequence: number;
desc: number;
param: number;
}
export interface MsgChained {
msgtype: 'MSG_CHAINED';
param: number;
}
export interface MsgChainSolving {
msgtype: 'MSG_CHAIN_SOLVING';
param: number;
}
export interface MsgChainSolved {
msgtype: 'MSG_CHAIN_SOLVED';
param: number;
}
export interface MsgChainNegated {
msgtype: 'MSG_CHAIN_NEGATED';
param: number;
}
export interface MsgChainDisabled {
msgtype: 'MSG_CHAIN_DISABLED';
param: number;
}
export interface MsgChainEnd {
msgtype: 'MSG_CHAIN_END';
}
export interface MsgCardSelected {
msgtype: 'MSG_CARD_SELECTED';
}
export interface MsgBecomeTarget {
msgtype: 'MSG_BECOME_TARGET';
cards: Array<{
controller: number;
location: number;
sequence: number;
subsequence: number;
}>;
}
export interface MsgRandomSelected {
msgtype: 'MSG_RANDOM_SELECTED';
player: number;
cards: Array<{
controller: number;
location: number;
sequence: number;
subsequence: number;
}>;
}
export interface MsgDamage {
msgtype: 'MSG_DAMAGE';
player: number;
value: number;
}
export interface MsgRecover {
msgtype: 'MSG_RECOVER';
player: number;
value: number;
}
export interface MsgLpUpdate {
msgtype: 'MSG_LPUPDATE';
player: number;
value: number;
}
export interface MsgPayLpCost {
msgtype: 'MSG_PAY_LPCOST';
player: number;
value: number;
}
export interface MsgEquip {
msgtype: 'MSG_EQUIP';
card: {
controller: number;
location: number;
sequence: number;
ignore: number;
};
target: {
controller: number;
location: number;
sequence: number;
ignore: number;
};
}
export interface MsgCardTarget {
msgtype: 'MSG_CARD_TARGET';
card: {
controller: number;
location: number;
sequence: number;
ignore: number;
};
target: {
controller: number;
location: number;
sequence: number;
ignore: number;
};
}
export interface MsgCancelTarget {
msgtype: 'MSG_CANCEL_TARGET';
card: {
controller: number;
location: number;
sequence: number;
ignore: number;
};
target: {
controller: number;
location: number;
sequence: number;
ignore: number;
};
}
export interface MsgUnequip {
msgtype: 'MSG_UNEQUIP';
controller: number;
location: number;
sequence: number;
ignore: number;
}
export interface MsgAddCounter {
msgtype: 'MSG_ADD_COUNTER';
type: number;
controller: number;
location: number;
sequence: number;
count: number;
}
export interface MsgRemoveCounter {
msgtype: 'MSG_REMOVE_COUNTER';
type: number;
controller: number;
location: number;
sequence: number;
count: number;
}
export interface MsgAttack {
msgtype: 'MSG_ATTACK';
attacker: {
controller: number;
location: number;
sequence: number;
ignore: number;
};
defender: {
controller: number;
location: number;
sequence: number;
ignore: number;
};
}
export interface MsgBattle {
msgtype: 'MSG_BATTLE';
attacker: {
controller: number;
location: number;
sequence: number;
subsequence: number;
atkvalue: number;
defvalue: number;
ignore: number;
};
defender: {
controller: number;
location: number;
sequence: number;
subsequence: number;
atkvalue: number;
defvalue: number;
ignore: number;
};
}
export interface MsgAttackDisabled {
msgtype: 'MSG_ATTACK_DISABLED';
}
export interface MsgDamageStepStart {
msgtype: 'MSG_DAMAGE_STEP_START';
}
export interface MsgDamageStepEnd {
msgtype: 'MSG_DAMAGE_STEP_END';
}
export interface MsgMissedEffect {
msgtype: 'MSG_MISSED_EFFECT';
controller: number;
location: number;
sequence: number;
subsequence: number;
code: number;
}
export interface MsgTossCoin {
msgtype: 'MSG_TOSS_COIN';
player: number;
tosses: Array<number>;
}
export interface MsgTossDice {
msgtype: 'MSG_TOSS_DICE';
player: number;
tosses: Array<number>;
}
export interface MsgRockPaperScissors {
msgtype: 'MSG_ROCK_PAPER_SCISSORS';
player: number;
}
export interface MsgHandRes {
msgtype: 'MSG_HAND_RES';
result: number;
}
export interface MsgAnnounceRace {
msgtype: 'MSG_ANNOUNCE_RACE';
player: number;
count: number;
available: number;
}
export interface MsgAnnounceAttrib {
msgtype: 'MSG_ANNOUNCE_ATTRIB';
player: number;
count: number;
available: number;
}
export interface MsgAnnounceCard {
msgtype: 'MSG_ANNOUNCE_CARD';
player: number;
declarable_type: number;
}
export interface MsgAnnounceNumber {
msgtype: 'MSG_ANNOUNCE_NUMBER';
player: number;
announcements: Array<number>;
}
export interface MsgAnnounceCardFilter {
msgtype: 'MSG_ANNOUNCE_CARD_FILTER';
player: number;
announcements: Array<number>;
}
export interface MsgCardHint {
msgtype: 'MSG_CARD_HINT';
controller: number;
location: number;
sequence: number;
ignore: number;
chtype: number;
value: number;
}
export interface MsgPlayerHint {
msgtype: 'MSG_PLAYER_HINT';
player: number;
chtype: number;
value: number;
}
export interface MsgMatchKill {
msgtype: 'MSG_MATCH_KILL';
match_kill: number;
}
export interface MsgTagSwap {
msgtype: 'MSG_TAG_SWAP';
player: number;
m: number;
e: number;
p: number;
h: number;
}
export interface MsgReloadField {
msgtype: 'MSG_RELOAD_FIELD';
duel_rule: number;
players: Array<{
lp: number;
mzone_cards: Array<Optional<{
position: number;
xyz_count: number;
}>>;
card_positions: Array<Optional<number>>;
deck_count: number;
hand_count: number;
grave_count: number;
banish_count: number;
extra_count: number;
extra_pendu_count: number;
chains: Array<{
code: number;
previous_controller: number;
previous_location: number;
previous_sequence: number;
previous_subsequence: number;
current_controller: number;
current_location: number;
current_sequence: number;
desc: number;
}>;
}>;
}
/**
* message type
*/
export type Message = MsgRetry
| MsgHint
| MsgWin
| MsgWaiting
| MsgStart
| MsgUpdateData
| MsgUpdateCard
| MsgSelectBattleCmd
| MsgSelectIdleCmd
| MsgSelectEffectyn
| MsgSelectYesno
| MsgSelectOption
| MsgSelectCard
| MsgSelectUnselectCard
| MsgSelectChain
| MsgSelectPlace
| MsgSelectDisfield
| MsgSelectPosition
| MsgSelectTribute
| MsgSelectCounter
| MsgSelectSum
| MsgSortCard
| MsgSortChain
| MsgConfirmDeckTop
| MsgConfirmExtratop
| MsgConfirmCards
| MsgShuffleDeck
| MsgRefreshDeck
| MsgSwapGraveDeck
| MsgNewTurn
| MsgShuffleHand
| MsgShuffleExtra
| MsgDraw
| MsgReverseDeck
| MsgDeckTop
| MsgShuffleSetCard
| MsgNewPhase
| MsgMove
| MsgPosChange
| MsgSet
| MsgSwap
| MsgFieldDisabled
| MsgSummoning
| MsgSpsummoning
| MsgFlipsummoning
| MsgSummoned
| MsgSpsummoned
| MsgFlipsummoned
| MsgChaining
| MsgChained
| MsgChainSolving
| MsgChainSolved
| MsgChainNegated
| MsgChainDisabled
| MsgChainEnd
| MsgCardSelected
| MsgBecomeTarget
| MsgRandomSelected
| MsgDamage
| MsgRecover
| MsgLpUpdate
| MsgPayLpCost
| MsgEquip
| MsgCardTarget
| MsgCancelTarget
| MsgUnequip
| MsgAddCounter
| MsgRemoveCounter
| MsgAttack
| MsgBattle
| MsgAttackDisabled
| MsgDamageStepStart
| MsgDamageStepEnd
| MsgMissedEffect
| MsgTossCoin
| MsgTossDice
| MsgRockPaperScissors
| MsgHandRes
| MsgAnnounceRace
| MsgAnnounceAttrib
| MsgAnnounceCard
| MsgAnnounceNumber
| MsgAnnounceCardFilter
| MsgCardHint
| MsgPlayerHint
| MsgMatchKill
| MsgTagSwap
| MsgReloadField
;
/**
* parse bytes as MsgRetry (MSG_RETRY)
*/
function parseMsgRetry(_buffer: BufferReader): MsgRetry {
const result: any = { };
{ /* reading result (MsgRetry) */
}
result.msgtype = 'MSG_RETRY';
return result as MsgRetry;
}
/**
* parse bytes as MsgHint (MSG_HINT)
*/
function parseMsgHint(buffer: BufferReader): MsgHint {
const result: any = { };
{ /* reading result (MsgHint) */
result.type = buffer.nextI8();
result.player = buffer.nextU8();
result.data = buffer.nextI32();
}
result.msgtype = 'MSG_HINT';
return result as MsgHint;
}
/**
* parse bytes as MsgWin (MSG_WIN)
*/
function parseMsgWin(buffer: BufferReader): MsgWin {
const result: any = { };
{ /* reading result (MsgWin) */
result.player = buffer.nextU8();
result.type = buffer.nextI8();
}
result.msgtype = 'MSG_WIN';
return result as MsgWin;
}
/**
* parse bytes as MsgWaiting (MSG_WAITING)
*/
function parseMsgWaiting(_buffer: BufferReader): MsgWaiting {
const result: any = { };
{ /* reading result (MsgWaiting) */
}
result.msgtype = 'MSG_WAITING';
return result as MsgWaiting;
}
/**
* parse bytes as MsgStart (MSG_START)
*/
function parseMsgStart(buffer: BufferReader): MsgStart {
const result: any = { };
{ /* reading result (MsgStart) */
result.player_type = buffer.nextU8();
const start_lp: any[] = [];
for (let i = 0; i !== 2; ++i) {
const start_lp1 = buffer.nextI32();
start_lp.push(start_lp1);
}
result.start_lp = start_lp;
const deck_count: any[] = [];
for (let i = 0; i !== 2; ++i) {
const deck_count1: any = { };
{ /* reading deck_count1 (DeckCount) */
deck_count1.main_deck = buffer.nextI16();
deck_count1.extra_deck = buffer.nextI16();
}
deck_count.push(deck_count1);
}
result.deck_count = deck_count;
}
result.msgtype = 'MSG_START';
return result as MsgStart;
}
/**
* returned from `query_card()`
*/
export interface QueryCardChunk {
query_flag: number;
code: Optional<number>;
info: Optional<{
controller: number;
location: number;
position: number;
sequence: number;
}>;
alias: Optional<number>;
type: Optional<number>;
level: Optional<number>;
rank: Optional<number>;
attribute: Optional<number>;
race: Optional<number>;
attack: Optional<number>;
defense: Optional<number>;
base_attack: Optional<number>;
base_defense: Optional<number>;
reason: Optional<number>;
reason_card: Optional<{
controller: number;
location: number;
position: number;
sequence: number;
}>;
equip_card: Optional<{
controller: number;
location: number;
position: number;
sequence: number;
}>;
target_cards: Array<{
controller: number;
location: number;
position: number;
sequence: number;
}>;
overlay_cards: Array<number>;
counters: Array<{
type: number;
count: number;
}>;
owner: Optional<number>;
status: Optional<number>;
lscale: Optional<number>;
rscale: Optional<number>;
link: Optional<number>;
link_marker: Optional<number>;
}
/* */
function parseInfoLocation(buffer: BufferReader): any {
const info: any = { };
info.controller = buffer.nextU8();
info.location = buffer.nextU8();
info.sequence = buffer.nextU8();
info.position = buffer.nextU8();
return info;
}
function parseInfoLocations(buffer: BufferReader): any {
const many: any[] = [];
const count = buffer.nextU32();
for (let i = 0; i !== count; ++i) {
many.push(parseInfoLocation(buffer));
}
return many;
}
function parseChunks(buffer: BufferReader): any[] {
const chunks: any[] = [];
while (!buffer.finished()) {
const bytes = buffer.nextU32();
if (bytes === 4) continue;
const chunk: any = { };
const flags = buffer.nextU32();
chunk.query_flag = flags;
if (flags & QUERY.CODE) chunk.code = buffer.nextU32();
if (flags & QUERY.POSITION) chunk.info = parseInfoLocation(buffer);
if (flags & QUERY.ALIAS) chunk.alias = buffer.nextU32();
if (flags & QUERY.TYPE) chunk.type = buffer.nextU32();
if (flags & QUERY.LEVEL) chunk.level = buffer.nextU32();
if (flags & QUERY.RANK) chunk.rank = buffer.nextU32();
if (flags & QUERY.ATTRIBUTE) chunk.attribute = buffer.nextU32();
if (flags & QUERY.RACE) chunk.race = buffer.nextU32();
if (flags & QUERY.ATTACK) chunk.attack = buffer.nextI32();
if (flags & QUERY.DEFENSE) chunk.defense = buffer.nextI32();
if (flags & QUERY.BASE_ATTACK) chunk.base_attack = buffer.nextI32();
if (flags & QUERY.BASE_DEFENSE) chunk.base_defense = buffer.nextI32();
if (flags & QUERY.REASON) chunk.reason = buffer.nextI32();
if (flags & QUERY.REASON_CARD) chunk.reason_card = parseInfoLocation(buffer);
if (flags & QUERY.EQUIP_CARD) chunk.equip_card = parseInfoLocation(buffer);
if (flags & QUERY.TARGET_CARD) chunk.target_cards = parseInfoLocations(buffer);
if (flags & QUERY.OVERLAY_CARD) {
const count = buffer.nextU32();
for (let i = 0; i !== count; ++i) chunk.overlay_cards.push(buffer.nextU32());
}
if (flags & QUERY.COUNTERS) {
const count = buffer.nextU32();
for (let i = 0; i !== count; ++i) {
const type = buffer.nextU16();
const count = buffer.nextU16();
chunk.counters.push({ type, count });
}
}
if (flags & QUERY.OWNER) chunk.owner = buffer.nextU32();
if (flags & QUERY.STATUS) chunk.status = buffer.nextU32();
if (flags & QUERY.LSCALE) chunk.lscale = buffer.nextU32();
if (flags & QUERY.RSCALE) chunk.rscale = buffer.nextU32();
if (flags & QUERY.LINK) chunk.link = buffer.nextU32();
if (flags & QUERY.LINK) chunk.link_marker = buffer.nextU32();
chunks.push(chunk);
}
return chunks;
}
/**
* MSG_UPDATE_DATA
*/
function parseMsgUpdateData(buffer: BufferReader): MsgUpdateData {
const result: any = { };
result.msgtype = 'MSG_UPDATE_DATA';
result.player = buffer.nextU8();
result.location = buffer.nextU8();
result.cards = parseChunks(buffer);
return result as MsgUpdateData;
}
export function parseFieldCardQueryResult(buffer: Buffer): QueryCardChunk[] {
return parseChunks(new BufferReader(buffer)) as QueryCardChunk[];
}
/**
* MSG_UPDATE_CARD
*/
function parseMsgUpdateCard(buffer: BufferReader): MsgUpdateCard {
const result: any = { };
result.msgtype = 'MSG_UPDATE_CARD';
result.player = buffer.nextU8();
result.location = buffer.nextU8();
result.sequence = buffer.nextU8();
const chunk = parseChunks(buffer);
return { ...result, ...chunk[0] } as MsgUpdateCard;
}
export function parseCardQueryResult(buffer: Buffer): QueryCardChunk {
return parseChunks(new BufferReader(buffer))[0] as QueryCardChunk;
}
/**
* parse bytes as MsgSelectBattleCmd (MSG_SELECT_BATTLECMD)
*/
function parseMsgSelectBattleCmd(buffer: BufferReader): MsgSelectBattleCmd {
const result: any = { };
{ /* reading result (MsgSelectBattleCmd) */
result.player = buffer.nextU8();
const activatable: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const activatable1: any = { };
{ /* reading activatable1 (Activatable) */
activatable1.code_and_flags = buffer.nextU32();
activatable1.controller = buffer.nextU8();
activatable1.location = buffer.nextU8();
activatable1.sequence = buffer.nextU8();
activatable1.description = buffer.nextI32();
}
activatable.push(activatable1)
}
result.activatable = activatable;
const attackable: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const attackable1: any = { };
{ /* reading attackable1 (Attackable) */
attackable1.code = buffer.nextU32();
attackable1.controller = buffer.nextU8();
attackable1.location = buffer.nextU8();
attackable1.sequence = buffer.nextU8();
attackable1.directly = buffer.nextI8();
}
attackable.push(attackable1)
}
result.attackable = attackable;
result.to_main_phase2 = buffer.nextI8();
result.to_end_phase = buffer.nextI8();
}
result.msgtype = 'MSG_SELECT_BATTLECMD';
return result as MsgSelectBattleCmd;
}
/**
* parse bytes as MsgSelectIdleCmd (MSG_SELECT_IDLECMD)
*/
function parseMsgSelectIdleCmd(buffer: BufferReader): MsgSelectIdleCmd {
const result: any = { };
{ /* reading result (MsgSelectIdleCmd) */
result.player = buffer.nextU8();
const summonables: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const summonables1: any = { };
{ /* reading summonables1 (IdleCommandSelection) */
summonables1.code = buffer.nextU32();
summonables1.controller = buffer.nextU8();
summonables1.location = buffer.nextU8();
summonables1.sequence = buffer.nextU8();
}
summonables.push(summonables1)
}
result.summonables = summonables;
const special_summonables: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const special_summonables1: any = { };
{ /* reading special_summonables1 (IdleCommandSelection) */
special_summonables1.code = buffer.nextU32();
special_summonables1.controller = buffer.nextU8();
special_summonables1.location = buffer.nextU8();
special_summonables1.sequence = buffer.nextU8();
}
special_summonables.push(special_summonables1)
}
result.special_summonables = special_summonables;
const reposables: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const reposables1: any = { };
{ /* reading reposables1 (IdleCommandSelection) */
reposables1.code = buffer.nextU32();
reposables1.controller = buffer.nextU8();
reposables1.location = buffer.nextU8();
reposables1.sequence = buffer.nextU8();
}
reposables.push(reposables1)
}
result.reposables = reposables;
const setable_monsters: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const setable_monsters1: any = { };
{ /* reading setable_monsters1 (IdleCommandSelection) */
setable_monsters1.code = buffer.nextU32();
setable_monsters1.controller = buffer.nextU8();
setable_monsters1.location = buffer.nextU8();
setable_monsters1.sequence = buffer.nextU8();
}
setable_monsters.push(setable_monsters1)
}
result.setable_monsters = setable_monsters;
const setable_spells: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const setable_spells1: any = { };
{ /* reading setable_spells1 (IdleCommandSelection) */
setable_spells1.code = buffer.nextU32();
setable_spells1.controller = buffer.nextU8();
setable_spells1.location = buffer.nextU8();
setable_spells1.sequence = buffer.nextU8();
}
setable_spells.push(setable_spells1)
}
result.setable_spells = setable_spells;
const activatables: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const activatables1: any = { };
{ /* reading activatables1 (Activatable) */
activatables1.code = buffer.nextU32();
activatables1.controller = buffer.nextU8();
activatables1.location = buffer.nextU8();
activatables1.sequence = buffer.nextU8();
activatables1.description = buffer.nextI32();
}
activatables.push(activatables1)
}
result.activatables = activatables;
result.to_battle_phase = buffer.nextI8();
result.to_end_phase = buffer.nextI8();
result.shuffle_hand = buffer.nextI8();
}
result.msgtype = 'MSG_SELECT_IDLECMD';
return result as MsgSelectIdleCmd;
}
/**
* parse bytes as MsgSelectEffectyn (MSG_SELECT_EFFECTYN)
*/
function parseMsgSelectEffectyn(buffer: BufferReader): MsgSelectEffectyn {
const result: any = { };
{ /* reading result (MsgSelectEffectyn) */
result.player = buffer.nextU8();
result.code = buffer.nextU32();
result.controller = buffer.nextU8();
result.location = buffer.nextU8();
result.sequence = buffer.nextU8();
result.ignore = buffer.nextI8();
result.desc = buffer.nextI32();
}
result.msgtype = 'MSG_SELECT_EFFECTYN';
return result as MsgSelectEffectyn;
}
/**
* parse bytes as MsgSelectYesno (MSG_SELECT_YESNO)
*/
function parseMsgSelectYesno(buffer: BufferReader): MsgSelectYesno {
const result: any = { };
{ /* reading result (MsgSelectYesno) */
result.player = buffer.nextU8();
result.desc = buffer.nextI32();
}
result.msgtype = 'MSG_SELECT_YESNO';
return result as MsgSelectYesno;
}
/**
* parse bytes as MsgSelectOption (MSG_SELECT_OPTION)
*/
function parseMsgSelectOption(buffer: BufferReader): MsgSelectOption {
const result: any = { };
{ /* reading result (MsgSelectOption) */
result.player = buffer.nextU8();
const options: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const options1 = buffer.nextI32();
options.push(options1)
}
result.options = options;
}
result.msgtype = 'MSG_SELECT_OPTION';
return result as MsgSelectOption;
}
/**
* parse bytes as MsgSelectCard (MSG_SELECT_CARD)
*/
function parseMsgSelectCard(buffer: BufferReader): MsgSelectCard {
const result: any = { };
{ /* reading result (MsgSelectCard) */
result.player = buffer.nextU8();
result.non_cancelable = buffer.nextI8();
const range: any = { };
{ /* reading range (Range) */
range.minimal = buffer.nextI8();
range.maximal = buffer.nextI8();
}
result.range = range;
const selections: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const selections1: any = { };
{ /* reading selections1 (Selection) */
selections1.code = buffer.nextU32();
selections1.controller = buffer.nextU8();
selections1.location = buffer.nextU8();
selections1.sequence = buffer.nextU8();
selections1.subsequence = buffer.nextU8();
}
selections.push(selections1)
}
result.selections = selections;
}
result.msgtype = 'MSG_SELECT_CARD';
return result as MsgSelectCard;
}
/**
* parse bytes as MsgSelectUnselectCard (MSG_SELECT_UNSELECT_CARD)
*/
function parseMsgSelectUnselectCard(buffer: BufferReader): MsgSelectUnselectCard {
const result: any = { };
{ /* reading result (MsgSelectUnselectCard) */
result.player = buffer.nextU8();
result.should_continue = buffer.nextI8();
result.non_cancelable = buffer.nextI8();
const range: any = { };
{ /* reading range (Range) */
range.minimal = buffer.nextI8();
range.maximal = buffer.nextI8();
}
result.range = range;
const not_selected: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const not_selected1: any = { };
{ /* reading not_selected1 (Selection) */
not_selected1.code = buffer.nextU32();
not_selected1.controller = buffer.nextU8();
not_selected1.location = buffer.nextU8();
not_selected1.sequence = buffer.nextU8();
not_selected1.subsequence = buffer.nextU8();
}
not_selected.push(not_selected1)
}
result.not_selected = not_selected;
const selected: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const selected1: any = { };
{ /* reading selected1 (Selection) */
selected1.code = buffer.nextU32();
selected1.controller = buffer.nextU8();
selected1.location = buffer.nextU8();
selected1.sequence = buffer.nextU8();
selected1.subsequence = buffer.nextU8();
}
selected.push(selected1)
}
result.selected = selected;
}
result.msgtype = 'MSG_SELECT_UNSELECT_CARD';
return result as MsgSelectUnselectCard;
}
/**
* parse bytes as MsgSelectChain (MSG_SELECT_CHAIN)
*/
function parseMsgSelectChain(buffer: BufferReader): MsgSelectChain {
const result: any = { };
{ /* reading result (MsgSelectChain) */
result.player = buffer.nextU8();
const c1 = buffer.nextI8();
/* c1: hidden */
result.spe_count = buffer.nextI8();
result.forced = buffer.nextI8();
result.hint0 = buffer.nextI32();
result.hint1 = buffer.nextI32();
const activatables: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = c1; i !== n; ++i) {
const activatables1: any = { };
{ /* reading activatables1 (Activatable) */
activatables1.flag = buffer.nextI8();
activatables1.code = buffer.nextU32();
activatables1.controller = buffer.nextU8();
activatables1.location = buffer.nextU8();
activatables1.sequence = buffer.nextU8();
activatables1.subsequence = buffer.nextU8();
activatables1.desc = buffer.nextI32();
}
activatables.push(activatables1)
}
result.activatables = activatables;
}
result.msgtype = 'MSG_SELECT_CHAIN';
return result as MsgSelectChain;
}
/**
* parse bytes as MsgSelectPlace (MSG_SELECT_PLACE)
*/
function parseMsgSelectPlace(buffer: BufferReader): MsgSelectPlace {
const result: any = { };
{ /* reading result (MsgSelectPlace) */
result.player = buffer.nextU8();
result.minimal_selection = buffer.nextI8();
result.pattern = buffer.nextU32();
}
result.msgtype = 'MSG_SELECT_PLACE';
return result as MsgSelectPlace;
}
/**
* parse bytes as MsgSelectDisfield (MSG_SELECT_DISFIELD)
*/
function parseMsgSelectDisfield(buffer: BufferReader): MsgSelectDisfield {
const result: any = { };
{ /* reading result (MsgSelectDisfield) */
result.player = buffer.nextU8();
result.minimal_selection = buffer.nextI8();
result.pattern = buffer.nextU32();
}
result.msgtype = 'MSG_SELECT_DISFIELD';
return result as MsgSelectDisfield;
}
/**
* parse bytes as MsgSelectPosition (MSG_SELECT_POSITION)
*/
function parseMsgSelectPosition(buffer: BufferReader): MsgSelectPosition {
const result: any = { };
{ /* reading result (MsgSelectPosition) */
result.player = buffer.nextU8();
result.code = buffer.nextU32();
result.positions = buffer.nextU8();
}
result.msgtype = 'MSG_SELECT_POSITION';
return result as MsgSelectPosition;
}
/**
* parse bytes as MsgSelectTribute (MSG_SELECT_TRIBUTE)
*/
function parseMsgSelectTribute(buffer: BufferReader): MsgSelectTribute {
const result: any = { };
{ /* reading result (MsgSelectTribute) */
result.player = buffer.nextU8();
result.non_cancelable = buffer.nextI8();
const range: any = { };
{ /* reading range (Range) */
range.minimal = buffer.nextI8();
range.maximal = buffer.nextI8();
}
result.range = range;
const selections: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const selections1: any = { };
{ /* reading selections1 (Selection) */
selections1.code = buffer.nextU32();
selections1.controller = buffer.nextU8();
selections1.location = buffer.nextU8();
selections1.sequence = buffer.nextU8();
selections1.operation_param = buffer.nextI8();
}
selections.push(selections1)
}
result.selections = selections;
}
result.msgtype = 'MSG_SELECT_TRIBUTE';
return result as MsgSelectTribute;
}
/**
* parse bytes as MsgSelectCounter (MSG_SELECT_COUNTER)
*/
function parseMsgSelectCounter(buffer: BufferReader): MsgSelectCounter {
const result: any = { };
{ /* reading result (MsgSelectCounter) */
result.player = buffer.nextU8();
result.type = buffer.nextI16();
result.count = buffer.nextI16();
const selections: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const selections1: any = { };
{ /* reading selections1 (Selection) */
selections1.code = buffer.nextU32();
selections1.controller = buffer.nextU8();
selections1.location = buffer.nextU8();
selections1.sequence = buffer.nextU8();
selections1.operation_param = buffer.nextI16();
}
selections.push(selections1)
}
result.selections = selections;
}
result.msgtype = 'MSG_SELECT_COUNTER';
return result as MsgSelectCounter;
}
/**
* parse bytes as MsgSelectSum (MSG_SELECT_SUM)
*/
function parseMsgSelectSum(buffer: BufferReader): MsgSelectSum {
const result: any = { };
{ /* reading result (MsgSelectSum) */
result.select_mode = buffer.nextI8();
result.player = buffer.nextU8();
result.sum_up_to = buffer.nextI32();
const range: any = { };
{ /* reading range (Range) */
range.minimal = buffer.nextI8();
range.maximal = buffer.nextI8();
}
result.range = range;
const includes: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const includes1: any = { };
{ /* reading includes1 (Selection) */
includes1.code = buffer.nextU32();
includes1.controller = buffer.nextU8();
includes1.location = buffer.nextU8();
includes1.sequence = buffer.nextU8();
includes1.value = buffer.nextI32();
}
includes.push(includes1)
}
result.includes = includes;
const optionals: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const optionals1: any = { };
{ /* reading optionals1 (Selection) */
optionals1.code = buffer.nextU32();
optionals1.controller = buffer.nextU8();
optionals1.location = buffer.nextU8();
optionals1.sequence = buffer.nextU8();
optionals1.value = buffer.nextI32();
}
optionals.push(optionals1)
}
result.optionals = optionals;
}
result.msgtype = 'MSG_SELECT_SUM';
return result as MsgSelectSum;
}
/**
* parse bytes as MsgSortCard (MSG_SORT_CARD)
*/
function parseMsgSortCard(buffer: BufferReader): MsgSortCard {
const result: any = { };
{ /* reading result (MsgSortCard) */
result.player = buffer.nextU8();
const selection: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const selection1: any = { };
{ /* reading selection1 (Selection) */
selection1.code = buffer.nextU32();
selection1.controller = buffer.nextU8();
selection1.location = buffer.nextU8();
selection1.sequence = buffer.nextU8();
}
selection.push(selection1)
}
result.selection = selection;
}
result.msgtype = 'MSG_SORT_CARD';
return result as MsgSortCard;
}
/**
* parse bytes as MsgSortChain (MSG_SORT_CHAIN)
*/
function parseMsgSortChain(buffer: BufferReader): MsgSortChain {
const result: any = { };
{ /* reading result (MsgSortChain) */
result.player = buffer.nextU8();
const selection: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const selection1: any = { };
{ /* reading selection1 (Selection) */
selection1.code = buffer.nextU32();
selection1.controller = buffer.nextU8();
selection1.location = buffer.nextU8();
selection1.sequence = buffer.nextU8();
}
selection.push(selection1)
}
result.selection = selection;
}
result.msgtype = 'MSG_SORT_CHAIN';
return result as MsgSortChain;
}
/**
* parse bytes as MsgConfirmDeckTop (MSG_CONFIRM_DECKTOP)
*/
function parseMsgConfirmDeckTop(buffer: BufferReader): MsgConfirmDeckTop {
const result: any = { };
{ /* reading result (MsgConfirmDeckTop) */
result.player = buffer.nextU8();
const cards: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const cards1: any = { };
{ /* reading cards1 (ConfirmCard) */
cards1.code = buffer.nextU32();
cards1.controller = buffer.nextU8();
cards1.location = buffer.nextU8();
cards1.sequence = buffer.nextU8();
}
cards.push(cards1)
}
result.cards = cards;
}
result.msgtype = 'MSG_CONFIRM_DECKTOP';
return result as MsgConfirmDeckTop;
}
/**
* parse bytes as MsgConfirmExtratop (MSG_CONFIRM_EXTRATOP)
*/
function parseMsgConfirmExtratop(buffer: BufferReader): MsgConfirmExtratop {
const result: any = { };
{ /* reading result (MsgConfirmExtratop) */
result.player = buffer.nextU8();
const cards: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const cards1: any = { };
{ /* reading cards1 (ConfirmCard) */
cards1.code = buffer.nextU32();
cards1.controller = buffer.nextU8();
cards1.location = buffer.nextU8();
cards1.sequence = buffer.nextU8();
}
cards.push(cards1)
}
result.cards = cards;
}
result.msgtype = 'MSG_CONFIRM_EXTRATOP';
return result as MsgConfirmExtratop;
}
/**
* parse bytes as MsgConfirmCards (MSG_CONFIRM_CARDS)
*/
function parseMsgConfirmCards(buffer: BufferReader): MsgConfirmCards {
const result: any = { };
{ /* reading result (MsgConfirmCards) */
result.player = buffer.nextU8();
const cards: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const cards1: any = { };
{ /* reading cards1 (ConfirmCard) */
cards1.code = buffer.nextU32();
cards1.controller = buffer.nextU8();
cards1.location = buffer.nextU8();
cards1.sequence = buffer.nextU8();
}
cards.push(cards1)
}
result.cards = cards;
}
result.msgtype = 'MSG_CONFIRM_CARDS';
return result as MsgConfirmCards;
}
/**
* parse bytes as MsgShuffleDeck (MSG_SHUFFLE_DECK)
*/
function parseMsgShuffleDeck(buffer: BufferReader): MsgShuffleDeck {
const result: any = { };
{ /* reading result (MsgShuffleDeck) */
result.player = buffer.nextU8();
}
result.msgtype = 'MSG_SHUFFLE_DECK';
return result as MsgShuffleDeck;
}
/**
* parse bytes as MsgRefreshDeck (MSG_REFRESH_DECK)
*/
function parseMsgRefreshDeck(buffer: BufferReader): MsgRefreshDeck {
const result: any = { };
{ /* reading result (MsgRefreshDeck) */
result.player = buffer.nextU8();
}
result.msgtype = 'MSG_REFRESH_DECK';
return result as MsgRefreshDeck;
}
/**
* parse bytes as MsgSwapGraveDeck (MSG_SWAP_GRAVE_DECK)
*/
function parseMsgSwapGraveDeck(buffer: BufferReader): MsgSwapGraveDeck {
const result: any = { };
{ /* reading result (MsgSwapGraveDeck) */
result.player = buffer.nextU8();
}
result.msgtype = 'MSG_SWAP_GRAVE_DECK';
return result as MsgSwapGraveDeck;
}
/**
* parse bytes as MsgNewTurn (MSG_NEW_TURN)
*/
function parseMsgNewTurn(buffer: BufferReader): MsgNewTurn {
const result: any = { };
{ /* reading result (MsgNewTurn) */
result.player = buffer.nextU8();
}
result.msgtype = 'MSG_NEW_TURN';
return result as MsgNewTurn;
}
/**
* parse bytes as MsgShuffleHand (MSG_SHUFFLE_HAND)
*/
function parseMsgShuffleHand(buffer: BufferReader): MsgShuffleHand {
const result: any = { };
{ /* reading result (MsgShuffleHand) */
result.player = buffer.nextU8();
const cards: any[] = [];
// tslint:disable-next-line:one-variable-per-declaration
for (let i = 0, n = buffer.nextU8(); i !== n; ++i) {
const cards1 = buffer.nextU32();
cards.push(cards1)
}
result.cards = cards;
}
result.msgtype = 'MSG_SHUFFLE_HAND';
return result as MsgShuffleHand;
}
/**
* parse bytes as MsgShuffleExtra (MSG_SHUFFLE_EXTRA)
*/
function parseMsgShuffleExtra(buffer: