public Player Simulate5() { Log.worldId = WorldId; Log.stageId = StageId; Log.waveCount = _waves.Count; Log.clearedWaveNumber = 0; Log.newlyCleared = false; Player.SpawnV2(); TurnNumber = 0; for (var i = 0; i < _waves.Count; i++) { Characters = new SimplePriorityQueue <CharacterBase, decimal>(); Characters.Enqueue(Player, TurnPriority / Player.SPD); WaveNumber = i + 1; WaveTurn = 1; _waves[i].SpawnV2(this); while (true) { // 제한 턴을 넘어서는 경우 break. if (TurnNumber > TurnLimit) { if (i == 0) { Result = BattleLog.Result.Lose; if (StageId < GameConfig.MimisbrunnrStartStageId) { Player.GetExp((int)(Exp * 0.3m), true); } } else { Result = BattleLog.Result.TimeOver; } break; } // 캐릭터 큐가 비어 있는 경우 break. if (!Characters.TryDequeue(out var character)) { break; } character.Tick(); // 플레이어가 죽은 경우 break; if (Player.IsDead) { if (i == 0) { Result = BattleLog.Result.Lose; if (StageId < GameConfig.MimisbrunnrStartStageId) { Player.GetExp((int)(Exp * 0.3m), true); } } else { Result = BattleLog.Result.Win; } break; } // 플레이어의 타겟(적)이 없는 경우 break. if (!Player.Targets.Any()) { Result = BattleLog.Result.Win; Log.clearedWaveNumber = WaveNumber; switch (WaveNumber) { case 1: if (StageId < GameConfig.MimisbrunnrStartStageId) { Player.GetExp(Exp, true); } break; case 2: { ItemMap = Player.GetRewards(_waveRewards); var dropBox = new DropBox(null, _waveRewards); Log.Add(dropBox); var getReward = new GetReward(null, _waveRewards); Log.Add(getReward); break; } default: if (WaveNumber == _waves.Count) { if (!IsCleared) { Log.newlyCleared = true; } } break; } break; } foreach (var other in Characters) { var current = Characters.GetPriority(other); var speed = current * 0.6m; Characters.UpdatePriority(other, speed); } Characters.Enqueue(character, TurnPriority / character.SPD); } // 제한 턴을 넘거나 플레이어가 죽은 경우 break; if (TurnNumber > TurnLimit || Player.IsDead) { break; } } Log.result = Result; return(Player); }
public Player SimulateV4() { #if TEST_LOG var sb = new System.Text.StringBuilder(); #endif Log.stageId = _stageId; Spawn(); Characters = new SimplePriorityQueue <CharacterBase, decimal>(); Characters.Enqueue(Player, TurnPriority / Player.SPD); Characters.Enqueue(_enemyPlayer, TurnPriority / _enemyPlayer.SPD); TurnNumber = 1; WaveNumber = 1; WaveTurn = 1; #if TEST_LOG sb.Clear(); sb.Append($"{nameof(TurnNumber)}: {TurnNumber}"); sb.Append($" / {nameof(WaveNumber)}: {WaveNumber}"); sb.Append($" / {nameof(WaveTurn)}: {WaveTurn}"); sb.Append($" / {nameof(WaveNumber)} Start"); UnityEngine.Debug.LogWarning(sb.ToString()); #endif while (true) { if (TurnNumber > MaxTurn) { Result = BattleLog.Result.TimeOver; #if TEST_LOG sb.Clear(); sb.Append($"{nameof(TurnNumber)}: {TurnNumber}"); sb.Append($" / {nameof(WaveNumber)}: {WaveNumber}"); sb.Append($" / {nameof(WaveTurn)}: {WaveTurn}"); sb.Append($" / {nameof(MaxTurn)}: {MaxTurn}"); sb.Append($" / {nameof(Result)}: {Result.ToString()}"); UnityEngine.Debug.LogWarning(sb.ToString()); #endif break; } // 캐릭터 큐가 비어 있는 경우 break. if (!Characters.TryDequeue(out var character)) { break; } character.Tick(); // 플레이어가 죽은 경우 break; if (Player.IsDead) { Result = BattleLog.Result.Lose; #if TEST_LOG sb.Clear(); sb.Append($"{nameof(TurnNumber)}: {TurnNumber}"); sb.Append($" / {nameof(WaveNumber)}: {WaveNumber}"); sb.Append($" / {nameof(WaveTurn)}: {WaveTurn}"); sb.Append($" / {nameof(Player)} Dead"); sb.Append($" / {nameof(Result)}: {Result.ToString()}"); UnityEngine.Debug.LogWarning(sb.ToString()); #endif break; } // 플레이어의 타겟(적)이 없는 경우 break. if (!Player.Targets.Any()) { Result = BattleLog.Result.Win; Log.clearedWaveNumber = WaveNumber; break; } foreach (var other in Characters) { var current = Characters.GetPriority(other); var speed = current * 0.6m; Characters.UpdatePriority(other, speed); } Characters.Enqueue(character, TurnPriority / character.SPD); } Log.diffScore = _arenaInfo.UpdateV4(_enemyInfo, Result); Log.score = _arenaInfo.Score; var itemSelector = new WeightedSelector <StageSheet.RewardData>(Random); var rewardSheet = WeeklyArenaRewardSheet; foreach (var row in rewardSheet.OrderedList) { var reward = row.Reward; if (reward.RequiredLevel <= Player.Level) { itemSelector.Add(reward, reward.Ratio); } } var max = _arenaInfo.GetRewardCount(); _reward = SetRewardV2(itemSelector, max, Random, MaterialItemSheet); var getReward = new GetReward(null, _reward); Log.Add(getReward); Log.result = Result; #if TEST_LOG sb.Clear(); sb.Append($"{nameof(TurnNumber)}: {TurnNumber}"); sb.Append($" / {nameof(WaveNumber)}: {WaveNumber}"); sb.Append($" / {nameof(WaveTurn)}: {WaveTurn}"); sb.Append($" / {nameof(Simulate)} End"); sb.Append($" / {nameof(Result)}: {Result.ToString()}"); UnityEngine.Debug.LogWarning(sb.ToString()); #endif return(Player); }
public Player Simulate3() { #if TEST_LOG var sb = new System.Text.StringBuilder(); #endif Log.worldId = WorldId; Log.stageId = StageId; Log.waveCount = _waves.Count; Log.clearedWaveNumber = 0; Log.newlyCleared = false; Player.SpawnV2(); TurnNumber = 0; for (var i = 0; i < _waves.Count; i++) { Characters = new SimplePriorityQueue <CharacterBase, decimal>(); Characters.Enqueue(Player, TurnPriority / Player.SPD); WaveNumber = i + 1; WaveTurn = 1; _waves[i].SpawnV2(this); #if TEST_LOG sb.Clear(); sb.Append($"{nameof(TurnNumber)}: {TurnNumber}"); sb.Append($" / {nameof(WaveNumber)}: {WaveNumber}"); sb.Append($" / {nameof(WaveTurn)}: {WaveTurn}"); sb.Append(" / Wave Start"); UnityEngine.Debug.LogWarning(sb.ToString()); #endif while (true) { // 제한 턴을 넘어서는 경우 break. if (TurnNumber > TurnLimit) { if (i == 0) { Result = BattleLog.Result.Lose; if (StageId < GameConfig.MimisbrunnrStartStageId) { Player.GetExp3((int)(Exp * 0.3m), true); } } else { Result = BattleLog.Result.TimeOver; } #if TEST_LOG sb.Clear(); sb.Append($"{nameof(TurnNumber)}: {TurnNumber}"); sb.Append($" / {nameof(WaveNumber)}: {WaveNumber}"); sb.Append($" / {nameof(WaveTurn)}: {WaveTurn}"); sb.Append($" / {nameof(TurnLimit)}: {TurnLimit}"); sb.Append($" / {nameof(Result)}: {Result.ToString()}"); UnityEngine.Debug.LogWarning(sb.ToString()); #endif break; } // 캐릭터 큐가 비어 있는 경우 break. if (!Characters.TryDequeue(out var character)) { break; } #if TEST_LOG var turnBefore = TurnNumber; #endif character.Tick(); #if TEST_LOG var turnAfter = TurnNumber; if (turnBefore != turnAfter) { sb.Clear(); sb.Append($"{nameof(TurnNumber)}: {TurnNumber}"); sb.Append($" / {nameof(WaveNumber)}: {WaveNumber}"); sb.Append($" / {nameof(WaveTurn)}: {WaveTurn}"); sb.Append(" / Turn End"); UnityEngine.Debug.LogWarning(sb.ToString()); } #endif // 플레이어가 죽은 경우 break; if (Player.IsDead) { if (i == 0) { Result = BattleLog.Result.Lose; if (StageId < GameConfig.MimisbrunnrStartStageId) { Player.GetExp3((int)(Exp * 0.3m), true); } } else { Result = BattleLog.Result.Win; } #if TEST_LOG sb.Clear(); sb.Append($"{nameof(TurnNumber)}: {TurnNumber}"); sb.Append($" / {nameof(WaveNumber)}: {WaveNumber}"); sb.Append($" / {nameof(WaveTurn)}: {WaveTurn}"); sb.Append($" / {nameof(Player)} Dead"); sb.Append($" / {nameof(Result)}: {Result.ToString()}"); UnityEngine.Debug.LogWarning(sb.ToString()); #endif break; } // 플레이어의 타겟(적)이 없는 경우 break. if (!Player.Targets.Any()) { Result = BattleLog.Result.Win; Log.clearedWaveNumber = WaveNumber; switch (WaveNumber) { case 1: if (StageId < GameConfig.MimisbrunnrStartStageId) { Player.GetExp3(Exp, true); } break; case 2: { ItemMap = Player.GetRewards2(_waveRewards); var dropBox = new DropBox(null, _waveRewards); Log.Add(dropBox); var getReward = new GetReward(null, _waveRewards); Log.Add(getReward); break; } default: if (WaveNumber == _waves.Count) { if (!IsCleared) { Log.newlyCleared = true; } } break; } break; } foreach (var other in Characters) { var current = Characters.GetPriority(other); var speed = current * 0.6m; Characters.UpdatePriority(other, speed); } Characters.Enqueue(character, TurnPriority / character.SPD); } // 제한 턴을 넘거나 플레이어가 죽은 경우 break; if (TurnNumber > TurnLimit || Player.IsDead) { break; } } Log.result = Result; #if TEST_LOG sb.Clear(); sb.Append($"{nameof(TurnNumber)}: {TurnNumber}"); sb.Append($" / {nameof(WaveNumber)}: {WaveNumber}"); sb.Append($" / {nameof(WaveTurn)}: {WaveTurn}"); sb.Append($" / {nameof(Simulate)} End"); sb.Append($" / {nameof(Result)}: {Result.ToString()}"); UnityEngine.Debug.LogWarning(sb.ToString()); #endif return(Player); }