Skip to content

Commit

Permalink
Fix #68 2
Browse files Browse the repository at this point in the history
  • Loading branch information
katahiromz committed Apr 4, 2024
1 parent 4c73732 commit 284bf69
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 10 deletions.
35 changes: 27 additions & 8 deletions GUI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1411,42 +1411,56 @@ bool __fastcall XgSaveSettings(void)

//////////////////////////////////////////////////////////////////////////////

void XgFailureSound(bool bPlaySound)
{
// 必要なら音声を鳴らす。
if (bPlaySound && xg_aszSoundFiles[I_SOUND_FAILED][0]) {
::PlaySoundW(xg_aszSoundFiles[I_SOUND_FAILED], NULL, SND_ASYNC | SND_FILENAME);
}
}

// クロスワードをチェックする。
bool __fastcall XgCheckCrossWord(HWND hwnd, bool check_words, bool loose)
bool __fastcall XgCheckCrossWord(HWND hwnd, bool check_words, bool loose, bool bPlaySound)
{
// 四隅黒禁。
if ((xg_nRules & RULE_DONTCORNERBLACK) && xg_xword.CornerBlack()) {
XgFailureSound(bPlaySound);
XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_CORNERBLOCK), nullptr, MB_ICONERROR);
return false;
}

// 連黒禁。
if ((xg_nRules & RULE_DONTDOUBLEBLACK) && xg_xword.DoubleBlack()) {
XgFailureSound(bPlaySound);
XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_ADJACENTBLOCK), nullptr, MB_ICONERROR);
return false;
}

// 三方黒禁。
if ((xg_nRules & RULE_DONTTRIDIRECTIONS) && xg_xword.TriBlackAround()) {
XgFailureSound(bPlaySound);
XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_TRIBLOCK), nullptr, MB_ICONERROR);
return false;
}

// 分断禁。
if ((xg_nRules & RULE_DONTDIVIDE) && xg_xword.DividedByBlack()) {
XgFailureSound(bPlaySound);
XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_DIVIDED), nullptr, MB_ICONERROR);
return false;
}

// 黒斜三連禁。
if (xg_nRules & RULE_DONTTHREEDIAGONALS) {
if (xg_xword.ThreeDiagonals()) {
XgFailureSound(bPlaySound);
XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_THREEDIAGONALS), nullptr, MB_ICONERROR);
return false;
}
} else if (xg_nRules & RULE_DONTFOURDIAGONALS) {
// 黒斜四連禁。
if (xg_xword.FourDiagonals()) {
XgFailureSound(bPlaySound);
XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_FOURDIAGONALS), nullptr, MB_ICONERROR);
return false;
}
Expand All @@ -1455,28 +1469,33 @@ bool __fastcall XgCheckCrossWord(HWND hwnd, bool check_words, bool loose)
if (!loose) {
// 黒マス点対称。
if ((xg_nRules & RULE_POINTSYMMETRY) && !xg_xword.IsPointSymmetry()) {
XgFailureSound(bPlaySound);
XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_NOTPOINTSYMMETRY), nullptr, MB_ICONERROR);
return false;
}

// 黒マス線対称。
if ((xg_nRules & RULE_LINESYMMETRYV) && !xg_xword.IsLineSymmetryV()) {
XgFailureSound(bPlaySound);
XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_NOTLINESYMMETRYV), nullptr, MB_ICONERROR);
return false;
}
if ((xg_nRules & RULE_LINESYMMETRYH) && !xg_xword.IsLineSymmetryH()) {
XgFailureSound(bPlaySound);
XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_NOTLINESYMMETRYH), nullptr, MB_ICONERROR);
return false;
}
}

