using System;
using System.Collections;
using System.Collections.Generic;
using Cute;
using UnityEngine;
using Wizard.Battle.View.Vfx;

public class BackGroundBase
{
	protected string _bgmId;

	protected BattleCamera _battleCamera;

	protected GameObject _fieldModel;

	protected GameObject _fieldParticles;

	protected IDictionary<string, Animation> m_FieldAnimationDictionary;

	protected IDictionary<string, GameObject> _fieldObjDictionary;

	protected IDictionary<string, Animator> m_FieldAnimatorDictionary;

	protected IDictionary<string, ParticleSystem> _fieldParticleSystemDictionary;

	protected IDictionary<string, int> _gimicCntDictionary;

	public string[] GimicAudioList;

	protected string _str3DFieldNo;

	protected string _str3DFieldPath;

	protected BattleManagerBase m_BtlMgrIns;

	protected string m_FieldAssetPath;

	protected List<string> m_SoundAssetPathList;

	protected float m_RandomActionTime;

	protected bool IsFieldRandom;

	private Coroutine battleLoadCoroutine;

	public virtual int FieldId => 1;

	public virtual int FieldEffectId => FieldId;

	public GameObject Field { get; protected set; }

	public GameObject m_Battle3DContainer { get; protected set; }

	public GameObject m_BattleCutInContainer { get; protected set; }

	public SetShaderGlobalColorBG SetShaderGlobalColorBG { get; protected set; }

	public bool IsLoadDone { get; protected set; }

	public BackGroundBase(string bgmId = "NONE")
	{
		_battleCamera = null;
		m_Battle3DContainer = null;
		m_BattleCutInContainer = null;
		m_BtlMgrIns = BattleManagerBase.GetIns();
		IsLoadDone = false;
		_str3DFieldNo = "";
		_str3DFieldPath = "";
		m_FieldAssetPath = "";
		Field = null;
		_fieldModel = null;
		_fieldParticles = null;
		_bgmId = bgmId;
		m_RandomActionTime = 0f;
		IsFieldRandom = false;
		m_SoundAssetPathList = new List<string>();
		_fieldObjDictionary = new Dictionary<string, GameObject>();
		m_FieldAnimationDictionary = new Dictionary<string, Animation>();
		m_FieldAnimatorDictionary = new Dictionary<string, Animator>();
		_fieldParticleSystemDictionary = new Dictionary<string, ParticleSystem>();
		_gimicCntDictionary = new Dictionary<string, int>();
		SetShaderGlobalColorBG = null;
		Physics.gravity = new Vector3(0f, 0f, 9.8f);
		_str3DFieldNo = GetFieldIdString(FieldId);
		_gimicCntDictionary.Add("FieldGimic1", 0);
		_gimicCntDictionary.Add("FieldGimic2", 0);
		_gimicCntDictionary.Add("FieldGimic3", 0);
	}

	public void Dispose()
	{
		UnityEngine.Object.DestroyImmediate(Field);
		Field = null;
		_fieldModel = null;
		_fieldParticles = null;
		_fieldObjDictionary.Clear();
		m_FieldAnimationDictionary.Clear();
		m_FieldAnimatorDictionary.Clear();
		_fieldParticleSystemDictionary.Clear();
		m_SoundAssetPathList.Clear();
		_gimicCntDictionary.Clear();
		SetShaderGlobalColorBG = null;
		BattleCoroutine.GetInstance().StopCoroutine(battleLoadCoroutine);
	}

	public void CreateField(BattleCamera battleCamera, GameObject battle3DContainer, GameObject cutInContainer)
	{
		_battleCamera = battleCamera;
		m_Battle3DContainer = battle3DContainer;
		m_BattleCutInContainer = cutInContainer;
		Camera componentInChildren = m_Battle3DContainer.GetComponentInChildren<Camera>();
		Camera component = componentInChildren.transform.Find("Camera 3DGround").GetComponent<Camera>();
		_battleCamera.SetUp(componentInChildren, m_BattleCutInContainer.transform.Find("Camera").GetComponent<UICamera>(), component);
		LoadField();
	}

