Skip to content

Commit 04d6656

Browse files
authored
Merge pull request #2431 from planetarium/release/1.9.2
Divide SetRuneStats, RuneSkills for fix rune skill
2 parents ff2c8ae + 4bca541 commit 04d6656

File tree

7 files changed

+145
-27
lines changed

7 files changed

+145
-27
lines changed

.Lib9c.Tests/Model/ArenaSimulatorTest.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,5 +282,72 @@ public void Thorns()
282282
Assert.True(challengerTick.Character.HP > enemyTick.Character.HP);
283283
Assert.True(enemyTick.SkillInfos.First().Effect > challengerTick.SkillInfos.First().Effect);
284284
}
285+
286+
[Fact]
287+
public void Bleed()
288+
{
289+
var random = new TestRandom();
290+
var avatarState1 = _avatarState1;
291+
var avatarState2 = _avatarState2;
292+
293+
var arenaAvatarState1 = new ArenaAvatarState(avatarState1);
294+
var arenaAvatarState2 = new ArenaAvatarState(avatarState2);
295+
296+
var characterRow = _tableSheets.CharacterSheet[GameConfig.DefaultAvatarCharacterId];
297+
var stats = characterRow.ToStats(avatarState1.level);
298+
var totalAtk = 141138;
299+
var baseAtk = stats.ATK;
300+
var runeOptionSheet = _tableSheets.RuneOptionSheet;
301+
var runeRow = runeOptionSheet[10003];
302+
var rune = new RuneState(10003);
303+
while (rune.Level < 89)
304+
{
305+
rune.LevelUp();
306+
}
307+
308+
var optionInfo = runeRow.LevelOptionMap[89];
309+
var statModifiers = new List<StatModifier>();
310+
statModifiers.AddRange(
311+
optionInfo.Stats.Select(x =>
312+
new StatModifier(
313+
x.stat.StatType,
314+
x.operationType,
315+
x.stat.TotalValueAsLong)));
316+
foreach (var modifier in statModifiers)
317+
{
318+
if (modifier.StatType == StatType.ATK)
319+
{
320+
baseAtk += modifier.Value;
321+
}
322+
}
323+
324+
// Add collection modifier without level stats, rune stats
325+
var collectionModifier = new StatModifier(StatType.ATK, StatModifier.OperationType.Add, totalAtk - baseAtk);
326+
var modifiers = new List<StatModifier>
327+
{
328+
collectionModifier,
329+
new (StatType.HP, StatModifier.OperationType.Add, totalAtk * 10),
330+
};
331+
332+
var simulator = new ArenaSimulator(random);
333+
var myDigest = new ArenaPlayerDigest(avatarState1, arenaAvatarState1);
334+
myDigest.Runes.Add(rune);
335+
var enemyDigest = new ArenaPlayerDigest(avatarState2, arenaAvatarState2);
336+
enemyDigest.Runes.Add(rune);
337+
var arenaSheets = _tableSheets.GetArenaSimulatorSheets();
338+
var log = simulator.Simulate(myDigest, enemyDigest, arenaSheets, modifiers, modifiers, true);
339+
var spawns = log.Events.OfType<ArenaSpawnCharacter>().ToList();
340+
Assert.All(spawns, spawn => Assert.Equal(totalAtk, spawn.Character.ATK));
341+
var ticks = log.Events
342+
.OfType<ArenaTickDamage>()
343+
.ToList();
344+
var challengerTick = ticks.First(r => !r.Character.IsEnemy);
345+
var enemyTick = ticks.First(r => r.Character.IsEnemy);
346+
var challengerInfo = challengerTick.SkillInfos.First();
347+
var enemyInfo = enemyTick.SkillInfos.First();
348+
var dmg = (int)decimal.Round(totalAtk * optionInfo.SkillValue);
349+
Assert.Equal(dmg, challengerInfo.Effect);
350+
Assert.Equal(dmg, enemyInfo.Effect);
351+
}
285352
}
286353
}

