Skip to content

Commit

Permalink
Merge pull request #2823 from planetarium/feat/set-more-data-in-arena…
Browse files Browse the repository at this point in the history
…-state

feat: introduce `ArenaParticipant` and apply to `JoinArena` first
  • Loading branch information
boscohyun authored Sep 12, 2024
2 parents 34bb410 + 99fc188 commit 4e12a6a
Show file tree
Hide file tree
Showing 19 changed files with 1,418 additions and 282 deletions.
62 changes: 44 additions & 18 deletions .Lib9c.Tests/Action/BattleArenaTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -954,7 +954,8 @@ public void Execute_ValidateDuplicateTicketPurchaseException()

if (roundData.ArenaType != ArenaType.OffSeason)
{
throw new InvalidSeasonException($"[{nameof(BattleArena)}] This test is only for OffSeason. ArenaType : {roundData.ArenaType}");
throw new InvalidSeasonException(
$"[{nameof(BattleArena)}] This test is only for OffSeason. ArenaType : {roundData.ArenaType}");
}

var random = new TestRandom();
Expand Down Expand Up @@ -1193,35 +1194,35 @@ private void Execute(
BlockIndex = blockIndex,
});

if (!nextStates.TryGetArenaScore(myScoreAdr, out var myAfterScore))
if (!nextStates.TryGetArenaScore(myScoreAdr, out var myScoreNext))
{
throw new ArenaScoreNotFoundException($"myScoreAdr : {myScoreAdr}");
}

if (!nextStates.TryGetArenaScore(enemyScoreAdr, out var enemyAfterScore))
if (!nextStates.TryGetArenaScore(enemyScoreAdr, out var enemyScoreNext))
{
throw new ArenaScoreNotFoundException($"enemyScoreAdr : {enemyScoreAdr}");
}

if (!nextStates.TryGetArenaInformation(arenaInfoAdr, out var afterInfo))
if (!nextStates.TryGetArenaInformation(arenaInfoAdr, out var myAfterInfoNext))
{
throw new ArenaInformationNotFoundException($"arenaInfoAdr : {arenaInfoAdr}");
}

var (myWinScore, myDefeatScore, enemyDefeatScore) =
ArenaHelper.GetScores(beforeMyScore.Score, beforeEnemyScore.Score);

var addMyScore = afterInfo.Win * myWinScore + afterInfo.Lose * myDefeatScore;
var addEnemyScore = afterInfo.Win * enemyDefeatScore;
var addMyScore = myAfterInfoNext.Win * myWinScore + myAfterInfoNext.Lose * myDefeatScore;
var addEnemyScore = myAfterInfoNext.Win * enemyDefeatScore;
var expectedMyScore = Math.Max(
beforeMyScore.Score + addMyScore,
ArenaScore.ArenaScoreDefault);
var expectedEnemyScore = Math.Max(
beforeEnemyScore.Score + addEnemyScore,
ArenaScore.ArenaScoreDefault);

