diff --git a/public/cards/v_antimatter.png b/public/cards/v_antimatter.png new file mode 100644 index 0000000..69a4a7e Binary files /dev/null and b/public/cards/v_antimatter.png differ diff --git a/public/cards/v_blank.png b/public/cards/v_blank.png new file mode 100644 index 0000000..9ec43b6 Binary files /dev/null and b/public/cards/v_blank.png differ diff --git a/public/cards/v_clearance_sale.png b/public/cards/v_clearance_sale.png new file mode 100644 index 0000000..88ed14c Binary files /dev/null and b/public/cards/v_clearance_sale.png differ diff --git a/public/cards/v_crystal_ball.png b/public/cards/v_crystal_ball.png new file mode 100644 index 0000000..2448741 Binary files /dev/null and b/public/cards/v_crystal_ball.png differ diff --git a/public/cards/v_directors_cut.png b/public/cards/v_directors_cut.png new file mode 100644 index 0000000..ce8e0d2 Binary files /dev/null and b/public/cards/v_directors_cut.png differ diff --git a/public/cards/v_glow_up.png b/public/cards/v_glow_up.png new file mode 100644 index 0000000..cbf752a Binary files /dev/null and b/public/cards/v_glow_up.png differ diff --git a/public/cards/v_grabber.png b/public/cards/v_grabber.png new file mode 100644 index 0000000..177b1ef Binary files /dev/null and b/public/cards/v_grabber.png differ diff --git a/public/cards/v_hieroglyph.png b/public/cards/v_hieroglyph.png new file mode 100644 index 0000000..6dac24f Binary files /dev/null and b/public/cards/v_hieroglyph.png differ diff --git a/public/cards/v_hone.png b/public/cards/v_hone.png new file mode 100644 index 0000000..416f584 Binary files /dev/null and b/public/cards/v_hone.png differ diff --git a/public/cards/v_illusion.png b/public/cards/v_illusion.png new file mode 100644 index 0000000..7c6bc01 Binary files /dev/null and b/public/cards/v_illusion.png differ diff --git a/public/cards/v_liquidation.png b/public/cards/v_liquidation.png new file mode 100644 index 0000000..1b5c84a Binary files /dev/null and b/public/cards/v_liquidation.png differ diff --git a/public/cards/v_locked.png b/public/cards/v_locked.png new file mode 100644 index 0000000..89637bd Binary files /dev/null and b/public/cards/v_locked.png differ diff --git a/public/cards/v_magic_trick.png b/public/cards/v_magic_trick.png new file mode 100644 index 0000000..e3c9384 Binary files /dev/null and b/public/cards/v_magic_trick.png differ diff --git a/public/cards/v_money_tree.png b/public/cards/v_money_tree.png new file mode 100644 index 0000000..f9d7288 Binary files /dev/null and b/public/cards/v_money_tree.png differ diff --git a/public/cards/v_nacho_tong.png b/public/cards/v_nacho_tong.png new file mode 100644 index 0000000..c7189cd Binary files /dev/null and b/public/cards/v_nacho_tong.png differ diff --git a/public/cards/v_observatory.png b/public/cards/v_observatory.png new file mode 100644 index 0000000..51a5bd4 Binary files /dev/null and b/public/cards/v_observatory.png differ diff --git a/public/cards/v_omen_globe.png b/public/cards/v_omen_globe.png new file mode 100644 index 0000000..9908de2 Binary files /dev/null and b/public/cards/v_omen_globe.png differ diff --git a/public/cards/v_overstock_norm.png b/public/cards/v_overstock_norm.png new file mode 100644 index 0000000..8918bd3 Binary files /dev/null and b/public/cards/v_overstock_norm.png differ diff --git a/public/cards/v_overstock_plus.png b/public/cards/v_overstock_plus.png new file mode 100644 index 0000000..c801bc0 Binary files /dev/null and b/public/cards/v_overstock_plus.png differ diff --git a/public/cards/v_paint_brush.png b/public/cards/v_paint_brush.png new file mode 100644 index 0000000..4ac2b1e Binary files /dev/null and b/public/cards/v_paint_brush.png differ diff --git a/public/cards/v_palette.png b/public/cards/v_palette.png new file mode 100644 index 0000000..245812a Binary files /dev/null and b/public/cards/v_palette.png differ diff --git a/public/cards/v_petroglyph.png b/public/cards/v_petroglyph.png new file mode 100644 index 0000000..d1856ad Binary files /dev/null and b/public/cards/v_petroglyph.png differ diff --git a/public/cards/v_planet_merchant.png b/public/cards/v_planet_merchant.png new file mode 100644 index 0000000..2820b13 Binary files /dev/null and b/public/cards/v_planet_merchant.png differ diff --git a/public/cards/v_planet_tycoon.png b/public/cards/v_planet_tycoon.png new file mode 100644 index 0000000..084c3ab Binary files /dev/null and b/public/cards/v_planet_tycoon.png differ diff --git a/public/cards/v_recyclomancy.png b/public/cards/v_recyclomancy.png new file mode 100644 index 0000000..830acf3 Binary files /dev/null and b/public/cards/v_recyclomancy.png differ diff --git a/public/cards/v_reroll_glut.png b/public/cards/v_reroll_glut.png new file mode 100644 index 0000000..c73d4fe Binary files /dev/null and b/public/cards/v_reroll_glut.png differ diff --git a/public/cards/v_reroll_surplus.png b/public/cards/v_reroll_surplus.png new file mode 100644 index 0000000..6948ba7 Binary files /dev/null and b/public/cards/v_reroll_surplus.png differ diff --git a/public/cards/v_retcon.png b/public/cards/v_retcon.png new file mode 100644 index 0000000..6d5490f Binary files /dev/null and b/public/cards/v_retcon.png differ diff --git a/public/cards/v_seed_money.png b/public/cards/v_seed_money.png new file mode 100644 index 0000000..8384f3c Binary files /dev/null and b/public/cards/v_seed_money.png differ diff --git a/public/cards/v_tarot_merchant.png b/public/cards/v_tarot_merchant.png new file mode 100644 index 0000000..5299e4b Binary files /dev/null and b/public/cards/v_tarot_merchant.png differ diff --git a/public/cards/v_tarot_tycoon.png b/public/cards/v_tarot_tycoon.png new file mode 100644 index 0000000..3bca031 Binary files /dev/null and b/public/cards/v_tarot_tycoon.png differ diff --git a/public/cards/v_telescope.png b/public/cards/v_telescope.png new file mode 100644 index 0000000..463608a Binary files /dev/null and b/public/cards/v_telescope.png differ diff --git a/public/cards/v_undiscovered.png b/public/cards/v_undiscovered.png new file mode 100644 index 0000000..d5c2c38 Binary files /dev/null and b/public/cards/v_undiscovered.png differ diff --git a/public/cards/v_wasteful.png b/public/cards/v_wasteful.png new file mode 100644 index 0000000..cab2db7 Binary files /dev/null and b/public/cards/v_wasteful.png differ diff --git a/src/app/(home)/log-parser/page.tsx b/src/app/(home)/log-parser/page.tsx index ae87545..d794d7a 100644 --- a/src/app/(home)/log-parser/page.tsx +++ b/src/app/(home)/log-parser/page.tsx @@ -34,6 +34,7 @@ import { TooltipTrigger, } from '@/components/ui/tooltip' import { jokers } from '@/shared/jokers' +import { vouchers } from '@/shared/vouchers' import { useFormatter } from 'next-intl' import Image from 'next/image' import { useSearchParams } from 'next/navigation' @@ -107,7 +108,12 @@ type Game = { logOwnerFinalJokers: string[] // Log owner's final jokers opponentFinalJokers: string[] // Opponent's final jokers events: LogEvent[] - rerolls: number + rerolls: number // Log owner's reroll count + rerollCostTotal: number // Log owner's total reroll cost + logOwnerVouchers: string[] // Log owner's vouchers + opponentRerolls: number // Opponent's reroll count + opponentRerollCostTotal: number // Opponent's total reroll cost + opponentVouchers: string[] // Opponent's vouchers winner: 'logOwner' | 'opponent' | null // Who won the game pvpBlinds: PvpBlind[] // PVP blind data currentPvpBlind: number | null // Current PVP blind number @@ -140,6 +146,11 @@ const initGame = (id: number, startDate: Date): Game => ({ opponentFinalJokers: [], events: [], rerolls: 0, + rerollCostTotal: 0, + logOwnerVouchers: [], + opponentRerolls: 0, + opponentRerollCostTotal: 0, + opponentVouchers: [], winner: null, pvpBlinds: [], currentPvpBlind: null, @@ -347,6 +358,34 @@ export default function LogParser() { } continue } + if (line.includes('Client got nemesisEndGameStats message')) { + if (currentGame) { + // Extract Opponent Reroll Count + const rerollCountMatch = line.match(/\(reroll_count: (\d+)\)/) + if (rerollCountMatch?.[1]) { + currentGame.opponentRerolls = Number.parseInt( + rerollCountMatch[1], + 10 + ) + } + + // Extract Opponent Reroll Cost Total + const rerollCostMatch = line.match(/\(reroll_cost_total: (\d+)\)/) + if (rerollCostMatch?.[1]) { + currentGame.opponentRerollCostTotal = Number.parseInt( + rerollCostMatch[1], + 10 + ) + } + + // Extract Opponent Vouchers + const vouchersMatch = line.match(/\(vouchers: ([^)]+)\)/) + if (vouchersMatch?.[1]) { + currentGame.opponentVouchers = vouchersMatch[1].split('-') + } + } + continue + } if (line.includes('Client sent message: action:receiveEndGameJokers')) { if (currentGame) { // Mark end date if not already set (might happen slightly before 'got') @@ -362,6 +401,31 @@ export default function LogParser() { } continue } + if (line.includes('Client sent message: action:nemesisEndGameStats')) { + if (currentGame) { + // Extract Log Owner Reroll Count + const rerollCountMatch = line.match(/reroll_count:(\d+)/) + if (rerollCountMatch?.[1]) { + currentGame.rerolls = Number.parseInt(rerollCountMatch[1], 10) + } + + // Extract Log Owner Reroll Cost Total + const rerollCostMatch = line.match(/reroll_cost_total:(\d+)/) + if (rerollCostMatch?.[1]) { + currentGame.rerollCostTotal = Number.parseInt( + rerollCostMatch[1], + 10 + ) + } + + // Extract Log Owner Vouchers + const vouchersMatch = line.match(/vouchers:(.+)$/) + if (vouchersMatch?.[1]) { + currentGame.logOwnerVouchers = vouchersMatch[1].split('-') + } + } + continue + } if (lineLower.includes('startgame message')) { if (currentGame) { if (!currentGame.endDate) currentGame.endDate = timestamp @@ -855,7 +919,8 @@ export default function LogParser() { ? ((currentGame.endDate instanceof Date ? currentGame.endDate.getTime() : new Date(currentGame.endDate).getTime()) - - currentGame.startDate.getTime()) / 1000 + currentGame.startDate.getTime()) / + 1000 : null games.push(currentGame) } @@ -1049,8 +1114,18 @@ export default function LogParser() { : opponentLabel}
- Rerolls:{' '} + {ownerLabel} Rerolls:{' '} {game.rerolls || 'Unknown'} + {game.rerollCostTotal + ? ` (Cost: ${game.rerollCostTotal})` + : ''} +
++ {opponentLabel} Rerolls:{' '} + {game.opponentRerolls || 'Unknown'} + {game.opponentRerollCostTotal + ? ` (Cost: ${game.opponentRerollCostTotal})` + : ''}
Deck: {game.deck || 'Unknown'}
@@ -1277,6 +1352,93 @@ export default function LogParser() {
+
+ No data found.
+
+ No data found.
+
+ {game.logOwnerVouchers.map((voucher, i) => {
+ if (!voucher) {
+ return null
+ }
+ const cleanName =
+ vouchers[voucher]?.name ??
+ cleanVoucherKey(voucher)
+ return (
+ // biome-ignore lint/suspicious/noArrayIndexKey: Simple list
+
+ ) : (
+
+ {game.opponentVouchers.map((voucher, i) => {
+ if (!voucher) {
+ return null
+ }
+ const cleanName =
+ vouchers[voucher]?.name ??
+ cleanVoucherKey(voucher)
+ return (
+ // biome-ignore lint/suspicious/noArrayIndexKey: Simple list
+
+ ) : (
+