Cockatrice/common/pb
Basile Clement 9a7b15d19b
Allow revealing specific cards from hand and library (#4743)
Currently Cockatrice allows revealing the whole hand, or one card at
random from the hand. Sometimes, a player needs to reveal a specific
card from their hand instead, which is not supported. To achieve a
similar effect, players usually move the corresponding card (or cards)
to a public zone, then back to their hand. While this works, it is
unsatisfactory (compared to a regular reveal, you can't keep the
"revealed" window around, for one) and somewhat unintuitive.

This patch adds a "Reveal to..." menu to cards and card selections in
the player's hand or in custom zones (this includes looking at the
player's library). This menu allows revealing a card or set of cards to
any given player, or to all players.

To implement this functionality at the protocol level, the existing
RevealCards command is extended to support revealing multiple specific
cards. This is done by making `card_id` a non-packed repeated field in
the `Command_RevealCards` and `Event_RevealCards` protobufs.  Using a
non-packed repeated fields allows maintaining backwards compatibility:
an empty optional field is encoded the same way as an empty non-packed
list, an optional field with a value is encoded the same way as a
one-element non-packed list, and when decoding a multi-elements
non-packed list as an optional, only the last item in the list is read.

Since the RevealCards command already exists, and due to the compatible
encodings, a new client connecting to an old server can reveal a single
specific card from their hand. When trying to reveal multiple cards at
once, the old server will only see the request for one of the cards to
be revealed, and the player will have to reveal each card separately.

On the other hand, `Event_RevealedCards` already has an explicit list of
cards revealed by the server, and the `card_id` field is only used when
exactly one card has been revealed: thus, old and new clients will
behave identically when receiving a new `Event_RevealedCards`. In
particular, if a player using a new client reveals multiple cards from
their hand on a new server, another player using an old client will
correctly see all the revealed cards.

The approach used to build the "Reveal to..." menu is slightly different
from the approach used to build other player selection menus. Because
the "Reveal to..." menu is specific to each card, but must also be
updated whenever a player is added to or removed from the game, I chose
to re-create it on the fly whenever a card is clicked, as that seemed
the safest way to avoid both memory leaks and inconsistent state given
my understanding of the code.
2023-02-07 17:12:04 -05:00
..
admin_commands.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
card_attributes.proto
CMakeLists.txt Add cmake format (#4618) 2022-05-08 21:22:43 +02:00
color.proto
command_attach_card.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_change_zone_properties.proto Always look at top card (#4238) 2021-03-13 14:54:13 -05:00
command_concede.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_create_arrow.proto
command_create_counter.proto
command_create_token.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_deck_del_dir.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_deck_del.proto
command_deck_download.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_deck_list.proto
command_deck_new_dir.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_deck_select.proto
command_deck_upload.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_del_counter.proto
command_delete_arrow.proto
command_draw_cards.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_dump_zone.proto
command_flip_card.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_game_say.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_inc_card_counter.proto
command_inc_counter.proto
command_kick_from_game.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_leave_game.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_move_card.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_mulligan.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_next_turn.proto
command_ready_start.proto
command_replay_delete_match.proto
command_replay_download.proto
command_replay_list.proto
command_replay_modify_match.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_reveal_cards.proto Allow revealing specific cards from hand and library (#4743) 2023-02-07 17:12:04 -05:00
command_reverse_turn.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_roll_die.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_set_active_phase.proto
command_set_card_attr.proto
command_set_card_counter.proto
command_set_counter.proto
command_set_sideboard_lock.proto
command_set_sideboard_plan.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_shuffle.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
command_undo_draw.proto
commands.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
context_concede.proto Unconcede (#3515) 2019-01-27 12:50:41 -05:00
context_connection_state_changed.proto
context_deck_select.proto
context_move_card.proto
context_mulligan.proto
context_ping_changed.proto
context_ready_start.proto
context_set_sideboard_lock.proto
context_undo_draw.proto
event_add_to_list.proto
event_attach_card.proto
event_change_zone_properties.proto Always look at top card (#4238) 2021-03-13 14:54:13 -05:00
event_connection_closed.proto
event_create_arrow.proto
event_create_counter.proto
event_create_token.proto
event_del_counter.proto
event_delete_arrow.proto
event_destroy_card.proto
event_draw_cards.proto
event_dump_zone.proto
event_flip_card.proto
event_game_closed.proto
event_game_host_changed.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
event_game_joined.proto Judge mode (#3531) 2019-02-21 14:00:00 -05:00
event_game_say.proto
event_game_state_changed.proto
event_join_room.proto
event_join.proto
event_kicked.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
event_leave_room.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
event_leave.proto Specify reason when on game leave; fix #2624 (#2633) 2017-04-24 22:20:08 +02:00
event_list_games.proto
event_list_rooms.proto
event_move_card.proto
event_notify_user.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
event_player_properties_changed.proto
event_remove_from_list.proto
event_remove_messages.proto add option to delete a user's messages (#4362) 2021-09-14 16:05:20 -04:00
event_replay_added.proto
event_reveal_cards.proto Allow revealing specific cards from hand and library (#4743) 2023-02-07 17:12:04 -05:00
event_reverse_turn.proto Add a new command to reverse turn order (#3802) 2019-08-27 20:04:27 -04:00
event_roll_die.proto
event_room_say.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
event_server_complete_list.proto
event_server_identification.proto allow login using hashed passwords (#4464) 2021-11-09 20:00:41 -05:00
event_server_message.proto
event_server_shutdown.proto
event_set_active_phase.proto
event_set_active_player.proto
event_set_card_attr.proto
event_set_card_counter.proto
event_set_counter.proto
event_shuffle.proto Move to bottom of library in random order. (#3549) 2019-02-07 14:08:44 -05:00
event_user_joined.proto
event_user_left.proto
event_user_message.proto
game_commands.proto deprecate the gender property from the protocol entirely (#4496) 2021-12-14 01:51:57 -05:00
game_event_container.proto Judge mode (#3531) 2019-02-21 14:00:00 -05:00
game_event_context.proto Unconcede (#3515) 2019-01-27 12:50:41 -05:00
game_event.proto deprecate the gender property from the protocol entirely (#4496) 2021-12-14 01:51:57 -05:00
game_replay.proto
isl_message.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
moderator_commands.proto add option to delete a user's messages (#4362) 2021-09-14 16:05:20 -04:00
move_card_to_zone.proto
response_activate.proto
response_adjust_mod.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
response_ban_history.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
response_deck_download.proto
response_deck_list.proto
response_deck_upload.proto
response_dump_zone.proto
response_forgotpasswordrequest.proto Simpler forgot password functionality (#2393) 2017-02-15 17:41:40 -05:00
response_get_games_of_user.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
response_get_user_info.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
response_join_room.proto
response_list_users.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
response_login.proto
response_password_salt.proto allow login using hashed passwords (#4464) 2021-11-09 20:00:41 -05:00
response_register.proto
response_replay_download.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
response_replay_list.proto
response_viewlog_history.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
response_warn_history.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
response_warn_list.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
response.proto allow login using hashed passwords (#4464) 2021-11-09 20:00:41 -05:00
room_commands.proto Create game as spectator (#4281) 2021-03-13 14:39:25 -05:00
room_event.proto add option to delete a user's messages (#4362) 2021-09-14 16:05:20 -04:00
server_message.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
serverinfo_arrow.proto
serverinfo_ban.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
serverinfo_card.proto
serverinfo_cardcounter.proto
serverinfo_chat_message.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
serverinfo_counter.proto
serverinfo_deckstorage.proto
serverinfo_game.proto
serverinfo_gametype.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
serverinfo_player.proto
serverinfo_playerping.proto
serverinfo_playerproperties.proto Judge mode (#3531) 2019-02-21 14:00:00 -05:00
serverinfo_replay_match.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
serverinfo_replay.proto
serverinfo_room.proto Smarter rooms (#2484) 2017-03-22 21:45:16 -04:00
serverinfo_user.proto deprecate the gender property from the protocol entirely (#4496) 2021-12-14 01:51:57 -05:00
serverinfo_warning.proto apply clang format to proto files (#4123) 2020-10-02 12:14:05 -04:00
serverinfo_zone.proto Always look at top card (#4238) 2021-03-13 14:54:13 -05:00
session_commands.proto remove unused include in pb file (#4572) 2022-02-12 23:40:47 +01:00
session_event.proto