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.
162 lines
4.6 KiB
162 lines
4.6 KiB
using UnityEngine;
|
|
using static BattleMgr;
|
|
|
|
public class DreamWorld : GameMod
|
|
{
|
|
[SerializeField] Transform playerSpawnPos;
|
|
[SerializeField] Transform bossSpawnPos;
|
|
|
|
[SerializeField] DreamWorldView view;
|
|
|
|
BattleMgr battleMgr => BattleMgr.Instance;
|
|
float modElapsedTime;
|
|
|
|
IVCharacter player;
|
|
|
|
public new DreamWorldData Data => base.Data as DreamWorldData;
|
|
public Character Boss { get; private set; }
|
|
public float ModRemainingTime => Mathf.Max(Data.LimitTime - modElapsedTime, 0f);
|
|
|
|
protected override void OnStartMod()
|
|
{
|
|
SoundMgr.Instance.PlayBgm(Data.BGMPath);
|
|
BattleMgr.Instance.SetBackGround(Data.BackGroundPath);
|
|
|
|
//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);
|
|
|
|
InstantiateBoss();
|
|
|
|
modElapsedTime = 0f;
|
|
|
|
IVCameraController.SMoveCamera(player.transform.position);
|
|
|
|
//Set UI
|
|
GameUIMgr.OnOffStageInfo(false);
|
|
|
|
view?.SetMod(this);
|
|
view?.Show();
|
|
}
|
|
|
|
private void InstantiateBoss()
|
|
{
|
|
var enemyData = new CharacterData(Data.BossEnemyCreator.property);
|
|
|
|
if (enemyData.TryGetStat(StatID.Hp, out var stat))
|
|
stat.DefaultValue = Data.BossEnemyCreator.GetHp(Data.Level);
|
|
if (enemyData.TryGetStat(StatID.Attack, out stat))
|
|
stat.DefaultValue = Data.BossEnemyCreator.GetAtk(Data.Level);
|
|
|
|
Boss = Instantiate(enemyData.Prefab);
|
|
Boss.SetData(enemyData);
|
|
Boss.AddTags(EntityTag.Enemy);
|
|
Boss.SetTargetTags(LayerMask.GetMask(GameProperty.Instance.CharacterLayerName), EntityTag.Player);
|
|
Boss.Spawn(bossSpawnPos.position);
|
|
Boss.ChangeLookDirection(player.transform);
|
|
Boss.OnDisposed += DestroyCharacter;
|
|
battleMgr.RegistBattleEntities(Boss);
|
|
}
|
|
|
|
private void DestroyCharacter(Character target)
|
|
{
|
|
if (target == null || target.gameObject == null) return;
|
|
|
|
battleMgr.UnregistBattleEntities(target);
|
|
CoroutineHandler.Instance.DelayCall(1f, () => Destroy(target.gameObject));
|
|
}
|
|
|
|
protected override void OnUpdate()
|
|
{
|
|
if (BattleMgr.Instance.BattlePause) return;
|
|
|
|
modElapsedTime += Time.deltaTime;
|
|
|
|
if (modElapsedTime >= Data.LimitTime)
|
|
{
|
|
battleMgr.ShowTalkBox(TalkType.Die);
|
|
|
|
Data.TryGetReward(Data.Level - 1, (totalReward, result) =>
|
|
{
|
|
if (!result) return;
|
|
|
|
GameUIMgr.SOpenPopupGoods(totalReward);
|
|
DataHandler.SetFantasyWorldRing(DataHandler.Goods.fantasyWorldRing - 1);
|
|
});
|
|
|
|
FireOnDone(Result.Timeout);
|
|
}
|
|
else
|
|
{
|
|
if (Boss.IsDead)
|
|
{
|
|
battleMgr.ShowTalkBox(TalkType.Attack);
|
|
|
|
Data.TryGetReward((totalReward, result) =>
|
|
{
|
|
if (!result) return;
|
|
GameUIMgr.SOpenPopupGoods(totalReward);
|
|
DataHandler.SetFantasyWorldRing(DataHandler.Goods.fantasyWorldRing - 1);
|
|
});
|
|
|
|
Data.SetLevel(Data.Level + 1);
|
|
|
|
FireOnDone(Result.Success);
|
|
}
|
|
else if (player.IsDead)
|
|
{
|
|
battleMgr.ShowTalkBox(TalkType.Die);
|
|
|
|
Data.TryGetReward(Data.Level - 1, (totalReward, result) =>
|
|
{
|
|
if (!result) return;
|
|
|
|
GameUIMgr.SOpenPopupGoods(totalReward);
|
|
DataHandler.SetFantasyWorldRing(DataHandler.Goods.fantasyWorldRing - 1);
|
|
});
|
|
|
|
FireOnDone(Result.Dead);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void OnEndMod()
|
|
{
|
|
view?.Hide();
|
|
|
|
GameUIMgr.OnOffStageInfo(true);
|
|
|
|
if (!Boss.IsDead)
|
|
{
|
|
DestroyCharacter(Boss);
|
|
}
|
|
}
|
|
|
|
public void QuitDungeon()
|
|
{
|
|
battleMgr.ShowTalkBox(TalkType.Die);
|
|
FireOnDone(Result.Quit);
|
|
}
|
|
}
|