.Lib9c.Tests/Model/PlayerTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ public void StatsLayerTest()
727727
{
728728
runeState,
729729
};
730-
player.SetRune(runeStates, _tableSheets.RuneOptionSheet, _tableSheets.SkillSheet);
730+
player.SetRuneStats(runeStates, _tableSheets.RuneOptionSheet);
731731
var runeOptionRow = _tableSheets.RuneOptionSheet.Values.First(r => r.RuneId == runeId);
732732
var runeAtk = runeOptionRow.LevelOptionMap[1].Stats.Sum(r => r.stat.BaseValueAsLong);
733733
Assert.Equal(player.ATK, consumableLayerAtk + runeAtk);
@@ -866,7 +866,7 @@ public void IncreaseHpForArena()
866866
{
867867
runeState,
868868
};
869-
player.SetRune(runeStates, _tableSheets.RuneOptionSheet, _tableSheets.SkillSheet);
869+
player.SetRuneStats(runeStates, _tableSheets.RuneOptionSheet);
870870
var runeOptionRow = _tableSheets.RuneOptionSheet.Values.First(r => r.RuneId == runeId);
871871
var runeHp = runeOptionRow.LevelOptionMap[1].Stats.Sum(r => r.stat.BaseValueAsLong);
872872
Assert.Equal(consumableLayerHp + runeHp, player.HP);

