You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

217 lines
6.4 KiB

using BigFloatNumerics;
using System;
using System.Collections.Generic;
using UnityEngine;
using static BattleMgr;
public class DevelopTheJungleDg : GameMod
{
[SerializeField] Transform playerSpawnPos;
[SerializeField] DevelopTheJungleDgView view;
BattleMgr battleMgr => BattleMgr.Instance;
float modElapsedTime;
IVCharacter player;
Dictionary<uint, IMonoObjectPool<Character>> normalEnemyPoolMap;
public new DevelopTheJungleDgData Data => base.Data as DevelopTheJungleDgData;
public int CurrentWave { get; private set; }
public int CurEnemyCount { get; private set; }
public float ModRemainingTime => Mathf.Max(Data.LimitTime - modElapsedTime, 0f);
protected override void OnInitialize()
{
normalEnemyPoolMap = new Dictionary<uint, IMonoObjectPool<Character>>();
}
protected override void OnStartMod()
{
SoundMgr.Instance.PlayBgm(Data.BGMPath);
BattleMgr.Instance.SetBackGround(Data.BackGroundPath);
//Set enemy pool
foreach (var creator in Data.NormalEnemyCreators)
{
var pool = new DynamicMonoObjectPool<Character>();
pool.Initialize(
() => InstantiateEnemy(pool, creator.property, () => creator.GetHp(Data.Level), () => creator.GetAtk(Data.Level)),
DestroyEnemy,
(obj) => obj.gameObject.SetActive(false),
(obj) => obj.gameObject.SetActive(true));
normalEnemyPoolMap.Add(creator.property.id, pool);
}
//Summon player
player = battleMgr.GetPlayer();
var buffMgr = BuffMgr.Instance;
player.ResetDebuff();
player.SetStatus(
buffMgr.GetCharAtk(),
buffMgr.GetCharHp(),
buffMgr.GetCharCrtDam(),
buffMgr.GetCharCrtRate(),
buffMgr.GetCharMov(),
buffMgr.GetCharSpd(),
GameProperty.Instance.PlayerCharacterAttackRange);
player.transform.position = playerSpawnPos.position;
player.Summon();
MateMgr.Instance.EndAllSettedMateSkillCool();
MateMgr.Instance.SetAcitveMateToFirst();
MateMgr.Instance.ActiveMate?.Spawn(player, player.LookDirection);
battleMgr.SetPetsSummonState(true);
battleMgr.SetGudiansSummonState(true);
battleMgr.ShowTalkBox(TalkType.Summon);
CurrentWave = 0;
CurEnemyCount = 0;
modElapsedTime = 0f;
IVCameraController.SMoveCamera(player.transform.position);
//Set UI
GameUIMgr.OnOffStageInfo(false);
view?.SetDungeon(this);
view?.Show();
}
private Character InstantiateEnemy(DynamicMonoObjectPool<Character> targetPool, CharacterProperty prop, Func<BigFloat> getHpFunc, Func<BigFloat> getAtkFunc)
{
var enemyData = new CharacterData(prop);
if (enemyData.TryGetStat(StatID.Hp, out var hpStat))
hpStat.DefaultValue = getHpFunc();
if (enemyData.TryGetStat(StatID.Attack, out var atkStat))
atkStat.DefaultValue = getAtkFunc();
var enemy = Instantiate(enemyData.Prefab);
enemy.SetData(enemyData);
enemy.AddTags(EntityTag.Enemy);
enemy.SetTargetTags(LayerMask.GetMask(GameProperty.Instance.CharacterLayerName), EntityTag.Player);
enemy.OnDamaged += (obj, damage) =>
{
if (obj.CurrentHp <= 0)
{
BattleMgr.Instance.UnregistBattleEntities(obj);
CurEnemyCount--;
}
};
enemy.OnDisposed += (obj) => targetPool.Return(obj);
return enemy;
}
private void DestroyEnemy(Character enemy)
{
if (enemy == null || enemy.gameObject == null) return;
BattleMgr.Instance.UnregistBattleEntities(enemy);
CoroutineHandler.Instance.DelayCall(1f, () => Destroy(enemy.gameObject));
}
protected override void OnUpdate()
{
if(BattleMgr.Instance.BattlePause) return;
modElapsedTime += Time.deltaTime;
if (modElapsedTime >= Data.LimitTime)
{
battleMgr.ShowTalkBox(TalkType.Die);
FireOnDone(Result.Timeout);
}
else
{
if (player.IsDead)
{
battleMgr.ShowTalkBox(TalkType.Die);
FireOnDone(Result.Dead);
}
else if (CurEnemyCount <= 0)
{
if (CurrentWave < Data.WaveCount)
{
CurrentWave++;
SpawnWave();
}
else
{
battleMgr.ShowTalkBox(TalkType.Attack);
Data.TryGetReward(Data.Level, (totalReward, result) =>
{
if (!result) return;
GameUIMgr.SOpenPopupGoods(totalReward);
GameUIMgr.RefreshDevelopTheJungleDgTicket();
}, Data.GetRewardMultiplier());
Data.SetLevel(Data.Level + 1);
Data.EnterTicketCount--;
Data.ClearCount++;
FireOnDone(Result.Success);
}
}
}
}
private void SpawnWave()
{
var areaSize = BattleMgr.Instance.GetBgSize();
CurEnemyCount = 0;
foreach (var creator in Data.NormalEnemyCreators)
{
var rndPositions = TargetFinder.GetRandom(areaSize.bounds, (int)creator.countPerWave);
var pool = normalEnemyPoolMap[creator.property.id];
for (int i = 0; i < creator.countPerWave; i++)
{
var enemy = pool.Get();
enemy.Spawn(rndPositions[i]);
enemy.ChangeLookDirection(player.transform);
BattleMgr.Instance.RegistBattleEntities(enemy);
CurEnemyCount++;
}
}
}
protected override void OnEndMod()
{
view?.Hide();
GameUIMgr.OnOffStageInfo(true);
foreach (var pool in normalEnemyPoolMap.Values)
{
pool.Dispose();
}
normalEnemyPoolMap.Clear();
if (Data.AutoProgress && Data.EnterTicketCount <= 0)
{
GameUIMgr.SOpenToast(LocalizationText.GetText("notice_stop_autoprogress_0"));
Data.AutoProgress = false;
}
Data.TryCount++;
}
public void QuitDungeon()
{
battleMgr.ShowTalkBox(TalkType.Die);
FireOnDone(Result.Quit);
}
}