Skip to content

Commit

Permalink
update CalculateReward in WorldBossHelper and apply
Browse files Browse the repository at this point in the history
  • Loading branch information
tyrosine1153 committed Sep 12, 2024
1 parent 646daf7 commit dae3f21
Show file tree
Hide file tree
Showing 12 changed files with 185 additions and 48 deletions.
13 changes: 7 additions & 6 deletions .Lib9c.Tests/Action/AccountStateDeltaExtensionsTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ public void SetWorldBossKillReward(int level, int expectedRune, int expectedCrys
var random = new TestRandom();
var tableSheets = new TableSheets(TableSheetsImporter.ImportSheets());
var runeSheet = tableSheets.RuneSheet;
var materialItemSheet = tableSheets.MaterialItemSheet;
var runeCurrency = RuneHelper.ToCurrency(runeSheet[10001]);
var avatarAddress = new PrivateKey().Address;
var bossState = new WorldBossState(
tableSheets.WorldBossListSheet[1],
tableSheets.WorldBossGlobalHpSheet[1]
Expand All @@ -71,14 +71,14 @@ public void SetWorldBossKillReward(int level, int expectedRune, int expectedCrys
1,{bossId},0,10001,100
");
var killRewardSheet = new WorldBossKillRewardSheet();
killRewardSheet.Set($@"id,boss_id,rank,rune_min,rune_max,crystal
1,{bossId},0,1,1,100
killRewardSheet.Set($@"id,boss_id,rank,rune_min,rune_max,crystal,circle
1,{bossId},0,1,1,100,0
");

if (exc is null)
{
var nextState = states.SetWorldBossKillReward(context, rewardInfoAddress, rewardRecord, 0, bossState, runeWeightSheet, killRewardSheet, runeSheet, random, avatarAddress, _agentAddress);
Assert.Equal(expectedRune * runeCurrency, nextState.GetBalance(avatarAddress, runeCurrency));
var nextState = states.SetWorldBossKillReward(context, rewardInfoAddress, rewardRecord, 0, bossState, runeWeightSheet, killRewardSheet, runeSheet, materialItemSheet, random, _avatarState, _agentAddress);
Assert.Equal(expectedRune * runeCurrency, nextState.GetBalance(_avatarState.address, runeCurrency));
Assert.Equal(expectedCrystal * CrystalCalculator.CRYSTAL, nextState.GetBalance(_agentAddress, CrystalCalculator.CRYSTAL));
var nextRewardInfo = new WorldBossKillRewardRecord((List)nextState.GetLegacyState(rewardInfoAddress));
Assert.All(nextRewardInfo, kv => Assert.True(kv.Value));
Expand All @@ -96,8 +96,9 @@ public void SetWorldBossKillReward(int level, int expectedRune, int expectedCrys
runeWeightSheet,
killRewardSheet,
runeSheet,
materialItemSheet,
random,
avatarAddress,
_avatarState,
_agentAddress)
);
}
Expand Down
17 changes: 13 additions & 4 deletions .Lib9c.Tests/Action/ClaimWorldBossKillRewardTest.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
namespace Lib9c.Tests.Action
{
using System;
using System.Collections.Generic;
using System.Linq;
using Bencodex.Types;
using Libplanet.Action.State;
using Libplanet.Crypto;
using Libplanet.Mocks;
using Libplanet.Types.Assets;
using Nekoyume;
using Nekoyume.Action;
using Nekoyume.Helper;
Expand Down Expand Up @@ -98,16 +97,17 @@ public void Execute(long blockIndex, Type exc)
var nextRewardInfo = new WorldBossKillRewardRecord((List)nextState.GetLegacyState(worldBossKillRewardRecordAddress));
Assert.All(nextRewardInfo, kv => Assert.True(kv.Value));

List<FungibleAssetValue> rewards = WorldBossHelper.CalculateReward(
var rewards = WorldBossHelper.CalculateReward(
0,
worldBossState.Id,
runeWeightSheet,
killRewardSheet,
tableSheets.RuneSheet,
tableSheets.MaterialItemSheet,
new TestRandom(randomSeed)
);

foreach (var reward in rewards)
foreach (var reward in rewards.assets)
{
if (reward.Currency.Equals(CrystalCalculator.CRYSTAL))
{
Expand All @@ -118,6 +118,15 @@ public void Execute(long blockIndex, Type exc)
Assert.Equal(reward, nextState.GetBalance(avatarAddress, reward.Currency));
}
}

var inventory = nextState.GetAvatarState(avatarAddress).inventory;
foreach (var reward in rewards.materials)
{
var itemCount = inventory.TryGetTradableFungibleItems(reward.Key.FungibleId, null, null, out var items)
? items.Sum(item => item.count)
: 0;
Assert.Equal(reward.Value, itemCount);
}
}
else
{
Expand Down
82 changes: 67 additions & 15 deletions .Lib9c.Tests/Action/RaidTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ namespace Lib9c.Tests.Action
using Nekoyume.Helper;
using Nekoyume.Model.Arena;
using Nekoyume.Model.EnumType;
using Nekoyume.Model.Item;
using Nekoyume.Model.Rune;
using Nekoyume.Model.Stat;
using Nekoyume.Model.State;
using Nekoyume.Module;
using Nekoyume.TableData;
using Xunit;
using static SerializeKeys;

public class RaidTest
{
Expand Down Expand Up @@ -270,11 +270,21 @@ int runeId2
simulator.Simulate();
var score = simulator.DamageDealt;

Dictionary<Currency, FungibleAssetValue> rewardMap
= new Dictionary<Currency, FungibleAssetValue>();
var assetRewardMap = new Dictionary<Currency, FungibleAssetValue>();
foreach (var reward in simulator.AssetReward)
{
rewardMap[reward.Currency] = reward;
assetRewardMap[reward.Currency] = reward;
}

var materialRewardMap = new Dictionary<TradableMaterial, int>();
foreach (var reward in simulator.Reward)
{
Assert.True(reward is TradableMaterial);
if (reward is TradableMaterial tradableMaterial)
{
materialRewardMap.TryAdd(tradableMaterial, 0);
materialRewardMap[tradableMaterial]++;
}
}

if (rewardRecordExist)
Expand All @@ -289,22 +299,29 @@ Dictionary<Currency, FungibleAssetValue> rewardMap
_tableSheets.RuneWeightSheet,
_tableSheets.WorldBossKillRewardSheet,
_tableSheets.RuneSheet,
_tableSheets.MaterialItemSheet,
random
);

foreach (var reward in rewards)
foreach (var reward in rewards.assets)
{
if (!rewardMap.ContainsKey(reward.Currency))
if (!assetRewardMap.ContainsKey(reward.Currency))
{
rewardMap[reward.Currency] = reward;
assetRewardMap[reward.Currency] = reward;
}
else
{
rewardMap[reward.Currency] += reward;
assetRewardMap[reward.Currency] += reward;
}
}

foreach (var reward in rewardMap)
foreach (var reward in rewards.materials)
{
materialRewardMap.TryAdd(reward.Key, 0);
materialRewardMap[reward.Key] += reward.Value;
}

foreach (var reward in assetRewardMap)
{
if (reward.Key.Equals(CrystalCalculator.CRYSTAL))
{
Expand All @@ -315,11 +332,20 @@ Dictionary<Currency, FungibleAssetValue> rewardMap
Assert.Equal(reward.Value, nextState.GetBalance(_avatarAddress, reward.Key));
}
}

var inventory = nextState.GetAvatarState(_avatarAddress).inventory;
foreach (var reward in materialRewardMap)
{
var itemCount = inventory.TryGetTradableFungibleItems(reward.Key.FungibleId, null, null, out var items)
? items.Sum(item => item.count)
: 0;
Assert.Equal(reward.Value, itemCount);
}
}

if (rewardMap.ContainsKey(crystal))
if (assetRewardMap.ContainsKey(crystal))
{
Assert.Equal(rewardMap[crystal], nextState.GetBalance(_agentAddress, crystal));
Assert.Equal(assetRewardMap[crystal], nextState.GetBalance(_agentAddress, crystal));
}

if (crystalExist)
Expand Down Expand Up @@ -513,19 +539,30 @@ public void Execute_With_Reward()
);
simulator.Simulate();

Dictionary<Currency, FungibleAssetValue> rewardMap
= new Dictionary<Currency, FungibleAssetValue>();
var rewardMap = new Dictionary<Currency, FungibleAssetValue>();
foreach (var reward in simulator.AssetReward)
{
rewardMap[reward.Currency] = reward;
}

List<FungibleAssetValue> killRewards = WorldBossHelper.CalculateReward(
var materialRewardMap = new Dictionary<TradableMaterial, int>();
foreach (var reward in simulator.Reward)
{
Assert.True(reward is TradableMaterial);
if (reward is TradableMaterial tradableMaterial)
{
materialRewardMap.TryAdd(tradableMaterial, 0);
materialRewardMap[tradableMaterial]++;
}
}

var killRewards = WorldBossHelper.CalculateReward(
0,
bossState.Id,
_tableSheets.RuneWeightSheet,
_tableSheets.WorldBossKillRewardSheet,
_tableSheets.RuneSheet,
_tableSheets.MaterialItemSheet,
random
);

Expand All @@ -541,7 +578,7 @@ Dictionary<Currency, FungibleAssetValue> rewardMap
var nextRaiderState = new RaiderState(rawRaider);
Assert.Equal(simulator.DamageDealt, nextRaiderState.HighScore);

foreach (var reward in killRewards)
foreach (var reward in killRewards.assets)
{
if (!rewardMap.ContainsKey(reward.Currency))
{
Expand All @@ -553,6 +590,12 @@ Dictionary<Currency, FungibleAssetValue> rewardMap
}
}

foreach (var reward in killRewards.materials)
{
materialRewardMap.TryAdd(reward.Key, 0);
materialRewardMap[reward.Key] += reward.Value;
}

foreach (var reward in rewardMap)
{
if (reward.Key.Equals(CrystalCalculator.CRYSTAL))
Expand All @@ -565,6 +608,15 @@ Dictionary<Currency, FungibleAssetValue> rewardMap
}
}

var inventory = nextState.GetAvatarState(_avatarAddress).inventory;
foreach (var reward in materialRewardMap)
{
var itemCount = inventory.TryGetTradableFungibleItems(reward.Key.FungibleId, null, null, out var items)
? items.Sum(item => item.count)
: 0;
Assert.Equal(reward.Value, itemCount);
}

Assert.Equal(1, nextRaiderState.Level);
Assert.Equal(GameConfig.DefaultAvatarArmorId, nextRaiderState.IconId);
Assert.True(nextRaiderState.Cp > 0);
Expand Down
13 changes: 10 additions & 3 deletions .Lib9c.Tests/Action/WorldBossHelperTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ namespace Lib9c.Tests.Action
using System.Linq;
using Libplanet.Types.Assets;
using Nekoyume.Helper;
using Nekoyume.Model.Item;
using Nekoyume.Model.State;
using Nekoyume.TableData;
using Xunit;
Expand Down Expand Up @@ -84,23 +85,29 @@ public void CalculateReward(Type sheetType)
{
var bossId = rewardRow.BossId;
var rank = rewardRow.Rank;
var fungibleAssetValues = WorldBossHelper.CalculateReward(
var rewards = WorldBossHelper.CalculateReward(
rank,
bossId,
_tableSheets.RuneWeightSheet,
sheet,
_tableSheets.RuneSheet,
_tableSheets.MaterialItemSheet,
random
);
var expectedRune = rewardRow.Rune;
var expectedCrystal = rewardRow.Crystal * _crystalCurrency;
var crystal = fungibleAssetValues.First(f => f.Currency.Equals(_crystalCurrency));
var rune = fungibleAssetValues
var expectedCircle = rewardRow.Circle;
var crystal = rewards.assets.First(f => f.Currency.Equals(_crystalCurrency));
var rune = rewards.assets
.Where(f => !f.Currency.Equals(_crystalCurrency))
.Sum(r => (int)r.MajorUnit);
var circle = rewards.materials
.Where(kv => kv.Key.ItemSubType == ItemSubType.Circle)
.Sum(kv => kv.Value);

Assert.Equal(expectedCrystal, crystal);
Assert.Equal(expectedRune, rune);
Assert.Equal(expectedCircle, circle);
}
}
}
Expand Down
19 changes: 15 additions & 4 deletions Lib9c/Action/ClaimRaidReward.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
using Libplanet.Action;
using Libplanet.Action.State;
using Libplanet.Crypto;
using Libplanet.Types.Assets;
using Nekoyume.Extensions;
using Nekoyume.Helper;
using Nekoyume.Model.State;
Expand Down Expand Up @@ -48,6 +47,7 @@ public override IWorld Execute(IActionContext context)
typeof(WorldBossCharacterSheet),
typeof(WorldBossListSheet),
typeof(RuneSheet),
typeof(MaterialItemSheet),
});
var worldBossListSheet = sheets.GetSheet<WorldBossListSheet>();
int raidId;
Expand All @@ -66,20 +66,22 @@ public override IWorld Execute(IActionContext context)
RaiderState raiderState = states.GetRaiderState(raiderAddress);
int rank = WorldBossHelper.CalculateRank(bossRow, raiderState.HighScore);
var random = context.GetRandom();
var avatarState = states.GetAvatarState(AvatarAddress);
if (raiderState.LatestRewardRank < rank)
{
for (int i = raiderState.LatestRewardRank; i < rank; i++)
{
List<FungibleAssetValue> rewards = WorldBossHelper.CalculateReward(
var rewards = WorldBossHelper.CalculateReward(
i + 1,
row.BossId,
sheets.GetSheet<RuneWeightSheet>(),
sheets.GetSheet<WorldBossRankRewardSheet>(),
sheets.GetSheet<RuneSheet>(),
sheets.GetSheet<MaterialItemSheet>(),
random
);

foreach (var reward in rewards)
foreach (var reward in rewards.assets)
{
if (reward.Currency.Equals(CrystalCalculator.CRYSTAL))
{
Expand All @@ -90,11 +92,20 @@ public override IWorld Execute(IActionContext context)
states = states.MintAsset(context, AvatarAddress, reward);
}
}

#pragma warning disable LAA1002
foreach (var reward in rewards.materials)
#pragma warning restore LAA1002
{
avatarState.inventory.AddItem(reward.Key, reward.Value);
}
}

raiderState.LatestRewardRank = rank;
raiderState.ClaimedBlockIndex = context.BlockIndex;
states = states.SetLegacyState(raiderAddress, raiderState.Serialize());
states = states
.SetLegacyState(raiderAddress, raiderState.Serialize())
.SetAvatarState(AvatarAddress, avatarState, false, true, false, false);
var ended = DateTimeOffset.UtcNow;
Log.Debug("{AddressesHex}ClaimRaidReward Total Executed Time: {Elapsed}", addressesHex, ended - started);
return states;
Expand Down
5 changes: 4 additions & 1 deletion Lib9c/Action/ClaimWordBossKillReward.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public override IWorld Execute(IActionContext context)
typeof(RuneWeightSheet),
typeof(WorldBossListSheet),
typeof(WorldBossKillRewardSheet),
typeof(MaterialItemSheet),
});

var worldBossListSheet = sheets.GetSheet<WorldBossListSheet>();
Expand All @@ -57,6 +58,7 @@ public override IWorld Execute(IActionContext context)
Address worldBossAddress = Addresses.GetWorldBossAddress(raidId);
var worldBossState = new WorldBossState((List) states.GetLegacyState(worldBossAddress));
var random = context.GetRandom();
var avatarState = states.GetAvatarState(AvatarAddress);
return states.SetWorldBossKillReward(
context,
worldBossKillRewardRecordAddress,
Expand All @@ -66,8 +68,9 @@ public override IWorld Execute(IActionContext context)
sheets.GetSheet<RuneWeightSheet>(),
sheets.GetSheet<WorldBossKillRewardSheet>(),
sheets.GetSheet<RuneSheet>(),
sheets.GetSheet<MaterialItemSheet>(),
random,
AvatarAddress,
avatarState,
context.Signer
);
}
Expand Down
Loading

0 comments on commit dae3f21

Please sign in to comment.