Skip to content

Commit

Permalink
due to client bug, it's not always possible to know what cards were d…
Browse files Browse the repository at this point in the history
…rawn in combat even though combat was in lane 3, 4, or 5
  • Loading branch information
samualtnorman committed Feb 21, 2025
1 parent 016c6ed commit 86481c4
Showing 1 changed file with 74 additions and 48 deletions.
122 changes: 74 additions & 48 deletions src/parseBinlog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ export type BinlogEntry = {
defenderStack: CardString[]
attackerAttackPower: number
defenderAttackPower: number
cardsDrawn: CardString[]
cardsDrawn: number
knownCardsDrawn: CardString[]
tag: MoveTag.Combat
lane: 3 | 4 | 5
turn: number
Expand Down Expand Up @@ -80,7 +81,8 @@ export type BinlogEntry = {
defenderStack: CardString[]
attackerAttackPower: number
defenderAttackPower: number
cardsDrawn: CardString[]
cardsDrawn: number
knownCardsDrawn: CardString[]
tag: MoveTag.PlayFaceUp
lane: 3 | 4 | 5
turn: number
Expand Down Expand Up @@ -213,28 +215,40 @@ export function* parseBinlog(binlog: string[]): Generator<BinlogEntry, void, und
// might be "-" which becomes NaN (luckily NaN is falsey)
cardsDrawn ||= 0

yield move.lane == 3 || move.lane == 4 || move.lane == 5 ? {
turn,
...move,
attackerAttackPower,
attackerStack: attackerStack.split(` `).map(card => card.slice(0, 2)) as CardString[],
cardsDrawn: binlog[0].slice(binlog[0].lastIndexOf(`/`) + 2, -5).split(` `) as CardString[],
defenderAttackPower,
defenderStack: defenderStack ? defenderStack.split(` `).map(card => card.slice(0, 2)) as CardString[] : [],
lane: move.lane,
order,
role
} : {
turn,
...move,
attackerAttackPower,
attackerStack: attackerStack.split(` `).map(card => card.slice(0, 2)) as CardString[],
cardsDrawn,
defenderAttackPower,
defenderStack: defenderStack ? defenderStack.split(` `).map(card => card.slice(0, 2)) as CardString[] : [],
lane: move.lane,
order,
role
if (move.lane == 3 || move.lane == 4 || move.lane == 5) {
const knownCardsDrawn = binlog[0].slice(binlog[ 0 ].lastIndexOf(`/`) + 2, -5)

assert(
/(?:[2-9a@*?>][&%+!^#]|X)(?: [2-9a@*?>][&%+!^#])*/.test(knownCardsDrawn),
() => `${HERE} ${JSON.stringify(knownCardsDrawn)}`
)

yield {
turn,
...move,
attackerAttackPower,
attackerStack: attackerStack.split(` `).map(card => card.slice(0, 2)) as CardString[],
cardsDrawn,
knownCardsDrawn: knownCardsDrawn.split(` `).filter(card => card.length == 2) as CardString[],
defenderAttackPower,
defenderStack: defenderStack ? defenderStack.split(` `).map(card => card.slice(0, 2)) as CardString[] : [],
lane: move.lane,
order,
role
}
} else {
yield {
turn,
...move,
attackerAttackPower,
attackerStack: attackerStack.split(` `).map(card => card.slice(0, 2)) as CardString[],
cardsDrawn,
defenderAttackPower,
defenderStack: defenderStack ? defenderStack.split(` `).map(card => card.slice(0, 2)) as CardString[] : [],
lane: move.lane,
order,
role
}
}

binlog.shift()
Expand Down Expand Up @@ -299,30 +313,42 @@ export function* parseBinlog(binlog: string[]): Generator<BinlogEntry, void, und

cardsDrawn ||= 0

yield move.lane == 3 || move.lane == 4 || move.lane == 5 ? {
turn,
...move,
attackerAttackPower,
attackerStack: attackerStack.split(` `).map(card => card.slice(0, 2)) as CardString[],
card,
cardsDrawn: binlog[0].slice(binlog[0].lastIndexOf(`/`) + 2, -5).split(` `) as CardString[],
defenderAttackPower,
defenderStack: defenderStack ? defenderStack.split(` `).map(card => card.slice(0, 2)) as CardString[] : [],
lane: move.lane,
order,
role
} : {
turn,
...move,
attackerAttackPower,
attackerStack: attackerStack.split(` `).map(card => card.slice(0, 2)) as CardString[],
card,
cardsDrawn,
defenderAttackPower,
defenderStack: defenderStack ? defenderStack.split(` `).map(card => card.slice(0, 2)) as CardString[] : [],
lane: move.lane,
order,
role
if (move.lane == 3 || move.lane == 4 || move.lane == 5) {
const knownCardsDrawn = binlog[0].slice(binlog[ 0 ].lastIndexOf(`/`) + 2, -5)

assert(
/(?:[2-9a@*?>][&%+!^#]|X)(?: [2-9a@*?>][&%+!^#])*/.test(knownCardsDrawn),
() => `${HERE} ${JSON.stringify(knownCardsDrawn)}`
)

yield {
turn,
...move,
attackerAttackPower,
attackerStack: attackerStack.split(` `).map(card => card.slice(0, 2)) as CardString[],
card,
cardsDrawn,
knownCardsDrawn: knownCardsDrawn.split(` `).filter(card => card.length == 2) as CardString[],
defenderAttackPower,
defenderStack: defenderStack ? defenderStack.split(` `).map(card => card.slice(0, 2)) as CardString[] : [],
lane: move.lane,
order,
role
}
} else {
yield {
turn,
...move,
attackerAttackPower,
attackerStack: attackerStack.split(` `).map(card => card.slice(0, 2)) as CardString[],
card,
cardsDrawn,
defenderAttackPower,
defenderStack: defenderStack ? defenderStack.split(` `).map(card => card.slice(0, 2)) as CardString[] : [],
lane: move.lane,
order,
role
}
}

binlog.shift()
Expand Down

0 comments on commit 86481c4

Please sign in to comment.