/* * Copyright (c) 2021, Gunnar Beutner * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include "Helpers.h" #include #include using Cards::Card; namespace Hearts { enum class PassingDirection { Left, Right, Across }; struct CardWithIndex { NonnullRefPtr card; size_t index; }; struct Player { AK_MAKE_NONMOVABLE(Player); public: Player() { } NonnullRefPtrVector pick_cards_to_pass(PassingDirection); size_t pick_lead_card(Function, Function); Optional pick_low_points_high_value_card(Optional suit = {}); Optional pick_lower_value_card(Card& other_card); Optional pick_slightly_higher_value_card(Card& other_card); size_t pick_max_points_card(Function); Optional pick_specific_card(Cards::Suit suit, CardValue value); size_t pick_last_card(); bool has_card_of_suit(Cards::Suit suit); Vector hand_sorted_by_fn(bool (*)(CardWithIndex&, CardWithIndex&)) const; void sort_hand() { quick_sort(hand, hearts_card_less); } void remove_cards(NonnullRefPtrVector const& cards); Vector> hand; Vector> cards_taken; Vector scores; Gfx::IntPoint first_card_position; Gfx::IntPoint card_offset; Gfx::IntRect name_position; Gfx::TextAlignment name_alignment; Gfx::IntPoint taken_cards_target; String name; bool is_human { false }; }; } template<> struct AK::Formatter : Formatter { ErrorOr format(FormatBuilder& builder, Hearts::Player const& player) { return builder.put_string(player.name); } };