	protected void LoadField()
	{
		IsLoadDone = false;
		m_BtlMgrIns = BattleManagerBase.GetIns();
		_str3DFieldNo = GetFieldIdString(FieldEffectId);
		_str3DFieldPath = "3DField" + GetFieldIdString(FieldId);
		m_SoundAssetPathList.Add($"s/se_field_{_str3DFieldNo}.acb");
		m_SoundAssetPathList.Add(string.Format("b/bgm_field_{0}.acb", (_bgmId != "NONE") ? GetFieldIdString(_bgmId) : _str3DFieldNo));
		m_SoundAssetPathList.Add(string.Format("b/bgm_field_{0}.awb", (_bgmId != "NONE") ? GetFieldIdString(_bgmId) : _str3DFieldNo));
		m_FieldAssetPath = Toolbox.ResourcesManager.GetAssetTypePath(_str3DFieldPath, ResourcesManager.AssetLoadPathType.Field3D);
		List<string> additionalAssetList = CollectAdditionalAssets();
		GameMgr.GetIns().GetEffectMgr().InitCommonEffect(string.Format("Json/FIeld" + _str3DFieldNo + "EffectData", _str3DFieldNo), isBattle: true);
		battleLoadCoroutine = BattleCoroutine.GetInstance().StartCoroutine(Toolbox.ResourcesManager.LoadAssetGroupAsync(m_SoundAssetPathList, delegate
		{
			BattleCoroutine.GetInstance().StartCoroutine(Toolbox.ResourcesManager.LoadAssetAsync(m_FieldAssetPath, delegate
			{
				Toolbox.ResourcesManager.BattleListAssetPathList.AddRange(m_SoundAssetPathList);
				Toolbox.ResourcesManager.BattleListAssetPathList.Add(m_FieldAssetPath);
				(UnityEngine.Object.Instantiate(Toolbox.ResourcesManager.LoadObject(Toolbox.ResourcesManager.GetAssetTypePath(_str3DFieldPath, ResourcesManager.AssetLoadPathType.Field3D, isfetch: true))) as GameObject).name = _str3DFieldPath;
				if (additionalAssetList.IsNotNullOrEmpty())
				{
					BattleCoroutine.GetInstance().StartCoroutine(Toolbox.ResourcesManager.LoadAssetGroupAsync(additionalAssetList, delegate
					{
						Toolbox.ResourcesManager.BattleListAssetPathList.AddRange(additionalAssetList);
						BattleFieldBuild();
					}));
				}
				else
				{
					BattleFieldBuild();
				}
			}));
		}));
	}

	private string GetFieldIdString(int fieldId)
	{
		return fieldId.ToString((fieldId < 100) ? "00" : "0000");
	}

	private string GetFieldIdString(string fileldId)
	{
		if (int.TryParse(fileldId, out var result))
		{
			return result.ToString((result < 100) ? "00" : "0000");
		}
		return fileldId;
	}

	protected virtual void BattleFieldBuild()
	{
	}

	protected virtual List<string> CollectAdditionalAssets()
	{
		return null;
	}

	public virtual void StartFieldSetEffect(Vector3 pos)
	{
	}

	public virtual void StartFieldTapEffect(int areaId, Vector3 pos)
	{
		BattleManagerBase.GetIns().BattlePlayer.PlayerBattleView.IsTouchable();
	}

	public void StartFieldOpening()
	{
		PlayBgm();
		OpeningVfx.OpenningLogStep = "StartFieldOpening";
		IsFieldRandom = true;
		BattleCoroutine.GetInstance().StartCoroutine(RunFieldOpening());
	}

	public void PlayBgm()
	{
		GameMgr.GetIns().GetSoundMgr().PlayBGM(string.Format("bgm_field_{0}", (_bgmId != "NONE") ? GetFieldIdString(_bgmId) : _str3DFieldNo), 0f, 0L);
	}

	protected virtual IEnumerator RunFieldOpening()
	{
		yield return new WaitForSeconds(0f);
	}

	public static IEnumerator ObjectChecker(float fWaitSecs, string strObjectFind, Action callback)
	{
		while (GameObject.Find(strObjectFind) == null || !GameMgr.GetIns().GetEffectMgr().IsFieldEffectReady || !GameMgr.GetIns().GetEffectMgr().IsBattleUIEffectReady)
		{
			yield return null;
		}
		callback();
	}

	public void StartFieldGimic(GameObject obj)
	{
		if (!GameMgr.GetIns().IsReplayBattle && BattleManagerBase.GetIns().BattlePlayer.PlayerBattleView.IsTouchable())
		{
			BattleCoroutine.GetInstance().StartCoroutine(RunFieldGimic(obj));
		}
	}

	protected virtual IEnumerator RunFieldGimic(GameObject obj)
	{
		yield return new WaitForSeconds(0f);
	}

	public void StartFieldShake()
	{
		BattleCoroutine.GetInstance().StartCoroutine(RunFieldShake());
	}

	protected virtual IEnumerator RunFieldShake()
	{
		yield return new WaitForSeconds(0f);
	}

	public virtual void UpdateFieldRandom()
	{
	}

	public void AddParticleToFieldObjDictionary(string targetPath)
	{
		string[] array = targetPath.Split('/');
		List<Transform> list = new List<Transform>();
		list.Add(_fieldParticles.transform);
		List<Transform> list2 = new List<Transform>();
		for (int i = 0; i < array.Length; i++)
		{
			list2 = new List<Transform>();
			for (int j = 0; j < list.Count; j++)
			{
				list2.AddRange(FindAllChildByName(list[j], array[i]));
			}
			list = new List<Transform>(list2);
		}
		for (int k = 0; k < list2.Count; k++)
		{
			_fieldObjDictionary.Add(targetPath + "_" + k, list2[k].gameObject);
		}
	}

	public List<Transform> FindAllChildByName(Transform parent, string name)
	{
		List<Transform> list = new List<Transform>();
		for (int i = 0; i < parent.childCount; i++)
		{
			Transform child = parent.GetChild(i);
			if (child.name == name)
			{
				list.Add(child);
			}
		}
		return list;
	}
}