// 偶数行数で黒マス線対称(タテ)の場合は連黒禁は不可。
if (!(xg_nRows & 1) && (xg_nRules & RULE_LINESYMMETRYV) && (xg_nRules & RULE_DONTDOUBLEBLACK)) {
XgFailureSound(bPlaySound);
XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_EVENROWLINESYMV), nullptr, MB_ICONERROR);
return false;
}
// 偶数列数で黒マス線対称(ヨコ)の場合は連黒禁は不可。
if (!(xg_nCols & 1) && (xg_nRules & RULE_LINESYMMETRYH) && (xg_nRules & RULE_DONTDOUBLEBLACK)) {
XgFailureSound(bPlaySound);
XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_EVENCOLLINESYMH), nullptr, MB_ICONERROR);
return false;
}
Expand All @@ -1488,6 +1507,7 @@ bool __fastcall XgCheckCrossWord(HWND hwnd, bool check_words, bool loose)
if (code == xg_epv_PATNOTMATCH) {
if (check_words) {
// パターンにマッチしないマスがあった。
XgFailureSound(bPlaySound);
WCHAR sz[128];
StringCchPrintf(sz, _countof(sz), XgLoadStringDx1(IDS_NOCANDIDATE), pos.m_j + 1, pos.m_i + 1);
XgCenterMessageBoxW(hwnd, sz, nullptr, MB_ICONERROR);
Expand All @@ -1500,6 +1520,7 @@ bool __fastcall XgCheckCrossWord(HWND hwnd, bool check_words, bool loose)
} else if (code == xg_epv_LENGTHMISMATCH) {
if (check_words) {
// 登録されている単語と長さの一致しないスペースがあった。
XgFailureSound(bPlaySound);
WCHAR sz[128];
StringCchPrintf(sz, _countof(sz), XgLoadStringDx1(IDS_TOOLONGSPACE), pos.m_j + 1, pos.m_i + 1);
XgCenterMessageBoxW(hwnd, sz, nullptr, MB_ICONERROR);
Expand All @@ -1517,6 +1538,7 @@ bool __fastcall XgCheckCrossWord(HWND hwnd, bool check_words, bool loose)
StringCchPrintfW(szText, _countof(szText), XgLoadStringDx1(IDS_NOTREGDWORD), str.c_str());

// 未登録単語があることを1回だけ警告。
XgFailureSound(bPlaySound);
if (XgCenterMessageBoxW(hwnd, szText, XgLoadStringDx2(IDS_WARNING),
MB_ICONWARNING | MB_YESNOCANCEL) != IDYES)
{
Expand Down Expand Up @@ -2872,10 +2894,7 @@ void __fastcall XgShowResults(HWND hwnd, BOOL bOK)
XgCenterMessageBoxW(hwnd, sz, XgLoadStringDx2(IDS_RESULTS), MB_ICONINFORMATION);
}
} else {
// 必要なら音声を鳴らす。
if (xg_aszSoundFiles[I_SOUND_FAILED][0]) {
::PlaySoundW(xg_aszSoundFiles[I_SOUND_FAILED], NULL, SND_ASYNC | SND_FILENAME);
}
// もう音を鳴らしているはずだ。。。
// 失敗メッセージを表示する。
StringCchPrintf(sz, _countof(sz), XgLoadStringDx1(IDS_CANTMAKEPROBLEM),
DWORD(xg_dwlTick2 - xg_dwlTick0) / 1000,
Expand Down Expand Up @@ -3151,7 +3170,7 @@ bool __fastcall XgOnSolve_AddBlack(HWND hwnd)

// 黒マスルールなどをチェックする。
xg_bNoAddBlack = false;
if (!XgCheckCrossWord(hwnd)) {
if (!XgCheckCrossWord(hwnd, true, false, true)) {
return false;
}

Expand Down Expand Up @@ -3256,7 +3275,7 @@ bool __fastcall XgOnSolve_NoAddBlack(HWND hwnd)

// 黒マスルールなどをチェックする。
xg_bNoAddBlack = true;
if (!XgCheckCrossWord(hwnd)) {
if (!XgCheckCrossWord(hwnd, true, false, true)) {
return false;
}

Expand Down Expand Up @@ -3358,7 +3377,7 @@ bool __fastcall XgOnSolve_NoAddBlackNoResults(HWND hwnd)

// 黒マスルールなどをチェックする。
xg_bNoAddBlack = true;
if (!XgCheckCrossWord(hwnd)) {
if (!XgCheckCrossWord(hwnd, true, false, true)) {
return false;
}

Expand Down
2 changes: 1 addition & 1 deletion GUI.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ void XgShowHints(HWND hwnd);
extern BOOL xg_bShowClues;

// クロスワードをチェックする。
bool __fastcall XgCheckCrossWord(HWND hwnd, bool check_words = true, bool loose = false);
bool __fastcall XgCheckCrossWord(HWND hwnd, bool check_words = true, bool loose = false, bool bPlaySound = false);

//////////////////////////////////////////////////////////////////////////////

Expand Down
2 changes: 1 addition & 1 deletion XG_CandsWnd.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ class XG_CandsWnd : public XG_Window
XG_CandsWnd::xg_vecCandidates.resize(xg_nMaxCandidates);

if (XG_CandsWnd::xg_vecCandidates.empty()) {
if (XgCheckCrossWord(hwnd, false, true)) {
if (XgCheckCrossWord(hwnd, false, true, false)) {
::MessageBeep(0xFFFFFFFF);
} else {
return false;
Expand Down

0 comments on commit 284bf69

Please sign in to comment.