From ca8d7d59d69f6acbf5546bcf2bb1aa858c6daf03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=ED=8C=90=EB=8F=8C?= Date: Sun, 10 Mar 2024 00:41:35 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B0=80=EC=B1=A0=20=EC=A6=89=EC=8B=9C=20?= =?UTF-8?q?=EC=A7=80=EA=B8=89=20=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Manager/ItemManager.cs | 198 ++++++++++++++++++++++++++++--- Server/SQL/ConsumableItemData.cs | 4 +- Server/SQL/RandomRewardData.cs | 19 +++ 3 files changed, 205 insertions(+), 16 deletions(-) diff --git a/Server/Manager/ItemManager.cs b/Server/Manager/ItemManager.cs index f8083a7..52e686e 100644 --- a/Server/Manager/ItemManager.cs +++ b/Server/Manager/ItemManager.cs @@ -35,13 +35,11 @@ namespace Server.Manager user.pay_cash += rewardData.return_count; break; case eRewardItemType.character: - for (int n = 0; n < rewardData.return_count; n++) - { - DeckUnitInfo deckUnitInfo = new DeckUnitInfo(); - deckUnitInfo.user_id = user.id; - deckUnitInfo.unit_data_id = rewardData.return_item; - box.Add(deckUnitInfo); - } + DeckUnitInfo deckUnitInfo = new DeckUnitInfo(); + deckUnitInfo.user_id = user.id; + deckUnitInfo.unit_data_id = rewardData.return_item; + deckUnitInfo.count = rewardData.return_count; + box.Add(deckUnitInfo); break; case eRewardItemType.equipment: Random rand = new Random(); @@ -56,11 +54,22 @@ namespace Server.Manager } break; case eRewardItemType.consumable: - ConsumableItem consumableItem = new ConsumableItem(); - consumableItem.user_id = user.id; - consumableItem.consumable_item_data_id = rewardData.return_item; - consumableItem.count = rewardData.return_count; - box.Add(consumableItem); + ConsumableItemData consumableItemData = Statics.consumableItemExcel.getConsumableItemData(rewardData.return_item); + switch (consumableItemData.item_type) + { + case eItemType.exp: + case eItemType.package: + ConsumableItem consumableItem = new ConsumableItem(); + consumableItem.user_id = user.id; + consumableItem.consumable_item_data_id = rewardData.return_item; + consumableItem.count = rewardData.return_count; + box.Add(consumableItem); + break; + case eItemType.random: + randomItem(consumableItemData.reward, rewardData.return_count); + break; + } + break; case eRewardItemType.etc: EtcItem etcItem = new EtcItem(); @@ -71,8 +80,6 @@ namespace Server.Manager break; default: throw new RuntimeException("Not case", Error.nodata); - - } } @@ -85,6 +92,169 @@ namespace Server.Manager box.Add(deckUnitInfo); } + public void randomItem(int group, int count) + { + List randomRewardDatas = Statics.randomRewardExcel.getRandomRewardDataGroup(group); + + int maxProb = 0; + List zero = new List(); + List ints = new List(); + + //확정보상부터 지급 + for (int n = 0; n < randomRewardDatas.Count; n++) + { + if (randomRewardDatas[n].prob == -1) + { + //보상지급 + switch (randomRewardDatas[n].reward_item_type) + { + case eRewardItemType.gold: + user.gold += (randomRewardDatas[n].return_count * count); + break; + case eRewardItemType.freecash: + user.free_cash += (randomRewardDatas[n].return_count * count); + break; + case eRewardItemType.paycash: + user.pay_cash += (randomRewardDatas[n].return_count * count); + break; + case eRewardItemType.character: + DeckUnitInfo deckUnitInfo = new DeckUnitInfo(); + deckUnitInfo.user_id = user.id; + deckUnitInfo.unit_data_id = randomRewardDatas[n].reward; + deckUnitInfo.count = (randomRewardDatas[n].return_count * count); + box.Add(deckUnitInfo); + break; + case eRewardItemType.equipment: + Random rand = new Random(); + int reward_count = (randomRewardDatas[n].return_count * count); + for (int m = 0; m < reward_count; m++) + { + Equipment equipment = new Equipment(); + equipment.user_id = user.id; + equipment.equip_unit = 0; + equipment.rand_stats = rand.Next(5); + equipment.equipment_data_id = randomRewardDatas[n].reward; + box.Add(equipment); + } + break; + case eRewardItemType.consumable: + //패키지에서 나온 아이탬은 절대 가챠를 돌리지 않고 아이템 형태로 인벤 지급 + ConsumableItem consumableItem = new ConsumableItem(); + consumableItem.user_id = user.id; + consumableItem.consumable_item_data_id = randomRewardDatas[n].reward; + consumableItem.count = (randomRewardDatas[n].return_count * count); + box.Add(consumableItem); + break; + case eRewardItemType.etc: + EtcItem etcItem = new EtcItem(); + etcItem.user_id = user.id; + etcItem.etc_item_data_id = randomRewardDatas[n].reward; + etcItem.count = (randomRewardDatas[n].return_count * count); + box.Add(etcItem); + break; + default: + throw new RuntimeException("Not case", Error.nodata); + } + //지급된 보상은 가챠에서 제외 + randomRewardDatas.RemoveAt(n); + n--; + } + else if (randomRewardDatas[n].prob == 0) + { + zero.Add(n); + } + else + { + maxProb += randomRewardDatas[n].prob; + for(int m = 0; m < randomRewardDatas[n].prob; m++) + { + ints.Add(n); + } + } + } + + //모든것이 확정보상일경우를 대비 + if(randomRewardDatas.Count != 0) + { + Random rand = new Random(); + if (maxProb == 0) + { + maxProb = randomRewardDatas.Count; + for (int n = 0; n < maxProb; n++) + { + ints.Add(n); + } + } + else + maxProb = 10000; + + + for (int n = 0; n < count; n++) + { + int select = rand.Next(10000); + int selectItem = 0; + if(select < ints.Count) + { + selectItem = ints[select]; + } + else + { + select = rand.Next(zero.Count); + selectItem = zero[select]; + } + switch (randomRewardDatas[selectItem].reward_item_type) + { + case eRewardItemType.gold: + user.gold += (randomRewardDatas[selectItem].return_count * count); + break; + case eRewardItemType.freecash: + user.free_cash += (randomRewardDatas[selectItem].return_count * count); + break; + case eRewardItemType.paycash: + user.pay_cash += (randomRewardDatas[selectItem].return_count * count); + break; + case eRewardItemType.character: + DeckUnitInfo deckUnitInfo = new DeckUnitInfo(); + deckUnitInfo.user_id = user.id; + deckUnitInfo.unit_data_id = randomRewardDatas[selectItem].reward; + deckUnitInfo.count = (randomRewardDatas[selectItem].return_count * count); + box.Add(deckUnitInfo); + break; + case eRewardItemType.equipment: + int reward_count = (randomRewardDatas[selectItem].return_count * count); + for (int m = 0; m < reward_count; m++) + { + Equipment equipment = new Equipment(); + equipment.user_id = user.id; + equipment.equip_unit = 0; + equipment.rand_stats = rand.Next(5); + equipment.equipment_data_id = randomRewardDatas[selectItem].reward; + box.Add(equipment); + } + break; + case eRewardItemType.consumable: + //패키지에서 나온 아이탬은 절대 가챠를 돌리지 않고 아이템 형태로 인벤 지급 + ConsumableItem consumableItem = new ConsumableItem(); + consumableItem.user_id = user.id; + consumableItem.consumable_item_data_id = randomRewardDatas[selectItem].reward; + consumableItem.count = (randomRewardDatas[selectItem].return_count * count); + box.Add(consumableItem); + break; + case eRewardItemType.etc: + EtcItem etcItem = new EtcItem(); + etcItem.user_id = user.id; + etcItem.etc_item_data_id = randomRewardDatas[selectItem].reward; + etcItem.count = (randomRewardDatas[selectItem].return_count * count); + box.Add(etcItem); + break; + default: + throw new RuntimeException("Not case", Error.nodata); + } + } + } + + } + //리워드 아이탬 획득 코드 작성 //패키지 구매시 패키지를 전부 풀어서 아이탬을 획득하는 코드 작성 } diff --git a/Server/SQL/ConsumableItemData.cs b/Server/SQL/ConsumableItemData.cs index 92c92ce..59fcbe3 100644 --- a/Server/SQL/ConsumableItemData.cs +++ b/Server/SQL/ConsumableItemData.cs @@ -9,7 +9,7 @@ namespace Server.SQL public long index { get; set; } public string name { get; set; } public eItemType item_type { get; set; } - public string reward { get; set; } + public int reward { get; set; } } public enum eItemType @@ -43,7 +43,7 @@ namespace Server.SQL consumableItemData.index = item.Key; consumableItemData.name = (string)item.Value["name"]; consumableItemData.item_type = (eItemType)item.Value["item_type"]; - consumableItemData.reward = item.Value["reward"].ToString(); + consumableItemData.reward = (int)item.Value["reward"]; this.consumableItemData.Add(item.Key, consumableItemData); } } diff --git a/Server/SQL/RandomRewardData.cs b/Server/SQL/RandomRewardData.cs index 5f13661..19d7f25 100644 --- a/Server/SQL/RandomRewardData.cs +++ b/Server/SQL/RandomRewardData.cs @@ -1,4 +1,5 @@ using Server.Git; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace Server.SQL @@ -10,6 +11,8 @@ namespace Server.SQL public int group { get; set; } public long reward { get; set; } public int prob { get; set; } + public eRewardItemType reward_item_type { get; set; } + public int return_count { get; set; } } public class RandomRewardDataExcel @@ -27,6 +30,20 @@ namespace Server.SQL { return randomRewardData.Values.ToList(); } + + public List getRandomRewardDataGroup(int group) + { + List get = new List(); + foreach (var item in randomRewardData) + { + if (item.Value.group == group) + { + get.Add(item.Value); + } + } + return get; + } + public void init(Sheet data) { this.randomRewardData = new Dictionary(); @@ -37,6 +54,8 @@ namespace Server.SQL randomRewardData.group = (int)item.Value["group"]; randomRewardData.reward = (int)item.Value["reward"]; randomRewardData.prob = (int)item.Value["prob"]; + randomRewardData.reward_item_type = (eRewardItemType)item.Value["reward_item_type"]; + randomRewardData.return_count = (int)item.Value["return_count"]; this.randomRewardData.Add(item.Key, randomRewardData); } }