Lib9c/Arena/ArenaSimulatorV4.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,19 +105,15 @@ private static SimplePriorityQueue<ArenaCharacter, decimal> SpawnPlayers(
105105
var challenger = new ArenaCharacter(simulator, challengerDigest, simulatorSheets);
106106
if (challengerDigest.Runes != null)
107107
{
108-
challenger.SetRune(
109-
challengerDigest.Runes,
110-
simulatorSheets.RuneOptionSheet,
111-
simulatorSheets.SkillSheet);
108+
challenger.SetRuneStats(challengerDigest.Runes, simulatorSheets.RuneOptionSheet);
109+
challenger.SetRuneSkills(challengerDigest.Runes, simulatorSheets.RuneOptionSheet, simulatorSheets.SkillSheet);
112110
}
113111

114112
var enemy = new ArenaCharacter(simulator, enemyDigest, simulatorSheets, true);
115113
if (enemyDigest.Runes != null)
116114
{
117-
enemy.SetRune(
118-
enemyDigest.Runes,
119-
simulatorSheets.RuneOptionSheet,
120-
simulatorSheets.SkillSheet);
115+
enemy.SetRuneStats(enemyDigest.Runes, simulatorSheets.RuneOptionSheet);
116+
enemy.SetRuneSkills(enemyDigest.Runes, simulatorSheets.RuneOptionSheet, simulatorSheets.SkillSheet);
121117
}
122118

123119
challenger.Spawn(enemy);

Lib9c/Battle/RaidSimulator.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,15 @@ public RaidSimulator(
3838
CostumeStatSheet costumeStatSheet,
3939
List<StatModifier> collectionModifiers) : base(random, avatarState, foods, simulatorSheets)
4040
{
41-
Player.ConfigureStats(costumeStatSheet, runeStates, simulatorSheets.RuneOptionSheet, simulatorSheets.SkillSheet, collectionModifiers);
41+
var runeOptionSheet = simulatorSheets.RuneOptionSheet;
42+
var skillSheet = simulatorSheets.SkillSheet;
43+
Player.ConfigureStats(costumeStatSheet, runeStates, runeOptionSheet, skillSheet,
44+
collectionModifiers);
45+
if (runeStates is not null)
46+
{
47+
// call SetRuneSkills last. because rune skills affect from total calculated stats
48+
Player.SetRuneSkills(runeStates, runeOptionSheet, skillSheet);
49+
}
4250

4351
BossId = bossId;
4452
_waves = new List<RaidBoss>();

Lib9c/Battle/StageSimulator.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,15 @@ public StageSimulator(IRandom random,
5757
simulatorSheets,
5858
logEvent)
5959
{
60-
Player.ConfigureStats(costumeStatSheet, runeStates, simulatorSheets.RuneOptionSheet, simulatorSheets.SkillSheet, collectionModifiers);
60+
var runeOptionSheet = simulatorSheets.RuneOptionSheet;
61+
var skillSheet = simulatorSheets.SkillSheet;
62+
Player.ConfigureStats(costumeStatSheet, runeStates, runeOptionSheet, skillSheet,
63+
collectionModifiers);
64+
if (runeStates is not null)
65+
{
66+
// call SetRuneSkills last. because rune skills affect from total calculated stats
67+
Player.SetRuneSkills(runeStates, runeOptionSheet, skillSheet);
68+
}
6169

6270
_waves = new List<Wave>();
6371
_waveRewards = waveRewards;

Lib9c/Model/Character/ArenaCharacter.cs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -186,16 +186,21 @@ public ArenaCharacter(
186186
hpModifier);
187187
_skills = GetSkills(digest.Equipments, sheets.SkillSheet);
188188
_attackCountMax = AttackCountHelper.GetCountMax(digest.Level);
189-
if (digest.Runes != null)
189+
190+
var runes = digest.Runes;
191+
var runeOptionSheet = sheets.RuneOptionSheet;
192+
bool runeExist = runes != null;
193+
if (runeExist)
190194
{
191-
SetRune(
192-
digest.Runes,
193-
sheets.RuneOptionSheet,
194-
sheets.SkillSheet);
195+
SetRuneStats(runes, runeOptionSheet);
195196
}
196-
197197
Stats.SetCollections(collectionModifiers);
198198
ResetCurrentHP();
199+
if (runeExist)
200+
{
201+
// call SetRuneSkills last. because rune skills affect from total calculated stats
202+
SetRuneSkills(runes, runeOptionSheet, sheets.SkillSheet);
203+
}
199204
}
200205

201206
private ArenaCharacter(ArenaCharacter value)
@@ -443,10 +448,7 @@ public void SetRuneV2(
443448
}
444449
}
445450

446-
public void SetRune(
447-
List<RuneState> runes,
448-
RuneOptionSheet runeOptionSheet,
449-
SkillSheet skillSheet)
451+
public void SetRuneStats(List<RuneState> runes, RuneOptionSheet runeOptionSheet)
450452
{
451453
foreach (var rune in runes)
452454
{
@@ -465,6 +467,21 @@ public void SetRune(
465467
x.stat.TotalValueAsLong)));
466468
Stats.AddRune(statModifiers);
467469
ResetCurrentHP();
470+
}
471+
}
472+
473+
public void SetRuneSkills(
474+
List<RuneState> runes,
475+
RuneOptionSheet runeOptionSheet,
476+
SkillSheet skillSheet)
477+
{
478+
foreach (var rune in runes)
479+
{
480+
if (!runeOptionSheet.TryGetValue(rune.RuneId, out var optionRow) ||
481+
!optionRow.LevelOptionMap.TryGetValue(rune.Level, out var optionInfo))
482+
{
483+
continue;
484+
}
468485

469486
if (optionInfo.SkillId == default ||
470487
!skillSheet.TryGetValue(optionInfo.SkillId, out var skillRow))

Lib9c/Model/Character/Player.cs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -559,10 +559,12 @@ public void SetCostumeStat(CostumeStatSheet costumeStatSheet)
559559
ResetCurrentHP();
560560
}
561561

562-
public void SetRune(
563-
List<RuneState> runes,
564-
RuneOptionSheet runeOptionSheet,
565-
SkillSheet skillSheet)
562+
/// <summary>
563+
/// Sets the rune stats for a player character.
564+
/// </summary>
565+
/// <param name="runes">The list of rune states for the player character.</param>
566+
/// <param name="runeOptionSheet">The rune option sheet that contains information about rune options.</param>
567+
public void SetRuneStats(List<RuneState> runes, RuneOptionSheet runeOptionSheet)
566568
{
567569
foreach (var rune in runes)
568570
{
@@ -573,6 +575,26 @@ public void SetRune(
573575

574576
Stats.AddRuneStat(optionInfo);
575577
ResetCurrentHP();
578+
}
579+
}
580+
581+
/// <summary>
582+
/// Sets the rune skills for the player.
583+
/// </summary>
584+
/// <param name="runes">The list of rune states.</param>
585+
/// <param name="runeOptionSheet">The rune option sheet.</param>
586+
/// <param name="skillSheet">The skill sheet.</param>
587+
public void SetRuneSkills(
588+
List<RuneState> runes,
589+
RuneOptionSheet runeOptionSheet,
590+
SkillSheet skillSheet)
591+
{
592+
foreach (var rune in runes)
593+
{
594+
if (!runeOptionSheet.TryGetOptionInfo(rune.RuneId, rune.Level, out var optionInfo))
595+
{
596+
continue;
597+
}
576598

577599
if (optionInfo.SkillId == default ||
578600
!skillSheet.TryGetValue(optionInfo.SkillId, out var skillRow))
@@ -615,7 +637,7 @@ public void ConfigureStats(CostumeStatSheet costumeStatSheet, List<RuneState> ru
615637
SetCostumeStat(costumeStatSheet);
616638
if (runeStates != null)
617639
{
618-
SetRune(runeStates, runeOptionSheet, skillSheet);
640+
SetRuneStats(runeStates, runeOptionSheet);
619641
}
620642

621643
SetCollections(collectionModifiers);

0 commit comments

Comments
 (0)