#pragma semicolon 1
#include <colors>
#define MAX_ATTEMPTS 6
#define WORD_LENGTH 5
char g_sWord[WORD_LENGTH * 3 + 1],
g_sWordList[][] = {"песня", "груша", "ветер", "лампа", "точка", "скала"};
bool g_bUsedWords[sizeof(g_sWordList)],
g_bStopGame;
int g_iAttempts[MAXPLAYERS + 1];
public void OnPluginStart()
{
RegConsoleCmd("sm_wordle", Cmd_Startuem);
SelectRandomWord();
}
public Action Cmd_Startuem(int iClient, int iArgs)
{
if (iClient < 0 || !IsClientInGame(iClient)) return Plugin_Handled;
if (g_bStopGame)
{
CPrintToChat(iClient, "{red}Нет слов в списке! Игра окончена.");
return Plugin_Handled;
}
if (iArgs != 1)
{
ReplyToCommand(iClient, "Использование: sm_wordle <слово из %d букв>", WORD_LENGTH);
return Plugin_Handled;
}
char iInputWord[WORD_LENGTH * 3 + 1];
GetCmdArg(1, iInputWord, sizeof(iInputWord));
if (GetUtf8CharCount(iInputWord) != WORD_LENGTH)
{
ReplyToCommand(iClient, "Слово должно содержать ровно %d букв!", WORD_LENGTH);
return Plugin_Handled;
}
CheckWord(iClient, iInputWord);
return Plugin_Handled;
}
void SelectRandomWord()
{
int iAvailableWords[sizeof(g_sWordList)],
iCount;
for (int i = 0; i < sizeof(g_sWordList); i++)
if (!g_bUsedWords[i])
iAvailableWords[iCount++] = i;
if (iCount == 0)
{
g_bStopGame = true;
return;
}
int iIndex = iAvailableWords[GetRandomInt(0, iCount - 1)];
g_bUsedWords[iIndex] = true;
strcopy(g_sWord, sizeof(g_sWord), g_sWordList[iIndex]);
}
void CheckWord(int iClient, char[] iInputWord)
{
g_iAttempts[iClient]++;
if (StrEqual(iInputWord, g_sWord, false))
{
CPrintToChat(iClient, "{green}Поздравляем! {default}Вы угадали слово: {green}%s", g_sWord);
g_iAttempts[iClient] = 0;
SelectRandomWord();
return;
}
char sMsg[128], sInputStr[8], sOutputStr[8];
int iInputPos, iOutputPos;
for (int i = 0; i < WORD_LENGTH; i++)
{
iInputPos += ReadUtf8Char(iInputWord[iInputPos], sInputStr, sizeof(sInputStr));
iOutputPos += ReadUtf8Char(g_sWord[iOutputPos], sOutputStr, sizeof(sOutputStr));
if (StrEqual(sInputStr, sOutputStr, false)) Format(sMsg, sizeof(sMsg), "%s{green}[%s]", sMsg, sInputStr);
else if (StrContains(g_sWord, sInputStr, false) != -1) Format(sMsg, sizeof(sMsg), "%s{default}[%s]", sMsg, sInputStr);
else Format(sMsg, sizeof(sMsg), "%s{red}[%s]", sMsg, sInputStr);
}
CPrintToChat(iClient, "Результат: %s", sMsg);
if (g_iAttempts[iClient] >= MAX_ATTEMPTS)
{
CPrintToChat(iClient, "{red}Вы проиграли! {default}Загаданное слово было: {green}%s", g_sWord);
g_iAttempts[iClient] = 0;
SelectRandomWord();
}
}
int GetUtf8CharCount(const char[] szStr)
{
int iCount;
for (int i = 0; i < strlen(szStr); i++)
if ((szStr[i] & 0xC0) != 0x80)
iCount++;
return iCount;
}
int ReadUtf8Char(const char[] szStr, char[] sOut, int iSize)
{
if (strlen(szStr) == 0) return 0;
int bytes = 1;
if ((szStr[0] & 0xE0) == 0xC0) bytes = 2;
else if ((szStr[0] & 0xF0) == 0xE0) bytes = 3;
else if ((szStr[0] & 0xF8) == 0xF0) bytes = 4;
for (int i = 0; i < bytes && i < iSize - 1; i++) sOut[i] = szStr[i];
sOut[bytes] = '\0';
return bytes;
}