Assert.Equal(expectedMyScore, myAfterScore.Score);
Assert.Equal(expectedEnemyScore, enemyAfterScore.Score);
Assert.Equal(expectedMyScore, myScoreNext.Score);
Assert.Equal(expectedEnemyScore, enemyScoreNext.Score);
Assert.Equal(
isPurchased
? 0
Expand All @@ -1231,28 +1232,28 @@ private void Execute(
Assert.Equal(0, beforeInfo.Lose);

var useTicket = Math.Min(ticket, beforeInfo.Ticket);
Assert.Equal(beforeInfo.Ticket - useTicket, afterInfo.Ticket);
Assert.Equal(ticket, afterInfo.Win + afterInfo.Lose);
Assert.Equal(beforeInfo.Ticket - useTicket, myAfterInfoNext.Ticket);
Assert.Equal(ticket, myAfterInfoNext.Win + myAfterInfoNext.Lose);

var balance = nextStates.GetBalance(
myAgentAddress,
nextStates.GetGoldCurrency());
if (isPurchased)
{
Assert.Equal(ticket, afterInfo.PurchasedTicketCount);
Assert.Equal(ticket, myAfterInfoNext.PurchasedTicketCount);
}

Assert.Equal(0, balance.RawValue);

var avatarState = nextStates.GetAvatarState(myAvatarAddress);
var myAvatarStateNext = nextStates.GetAvatarState(myAvatarAddress);
var medalCount = 0;
if (roundData.ArenaType != ArenaType.OffSeason)
{
var medalId = ArenaHelper.GetMedalItemId(championshipId, round);
avatarState.inventory.TryGetItem(medalId, out var medal);
if (afterInfo.Win > 0)
myAvatarStateNext.inventory.TryGetItem(medalId, out var medal);
if (myAfterInfoNext.Win > 0)
{
Assert.Equal(afterInfo.Win, medal.count);
Assert.Equal(myAfterInfoNext.Win, medal.count);
}
else
{
Expand All @@ -1262,9 +1263,33 @@ private void Execute(
medalCount = medal?.count ?? 0;
}

var materialCount = avatarState.inventory.Materials.Count();
var materialCount = myAvatarStateNext.inventory.Materials.Count();
var high = (ArenaHelper.GetRewardCount(beforeMyScore.Score) * ticket) + medalCount;
Assert.InRange(materialCount, 0, high);

var myArenaAvatarStateAddr = ArenaAvatarState.DeriveAddress(myAvatarAddress);
Assert.True(nextStates.TryGetArenaAvatarState(myArenaAvatarStateAddr, out var myArenaAvatarStateNext));

// check my ArenaParticipant
var arenaParticipantNext = nextStates.GetArenaParticipant(championshipId, round, myAvatarAddress);
Assert.NotNull(arenaParticipantNext);
Assert.Equal(myAvatarAddress, arenaParticipantNext.AvatarAddr);
Assert.Equal(myAvatarStateNext.name, arenaParticipantNext.Name);
Assert.Equal(myAvatarStateNext.GetPortraitId(), arenaParticipantNext.PortraitId);
Assert.Equal(myAvatarStateNext.level, arenaParticipantNext.Level);
// Assert.Equal(cp, arenaParticipantNext.Cp);
Assert.Equal(myScoreNext.Score, arenaParticipantNext.Score);
Assert.Equal(myAfterInfoNext.Ticket, arenaParticipantNext.Ticket);
Assert.Equal(myAfterInfoNext.TicketResetCount, arenaParticipantNext.TicketResetCount);
Assert.Equal(myAfterInfoNext.PurchasedTicketCount, arenaParticipantNext.PurchasedTicketCount);
Assert.Equal(myAfterInfoNext.Win, arenaParticipantNext.Win);
Assert.Equal(myAfterInfoNext.Lose, arenaParticipantNext.Lose);
Assert.Equal(myArenaAvatarStateNext.LastBattleBlockIndex, arenaParticipantNext.LastBattleBlockIndex);

// check enemy's ArenaParticipant
var enemyArenaParticipantNext = nextStates.GetArenaParticipant(championshipId, round, enemyAvatarAddress);
Assert.NotNull(enemyArenaParticipantNext);
Assert.Equal(enemyScoreNext.Score, enemyArenaParticipantNext.Score);
}

private IWorld JoinArena(
Expand All @@ -1280,13 +1305,14 @@ private IWorld JoinArena(
var preCurrency = 1000 * _crystal;
states = states.MintAsset(context, signer, preCurrency);

var action = new JoinArena1
var action = new JoinArena
{
avatarAddress = avatarAddress,
championshipId = championshipId,
round = round,
costumes = new List<Guid>(),
equipments = new List<Guid>(),
avatarAddress = avatarAddress,
runeInfos = new List<RuneSlotInfo>(),
};

states = action.Execute(new ActionContext
Expand Down
3 changes: 3 additions & 0 deletions .Lib9c.Tests/Action/ExceptionTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ namespace Lib9c.Tests.Action
using Nekoyume.Action;
using Nekoyume.Action.Exceptions;
using Nekoyume.Action.Exceptions.AdventureBoss;
using Nekoyume.Action.Exceptions.Arena;
using Nekoyume.Exceptions;
using Nekoyume.Model.State;
using Nekoyume.TableData;
Expand Down Expand Up @@ -84,6 +85,8 @@ public ExceptionTest()
[InlineData(typeof(PreviousBountyException))]
[InlineData(typeof(SeasonInProgressException))]
[InlineData(typeof(EmptyRewardException))]
[InlineData(typeof(UnsupportedStateException))]
[InlineData(typeof(AlreadyJoinedArenaException))]
public void Exception_Serializable(Type excType)
{
if (Activator.CreateInstance(excType, "for testing") is Exception exc)
Expand Down
4 changes: 2 additions & 2 deletions .Lib9c.Tests/Action/Garages/BulkUnloadFromGaragesTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ public BulkUnloadFromGaragesTest()
agentAddr: AgentAddress,
avatarIndex: AvatarIndex);
_tableSheets = initializeStates.tableSheets;
_previousStates = initializeStates.initialStatesWithAvatarState;
_ncg = initializeStates.initialStatesWithAvatarState.GetGoldCurrency();
_previousStates = initializeStates.world;
_ncg = initializeStates.world.GetGoldCurrency();
}

public static IEnumerable<object[]> Get_Sample_PlainValue()
Expand Down
Loading

0 comments on commit 4e12a6a

Please sign in to comment.