From 73b941d5eb2d2a4f2e811e5df909a517daed7619 Mon Sep 17 00:00:00 2001 From: Konstantin Dyachenko Date: Fri, 6 Mar 2026 23:29:46 +0700 Subject: [PATCH] [Add] Master Category --- Assets/Data/Categories/CategoryCatalog.asset | 28 ++-- Assets/Data/Categories/Master.meta | 8 + .../Master/10_MasterKindCategory_4.asset | 22 +++ .../Master/10_MasterKindCategory_4.asset.meta | 8 + .../Master/11_MasterKindCategory_5.asset | 22 +++ .../Master/11_MasterKindCategory_5.asset.meta | 8 + .../Master/12_MasterKindCategory_6.asset | 22 +++ .../Master/12_MasterKindCategory_6.asset.meta | 8 + .../Categories/Master/13_SumAllCategory.asset | 19 +++ .../Master/13_SumAllCategory.asset.meta | 8 + .../Master/1_MasterValueCategory1.asset | 21 +++ .../Master/1_MasterValueCategory1.asset.meta | 8 + .../Master/2_MasterValueCategory2.asset | 21 +++ .../Master/2_MasterValueCategory2.asset.meta | 8 + .../Master/3_MasterValueCategory3.asset | 21 +++ .../Master/3_MasterValueCategory3.asset.meta | 8 + .../Master/4_MasterValueCategory4.asset | 21 +++ .../Master/4_MasterValueCategory4.asset.meta | 8 + .../Master/5_MasterValueCategory5.asset | 21 +++ .../Master/5_MasterValueCategory5.asset.meta | 8 + .../Master/6_MasterValueCategory6.asset | 21 +++ .../Master/6_MasterValueCategory6.asset.meta | 8 + .../Master/7_MasterStraightCategory.asset | 20 +++ .../7_MasterStraightCategory.asset.meta | 8 + ..._MasterGroupedSetsCategory_smallfull.asset | 22 +++ ...erGroupedSetsCategory_smallfull.asset.meta | 8 + .../9_MasterGroupedSetsCategory_bigfull.asset | 22 +++ ...sterGroupedSetsCategory_bigfull.asset.meta | 8 + .../Categories/Definition/CategoryCatalog.cs | 8 +- .../Definition/MasterGroupedSetsCategory.cs | 46 ++++++ .../MasterGroupedSetsCategory.cs.meta | 2 + .../Definition/MasterKindCategory.cs | 46 ++++++ .../Definition/MasterKindCategory.cs.meta | 2 + .../Definition/MasterStraightCategory.cs | 33 ++++ .../Definition/MasterStraightCategory.cs.meta | 2 + .../Definition/MasterValueCategory.cs | 35 ++++ .../Definition/MasterValueCategory.cs.meta | 2 + Assets/Scripts/Categories/DiceCheckUtility.cs | 78 +++++++++ .../Tests/Editor/MasterCategoryTests.cs | 153 ++++++++++++++++++ .../Tests/Editor/MasterCategoryTests.cs.meta | 2 + .../UI/Presentation/ScoreSummaryService.cs | 7 +- Assets/Scripts/UI/ScoreCardView.cs | 7 +- 42 files changed, 817 insertions(+), 21 deletions(-) create mode 100644 Assets/Data/Categories/Master.meta create mode 100644 Assets/Data/Categories/Master/10_MasterKindCategory_4.asset create mode 100644 Assets/Data/Categories/Master/10_MasterKindCategory_4.asset.meta create mode 100644 Assets/Data/Categories/Master/11_MasterKindCategory_5.asset create mode 100644 Assets/Data/Categories/Master/11_MasterKindCategory_5.asset.meta create mode 100644 Assets/Data/Categories/Master/12_MasterKindCategory_6.asset create mode 100644 Assets/Data/Categories/Master/12_MasterKindCategory_6.asset.meta create mode 100644 Assets/Data/Categories/Master/13_SumAllCategory.asset create mode 100644 Assets/Data/Categories/Master/13_SumAllCategory.asset.meta create mode 100644 Assets/Data/Categories/Master/1_MasterValueCategory1.asset create mode 100644 Assets/Data/Categories/Master/1_MasterValueCategory1.asset.meta create mode 100644 Assets/Data/Categories/Master/2_MasterValueCategory2.asset create mode 100644 Assets/Data/Categories/Master/2_MasterValueCategory2.asset.meta create mode 100644 Assets/Data/Categories/Master/3_MasterValueCategory3.asset create mode 100644 Assets/Data/Categories/Master/3_MasterValueCategory3.asset.meta create mode 100644 Assets/Data/Categories/Master/4_MasterValueCategory4.asset create mode 100644 Assets/Data/Categories/Master/4_MasterValueCategory4.asset.meta create mode 100644 Assets/Data/Categories/Master/5_MasterValueCategory5.asset create mode 100644 Assets/Data/Categories/Master/5_MasterValueCategory5.asset.meta create mode 100644 Assets/Data/Categories/Master/6_MasterValueCategory6.asset create mode 100644 Assets/Data/Categories/Master/6_MasterValueCategory6.asset.meta create mode 100644 Assets/Data/Categories/Master/7_MasterStraightCategory.asset create mode 100644 Assets/Data/Categories/Master/7_MasterStraightCategory.asset.meta create mode 100644 Assets/Data/Categories/Master/8_MasterGroupedSetsCategory_smallfull.asset create mode 100644 Assets/Data/Categories/Master/8_MasterGroupedSetsCategory_smallfull.asset.meta create mode 100644 Assets/Data/Categories/Master/9_MasterGroupedSetsCategory_bigfull.asset create mode 100644 Assets/Data/Categories/Master/9_MasterGroupedSetsCategory_bigfull.asset.meta create mode 100644 Assets/Scripts/Categories/Definition/MasterGroupedSetsCategory.cs create mode 100644 Assets/Scripts/Categories/Definition/MasterGroupedSetsCategory.cs.meta create mode 100644 Assets/Scripts/Categories/Definition/MasterKindCategory.cs create mode 100644 Assets/Scripts/Categories/Definition/MasterKindCategory.cs.meta create mode 100644 Assets/Scripts/Categories/Definition/MasterStraightCategory.cs create mode 100644 Assets/Scripts/Categories/Definition/MasterStraightCategory.cs.meta create mode 100644 Assets/Scripts/Categories/Definition/MasterValueCategory.cs create mode 100644 Assets/Scripts/Categories/Definition/MasterValueCategory.cs.meta create mode 100644 Assets/Scripts/Tests/Editor/MasterCategoryTests.cs create mode 100644 Assets/Scripts/Tests/Editor/MasterCategoryTests.cs.meta diff --git a/Assets/Data/Categories/CategoryCatalog.asset b/Assets/Data/Categories/CategoryCatalog.asset index 3ec1586..3838865 100644 --- a/Assets/Data/Categories/CategoryCatalog.asset +++ b/Assets/Data/Categories/CategoryCatalog.asset @@ -12,17 +12,19 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e89ee3a4aac1e6d4eabd79f32b9d8d15, type: 3} m_Name: CategoryCatalog m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.CategoryCatalog + upperBonusThreshold: 63 + upperBonusValue: 35 categories: - - {fileID: 11400000, guid: ad75115a9ee3dd34598b1521d1f34a08, type: 2} - - {fileID: 11400000, guid: 5be00d38f4e40664788d28114856e446, type: 2} - - {fileID: 11400000, guid: 7474d22b4785b4b42a16be1fe12e53e3, type: 2} - - {fileID: 11400000, guid: 492827790313e6f43944e19a0f3a6a9c, type: 2} - - {fileID: 11400000, guid: 7e18f115081820946a1a4a53d56f4f0f, type: 2} - - {fileID: 11400000, guid: 4b1c9794957ddfb48a7674531139919b, type: 2} - - {fileID: 11400000, guid: 89432fbaba032e646994088d85b96c99, type: 2} - - {fileID: 11400000, guid: 9ea1413e6e9091d4996ee74dd769d671, type: 2} - - {fileID: 11400000, guid: 24c8bd19b58357749a1819c0e0c124d9, type: 2} - - {fileID: 11400000, guid: 0ed686ef060a26a48a9892d467f83bc2, type: 2} - - {fileID: 11400000, guid: e9bf7be35c88f2845a4ad5dc81c5b9d2, type: 2} - - {fileID: 11400000, guid: 3241fb265c623174fac9d0d1ca1f5f05, type: 2} - - {fileID: 11400000, guid: 0822490ecb8ce224d861379ddb7b76ab, type: 2} + - {fileID: 11400000, guid: 8b91a7af0ef2405ab2cf880b4ee6d201, type: 2} + - {fileID: 11400000, guid: 8b91a7af0ef2405ab2cf880b4ee6d202, type: 2} + - {fileID: 11400000, guid: 8b91a7af0ef2405ab2cf880b4ee6d203, type: 2} + - {fileID: 11400000, guid: 8b91a7af0ef2405ab2cf880b4ee6d204, type: 2} + - {fileID: 11400000, guid: 8b91a7af0ef2405ab2cf880b4ee6d205, type: 2} + - {fileID: 11400000, guid: 8b91a7af0ef2405ab2cf880b4ee6d206, type: 2} + - {fileID: 11400000, guid: 8b91a7af0ef2405ab2cf880b4ee6d207, type: 2} + - {fileID: 11400000, guid: 8b91a7af0ef2405ab2cf880b4ee6d208, type: 2} + - {fileID: 11400000, guid: 8b91a7af0ef2405ab2cf880b4ee6d209, type: 2} + - {fileID: 11400000, guid: 8b91a7af0ef2405ab2cf880b4ee6d210, type: 2} + - {fileID: 11400000, guid: 8b91a7af0ef2405ab2cf880b4ee6d211, type: 2} + - {fileID: 11400000, guid: 8b91a7af0ef2405ab2cf880b4ee6d212, type: 2} + - {fileID: 11400000, guid: 8b91a7af0ef2405ab2cf880b4ee6d213, type: 2} diff --git a/Assets/Data/Categories/Master.meta b/Assets/Data/Categories/Master.meta new file mode 100644 index 0000000..721e7cf --- /dev/null +++ b/Assets/Data/Categories/Master.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d111 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Data/Categories/Master/10_MasterKindCategory_4.asset b/Assets/Data/Categories/Master/10_MasterKindCategory_4.asset new file mode 100644 index 0000000..c0acbd3 --- /dev/null +++ b/Assets/Data/Categories/Master/10_MasterKindCategory_4.asset @@ -0,0 +1,22 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc004, type: 3} + m_Name: 10_MasterKindCategory_4 + m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.MasterKindCategory + k__BackingField: master_four_of_a_kind + k__BackingField: "\u041A\u0430\u0440\u0435" + k__BackingField: "\u0427\u0435\u0442\u044B\u0440\u0435 \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u044B\u0445: \u0441\u0443\u043C\u043C\u0430 \u0433\u0440\u0443\u043F\u043F\u044B + n" + k__BackingField: {fileID: 21300000, guid: 8188071e2bba56c438a87b21f8d55641, type: 3} + k__BackingField: 0 + requiredCount: 4 + valueBonusMultiplier: 1 + flatBonus: 0 diff --git a/Assets/Data/Categories/Master/10_MasterKindCategory_4.asset.meta b/Assets/Data/Categories/Master/10_MasterKindCategory_4.asset.meta new file mode 100644 index 0000000..905f9cf --- /dev/null +++ b/Assets/Data/Categories/Master/10_MasterKindCategory_4.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d210 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Data/Categories/Master/11_MasterKindCategory_5.asset b/Assets/Data/Categories/Master/11_MasterKindCategory_5.asset new file mode 100644 index 0000000..aa93e0c --- /dev/null +++ b/Assets/Data/Categories/Master/11_MasterKindCategory_5.asset @@ -0,0 +1,22 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc004, type: 3} + m_Name: 11_MasterKindCategory_5 + m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.MasterKindCategory + k__BackingField: master_poker + k__BackingField: "\u041F\u043E\u043A\u0435\u0440" + k__BackingField: "\u041F\u044F\u0442\u044C \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u044B\u0445: \u0441\u0443\u043C\u043C\u0430 \u0433\u0440\u0443\u043F\u043F\u044B + n * 2" + k__BackingField: {fileID: 21300000, guid: 8188071e2bba56c438a87b21f8d55641, type: 3} + k__BackingField: 0 + requiredCount: 5 + valueBonusMultiplier: 2 + flatBonus: 0 diff --git a/Assets/Data/Categories/Master/11_MasterKindCategory_5.asset.meta b/Assets/Data/Categories/Master/11_MasterKindCategory_5.asset.meta new file mode 100644 index 0000000..e974c7a --- /dev/null +++ b/Assets/Data/Categories/Master/11_MasterKindCategory_5.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d211 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Data/Categories/Master/12_MasterKindCategory_6.asset b/Assets/Data/Categories/Master/12_MasterKindCategory_6.asset new file mode 100644 index 0000000..b6fa13d --- /dev/null +++ b/Assets/Data/Categories/Master/12_MasterKindCategory_6.asset @@ -0,0 +1,22 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc004, type: 3} + m_Name: 12_MasterKindCategory_6 + m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.MasterKindCategory + k__BackingField: master_master + k__BackingField: "\u041C\u0430\u0441\u0442\u0435\u0440" + k__BackingField: "\u0428\u0435\u0441\u0442\u044C \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u044B\u0445: \u0441\u0443\u043C\u043C\u0430 \u0433\u0440\u0443\u043F\u043F\u044B + n * 3" + k__BackingField: {fileID: 21300000, guid: 8188071e2bba56c438a87b21f8d55641, type: 3} + k__BackingField: 0 + requiredCount: 6 + valueBonusMultiplier: 3 + flatBonus: 0 diff --git a/Assets/Data/Categories/Master/12_MasterKindCategory_6.asset.meta b/Assets/Data/Categories/Master/12_MasterKindCategory_6.asset.meta new file mode 100644 index 0000000..53ea7d9 --- /dev/null +++ b/Assets/Data/Categories/Master/12_MasterKindCategory_6.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d212 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Data/Categories/Master/13_SumAllCategory.asset b/Assets/Data/Categories/Master/13_SumAllCategory.asset new file mode 100644 index 0000000..8fe5cda --- /dev/null +++ b/Assets/Data/Categories/Master/13_SumAllCategory.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: aeb4a3033474e7c4b945a3c5a71df067, type: 3} + m_Name: 13_SumAllCategory + m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.SumAllCategory + k__BackingField: chance + k__BackingField: "\u0428\u0430\u043D\u0441" + k__BackingField: "\u0421\u0443\u043C\u043C\u0430 \u0432\u0441\u0435\u0445 \u043A\u0443\u0431\u0438\u043A\u043E\u0432 \u0432 \u043B\u044E\u0431\u043E\u0439 \u043C\u043E\u043C\u0435\u043D\u0442" + k__BackingField: {fileID: 21300000, guid: 8188071e2bba56c438a87b21f8d55641, type: 3} + k__BackingField: 0 diff --git a/Assets/Data/Categories/Master/13_SumAllCategory.asset.meta b/Assets/Data/Categories/Master/13_SumAllCategory.asset.meta new file mode 100644 index 0000000..821941b --- /dev/null +++ b/Assets/Data/Categories/Master/13_SumAllCategory.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d213 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Data/Categories/Master/1_MasterValueCategory1.asset b/Assets/Data/Categories/Master/1_MasterValueCategory1.asset new file mode 100644 index 0000000..f9e6968 --- /dev/null +++ b/Assets/Data/Categories/Master/1_MasterValueCategory1.asset @@ -0,0 +1,21 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc001, type: 3} + m_Name: 1_MasterValueCategory1 + m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.MasterValueCategory + k__BackingField: master_ones + k__BackingField: "\u0415\u0434\u0438\u043D\u0438\u0446\u044B" + k__BackingField: "\u0421\u0443\u043C\u043C\u0430 \u0432\u0441\u0435\u0445 \u0435\u0434\u0438\u043D\u0438\u0446 + 1 \u0431\u043E\u043D\u0443\u0441 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0438" + k__BackingField: {fileID: 21300000, guid: 8188071e2bba56c438a87b21f8d55641, type: 3} + k__BackingField: 1 + k__BackingField: 1 + k__BackingField: 1 diff --git a/Assets/Data/Categories/Master/1_MasterValueCategory1.asset.meta b/Assets/Data/Categories/Master/1_MasterValueCategory1.asset.meta new file mode 100644 index 0000000..da4184a --- /dev/null +++ b/Assets/Data/Categories/Master/1_MasterValueCategory1.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d201 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Data/Categories/Master/2_MasterValueCategory2.asset b/Assets/Data/Categories/Master/2_MasterValueCategory2.asset new file mode 100644 index 0000000..47667f9 --- /dev/null +++ b/Assets/Data/Categories/Master/2_MasterValueCategory2.asset @@ -0,0 +1,21 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc001, type: 3} + m_Name: 2_MasterValueCategory2 + m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.MasterValueCategory + k__BackingField: master_twos + k__BackingField: "\u0414\u0432\u043E\u0439\u043A\u0438" + k__BackingField: "\u0421\u0443\u043C\u043C\u0430 \u0432\u0441\u0435\u0445 \u0434\u0432\u043E\u0435\u043A + 2 \u0431\u043E\u043D\u0443\u0441 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0438" + k__BackingField: {fileID: 21300000, guid: 8188071e2bba56c438a87b21f8d55641, type: 3} + k__BackingField: 1 + k__BackingField: 2 + k__BackingField: 2 diff --git a/Assets/Data/Categories/Master/2_MasterValueCategory2.asset.meta b/Assets/Data/Categories/Master/2_MasterValueCategory2.asset.meta new file mode 100644 index 0000000..13addca --- /dev/null +++ b/Assets/Data/Categories/Master/2_MasterValueCategory2.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d202 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Data/Categories/Master/3_MasterValueCategory3.asset b/Assets/Data/Categories/Master/3_MasterValueCategory3.asset new file mode 100644 index 0000000..3623033 --- /dev/null +++ b/Assets/Data/Categories/Master/3_MasterValueCategory3.asset @@ -0,0 +1,21 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc001, type: 3} + m_Name: 3_MasterValueCategory3 + m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.MasterValueCategory + k__BackingField: master_threes + k__BackingField: "\u0422\u0440\u043E\u0439\u043A\u0438" + k__BackingField: "\u0421\u0443\u043C\u043C\u0430 \u0432\u0441\u0435\u0445 \u0442\u0440\u043E\u0435\u043A + 3 \u0431\u043E\u043D\u0443\u0441 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0438" + k__BackingField: {fileID: 21300000, guid: 8188071e2bba56c438a87b21f8d55641, type: 3} + k__BackingField: 1 + k__BackingField: 3 + k__BackingField: 3 diff --git a/Assets/Data/Categories/Master/3_MasterValueCategory3.asset.meta b/Assets/Data/Categories/Master/3_MasterValueCategory3.asset.meta new file mode 100644 index 0000000..05dcb11 --- /dev/null +++ b/Assets/Data/Categories/Master/3_MasterValueCategory3.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d203 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Data/Categories/Master/4_MasterValueCategory4.asset b/Assets/Data/Categories/Master/4_MasterValueCategory4.asset new file mode 100644 index 0000000..0e7201a --- /dev/null +++ b/Assets/Data/Categories/Master/4_MasterValueCategory4.asset @@ -0,0 +1,21 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc001, type: 3} + m_Name: 4_MasterValueCategory4 + m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.MasterValueCategory + k__BackingField: master_fours + k__BackingField: "\u0427\u0435\u0442\u0432\u0435\u0440\u043A\u0438" + k__BackingField: "\u0421\u0443\u043C\u043C\u0430 \u0432\u0441\u0435\u0445 \u0447\u0435\u0442\u0432\u0435\u0440\u043E\u043A + 4 \u0431\u043E\u043D\u0443\u0441 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0438" + k__BackingField: {fileID: 21300000, guid: 8188071e2bba56c438a87b21f8d55641, type: 3} + k__BackingField: 1 + k__BackingField: 4 + k__BackingField: 4 diff --git a/Assets/Data/Categories/Master/4_MasterValueCategory4.asset.meta b/Assets/Data/Categories/Master/4_MasterValueCategory4.asset.meta new file mode 100644 index 0000000..f336c09 --- /dev/null +++ b/Assets/Data/Categories/Master/4_MasterValueCategory4.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d204 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Data/Categories/Master/5_MasterValueCategory5.asset b/Assets/Data/Categories/Master/5_MasterValueCategory5.asset new file mode 100644 index 0000000..c06cca5 --- /dev/null +++ b/Assets/Data/Categories/Master/5_MasterValueCategory5.asset @@ -0,0 +1,21 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc001, type: 3} + m_Name: 5_MasterValueCategory5 + m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.MasterValueCategory + k__BackingField: master_fives + k__BackingField: "\u041F\u044F\u0442\u0435\u0440\u043A\u0438" + k__BackingField: "\u0421\u0443\u043C\u043C\u0430 \u0432\u0441\u0435\u0445 \u043F\u044F\u0442\u0435\u0440\u043E\u043A + 5 \u0431\u043E\u043D\u0443\u0441 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0438" + k__BackingField: {fileID: 21300000, guid: 8188071e2bba56c438a87b21f8d55641, type: 3} + k__BackingField: 1 + k__BackingField: 5 + k__BackingField: 5 diff --git a/Assets/Data/Categories/Master/5_MasterValueCategory5.asset.meta b/Assets/Data/Categories/Master/5_MasterValueCategory5.asset.meta new file mode 100644 index 0000000..2abd1f1 --- /dev/null +++ b/Assets/Data/Categories/Master/5_MasterValueCategory5.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d205 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Data/Categories/Master/6_MasterValueCategory6.asset b/Assets/Data/Categories/Master/6_MasterValueCategory6.asset new file mode 100644 index 0000000..c85df67 --- /dev/null +++ b/Assets/Data/Categories/Master/6_MasterValueCategory6.asset @@ -0,0 +1,21 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc001, type: 3} + m_Name: 6_MasterValueCategory6 + m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.MasterValueCategory + k__BackingField: master_sixes + k__BackingField: "\u0428\u0435\u0441\u0442\u0435\u0440\u043A\u0438" + k__BackingField: "\u0421\u0443\u043C\u043C\u0430 \u0432\u0441\u0435\u0445 \u0448\u0435\u0441\u0442\u0435\u0440\u043E\u043A + 6 \u0431\u043E\u043D\u0443\u0441 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0438" + k__BackingField: {fileID: 21300000, guid: 8188071e2bba56c438a87b21f8d55641, type: 3} + k__BackingField: 1 + k__BackingField: 6 + k__BackingField: 6 diff --git a/Assets/Data/Categories/Master/6_MasterValueCategory6.asset.meta b/Assets/Data/Categories/Master/6_MasterValueCategory6.asset.meta new file mode 100644 index 0000000..3a10fe9 --- /dev/null +++ b/Assets/Data/Categories/Master/6_MasterValueCategory6.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d206 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Data/Categories/Master/7_MasterStraightCategory.asset b/Assets/Data/Categories/Master/7_MasterStraightCategory.asset new file mode 100644 index 0000000..1dce316 --- /dev/null +++ b/Assets/Data/Categories/Master/7_MasterStraightCategory.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc002, type: 3} + m_Name: 7_MasterStraightCategory + m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.MasterStraightCategory + k__BackingField: master_straight + k__BackingField: "\u0421\u0442\u0440\u0438\u0442" + k__BackingField: "1-2-3-4-5-6: \u0441\u0443\u043C\u043C\u0430 \u0432\u0441\u0435\u0445 \u043A\u0443\u0431\u0438\u043A\u043E\u0432 + 20" + k__BackingField: {fileID: 21300000, guid: 8188071e2bba56c438a87b21f8d55641, type: 3} + k__BackingField: 0 + flatBonus: 20 diff --git a/Assets/Data/Categories/Master/7_MasterStraightCategory.asset.meta b/Assets/Data/Categories/Master/7_MasterStraightCategory.asset.meta new file mode 100644 index 0000000..acc578c --- /dev/null +++ b/Assets/Data/Categories/Master/7_MasterStraightCategory.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d207 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Data/Categories/Master/8_MasterGroupedSetsCategory_smallfull.asset b/Assets/Data/Categories/Master/8_MasterGroupedSetsCategory_smallfull.asset new file mode 100644 index 0000000..70afecd --- /dev/null +++ b/Assets/Data/Categories/Master/8_MasterGroupedSetsCategory_smallfull.asset @@ -0,0 +1,22 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc003, type: 3} + m_Name: 8_MasterGroupedSetsCategory_smallfull + m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.MasterGroupedSetsCategory + k__BackingField: master_small_full + k__BackingField: "\u041C\u0430\u043B\u044B\u0439 \u0444\u0443\u043B" + k__BackingField: "\u0422\u0440\u0438 \u043F\u0430\u0440\u044B: \u0441\u0443\u043C\u043C\u0430 \u043F\u0430\u0440 + 10" + k__BackingField: {fileID: 21300000, guid: 8188071e2bba56c438a87b21f8d55641, type: 3} + k__BackingField: 0 + groupSize: 2 + requiredGroups: 3 + flatBonus: 10 diff --git a/Assets/Data/Categories/Master/8_MasterGroupedSetsCategory_smallfull.asset.meta b/Assets/Data/Categories/Master/8_MasterGroupedSetsCategory_smallfull.asset.meta new file mode 100644 index 0000000..0090f4e --- /dev/null +++ b/Assets/Data/Categories/Master/8_MasterGroupedSetsCategory_smallfull.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d208 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Data/Categories/Master/9_MasterGroupedSetsCategory_bigfull.asset b/Assets/Data/Categories/Master/9_MasterGroupedSetsCategory_bigfull.asset new file mode 100644 index 0000000..c056de3 --- /dev/null +++ b/Assets/Data/Categories/Master/9_MasterGroupedSetsCategory_bigfull.asset @@ -0,0 +1,22 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc003, type: 3} + m_Name: 9_MasterGroupedSetsCategory_bigfull + m_EditorClassIdentifier: YachtDice.Runtime::YachtDice.Categories.MasterGroupedSetsCategory + k__BackingField: master_big_full + k__BackingField: "\u0411\u043E\u043B\u044C\u0448\u043E\u0439 \u0444\u0443\u043B" + k__BackingField: "\u0414\u0432\u0435 \u0442\u0440\u043E\u0439\u043A\u0438: \u0441\u0443\u043C\u043C\u0430 \u0433\u0440\u0443\u043F\u043F + 10" + k__BackingField: {fileID: 21300000, guid: 8188071e2bba56c438a87b21f8d55641, type: 3} + k__BackingField: 0 + groupSize: 3 + requiredGroups: 2 + flatBonus: 10 diff --git a/Assets/Data/Categories/Master/9_MasterGroupedSetsCategory_bigfull.asset.meta b/Assets/Data/Categories/Master/9_MasterGroupedSetsCategory_bigfull.asset.meta new file mode 100644 index 0000000..a2a9230 --- /dev/null +++ b/Assets/Data/Categories/Master/9_MasterGroupedSetsCategory_bigfull.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b91a7af0ef2405ab2cf880b4ee6d209 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Categories/Definition/CategoryCatalog.cs b/Assets/Scripts/Categories/Definition/CategoryCatalog.cs index 454292f..2a842b3 100644 --- a/Assets/Scripts/Categories/Definition/CategoryCatalog.cs +++ b/Assets/Scripts/Categories/Definition/CategoryCatalog.cs @@ -12,9 +12,13 @@ namespace YachtDice.Categories public class CategoryCatalog : ScriptableObject { [SerializeField] private List categories = new(); + [SerializeField] private int upperBonusThreshold = 63; + [SerializeField] private int upperBonusValue = 35; public IReadOnlyList All => categories; public int Count => categories.Count; + public int UpperBonusThreshold => upperBonusThreshold; + public int UpperBonusValue => upperBonusValue; public CategoryDefinition FindById(string id) { @@ -38,10 +42,12 @@ namespace YachtDice.Categories } #if UNITY_EDITOR - public static CategoryCatalog CreateForTest(List defs) + public static CategoryCatalog CreateForTest(List defs, int upperBonusThreshold = 63, int upperBonusValue = 35) { var catalog = CreateInstance(); catalog.categories = defs ?? new List(); + catalog.upperBonusThreshold = upperBonusThreshold; + catalog.upperBonusValue = upperBonusValue; return catalog; } #endif diff --git a/Assets/Scripts/Categories/Definition/MasterGroupedSetsCategory.cs b/Assets/Scripts/Categories/Definition/MasterGroupedSetsCategory.cs new file mode 100644 index 0000000..9394ce3 --- /dev/null +++ b/Assets/Scripts/Categories/Definition/MasterGroupedSetsCategory.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using UnityEngine; +using YachtDice.Dice; + +namespace YachtDice.Categories +{ + [CreateAssetMenu(fileName = "MasterGroupedSetsCategory", menuName = "YachtDice/Categories/Master/Grouped Sets")] + public class MasterGroupedSetsCategory : CategoryDefinition + { + [Header("Scoring")] + [Tooltip("How many equal dice each group must contain.")] + [SerializeField, Min(1)] private int groupSize = 2; + + [Tooltip("How many groups are required.")] + [SerializeField, Min(1)] private int requiredGroups = 3; + + [Tooltip("Flat bonus added when the grouped pattern is valid.")] + [SerializeField] private int flatBonus; + + public override int Calculate(IReadOnlyList dice) + { + var values = DiceCheckUtility.ExtractValues(dice); + if (!DiceCheckUtility.TryGetGroupedSetSum(values, groupSize, requiredGroups, out var groupedSum)) + return 0; + + return groupedSum + flatBonus; + } + +#if UNITY_EDITOR + public static MasterGroupedSetsCategory CreateForTest( + string id, + string displayName, + int groupSize, + int requiredGroups, + int flatBonus = 0) + { + var so = CreateInstance(); + so.SetTestData(id, displayName); + so.groupSize = groupSize; + so.requiredGroups = requiredGroups; + so.flatBonus = flatBonus; + return so; + } +#endif + } +} diff --git a/Assets/Scripts/Categories/Definition/MasterGroupedSetsCategory.cs.meta b/Assets/Scripts/Categories/Definition/MasterGroupedSetsCategory.cs.meta new file mode 100644 index 0000000..292297a --- /dev/null +++ b/Assets/Scripts/Categories/Definition/MasterGroupedSetsCategory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc003 diff --git a/Assets/Scripts/Categories/Definition/MasterKindCategory.cs b/Assets/Scripts/Categories/Definition/MasterKindCategory.cs new file mode 100644 index 0000000..52190f8 --- /dev/null +++ b/Assets/Scripts/Categories/Definition/MasterKindCategory.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using UnityEngine; +using YachtDice.Dice; + +namespace YachtDice.Categories +{ + [CreateAssetMenu(fileName = "MasterKindCategory", menuName = "YachtDice/Categories/Master/N Of A Kind")] + public class MasterKindCategory : CategoryDefinition + { + [Header("Scoring")] + [Tooltip("How many matching dice are required.")] + [SerializeField, Min(1)] private int requiredCount = 4; + + [Tooltip("Additional score equals matched value multiplied by this number.")] + [SerializeField] private int valueBonusMultiplier = 1; + + [Tooltip("Extra flat bonus added when the category is valid.")] + [SerializeField] private int flatBonus; + + public override int Calculate(IReadOnlyList dice) + { + var values = DiceCheckUtility.ExtractValues(dice); + if (!DiceCheckUtility.TryGetBestValueWithAtLeastCount(values, requiredCount, out var matchedValue)) + return 0; + + return (matchedValue * requiredCount) + (matchedValue * valueBonusMultiplier) + flatBonus; + } + +#if UNITY_EDITOR + public static MasterKindCategory CreateForTest( + string id, + string displayName, + int requiredCount, + int valueBonusMultiplier, + int flatBonus = 0) + { + var so = CreateInstance(); + so.SetTestData(id, displayName); + so.requiredCount = requiredCount; + so.valueBonusMultiplier = valueBonusMultiplier; + so.flatBonus = flatBonus; + return so; + } +#endif + } +} diff --git a/Assets/Scripts/Categories/Definition/MasterKindCategory.cs.meta b/Assets/Scripts/Categories/Definition/MasterKindCategory.cs.meta new file mode 100644 index 0000000..ed39fca --- /dev/null +++ b/Assets/Scripts/Categories/Definition/MasterKindCategory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc004 diff --git a/Assets/Scripts/Categories/Definition/MasterStraightCategory.cs b/Assets/Scripts/Categories/Definition/MasterStraightCategory.cs new file mode 100644 index 0000000..398171c --- /dev/null +++ b/Assets/Scripts/Categories/Definition/MasterStraightCategory.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using UnityEngine; +using YachtDice.Dice; + +namespace YachtDice.Categories +{ + [CreateAssetMenu(fileName = "MasterStraightCategory", menuName = "YachtDice/Categories/Master/Straight")] + public class MasterStraightCategory : CategoryDefinition + { + [Header("Scoring")] + [Tooltip("Flat bonus added to the dice sum when the straight is valid.")] + [SerializeField] private int flatBonus; + + public override int Calculate(IReadOnlyList dice) + { + var values = DiceCheckUtility.ExtractValues(dice); + if (!DiceCheckUtility.IsExactStraightOneToSix(values)) + return 0; + + return DiceCheckUtility.Sum(values) + flatBonus; + } + +#if UNITY_EDITOR + public static MasterStraightCategory CreateForTest(string id, string displayName, int flatBonus = 0) + { + var so = CreateInstance(); + so.SetTestData(id, displayName); + so.flatBonus = flatBonus; + return so; + } +#endif + } +} diff --git a/Assets/Scripts/Categories/Definition/MasterStraightCategory.cs.meta b/Assets/Scripts/Categories/Definition/MasterStraightCategory.cs.meta new file mode 100644 index 0000000..3092809 --- /dev/null +++ b/Assets/Scripts/Categories/Definition/MasterStraightCategory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc002 diff --git a/Assets/Scripts/Categories/Definition/MasterValueCategory.cs b/Assets/Scripts/Categories/Definition/MasterValueCategory.cs new file mode 100644 index 0000000..c598250 --- /dev/null +++ b/Assets/Scripts/Categories/Definition/MasterValueCategory.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using UnityEngine; +using YachtDice.Dice; + +namespace YachtDice.Categories +{ + [CreateAssetMenu(fileName = "MasterValueCategory", menuName = "YachtDice/Categories/Master/Value")] + public class MasterValueCategory : CategoryDefinition + { + [field: Header("Scoring")] + [field: Tooltip("Dice face value to collect.")] + [field: SerializeField, Range(1, 6)] public int TargetValue { get; private set; } = 1; + + [field: Tooltip("Flat bonus added when at least one matching die is present.")] + [field: SerializeField] public int CategoryBonus { get; private set; } + + public override int Calculate(IReadOnlyList dice) + { + var values = DiceCheckUtility.ExtractValues(dice); + var sum = DiceCheckUtility.SumOfValue(values, TargetValue); + return sum > 0 ? sum + CategoryBonus : 0; + } + +#if UNITY_EDITOR + public static MasterValueCategory CreateForTest(string id, string displayName, int targetValue, int categoryBonus = 0) + { + var so = CreateInstance(); + so.SetTestData(id, displayName, upperSection: true); + so.TargetValue = targetValue; + so.CategoryBonus = categoryBonus; + return so; + } +#endif + } +} diff --git a/Assets/Scripts/Categories/Definition/MasterValueCategory.cs.meta b/Assets/Scripts/Categories/Definition/MasterValueCategory.cs.meta new file mode 100644 index 0000000..b0a4c9b --- /dev/null +++ b/Assets/Scripts/Categories/Definition/MasterValueCategory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc001 diff --git a/Assets/Scripts/Categories/DiceCheckUtility.cs b/Assets/Scripts/Categories/DiceCheckUtility.cs index 7ce318a..2c7caa8 100644 --- a/Assets/Scripts/Categories/DiceCheckUtility.cs +++ b/Assets/Scripts/Categories/DiceCheckUtility.cs @@ -102,5 +102,83 @@ namespace YachtDice.Categories return false; } + + public static int[] BuildCounts(int[] values) + { + var counts = new int[7]; + + if (values == null) + return counts; + + for (var i = 0; i < values.Length; i++) + { + var value = values[i]; + if (value >= 1 && value <= 6) + counts[value]++; + } + + return counts; + } + + public static bool TryGetBestValueWithAtLeastCount(int[] values, int requiredCount, out int matchedValue) + { + var counts = BuildCounts(values); + + for (var value = 6; value >= 1; value--) + { + if (counts[value] >= requiredCount) + { + matchedValue = value; + return true; + } + } + + matchedValue = 0; + return false; + } + + public static bool TryGetGroupedSetSum(int[] values, int groupSize, int requiredGroups, out int groupedSum) + { + if (groupSize <= 0 || requiredGroups <= 0) + { + groupedSum = 0; + return false; + } + + var counts = BuildCounts(values); + var foundGroups = 0; + groupedSum = 0; + + for (var value = 6; value >= 1; value--) + { + if (counts[value] < groupSize) + continue; + + foundGroups++; + groupedSum += value * groupSize; + + if (foundGroups >= requiredGroups) + return true; + } + + groupedSum = 0; + return false; + } + + public static bool IsExactStraightOneToSix(int[] values) + { + if (values == null || values.Length != 6) + return false; + + var counts = BuildCounts(values); + + for (var value = 1; value <= 6; value++) + { + if (counts[value] != 1) + return false; + } + + return true; + } } } diff --git a/Assets/Scripts/Tests/Editor/MasterCategoryTests.cs b/Assets/Scripts/Tests/Editor/MasterCategoryTests.cs new file mode 100644 index 0000000..0f0d94a --- /dev/null +++ b/Assets/Scripts/Tests/Editor/MasterCategoryTests.cs @@ -0,0 +1,153 @@ +using System.Collections.Generic; +using NUnit.Framework; +using UnityEngine; +using YachtDice.Categories; +using YachtDice.Dice; +using YachtDice.Scoring; +using YachtDice.UI.Presentation; + +namespace YachtDice.Tests +{ + public class MasterCategoryTests + { + private readonly List _createdAssets = new(); + private DiceDefinition _standardDice; + + [SetUp] + public void SetUp() + { + _standardDice = DiceDefinition.CreateForTest("d6", "d6"); + _createdAssets.Add(_standardDice); + } + + [TearDown] + public void TearDown() + { + foreach (var scoring in Object.FindObjectsByType(FindObjectsSortMode.None)) + Object.DestroyImmediate(scoring.gameObject); + + for (var i = 0; i < _createdAssets.Count; i++) + { + if (_createdAssets[i] != null) + Object.DestroyImmediate(_createdAssets[i]); + } + + _createdAssets.Clear(); + } + + private IReadOnlyList CreateDice(params int[] values) + { + var dice = new DiceInstance[values.Length]; + + for (var i = 0; i < values.Length; i++) + dice[i] = new DiceInstance(_standardDice, values[i]); + + return dice; + } + + [Test] + public void MasterValueCategory_AddsConfiguredBonus_AndKeepsDefaultZero() + { + var withBonus = MasterValueCategory.CreateForTest("ones_bonus", "Единицы", 1, categoryBonus: 1); + var noBonus = MasterValueCategory.CreateForTest("ones_plain", "Единицы", 1); + _createdAssets.Add(withBonus); + _createdAssets.Add(noBonus); + + Assert.AreEqual(5, withBonus.Calculate(CreateDice(1, 1, 1, 2, 3, 4))); + Assert.AreEqual(4, noBonus.Calculate(CreateDice(1, 1, 1, 1, 5, 6))); + Assert.AreEqual(0, withBonus.Calculate(CreateDice(2, 2, 3, 4, 5, 6))); + } + + [Test] + public void MasterStraightCategory_RequiresExactOneToSix() + { + var category = MasterStraightCategory.CreateForTest("straight", "Стрит", flatBonus: 20); + _createdAssets.Add(category); + + Assert.AreEqual(41, category.Calculate(CreateDice(1, 2, 3, 4, 5, 6))); + Assert.AreEqual(0, category.Calculate(CreateDice(1, 2, 3, 4, 5, 5))); + Assert.AreEqual(0, category.Calculate(CreateDice(1, 2, 3, 4, 5, 6, 6))); + } + + [Test] + public void MasterGroupedSetsCategory_SmallFullScoresThreePairs() + { + var category = MasterGroupedSetsCategory.CreateForTest("small_full", "Малый фул", 2, 3, flatBonus: 10); + _createdAssets.Add(category); + + Assert.AreEqual(40, category.Calculate(CreateDice(4, 4, 5, 5, 6, 6))); + Assert.AreEqual(28, category.Calculate(CreateDice(1, 1, 3, 3, 5, 5))); + Assert.AreEqual(0, category.Calculate(CreateDice(1, 1, 1, 3, 3, 5))); + } + + [Test] + public void MasterGroupedSetsCategory_BigFullScoresTwoTriples() + { + var category = MasterGroupedSetsCategory.CreateForTest("big_full", "Большой фул", 3, 2, flatBonus: 10); + _createdAssets.Add(category); + + Assert.AreEqual(43, category.Calculate(CreateDice(5, 5, 5, 6, 6, 6))); + Assert.AreEqual(34, category.Calculate(CreateDice(3, 3, 3, 4, 4, 4))); + Assert.AreEqual(0, category.Calculate(CreateDice(5, 5, 5, 6, 6, 1))); + } + + [Test] + public void MasterKindCategory_UsesOnlyRequiredGroup() + { + var kare = MasterKindCategory.CreateForTest("kare", "Каре", 4, valueBonusMultiplier: 1); + var poker = MasterKindCategory.CreateForTest("poker", "Покер", 5, valueBonusMultiplier: 2); + var master = MasterKindCategory.CreateForTest("master", "Мастер", 6, valueBonusMultiplier: 3); + _createdAssets.Add(kare); + _createdAssets.Add(poker); + _createdAssets.Add(master); + + Assert.AreEqual(30, kare.Calculate(CreateDice(6, 6, 6, 6, 2, 1))); + Assert.AreEqual(42, poker.Calculate(CreateDice(6, 6, 6, 6, 6, 1))); + Assert.AreEqual(54, master.Calculate(CreateDice(6, 6, 6, 6, 6, 6))); + } + + [Test] + public void MasterKindCategory_ScalesToMoreDice_AndPicksBestAvailableGroup() + { + var category = MasterKindCategory.CreateForTest("kare", "Каре", 4, valueBonusMultiplier: 1, flatBonus: 3); + _createdAssets.Add(category); + + Assert.AreEqual(33, category.Calculate(CreateDice(6, 6, 6, 6, 6, 2, 1, 1))); + Assert.AreEqual(0, category.Calculate(CreateDice(2, 2, 2, 3, 3, 3, 4, 5))); + } + + [Test] + public void ChanceCategory_RemainsUnchanged_WithSixDice() + { + var chance = SumAllCategory.CreateForTest("chance", "Шанс"); + _createdAssets.Add(chance); + + Assert.AreEqual(21, chance.Calculate(CreateDice(1, 2, 3, 4, 5, 6))); + } + + [Test] + public void ScoreSummaryService_UsesCatalogConfiguredUpperBonus() + { + var ones = MasterValueCategory.CreateForTest("ones", "Единицы", 1, categoryBonus: 1); + var twos = MasterValueCategory.CreateForTest("twos", "Двойки", 2, categoryBonus: 2); + var catalog = CategoryCatalog.CreateForTest(new List { ones, twos }, upperBonusThreshold: 15, upperBonusValue: 50); + _createdAssets.Add(ones); + _createdAssets.Add(twos); + _createdAssets.Add(catalog); + + var go = new GameObject("ScoringSystem"); + var scoringSystem = go.AddComponent(); + scoringSystem.Construct(null, null, catalog, null); + + scoringSystem.ScoreCategory(CreateDice(1, 1, 1, 1, 2, 3), ones); + scoringSystem.ScoreCategory(CreateDice(2, 2, 2, 2, 5, 6), twos); + + var summaryService = new ScoreSummaryService(scoringSystem, catalog); + var summary = summaryService.Calculate(); + + Assert.AreEqual(16, summary.UpperSum); + Assert.IsTrue(summary.HasUpperBonus); + Assert.AreEqual(66, summary.DisplayTotal); + } + } +} diff --git a/Assets/Scripts/Tests/Editor/MasterCategoryTests.cs.meta b/Assets/Scripts/Tests/Editor/MasterCategoryTests.cs.meta new file mode 100644 index 0000000..241e2eb --- /dev/null +++ b/Assets/Scripts/Tests/Editor/MasterCategoryTests.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc101 diff --git a/Assets/Scripts/UI/Presentation/ScoreSummaryService.cs b/Assets/Scripts/UI/Presentation/ScoreSummaryService.cs index 0f69736..9aaae5a 100644 --- a/Assets/Scripts/UI/Presentation/ScoreSummaryService.cs +++ b/Assets/Scripts/UI/Presentation/ScoreSummaryService.cs @@ -5,9 +5,6 @@ namespace YachtDice.UI.Presentation { public sealed class ScoreSummaryService : IScoreSummaryService { - private const int UpperBonusThreshold = 63; - private const int UpperBonusValue = 35; - private readonly ScoringSystem _scoringSystem; private readonly CategoryCatalog _categoryCatalog; @@ -20,11 +17,11 @@ namespace YachtDice.UI.Presentation public ScoreSummary Calculate() { var upperSum = CalculateUpperSum(); - var hasUpperBonus = upperSum >= UpperBonusThreshold; + var hasUpperBonus = upperSum >= _categoryCatalog.UpperBonusThreshold; var total = _scoringSystem.TotalScore; if (hasUpperBonus) - total += UpperBonusValue; + total += _categoryCatalog.UpperBonusValue; return new ScoreSummary(total, upperSum, hasUpperBonus); } diff --git a/Assets/Scripts/UI/ScoreCardView.cs b/Assets/Scripts/UI/ScoreCardView.cs index 6503276..05e4311 100644 --- a/Assets/Scripts/UI/ScoreCardView.cs +++ b/Assets/Scripts/UI/ScoreCardView.cs @@ -78,9 +78,12 @@ namespace YachtDice.UI public void UpdateTotalDisplay(int totalScore, int upperSum, bool hasUpperBonus) { + var threshold = _catalog != null ? _catalog.UpperBonusThreshold : 63; + var bonusValue = _catalog != null ? _catalog.UpperBonusValue : 35; + totalScoreText.text = totalScore.ToString(); - upperSumText.text = $"{upperSum} / 63"; - upperBonusText.text = hasUpperBonus ? "+35" : "---"; + upperSumText.text = $"{upperSum} / {threshold}"; + upperBonusText.text = hasUpperBonus ? $"+{bonusValue}" : "---"; } public void ResetAll()