5.5 KiB
Match Essence pools (Continuum Universes CCG)
Continuumatrice matches provide 16 independent Essence balances per player, using the canonical sequence:
M S O G E A Q C J B R L V T P N
J is Jasper; N is colorless. These are not Magic mana colors, and Essence is not primarily obtained by drawing land cards.
Behavior
The client displays a compact 4 × 4 Essence Pool in a reserved column beside each player's battlefield. The panel shows the user's installed icons/essence/<code>.svg artwork and the current quantity, including zero.
- Left-click: add one Essence of that type (gain).
- Right-click: remove one Essence of that type (spend), when the balance is positive.
- Shift + left-click: set an exact nonnegative balance through a number dialog.
- Other players and spectators can view the balances; only the player controlling the pool (or a judge) can modify it.
For example, generating three Jasper Essence from a card ability currently means clicking J three times or setting its balance. Likewise, paying two Jasper means decrementing its balance twice. Future automated card effects should call a validated resource transaction action rather than simulating mouse clicks.
What this change does not assume
It does not invent Essence generation rules, a land-based resource curve, turn-based Essence resets, automatic cost deduction, overdraft/Essence debt, or activation triggers. The core match tracks available resources, but gameplay effects are still manual. Define those rules separately before implementing them.
Server-authoritative state
The existing Cockatrice-derived counter protocol already supports all the required functionality. The fork's shared EssenceCounter helper (libcockatrice_utility/libcockatrice/utility/essence_counter.h) defines stable counter names and the canonical symbol order.
The server creates sixteen counters at game setup with IDs 1..16 and names essence:M, essence:S, ..., essence:N. The existing life counter retains ID 0. These names are protocol/storage identifiers; client gameplay displays the corresponding Essence symbols rather than exposing raw IDs.
Resource counters:
- Start at
0, independently for every player. - Cannot go below
0(validated by the server for increment and set commands). - Cannot be deleted or created a second time via the generic counter commands.
- Are serialized to client snapshots, replay events, and reconnect state by the existing counter protocol.
- Do not live on card ScriptableObjects, card metadata/XML, or a global static client singleton.
Server_Player implements this for both the self-hosted Continuum-Servatrice and the embedded/local game server because they share the same player server code. Both client and server must use a matching Continuumatrice build. The regular MTG Cockatrice client/server do not provide the native Essence Pool display.
Implementation map
| File | Responsibility |
|---|---|
libcockatrice_utility/libcockatrice/utility/essence_counter.h |
Canonical Essence order, protocol names, nonnegative values |
libcockatrice_card/libcockatrice/card/essence_types.h |
Card-cost parser uses the same source of symbols |
libcockatrice_network/libcockatrice/network/server/remote/game/server_player.cpp |
Server counter initialization, updates, permanent-counter restrictions |
cockatrice/src/game_graphics/player/essence_pool_item.h/.cpp |
Compact graphical resource display, manual controls, server-state observation |
cockatrice/src/game_graphics/player/player_graphics_item.cpp |
Places Essence pool beside player's board and excludes it from the narrow ordinary-counter stack |
tests/essence_types_test.cpp |
Protocol-name round trips and nonnegative value utility checks |
The panel never owns the true resource quantities. It listens for CounterState::valueChanged and sends normal actIncrementCounter/actSetCounter commands through PlayerActions. Only the server authoritatively changes the stored balance, so remote clients and replays see the same values.
Build and tests
On the feature/continuumatrice-essence-match-pools branch:
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DWITH_CLIENT=ON -DWITH_SERVER=ON -DWITH_ORACLE=OFF -DTEST=ON
cmake --build build --target continuumatrice continuum-servatrice essence_types_test --parallel 16
ctest --test-dir build -R EssenceTypesTest --output-on-failure
./build/continuumatrice/continuumatrice
Functional acceptance checklist
- In a new local game, each player has a 4×4 pool with exactly 16 Essence types and zero balances.
- Gaining
JleavesC,B, andNunchanged; right-clickingJat zero cannot make it negative. - Shift+left can set
N(colorless) to a specific nonnegative amount. - The normal life counter still works; no default MTG W/U/B/R/G/X/Storm counters appear.
- Both players see the same balance after a command is processed by the server.
- A spectator can view but not modify another player's Essence.
- Disconnect/reconnect restores all 16 values from the game-state snapshot.
- Replay playback restores previously recorded Essence changes.
- A remote game running Continuum-Servatrice matches the local game behavior.
- The Essence panel does not overlap the three battlefield bands or Limbo/Refuge/Oblivion piles at normal zoom.
Current status: Source implementation committed. This server/client change has not been compiled or tested in a live match yet. The new browser and match UI need user-side smoke testing.