// Copyright 2025 Bill Rossi
//
// This file is part of Hanafuda Hachi-Hachi.
//
// Hanafuda Hachi-Hachi is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
//
// Hanafuda Hachi-Hachi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with Hanafuda Hachi-Hachi. If not, see .
#include
#include
#include "dekiyaku.h"
void calculate_dekiyaku(Hand *h, Dekiyaku *d) {
int brights = 0, ribbons = 0, ribbons_except_november = 0, blue_ribbons = 0, poetry_ribbons = 0, boar = 0, deer = 0, butterflies = 0;
for (int i = 0; i < h->count; i++) {
Card *card = h->cards[i];
switch (card->type) {
case BRIGHT: brights++; break;
case RIBBON:
ribbons++;
if (card->month != NOVEMBER) ribbons_except_november++;
switch (card->ribbon_type) {
case RIBBON_BLUE: blue_ribbons++; break;
case RIBBON_POETRY: poetry_ribbons++; break;
default: break;
}
break;
case ANIMAL:
switch (card->month) {
case JUNE: butterflies++; break;
case JULY: boar++; break;
case OCTOBER: deer++; break;
default: break;
}
break;
case CHAFF:
break;
}
}
d->count = 0;
if (brights == 5) {
d->meld[d->count].type = FIVE_BRIGHTS;
d->meld[d->count].value = 12;
d->count++;
}
if (brights == 4) {
d->meld[d->count].type = FOUR_BRIGHTS;
d->meld[d->count].value = 10;
d->count++;
}
if (ribbons_except_november >= 7) {
d->meld[d->count].type = SEVEN_RIBBONS;
d->meld[d->count].value = 3 + ribbons; // Include november ribbons in this count
d->count++;
}
if (poetry_ribbons == 3) {
d->meld[d->count].type = POETRY_RIBBONS;
d->meld[d->count].value = 7;
d->count++;
}
if (blue_ribbons == 3) {
d->meld[d->count].type = BLUE_RIBBONS;
d->meld[d->count].value = 7;
d->count++;
}
if (boar == 1 && deer == 1 && butterflies == 1) {
d->meld[d->count].type = BOAR_DEER_BUTTERFLIES;
d->meld[d->count].value = 7;
d->count++;
}
}
char *meld_name(DekiyakuMeldType d) {
switch (d) {
case FIVE_BRIGHTS:
return "5B";
case FOUR_BRIGHTS:
return "4B";
case SEVEN_RIBBONS:
return "7R";
case POETRY_RIBBONS:
return "PS";
case BLUE_RIBBONS:
return "BS";
case BOAR_DEER_BUTTERFLIES:
return "ISK";
default:
return "None";
}
}
int dekiyaku_value(Dekiyaku *d) {
int value = 0;
for (int i = 0; i < d->count; i++) {
value += d->meld[i].value;
}
return value;
}
void dekiyaku_to_string(Dekiyaku *d, char *str) {
char meld_str[200];
strcpy(str, "Dekiyaku: ");
for (int i = 0; i < d->count; i++) {
sprintf(meld_str, "%s (%d) + ", meld_name(d->meld[i].type), d->meld[i].value);
strcat(str, meld_str);
}
if (d->count == 0) strcat(str, "none (0)");
else {
str[strlen(str) - 2] = '=';
sprintf(meld_str, "%d", dekiyaku_value(d));
strcat(str, meld_str);
}
}
int dekiyaku_score(Dekiyaku *d) {
int score = 0;
for (int i = 0; i < d->count; i++) {
score += d->meld[i].value;
}
return score;
}