Skip to content

Commit

Permalink
Revert "Merge pull request #2018 from planetarium/improve/has-execute"
Browse files Browse the repository at this point in the history
This reverts commit f76932c, reversing
changes made to ddb70d8.
  • Loading branch information
sonohoshi committed Jul 20, 2023
1 parent 7f72ea1 commit 0f258b8
Show file tree
Hide file tree
Showing 40 changed files with 400 additions and 407 deletions.
34 changes: 0 additions & 34 deletions .Lib9c.Tests/Action/HitHelperTest.cs

This file was deleted.

34 changes: 2 additions & 32 deletions .Lib9c.Tests/Model/Skill/CombatTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public void CalculateDEFAndDamageReduction(int def, int drv, int drr, int enemyA
var normalAttack = new NormalAttack(skillRow, 0, 100, default, StatType.NONE);

var prevHP = _player.CurrentHP;
normalAttack.Use(_enemy, 1, new List<StatBuff>(), false);
normalAttack.Use(_enemy, 1, new List<StatBuff>());
var currentHP = _player.CurrentHP;
var damage = prevHP - currentHP;

Expand All @@ -100,41 +100,11 @@ public void CalculateCritDamage(int cdmg, int atk, int expectedDamage)
var normalAttack = new NormalAttack(skillRow, 0, 100, default, StatType.NONE);

var prevHP = _player.CurrentHP;
normalAttack.Use(_enemy, 1, new List<StatBuff>(), false);
normalAttack.Use(_enemy, 1, new List<StatBuff>());
var currentHP = _player.CurrentHP;
var damage = prevHP - currentHP;

Assert.Equal(expectedDamage, damage);
}

[Fact]
public void Thorn()
{
var prevHP = _enemy.CurrentHP;
var skill = _enemy.GiveThornDamage(1);
var currentHP = _enemy.CurrentHP;
// get 1dmg from thorn
Assert.Equal(prevHP - 1, currentHP);
Assert.Equal(prevHP, skill.Character.CurrentHP);
var skillInfo = Assert.Single(skill.SkillInfos);
Assert.Equal(currentHP, skillInfo.Target!.CurrentHP);
}

[Fact]
public void Bleed()
{
var actionBuffSheet = _tableSheets.ActionBuffSheet;
var row = actionBuffSheet.Values.First();
var bleed = Assert.IsType<Bleed>(BuffFactory.GetActionBuff(_enemy.Stats, row));
var dmg = bleed.Power;
var prevHP = _player.CurrentHP;
var skill = bleed.GiveEffect(_player, 1);
var currentHP = _player.CurrentHP;
// get dmg from bleed
Assert.Equal(prevHP - dmg, currentHP);
Assert.Equal(prevHP, skill.Character.CurrentHP);
var skillInfo = Assert.Single(skill.SkillInfos);
Assert.Equal(currentHP, skillInfo.Target!.CurrentHP);
}
}
}
21 changes: 9 additions & 12 deletions .Lib9c.Tests/Model/Skill/NormalAttackTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,8 @@ public NormalAttackTest(ITestOutputHelper outputHelper)
.CreateLogger();
}

[Theory]
[InlineData(true)]
[InlineData(false)]
public void Use(bool copyCharacter)
[Fact]
public void Use()
{
var sheets = TableSheetsImporter.ImportSheets();
var tableSheets = new TableSheets(sheets);
Expand Down Expand Up @@ -67,8 +65,7 @@ public void Use(bool copyCharacter)
StageSimulator.GetWaveRewards(
random,
tableSheets.StageSheet[1],
tableSheets.MaterialItemSheet),
copyCharacter
tableSheets.MaterialItemSheet)
);
var player = new Player(avatarState, simulator);

Expand All @@ -82,13 +79,13 @@ public void Use(bool copyCharacter)
var battleStatusSkill = normalAttack.Use(
player,
0,
new List<StatBuff>(),
copyCharacter);
new List<StatBuff>());
Assert.NotNull(battleStatusSkill);
Assert.Equal(!copyCharacter, battleStatusSkill.Character is null);
var skillInfo = Assert.Single(battleStatusSkill.SkillInfos);
Assert.Equal(enemy.Id, skillInfo.CharacterId);
Assert.Equal(!copyCharacter, skillInfo.Target is null);
Assert.Single(battleStatusSkill.SkillInfos);

