Skip to content

Commit

Permalink
Merge pull request #2408 from planetarium/improve/issue-2400
Browse files Browse the repository at this point in the history
Calculate collection cp in arena list
  • Loading branch information
ipdae authored Feb 16, 2024
2 parents c741f8a + 2984959 commit 1c2ab19
Show file tree
Hide file tree
Showing 13 changed files with 359 additions and 103 deletions.
2 changes: 1 addition & 1 deletion Lib9c
Submodule Lib9c updated 57 files
+28 −0 .Lib9c.Tests/Action/ActionEvaluationTest.cs
+141 −0 .Lib9c.Tests/Action/ActivateCollectionTest.cs
+3 −1 .Lib9c.Tests/Action/Scenario/AuraScenarioTest.cs
+280 −0 .Lib9c.Tests/Action/Scenario/CollectionScenarioTest.cs
+83 −0 .Lib9c.Tests/Battle/CPHelperTest.cs
+158 −5 .Lib9c.Tests/Model/ArenaSimulatorTest.cs
+3 −1 .Lib9c.Tests/Model/BattleLogTest.cs
+110 −0 .Lib9c.Tests/Model/Collection/FungibleCollectionMaterialTest.cs
+94 −0 .Lib9c.Tests/Model/Collection/NonFungibleCollectionMaterialTest.cs
+93 −0 .Lib9c.Tests/Model/Item/InventoryTest.cs
+260 −11 .Lib9c.Tests/Model/PlayerTest.cs
+89 −2 .Lib9c.Tests/Model/RaidSimulatorV3Test.cs
+3 −3 .Lib9c.Tests/Model/RankingSimulatorTest.cs
+3 −3 .Lib9c.Tests/Model/RankingSimulatorV1Test.cs
+60 −0 .Lib9c.Tests/Model/Skill/BuffFactoryTest.cs
+1 −0 .Lib9c.Tests/Model/Skill/NormalAttackTest.cs
+115 −4 .Lib9c.Tests/Model/StageSimulatorTest.cs
+2 −2 .Lib9c.Tests/Model/StageSimulatorV1Test.cs
+33 −0 .Lib9c.Tests/Model/State/CollectionStateTest.cs
+72 −0 .Lib9c.Tests/Module/CollectionModuleTest.cs
+106 −0 .Lib9c.Tests/TableData/CollectionSheetTest.cs
+2 −0 .Lib9c.Tests/TableSheets.cs
+45 −60 Lib9c.Policy/Policy/BlockPolicySource.cs
+14 −3 Lib9c.Policy/Policy/MaxTransactionsBytesPolicy.cs
+7 −1 Lib9c.Policy/Policy/MaxTransactionsPerBlockPolicy.cs
+10 −15 Lib9c.Policy/Policy/MaxTransactionsPerSignerPerBlockPolicy.cs
+3 −1 Lib9c.Policy/Policy/MinTransactionsPerBlockPolicy.cs
+6 −6 Lib9c.Policy/Policy/NCBlockPolicy.cs
+114 −0 Lib9c/Action/ActivateCollection.cs
+44 −10 Lib9c/Action/BattleArena.cs
+31 −12 Lib9c/Action/EventDungeonBattle.cs
+39 −26 Lib9c/Action/HackAndSlash.cs
+36 −19 Lib9c/Action/HackAndSlashSweep.cs
+26 −6 Lib9c/Action/Raid.cs
+1 −0 Lib9c/Addresses.cs
+17 −2 Lib9c/Arena/ArenaSimulator.cs
+28 −7 Lib9c/Battle/CPHelper.cs
+13 −2 Lib9c/Battle/RaidSimulator.cs
+11 −1 Lib9c/Battle/StageSimulator.cs
+1 −1 Lib9c/Lib9c.csproj
+1 −1 Lib9c/Model/Buff/BuffFactory.cs
+6 −6 Lib9c/Model/Character/ArenaCharacter.cs
+9 −7 Lib9c/Model/Character/CharacterBase.cs
+4 −21 Lib9c/Model/Character/Player.cs
+18 −0 Lib9c/Model/Collection/CollectionFactory.cs
+69 −0 Lib9c/Model/Collection/FungibleCollectionMaterial.cs
+12 −0 Lib9c/Model/Collection/ICollectionMaterial.cs
+8 −0 Lib9c/Model/Collection/MaterialType.cs
+74 −0 Lib9c/Model/Collection/NonFungibleCollectionMaterial.cs
+110 −0 Lib9c/Model/Item/Inventory.cs
+144 −49 Lib9c/Model/Stat/CharacterStats.cs
+33 −0 Lib9c/Model/State/CollectionState.cs
+116 −0 Lib9c/Module/CollectionModule.cs
+2 −0 Lib9c/Planet.cs
+357 −0 Lib9c/TableCSV/CollectionSheet.csv
+112 −0 Lib9c/TableData/CollectionSheet.cs
+7 −0 Lib9c/TableData/Rune/RuneOptionSheet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public void Inspect(StoreType storeType)
IStore store = storeType.CreateStore(_storePath);
IStateStore stateStore = new TrieStateStore(new RocksDBKeyValueStore(Path.Combine(_storePath, "states")));
IStagePolicy stagePolicy = new VolatileStagePolicy();
IBlockPolicy blockPolicy = new BlockPolicySource().GetTestPolicy();
IBlockPolicy blockPolicy = new BlockPolicySource().GetPolicy();
ActionEvaluator actionEvaluator = new ActionEvaluator(
_ => blockPolicy.BlockAction,
stateStore,
Expand Down Expand Up @@ -151,7 +151,7 @@ public void Truncate(StoreType storeType)
IStore store = storeType.CreateStore(_storePath);
IStateStore stateStore = new TrieStateStore(new RocksDBKeyValueStore(Path.Combine(_storePath, "states")));
IStagePolicy stagePolicy = new VolatileStagePolicy();
IBlockPolicy blockPolicy = new BlockPolicySource().GetTestPolicy();
IBlockPolicy blockPolicy = new BlockPolicySource().GetPolicy();
ActionEvaluator actionEvaluator = new ActionEvaluator(
_ => blockPolicy.BlockAction,
stateStore,
Expand Down
8 changes: 5 additions & 3 deletions NineChronicles.Headless.Executable/Configuration.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.IO;
using Libplanet.Headless;
using Nekoyume;
using NineChronicles.Headless.Properties;

namespace NineChronicles.Headless.Executable
Expand Down Expand Up @@ -38,8 +39,9 @@ public class Configuration
public string? MinerPrivateKeyString { get; set; }
public int MinerBlockIntervalMilliseconds { get; set; }

public Planet Planet { get; set; } = Planet.Odin;

// Networking
public NetworkType NetworkType { get; set; } = NetworkType.Main;
public string[]? IceServerStrings { get; set; }
public string[]? PeerStrings { get; set; }

Expand Down Expand Up @@ -107,7 +109,7 @@ public void Overwrite(
int? minerCount,
string? minerPrivateKeyString,
int? minerBlockIntervalMilliseconds,
NetworkType? networkType,
Planet? planet,
string[]? iceServerStrings,
string[]? peerStrings,
bool? rpcServer,
Expand Down Expand Up @@ -158,7 +160,7 @@ public void Overwrite(
MinerCount = minerCount ?? MinerCount;
MinerPrivateKeyString = minerPrivateKeyString ?? MinerPrivateKeyString;
MinerBlockIntervalMilliseconds = minerBlockIntervalMilliseconds ?? MinerBlockIntervalMilliseconds;
NetworkType = networkType ?? NetworkType;
Planet = planet ?? Planet;
IceServerStrings = iceServerStrings ?? IceServerStrings;
PeerStrings = peerStrings ?? PeerStrings;
RpcServer = rpcServer ?? RpcServer;
Expand Down
16 changes: 12 additions & 4 deletions NineChronicles.Headless.Executable/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
using Nekoyume.Action.Loader;
using OpenTelemetry;
using OpenTelemetry.Metrics;
using Nekoyume;

namespace NineChronicles.Headless.Executable
{
Expand Down Expand Up @@ -160,8 +161,10 @@ public async Task Run(
bool? strictRendering = null,
[Option(Description = "Log action renders besides block renders. --rpc-server implies this.")]
bool? logActionRenders = null,
[Option("network-type", Description = "Network type.")]
NetworkType? networkType = null,
[Option("network-type", Description = "(deprecated) Network type.")]
string? networkType = null,
[Option("planet", Description = "Planet")]
Planet? planet = null,
[Option(Description =
"The lifetime of each transaction, which uses minute as its unit.")]
int? txLifeTime = null,
Expand Down Expand Up @@ -250,6 +253,11 @@ public async Task Run(
var headlessConfig = new Configuration();
configuration.Bind("Headless", headlessConfig);

if (networkType is { })
{
Log.Warning("'--network-type' option has been deprecated and has no effect. please use `--planet` instead.");
}

IActionEvaluatorConfiguration? GetActionEvaluatorConfiguration(IConfiguration configuration)
{
if (!(configuration.GetValue<ActionEvaluatorType>("Type") is { } actionEvaluatorType))
Expand Down Expand Up @@ -287,7 +295,7 @@ public async Task Run(
headlessConfig.Overwrite(
appProtocolVersionToken, trustedAppProtocolVersionSigners, genesisBlockPath, host, port,
swarmPrivateKeyString, storeType, storePath, noReduceStore, noMiner, minerCount,
minerPrivateKeyString, minerBlockIntervalMilliseconds, networkType, iceServerStrings, peerStrings, rpcServer, rpcListenHost,
minerPrivateKeyString, minerBlockIntervalMilliseconds, planet, iceServerStrings, peerStrings, rpcServer, rpcListenHost,
rpcListenPort, rpcRemoteServer, rpcHttpServer, graphQLServer, graphQLHost, graphQLPort,
graphQLSecretTokenPath, noCors, nonblockRenderer, nonblockRendererQueue, strictRendering,
logActionRenders, confirmations,
Expand Down Expand Up @@ -445,7 +453,7 @@ IActionLoader MakeSingleActionLoader()
{
MinerPrivateKey = minerPrivateKey,
Libplanet = properties,
NetworkType = headlessConfig.NetworkType,
Planet = headlessConfig.Planet,
StrictRender = headlessConfig.StrictRendering,
TxLifeTime = TimeSpan.FromMinutes(headlessConfig.TxLifeTime),
MinerCount = headlessConfig.MinerCount,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,6 @@
"NoCors": true,
"Confirmations": 0,
"ChainTipStaleBehaviorType": "reboot",
"NetworkType": "Internal"
"Planet": "OdinInternal"
}
}
202 changes: 202 additions & 0 deletions NineChronicles.Headless.Tests/ArenaParticipantsWorkerTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Lib9c.Tests;
using Libplanet.Action.State;
using Libplanet.Crypto;
using Nekoyume;
using Nekoyume.Action;
using Nekoyume.Model.Arena;
using Nekoyume.Model.EnumType;
using Nekoyume.Model.Item;
using Nekoyume.Model.State;
using Nekoyume.Module;
using Nekoyume.TableData;
using NineChronicles.Headless.Tests.Common;
using Xunit;
using Random = Libplanet.Extensions.ActionEvaluatorCommonComponents.Random;

namespace NineChronicles.Headless.Tests;

public class ArenaParticipantsWorkerTest
{
private readonly IWorld _world;
private readonly Dictionary<string, string> _sheets;

public ArenaParticipantsWorkerTest()
{
_world = new MockWorld(new MockWorldState());
_sheets = TableSheetsImporter.ImportSheets();
}

[Fact]
public void GetRoundData()
{
var sheetAddress = Addresses.GetSheetAddress<ArenaSheet>();
var csv = _sheets[nameof(ArenaSheet)];
var arenaSheet = new ArenaSheet();
arenaSheet.Set(csv);
var row = arenaSheet.OrderedList.First();
var expectedRound = row.Round.First();
var blockIndex = expectedRound.StartBlockIndex;
var state = _world.SetLegacyState(sheetAddress, csv.Serialize());
var current = ArenaParticipantsWorker.GetRoundData(state, blockIndex);
Assert.Equal(expectedRound.Round, current.Round);
Assert.Equal(expectedRound.ChampionshipId, current.ChampionshipId);
}

[Fact]
public void GetArenaParticipantsState()
{
var sheetAddress = Addresses.GetSheetAddress<ArenaSheet>();
var csv = _sheets[nameof(ArenaSheet)];
var arenaSheet = new ArenaSheet();
arenaSheet.Set(csv);
var row = arenaSheet.OrderedList.First();
var currentRoundData = row.Round.First();
var state = _world.SetLegacyState(sheetAddress, csv.Serialize());
Assert.Null(ArenaParticipantsWorker.GetArenaParticipantsState(state, currentRoundData));

var participantsAddr = ArenaParticipants.DeriveAddress(
currentRoundData.ChampionshipId,
currentRoundData.Round);
var expected = new ArenaParticipants(currentRoundData.ChampionshipId, currentRoundData.Round);
var avatarAddress = new PrivateKey().Address;
expected.AvatarAddresses.Add(avatarAddress);
state = state.SetLegacyState(participantsAddr, expected.Serialize());
var actual = ArenaParticipantsWorker.GetArenaParticipantsState(state, currentRoundData);
Assert.NotNull(actual);
Assert.Equal(expected.Serialize(), actual.Serialize());
}

[Fact]
public void AvatarAddrAndScoresWithRank()
{
var sheetAddress = Addresses.GetSheetAddress<ArenaSheet>();
var csv = _sheets[nameof(ArenaSheet)];
var arenaSheet = new ArenaSheet();
arenaSheet.Set(csv);
var row = arenaSheet.OrderedList.First();
var currentRoundData = row.Round.First();
var championshipId = currentRoundData.ChampionshipId;
var round = currentRoundData.Round;
var participantsAddr = ArenaParticipants.DeriveAddress(championshipId, round);
var participants = new ArenaParticipants(championshipId, round);
var avatarAddress = new PrivateKey().Address;
var avatar2Address = new PrivateKey().Address;
participants.AvatarAddresses.Add(avatarAddress);
participants.AvatarAddresses.Add(avatar2Address);
var arenaScore = new ArenaScore(avatarAddress, championshipId, round);
arenaScore.AddScore(10);
var state = _world
.SetLegacyState(sheetAddress, csv.Serialize())
.SetLegacyState(participantsAddr, participants.Serialize())
.SetLegacyState(arenaScore.Address, arenaScore.Serialize());
var actual = ArenaParticipantsWorker.AvatarAddrAndScoresWithRank(participants.AvatarAddresses, currentRoundData, state);
Assert.Equal(2, actual.Count);
var first = actual.First();
Assert.Equal(avatarAddress, first.avatarAddr);
Assert.Equal(1010, first.score);
Assert.Equal(1, first.rank);
var second = actual.Last();
Assert.Equal(avatar2Address, second.avatarAddr);
Assert.Equal(1000, second.score);
Assert.Equal(2, second.rank);
}

[Fact]
public void GetArenaParticipants()
{
var tableSheets = new TableSheets(_sheets);
var agentAddress = new PrivateKey().Address;
var avatarAddress = Addresses.GetAvatarAddress(agentAddress, 0);
var avatarState = new AvatarState(
avatarAddress,
agentAddress,
0,
tableSheets.GetAvatarSheets(),
new GameConfigState(),
new Address(),
"avatar_state"
);
var avatar2Address = Addresses.GetAvatarAddress(agentAddress, 1);
var avatarState2 = new AvatarState(
avatar2Address,
agentAddress,
0,
tableSheets.GetAvatarSheets(),
new GameConfigState(),
new Address(),
"avatar_state2"
);

// equipment
var equipmentSheet = tableSheets.EquipmentItemSheet;
var random = new Random(0);
var equipment = (Equipment)ItemFactory.CreateItem(equipmentSheet.Values.First(r => r.ItemSubType == ItemSubType.Armor), random);
equipment.equipped = true;
avatarState.inventory.AddItem(equipment);
avatarState2.inventory.AddItem(equipment);
var itemSlotState = new ItemSlotState(BattleType.Arena);
var itemSlotAddress = ItemSlotState.DeriveAddress(avatarAddress, BattleType.Arena);
itemSlotState.UpdateEquipment(new List<Guid>
{
equipment.ItemId,
});

// rune
var runeListSheet = tableSheets.RuneListSheet;
var runeId = runeListSheet.Values.First().Id;
var runeSlotState = new RuneSlotState(BattleType.Arena);
var runeSlotAddress = RuneSlotState.DeriveAddress(avatarAddress, BattleType.Arena);
var runeSlotInfo = new RuneSlotInfo(0, runeId);
runeSlotState.UpdateSlot(new List<RuneSlotInfo>
{
runeSlotInfo,
}, runeListSheet);
var runeState = new RuneState(runeId);

// collection
var collectionSheet = tableSheets.CollectionSheet;
var collectionState = new CollectionState();
collectionState.Ids.Add(collectionSheet.Values.First().Id);
var arenaSheet = tableSheets.ArenaSheet;
var row = arenaSheet.OrderedList.First();
var currentRoundData = row.Round.First();
var championshipId = currentRoundData.ChampionshipId;
var round = currentRoundData.Round;
var participantsAddr = ArenaParticipants.DeriveAddress(championshipId, round);
var participants = new ArenaParticipants(championshipId, round);
participants.AvatarAddresses.Add(avatarAddress);
participants.AvatarAddresses.Add(avatar2Address);
var arenaScore = new ArenaScore(avatarAddress, championshipId, round);
arenaScore.AddScore(10);
var state = _world
.SetAvatarState(avatarAddress, avatarState, true, true, true, true)
.SetAvatarState(avatar2Address, avatarState2, true, true, true, true)
.SetLegacyState(itemSlotAddress, itemSlotState.Serialize())
.SetLegacyState(RuneState.DeriveAddress(avatarAddress, runeId), runeState.Serialize())
.SetLegacyState(runeSlotAddress, runeSlotState.Serialize())
.SetCollectionState(avatarAddress, collectionState)
.SetLegacyState(participantsAddr, participants.Serialize())
.SetLegacyState(arenaScore.Address, arenaScore.Serialize());
foreach (var (key, s) in _sheets)
{
state = state.SetLegacyState(Addresses.GetSheetAddress(key), s.Serialize());
}
var avatarAddrAndScoresWithRank = ArenaParticipantsWorker.AvatarAddrAndScoresWithRank(participants.AvatarAddresses, currentRoundData, state);
var actual = ArenaParticipantsWorker.GetArenaParticipants(state, participants.AvatarAddresses, avatarAddrAndScoresWithRank);
Assert.Equal(2, actual.Count);
var first = actual.First();
Assert.Equal(avatarAddress, first.AvatarAddr);
Assert.Equal(1010, first.Score);
Assert.Equal(1, first.Rank);
Assert.Equal(equipment.Id, first.PortraitId);
var second = actual.Last();
Assert.Equal(avatar2Address, second.AvatarAddr);
Assert.Equal(1000, second.Score);
Assert.Equal(2, second.Rank);
Assert.Equal(GameConfig.DefaultAvatarArmorId, second.PortraitId);
Assert.True(first.Cp > second.Cp);
}
}
6 changes: 4 additions & 2 deletions NineChronicles.Headless.Tests/Common/ServiceBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
using System.IO;
using Libplanet.Blockchain.Policies;
using NineChronicles.Headless.Properties;
using Nekoyume.Blockchain.Policy;
using Nekoyume;

namespace NineChronicles.Headless.Tests.Common
{
Expand All @@ -17,7 +19,7 @@ public static class ServiceBuilder
public const int MaximumTransactions = 100;

public static IBlockPolicy BlockPolicy =>
NineChroniclesNodeService.GetTestBlockPolicy();
new BlockPolicySource().GetPolicy();

public static NineChroniclesNodeService CreateNineChroniclesNodeService(
Block genesis,
Expand Down Expand Up @@ -52,7 +54,7 @@ public static NineChroniclesNodeService CreateNineChroniclesNodeService(
privateKey,
properties,
BlockPolicy,
NetworkType.Test,
Planet.Odin,
StaticActionLoaderSingleton.Instance);
}
}
Expand Down
Loading

0 comments on commit 1c2ab19

Please sign in to comment.