diff --git a/.Lib9c.Tests/Action/ActionEvaluationTest.cs b/.Lib9c.Tests/Action/ActionEvaluationTest.cs index 3b04609245..540a719a96 100644 --- a/.Lib9c.Tests/Action/ActionEvaluationTest.cs +++ b/.Lib9c.Tests/Action/ActionEvaluationTest.cs @@ -2,6 +2,7 @@ namespace Lib9c.Tests.Action { using System; using System.Collections.Generic; + using System.Numerics; using Bencodex.Types; using Lib9c.Formatters; using Libplanet.Action.State; @@ -93,6 +94,7 @@ public ActionEvaluationTest() [InlineData(typeof(RuneSummon))] [InlineData(typeof(ActivateCollection))] [InlineData(typeof(RetrieveAvatarAssets))] + [InlineData(typeof(MigrateFee))] public void Serialize_With_MessagePack(Type actionType) { var action = GetAction(actionType); @@ -479,6 +481,14 @@ private ActionBase GetAction(Type type) }, }, RetrieveAvatarAssets _ => new RetrieveAvatarAssets(avatarAddress: new PrivateKey().Address), + MigrateFee _ => new MigrateFee + { + TransferData = new List<(Address sender, Address recipient, BigInteger amount)> + { + (new PrivateKey().Address, new PrivateKey().Address, 1), + (new PrivateKey().Address, new PrivateKey().Address, 2), + }, + }, _ => throw new InvalidCastException(), }; } diff --git a/.Lib9c.Tests/Action/MigrateFeeTest.cs b/.Lib9c.Tests/Action/MigrateFeeTest.cs new file mode 100644 index 0000000000..68607b0159 --- /dev/null +++ b/.Lib9c.Tests/Action/MigrateFeeTest.cs @@ -0,0 +1,137 @@ +namespace Lib9c.Tests.Action; + +using System.Collections.Generic; +using System.Globalization; +using System.Numerics; +using Libplanet.Action.State; +using Libplanet.Crypto; +using Libplanet.Mocks; +using Libplanet.Types.Assets; +using Nekoyume.Action; +using Nekoyume.Model.State; +using Nekoyume.Module; +using Xunit; + +public class MigrateFeeTest +{ + private readonly Currency _ncgCurrency; + + public MigrateFeeTest() + { +#pragma warning disable CS0618 + _ncgCurrency = Currency.Legacy("NCG", 2, null); +#pragma warning restore CS0618 + } + + [Fact] + public void Execute() + { + var admin = new Address("8d9f76aF8Dc5A812aCeA15d8bf56E2F790F47fd7"); + var context = new ActionContext(); + var state = new World(MockUtil.MockModernWorldState) + .SetLegacyState(AdminState.Address, new AdminState(admin, 100).Serialize()) + .SetLegacyState(GoldCurrencyState.Address, new GoldCurrencyState(_ncgCurrency).Serialize()); + var recipient = new PrivateKey().Address; + var transferData = new List<(Address sender, Address recipient, BigInteger amount)>(); + var amount = FungibleAssetValue.Parse(_ncgCurrency, 0.1m.ToString(CultureInfo.InvariantCulture)); + for (int i = 1; i < 10; i++) + { + var address = new PrivateKey().Address; + var balance = 0.1m * i; + var fav = FungibleAssetValue.Parse(_ncgCurrency, balance.ToString(CultureInfo.InvariantCulture)); + state = state.MintAsset(context, address, fav); + transferData.Add((address, recipient, amount.RawValue)); + } + + var action = new MigrateFee + { + TransferData = transferData, + Memo = "memo", + }; + + var nextState = action.Execute(new ActionContext + { + BlockIndex = 1L, + PreviousState = state, + RandomSeed = 0, + Signer = admin, + }); + + foreach (var (sender, _, _) in transferData) + { + var prevBalance = state.GetBalance(sender, _ncgCurrency); + Assert.Equal(prevBalance - amount, nextState.GetBalance(sender, _ncgCurrency)); + } + + Assert.Equal(FungibleAssetValue.Parse(_ncgCurrency, "0.9"), nextState.GetBalance(recipient, _ncgCurrency)); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void PlainValue(bool memo) + { + var transferData = new List<(Address sender, Address recipient, BigInteger amount)>(); + // 0.9 + // 1.0 + // 1.1 + for (int i = 9; i < 12; i++) + { + var sender = new PrivateKey().Address; + var recipient = new PrivateKey().Address; + var amount = FungibleAssetValue.Parse(_ncgCurrency, (0.1m * i).ToString(CultureInfo.InvariantCulture)); + transferData.Add((sender, recipient, amount.RawValue)); + } + + var action = new MigrateFee + { + TransferData = transferData, + Memo = memo ? "memo" : null, + }; + + var des = new MigrateFee(); + des.LoadPlainValue(action.PlainValue); + + for (int i = 0; i < action.TransferData.Count; i++) + { + var data = action.TransferData[i]; + Assert.Equal(des.TransferData[i].sender, data.sender); + Assert.Equal(des.TransferData[i].recipient, data.recipient); + Assert.Equal(des.TransferData[i].amount, data.amount); + } + + Assert.Equal(memo, !string.IsNullOrEmpty(des.Memo)); + } + + [Fact] + public void Execute_Throw_InsufficientBalanceException() + { + var admin = new Address("8d9f76aF8Dc5A812aCeA15d8bf56E2F790F47fd7"); + var context = new ActionContext(); + var state = new World(MockUtil.MockModernWorldState) + .SetLegacyState(AdminState.Address, new AdminState(admin, 100).Serialize()) + .SetLegacyState(GoldCurrencyState.Address, new GoldCurrencyState(_ncgCurrency).Serialize()); + var recipient = new PrivateKey().Address; + var transferData = new List<(Address sender, Address recipient, BigInteger amount)>(); + var amount = 1 * _ncgCurrency; + var address = new PrivateKey().Address; + var balance = 0.1m; + var fav = FungibleAssetValue.Parse(_ncgCurrency, balance.ToString(CultureInfo.InvariantCulture)); + state = state.MintAsset(context, address, fav); + transferData.Add((address, recipient, amount.RawValue)); + + var action = new MigrateFee + { + TransferData = transferData, + Memo = "memo", + }; + + Assert.Throws(() => action.Execute(new ActionContext + { + BlockIndex = 1L, + PreviousState = state, + RandomSeed = 0, + Signer = admin, + })); + } +} diff --git a/.Lib9c.Tests/Action/UnlockRuneSlotTest.cs b/.Lib9c.Tests/Action/UnlockRuneSlotTest.cs index 4c22253629..a26c8e5766 100644 --- a/.Lib9c.Tests/Action/UnlockRuneSlotTest.cs +++ b/.Lib9c.Tests/Action/UnlockRuneSlotTest.cs @@ -17,23 +17,19 @@ namespace Lib9c.Tests.Action public class UnlockRuneSlotTest { - private readonly Currency _goldCurrency; - - public UnlockRuneSlotTest() - { - _goldCurrency = Currency.Legacy("NCG", 2, null); - } + private readonly Currency _goldCurrency = Currency.Legacy("NCG", 2, null); + // ReSharper disable once MemberCanBePrivate.Global public IWorld Init(out Address agentAddress, out Address avatarAddress, out long blockIndex) { agentAddress = new PrivateKey().Address; avatarAddress = new PrivateKey().Address; var sheets = TableSheetsImporter.ImportSheets(); var tableSheets = new TableSheets(sheets); - blockIndex = tableSheets.WorldBossListSheet.Values - .OrderBy(x => x.StartedBlockIndex) + blockIndex = tableSheets.ArenaSheet.Values.First().Round + .OrderBy(x => x.StartBlockIndex) .First() - .StartedBlockIndex; + .StartBlockIndex; var goldCurrencyState = new GoldCurrencyState(_goldCurrency); var state = new World(MockUtil.MockModernWorldState) @@ -46,13 +42,6 @@ public IWorld Init(out Address agentAddress, out Address avatarAddress, out long } var gameConfigState = new GameConfigState(sheets[nameof(GameConfigSheet)]); - var avatarState = new AvatarState( - avatarAddress, - agentAddress, - 0, - tableSheets.GetAvatarSheets(), - default - ); return state.SetLegacyState(gameConfigState.address, gameConfigState.Serialize()); } @@ -125,14 +114,6 @@ public void Execute_InsufficientBalanceException() SlotIndex = 1, }; - var ctx = new ActionContext - { - BlockIndex = blockIndex, - PreviousState = state, - RandomSeed = 0, - Signer = agentAddress, - }; - Assert.Throws(() => action.Execute(new ActionContext() { @@ -153,14 +134,6 @@ public void Execute_SlotNotFoundException() SlotIndex = 99, }; - var ctx = new ActionContext - { - BlockIndex = blockIndex, - PreviousState = state, - RandomSeed = 0, - Signer = agentAddress, - }; - Assert.Throws(() => action.Execute(new ActionContext() { @@ -181,14 +154,6 @@ public void Execute_MismatchRuneSlotTypeException() SlotIndex = 0, }; - var ctx = new ActionContext - { - BlockIndex = blockIndex, - PreviousState = state, - RandomSeed = 0, - Signer = agentAddress, - }; - Assert.Throws(() => action.Execute(new ActionContext() { diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 944c89cd3c..110cfa80b4 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -33,7 +33,7 @@ jobs: if: github.event_name != 'pull_request' run: | if [[ "$NUGET_API_KEY" != "" ]]; then - for project in Lib9c Lib9c.Abstractions + for project in Lib9c Lib9c.Abstractions Lib9c.MessagePack Lib9c.Renderers do dotnet nuget push ./$project/.bin/Lib9c.*.nupkg \ --api-key "$NUGET_API_KEY" \ diff --git a/Lib9c.Abstractions/Lib9c.Abstractions.csproj b/Lib9c.Abstractions/Lib9c.Abstractions.csproj index 91682acd01..6fbe6080f9 100644 --- a/Lib9c.Abstractions/Lib9c.Abstractions.csproj +++ b/Lib9c.Abstractions/Lib9c.Abstractions.csproj @@ -6,6 +6,7 @@ true .bin .obj + 1.17.0 diff --git a/Lib9c.MessagePack/Lib9c.MessagePack.csproj b/Lib9c.MessagePack/Lib9c.MessagePack.csproj index d42c980ef3..92878575b6 100644 --- a/Lib9c.MessagePack/Lib9c.MessagePack.csproj +++ b/Lib9c.MessagePack/Lib9c.MessagePack.csproj @@ -8,6 +8,7 @@ AnyCPU .bin .obj + 1.17.0 diff --git a/Lib9c.Policy/Policy/MaxTransactionsBytesPolicy.cs b/Lib9c.Policy/Policy/MaxTransactionsBytesPolicy.cs index d2d47aa51a..1ab28d3f79 100644 --- a/Lib9c.Policy/Policy/MaxTransactionsBytesPolicy.cs +++ b/Lib9c.Policy/Policy/MaxTransactionsBytesPolicy.cs @@ -46,7 +46,12 @@ private MaxTransactionsBytesPolicy( // Issued for v100098. .Add(new SpannedSubPolicy( startIndex: 3_150_001L, - value: 1024L * 500L)); // 500 KiB + value: 1024L * 500L)) // 500 KiB + // Note: Limit increase to patch table with big CSV. + // Issued for v200220 + .Add(new SpannedSubPolicy( + startIndex: 11_637_001L, + value: 1024L * 1024L)); // 1 MiB public static IVariableSubPolicy Heimdall => Default @@ -57,7 +62,12 @@ private MaxTransactionsBytesPolicy( // Note: Heimdall has been started after v100098 .Add(new SpannedSubPolicy( startIndex: 1L, - value: 1024L * 500L)); // 500 KiB + value: 1024L * 500L)) // 500 KiB + // Note: Limit increase to patch table with big CSV. + // Issued for v200220 + .Add(new SpannedSubPolicy( + startIndex: 3_031_001L, + value: 1024L * 1024L)); // 1 MiB // Note: For internal testing. public static IVariableSubPolicy OdinInternal => @@ -79,6 +89,11 @@ private MaxTransactionsBytesPolicy( value: 1024L * 100L)) // 100 KiB .Add(new SpannedSubPolicy( startIndex: 3_150_001L, - value: 1024L * 500L)); // 500 KiB + value: 1024L * 500L)) // 500 KiB + // Note: Limit increase to patch table with big CSV. + // Issued for v200220 + .Add(new SpannedSubPolicy( + startIndex: 11_556_001L, + value: 1024L * 1024L)); // 1 MiB } } diff --git a/Lib9c.Renderers/Lib9c.Renderers.csproj b/Lib9c.Renderers/Lib9c.Renderers.csproj index 305f691a1c..d10bb80129 100644 --- a/Lib9c.Renderers/Lib9c.Renderers.csproj +++ b/Lib9c.Renderers/Lib9c.Renderers.csproj @@ -6,6 +6,7 @@ enable .bin .obj + 1.17.0 Lib9c diff --git a/Lib9c/Action/HackAndSlash.cs b/Lib9c/Action/HackAndSlash.cs index e3d436a617..b5d5a50624 100644 --- a/Lib9c/Action/HackAndSlash.cs +++ b/Lib9c/Action/HackAndSlash.cs @@ -30,6 +30,7 @@ namespace Nekoyume.Action [ActionType("hack_and_slash22")] public class HackAndSlash : GameAction, IHackAndSlashV10 { + private static readonly ActivitySource ActivitySource = new ActivitySource("Lib9c.Action.HackAndSlash"); public const int UsableApStoneCount = 10; public List Costumes; @@ -42,7 +43,6 @@ public class HackAndSlash : GameAction, IHackAndSlashV10 public Address AvatarAddress; public int TotalPlayCount = 1; public int ApStoneCount = 0; - private readonly ActivitySource _activitySource = new ActivitySource("Lib9c.Action.HackAndSlash"); IEnumerable IHackAndSlashV10.Costumes => Costumes; IEnumerable IHackAndSlashV10.Equipments => Equipments; @@ -118,7 +118,7 @@ public IWorld Execute( var addressesHex = $"[{signer.ToHex()}, {AvatarAddress.ToHex()}]"; var started = DateTimeOffset.UtcNow; const string source = "HackAndSlash"; - var activity = _activitySource.StartActivity("HackAndSlash"); + using var activity = ActivitySource.StartActivity("HackAndSlash"); Log.Verbose("{AddressesHex} {Source} from #{BlockIndex} exec started", addressesHex, source, blockIndex); @@ -147,7 +147,7 @@ public IWorld Execute( var sw = new Stopwatch(); sw.Start(); - var avatarStateActivity = _activitySource.StartActivity( + var avatarStateActivity = ActivitySource.StartActivity( "GetAvatarState", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -163,7 +163,7 @@ public IWorld Execute( addressesHex, source, "Get AvatarState", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); - var sheetActivity = _activitySource.StartActivity( + var sheetActivity = ActivitySource.StartActivity( "GetSheets", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -210,7 +210,7 @@ public IWorld Execute( sw.Restart(); - var checkStateActivity = _activitySource.StartActivity( + var checkStateActivity = ActivitySource.StartActivity( "CheckState", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -245,7 +245,7 @@ public IWorld Execute( } sw.Restart(); - var stageSheetActivity = _activitySource.StartActivity( + var stageSheetActivity = ActivitySource.StartActivity( "GetStageSheet", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -260,7 +260,7 @@ public IWorld Execute( addressesHex, source, "Get StageSheet", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); - var validateWorldActivity = _activitySource.StartActivity( + var validateWorldActivity = ActivitySource.StartActivity( "ValidateWorld", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -306,7 +306,7 @@ public IWorld Execute( addressesHex, source, "Validate World", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); - var validateItemsActivity = _activitySource.StartActivity( + var validateItemsActivity = ActivitySource.StartActivity( "ValidateItems", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -328,7 +328,7 @@ public IWorld Execute( addressesHex, source, "Validate Items", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); - var unequipItemsActivity = _activitySource.StartActivity( + var unequipItemsActivity = ActivitySource.StartActivity( "UnequipItems", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -414,7 +414,7 @@ public IWorld Execute( addressesHex, source, "Unequip items", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); - var questSheetActivity = _activitySource.StartActivity( + var questSheetActivity = ActivitySource.StartActivity( "GetQuestSheet", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -433,7 +433,7 @@ public IWorld Execute( if (ids.Any()) { sw.Restart(); - var questListActivity = _activitySource.StartActivity( + var questListActivity = ActivitySource.StartActivity( "UpdateQuestList", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -451,7 +451,7 @@ public IWorld Execute( sw.Restart(); - var skillStateActivity = _activitySource.StartActivity( + var skillStateActivity = ActivitySource.StartActivity( "GetSkillState", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -499,7 +499,7 @@ public IWorld Execute( var crystalStageBuffSheet = sheets.GetSheet(); sw.Restart(); - var slotstateActivity = _activitySource.StartActivity( + var slotstateActivity = ActivitySource.StartActivity( "UpdateSlotState", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -536,7 +536,7 @@ public IWorld Execute( Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", addressesHex, source, "Update slotState", blockIndex, sw.Elapsed.TotalMilliseconds); - var simulatorActivity = _activitySource.StartActivity( + var simulatorActivity = ActivitySource.StartActivity( "Simulator", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -594,7 +594,7 @@ public IWorld Execute( addressesHex, source, "Simulator.Simulate()", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); - var clearStageActivity = _activitySource.StartActivity( + var clearStageActivity = ActivitySource.StartActivity( "ClearStage", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -666,7 +666,7 @@ public IWorld Execute( skillState?.Update(starCount, crystalStageBuffSheet); sw.Restart(); - var updateAvatarActivity = _activitySource.StartActivity( + var updateAvatarActivity = ActivitySource.StartActivity( "UpdateAvatarState", ActivityKind.Internal, activity?.Id ?? string.Empty); @@ -681,7 +681,7 @@ public IWorld Execute( sw.Restart(); - var setStateActivity = _activitySource.StartActivity( + var setStateActivity = ActivitySource.StartActivity( "SetState", ActivityKind.Internal, activity?.Id ?? string.Empty); diff --git a/Lib9c/Action/MigrateFee.cs b/Lib9c/Action/MigrateFee.cs new file mode 100644 index 0000000000..ac4bbb666b --- /dev/null +++ b/Lib9c/Action/MigrateFee.cs @@ -0,0 +1,93 @@ +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using Bencodex.Types; +using Libplanet.Action; +using Libplanet.Action.State; +using Libplanet.Crypto; +using Libplanet.Types.Assets; +using Nekoyume.Model.State; +using Nekoyume.Module; + +namespace Nekoyume.Action +{ + [ActionType(TypeIdentifier)] + public class MigrateFee : ActionBase + { + public const string TypeIdentifier = "migrate_fee"; + public List<(Address sender, Address recipient, BigInteger amount)> TransferData; + public string Memo; + + public MigrateFee() + { + } + + public override IValue PlainValue + { + get + { + var values = Dictionary.Empty + .Add("td", + new List(TransferData.Select(a => + List.Empty + .Add(a.sender.Serialize()) + .Add(a.recipient.Serialize()) + .Add(a.amount.Serialize())) + ) + ); + if (!string.IsNullOrEmpty(Memo)) + { + values = values.Add("m", Memo); + } + return Dictionary.Empty + .Add("type_id", TypeIdentifier) + .Add("values", values); + } + } + + public override void LoadPlainValue(IValue plainValue) + { + var dict = (Dictionary)((Dictionary)plainValue)["values"]; + var asList = (List) dict["td"]; + TransferData = new List<(Address sender, Address recipient, BigInteger amount)>(); + foreach (var v in asList) + { + var innerList = (List) v; + var sender = innerList[0].ToAddress(); + var recipient = innerList[1].ToAddress(); + var amount = innerList[2].ToBigInteger(); + TransferData.Add((sender, recipient, amount)); + } + + if (dict.TryGetValue((Text)"m", out var m)) + { + Memo = (Text) m; + } + } + + public override IWorld Execute(IActionContext context) + { + context.UseGas(1); + + CheckPermission(context); + var states = context.PreviousState; + var goldCurrency = states.GetGoldCurrency(); + foreach (var (sender, recipient, raw) in TransferData) + { + var balance = states.GetBalance(sender, goldCurrency); + var amount = FungibleAssetValue.FromRawValue(goldCurrency, raw); + if (balance >= amount) + { + states = states.TransferAsset(context, sender, recipient, amount); + } + else + { + throw new InsufficientBalanceException( + $"required {amount} but {sender} balance is {balance}", sender, balance); + } + } + + return states; + } + } +} diff --git a/Lib9c/Lib9c.csproj b/Lib9c/Lib9c.csproj index ce4daeca84..7a7aed1f38 100644 --- a/Lib9c/Lib9c.csproj +++ b/Lib9c/Lib9c.csproj @@ -9,7 +9,7 @@ .obj Nekoyume 9 - 1.16.1 + 1.17.0 true Debug;Release AnyCPU diff --git a/Lib9c/TableCSV/Cost/EnhancementCostSheetV3.csv b/Lib9c/TableCSV/Cost/EnhancementCostSheetV3.csv index 13fc76f5ab..f28204f129 100644 --- a/Lib9c/TableCSV/Cost/EnhancementCostSheetV3.csv +++ b/Lib9c/TableCSV/Cost/EnhancementCostSheetV3.csv @@ -934,9 +934,9 @@ id,item_sub_type,grade,level,cost,exp,required_block,base_stat_growth_min,base_s 933,Grimoire,6,19,0,2394755055,1,1200,1300,1200,1300,1500,1600,200,200 934,Grimoire,6,20,0,3593354622,1,1200,1300,1200,1300,1500,1600,200,200 935,Grimoire,6,21,0,5391253972,1,1200,1300,1200,1300,1500,1600,200,200 -600301,EquipmentMaterial,1,0,0,10,0,0,0,0,0,0,0,0,0 -600302,EquipmentMaterial,2,0,0,200,0,0,0,0,0,0,0,0,0 -600303,EquipmentMaterial,3,0,0,4000,0,0,0,0,0,0,0,0,0 -600304,EquipmentMaterial,4,0,0,150000,0,0,0,0,0,0,0,0,0 +600301,EquipmentMaterial,1,0,0,2000,0,0,0,0,0,0,0,0,0 +600302,EquipmentMaterial,2,0,0,40000,0,0,0,0,0,0,0,0,0 +600303,EquipmentMaterial,3,0,0,200000,0,0,0,0,0,0,0,0,0 +600304,EquipmentMaterial,4,0,0,800000,0,0,0,0,0,0,0,0,0 600305,EquipmentMaterial,5,0,0,2000000,0,0,0,0,0,0,0,0,0 -600306,EquipmentMaterial,6,0,0,7500000,0,0,0,0,0,0,0,0,0 +600306,EquipmentMaterial,6,0,0,5000000,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/Lib9c/TableCSV/Event/EventConsumableItemRecipeSheet.csv b/Lib9c/TableCSV/Event/EventConsumableItemRecipeSheet.csv index 15e18af69f..a207bb9753 100644 --- a/Lib9c/TableCSV/Event/EventConsumableItemRecipeSheet.csv +++ b/Lib9c/TableCSV/Event/EventConsumableItemRecipeSheet.csv @@ -7,4 +7,7 @@ id,required_block_index,required_ap,required_gold,material_item_id_1,material_it 10030003,20,0,0,800108,2,800109,1,,,,,900106 10100001,20,0,0,800110,3,,,,,,,900107 10100002,20,0,0,800111,3,,,,,,,900108 -10100003,20,0,0,800110,2,800111,2,,,,,900109 \ No newline at end of file +10100003,20,0,0,800110,2,800111,2,,,,,900109 +10110001,20,0,0,800112,3,,,,,,,900110 +10110002,20,0,0,800113,3,,,,,,,900111 +10110003,20,0,0,800114,3,,,,,,,900112 \ No newline at end of file diff --git a/Lib9c/TableCSV/Event/EventDungeonSheet.csv b/Lib9c/TableCSV/Event/EventDungeonSheet.csv index 7caaedc969..703f57d574 100644 --- a/Lib9c/TableCSV/Event/EventDungeonSheet.csv +++ b/Lib9c/TableCSV/Event/EventDungeonSheet.csv @@ -2,4 +2,5 @@ id,name,stage_begin,stage_end 10010001,Monster Island,10010001,10010020 10030001,World Horizon,10030001,10030020 10090001,Treasure Valley,10090001,10090020 -10100001,Moca Planet,10100001,10100020 \ No newline at end of file +10100001,Moca Planet,10100001,10100020 +10110001,Citrus Carnival,10110001,10110020 \ No newline at end of file diff --git a/Lib9c/TableCSV/Event/EventDungeonStageSheet.csv b/Lib9c/TableCSV/Event/EventDungeonStageSheet.csv index c543bd9983..476085e721 100644 --- a/Lib9c/TableCSV/Event/EventDungeonStageSheet.csv +++ b/Lib9c/TableCSV/Event/EventDungeonStageSheet.csv @@ -78,4 +78,24 @@ id,cost_ap,turn_limit,hp_option,atk_option,def_option,cri_option,hit_option,spd_ 10100017,5,150,426,302,302,0,363,302,EventDungeon_04_02,bgm_christmas,600201,0.09,1,1,800110,0.19,1,1,400000,0.4,100,100,500000,0.11,1,1,800111,0.21,1,1,,,,,,,,,,,,,,,,,,,,,100,100 10100018,5,150,614,438,438,0,526,438,EventDungeon_04_03,bgm_christmas,600201,0.09,1,1,800110,0.19,1,1,400000,0.4,100,100,500000,0.11,1,1,800111,0.21,1,1,,,,,,,,,,,,,,,,,,,,,100,100 10100019,5,150,614,438,438,0,526,438,EventDungeon_04_03,bgm_christmas,600201,0.09,1,1,800110,0.19,1,1,400000,0.4,100,100,500000,0.11,1,1,800111,0.21,1,1,,,,,,,,,,,,,,,,,,,,,100,100 -10100020,5,150,614,438,438,0,526,438,EventDungeon_04_03,bgm_christmas,600201,0.09,1,1,800110,0.19,1,1,400000,0.4,100,100,500000,0.11,1,1,800111,0.21,1,1,,,,,,,,,,,,,,,,,,,,,100,100 \ No newline at end of file +10100020,5,150,614,438,438,0,526,438,EventDungeon_04_03,bgm_christmas,600201,0.09,1,1,800110,0.19,1,1,400000,0.4,100,100,500000,0.11,1,1,800111,0.21,1,1,,,,,,,,,,,,,,,,,,,,,100,100 +10110001,5,150,60,60,60,0,60,60,EventDungeon_01_01,bgm_event_22summer_01,800112,0.08,1,2,800115,0.35,1,1,400000,0.37,60,60,600201,0.2,2,2,,,,,,,,,,,,,,,,,,,,,,,,,60,60 +10110002,5,150,60,60,60,0,60,60,EventDungeon_01_01,bgm_event_22summer_01,800112,0.08,1,2,800115,0.35,1,1,400000,0.37,60,60,600201,0.2,2,2,,,,,,,,,,,,,,,,,,,,,,,,,60,60 +10110003,5,150,77,77,77,0,77,77,EventDungeon_01_01,bgm_event_22summer_01,800112,0.08,1,2,800115,0.35,1,1,400000,0.37,60,60,600201,0.2,2,2,,,,,,,,,,,,,,,,,,,,,,,,,60,60 +10110004,5,150,77,77,77,0,77,77,EventDungeon_01_01,bgm_event_22summer_01,800112,0.08,1,2,800115,0.35,1,1,400000,0.37,60,60,600201,0.2,2,2,,,,,,,,,,,,,,,,,,,,,,,,,60,60 +10110005,5,150,153,153,153,0,153,153,EventDungeon_01_01,bgm_event_22summer_01,800112,0.08,1,2,800115,0.35,1,1,400000,0.37,60,60,600201,0.2,2,2,,,,,,,,,,,,,,,,,,,,,,,,,60,60 +10110006,5,150,153,153,153,0,153,153,EventDungeon_01_01,bgm_event_22summer_01,800113,0.08,1,2,800115,0.35,1,1,400000,0.37,60,60,600201,0.2,3,3,,,,,,,,,,,,,,,,,,,,,,,,,60,60 +10110007,5,150,153,153,153,0,153,153,EventDungeon_01_01,bgm_event_22summer_01,800113,0.08,1,2,800115,0.35,1,1,400000,0.37,60,60,600201,0.2,3,3,,,,,,,,,,,,,,,,,,,,,,,,,60,60 +10110008,5,150,153,153,153,0,153,153,EventDungeon_01_02,bgm_event_22summer_02,800113,0.08,1,2,800115,0.35,1,1,400000,0.37,60,60,600201,0.2,3,3,,,,,,,,,,,,,,,,,,,,,,,,,60,60 +10110009,5,150,279,198,198,0,198,198,EventDungeon_01_02,bgm_event_22summer_02,800113,0.08,1,2,800115,0.35,1,1,400000,0.37,60,60,600201,0.2,3,3,,,,,,,,,,,,,,,,,,,,,,,,,60,60 +10110010,5,150,279,198,198,0,198,198,EventDungeon_01_02,bgm_event_22summer_02,800113,0.08,1,2,800115,0.35,1,1,400000,0.37,60,60,600201,0.2,3,3,,,,,,,,,,,,,,,,,,,,,,,,,60,60 +10110011,5,150,279,198,198,0,198,198,EventDungeon_01_02,bgm_event_22summer_02,800113,0.08,1,2,800115,0.35,1,1,400000,0.37,80,80,600201,0.2,4,4,,,,,,,,,,,,,,,,,,,,,,,,,80,80 +10110012,5,150,250,173,173,0,173,173,EventDungeon_01_02,bgm_event_22summer_02,800113,0.08,1,2,800115,0.35,1,1,400000,0.37,80,80,600201,0.2,4,4,,,,,,,,,,,,,,,,,,,,,,,,,80,80 +10110013,5,150,250,173,173,0,173,173,EventDungeon_01_02,bgm_event_22summer_02,800114,0.08,1,2,800115,0.35,1,1,400000,0.37,80,80,600201,0.2,4,4,,,,,,,,,,,,,,,,,,,,,,,,,80,80 +10110014,5,150,250,173,173,0,173,173,EventDungeon_01_02,bgm_event_22summer_02,800114,0.08,1,2,800115,0.35,1,1,400000,0.37,80,80,600201,0.2,4,4,,,,,,,,,,,,,,,,,,,,,,,,,80,80 +10110015,5,150,250,173,173,0,173,173,EventDungeon_01_03,bgm_event_22summer_03,800114,0.08,1,2,800115,0.35,1,1,400000,0.37,100,100,600201,0.2,4,4,,,,,,,,,,,,,,,,,,,,,,,,,100,100 +10110016,5,150,426,302,302,0,363,302,EventDungeon_01_03,bgm_event_22summer_03,800114,0.08,1,2,800115,0.35,1,1,400000,0.37,100,100,600201,0.2,5,5,,,,,,,,,,,,,,,,,,,,,,,,,100,100 +10110017,5,150,426,302,302,0,363,302,EventDungeon_01_03,bgm_event_22summer_03,800114,0.08,1,2,800115,0.35,1,1,400000,0.37,100,100,600201,0.2,5,5,,,,,,,,,,,,,,,,,,,,,,,,,100,100 +10110018,5,150,614,438,438,0,526,438,EventDungeon_01_03,bgm_event_22summer_03,800114,0.08,1,2,800115,0.35,1,1,400000,0.37,100,100,600201,0.2,5,5,,,,,,,,,,,,,,,,,,,,,,,,,100,100 +10110019,5,150,614,438,438,0,526,438,EventDungeon_01_03,bgm_event_22summer_03,800114,0.08,1,2,800115,0.35,1,1,400000,0.37,100,100,600201,0.2,5,5,,,,,,,,,,,,,,,,,,,,,,,,,100,100 +10110020,5,150,614,438,438,0,526,438,EventDungeon_01_03,bgm_event_22summer_03,800114,0.08,1,2,800115,0.35,1,1,400000,0.37,100,100,600201,0.2,5,5,,,,,,,,,,,,,,,,,,,,,,,,,100,100 \ No newline at end of file diff --git a/Lib9c/TableCSV/Event/EventDungeonStageWaveSheet.csv b/Lib9c/TableCSV/Event/EventDungeonStageWaveSheet.csv index 90effcb54f..cf37242631 100644 --- a/Lib9c/TableCSV/Event/EventDungeonStageWaveSheet.csv +++ b/Lib9c/TableCSV/Event/EventDungeonStageWaveSheet.csv @@ -238,4 +238,64 @@ event_dungeon_stage_id,wave,monster1_id,monster1_level,monster1_count,monster2_i 10100019,3,201002,200,4,,,,,,,,,,0 10100020,1,201004,200,2,,,,,,,,,,0 10100020,2,201004,200,3,,,,,,,,,,0 -10100020,3,201005,200,2,,,,,,,,,,1 \ No newline at end of file +10100020,3,201005,200,2,,,,,,,,,,1 +10110001,1,201000,20,1,,,,,,,,,,0 +10110001,2,201000,20,2,,,,,,,,,,0 +10110001,3,201000,20,3,,,,,,,,,,0 +10110002,1,201001,20,1,,,,,,,,,,0 +10110002,2,201001,20,2,,,,,,,,,,0 +10110002,3,201008,20,1,,,,,,,,,,0 +10110003,1,201001,50,1,,,,,,,,,,0 +10110003,2,201001,50,2,,,,,,,,,,0 +10110003,3,201001,50,3,,,,,,,,,,0 +10110004,1,201002,50,1,,,,,,,,,,0 +10110004,2,201002,50,2,,,,,,,,,,0 +10110004,3,201008,50,1,,,,,,,,,,0 +10110005,1,201000,100,1,,,,,,,,,,0 +10110005,2,201000,100,2,,,,,,,,,,0 +10110005,3,201000,100,3,,,,,,,,,,0 +10110006,1,201001,100,1,,,,,,,,,,0 +10110006,2,201001,100,2,,,,,,,,,,0 +10110006,3,201007,100,1,,,,,,,,,,1 +10110007,1,201002,100,1,,,,,,,,,,0 +10110007,2,201002,100,2,,,,,,,,,,0 +10110007,3,201002,100,3,,,,,,,,,,0 +10110008,1,201004,100,1,,,,,,,,,,0 +10110008,2,201004,100,2,,,,,,,,,,0 +10110008,3,201008,100,1,,,,,,,,,,0 +10110009,1,201001,120,2,,,,,,,,,,0 +10110009,2,201001,120,3,,,,,,,,,,0 +10110009,3,201001,120,4,,,,,,,,,,0 +10110010,1,201002,120,2,,,,,,,,,,0 +10110010,2,201002,120,3,,,,,,,,,,0 +10110010,3,201002,120,4,,,,,,,,,,0 +10110011,1,201004,120,2,,,,,,,,,,0 +10110011,2,201004,120,3,,,,,,,,,,0 +10110011,3,201003,120,2,,,,,,,,,,0 +10110012,1,201000,150,2,,,,,,,,,,0 +10110012,2,201000,150,3,,,,,,,,,,0 +10110012,3,201000,150,4,,,,,,,,,,0 +10110013,1,201001,150,2,,,,,,,,,,0 +10110013,2,201001,150,3,,,,,,,,,,0 +10110013,3,201006,150,2,,,,,,,,,,1 +10110014,1,201002,150,2,,,,,,,,,,0 +10110014,2,201002,150,3,,,,,,,,,,0 +10110014,3,201002,150,4,,,,,,,,,,0 +10110015,1,201004,150,2,,,,,,,,,,0 +10110015,2,201004,150,3,,,,,,,,,,0 +10110015,3,201003,150,3,,,,,,,,,,0 +10110016,1,201002,170,2,,,,,,,,,,0 +10110016,2,201002,170,3,,,,,,,,,,0 +10110016,3,201002,170,4,,,,,,,,,,0 +10110017,1,201004,170,2,,,,,,,,,,0 +10110017,2,201004,170,3,,,,,,,,,,0 +10110017,3,201003,170,2,,,,,,,,,,0 +10110018,1,201001,200,2,,,,,,,,,,0 +10110018,2,201001,200,3,,,,,,,,,,0 +10110018,3,201001,200,4,,,,,,,,,,0 +10110019,1,201002,200,2,,,,,,,,,,0 +10110019,2,201002,200,3,,,,,,,,,,0 +10110019,3,201002,200,4,,,,,,,,,,0 +10110020,1,201004,200,2,,,,,,,,,,0 +10110020,2,201004,200,3,,,,,,,,,,0 +10110020,3,201005,200,2,,,,,,,,,,1 \ No newline at end of file diff --git a/Lib9c/TableCSV/Event/EventScheduleSheet.csv b/Lib9c/TableCSV/Event/EventScheduleSheet.csv index f64ef98a00..9fee31ed27 100644 --- a/Lib9c/TableCSV/Event/EventScheduleSheet.csv +++ b/Lib9c/TableCSV/Event/EventScheduleSheet.csv @@ -5,4 +5,5 @@ _dungeon_ticket_additional_price: used on lib9c = column value / 10 (e.g.,1 -> 0 1002,grand finale,5549201,0,0,0,0,0,0,5599600 1003,World Horizon,5687001,5888600,5,7200,5,2,2,5939000 1009,Treasure Valley,8723200,8950000,5,10800,10,5,10,0 -1010,Moca Planet,9564560,9892997,5,10800,10,5,10,9968597 \ No newline at end of file +1010,Moca Planet,9564560,9892997,5,10800,10,5,10,9968597 +1011,Citrus Carnival,11329982,11684582,5,10800,10,5,10,11760182 \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/ConsumableItemSheet.csv b/Lib9c/TableCSV/Item/ConsumableItemSheet.csv index 9274e3bc6b..6f20e96983 100644 --- a/Lib9c/TableCSV/Item/ConsumableItemSheet.csv +++ b/Lib9c/TableCSV/Item/ConsumableItemSheet.csv @@ -52,4 +52,7 @@ id,_name,item_sub_type,grade,elemental_type,stat_type_1,stat_value_1,stat_type_2 900106,Legendary_9C_New_Year_Cookie,Food,5,Normal,HP,4354,ATK,242 900107,모카 번,Food,3,Normal,HP,2384,ATK,415 900108,무지개 솜사탕,Food,4,Normal,HP,4508,ATK,787 -900109,모카두카 버블티,Food,5,Normal,HP,7941,ATK,1581 \ No newline at end of file +900109,모카두카 버블티,Food,5,Normal,HP,7941,ATK,1581 +900110,오렌지 젤리,Food,3,Normal,HP,4545,DEF,909 +900111,오렌지 주스,Food,4,Normal,HP,11244,DEF,2248 +900112,오렌지 젤라또,Food,5,Normal,HP,27571,DEF,5514 \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/CostumeItemSheet.csv b/Lib9c/TableCSV/Item/CostumeItemSheet.csv index 61de4a65d1..c96aae0b4c 100644 --- a/Lib9c/TableCSV/Item/CostumeItemSheet.csv +++ b/Lib9c/TableCSV/Item/CostumeItemSheet.csv @@ -17,6 +17,7 @@ _spine_resource_path,`Title`: ``,,,, 40100009,흑마법사 이블리,FullCostume,5,Normal, 40100010,도끼 여전사 퓨리오사,FullCostume,5,Normal, 40100011,마도사 라미아 Lamia,FullCostume,5,Normal, +40100012,Nad the Illuminator,FullCostume,5,Normal, 40100013,BSC 코스튬 (갈색 발키리),FullCostume,3,Normal, 40100014,BSC 코스튬 (흰색 발키리),FullCostume,3,Normal, 40100015,천상의 고양이 (사전예약보상),FullCostume,3,Normal, @@ -35,6 +36,7 @@ _spine_resource_path,`Title`: ``,,,, 40100028,Cat of Darkness,FullCostume,3,Normal, 40100029,Lion of Darkness,FullCostume,4,Normal, 40100030,Valhalla's Sigrun,FullCostume,5,Normal, +40100036,Guardian of the Forest Lundis,FullCostume,4,Normal, 40200001,갈색 머리카락,HairCostume,1,Normal, 40200002,파란색 머리카락,HairCostume,1,Normal, 40200003,초록색 머리카락,HairCostume,1,Normal, @@ -107,6 +109,6 @@ _spine_resource_path,`Title`: ``,,,, 49900017,Rune Master,Title,5,Normal, 49900018,Ruby Guardian,Title,5,Normal, 49900019,Hot Summer,Title,5,Normal, -49900020,Great Adventurer 9,Title,5,Normal, +49900020,Bounty Hunter,Title,5,Normal, 49900021,Great Adventurer 10,Title,5,Normal, 49900022,YGG Event,Title,5,Normal, \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/CostumeStatSheet.csv b/Lib9c/TableCSV/Item/CostumeStatSheet.csv index 3dbb130d57..751493ffb8 100644 --- a/Lib9c/TableCSV/Item/CostumeStatSheet.csv +++ b/Lib9c/TableCSV/Item/CostumeStatSheet.csv @@ -68,8 +68,8 @@ id,costume_id,stat_type,stat 67,49900018,SPD,20872 68,49900019,SPD,34993 69,49900019,ATK,5869 -70,49900020,HP,54632 -71,49900020,ATK,2333 +70,49900020,ATK,15653 +71,49900020,HP,53634 72,49900021,HP,57115 73,49900021,ATK,2439 74,40100022,HP,40000 @@ -79,4 +79,8 @@ id,costume_id,stat_type,stat 78,40100030,HP,100000 79,40100030,SPD,25000 80,49900022,ATK,3333 -81,49900022,DEF,6666 \ No newline at end of file +81,49900022,DEF,6666 +82,40100012,SPD,45192 +83,40100012,HP,84731 +84,40100036,HP,107268 +85,40100036,DEF,4730 \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/ItemRequirementSheet.csv b/Lib9c/TableCSV/Item/ItemRequirementSheet.csv index 87bb763339..97e028142b 100644 --- a/Lib9c/TableCSV/Item/ItemRequirementSheet.csv +++ b/Lib9c/TableCSV/Item/ItemRequirementSheet.csv @@ -194,6 +194,7 @@ item_id,level,mimislevel 40100009,1,1 40100010,1,1 40100011,1,1 +40100012,1,1 40100013,1,1 40100014,1,1 40100015,31,31 @@ -212,6 +213,7 @@ item_id,level,mimislevel 40100028,1,1 40100029,1,1 40100030,1,1 +40100036,1,1 40200001,1,1 40200002,1,1 40200003,1,1 @@ -387,4 +389,7 @@ item_id,level,mimislevel 10760005,1,1 10760006,1,1 10760007,1,1 -10760008,1,1 \ No newline at end of file +10760008,1,1 +900110,1,1 +900111,1,1 +900112,1,1 \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/MaterialItemSheet.csv b/Lib9c/TableCSV/Item/MaterialItemSheet.csv index f689797929..8480333196 100644 --- a/Lib9c/TableCSV/Item/MaterialItemSheet.csv +++ b/Lib9c/TableCSV/Item/MaterialItemSheet.csv @@ -45,6 +45,10 @@ id,_name,item_sub_type,grade,elemental_type 800109,Fluffy_Marshmallow,FoodMaterial,4,Normal 800110,모카 펄,FoodMaterial,3,Normal 800111,무지개 시럽,FoodMaterial,4,Normal +800112,그린 오렌지,FoodMaterial,2,Normal +800113,레드 오렌지,FoodMaterial,3,Normal +800114,맛있는 오렌지,FoodMaterial,4,Normal +800115,오렌지 메달,NormalMaterial,5,Normal 800201,Silver Dust,FoodMaterial,4,Normal 800202,Golden Meat,FoodMaterial,4,Normal 303000,녹슨 칼,EquipmentMaterial,1,Normal @@ -195,12 +199,14 @@ id,_name,item_sub_type,grade,elemental_type 600201,Golden Dust,EquipmentMaterial,4,Normal 600202,Ruby Dust,EquipmentMaterial,4,Normal 600203,Emerald Dust,EquipmentMaterial,4,Normal -600301,망치 커먼,EquipmentMaterial,1,Normal +600301,망치 노멀,EquipmentMaterial,1,Normal 600302,망치 레어,EquipmentMaterial,2,Normal 600303,망치 에픽,EquipmentMaterial,3,Normal 600304,망치 유니크,EquipmentMaterial,4,Normal 600305,망치 레전더리,EquipmentMaterial,5,Normal 600306,망치 신성,EquipmentMaterial,6,Normal +600401,도면,EquipmentMaterial,6,Normal +600402,제도 도구,EquipmentMaterial,6,Normal 700000,아레나 시즌0 메달,NormalMaterial,5,Normal 700001,아레나 시즌1 메달,NormalMaterial,5,Normal 700002,아레나 시즌2 메달,NormalMaterial,5,Normal