var skillInfo = battleStatusSkill.SkillInfos.FirstOrDefault();
Assert.NotNull(skillInfo);
Assert.Equal(enemy.Id, skillInfo.Target.Id);
}
}
}
40 changes: 14 additions & 26 deletions Lib9c/Action/HackAndSlash.cs
Original file line number Diff line number Diff line change
Expand Up @@ -439,14 +439,8 @@ public IAccountStateDelta Execute(
}
}

var stageWaveRow = sheets.GetSheet<StageWaveSheet>()[StageId];
var enemySkillSheet = sheets.GetSheet<EnemySkillSheet>();
var costumeStatSheet = sheets.GetSheet<CostumeStatSheet>();
var stageCleared = !isNotClearedStage;
var starCount = 0;
for (var i = 0; i < TotalPlayCount; i++)
{
var rewards = StageSimulator.GetWaveRewards(random, stageRow, materialItemSheet);
sw.Restart();
// First simulating will use Foods and Random Skills.
// Remainder simulating will not use Foods.
Expand All @@ -459,14 +453,13 @@ public IAccountStateDelta Execute(
WorldId,
StageId,
stageRow,
stageWaveRow,
stageCleared,
sheets.GetSheet<StageWaveSheet>()[StageId],
avatarState.worldInformation.IsStageCleared(StageId),
StageRewardExpHelper.GetExp(avatarState.level, StageId),
simulatorSheets,
enemySkillSheet,
costumeStatSheet,
rewards,
false);
sheets.GetSheet<EnemySkillSheet>(),
sheets.GetSheet<CostumeStatSheet>(),
StageSimulator.GetWaveRewards(random, stageRow, materialItemSheet));
sw.Stop();
Log.Verbose("{AddressesHex}HAS Initialize Simulator: {Elapsed}", addressesHex, sw.Elapsed);

