using System.Collections.Generic; using System.Text; using asap.core; using GameCore; using UnityEngine; public class DrillSystem { private readonly EventBreakTableContext _drillDataHub; private readonly PlayerItemData _playerItemData = GContext.container.Resolve(); private int _evTunnel, _evTicketConsume, _evGemGet, _evTaskId; private string _evReward; private Dictionary _evNormalRewardDic; public DrillSystem(EventBreakTableContext drillDataHub) { _drillDataHub = drillDataHub; } public bool DoDrillJob(int jobIdx) { var _drillModel = GContext.container.Resolve(); var jobData = _drillModel.DrillJobList[jobIdx]; if (!_drillModel.AddTicket(-jobData.Cost)) { Debug.Log("[EventBreak] Insufficient ticket."); return false; } _evTunnel = jobIdx + 1; _evTicketConsume = jobData.Cost; _evGemGet = 0; _evNormalRewardDic = new Dictionary(); _evReward = ""; _evTaskId = 0; ProcessBlocks(ref _drillModel.TaskInfoList[jobIdx], jobData.Blocks); /* Debug.Log($"[EventBreak]Event tracking:"); Debug.Log($"[EventBreak] tunnel: {_evTunnel}"); Debug.Log($"[EventBreak] item_consume: {_evTicketConsume}"); Debug.Log($"[EventBreak] gem_count: {_evGemGet}"); Debug.Log($"[EventBreak] reward_normal: {_evReward}"); Debug.Log($"[EventBreak] milestone_task: {_evTaskId}"); */ #if AGG using (var e = GEvent.GameEvent("event_drill")) { e.AddContent("tunnel", _evTunnel) .AddContent("item_consume", _evTicketConsume) .AddContent("gem_count", _evGemGet) .AddContent("reward_normal", _evReward) .AddContent("milestone_task", _evTaskId); } #endif _drillModel.UpdateSeed(jobIdx); _drillModel.DrillJobList[jobIdx] = _drillDataHub.GetDrillJob(jobIdx, _drillModel.DrillJobSeeds[jobIdx]); return true; } private void ProcessBlocks(ref EventBreakTaskInfo taskInfo, IEnumerable blocks) { var _drillModel = GContext.container.Resolve(); foreach (var block in blocks) { if (block.IsEmpty) continue; if (block.Item.id != taskInfo.TargetItemId) { GrantPlayerReward(block.Item); if (!_evNormalRewardDic.TryAdd(block.Item.id, (int) block.Item.count)) _evNormalRewardDic[block.Item.id] += (int) block.Item.count; continue; } taskInfo.CurrentGemProgress += (int)block.Item.count; _evGemGet++; if (taskInfo.CurrentGemProgress < taskInfo.TotalGemRequired) continue; GrantPlayerReward(taskInfo.Reward); _evTaskId = taskInfo.TaskId; taskInfo = _drillDataHub.GetNextTaskInfo(taskInfo); } _evReward = SerializeRewardDic(_evNormalRewardDic); _drillModel.ToPlayfabData().Save(); } private string SerializeRewardDic(Dictionary d) { var res = new StringBuilder(); if (d == null || d.Count <= 0) return ""; foreach (var kv in d) { res.Append("("); res.Append(kv.Key); res.Append(","); res.Append(kv.Value); res.Append("),"); } return res.ToString(); } public void GrantPlayerReward(ItemData item) { // Debug.Log($"[Drill] Add rewards: id {item.id} count {item.count}"); // _playerItemData.AddItem(item); GContext.Publish(new DeferredRewardStashService.EventStashItem {Item = item}); } }