Took 3 hours 38 minutes
Took 11 seconds
Took 9 minutes
Took 2 minutes
Took 22 minutes
Took 43 minutes
Took 4 minutes
Took 31 minutes
Took 7 seconds
Took 1 minute
[Game][Player] Pull out graphics_items out of player_logic
Took 3 minutes
Took 24 seconds
Took 5 minutes
Took 19 minutes
Took 7 minutes
Took 32 seconds
Took 3 minutes
Took 14 minutes
Took 5 seconds
Took 28 minutes
Took 5 minutes
Took 28 minutes
Took 7 seconds
Took 12 minutes
Took 20 minutes
Took 2 minutes
* [Game][Player] Pull out graphics_items out of player_logic
Took 25 seconds
Took 9 minutes
* [Game] Move graphics files into game_graphics
Took 1 minute
Took 2 minutes
Took 23 seconds
Took 1 minute
Took 2 seconds
* Include.
Took 4 minutes
Took 3 minutes
Took 4 minutes
Took 1 minute
Took 3 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* [Game][Player] Split Player into PlayerLogic/PlayerGraphicsItem
Took 4 minutes
Took 58 seconds
Took 2 minutes
* [Game][Menus] Make Menus accept PlayerGraphicsItem instead of PlayerLogic
Took 7 minutes
Took 4 minutes
Took 9 seconds
Took 2 minutes
Took 5 minutes
Took 58 seconds
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* [Game][Player] Split Player into PlayerLogic/PlayerGraphicsItem
Took 4 minutes
Took 48 seconds
* Drop early return.
Took 1 hour 13 minutes
Took 2 minutes
Took 1 minute
* Delete player view.
Took 37 seconds
* Restore card counter color in menu.
Took 5 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* [Game] [Arrows] Track creatorId, use arrowData in arrowItem, use registry, generate unique arrow id's on server side and delete-on-exist inserts.
Took 2 minutes
Took 1 minute
* Fix emitting slot instead of signal.
Took 15 minutes
* Clear arrows locally in special circumstances i.e. teardown.
Took 28 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* Refactor server counter API to own overflow protection and filter no-op events
Counter modifications now clamp to int bounds server-side and return change
status, allowing command handlers to skip network broadcasts when values
don't actually change.
* Centralize MAX_COUNTERS_ON_CARD and enforce [0, 999] bounds on server
- Move MAX_COUNTERS_ON_CARD to trice_limits.h
- Server clamps values in setCounter() and incrementCounter()
- Client uses clamped comparison to allow recovery from invalid states
- Add tests for clamping behavior
* move incrementCount() implementation from header to cpp
* [Game][Arrows] Split Arrows into ArrowData and ArrowItem
Took 13 minutes
Took 5 seconds
Took 1 minute
Took 26 seconds
* Address comments.
Took 17 minutes
Took 9 seconds
Took 1 minute
* Change check.
Took 3 minutes
* Pass by const reference.
Took 10 minutes
* Remove extra method
Took 2 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* [Counters] Split counters into graphics and logic states
Took 22 minutes
* Don't have widget hold pointer to state -> Copy what we need and subscribe to changes.
Took 12 minutes
Took 5 seconds
* Sync value too.
Took 3 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* [Game] Move state fields out of CardItem
Took 1 hour 2 minutes
* Move stuff into .cpp
Took 14 minutes
* Signals pass changed values as params
Took 2 minutes
* Comments.
Took 23 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* [Game/Zones] Simple move refactor to differentiate between logic and graphics for zones
Took 21 minutes
* Clean up game/zones/logic folder.
Took 6 minutes
* Adjust tests.
Took 3 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* style: Add braces to all control flow statements
Standardize code style by adding explicit braces to all single-statement
control flow blocks (if, else, for, while) across the entire codebase.
Also documents the InsertBraces clang-format option (requires v15+) for
future automated enforcement.
* InsertBraces-check-enabled
* Refactor vertical card stacking with opt-in overflow for variable zone sizes
Introduce a shared vertical stacking layout system in SelectZone that replaces the old divideCardSpaceInZone() free function with structured layout computation (StackLayoutParams, ZoneLayout, computeZoneLayout).
By default, cards are guaranteed to fit within zone bounds (no overflow). Zones can opt-in to bottom overflow via allowBottomOverflow flag, with sqrt-scaled compression for smooth visual transitions. A clip container mechanism is available for future zones that need visual clipping.
Key changes:
- SelectZone: new layout engine with allowBottomOverflow opt-in; clip container infrastructure for future zones needing visual clipping
- StackZone: uses new layout (no overflow); adds setHeight() for dynamic resizing capabilities
- HandZone: vertical layout delegates to SelectZone's shared stacking
- AbstractCardItem: preserves hover z-value during layout passes; invalidates scene rect on hover exit for proper sibling repainting
- CardZone::onCardAdded made virtual for clip container reparenting
- Zone widths updated to CardDimensions::WIDTH_F * 1.5
* Changed anonymous namespace for static and braced functions
* CI tests re-run
Non-QObject polymorphic interface with setShortcutsActive(), setShortcutsInactive(), and retranslateUi(). Uses regular multiple inheritance to avoid diamond inheritance with Qt's MOC.
All zone menus, SayMenu, and AbstractCounter implement this interface. PlayerMenu manages them via a managedComponents list with two template helpers (addManagedMenu/registerManagedComponent), replacing individual if-guarded lifecycle calls with a single polymorphic loop.
SayMenu now owns its shortcut and translation lifecycle instead of having PlayerMenu manage its title and shortcuts externally.
Counters are iterated via Player::getCounters() rather than managedComponents to avoid duplicating the authoritative owner's map.
* Add ZoneNames constants for protocol zone identifiers. Introduce a centralized ZoneNames namespace providing constexpr constants for zone identifiers used in the client-server protocol. This establishes a single source of truth for zone names like TABLE, GRAVE, EXILE, HAND, DECK, SIDEBOARD, and STACK. The protocol values remain unchanged (e.g., EXILE maps to rfg for backwards compatibility) while providing meaningful constant names.
* refactor(server): use ZoneNames constants in server game logic
Replace hardcoded zone name strings with ZoneNames:: constants in:
- server_player.cpp: zone setup, draw, shuffle, mulligan operations
- server_abstract_player.cpp: card movement and token destruction
- server_game.cpp: returning cards when players leave
No functional changes - purely mechanical string literal replacement.
* refactor(client): use ZoneNames constants in core player/zone logic
Update the foundational player and zone classes to use ZoneNames::
constants instead of string literals. Changes include:
- player.h/cpp: zone initialization and builtinZones set
- card_zone_logic.cpp: zone name translation for UI display
- table_zone.cpp: table zone operations
No functional changes - purely mechanical string literal replacement.
* refactor(client): use ZoneNames constants in player actions and events
Replace zone name strings with ZoneNames:: constants in the player
action and event handling code. player_actions.cpp contains the most
extensive changes (~90+ replacements) covering all card movement
commands.
No functional changes - purely mechanical string literal replacement.
* refactor(client): use ZoneNames constants in zone menu handlers
Update all zone-specific menu files to use ZoneNames:: constants
for QAction data values and zone targeting. This covers context menus
for cards, graveyard, hand, and exile (RFG) zones.
No functional changes - purely mechanical string literal replacement.
* refactor(client): use ZoneNames constants in game scene components
Update remaining game scene components to use ZoneNames:: constants:
- arrow_item.cpp: arrow drawing between cards
- game_scene.cpp: zone view positioning
- message_log_widget.cpp: removes duplicate local static constants
that were previously defining zone names redundantly
- phases_toolbar.cpp: phase actions (untap all)
Notable: message_log_widget.cpp previously had its own local constants
(TABLE_ZONE_NAME, GRAVE_ZONE_NAME, etc.) which are now removed in favor
of the centralized ZoneNames:: constants.
* formatting fix
* refactor: extract CARD_HEIGHT to shared CardDimensions header
Move duplicated CARD_WIDTH/CARD_HEIGHT constants to card_dimensions.h.
Fixed documentation in z_value_layer_manager.h.
* WIDTH_F used directly instead of casting
* Improved consistency and added missing newlines at end of files
* feat(z-values): add centralized Z-value constants infrastructure
Magic numbers scattered across the codebase make Z-value layering
hard to understand and maintain. Centralizing them provides:
- Self-documenting layer hierarchy
- Validation utilities for development
- Single source of truth for Z-value ranges
Two-tier header design:
- z_value_layer_manager.h: Foundation with constants and validation
- z_values.h: User-facing namespace with semantic constants
* refactor(z-values): replace magic Z-value numbers with ZValues constants
Magic numbers like 2000000007 are impossible to understand without
context. Named constants (ZValues::DRAG_ITEM) are self-documenting.
This intentionally renumbers overlay Z-values to use a cleaner offset
sequence. The relative stacking order is preserved, which is what
matters for correct rendering.
Each consumer now includes z_values.h and uses semantic constants
instead of magic numbers.
* refactor(z-values): removed redundant inline with contexpr, Updated doc, magic numbers removed from TableZone.
* [Server] Support face-down cards in all public zones
* add null check
* Check using zone names instead
* add comment
* Rename properties and only pass forceFaceDown
* [Game] Refactor CardDragItem faceDown logic
* revert refactor
* leave face_down unset unless forced
* [Client] Support face-down cards in all public zones
* leave face_down unset unless forced
* log face down
* update remaining logs
* [Cleanup] Unused #includes
Took 44 minutes
* [Cleanup] More unused #includes
Took 55 minutes
* [Cleanup] Include QSet
Took 4 minutes
* [Cleanup] Include QDebug in deck_list.cpp
Took 3 minutes
* [Cleanup] Include protocol stuff in servatrice_database_interface.h
Took 3 minutes
* [Cleanup] Include QDialogButtonBox
Took 8 minutes
* [Cleanup] Include QUrl
Took 8 minutes
* [Cleanup] Include QTextOption in header.
Took 3 minutes
* [Cleanup] Include QMap in user_list_manager.h
Took 8 minutes
* [Cleanup] Adjust qjson
Took 8 minutes
* [Cleanup] include button box.
Took 3 minutes
* [Cleanup] Redo fwd declarations.
* [Cleanup] Redo last removed fwd declarations.
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* protocol changes
* servatrice changes
* add new setting
* implement client side with static 4 phases
* reading the code explains the code
* add subphases to phase.cpp
* use new subphase definition
* [Refactor] Move AbstractGraphicsItem and GraphicsItemType to game_graphics/board folder.
Took 3 minutes
* Update CMakeLists.txt
Took 12 minutes
* Update CMakeLists.txt
Took 12 minutes
Took 2 minutes
Took 16 seconds
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* Fix local variable double declaration.
Took 44 seconds
* Mark functions as [[nodiscard]]
Took 31 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* Have CardDatabase::getPreferredPrintingInfo respect card provider ID overrides (pinned printings)
Took 13 minutes
Took 37 seconds
Took 10 seconds
Took 10 seconds
# Commit time for manual adjustment:
# Took 30 seconds
Took 15 seconds
Took 8 minutes
Took 21 seconds
* Move settings cache and settings card preference provider out of libcockatrice_settings and into cockatrice
Took 52 minutes
Took 9 minutes
Took 1 minute
* Temp cache.
Took 16 minutes
* Dependency Injection for SettingsCache
* Turn SettingsCache into a QSharedPointer.
* Implement interfaces for settings that need it
Took 2 hours 38 minutes
* Adjust oracle.
Took 5 minutes
* Move abstract/noop interfaces to libcockatrice_interfaces so they can be linked against independently.
Took 52 minutes
* Clean up some links.
Took 3 minutes
* Cleanup two includes.
Took 3 minutes
* More fixes.
Took 7 minutes
* More includes that slipped past.
Took 3 minutes
* Stop mocking and start injecting for tests.
Took 15 minutes
* I don't know why remote_client was including main.
Took 4 minutes
* Include.
Took 3 minutes
* Lint.
Took 2 minutes
* Don't use Qt pointers.
Took 1 hour 7 minutes
* Make parser use CardSettingsInterface
Took 13 minutes
* Also adjust constructor lol.
Took 8 minutes
* Lint.
Took 32 minutes
* Revert "Lint."
This reverts commit ecb596c39e.
Took 3 minutes
* Test.
Took 3 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* Sort *every* file into a doxygen group.
Took 7 hours 9 minutes
Took 18 seconds
Took 2 minutes
* Lint some ingroup definitions.
Took 10 minutes
Took 2 seconds
* Just include the groups in the Doxyfile in this commit.
Took 3 minutes
* Update some group comments so they link!
Took 14 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* Simplify add card.
Took 25 minutes
Took 8 minutes
# Commit time for manual adjustment:
# Took 16 minutes
Took 7 seconds
* Refactor out db loading from card db.
Took 39 minutes
Took 9 minutes
Took 2 minutes
Took 17 seconds
* Refactor out db queries from card db.
Took 42 minutes
* Lint.
Took 3 minutes
* I guess.
Took 7 minutes
* Tests.
Took 15 minutes
* I don't understand this.
Took 9 minutes
* fix linker errors
* Rename to querier and promote to QObject
Took 39 minutes
* Lint.
Took 3 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
Co-authored-by: ebbit1q <ebbit1q@gmail.com>
* move common server files
* update includes with move
* create participant, move code
* fix linker errors
* fix regressions
* mark function as override to make clang happy
* split out spectator to new file
* forgot to add to cmakelists
* autocompleter picking wrong casing for var name
* clean up forwards declarations in player
* fix includes in game
* big move
* also move game_specific_terms
* fix imports
* alphabetize cmake
* fix build failure
* create database folder and move files into it
* fix includes
* run formatter
* check for null zone during card item teardown
Took 1 hour 32 minutes
Took 24 seconds
* Also check for it in the successful branch.
Took 6 minutes
* Comment.
Took 5 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* Player refactor.
Took 1 hour 43 minutes
Took 1 minute
Took 23 seconds
* Tiny lint.
Took 3 minutes
* Hook up tap logic again.
Took 13 minutes
* Fix an include.
Took 3 minutes
* Stuff.
Took 6 minutes
* Fix typo.
Took 7 minutes
* Include.
Took 1 minute
* Reorganize method/variable definitions, remove unused ones.
Took 1 hour 8 minutes
Took 24 seconds
* Clean up some unused imports.
Took 6 minutes
* Player holds the deck, emits deckChanged(), other elements player->getDeck() to respond to changes.
Took 37 minutes
* Connect player->openDeckEditor signal directly in the player constructor
Took 6 minutes
* Emit openDeckEditor signal in player_actions again.
Took 3 minutes
* Do to-do's
Took 3 hours 32 minutes
* Lint.
Took 3 minutes
* Lint again.
Took 2 minutes
* Fix include.
Took 32 minutes
* The stack should ensure card visibility.
Took 21 minutes
* Fine, the game can remember the tab.
Took 10 minutes
Took 21 seconds
Took 9 seconds
* zoneId is a dynamic gameplay property and thus belongs in player.cpp
Took 11 minutes
Took 19 seconds
* Signal view removal, addition.
Took 5 minutes
* Ensure all players are considered local in local game.
Took 10 minutes
* ENSURE they are.
Took 8 minutes
* Bounds check data sent by QAction()
Took 54 minutes
* Move comment.
Took 20 seconds
* Reimplement logging category for game_event_handler.cpp, remove linebreaks.
Took 36 seconds
* PlayerGraphicsItem is responsible for retranslateUi, not Player.
Took 14 seconds
* Set menu for sideboard again, translate some menu titles, reimplement actIncPT action
Took 54 seconds
* Comment spacing.
Took 43 seconds
* Change message_log_widget.cpp slots to take CardZoneLogic parameters as emitted by PlayerEventHandler.
Took 7 minutes
Took 14 seconds
* Remove unused player_logger.cpp
Took 2 minutes
* Query local game state correctly from tab_supervisor again
Took 3 minutes
* Revert Deck legality checker.
Took 3 minutes
* Instantiate menu before graphics item.
Took 1 hour 5 minutes
Took 55 minutes
* Differentiate games and replays.
Took 9 seconds
* Lint.
Took 10 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* Move game state and event handling out of tab_game and into separate classes.
Took 6 hours 38 minutes
Took 23 seconds
* Meta Info
Took 14 hours 36 minutes
* Properly respond to game started again.
Took 49 minutes
* Hook up the message log widgets to game events again.
Took 33 minutes
Took 7 seconds
* Lint.
Took 4 minutes
* Hook up playerListWidget.
Took 1 hour 2 minutes
Took 10 seconds
* Hook up playerListWidget properly.
Took 1 hour 17 minutes
* Fix regressions.
Took 17 minutes
Took 9 seconds
* Log the local player joining too.
Took 2 minutes
* Connect some player signals unrelated to this refactor again.
Took 5 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* extract cardMenu from CardItem
* move cardMenu saving to TabGame
* delete TabGame::updateCardMenu
* move checking to updateCardMenu
* unset activeCard when all cards are unselected