Expand All @@ -478,17 +471,13 @@ public IAccountStateDelta Execute(
sw.Restart();
if (simulator.Log.IsClear)
{
if (!stageCleared)
{
avatarState.worldInformation.ClearStage(
WorldId,
StageId,
blockIndex,
worldSheet,
worldUnlockSheet
);
stageCleared = true;
}
simulator.Player.worldInformation.ClearStage(
WorldId,
StageId,
blockIndex,
worldSheet,
worldUnlockSheet
);
sw.Stop();
Log.Verbose("{AddressesHex}HAS ClearStage: {Elapsed}", addressesHex, sw.Elapsed);
}
Expand All @@ -515,8 +504,9 @@ public IAccountStateDelta Execute(
player.eventMapForBeforeV100310.Clear();
}

starCount += simulator.Log.clearedWaveNumber;
avatarState.Update(simulator);
// Update CrystalRandomSkillState.Stars by clearedWaveNumber. (add)
skillState?.Update(simulator.Log.clearedWaveNumber, crystalStageBuffSheet);

sw.Stop();
Log.Verbose(
Expand All @@ -536,8 +526,6 @@ public IAccountStateDelta Execute(
Log.Verbose("{AddressesHex}HAS loop Simulate: {Elapsed}, Count: {PlayCount}",
addressesHex, sw.Elapsed, TotalPlayCount);

// Update CrystalRandomSkillState.Stars by clearedWaveNumber. (add)
skillState?.Update(starCount, crystalStageBuffSheet);
sw.Restart();
avatarState.UpdateQuestRewards(materialItemSheet);
avatarState.updatedAt = blockIndex;
Expand Down
127 changes: 76 additions & 51 deletions Lib9c/Battle/AttackCountHelper.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,68 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace Nekoyume.Battle
{
public static class AttackCountHelper
{
public struct Info
{
public decimal DamageMultiplier;
public decimal AdditionalCriticalChance;
}

public const int CountMaxLowerLimit = 2;
public const int CountMaxUpperLimit = 5;

/// <summary>
/// key: attack count max
/// value: attack count, info
/// </summary>
public static readonly IReadOnlyDictionary<int, IReadOnlyDictionary<int, Info>> CachedInfo =
new Dictionary<int, IReadOnlyDictionary<int, Info>>
{
{
1, new Dictionary<int, Info>
{
{1, new Info {DamageMultiplier = 1m, AdditionalCriticalChance = 0m}}
}
},
{
2, new Dictionary<int, Info>
{
{1, new Info {DamageMultiplier = 1m, AdditionalCriticalChance = 0m}},
{2, new Info {DamageMultiplier = 2m, AdditionalCriticalChance = 25m}}
}
},
{
3, new Dictionary<int, Info>
{
{1, new Info {DamageMultiplier = 1m, AdditionalCriticalChance = 0m}},
{2, new Info {DamageMultiplier = 2m, AdditionalCriticalChance = 10m}},
{3, new Info {DamageMultiplier = 3m, AdditionalCriticalChance = 35m}}
}
},
{
4, new Dictionary<int, Info>
{
{1, new Info {DamageMultiplier = 1m, AdditionalCriticalChance = 0m}},
{2, new Info {DamageMultiplier = 2m, AdditionalCriticalChance = 10m}},
{3, new Info {DamageMultiplier = 3m, AdditionalCriticalChance = 20m}},
{4, new Info {DamageMultiplier = 4m, AdditionalCriticalChance = 45m}}
}
},
{
5, new Dictionary<int, Info>
{
{1, new Info {DamageMultiplier = 1m, AdditionalCriticalChance = 0m}},
{2, new Info {DamageMultiplier = 2m, AdditionalCriticalChance = 10m}},
{3, new Info {DamageMultiplier = 3m, AdditionalCriticalChance = 20m}},
{4, new Info {DamageMultiplier = 4m, AdditionalCriticalChance = 30m}},
{5, new Info {DamageMultiplier = 5m, AdditionalCriticalChance = 55m}}
}
}
};

public static int GetCountMax(int level)
{
if (level < 11)
Expand All @@ -22,69 +76,40 @@ public static int GetCountMax(int level)
: CountMaxUpperLimit;
}

public static int GetDamageMultiplier(int attackCount, int attackCountMax)
public static decimal GetDamageMultiplier(int attackCount, int attackCountMax)
{
if (attackCount > attackCountMax)
throw new ArgumentOutOfRangeException(
$"{nameof(attackCount)}: {attackCount} / {nameof(attackCountMax)}: {attackCountMax}");

if (attackCountMax <= 5)
{
return Math.Max(1, attackCount);
}
var info = GetInfo(attackCount, attackCountMax);
return info.DamageMultiplier;
}

throw new ArgumentOutOfRangeException();
public static decimal GetAdditionalCriticalChance(int attackCount, int attackCountMax)
{
if (attackCount > attackCountMax)
throw new ArgumentOutOfRangeException(
$"{nameof(attackCount)}: {attackCount} / {nameof(attackCountMax)}: {attackCountMax}");

var info = GetInfo(attackCount, attackCountMax);
return info.AdditionalCriticalChance;
}

public static int GetAdditionalCriticalChance(int attackCount, int attackCountMax)
private static Info GetInfo(int attackCount, int attackCountMax)
{
if (attackCount > attackCountMax)
throw new ArgumentOutOfRangeException(
$"{nameof(attackCount)}: {attackCount} / {nameof(attackCountMax)}: {attackCountMax}");
switch (attackCount)
{
case 1:
return 0;
case 2:
switch (attackCountMax)
{
case 2:
return 25;
case 3:
case 4:
case 5:
return 10;
}
break;
case 3:
switch (attackCountMax)
{
case 3:
return 35;
case 4:
case 5:
return 20;
}
break;
case 4:
switch (attackCountMax)
{
case 4:
return 45;
case 5:
return 30;
}
break;
case 5:
switch (attackCountMax)
{
case 5:
return 55;
}
break;
}

throw new ArgumentOutOfRangeException();
if (!CachedInfo.ContainsKey(attackCountMax))
throw new ArgumentOutOfRangeException($"{nameof(attackCountMax)}: {attackCountMax}");

if (!CachedInfo[attackCountMax].ContainsKey(attackCount))
throw new ArgumentOutOfRangeException(
$"{nameof(attackCountMax)}: {attackCountMax} / {nameof(attackCount)}: {attackCount}");

return CachedInfo[attackCountMax][attackCount];
}
}
}
Loading

0 comments on commit 0f258b8

Please sign in to comment.