using System;
using System.Collections.Generic;
using asap.core;
using cfg;
using Cinemachine;
using game;
using GameCore;
using Script.RuntimeScript.ExplosionEffect;
using Script.RuntimeScript.model.Data;
using UnityEngine;
using UniRx;
using Game;
using UnityEngine.AddressableAssets;
namespace Script.RuntimeScript
{
public class DiggingGameManager
{
///
/// 沙滩寻宝 测试 log 开启关闭
///
private const bool LogOpen = false;
private MonoBehaviour _monoBehaviour;
public MonoBehaviour BaseMono => _monoBehaviour;
private DiggingGameModel _dataModel;
public DiggingGameModel DataModel => _dataModel;
private Animation _digAni;
private CinemachineVirtualCamera _cameraVir;
private GameObject fx_DgSanddig;
private GameObject fx_DgSanddighard;
///
/// 通关爆炸动画
///
private GameObject fx_DgSanddisappear;
///
/// 游戏状态
///
private SandDigGameState _gameState = SandDigGameState.Normal;
public SandDigGameState GameState
{
get { return _gameState; }
set
{
DiggingGameManager.LogError("沙滩寻宝状态:" + value.ToString());
_gameState = value;
}
}
public bool IsCanClick = true;
///
/// 棋盘
///
private GameBroadLogic _broadLogic;
public GameBroadLogic BroadLogic => _broadLogic;
///
/// 棋盘格子背景容器
///
private GameObject _broadContainer;
public GameObject BroadContainer => _broadContainer;
///
/// 棋盘格子容器
///
private GameObject _gridContianer;
public GameObject GridContainer => _gridContianer;
///
/// 棋盘格子中道具容器
///
private GameObject _gridPropContianer;
public GameObject GridPropContainer => _gridPropContianer;
///
/// 宝箱道具容器
///
private GameObject _propContainer;
public GameObject PropContainer => _propContainer;
private GameObject _showPropPositon;
public GameObject ShowPropPositon => _showPropPositon;
GameObject _DgSand_bgend => _bgSandBg?.DgSand_bgend;
private Tables _tables;
public Tables TableData => _tables;
///
/// 爆炸管理器
///
private ExplosionManager _explosionManager;
public ExplosionManager ExplosionManager => _explosionManager;
///
/// 管卡是否通过
///
public bool ClampIsPass = false;
public List itemDatas;
//奖励界面是否打开
private bool _awardPanelIsOpen = false;
Sound sanddig_dig_sound;
AudioClip sanddig_dig_audio;
AudioClip sanddig_dighard_audio;
DgSandBg _bgSandBg;
Transform _fxRoot;
public async System.Threading.Tasks.Task InitGame(MonoBehaviour monoBehaviour, CinemachineVirtualCamera camera, GameObject broadContainer, GameObject gridContainer, GameObject gridPropContianer, GameObject propContainer, GameObject showPropPositon, Transform fxRoot)
{
await _dataModel.InitServerData();
IniTable();
AddEventLister();
AudioLoad();
_monoBehaviour = monoBehaviour;
_cameraVir = camera;
_broadContainer = broadContainer;
_gridContianer = gridContainer;
_gridPropContianer = gridPropContianer;
_propContainer = propContainer;
_showPropPositon = showPropPositon;
_fxRoot = fxRoot;
_explosionManager = new ExplosionManager();
_explosionManager.Init();
await _dataModel.InitClientData(ClientDataHandleEnum.EnterGame);
await LoadGameObject();
}
async System.Threading.Tasks.Task LoadGameObject()
{
if (_broadLogic == null)
{
_broadLogic = new GameBroadLogic();
}
bool IsPassAll = IsPassAllClamps();
DiggingActivityInit digActivityConfig = _dataModel.digActivityConfig;
GameObject bg = await _broadLogic.LoadGameObject(digActivityConfig.Bg, _cameraVir.transform);
if (bg != null)
{
_bgSandBg = bg.GetComponent();
_DgSand_bgend?.SetActive(IsPassAll);
}
if (!IsPassAll)
{
Transform boxRoot = _propContainer.transform.Find("Box");
int count = boxRoot.childCount;
for (int i = 0; i < count; i++)
{
//宝箱加载
_ = _broadLogic.LoadGameObject(digActivityConfig.DiggingBoxList[i], boxRoot.GetChild(i));
}
GameObject dig = await _broadLogic.LoadGameObject(digActivityConfig.Shovel, _monoBehaviour.transform);
if (dig != null)
{
_digAni = dig.GetComponent();
_digAni.gameObject.SetActive(false);
}
fx_DgSanddig = await Addressables.LoadAssetAsync(digActivityConfig.DiggingGridFxDg).Task;
fx_DgSanddighard = await Addressables.LoadAssetAsync(digActivityConfig.DiggingGridFxDh).Task;
fx_DgSanddisappear = await Addressables.LoadAssetAsync(digActivityConfig.DiggingGridFxDs).Task;
}
}
public void Destroy()
{
_explosionManager.Reset();
RemoveEventLister();
AudioRelease();
if (fx_DgSanddig != null)
{
Addressables.Release(fx_DgSanddig);
}
if (fx_DgSanddighard != null)
{
Addressables.Release(fx_DgSanddighard);
}
if (fx_DgSanddisappear != null)
{
Addressables.Release(fx_DgSanddisappear);
}
}
private IDisposable _onCloseAwardPanel = null;
void AddEventLister()
{
RemoveEventLister();
_onCloseAwardPanel = GContext.OnEvent().Subscribe(OnCloseAwardPanel);
}
void RemoveEventLister()
{
_onCloseAwardPanel?.Dispose();
_onCloseAwardPanel = null;
}
async void AudioLoad()
{
AudioRelease();
GContext.Publish(new EventBGMSound(_dataModel.digActivityConfig.Bgm));
sanddig_dig_audio = await Addressables.LoadAssetAsync("audio_ui_sanddig_dig").Task;
sanddig_dighard_audio = await Addressables.LoadAssetAsync("audio_ui_sanddig_dighard").Task;
sanddig_dig_sound = GContext.container.Resolve().GetNewUISound(sanddig_dig_audio);
}
void AudioRelease()
{
sanddig_dig_sound?.ReturnPool();
sanddig_dig_sound = null;
if (sanddig_dig_audio != null)
{
Addressables.Release(sanddig_dig_audio);
sanddig_dig_audio = null;
}
if (sanddig_dighard_audio != null)
{
Addressables.Release(sanddig_dighard_audio);
sanddig_dighard_audio = null;
}
}
public void IniTable()
{
_tables = GContext.container.Resolve();
}
public void InitServerData(Dictionary userDatas = null)
{
if (_dataModel == null)
{
_dataModel = new DiggingGameModel();
}
}
public void Update()
{
if (_broadLogic != null)
{
_broadLogic.Update();
}
switch (_gameState)
{
case SandDigGameState.Normal:
break;
case SandDigGameState.LoadJson:
break;
case SandDigGameState.LoadJsonOver:
_gameState = SandDigGameState.Begin;
break;
case SandDigGameState.Begin: //开始游戏
_gameState = SandDigGameState.Going;
BeginGame();
break;
case SandDigGameState.Going: //游戏进行中
break;
case SandDigGameState.PropEffect: //挖出道具动画阶段
break;
case SandDigGameState.PropEffectEnd: //道具动画播放结束
if (ClampIsPass)
{
_gameState = SandDigGameState.Pass;
}
else
{
_gameState = SandDigGameState.Going;
}
break;
case SandDigGameState.Pass: //通关
DiggingGameManager.LogError("执行通关逻辑 !!");
_gameState = SandDigGameState.Normal;
//数据再 model passClamp 中已经存储,这里显示奖励
//GContext.Publish(new ShowData());
_awardPanelIsOpen = true;
_dataModel.NewClampInit();
break;
case SandDigGameState.WaitPassLoading:
if (!_awardPanelIsOpen)
{
ShowLoadingEffect();
}
break;
case SandDigGameState.Loading:
break;
case SandDigGameState.LoadingOver:
//开始
_gameState = SandDigGameState.Begin;
break;
}
}
public void ShowFX(string fxName, bool show)
{
if (string.IsNullOrEmpty(fxName) || _fxRoot == null)
{
return;
}
Transform transform = _fxRoot.Find(fxName);
if (transform != null)
{
transform.gameObject.SetActive(show);
}
}
public void ShowFX(GridEffectType GridEffectType, Transform parent)
{
GameObject go = null;
switch (GridEffectType)
{
case GridEffectType.ClickDig:
case GridEffectType.DoubleClick:
if (fx_DgSanddig != null)
{
Transform tran = parent.Find(fx_DgSanddig.name);
if (tran == null)
{
go = GameObject.Instantiate(fx_DgSanddig, parent);
go.name = fx_DgSanddig.name;
}
else
{
go = tran.gameObject;
}
}
break;
case GridEffectType.ClickBigDig:
if (fx_DgSanddighard != null)
{
go = GameObject.Instantiate(fx_DgSanddighard, parent);
go.name = fx_DgSanddighard.name;
}
break;
case GridEffectType.PassiveBomb:
case GridEffectType.PassiveClear:
case GridEffectType.PassClamp:
if (fx_DgSanddisappear != null)
{
go = GameObject.Instantiate(fx_DgSanddisappear, parent);
go.name = fx_DgSanddisappear.name;
}
break;
}
if (go != null)
{
go.SetActive(true);
}
}
///
/// 显示挖掘动画
///
int digShowCount = 0;
public async void ShowDigEffect(ClickDigType type, Vector3 pos)
{
digShowCount++;
pos.z = -2;
if (_digAni != null)
{
_digAni.transform.position = pos;
_digAni.gameObject.SetActive(true);
DiggingActivityInit digActivityConfig = _dataModel.digActivityConfig;
if (type == ClickDigType.Smail)
{
_digAni.Play(digActivityConfig.DiggingShovelFxDg);
}
else
{
_digAni.Play(digActivityConfig.DiggingShovelFxDh);
}
}
int delay = 200;
if (type == ClickDigType.Smail)
{
await System.Threading.Tasks.Task.Delay(SandDigEventConst.ShovelAnimTime - delay);
//GContext.Publish(new EventUISound("audio_ui_sanddig_dig"));
if (sanddig_dig_sound != null)
{
sanddig_dig_sound.audioSource.clip = sanddig_dig_audio;
sanddig_dig_sound.audioSource.Play();
}
await System.Threading.Tasks.Task.Delay(delay);
}
else
{
await System.Threading.Tasks.Task.Delay(SandDigEventConst.BigShovelAnimTime - delay);
//GContext.Publish(new EventUISound("audio_ui_sanddig_dighard"));
if (sanddig_dig_sound != null)
{
sanddig_dig_sound.audioSource.clip = sanddig_dighard_audio;
sanddig_dig_sound.audioSource.Play();
}
await System.Threading.Tasks.Task.Delay(delay);
}
digShowCount--;
if (digShowCount <= 0 && _digAni != null)
{
_digAni.gameObject.SetActive(false);
}
}
public void BeginGame()
{
ClampIsPass = false;
if (_broadLogic == null)
{
_broadLogic = new GameBroadLogic();
}
else
{
_broadLogic.Reset();
}
int broadWidth = GetBroadWidth();
int broadHeight = GetBroadHeight();
Vector3 cameraPos = _cameraVir.transform.position;
DiggingDisplayInit diplayConfig = TableData.TbDiggingDisplayInit.GetOrDefault(broadHeight);
if (diplayConfig != null)
{
cameraPos.y = diplayConfig.VirtualCameraY;
}
_cameraVir.transform.position = new Vector3(broadWidth * 0.5f, cameraPos.y, cameraPos.z);
DiggingGameManager.LogError("当前管卡Id:::" + _dataModel.GetCurClampId() + " 棋盘宽度::" + broadWidth);
if (_dataModel.GetCurClampId() > 0)
{
_broadLogic.InitEvent();
_broadLogic.BuildBroadBack();
_broadLogic.BuildGrid();
_broadLogic.BuildProp();
_broadLogic.BuildTempProp();
_dataModel.SaveAll();
}
}
private void OnCloseAwardPanel(RewardPanelClose data)
{
//if (data.rewardType != RewardType.Destroy) return;
_awardPanelIsOpen = false;
if (_gameState == SandDigGameState.WaitPassLoading)
{
ShowLoadingEffect();
}
else if (IsPassAllClamps())
{
//通关所有关卡
DiggingGameManager.LogError("通关所有关卡!!!!!!!");
_broadLogic.Reset();
HidBox();
_DgSand_bgend?.SetActive(true);
}
}
public void GMSetClamp(int index)
{
_dataModel.GMSetClamp(index);
}
///
/// 显示转场动画
///
private async void ShowLoadingEffect()
{
_gameState = SandDigGameState.Loading;
await UIManager.Instance.ShowUI(UITypes.CloudTransitionPanel);
await System.Threading.Tasks.Task.Delay(500);
_gameState = SandDigGameState.LoadingOver;
GContext.Publish(new EndTransition());
}
public int GetActivityId()
{
return GContext.container.Resolve().GetEvent(4, 1);
}
public FishingEvent GetActivityConfig(int acId)
{
return GContext.container.Resolve().TbFishingEvent.Get(acId);
}
///
/// 获取当前管卡 是当前活动的第几关
///
///
public int GetCurClampIndex()
{
List allClamps = _dataModel.digActivityConfig.StageList;
int curClampId = _dataModel.GetCurClampId();
if (curClampId < 0)
{
return allClamps.Count - 1;
}
return allClamps.IndexOf(curClampId);
}
///
/// 获取当前活动所有管卡数量
///
///
public int GetAllClampCount()
{
List allClamps = _dataModel.digActivityConfig.StageList;
return allClamps.Count;
}
///
/// 通过全部管卡
///
///
public bool IsPassAllClamps()
{
return _dataModel.GetServerData().ClampId < 0;
}
///
/// 获取活动道具id
///
///
public int GetActivityPropId()
{
return _dataModel.digActivityConfig.TokenID;
}
///
/// 获取棋盘宽度
///
///
public int GetBroadWidth()
{
BroadData[] allGrid = DataModel.GetAllBroadData();
int widthCount = 0;
for (int i = 0; i < allGrid.Length; i++)
{
if ((int)allGrid[i].LocalPos.y == 1)
{
widthCount++;
}
}
return widthCount + 1;
}
///
/// 获取棋盘高度
///
///
public int GetBroadHeight()
{
BroadData[] allGrid = DataModel.GetAllBroadData();
int widthCount = 0;
for (int i = 0; i < allGrid.Length; i++)
{
if ((int)allGrid[i].LocalPos.x == 1)
{
widthCount++;
}
}
return widthCount + 1;
}
///
/// 获取棋子宽度数量
///
///
public int GetGridWidth()
{
GridData[] allGrid = DataModel.GetAllGridData();
int minX = 0;
int maxX = 0;
for (int i = 0; i < allGrid.Length; i++)
{
if (allGrid[i].LocalPos.x < minX)
{
minX = (int)Math.Round(allGrid[i].LocalPos.x);
}
if (allGrid[i].LocalPos.x > maxX)
{
maxX = (int)Math.Round(allGrid[i].LocalPos.x);
}
}
return maxX - minX;
}
///
/// 获取已经获得的目标道具
///
///
public List GetHasPassPropIds()
{
return DataModel.GetServerData().PassPropIds;
}
///
/// 增加道具
///
///
public void AddDigCount(int count)
{
_dataModel.AddDigCount(count);
}
public void ClearPropContianer()
{
foreach (Transform child in _propContainer.transform)
{
if (child && child.name != "Box")
GameObject.Destroy(child.gameObject);
}
}
public void DgSandBox()
{
DiggingStageReward config = GContext.container.Resolve().TbDiggingStageReward.Get(_dataModel.GetServerData().ClampId);
Transform boxRoot = _propContainer.transform.Find("Box");
int count = boxRoot.childCount;
for (int i = 0; i < count; i++)
{
Transform box = boxRoot.GetChild(i);
box.gameObject.SetActive(box.name == config.StageBox);
}
}
void HidBox()
{
Transform boxRoot = _propContainer.transform.Find("Box");
int count = boxRoot.childCount;
for (int i = 0; i < count; i++)
{
Transform box = boxRoot.GetChild(i);
box.gameObject.SetActive(false);
}
}
public int GetCurLevel()
{
List allClamps = _dataModel.digActivityConfig.StageList;
int level = allClamps.Count;
int curClampId = _dataModel.GetCurClampId();
if (curClampId > 0)
{
level = allClamps.IndexOf(curClampId) + 1;
}
return level;
}
///
/// 沙滩寻宝打点
///
public void SandDigPoint(GridType gridType, int level, int clickCount)
{
int type = 0;
switch (gridType)
{
case GridType.Normal:
type = 1;
break;
case GridType.Resource:
type = 3;
break;
case GridType.Special:
type = 2;
break;
}
#if AGG
using (var e = GEvent.GameEvent("beachcomb"))
{
e.AddContent("grid_type", type) //格子类型 空格子=0,普通格子=1,特殊事件=2,资源道具=3
.AddContent("stage_lv", level) //关卡等级
.AddContent("click_times", clickCount) //点击次数
.AddContent("stage_clear", ClampIsPass ? 1 : 0); //关卡完成情况 未完成=0,完成=1
if (itemDatas != null && itemDatas.Count > 0 && ClampIsPass == true)
{
for (int i = 0; i < itemDatas.Count; i++)
{
if (itemDatas[i].id == 1001)
{
e.AddContent("reward_hook", itemDatas[i].count);
}
else if (itemDatas[i].id == 1002)
{
e.AddContent("reward_cash", itemDatas[i].count);
}
}
}
}
#endif
}
public static void LogWarning(string value)
{
if (!LogOpen) return;
Debug.Log("沙滩寻宝: " + value + "");
}
public static void LogError(string value)
{
if (!LogOpen) return;
Debug.Log("沙滩寻宝: " + value + "");
}
public bool NewInfo()
{
int id = _dataModel.CurActivityId;
int oldId = PlayerPrefs.GetInt("DigGridData", -1);
if (id == oldId)
{
return false;
}
PlayerPrefs.SetInt("DigGridData", id);
//PlayerPrefs.Save();
return true;
}
}
///
/// 资源路径类型
///
public enum UrlType
{
Broad,
Grid,
GridProp,
Prop,
SpecialEvent
}
///
/// grid 动画类型
///
public enum GridEffectType
{
ClickDig, //普通挖掘
ClickBigDig, //挖出道具
DoubleClick, //需要点击两次
PassiveBomb, //特殊事件触发 爆炸
PassiveClear, //特殊事件触发 消除
PassClamp, //通关
}
public enum SandDigGameState
{
Normal,
Begin,
Going,
LoadJson,
LoadJsonOver,
WaveEffect,
PropEffect,
PropEffectEnd,
Pass, //通关
WaitPassLoading, //准备转场
Loading, //转场中
LoadingOver,
}
public enum GridMeshType
{
None,
Mesh1,
Mesh2,
}
public enum ClickDigType
{
Smail,
Big,
}
public enum ClientDataHandleEnum
{
Init,
PassClamp,
EnterGame
}
public enum GridType
{
Normal,
Resource,
Special,
None
}
}