Commit Graph

  • f24fc7c643 feat(battle-node): BuildOpponentTurnEnd builder for v1.1 turn loop gamer147 2026-06-01 14:49:52 -04:00
  • d4926e31d6 feat(battle-node): add TurnEndBody record for opponent turn-end push gamer147 2026-06-01 14:46:21 -04:00
  • 1904ae4c0c refactor(battle-node): ScriptedLifecycle.InitialHand as ImmutableArray<long> gamer147 2026-06-01 13:02:23 -04:00
  • 6077844ee8 docs(battle-node): README reflects real drafted deck + cosmetics gamer147 2026-06-01 13:00:22 -04:00
  • e3cc745a61 test(battle-node): end-to-end drafted deck flows into Matched frame gamer147 2026-06-01 12:51:33 -04:00
  • b0488e3f2e feat(battle-node): BuildBattleStart consumes MatchContext for player half gamer147 2026-06-01 12:49:54 -04:00
  • f589283572 feat(battle-node): BuildMatched consumes MatchContext for player half gamer147 2026-06-01 12:48:04 -04:00
  • 01f9bb722a feat(battle-node): thread MatchContext through bridge to BattleSession gamer147 2026-06-01 12:44:42 -04:00
  • a0fdb0f3c5 feat(match-context): add IMatchContextBuilder TK2 implementation gamer147 2026-06-01 12:40:26 -04:00
  • 89b3d23bde feat(viewer-repo): add LoadForMatchContextAsync for battle-node ctx build gamer147 2026-06-01 12:37:44 -04:00
  • 0e8f5427c3 feat(battle-node): add MatchContext record for per-mode player snapshot gamer147 2026-06-01 12:35:43 -04:00
  • ef3d7bb82b refactor(battle-node): WireConstants for SIO event names + crypto RNG battle id gamer147 2026-06-01 11:53:01 -04:00
  • 133346e3e8 refactor(battle-node): SocketIoFrame throws on namespace; typed JSON construction gamer147 2026-06-01 11:48:17 -04:00
  • 2588388d9d refactor(battle-node): distinct WS auth status codes + named handler delegate gamer147 2026-06-01 11:45:50 -04:00
  • a364f539ad refactor(battle-node): tighten Phase setter to private; document sid opacity gamer147 2026-06-01 11:41:47 -04:00
  • 677b1f1392 feat(battle-node): BattleResult enum for BattleFinish.result wire codes gamer147 2026-06-01 11:41:16 -04:00
  • eaf6d7160b refactor(battle-node): dedupe NodeCrypto AES setup into BuildAes helper gamer147 2026-06-01 11:36:48 -04:00
  • 34c4ca0237 fix(battle-node): NodeCrypto.GenerateKey masks rand source with & 0xF gamer147 2026-06-01 11:35:53 -04:00
  • e4fbb155e4 test(battle-node): pump-level tests for async-Task dispatch, CT, Md5 clip gamer147 2026-06-01 11:15:10 -04:00
  • 21b7ddf6ae test(battle-node): TestWebSocket mock for pump-level unit tests gamer147 2026-06-01 11:13:54 -04:00
  • 4dd61343aa fix(battle-node): clip SIO ack arg instead of checked-cast throwing on overflow gamer147 2026-06-01 11:13:24 -04:00
  • 453865ade2 fix(battle-node): thread session CT through every send instead of None gamer147 2026-06-01 11:12:26 -04:00
  • 8cce667e02 fix(battle-node): await DispatchSocketIo instead of async-void fire-and-forget gamer147 2026-06-01 11:11:58 -04:00
  • 0764b8646f feat(battle-node): capture session-scoped CT in BattleSession.RunAsync gamer147 2026-06-01 11:11:31 -04:00
  • e4691d616b fix(battle-node): emit envelope keys before body keys in MsgEnvelope.ToJson gamer147 2026-06-01 10:53:51 -04:00
  • 19cc7980d1 test(battle-node): envelope-level wire-shape regression for scripted bodies gamer147 2026-06-01 10:40:54 -04:00
  • 5ee270eb16 refactor(battle-node): switch MsgEnvelope.Body to IMsgBody, migrate all sites gamer147 2026-06-01 10:40:09 -04:00
  • 118be92dc5 feat(battle-node): ScriptedProfiles named constants for scripted bodies gamer147 2026-06-01 10:35:45 -04:00
  • c7745d8785 feat(battle-node): typed OpponentTurnStart/ResultCodeOnly/BattleFinish/AlivePush bodies gamer147 2026-06-01 10:35:18 -04:00
  • 97b9b6fe42 feat(battle-node): typed Deal/Swap/Ready bodies + PosIdx gamer147 2026-06-01 10:34:44 -04:00
  • 78a6fe93fb feat(battle-node): typed BattleStartBody + Self/Oppo info records gamer147 2026-06-01 10:34:07 -04:00
  • d9fbb67f0c feat(battle-node): typed MatchedBody + Self/Oppo info records gamer147 2026-06-01 10:33:34 -04:00
  • 9217de3aa1 feat(battle-node): add IMsgBody marker + RawBody inbound wrapper gamer147 2026-06-01 10:32:44 -04:00
  • c279b811ad docs(battle-node): project README + docstrings on hosting/lifecycle gamer147 2026-06-01 08:57:15 -04:00
  • 9e8ebd1b2b fix(battle-node): preserve long type on numeric array elements in FromJson gamer147 2026-06-01 08:40:50 -04:00
  • 77fb93f3ea fix(battle-node): real mulligan card replacement + opponent TurnStart push gamer147 2026-06-01 08:30:44 -04:00
  • e06d97ef6f fix(battle-node): respond to InitBattle/Loaded, not InitNetwork gamer147 2026-06-01 02:08:04 -04:00
  • 0b859f1c8e fix(check): merge anonymous resignup viewer into Steam-linked viewer gamer147 2026-06-01 01:59:47 -04:00
  • 01b0c64a63 fix(battle-node): inject resultCode=1 into every scripted synchronize push gamer147 2026-06-01 01:55:35 -04:00
  • e7dac31d52 fix(check): emit rewrite_viewer_id when UDID and Steam viewers disagree gamer147 2026-06-01 01:49:56 -04:00
  • cc32223d7d fix(battle-node): strip/prepend EIO3 type byte on binary WS frames gamer147 2026-06-01 01:48:52 -04:00
  • ccc9b41473 fix(battle-node): header-based WS detection in auth; split unknown-bid vs mismatch logs gamer147 2026-06-01 01:17:42 -04:00
  • 1252f7bd35 fix(battle-node): read WS credentials from headers; skip Steam auth on WS upgrades gamer147 2026-06-01 01:12:21 -04:00
  • 5525dbee24 fix(battle-node): node_server_url matches prod wire format (no scheme, with path) gamer147 2026-06-01 01:06:40 -04:00
  • f765d5c7d4 chore(emulated-entrypoint): quiet EFCore info logs in appsettings gamer147 2026-06-01 01:02:32 -04:00
  • 9776873073 fix(arena-tk2): include card_master_id in do_matching success response gamer147 2026-06-01 00:52:57 -04:00
  • b1397e3a3e refactor(repositories): move static caches into IMemoryCache, enable within-fixture parallelism gamer147 2026-06-01 00:41:09 -04:00
  • 66c456c1c8 test(story-service): per-test fixture instance + unique InMemoryDb name gamer147 2026-06-01 00:40:51 -04:00
  • 31f26655ba test(pack-controller): derive expected active-pack count from seed at runtime gamer147 2026-06-01 00:23:15 -04:00
  • 7914bab84e test(unit-tests): silence captured stdout in Testing env gamer147 2026-06-01 00:13:42 -04:00
  • d093d872ae test(unit-tests): parallelize at the fixture level gamer147 2026-06-01 00:06:47 -04:00
  • 905fdc780a test(battle-node): end-to-end flow test through Ready via WebApplicationFactory gamer147 2026-05-31 23:37:31 -04:00
  • ff51c33b6c feat(arena-tk2): do_matching mints battle via IMatchingBridge, returns 3004 gamer147 2026-05-31 22:53:20 -04:00
  • 88ed8254af feat(emulated-entrypoint): wire AddBattleNode + UseBattleNode into the web host gamer147 2026-05-31 22:49:31 -04:00
  • 1dd6a70e8d feat(battle-node): WebSocket endpoint at /socket.io/ + DI extension methods gamer147 2026-05-31 22:34:54 -04:00
  • f19da481c3 fix(battle-node): MatchingBridge avoids Math.Abs(int.MinValue) overflow gamer147 2026-05-31 22:33:35 -04:00
  • d3c4b3083e feat(battle-node): IMatchingBridge + MatchingBridge mint battle id + node url gamer147 2026-05-31 22:31:04 -04:00
  • 680630050b fix(battle-node): BattleSession crash safety, fresh-key per push, phase guards gamer147 2026-05-31 22:28:13 -04:00
  • f6aee5b0f8 feat(battle-node): BattleSession routes lifecycle URIs through ScriptedLifecycle gamer147 2026-05-31 22:21:55 -04:00
  • 30b457c9a0 fix(battle-node): assert Bid is in envelope (not Body) on BuildMatched gamer147 2026-05-31 22:18:12 -04:00
  • 0fd4f5f9f7 feat(battle-node): ScriptedLifecycle frame builders (Path-A static opponent) gamer147 2026-05-31 22:15:44 -04:00
  • a306295fe2 feat(battle-node): BattleSession skeleton with EIO/SIO read pump gamer147 2026-05-31 22:10:17 -04:00
  • 22a4825265 feat(battle-node): Gungnir alive-body builders (scs/ocs ONLINE placeholders) gamer147 2026-05-31 22:07:31 -04:00
  • 82b7d1e940 feat(battle-node): OutboundSequencer assigns playSeq + archives for Resume gamer147 2026-05-31 22:05:16 -04:00
  • 87051737da feat(battle-node): InboundTracker dedupes client pubSeq + tracks high-water gamer147 2026-05-31 22:02:56 -04:00
  • 3ade8ff4f5 feat(battle-node): in-memory IBattleSessionStore + PendingBattle gamer147 2026-05-31 22:00:40 -04:00
  • c0c2bb5772 feat(battle-node): MsgPayloadCodec encodes/decodes msgpack↔envelope chain gamer147 2026-05-31 21:58:06 -04:00
  • 4cc8b3c01c fix(battle-node): MsgEnvelope rejects reserved Body keys + complete ReceiveNodeResultCode gamer147 2026-05-31 21:55:11 -04:00
  • 383044dd8f feat(battle-node): NetworkBattleUri / EmitCategory enums and MsgEnvelope record gamer147 2026-05-31 21:50:17 -04:00
  • 6ff4f70f1a fix(battle-node): SocketIoFrame disposal safety + escaping + empty-args encoding gamer147 2026-05-31 21:46:02 -04:00
  • 8b1f613407 feat(battle-node): SocketIoFrame parse/encode for SIO2 incl. binary attachments gamer147 2026-05-31 21:39:53 -04:00
  • 6c6664f011 feat(battle-node): EngineIoFrame parse/encode for EIO3 packets gamer147 2026-05-31 21:34:11 -04:00
  • a786599416 fix(battle-node): clarify NodeCrypto.GenerateKey contract + add fixed-vector regression test gamer147 2026-05-31 21:31:22 -04:00
  • 0a2eddd920 feat(battle-node): port AES-256-CBC encryptForNode/decryptForNode codec gamer147 2026-05-31 21:26:05 -04:00
  • 50790a706c feat(battle-node): scaffold SVSim.BattleNode class library gamer147 2026-05-31 21:21:14 -04:00
  • dd231b081d Merge branch 'inventory-service' gamer147 2026-05-31 19:25:43 -04:00
  • a033bf361a fix(battle-pass): remove redundant SaveChanges after CommitAsync gamer147 2026-05-31 18:48:26 -04:00
  • 2ee40c6df7 test(inventory): wire-shape regression for spend+grant+cascade gamer147 2026-05-31 17:12:16 -04:00
  • 2c62a7be80 refactor(inventory): delete old primitives after InventoryService cutover gamer147 2026-05-31 17:07:30 -04:00
  • df0e132459 refactor(inventory): move GrantedReward + EffectiveCosmetics into Inventory namespace folder gamer147 2026-05-31 17:03:06 -04:00
  • c37c04c1b7 refactor(gacha-point): route TryExchangeAsync through IInventoryTransaction gamer147 2026-05-31 16:55:08 -04:00
  • b6bf9b7495 refactor(arena-two-pick): route entry/finish through InventoryService gamer147 2026-05-31 16:51:03 -04:00
  • 26bc4fe2ab refactor(battle-pass): route BuyPremiumAsync and AddPointsAsync through InventoryService gamer147 2026-05-31 16:46:13 -04:00
  • 7c4bc2966f refactor(story): route FinishAsync rewards through InventoryService gamer147 2026-05-31 16:42:38 -04:00
  • a310697830 refactor(puzzle): route finish rewards through InventoryService gamer147 2026-05-31 16:40:16 -04:00
  • 4ba7d8f6d0 refactor(achievement): route receive_reward through InventoryService gamer147 2026-05-31 16:39:07 -04:00
  • 369edd4537 refactor(gift): route tutorial gift_receive through InventoryService gamer147 2026-05-31 16:37:53 -04:00
  • a2cec7c99e refactor(spot-card-exchange): route through InventoryService gamer147 2026-05-31 16:35:53 -04:00
  • ad4d4e0646 refactor(item-purchase): route through InventoryService gamer147 2026-05-31 16:26:34 -04:00
  • 9436a0d21b refactor(sleeve): route buy through InventoryService gamer147 2026-05-31 16:25:10 -04:00
  • 45fa3d75bf refactor(leader-skin): route shop through InventoryService gamer147 2026-05-31 16:23:50 -04:00
  • 4d6da23443 refactor(pack): route Open through InventoryService gamer147 2026-05-31 16:20:23 -04:00
  • 57dd524d9f refactor(build-deck): route Buy through InventoryService gamer147 2026-05-31 16:17:31 -04:00
  • 61013fcf5c refactor(card-inventory): route Create/Destruct through InventoryService gamer147 2026-05-31 16:15:40 -04:00
  • 1113e52f94 refactor(load): switch to InventoryService for entitlements gamer147 2026-05-31 16:12:27 -04:00
  • 91909c5755 feat(inventory): read-side methods on IInventoryService + tx gamer147 2026-05-31 16:05:35 -04:00
  • ea340cde21 test(inventory): lifecycle — dispose rollback + use-after-commit gamer147 2026-05-31 16:03:06 -04:00
  • b0b9901c42 feat(inventory): CommitAsync + currency-collision rule gamer147 2026-05-31 16:02:39 -04:00
  • 1ba3f57709 feat(inventory): BackfillCardCosmeticsAsync gamer147 2026-05-31 16:01:15 -04:00
  • 46d8239d5a feat(inventory): TryDebitAsync dispatches currencies + Item gamer147 2026-05-31 16:00:24 -04:00