#include "rugby-scoring.h" /** * rugby_scoring_get_possibilities: * @score: the score of a team * * Gets the possible ways of scoring @score points, as a %GVariant of the * type "a(iii)", in the order "tries, utries, pens". * * Returns: (transfer-none): the possibilities, or %NULL in the case there are * none */ GVariant * rugby_scoring_get_possibilities (gint score) { GVariantBuilder builder; gint possibilities = 0; gint max_tries, max_utries; gint tries, utries; g_return_val_if_fail (score >= 0, NULL); g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY); max_tries = (gint) (score / TRY_POINTS); max_utries = (gint) (score / UTRY_POINTS); for (tries = 0; tries <= max_tries; tries++) { for (utries = 0; utries <= max_utries; utries++) { gint left; /* Calculate left over score for penalties */ left = score - (tries * TRY_POINTS) - (utries * UTRY_POINTS); if (left < 0) continue; /* If the score after pens is 0, it's a possibility */ if (left % KICK_POINTS == 0) { gint pens; pens = left / KICK_POINTS; /* Add result to variant */ g_variant_builder_add (&builder, "(iii)", tries, utries, pens); possibilities++; } } } if (possibilities == 0) return NULL; else return g_variant_builder_end (&builder); } /** * rugby_scoring_get_max_tries: * @score: the score of a team * * Gets the maximum number of tries possible for a given score. Not related to * Max Evans. * * Returns: the maximum number of tries possible */ gint rugby_scoring_get_max_tries (gint score) { return (score % 5 == 1) ? score / UTRY_POINTS - 1 : score / UTRY_POINTS; } /** * rugby_scoring_get_max_kicks: * @score: the score of a team * * Gets the maximum number of kicks (penalties and drop goals) for a given score. * * Returns: the maximum number of kicks possible */ gint rugby_scoring_get_max_kicks (gint score) { return (score % 3 == 1) ? score / KICK_POINTS : score / KICK_POINTS - 1; }