From 074a8e2daf514c1d850e2607f9ae460e8a59b92b Mon Sep 17 00:00:00 2001 From: Syu Date: Fri, 2 Feb 2024 00:09:32 +0900 Subject: [PATCH 01/78] Update World 8 draft --- Lib9c/TableCSV/Character/CharacterSheet.csv | 10 +- .../Crystal/CrystalEquipmentGrindingSheet.csv | 65 +++--- .../Crystal/CrystalHammerPointSheet.csv | 27 ++- .../Crystal/CrystalMaterialCostSheet.csv | 17 +- .../Crystal/CrystalStageBuffGachaSheet.csv | 52 ++++- .../Item/ConsumableItemRecipeSheet.csv | 9 +- Lib9c/TableCSV/Item/ConsumableItemSheet.csv | 7 + .../Item/EquipmentItemOptionSheet.csv | 202 +++++++++++++++++- .../Item/EquipmentItemRecipeSheet.csv | 27 ++- Lib9c/TableCSV/Item/EquipmentItemSheet.csv | 17 +- .../Item/EquipmentItemSubRecipeSheetV2.csv | 52 ++++- Lib9c/TableCSV/Item/ItemRequirementSheet.csv | 51 +++-- Lib9c/TableCSV/Item/MaterialItemSheet.csv | 29 ++- Lib9c/TableCSV/Quest/WorldQuestSheet.csv | 52 ++++- Lib9c/TableCSV/Skill/EnemySkillSheet.csv | 10 +- Lib9c/TableCSV/Skill/SkillBuffSheet.csv | 4 +- Lib9c/TableCSV/Skill/SkillSheet.csv | 6 +- Lib9c/TableCSV/Skill/StatBuffSheet.csv | 4 +- Lib9c/TableCSV/SweepRequiredCPSheet.csv | 52 ++++- Lib9c/TableCSV/WorldAndStage/StageSheet.csv | 50 +++++ .../TableCSV/WorldAndStage/StageWaveSheet.csv | 150 +++++++++++++ Lib9c/TableCSV/WorldAndStage/WorldSheet.csv | 3 +- .../WorldAndStage/WorldUnlockSheet.csv | 3 +- 23 files changed, 841 insertions(+), 58 deletions(-) diff --git a/Lib9c/TableCSV/Character/CharacterSheet.csv b/Lib9c/TableCSV/Character/CharacterSheet.csv index ae7c31afb5..eeb00b3936 100644 --- a/Lib9c/TableCSV/Character/CharacterSheet.csv +++ b/Lib9c/TableCSV/Character/CharacterSheet.csv @@ -73,4 +73,12 @@ id,_name,size_type,elemental_type,hp,atk,def,cri,hit,spd,lv_hp,lv_atk,lv_def,lv_ 208004,얼음 석상,L,2,4500,75,40,4,90,6,180,3,1.6,0,3.6,0.24,1.65,0.4 208005,라이딩 전사,L,2,3500,55,25,4,90,14,140,2.2,1,0,3.6,0.56,1.8,0.6 208006,영혼 지배자,L,2,3000,63,30,4,90,16,120,2.52,1.2,0,3.6,0.64,2.4,0.3 -208007,요르문간드,XL,2,15000,130,50,6,90,10,600,5.2,2,0,3.6,0.4,4,0.3 \ No newline at end of file +208007,요르문간드,XL,2,15000,130,50,6,90,10,600,5.2,2,0,3.6,0.4,4,0.3 +209000,강글라티,XS,1,210,35,20,4,90,25,8.4,1.4,0.8,0,3.6,1,0.8,1.5 +209001,강글로트,S,1,500,35,40,4,90,5,20,1.4,1.6,0,3.6,0.2,0.86,0.8 +209002,헬헤스트,M,1,360,47,30,4,90,10,14.4,1.88,1.2,0,3.6,0.4,2.4,1 +209003,흐림,L,1,1800,50,10,4,90,10,72,2,0.4,0,3.6,0.4,2.1,0.8 +209004,모드구드,L,1,4500,75,40,4,90,6,180,3,1.6,0,3.6,0.24,1.65,0.4 +209005,흐림그림니르,L,1,3500,55,25,4,90,14,140,2.2,1,0,3.6,0.56,1.8,0.6 +209006,가름,L,1,3000,63,30,4,90,16,120,2.52,1.2,0,3.6,0.64,2.4,0.3 +209007,헤라,XL,1,15000,130,50,6,90,10,600,5.2,2,0,3.6,0.4,4,0.3 \ No newline at end of file diff --git a/Lib9c/TableCSV/Crystal/CrystalEquipmentGrindingSheet.csv b/Lib9c/TableCSV/Crystal/CrystalEquipmentGrindingSheet.csv index d5ff0ca2e3..4a361f169f 100644 --- a/Lib9c/TableCSV/Crystal/CrystalEquipmentGrindingSheet.csv +++ b/Lib9c/TableCSV/Crystal/CrystalEquipmentGrindingSheet.csv @@ -35,11 +35,11 @@ id,enchant_base_id,gain_crystal 10142001,10140001,332820 10143001,10140001,332820 10144001,10140001,337380 -10150001,10150001,1123800 -10151001,10150001,1164660 -10152001,10150001,1175220 -10153001,10150001,1194960 -10154001,10150001,1204140 +10150001,10151001,1 +10151001,10151001,1 +10152001,10151001,1 +10153001,10151001,1 +10154001,10151001,1 10155000,10155000,1200600 10200000,10200000,10 10210000,10210000,10 @@ -72,11 +72,11 @@ id,enchant_base_id,gain_crystal 10242001,10240001,286620 10243001,10240001,286620 10244001,10240001,289800 -10250000,10250000,807840 -10251000,10250000,831600 -10252000,10250000,841320 -10253000,10250000,850500 -10254000,10250000,888300 +10250000,10251000,1 +10251000,10251000,1 +10252000,10251000,1 +10253000,10251000,1 +10254000,10251000,1 10250001,10251001,2000000 10251001,10251001,1000000 10252001,10251001,1000000 @@ -177,19 +177,34 @@ id,enchant_base_id,gain_crystal 10610000,10610000,1000 10620000,10620000,3000 10630000,10630000,50000 -10620001,10620001,1000000 -10630001,10630001,2000000 -10640001,10640001,10000000 -10650001,10650001,20000000 -10650002,10650002,20000000 +10620001,10620000,500000 +10630001,10630000,1000000 +10640001,10640001,5000000 +10650001,10650001,10000000 +10650002,10650002,10000000 10130002,10130002,1000 -10620002,10620002,1000000 -10630002,10630002,2000000 -10640002,10640002,10000000 -10650003,10650003,20000000 -10650004,10650004,20000000 -10620003,10620003,1000000 -10630003,10630003,2000000 -10640003,10640003,10000000 -10650005,10650005,20000000 -10650006,10650006,20000000 \ No newline at end of file +10620002,10620000,500000 +10630002,10630000,1000000 +10640002,10640002,5000000 +10650003,10650003,10000000 +10650004,10650004,10000000 +10620003,10620000,500000 +10630003,10630000,1000000 +10640003,10640003,5000000 +10650005,10650005,10000000 +10650006,10650006,10000000 +10350002,10351002,1 +10351002,10351002,1 +10352002,10351002,1 +10353002,10351002,1 +10354002,10351002,1 +10450002,10451002,1 +10451002,10451002,1 +10452002,10451002,1 +10453002,10451002,1 +10454002,10451002,1 +10550001,10551001,1 +10551001,10551001,1 +10552001,10551001,1 +10553001,10551001,1 +10554001,10551001,1 \ No newline at end of file diff --git a/Lib9c/TableCSV/Crystal/CrystalHammerPointSheet.csv b/Lib9c/TableCSV/Crystal/CrystalHammerPointSheet.csv index 8ead4368a6..c9721075ed 100644 --- a/Lib9c/TableCSV/Crystal/CrystalHammerPointSheet.csv +++ b/Lib9c/TableCSV/Crystal/CrystalHammerPointSheet.csv @@ -168,4 +168,29 @@ recipe_ID,max_hammer_count,crystal_cost 167,32,2000000 168,32,2000000 169,32,2000000 -170,32,2000000 \ No newline at end of file +170,32,2000000 +189,1,1 +190,1,1 +191,1,1 +192,1,1 +193,1,1 +194,1,1 +195,1,1 +196,1,1 +197,1,1 +198,1,1 +199,1,1 +200,1,1 +201,1,1 +202,1,1 +203,1,1 +204,1,1 +205,1,1 +206,1,1 +207,1,1 +208,1,1 +209,1,1 +210,1,1 +211,1,1 +212,1,1 +213,1,1 \ No newline at end of file diff --git a/Lib9c/TableCSV/Crystal/CrystalMaterialCostSheet.csv b/Lib9c/TableCSV/Crystal/CrystalMaterialCostSheet.csv index 4bbb793986..21ad336070 100644 --- a/Lib9c/TableCSV/Crystal/CrystalMaterialCostSheet.csv +++ b/Lib9c/TableCSV/Crystal/CrystalMaterialCostSheet.csv @@ -102,4 +102,19 @@ item_id,crystal 306081,45000 306082,45000 306083,45000 -306084,45000 \ No newline at end of file +306084,45000 +306085,1 +306086,1 +306087,1 +306088,1 +306089,1 +306090,1 +306091,1 +306092,1 +306093,1 +306094,1 +306095,1 +306096,1 +306097,1 +306098,1 +306099,1 \ No newline at end of file diff --git a/Lib9c/TableCSV/Crystal/CrystalStageBuffGachaSheet.csv b/Lib9c/TableCSV/Crystal/CrystalStageBuffGachaSheet.csv index 2b11ca7c50..63df33fd48 100644 --- a/Lib9c/TableCSV/Crystal/CrystalStageBuffGachaSheet.csv +++ b/Lib9c/TableCSV/Crystal/CrystalStageBuffGachaSheet.csv @@ -348,4 +348,54 @@ stage_id,max_star,crystal_cost_normal,crystal_cost_advanced 347,400,602045,1204090 348,400,605520,1211040 349,400,609005,1218010 -350,400,612500,1225000 \ No newline at end of file +350,400,612500,1225000 +351,1,1,1 +352,1,1,1 +353,1,1,1 +354,1,1,1 +355,1,1,1 +356,1,1,1 +357,1,1,1 +358,1,1,1 +359,1,1,1 +360,1,1,1 +361,1,1,1 +362,1,1,1 +363,1,1,1 +364,1,1,1 +365,1,1,1 +366,1,1,1 +367,1,1,1 +368,1,1,1 +369,1,1,1 +370,1,1,1 +371,1,1,1 +372,1,1,1 +373,1,1,1 +374,1,1,1 +375,1,1,1 +376,1,1,1 +377,1,1,1 +378,1,1,1 +379,1,1,1 +380,1,1,1 +381,1,1,1 +382,1,1,1 +383,1,1,1 +384,1,1,1 +385,1,1,1 +386,1,1,1 +387,1,1,1 +388,1,1,1 +389,1,1,1 +390,1,1,1 +391,1,1,1 +392,1,1,1 +393,1,1,1 +394,1,1,1 +395,1,1,1 +396,1,1,1 +397,1,1,1 +398,1,1,1 +399,1,1,1 +400,1,1,1 \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/ConsumableItemRecipeSheet.csv b/Lib9c/TableCSV/Item/ConsumableItemRecipeSheet.csv index fda7a2cff7..35e8cf3029 100644 --- a/Lib9c/TableCSV/Item/ConsumableItemRecipeSheet.csv +++ b/Lib9c/TableCSV/Item/ConsumableItemRecipeSheet.csv @@ -32,4 +32,11 @@ id,required_block_index,required_ap,required_gold,material_item_id_1,material_it 100030,20,0,0,302023,4,302024,3,302026,4,302027,2,201030 100031,20,0,0,302023,2,302025,1,,,,,201031 100032,20,0,0,302023,3,302025,2,302026,2,,,201032 -100033,20,0,0,302023,4,302025,3,302026,4,302027,2,201033 \ No newline at end of file +100033,20,0,0,302023,4,302025,3,302026,4,302027,2,201033 +100034,20,0,0,800202,5,,,,,,,201034 +100035,20,0,0,302028,2,302029,1,,,,,201035 +100036,20,0,0,302028,3,302029,2,302031,2,,,201036 +100037,20,0,0,302028,4,302029,3,302031,4,302032,2,201037 +100038,20,0,0,302028,2,302030,1,,,,,201038 +100039,20,0,0,302028,3,302030,2,302031,2,,,201039 +100040,20,0,0,302028,4,302030,3,302031,4,302032,2,201040 \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/ConsumableItemSheet.csv b/Lib9c/TableCSV/Item/ConsumableItemSheet.csv index 3f04c48c43..d6ce8071be 100644 --- a/Lib9c/TableCSV/Item/ConsumableItemSheet.csv +++ b/Lib9c/TableCSV/Item/ConsumableItemSheet.csv @@ -37,6 +37,13 @@ id,_name,item_sub_type,grade,elemental_type,stat_type_1,stat_value_1,stat_type_2 201031,얼음 잎사귀 샐러드,Food,3,Normal,DEF,386,, 201032,얼음 잎사귀 샐러드,Food,4,Normal,DEF,522,, 201033,얼음 잎사귀 샐러드,Food,5,Normal,DEF,954,, +201034,황금 스테이크,Food,5,Normal,DEF,999,, +201035,붉은 와인,Food,3,Normal,ATK,1,, +201036,붉은 와인,Food,4,Normal,ATK,1,, +201037,붉은 와인,Food,5,Normal,ATK,1,, +201038,홍색 만두,Food,3,Normal,SPD,1,, +201039,홍색 만두,Food,4,Normal,SPD,1,, +201040,홍색 만두,Food,5,Normal,SPD,1,, 900101,몬스터펀치,Food,3,Normal,HP,834,ATK,46 900102,시원한 몬스터펀치,Food,4,Normal,HP,1799,ATK,98 900103,위대한 몬스터펀치,Food,5,Normal,HP,3629,ATK,202 diff --git a/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv b/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv index 2af253154e..d475574332 100644 --- a/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv +++ b/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv @@ -1869,4 +1869,204 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1065000513,,,,110008,0,0,30,30,25000,25000,ATK 1065000611,ATK,5125,5125,,,,,,,, 1065000612,DEF,3216,3216,,,,,,,, -1065000613,,,,110008,0,0,30,30,25000,25000,ATK \ No newline at end of file +1065000613,,,,110008,0,0,30,30,25000,25000,ATK +1015000111,ATK,1,1,,,,,,,, +1015000112,HIT,1,1,,,,,,,, +1015000113,ATK,1,1,,,,,,,, +1015000114,,,,700008,80000,12000,28,28,,, +1015000121,ATK,1,1,,,,,,,, +1015000122,HIT,1,1,,,,,,,, +1015000123,DEF,1,1,,,,,,,, +1015000124,,,,700010,50,80,28,28,,, +1015100111,ATK,1,1,,,,,,,, +1015100112,HIT,1,1,,,,,,,, +1015100113,ATK,1,1,,,,,,,, +1015100114,,,,700008,80000,12000,28,28,,, +1015100121,ATK,1,1,,,,,,,, +1015100122,HIT,1,1,,,,,,,, +1015100123,DEF,1,1,,,,,,,, +1015100124,,,,700010,50,80,28,28,,, +1015200111,ATK,1,1,,,,,,,, +1015200112,HIT,1,1,,,,,,,, +1015200113,ATK,1,1,,,,,,,, +1015200114,,,,700008,80000,12000,28,28,,, +1015200121,ATK,1,1,,,,,,,, +1015200122,HIT,1,1,,,,,,,, +1015200123,DEF,1,1,,,,,,,, +1015200124,,,,700010,50,80,28,28,,, +1015300111,ATK,1,1,,,,,,,, +1015300112,HIT,1,1,,,,,,,, +1015300113,ATK,1,1,,,,,,,, +1015300114,,,,700008,80000,12000,28,28,,, +1015300121,ATK,1,1,,,,,,,, +1015300122,HIT,1,1,,,,,,,, +1015300123,DEF,1,1,,,,,,,, +1015300124,,,,700010,50,80,28,28,,, +1015400111,ATK,1,1,,,,,,,, +1015400112,HIT,1,1,,,,,,,, +1015400113,ATK,1,1,,,,,,,, +1015400114,,,,700008,80000,12000,28,28,,, +1015400121,ATK,1,1,,,,,,,, +1015400122,HIT,1,1,,,,,,,, +1015400123,DEF,1,1,,,,,,,, +1015400124,,,,700010,50,80,28,28,,, +1025000011,HP,1,1,,,,,,,, +1025000012,HIT,1,1,,,,,,,, +1025000013,ATK,1,1,,,,,,,, +1025000014,,,,700007,,,12,12,,, +1025000021,HP,1,1,,,,,,,, +1025000022,HIT,1,1,,,,,,,, +1025000023,DEF,1,1,,,,,,,, +1025000024,,,,700009,,,12,12,,, +1025100011,HP,1,1,,,,,,,, +1025100012,HIT,1,1,,,,,,,, +1025100013,ATK,1,1,,,,,,,, +1025100014,,,,700007,,,12,12,,, +1025100021,HP,1,1,,,,,,,, +1025100022,HIT,1,1,,,,,,,, +1025100023,DEF,1,1,,,,,,,, +1025100024,,,,700009,,,12,12,,, +1025200011,HP,1,1,,,,,,,, +1025200012,HIT,1,1,,,,,,,, +1025200013,ATK,1,1,,,,,,,, +1025200014,,,,700007,,,12,12,,, +1025200021,HP,1,1,,,,,,,, +1025200022,HIT,1,1,,,,,,,, +1025200023,DEF,1,1,,,,,,,, +1025200024,,,,700009,,,12,12,,, +1025300011,HP,1,1,,,,,,,, +1025300012,HIT,1,1,,,,,,,, +1025300013,ATK,1,1,,,,,,,, +1025300014,,,,700007,,,12,12,,, +1025300021,HP,1,1,,,,,,,, +1025300022,HIT,1,1,,,,,,,, +1025300023,DEF,1,1,,,,,,,, +1025300024,,,,700009,,,12,12,,, +1025400011,HP,1,1,,,,,,,, +1025400012,HIT,1,1,,,,,,,, +1025400013,ATK,1,1,,,,,,,, +1025400014,,,,700007,,,12,12,,, +1025400021,HP,1,1,,,,,,,, +1025400022,HIT,1,1,,,,,,,, +1025400023,DEF,1,1,,,,,,,, +1025400024,,,,700009,,,12,12,,, +1035000211,SPD,1,1,,,,,,,, +1035000212,HIT,1,1,,,,,,,, +1035000213,ATK,1,1,,,,,,,, +1035000214,,,,700008,80000,12000,28,28,,, +1035000221,SPD,1,1,,,,,,,, +1035000222,HIT,1,1,,,,,,,, +1035000223,DEF,1,1,,,,,,,, +1035000224,,,,700010,50,80,28,28,,, +1035100211,SPD,1,1,,,,,,,, +1035100212,HIT,1,1,,,,,,,, +1035100213,ATK,1,1,,,,,,,, +1035100214,,,,700008,80000,12000,28,28,,, +1035100221,SPD,1,1,,,,,,,, +1035100222,HIT,1,1,,,,,,,, +1035100223,DEF,1,1,,,,,,,, +1035100224,,,,700010,50,80,28,28,,, +1035200211,SPD,1,1,,,,,,,, +1035200212,HIT,1,1,,,,,,,, +1035200213,ATK,1,1,,,,,,,, +1035200214,,,,700008,80000,12000,28,28,,, +1035200221,SPD,1,1,,,,,,,, +1035200222,HIT,1,1,,,,,,,, +1035200223,DEF,1,1,,,,,,,, +1035200224,,,,700010,50,80,28,28,,, +1035300211,SPD,1,1,,,,,,,, +1035300212,HIT,1,1,,,,,,,, +1035300213,ATK,1,1,,,,,,,, +1035300214,,,,700008,80000,12000,28,28,,, +1035300221,SPD,1,1,,,,,,,, +1035300222,HIT,1,1,,,,,,,, +1035300223,DEF,1,1,,,,,,,, +1035300224,,,,700010,50,80,28,28,,, +1035400211,SPD,1,1,,,,,,,, +1035400212,HIT,1,1,,,,,,,, +1035400213,ATK,1,1,,,,,,,, +1035400214,,,,700008,80000,12000,28,28,,, +1035400221,SPD,1,1,,,,,,,, +1035400222,HIT,1,1,,,,,,,, +1035400223,DEF,1,1,,,,,,,, +1035400224,,,,700010,50,80,28,28,,, +1045000211,HIT,1,1,,,,,,,, +1045000212,HIT,1,1,,,,,,,, +1045000213,ATK,1,1,,,,,,,, +1045000214,,,,700007,,,12,12,,, +1045000221,HIT,1,1,,,,,,,, +1045000222,HIT,1,1,,,,,,,, +1045000223,DEF,1,1,,,,,,,, +1045000224,,,,700009,,,12,12,,, +1045100211,HIT,1,1,,,,,,,, +1045100212,HIT,1,1,,,,,,,, +1045100213,ATK,1,1,,,,,,,, +1045100214,,,,700007,,,12,12,,, +1045100221,HIT,1,1,,,,,,,, +1045100222,HIT,1,1,,,,,,,, +1045100223,DEF,1,1,,,,,,,, +1045100224,,,,700009,,,12,12,,, +1045200211,HIT,1,1,,,,,,,, +1045200212,HIT,1,1,,,,,,,, +1045200213,ATK,1,1,,,,,,,, +1045200214,,,,700007,,,12,12,,, +1045200221,HIT,1,1,,,,,,,, +1045200222,HIT,1,1,,,,,,,, +1045200223,DEF,1,1,,,,,,,, +1045200224,,,,700009,,,12,12,,, +1045300211,HIT,1,1,,,,,,,, +1045300212,HIT,1,1,,,,,,,, +1045300213,ATK,1,1,,,,,,,, +1045300214,,,,700007,,,12,12,,, +1045300221,HIT,1,1,,,,,,,, +1045300222,HIT,1,1,,,,,,,, +1045300223,DEF,1,1,,,,,,,, +1045300224,,,,700009,,,12,12,,, +1045400211,HIT,1,1,,,,,,,, +1045400212,HIT,1,1,,,,,,,, +1045400213,ATK,1,1,,,,,,,, +1045400214,,,,700007,,,12,12,,, +1045400221,HIT,1,1,,,,,,,, +1045400222,HIT,1,1,,,,,,,, +1045400223,DEF,1,1,,,,,,,, +1045400224,,,,700009,,,12,12,,, +1055000111,DEF,1,1,,,,,,,, +1055000112,HIT,1,1,,,,,,,, +1055000113,ATK,1,1,,,,,,,, +1055000114,,,,700008,80000,12000,28,28,,, +1055000121,DEF,1,1,,,,,,,, +1055000122,HIT,1,1,,,,,,,, +1055000123,DEF,1,1,,,,,,,, +1055000124,,,,700010,50,80,28,28,,, +1055100111,DEF,1,1,,,,,,,, +1055100112,HIT,1,1,,,,,,,, +1055100113,ATK,1,1,,,,,,,, +1055100114,,,,700008,80000,12000,28,28,,, +1055100121,DEF,1,1,,,,,,,, +1055100122,HIT,1,1,,,,,,,, +1055100123,DEF,1,1,,,,,,,, +1055100124,,,,700010,50,80,28,28,,, +1055200111,DEF,1,1,,,,,,,, +1055200112,HIT,1,1,,,,,,,, +1055200113,ATK,1,1,,,,,,,, +1055200114,,,,700008,80000,12000,28,28,,, +1055200121,DEF,1,1,,,,,,,, +1055200122,HIT,1,1,,,,,,,, +1055200123,DEF,1,1,,,,,,,, +1055200124,,,,700010,50,80,28,28,,, +1055300111,DEF,1,1,,,,,,,, +1055300112,HIT,1,1,,,,,,,, +1055300113,ATK,1,1,,,,,,,, +1055300114,,,,700008,80000,12000,28,28,,, +1055300121,DEF,1,1,,,,,,,, +1055300122,HIT,1,1,,,,,,,, +1055300123,DEF,1,1,,,,,,,, +1055300124,,,,700010,50,80,28,28,,, +1055400111,DEF,1,1,,,,,,,, +1055400112,HIT,1,1,,,,,,,, +1055400113,ATK,1,1,,,,,,,, +1055400114,,,,700008,80000,12000,28,28,,, +1055400121,DEF,1,1,,,,,,,, +1055400122,HIT,1,1,,,,,,,, +1055400123,DEF,1,1,,,,,,,, +1055400124,,,,700010,50,80,28,28,,, \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/EquipmentItemRecipeSheet.csv b/Lib9c/TableCSV/Item/EquipmentItemRecipeSheet.csv index 370dda6723..240eeb6ff5 100644 --- a/Lib9c/TableCSV/Item/EquipmentItemRecipeSheet.csv +++ b/Lib9c/TableCSV/Item/EquipmentItemRecipeSheet.csv @@ -108,4 +108,29 @@ id,result_equipment_id,material_id,material_count,required_action_point,required 185,10630003,0,0,0,0,10000000,999,106300031,,,0,Aura 186,10640003,0,0,0,0,10000000,999,106400031,,,0,Aura 187,10650005,0,0,0,0,10000000,999,106500051,,,0,Aura -188,10650006,0,0,0,0,10000000,999,106500061,,,0,Aura \ No newline at end of file +188,10650006,0,0,0,0,10000000,999,106500061,,,0,Aura +189,10150001,303000,1,0,0,5,1,101500011,101500012,,1,Weapon +190,10151001,303000,1,0,0,5,1,101510011,101510012,,1,Weapon +191,10152001,303000,1,0,0,5,1,101520011,101520012,,1,Weapon +192,10153001,303000,1,0,0,5,1,101530011,101530012,,1,Weapon +193,10154001,303000,1,0,0,5,1,101540011,101540012,,1,Weapon +194,10250000,303000,1,0,0,5,1,102500001,102500002,,1,Armor +195,10251000,303000,1,0,0,5,1,102510001,102510002,,1,Armor +196,10252000,303000,1,0,0,5,1,102520001,102520002,,1,Armor +197,10253000,303000,1,0,0,5,1,102530001,102530002,,1,Armor +198,10254000,303000,1,0,0,5,1,102540001,102540002,,1,Armor +199,10350002,303000,1,0,0,5,1,103500021,103500022,,1,Belt +200,10351002,303000,1,0,0,5,1,103510021,103510022,,1,Belt +201,10352002,303000,1,0,0,5,1,103520021,103520022,,1,Belt +202,10353002,303000,1,0,0,5,1,103530021,103530022,,1,Belt +203,10354002,303000,1,0,0,5,1,103540021,103540022,,1,Belt +204,10450002,303000,1,0,0,5,1,104500021,104500022,,1,Necklace +205,10451002,303000,1,0,0,5,1,104510021,104510022,,1,Necklace +206,10452002,303000,1,0,0,5,1,104520021,104520022,,1,Necklace +207,10453002,303000,1,0,0,5,1,104530021,104530022,,1,Necklace +208,10454002,303000,1,0,0,5,1,104540021,104540022,,1,Necklace +209,10550001,303000,1,0,0,5,1,105500011,105500012,,1,Ring +210,10551001,303000,1,0,0,5,1,105510011,105510012,,1,Ring +211,10552001,303000,1,0,0,5,1,105520011,105520012,,1,Ring +212,10553001,303000,1,0,0,5,1,105530011,105530012,,1,Ring +213,10554001,303000,1,0,0,5,1,105540011,105540012,,1,Ring \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/EquipmentItemSheet.csv b/Lib9c/TableCSV/Item/EquipmentItemSheet.csv index 4185e73945..e7c861b0a1 100644 --- a/Lib9c/TableCSV/Item/EquipmentItemSheet.csv +++ b/Lib9c/TableCSV/Item/EquipmentItemSheet.csv @@ -192,4 +192,19 @@ id,_name,item_sub_type,grade,elemental_type,set_id,stat_type,stat_value,attack_r 10630003,Barrage Aura,Aura,3,Normal,0,ATK,10,0,10620001,600 10640003,Barrage Aura,Aura,4,Normal,0,ATK,10,0,10620001,6000 10650005,Barrage Aura,Aura,5,Normal,0,ATK,10,0,10620001,60000 -10650006,Lord's Barrage Aura,Aura,5,Normal,0,ATK,10,0,10620001,60000 \ No newline at end of file +10650006,Lord's Barrage Aura,Aura,5,Normal,0,ATK,10,0,10620001,60000 +10350002,,Belt,5,Normal,0,SPD,1,2,10350002,1 +10351002,,Belt,5,Fire,0,SPD,1,2,10351002,1 +10352002,,Belt,5,Water,0,SPD,1,2,10352002,1 +10353002,,Belt,5,Land,0,SPD,1,2,10353002,1 +10354002,,Belt,5,Wind,0,SPD,1,2,10354002,1 +10450002,,Necklace,5,Normal,0,HIT,1,0,10450002,1 +10451002,,Necklace,5,Fire,0,HIT,1,0,10451002,1 +10452002,,Necklace,5,Water,0,HIT,1,0,10452002,1 +10453002,,Necklace,5,Land,0,HIT,1,0,10453002,1 +10454002,,Necklace,5,Wind,0,HIT,1,0,10454002,1 +10550001,,Ring,5,Normal,0,DEF,1,0,10550001,1 +10551001,,Ring,5,Fire,0,DEF,1,0,10551001,1 +10552001,,Ring,5,Water,0,DEF,1,0,10552001,1 +10553001,,Ring,5,Land,0,DEF,1,0,10553001,1 +10554001,,Ring,5,Wind,0,DEF,1,0,10554001,1 \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/EquipmentItemSubRecipeSheetV2.csv b/Lib9c/TableCSV/Item/EquipmentItemSubRecipeSheetV2.csv index cc444268b9..a3eaa286e5 100644 --- a/Lib9c/TableCSV/Item/EquipmentItemSubRecipeSheetV2.csv +++ b/Lib9c/TableCSV/Item/EquipmentItemSubRecipeSheetV2.csv @@ -511,4 +511,54 @@ ID,required_action_point,required_gold,required_block_index,material_id,material 106300031,0,0,1,,,,,,,1063000311,10000,0,1063000312,10000,0,1063000313,10000,0,,,,FALSE,1 106400031,0,0,1,,,,,,,1064000311,10000,0,1064000312,10000,0,1064000313,10000,0,,,,FALSE,1 106500051,0,0,1,,,,,,,1065000511,10000,0,1065000512,10000,0,1065000513,10000,0,,,,FALSE,1 -106500061,0,0,1,,,,,,,1065000611,10000,0,1065000612,10000,0,1065000613,10000,0,,,,FALSE,1 \ No newline at end of file +106500061,0,0,1,,,,,,,1065000611,10000,0,1065000612,10000,0,1065000613,10000,0,,,,FALSE,1 +101500011,0,0,1,,,,,,,1015000111,10000,0,1015000112,6000,6000,1015000113,1100,20000,1015000114,500,100800,FALSE,1 +101500012,0,0,1,,,,,,,1015000121,10000,0,1015000122,6000,6000,1015000123,1100,20000,1015000124,500,100800,FALSE,1 +101510011,0,0,1,,,,,,,1015100111,10000,0,1015100112,6000,6000,1015100113,1100,20000,1015100114,500,100800,FALSE,1 +101510012,0,0,1,,,,,,,1015100121,10000,0,1015100122,6000,6000,1015100123,1100,20000,1015100124,500,100800,FALSE,1 +101520011,0,0,1,,,,,,,1015200111,10000,0,1015200112,6000,6000,1015200113,1100,20000,1015200114,500,100800,FALSE,1 +101520012,0,0,1,,,,,,,1015200121,10000,0,1015200122,6000,6000,1015200123,1100,20000,1015200124,500,100800,FALSE,1 +101530011,0,0,1,,,,,,,1015300111,10000,0,1015300112,6000,6000,1015300113,1100,20000,1015300114,500,100800,FALSE,1 +101530012,0,0,1,,,,,,,1015300121,10000,0,1015300122,6000,6000,1015300123,1100,20000,1015300124,500,100800,FALSE,1 +101540011,0,0,1,,,,,,,1015400111,10000,0,1015400112,6000,6000,1015400113,1100,20000,1015400114,500,100800,FALSE,1 +101540012,0,0,1,,,,,,,1015400121,10000,0,1015400122,6000,6000,1015400123,1100,20000,1015400124,500,100800,FALSE,1 +102500001,0,0,1,,,,,,,1025000011,10000,0,1025000012,6000,6000,1025000013,1100,20000,1025000014,500,100800,FALSE,1 +102500002,0,0,1,,,,,,,1025000021,10000,0,1025000022,6000,6000,1025000023,1100,20000,1025000024,500,100800,FALSE,1 +102510001,0,0,1,,,,,,,1025100011,10000,0,1025100012,6000,6000,1025100013,1100,20000,1025100014,500,100800,FALSE,1 +102510002,0,0,1,,,,,,,1025100021,10000,0,1025100022,6000,6000,1025100023,1100,20000,1025100024,500,100800,FALSE,1 +102520001,0,0,1,,,,,,,1025200011,10000,0,1025200012,6000,6000,1025200013,1100,20000,1025200014,500,100800,FALSE,1 +102520002,0,0,1,,,,,,,1025200021,10000,0,1025200022,6000,6000,1025200023,1100,20000,1025200024,500,100800,FALSE,1 +102530001,0,0,1,,,,,,,1025300011,10000,0,1025300012,6000,6000,1025300013,1100,20000,1025300014,500,100800,FALSE,1 +102530002,0,0,1,,,,,,,1025300021,10000,0,1025300022,6000,6000,1025300023,1100,20000,1025300024,500,100800,FALSE,1 +102540001,0,0,1,,,,,,,1025400011,10000,0,1025400012,6000,6000,1025400013,1100,20000,1025400014,500,100800,FALSE,1 +102540002,0,0,1,,,,,,,1025400021,10000,0,1025400022,6000,6000,1025400023,1100,20000,1025400024,500,100800,FALSE,1 +103500021,0,0,1,,,,,,,1035000211,10000,0,1035000212,6000,6000,1035000213,1100,20000,1035000214,500,100800,FALSE,1 +103500022,0,0,1,,,,,,,1035000221,10000,0,1035000222,6000,6000,1035000223,1100,20000,1035000224,500,100800,FALSE,1 +103510021,0,0,1,,,,,,,1035100211,10000,0,1035100212,6000,6000,1035100213,1100,20000,1035100214,500,100800,FALSE,1 +103510022,0,0,1,,,,,,,1035100221,10000,0,1035100222,6000,6000,1035100223,1100,20000,1035100224,500,100800,FALSE,1 +103520021,0,0,1,,,,,,,1035200211,10000,0,1035200212,6000,6000,1035200213,1100,20000,1035200214,500,100800,FALSE,1 +103520022,0,0,1,,,,,,,1035200221,10000,0,1035200222,6000,6000,1035200223,1100,20000,1035200224,500,100800,FALSE,1 +103530021,0,0,1,,,,,,,1035300211,10000,0,1035300212,6000,6000,1035300213,1100,20000,1035300214,500,100800,FALSE,1 +103530022,0,0,1,,,,,,,1035300221,10000,0,1035300222,6000,6000,1035300223,1100,20000,1035300224,500,100800,FALSE,1 +103540021,0,0,1,,,,,,,1035400211,10000,0,1035400212,6000,6000,1035400213,1100,20000,1035400214,500,100800,FALSE,1 +103540022,0,0,1,,,,,,,1035400221,10000,0,1035400222,6000,6000,1035400223,1100,20000,1035400224,500,100800,FALSE,1 +104500021,0,0,1,,,,,,,1045000211,10000,0,1045000212,6000,6000,1045000213,1100,20000,1045000214,500,100800,FALSE,1 +104500022,0,0,1,,,,,,,1045000221,10000,0,1045000222,6000,6000,1045000223,1100,20000,1045000224,500,100800,FALSE,1 +104510021,0,0,1,,,,,,,1045100211,10000,0,1045100212,6000,6000,1045100213,1100,20000,1045100214,500,100800,FALSE,1 +104510022,0,0,1,,,,,,,1045100221,10000,0,1045100222,6000,6000,1045100223,1100,20000,1045100224,500,100800,FALSE,1 +104520021,0,0,1,,,,,,,1045200211,10000,0,1045200212,6000,6000,1045200213,1100,20000,1045200214,500,100800,FALSE,1 +104520022,0,0,1,,,,,,,1045200221,10000,0,1045200222,6000,6000,1045200223,1100,20000,1045200224,500,100800,FALSE,1 +104530021,0,0,1,,,,,,,1045300211,10000,0,1045300212,6000,6000,1045300213,1100,20000,1045300214,500,100800,FALSE,1 +104530022,0,0,1,,,,,,,1045300221,10000,0,1045300222,6000,6000,1045300223,1100,20000,1045300224,500,100800,FALSE,1 +104540021,0,0,1,,,,,,,1045400211,10000,0,1045400212,6000,6000,1045400213,1100,20000,1045400214,500,100800,FALSE,1 +104540022,0,0,1,,,,,,,1045400221,10000,0,1045400222,6000,6000,1045400223,1100,20000,1045400224,500,100800,FALSE,1 +105500011,0,0,1,,,,,,,1055000111,10000,0,1055000112,6000,6000,1055000113,1100,20000,1055000114,500,100800,FALSE,1 +105500012,0,0,1,,,,,,,1055000121,10000,0,1055000122,6000,6000,1055000123,1100,20000,1055000124,500,100800,FALSE,1 +105510011,0,0,1,,,,,,,1055100111,10000,0,1055100112,6000,6000,1055100113,1100,20000,1055100114,500,100800,FALSE,1 +105510012,0,0,1,,,,,,,1055100121,10000,0,1055100122,6000,6000,1055100123,1100,20000,1055100124,500,100800,FALSE,1 +105520011,0,0,1,,,,,,,1055200111,10000,0,1055200112,6000,6000,1055200113,1100,20000,1055200114,500,100800,FALSE,1 +105520012,0,0,1,,,,,,,1055200121,10000,0,1055200122,6000,6000,1055200123,1100,20000,1055200124,500,100800,FALSE,1 +105530011,0,0,1,,,,,,,1055300111,10000,0,1055300112,6000,6000,1055300113,1100,20000,1055300114,500,100800,FALSE,1 +105530012,0,0,1,,,,,,,1055300121,10000,0,1055300122,6000,6000,1055300123,1100,20000,1055300124,500,100800,FALSE,1 +105540011,0,0,1,,,,,,,1055400111,10000,0,1055400112,6000,6000,1055400113,1100,20000,1055400114,500,100800,FALSE,1 +105540012,0,0,1,,,,,,,1055400121,10000,0,1055400122,6000,6000,1055400123,1100,20000,1055400124,500,100800,FALSE,1 \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/ItemRequirementSheet.csv b/Lib9c/TableCSV/Item/ItemRequirementSheet.csv index 0d17abc6c6..0a88772ec5 100644 --- a/Lib9c/TableCSV/Item/ItemRequirementSheet.csv +++ b/Lib9c/TableCSV/Item/ItemRequirementSheet.csv @@ -35,11 +35,11 @@ item_id,level,mimislevel 10142001,999,999 10143001,999,999 10144001,999,999 -10150001,999,999 -10151001,999,999 -10152001,999,999 -10153001,999,999 -10154001,999,999 +10150001,1,1 +10151001,1,1 +10152001,1,1 +10153001,1,1 +10154001,1,1 10155000,999,999 10200000,1,1 10210000,1,1 @@ -77,11 +77,11 @@ item_id,level,mimislevel 10242001,999,999 10243001,999,999 10244001,999,999 -10250000,999,999 -10251000,999,999 -10252000,999,999 -10253000,999,999 -10254000,999,999 +10250000,1,1 +10251000,1,1 +10252000,1,1 +10253000,1,1 +10254000,1,1 10255000,999,999 10310000,1,1 10311000,1,1 @@ -199,7 +199,16 @@ item_id,level,mimislevel 40100015,31,31 40100016,1,1 40100017,1,1 +40100018,1,1 40100019,1,1 +40100020,1,1 +40100021,1,1 +40100023,1,1 +40100024,1,1 +40100025,1,1 +40100026,1,1 +40100028,1,1 +40100029,1,1 40200001,1,1 40200002,1,1 40200003,1,1 @@ -244,6 +253,9 @@ item_id,level,mimislevel 49900009,1,1 49900010,1,1 49900011,1,1 +49900012,1,1 +49900013,1,1 +49900014,1,1 105000,1,1 105001,1,1 105002,1,1 @@ -282,6 +294,7 @@ item_id,level,mimislevel 201031,280,280 201032,300,300 201033,320,320 +201034,1,1 900101,1,1 900102,1,1 900103,1,1 @@ -291,7 +304,6 @@ item_id,level,mimislevel 900105,1,1 900106,1,1 10130002,1,1 -49900012,1,1 10620002,1,1 10630002,1,1 10640002,1,1 @@ -301,4 +313,19 @@ item_id,level,mimislevel 10630003,1,1 10640003,1,1 10650005,1,1 -10650006,1,1 \ No newline at end of file +10650006,1,1 +10350002,1,1 +10351002,1,1 +10352002,1,1 +10353002,1,1 +10354002,1,1 +10450002,1,1 +10451002,1,1 +10452002,1,1 +10453002,1,1 +10454002,1,1 +10550001,1,1 +10551001,1,1 +10552001,1,1 +10553001,1,1 +10554001,1,1 \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/MaterialItemSheet.csv b/Lib9c/TableCSV/Item/MaterialItemSheet.csv index ce007dc802..3c55055fcf 100644 --- a/Lib9c/TableCSV/Item/MaterialItemSheet.csv +++ b/Lib9c/TableCSV/Item/MaterialItemSheet.csv @@ -29,6 +29,11 @@ id,_name,item_sub_type,grade,elemental_type 302025,동글이 잎사귀,FoodMaterial,3,Normal 302026,얼어붙은 열매,FoodMaterial,4,Normal 302027,서리 결정,FoodMaterial,5,Normal +302028,빨간 열매,FoodMaterial,2,Normal +302029,거친 나무 조각,FoodMaterial,3,Normal +302030,어둠 물고기,FoodMaterial,3,Normal +302031,영혼수,FoodMaterial,4,Normal +302032,붉은 파우더,FoodMaterial,5,Normal 800101,조개껍질,FoodMaterial,2,Normal 800102,선글라스,FoodMaterial,3,Normal 800103,아이스크림,FoodMaterial,4,Normal @@ -159,13 +164,29 @@ id,_name,item_sub_type,grade,elemental_type 306082,뽀족한 칼날 가면,MonsterPart,4,Water 306083,랜턴 파편,MonsterPart,4,Water 306084,어둠의 정수 파편,MonsterPart,4,Water +306085,신규 무색 결정,MonsterPart,5,Normal +306086,화염 결정,MonsterPart,5,Fire +306087,물 결정,MonsterPart,5,Water +306088,대지 결정,MonsterPart,5,Land +306089,바람 결정,MonsterPart,5,Wind +306090,얼어붙은 잎사귀,MonsterPart,4,Water +306091,얼어붙은 열매,MonsterPart,4,Water +306092,날카로운 얼음 파편,MonsterPart,4,Water +306093,짙은 보석 결정,MonsterPart,4,Water +306094,튼튼한 뿔 조각,MonsterPart,4,Water +306095,뾰족한 철재 파편,MonsterPart,4,Water +306096,얼어붙은 방패 파편,MonsterPart,4,Water +306097,뽀족한 칼날 가면,MonsterPart,4,Water +306098,랜턴 파편,MonsterPart,4,Water +306099,어둠의 정수 파편,MonsterPart,4,Water 400000,모래시계,Hourglass,4,Normal 500000,AP 스톤,ApStone,4,Normal 600101,Special Crystal Piece,EquipmentMaterial,1,Normal 600102,Special Crystal Lump,EquipmentMaterial,2,Normal 600103,Special Crystal Ore,EquipmentMaterial,3,Normal 600104,Special Crystal Jewel,EquipmentMaterial,4,Normal -600201,golden dust,EquipmentMaterial,4,Normal +600201,Golden Dust,EquipmentMaterial,4,Normal +600202,Ruby Dust,EquipmentMaterial,4,Normal 600301,망치 커먼,EquipmentMaterial,1,Normal 600302,망치 레어,EquipmentMaterial,2,Normal 600303,망치 에픽,EquipmentMaterial,3,Normal @@ -183,9 +204,9 @@ id,_name,item_sub_type,grade,elemental_type 700009,시즌 3 메달 (헤임달용),NormalMaterial,5,Normal 700010,아레나 시즌10 메달,NormalMaterial,5,Normal 700011,챔피언 쉽 0 메달 (헤임달용),NormalMaterial,5,Normal -700102,시즌 3 메달,NormalMaterial,5,Normal -700104,시즌 4 메달,NormalMaterial,5,Normal -700106,시즌 5 메달,NormalMaterial,5,Normal +700102,시즌 4 메달,NormalMaterial,5,Normal +700104,시즌 5 메달,NormalMaterial,5,Normal +700106,시즌 6 메달,NormalMaterial,5,Normal 700108,챔피언 쉽 1 메달,NormalMaterial,5,Normal 700202,시즌 7 메달,NormalMaterial,5,Normal 700204,시즌 8 메달,NormalMaterial,5,Normal diff --git a/Lib9c/TableCSV/Quest/WorldQuestSheet.csv b/Lib9c/TableCSV/Quest/WorldQuestSheet.csv index 9feb912498..87f96859d5 100644 --- a/Lib9c/TableCSV/Quest/WorldQuestSheet.csv +++ b/Lib9c/TableCSV/Quest/WorldQuestSheet.csv @@ -348,4 +348,54 @@ id,goal,quest_reward_id 100347,347,43 100348,348,43 100349,349,43 -100350,350,43 \ No newline at end of file +100350,350,43 +100351,351,43 +100352,352,43 +100353,353,43 +100354,354,43 +100355,355,43 +100356,356,43 +100357,357,43 +100358,358,43 +100359,359,43 +100360,360,43 +100361,361,43 +100362,362,43 +100363,363,43 +100364,364,43 +100365,365,43 +100366,366,43 +100367,367,43 +100368,368,43 +100369,369,43 +100370,370,43 +100371,371,43 +100372,372,43 +100373,373,43 +100374,374,43 +100375,375,43 +100376,376,43 +100377,377,43 +100378,378,43 +100379,379,43 +100380,380,43 +100381,381,43 +100382,382,43 +100383,383,43 +100384,384,43 +100385,385,43 +100386,386,43 +100387,387,43 +100388,388,43 +100389,389,43 +100390,390,43 +100391,391,43 +100392,392,43 +100393,393,43 +100394,394,43 +100395,395,43 +100396,396,43 +100397,397,43 +100398,398,43 +100399,399,43 +100400,400,43 \ No newline at end of file diff --git a/Lib9c/TableCSV/Skill/EnemySkillSheet.csv b/Lib9c/TableCSV/Skill/EnemySkillSheet.csv index 35eacb7dce..48ef6cee6f 100644 --- a/Lib9c/TableCSV/Skill/EnemySkillSheet.csv +++ b/Lib9c/TableCSV/Skill/EnemySkillSheet.csv @@ -241,4 +241,12 @@ id,character_id,skill_id 240,208007,120005 241,208007,210004 242,208007,220002 -243,208007,250004 \ No newline at end of file +243,208007,250004 +244,209000,110000 +245,209001,110000 +246,209002,110000 +247,209003,110000 +248,209004,110000 +249,209005,110000 +250,209006,110000 +251,209007,110000 \ No newline at end of file diff --git a/Lib9c/TableCSV/Skill/SkillBuffSheet.csv b/Lib9c/TableCSV/Skill/SkillBuffSheet.csv index ebb87b6aa2..ecfd39f498 100644 --- a/Lib9c/TableCSV/Skill/SkillBuffSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillBuffSheet.csv @@ -218,4 +218,6 @@ skill_id,buff_id 230007,104005 230007,204003 240006,105003 -210012,202004 \ No newline at end of file +210012,202004 +700007,704000 +700009,705000 \ No newline at end of file diff --git a/Lib9c/TableCSV/Skill/SkillSheet.csv b/Lib9c/TableCSV/Skill/SkillSheet.csv index 1a9ef43cc7..ea78ff669f 100644 --- a/Lib9c/TableCSV/Skill/SkillSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillSheet.csv @@ -169,4 +169,8 @@ _250001,속도 증가(전체),Normal,Buff,SpeedBuff,Ally,1,1 // 미구현 700003,치명 데미지 증가,Normal,Buff,CriticalDamageBuff,Self,1,15 700004,기절,Normal,Debuff,Buff,Enemy,1,15 700005,기절,Normal,Debuff,Buff,Enemies,1,15 -700006,흡혈,Normal,Buff,Buff,Self,1,15 \ No newline at end of file +700006,흡혈,Normal,Buff,Buff,Self,1,15 +700007,집중,Normal,Buff,AttackHITBuff,Self,1,15 +700008,더블 어택,Normal,Attack,DoubleAttack,Enemy,1,15 +700009,디버프 제거,Normal,Buff,AntideBuff,Self,1,15 +700010,HP 비례 데미지,Normal,Attack,HPProportionDamage,Enemy,1,15 \ No newline at end of file diff --git a/Lib9c/TableCSV/Skill/StatBuffSheet.csv b/Lib9c/TableCSV/Skill/StatBuffSheet.csv index 0d8c4cef1a..457c1311fa 100644 --- a/Lib9c/TableCSV/Skill/StatBuffSheet.csv +++ b/Lib9c/TableCSV/Skill/StatBuffSheet.csv @@ -121,4 +121,6 @@ id,group,_name,chance,duration,target_type,stat_type,modify_type,modify_value,is 504011,504011,Serimnir Furious Enemy CDMG,100,8,Enemy,CDMG,Add,10000,true 701000,701000,DRV (Rune),100,0,Self,DRV,Add,0,true 702000,701000,DRR (Rune),100,0,Self,DRR,Add,0,true -703000,703000,CDMG (Rune),100,0,Self,CDMG,Add,0,true \ No newline at end of file +703000,703000,CDMG (Rune),100,0,Self,CDMG,Add,0,true +704000,704000,집중,100,10,Self,AttackHIT,Add,100,true +705000,705000,디버프 제거,100,5,Self,AntideBuff,Add,100,true \ No newline at end of file diff --git a/Lib9c/TableCSV/SweepRequiredCPSheet.csv b/Lib9c/TableCSV/SweepRequiredCPSheet.csv index 629b4bf113..e0d490eabe 100644 --- a/Lib9c/TableCSV/SweepRequiredCPSheet.csv +++ b/Lib9c/TableCSV/SweepRequiredCPSheet.csv @@ -348,4 +348,54 @@ stage_id,required_cp 347,1640445 348,1697748 349,1714993 -350,1732237 \ No newline at end of file +350,1732237 +351,1 +352,1 +353,1 +354,1 +355,1 +356,1 +357,1 +358,1 +359,1 +360,1 +361,1 +362,1 +363,1 +364,1 +365,1 +366,1 +367,1 +368,1 +369,1 +370,1 +371,1 +372,1 +373,1 +374,1 +375,1 +376,1 +377,1 +378,1 +379,1 +380,1 +381,1 +382,1 +383,1 +384,1 +385,1 +386,1 +387,1 +388,1 +389,1 +390,1 +391,1 +392,1 +393,1 +394,1 +395,1 +396,1 +397,1 +398,1 +399,1 +400,1 \ No newline at end of file diff --git a/Lib9c/TableCSV/WorldAndStage/StageSheet.csv b/Lib9c/TableCSV/WorldAndStage/StageSheet.csv index 0cfdfaa834..c860746f10 100644 --- a/Lib9c/TableCSV/WorldAndStage/StageSheet.csv +++ b/Lib9c/TableCSV/WorldAndStage/StageSheet.csv @@ -349,6 +349,56 @@ id,cost_ap,turn_limit,hp_additional,atk_additional,def_additional,cri_additional 348,5,150,7500,10800,4297,0,15500,5200,chapter_07_02,bgm_niflheim_02,303204,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 349,5,150,8000,10900,4313,0,16000,5600,chapter_07_01,bgm_niflheim_01,303304,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 350,5,150,9000,11000,4330,0,16500,6000,chapter_07_03,bgm_niflheim_03,303404,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 +351,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,1,4,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 +352,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,0.4,1,1,306075,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +353,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303004,0.4,1,1,306075,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +354,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,0.4,1,1,306075,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +355,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,0.4,1,1,306075,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +356,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303204,1,4,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 +357,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,0.4,1,1,306076,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +358,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303204,0.4,1,1,306076,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +359,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,0.4,1,1,306076,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +360,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303204,0.4,1,1,306076,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +361,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,1,4,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 +362,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,0.4,1,1,306077,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +363,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303104,0.4,1,1,306077,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +364,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,0.4,1,1,306077,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +365,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,0.4,1,1,306077,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +366,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303304,1,4,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 +367,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306078,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +368,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303304,0.4,1,1,306078,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +369,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306078,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +370,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303304,0.4,1,1,306078,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +371,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,1,4,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 +372,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306079,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +373,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303404,0.4,1,1,306079,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +374,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306079,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +375,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306079,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +376,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303004,1,6,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,6 +377,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,1,6,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,6 +378,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303004,0.4,1,1,306080,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +379,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,0.4,1,1,306081,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +380,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303004,0.4,1,1,306080,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +381,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,0.4,1,1,306081,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +382,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,0.4,1,1,306080,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +383,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303204,0.4,1,1,306081,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +384,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,1,6,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,6 +385,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,1,6,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,6 +386,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303104,0.4,1,1,306082,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +387,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306083,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +388,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303104,0.4,1,1,306082,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +389,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306083,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +390,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303104,0.4,1,1,306082,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +391,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306083,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +392,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,1,6,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,6 +393,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303404,0.4,1,1,306084,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +394,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306084,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +395,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306084,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +396,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303004,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 +397,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 +398,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303204,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 +399,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 +400,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303404,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 10000001,10,150,184,132,132,0,184,132,chapter_99_01,bgm_hard1,303200,0.15,1,1,306064,0.25,1,2,306065,0.1,1,2,306058,0.4,1,1,306059,0.1,1,1,,,,,,,,,,,,,,,,,,,,,4,4 10000002,10,150,228,163,163,0,228,163,chapter_99_01,bgm_hard2,303200,0.15,1,1,306064,0.25,1,2,306065,0.1,1,2,306058,0.4,1,1,306059,0.1,1,1,,,,,,,,,,,,,,,,,,,,,4,4 10000003,10,150,245,175,175,0,245,175,chapter_99_01,bgm_hard1,303200,0.15,1,1,306064,0.25,1,2,306065,0.1,1,2,306058,0.4,1,1,306059,0.1,1,1,,,,,,,,,,,,,,,,,,,,,4,4 diff --git a/Lib9c/TableCSV/WorldAndStage/StageWaveSheet.csv b/Lib9c/TableCSV/WorldAndStage/StageWaveSheet.csv index 272328310f..b7f2aa2f3f 100644 --- a/Lib9c/TableCSV/WorldAndStage/StageWaveSheet.csv +++ b/Lib9c/TableCSV/WorldAndStage/StageWaveSheet.csv @@ -1049,6 +1049,156 @@ stage_id,wave,monster1_id,monster1_level,monster1_count,monster2_id,monster2_lev 350,1,208004,354,2,208003,354,1,208005,354,1,,,,0 350,2,208001,354,4,208002,354,3,208003,354,3,,,,0 350,3,208007,355,1,,,,,,,,,,1 +351,1,209000,305,2,,,,,,,,,,0 +351,2,209001,305,2,,,,,,,,,,0 +351,3,209000,305,3,,,,,,,,,,0 +352,1,209000,306,2,,,,,,,,,,0 +352,2,209001,306,2,,,,,,,,,,0 +352,3,209000,307,2,209001,307,1,,,,,,,1 +353,1,209000,307,1,209001,307,1,,,,,,,0 +353,2,209001,307,2,,,,,,,,,,0 +353,3,209003,307,1,,,,,,,,,,0 +354,1,209000,308,3,,,,,,,,,,0 +354,2,209001,308,1,209000,308,1,,,,,,,0 +354,3,209000,309,1,209001,309,2,,,,,,,1 +355,1,209000,309,2,209001,309,1,,,,,,,0 +355,2,209000,309,3,,,,,,,,,,0 +355,3,209000,309,2,209001,309,1,,,,,,,0 +356,1,209000,310,2,209001,310,2,,,,,,,0 +356,2,209000,310,3,209001,310,1,,,,,,,0 +356,3,209003,311,1,209000,311,1,,,,,,,1 +357,1,209000,311,2,209002,311,1,,,,,,,0 +357,2,209000,311,4,209001,311,1,,,,,,,0 +357,3,209000,311,3,209002,311,2,,,,,,,0 +358,1,209000,312,3,209002,312,1,,,,,,,0 +358,2,209000,312,3,209001,312,2,,,,,,,0 +358,3,209000,313,4,209002,313,2,,,,,,,1 +359,1,209000,313,3,209001,313,2,,,,,,,0 +359,2,209000,313,4,209002,313,1,,,,,,,0 +359,3,209000,313,3,209002,313,3,,,,,,,0 +360,1,209000,314,3,209002,314,2,,,,,,,0 +360,2,209001,314,3,209002,314,1,,,,,,,0 +360,3,209003,315,1,209001,315,1,,,,,,,1 +361,1,209000,315,4,209002,315,2,,,,,,,0 +361,2,209001,315,3,209001,315,2,,,,,,,0 +361,3,209001,315,3,209002,315,2,,,,,,,0 +362,1,209001,316,3,209002,316,2,,,,,,,0 +362,2,209000,316,4,209002,316,2,,,,,,,0 +362,3,209001,317,1,209002,317,4,,,,,,,1 +363,1,209001,317,4,209002,317,2,,,,,,,0 +363,2,209000,317,5,209002,317,2,,,,,,,0 +363,3,209003,317,1,209001,317,1,,,,,,,0 +364,1,209000,318,4,209001,318,3,209002,318,1,,,,0 +364,2,209001,318,3,209002,318,3,,,,,,,0 +364,3,209001,319,3,209002,319,3,,,,,,,1 +365,1,209000,319,2,209002,319,2,209003,319,1,,,,0 +365,2,209001,319,3,209002,319,3,,,,,,,0 +365,3,209001,319,2,209002,319,2,209003,319,1,,,,0 +366,1,209001,320,4,209002,320,4,,,,,,,0 +366,2,209000,320,5,209002,320,3,,,,,,,0 +366,3,209004,321,1,209000,321,2,209001,321,2,,,,1 +367,1,209000,321,3,209001,321,2,209003,321,1,,,,0 +367,2,209001,321,4,209002,321,3,,,,,,,0 +367,3,209000,321,1,209001,321,2,209002,321,6,,,,0 +368,1,209000,322,3,209001,322,2,209002,322,4,,,,0 +368,2,209001,322,3,209002,322,4,,,,,,,0 +368,3,209000,323,2,209002,323,2,209003,323,1,,,,1 +369,1,209000,323,2,209001,323,2,209002,323,5,,,,0 +369,2,209001,323,4,209002,323,3,,,,,,,0 +369,3,209001,323,3,209002,323,1,209003,323,1,,,,0 +370,1,209003,324,1,209000,324,4,209001,324,2,,,,0 +370,2,209001,324,3,209002,324,4,,,,,,,0 +370,3,209004,325,1,209001,325,3,,,,,,,1 +371,1,209003,325,1,209000,325,3,209001,325,3,,,,0 +371,2,209000,325,1,209001,325,4,209002,325,3,,,,0 +371,3,209003,325,1,209000,325,4,209001,325,2,,,,0 +372,1,209000,326,5,209001,326,3,209002,326,3,,,,0 +372,2,209000,326,3,209001,326,4,209002,326,2,,,,0 +372,3,209003,327,1,209000,327,3,209002,327,3,,,,1 +373,1,209000,327,3,209001,327,4,209002,327,4,,,,0 +373,2,209000,327,2,209001,327,4,209002,327,3,,,,0 +373,3,209004,327,1,209000,327,2,209002,327,3,,,,0 +374,1,209004,328,1,209001,328,2,209002,328,2,,,,0 +374,2,209000,328,3,209001,328,4,209002,328,3,,,,0 +374,3,209003,329,1,209001,329,3,209002,329,3,,,,1 +375,1,209004,329,1,209003,329,1,,,,,,,0 +375,2,209002,329,3,209003,329,1,,,,,,,0 +375,3,209004,329,1,209000,329,3,209002,329,3,,,,0 +376,1,209001,330,3,209002,330,3,209003,330,1,,,,0 +376,2,209000,330,3,209002,330,5,,,,,,,0 +376,3,209005,331,1,209002,331,3,,,,,,,1 +377,1,209004,331,1,209003,331,1,209002,331,3,,,,0 +377,2,209001,331,3,209002,331,4,,,,,,,0 +377,3,209004,331,1,209003,331,1,,,,,,,0 +378,1,209000,332,4,209002,332,4,209003,332,1,,,,0 +378,2,209001,332,3,209002,332,5,,,,,,,0 +378,3,209004,333,1,209000,333,5,209002,333,4,,,,1 +379,1,209001,333,3,209002,333,4,209003,333,1,,,,0 +379,2,209001,333,2,209002,333,6,,,,,,,0 +379,3,209000,333,5,209002,333,3,209003,333,2,,,,0 +380,1,209001,334,3,209002,334,4,209003,334,1,,,,0 +380,2,209001,334,4,209002,334,4,,,,,,,0 +380,3,209005,335,1,209003,335,1,209002,335,1,,,,1 +381,1,209000,335,4,209002,335,4,209003,335,1,,,,0 +381,2,209000,335,3,209001,335,3,209002,335,3,,,,0 +381,3,209004,335,2,209001,335,4,209002,335,1,,,,0 +382,1,209004,336,1,209000,336,4,209001,336,4,,,,0 +382,2,209000,336,3,209002,336,2,209003,336,1,,,,0 +382,3,209004,337,2,209002,337,4,,,,,,,1 +383,1,209004,337,1,209001,337,4,209002,337,3,,,,0 +383,2,209000,337,2,209001,337,3,209002,337,4,,,,0 +383,3,209005,337,1,209004,337,1,,,,,,,0 +384,1,209004,338,2,209001,338,2,,,,,,,0 +384,2,209003,338,1,209000,338,2,209002,338,2,,,,0 +384,3,209005,339,1,209001,339,3,209002,339,3,,,,1 +385,1,209004,339,2,209002,339,2,,,,,,,0 +385,2,209003,339,1,209002,339,4,,,,,,,0 +385,3,209005,339,1,209000,339,3,209001,339,4,,,,0 +386,1,209004,340,1,209003,340,1,209002,340,4,,,,0 +386,2,209003,340,1,209001,340,5,,,,,,,0 +386,3,209006,341,1,209000,341,3,,,,,,,1 +387,1,209005,341,1,209001,341,4,,,,,,,0 +387,2,209004,341,1,209000,341,4,,,,,,,0 +387,3,209004,341,1,209002,341,4,209003,341,1,,,,0 +388,1,209004,342,1,209001,342,3,209002,342,3,,,,0 +388,2,209003,342,1,209000,342,3,209002,342,3,,,,0 +388,3,209005,343,1,209004,343,1,,,,,,,1 +389,1,209002,343,3,209003,343,2,,,,,,,0 +389,2,209003,343,1,209001,343,3,209002,343,3,,,,0 +389,3,209004,343,2,209002,343,3,,,,,,,0 +390,1,209004,344,1,209005,344,1,209003,344,1,,,,0 +390,2,209003,344,2,209001,344,2,,,,,,,0 +390,3,209006,345,1,209003,345,1,,,,,,,1 +391,1,209004,345,1,209003,345,1,209002,345,1,,,,0 +391,2,209000,345,3,209005,345,1,,,,,,,0 +391,3,209003,345,3,209001,345,3,209002,345,3,,,,0 +392,1,209000,346,3,209001,346,3,209003,346,2,,,,0 +392,2,209000,346,3,209004,346,1,209002,346,2,,,,0 +392,3,209005,347,2,209001,347,3,,,,,,,1 +393,1,209001,347,2,209002,347,3,209003,347,2,,,,0 +393,2,209000,347,3,209004,347,1,209002,347,3,,,,0 +393,3,209006,347,1,209004,347,1,,,,,,,0 +394,1,209005,348,2,209002,348,3,209000,348,2,,,,0 +394,2,209000,348,1,209001,348,1,209002,348,1,209003,348,2,0 +394,3,209004,349,1,209005,349,1,209001,349,2,,,,1 +395,1,209004,349,2,209003,349,1,209001,349,3,,,,0 +395,2,209001,349,2,209002,349,1,209003,349,2,,,,0 +395,3,209003,349,2,209004,349,1,209000,349,2,,,,0 +396,1,209005,350,1,209003,350,2,209002,350,4,,,,0 +396,2,209001,350,1,209002,350,2,209003,350,2,,,,0 +396,3,209006,351,1,209005,351,1,,,,,,,1 +397,1,209005,351,2,209003,351,1,,,,,,,0 +397,2,209002,351,3,209001,351,4,209004,351,1,,,,0 +397,3,209004,351,2,209003,351,1,209002,351,3,,,,0 +398,1,209003,352,3,209004,352,1,209000,352,2,,,,0 +398,2,209002,352,2,209001,352,2,209003,352,2,,,,0 +398,3,209003,353,1,209005,353,2,,,,,,,1 +399,1,209006,353,1,209004,353,1,209005,353,1,,,,0 +399,2,209000,353,3,209005,353,2,,,,,,,0 +399,3,209006,353,1,209005,353,1,209002,353,3,,,,0 +400,1,209004,354,2,209003,354,1,209005,354,1,,,,0 +400,2,209001,354,4,209002,354,3,209003,354,3,,,,0 +400,3,209007,355,1,,,,,,,,,,1 10000001,1,203000,95,1,203001,95,1,,,,,,,0 10000001,2,203000,95,1,203001,95,2,203003,95,1,,,,0 10000001,3,203001,95,2,203003,95,2,,,,,,,0 diff --git a/Lib9c/TableCSV/WorldAndStage/WorldSheet.csv b/Lib9c/TableCSV/WorldAndStage/WorldSheet.csv index 182f3e8b10..3fd0148f5f 100644 --- a/Lib9c/TableCSV/WorldAndStage/WorldSheet.csv +++ b/Lib9c/TableCSV/WorldAndStage/WorldSheet.csv @@ -6,4 +6,5 @@ id,name,stage_begin,stage_end 10001,Mimisbrunnr,10000001,10000020 5,Muspelheim,201,250 6,Jotunheim,251,300 -7,Niflheim,301,350 \ No newline at end of file +7,Niflheim,301,350 +8,Hel,351,400 \ No newline at end of file diff --git a/Lib9c/TableCSV/WorldAndStage/WorldUnlockSheet.csv b/Lib9c/TableCSV/WorldAndStage/WorldUnlockSheet.csv index 0d5b673437..34d047dfa9 100644 --- a/Lib9c/TableCSV/WorldAndStage/WorldUnlockSheet.csv +++ b/Lib9c/TableCSV/WorldAndStage/WorldUnlockSheet.csv @@ -5,4 +5,5 @@ id,world_id,stage_id,world_id_to_unlock,required_crystal 4,2,100,10001,0 5,4,200,5,100000 6,5,250,6,1000000 -7,6,300,7,1000000 \ No newline at end of file +7,6,300,7,1000000 +8,7,350,8,1 \ No newline at end of file From 2f303f9b0a60d7d0d4da91a594269a443c8cd7f2 Mon Sep 17 00:00:00 2001 From: jonny Date: Mon, 5 Feb 2024 18:19:32 +0900 Subject: [PATCH 02/78] Generate dummy data using existing data for new skills --- Lib9c/TableCSV/Skill/SkillSheet.csv | 8 ++++---- Lib9c/TableCSV/Skill/StatBuffSheet.csv | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Lib9c/TableCSV/Skill/SkillSheet.csv b/Lib9c/TableCSV/Skill/SkillSheet.csv index ea78ff669f..c8d48594a4 100644 --- a/Lib9c/TableCSV/Skill/SkillSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillSheet.csv @@ -170,7 +170,7 @@ _250001,속도 증가(전체),Normal,Buff,SpeedBuff,Ally,1,1 // 미구현 700004,기절,Normal,Debuff,Buff,Enemy,1,15 700005,기절,Normal,Debuff,Buff,Enemies,1,15 700006,흡혈,Normal,Buff,Buff,Self,1,15 -700007,집중,Normal,Buff,AttackHITBuff,Self,1,15 -700008,더블 어택,Normal,Attack,DoubleAttack,Enemy,1,15 -700009,디버프 제거,Normal,Buff,AntideBuff,Self,1,15 -700010,HP 비례 데미지,Normal,Attack,HPProportionDamage,Enemy,1,15 \ No newline at end of file +700007,집중,Normal,Buff,Buff,Self,1,15 +700008,더블 어택,Normal,Attack,BlowAttack,Enemy,1,15 +700009,디버프 제거,Normal,Buff,Buff,Self,1,15 +700010,HP 비례 데미지,Normal,Attack,BlowAttack,Enemy,1,15 \ No newline at end of file diff --git a/Lib9c/TableCSV/Skill/StatBuffSheet.csv b/Lib9c/TableCSV/Skill/StatBuffSheet.csv index 457c1311fa..1d9a200585 100644 --- a/Lib9c/TableCSV/Skill/StatBuffSheet.csv +++ b/Lib9c/TableCSV/Skill/StatBuffSheet.csv @@ -122,5 +122,5 @@ id,group,_name,chance,duration,target_type,stat_type,modify_type,modify_value,is 701000,701000,DRV (Rune),100,0,Self,DRV,Add,0,true 702000,701000,DRR (Rune),100,0,Self,DRR,Add,0,true 703000,703000,CDMG (Rune),100,0,Self,CDMG,Add,0,true -704000,704000,집중,100,10,Self,AttackHIT,Add,100,true -705000,705000,디버프 제거,100,5,Self,AntideBuff,Add,100,true \ No newline at end of file +704000,704000,집중,100,10,Self,CDMG,Add,100,true +705000,705000,디버프 제거,100,5,Self,CDMG,Add,100,true \ No newline at end of file From b14e3cdce5427da06efd3c781bdb10ffefa32b37 Mon Sep 17 00:00:00 2001 From: hyeon Date: Wed, 14 Feb 2024 11:24:37 +0900 Subject: [PATCH 03/78] Add Focus buff skill --- Lib9c/Model/Buff/Focus.cs | 28 ++++++++++++++++++++++++++ Lib9c/Model/Character/CharacterBase.cs | 5 +++++ Lib9c/Model/Skill/SkillCategory.cs | 1 + 3 files changed, 34 insertions(+) create mode 100644 Lib9c/Model/Buff/Focus.cs diff --git a/Lib9c/Model/Buff/Focus.cs b/Lib9c/Model/Buff/Focus.cs new file mode 100644 index 0000000000..bc1aaf523e --- /dev/null +++ b/Lib9c/Model/Buff/Focus.cs @@ -0,0 +1,28 @@ +using System; +using Nekoyume.Model.Skill; +using Nekoyume.TableData; + +namespace Nekoyume.Model.Buff +{ + [Serializable] + public class Focus : ActionBuff + { + public Focus(ActionBuffSheet.Row row) : base(row) + { + } + + public Focus(SkillCustomField customField, ActionBuffSheet.Row row) : + base(customField, row) + { + } + + protected Focus(Focus value) : base(value) + { + } + + public override object Clone() + { + return new Focus(this); + } + } +} diff --git a/Lib9c/Model/Character/CharacterBase.cs b/Lib9c/Model/Character/CharacterBase.cs index 8f899fd5da..e2e47ef863 100644 --- a/Lib9c/Model/Character/CharacterBase.cs +++ b/Lib9c/Model/Character/CharacterBase.cs @@ -437,6 +437,11 @@ public bool IsHit(ElementalResult result) public virtual bool IsHit(CharacterBase caster) { + if (caster.Buffs.Values.Any(buff => buff is Focus)) + { + return true; + } + var isHit = HitHelper.IsHit(caster.Level, caster.HIT, Level, HIT, Simulator.Random.Next(0, 100)); if (!isHit) { diff --git a/Lib9c/Model/Skill/SkillCategory.cs b/Lib9c/Model/Skill/SkillCategory.cs index 617be7d1cc..62fe414dcb 100644 --- a/Lib9c/Model/Skill/SkillCategory.cs +++ b/Lib9c/Model/Skill/SkillCategory.cs @@ -22,5 +22,6 @@ public enum SkillCategory Buff, Debuff, TickDamage, + Focus, // Always hit enemy. } } From 0c5531ea5b0018272fa6b94619b908d3cd73a08c Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 15 Feb 2024 15:04:34 +0900 Subject: [PATCH 04/78] Add Focus to BuffType, BuffFactory --- Lib9c/Model/Buff/BuffFactory.cs | 4 ++++ Lib9c/Model/Skill/ActionBuffType.cs | 1 + 2 files changed, 5 insertions(+) diff --git a/Lib9c/Model/Buff/BuffFactory.cs b/Lib9c/Model/Buff/BuffFactory.cs index 4435e32298..17586b1f0c 100644 --- a/Lib9c/Model/Buff/BuffFactory.cs +++ b/Lib9c/Model/Buff/BuffFactory.cs @@ -29,6 +29,8 @@ public static ActionBuff GetActionBuff(Stats stat, ActionBuffSheet.Row row) return new Stun(row); case ActionBuffType.Vampiric: return new Vampiric(row, 0); + case ActionBuffType.Focus: + return new Focus(row); default: throw new ArgumentOutOfRangeException(); } @@ -44,6 +46,8 @@ public static ActionBuff GetCustomActionBuff(SkillCustomField customField, Actio return new Stun(customField, row); case ActionBuffType.Vampiric: return new Vampiric(customField, row); + case ActionBuffType.Focus: + return new Focus(customField, row); default: throw new ArgumentOutOfRangeException(); } diff --git a/Lib9c/Model/Skill/ActionBuffType.cs b/Lib9c/Model/Skill/ActionBuffType.cs index 64662ef89b..de4238457c 100644 --- a/Lib9c/Model/Skill/ActionBuffType.cs +++ b/Lib9c/Model/Skill/ActionBuffType.cs @@ -6,5 +6,6 @@ public enum ActionBuffType Bleed, Stun, Vampiric, + Focus, } } From bc6ffffba33c90c8c4d1ae6ec2c73b4bb16143b7 Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 15 Feb 2024 15:05:26 +0900 Subject: [PATCH 05/78] Add ActionBuff data: Focus --- Lib9c/TableCSV/Skill/ActionBuffSheet.csv | 3 ++- Lib9c/TableCSV/Skill/SkillActionBuffSheet.csv | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Lib9c/TableCSV/Skill/ActionBuffSheet.csv b/Lib9c/TableCSV/Skill/ActionBuffSheet.csv index 29df06c98c..2a32f7a41d 100644 --- a/Lib9c/TableCSV/Skill/ActionBuffSheet.csv +++ b/Lib9c/TableCSV/Skill/ActionBuffSheet.csv @@ -5,4 +5,5 @@ id,group,_name,chance,duration,target_type,buff_type,elemental_type,atk_power_ra 600001,600001,출혈,100,0,Enemies,Bleed,Normal,1 704000,704000,기절,100,0,Enemy,Stun,Normal,0 704001,704000,기절,100,0,Enemies,Stun,Normal,0 -705000,705000,흡혈,100,0,Self,Vampiric,Normal,0 \ No newline at end of file +705000,705000,흡혈,100,0,Self,Vampiric,Normal,0 +706000,706000,집중,100,0,Self,Focus,Normal,0 diff --git a/Lib9c/TableCSV/Skill/SkillActionBuffSheet.csv b/Lib9c/TableCSV/Skill/SkillActionBuffSheet.csv index 61cbe24420..bf669c50d3 100644 --- a/Lib9c/TableCSV/Skill/SkillActionBuffSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillActionBuffSheet.csv @@ -5,4 +5,5 @@ skill_id,buff_id 600001,600001 700004,704000 700005,704001 -700006,705000 \ No newline at end of file +700006,705000 +700007,706000 From c802087aab4a7329952e68a447061af0b5f04ef7 Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 15 Feb 2024 15:06:10 +0900 Subject: [PATCH 06/78] Find Focus from ActionBuffs --- Lib9c/Model/Character/CharacterBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib9c/Model/Character/CharacterBase.cs b/Lib9c/Model/Character/CharacterBase.cs index e2e47ef863..9e5f7d588f 100644 --- a/Lib9c/Model/Character/CharacterBase.cs +++ b/Lib9c/Model/Character/CharacterBase.cs @@ -437,7 +437,7 @@ public bool IsHit(ElementalResult result) public virtual bool IsHit(CharacterBase caster) { - if (caster.Buffs.Values.Any(buff => buff is Focus)) + if (caster.ActionBuffs.Any(buff => buff is Focus)) { return true; } From 57dc21c59d6bc954e89375382a803a5e4f7166ac Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 15 Feb 2024 15:06:42 +0900 Subject: [PATCH 07/78] Move _tableSheets to class meber for later use --- .Lib9c.Tests/Model/Skill/NormalAttackTest.cs | 27 ++++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/.Lib9c.Tests/Model/Skill/NormalAttackTest.cs b/.Lib9c.Tests/Model/Skill/NormalAttackTest.cs index bf73f2aa14..877a599be7 100644 --- a/.Lib9c.Tests/Model/Skill/NormalAttackTest.cs +++ b/.Lib9c.Tests/Model/Skill/NormalAttackTest.cs @@ -17,6 +17,8 @@ namespace Lib9c.Tests.Model.Skill public class NormalAttackTest { + private readonly TableSheets _tableSheets = new (TableSheetsImporter.ImportSheets()); + public NormalAttackTest(ITestOutputHelper outputHelper) { Log.Logger = new LoggerConfiguration() @@ -30,21 +32,18 @@ public NormalAttackTest(ITestOutputHelper outputHelper) [InlineData(false)] public void Use(bool copyCharacter) { - var sheets = TableSheetsImporter.ImportSheets(); - var tableSheets = new TableSheets(sheets); - - Assert.True(tableSheets.SkillSheet.TryGetValue(100000, out var skillRow)); + Assert.True(_tableSheets.SkillSheet.TryGetValue(100000, out var skillRow)); var normalAttack = new NormalAttack(skillRow, 100, 100, default, StatType.NONE); var avatarState = new AvatarState( new PrivateKey().Address, new PrivateKey().Address, 0, - tableSheets.GetAvatarSheets(), + _tableSheets.GetAvatarSheets(), new GameConfigState(), new PrivateKey().Address); - var worldRow = tableSheets.WorldSheet.First; + var worldRow = _tableSheets.WorldSheet.First; Assert.NotNull(worldRow); var random = new TestRandom(); @@ -56,22 +55,22 @@ public void Use(bool copyCharacter) new List(), 1, 1, - tableSheets.StageSheet[1], - tableSheets.StageWaveSheet[1], + _tableSheets.StageSheet[1], + _tableSheets.StageWaveSheet[1], false, 20, - tableSheets.GetSimulatorSheets(), - tableSheets.EnemySkillSheet, - tableSheets.CostumeStatSheet, + _tableSheets.GetSimulatorSheets(), + _tableSheets.EnemySkillSheet, + _tableSheets.CostumeStatSheet, StageSimulator.GetWaveRewards( random, - tableSheets.StageSheet[1], - tableSheets.MaterialItemSheet), + _tableSheets.StageSheet[1], + _tableSheets.MaterialItemSheet), copyCharacter ); var player = new Player(avatarState, simulator); - var enemyRow = tableSheets.CharacterSheet.OrderedList + var enemyRow = _tableSheets.CharacterSheet.OrderedList .FirstOrDefault(e => e.Id > 200000); Assert.NotNull(enemyRow); From 3945aef018fccad2c8f3ac3c122f1d81e1cce276 Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 15 Feb 2024 15:06:55 +0900 Subject: [PATCH 08/78] Add Focus buff test --- .Lib9c.Tests/Model/Skill/NormalAttackTest.cs | 109 +++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/.Lib9c.Tests/Model/Skill/NormalAttackTest.cs b/.Lib9c.Tests/Model/Skill/NormalAttackTest.cs index 877a599be7..f866ff91b7 100644 --- a/.Lib9c.Tests/Model/Skill/NormalAttackTest.cs +++ b/.Lib9c.Tests/Model/Skill/NormalAttackTest.cs @@ -88,5 +88,114 @@ public void Use(bool copyCharacter) Assert.Equal(enemy.Id, skillInfo.CharacterId); Assert.Equal(!copyCharacter, skillInfo.Target is null); } + + [Fact] + public void FocusSkill() + { + const int seed = 10; // This seed fails to attack enemy with NormalAttack + + // Without Focus buff + Assert.True(_tableSheets.SkillSheet.TryGetValue(100000, out var skillRow)); + // Set chance to 0 to minimize attack success probability + var normalAttack = new NormalAttack(skillRow, 100, 0, default, StatType.NONE); + + var avatarState = new AvatarState( + new PrivateKey().Address, + new PrivateKey().Address, + 0, + _tableSheets.GetAvatarSheets(), + new GameConfigState(), + new PrivateKey().Address); + + var worldRow = _tableSheets.WorldSheet.First; + Assert.NotNull(worldRow); + + var simulator = new StageSimulator( + new TestRandom(seed), + avatarState, + new List(), + null, + new List(), + 1, + 1, + _tableSheets.StageSheet[1], + _tableSheets.StageWaveSheet[1], + false, + 20, + _tableSheets.GetSimulatorSheets(), + _tableSheets.EnemySkillSheet, + _tableSheets.CostumeStatSheet, + StageSimulator.GetWaveRewards( + new TestRandom(seed), + _tableSheets.StageSheet[1], + _tableSheets.MaterialItemSheet) + ); + var player = new Player(avatarState, simulator); + + var enemyRow = _tableSheets.CharacterSheet.OrderedList + .FirstOrDefault(e => e.Id > 200000); + Assert.NotNull(enemyRow); + + var enemy = new Enemy(player, enemyRow, 1); + + player.Targets.Add(enemy); + var battleStatusSkill = normalAttack.Use( + player, + 0, + new List(), + true + ); + Assert.NotNull(battleStatusSkill); + Assert.Equal(0, player.AttackCount); + + // With Focus buff + avatarState = new AvatarState( + new PrivateKey().Address, + new PrivateKey().Address, + 0, + _tableSheets.GetAvatarSheets(), + new GameConfigState(), + new PrivateKey().Address); + + simulator = new StageSimulator( + new TestRandom(seed), + avatarState, + new List(), + null, + new List(), + 1, + 1, + _tableSheets.StageSheet[1], + _tableSheets.StageWaveSheet[1], + false, + 20, + _tableSheets.GetSimulatorSheets(), + _tableSheets.EnemySkillSheet, + _tableSheets.CostumeStatSheet, + StageSimulator.GetWaveRewards( + new TestRandom(seed), + _tableSheets.StageSheet[1], + _tableSheets.MaterialItemSheet) + ); + player = new Player(avatarState, simulator); + player.AddBuff(new Focus(_tableSheets.ActionBuffSheet.OrderedList.First(s => s.ActionBuffType == ActionBuffType.Focus))); + Assert.Single(player.ActionBuffs); + + enemyRow = _tableSheets.CharacterSheet.OrderedList + .FirstOrDefault(e => e.Id > 200000); + Assert.NotNull(enemyRow); + + enemy = new Enemy(player, enemyRow, 1); + + player.Targets.Add(enemy); + battleStatusSkill = normalAttack.Use( + player, + 0, + new List(), + true + ); + Assert.NotNull(battleStatusSkill); + Assert.Equal(1, player.AttackCount); + } } } From ab81272619970098954f2d1e7fa4b2cd4c829e2f Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 20 Feb 2024 11:06:37 +0900 Subject: [PATCH 09/78] Change unlock stage of new items to make test pass --- .../Item/EquipmentItemRecipeSheet.csv | 272 +++++++++--------- 1 file changed, 136 insertions(+), 136 deletions(-) diff --git a/Lib9c/TableCSV/Item/EquipmentItemRecipeSheet.csv b/Lib9c/TableCSV/Item/EquipmentItemRecipeSheet.csv index 240eeb6ff5..254bf4e082 100644 --- a/Lib9c/TableCSV/Item/EquipmentItemRecipeSheet.csv +++ b/Lib9c/TableCSV/Item/EquipmentItemRecipeSheet.csv @@ -1,136 +1,136 @@ -id,result_equipment_id,material_id,material_count,required_action_point,required_gold,required_block_index,unlock_stage,sub_recipe_id,sub_recipe_id_2,sub_recipe_id_3,required_crystal,item_sub_type -1,10110000,303000,2,0,0,5,3,373,374,,0,Weapon -5,10114000,303000,12,0,0,477,99,10,11,,64,Weapon -6,10120000,303001,4,0,0,37,27,376,377,,8,Weapon -10,10124000,303001,24,0,0,7155,174,22,23,,22560,Weapon -14,10133000,303002,27,0,0,9807,190,31,32,,41040,Weapon -15,10134000,303002,47,0,0,11585,204,34,35,,167040,Weapon -18,10132001,303002,21,0,0,5190,154,40,41,,32040,Weapon -19,10133001,303002,61,0,0,18050,220,43,44,,216180,Weapon -20,10134001,303002,73,0,0,24302,236,46,47,,495900,Weapon -21,10140000,303003,250,0,0,25000,299,101400001,101400002,,1404000,Weapon -22,10141000,303003,120,0,0,10000,255,101410001,101410002,,1532100,Weapon -23,10142000,303003,120,0,0,14000,265,101420001,101420002,,1532100,Weapon -24,10143000,303003,180,0,0,18000,277,101430001,101430002,,1532100,Weapon -25,10144000,303003,180,0,0,22000,290,101440001,101440002,,1532100,Weapon -26,10150000,303004,360,0,0,3000,330,101500001,101500002,,500000,Weapon -27,10151000,303004,360,0,0,3000,305,101510001,101510002,,500000,Weapon -28,10152000,303004,360,0,0,3000,305,101520001,101520002,101520003,500000,Weapon -29,10153000,303004,360,0,0,3000,330,101530001,101530002,,500000,Weapon -30,10154000,303004,360,0,0,3000,330,101540001,101540002,101540003,500000,Weapon -43,10211000,303100,2,0,0,5,13,97,98,,2,Armor -46,10214000,303100,14,0,0,1076,108,106,107,,742,Armor -49,10222000,303101,7,0,0,120,45,112,113,,11,Armor -51,10224000,303101,26,0,0,8361,182,118,119,,23920,Armor -55,10233000,303102,40,0,0,10426,201,127,128,,140400,Armor -56,10234000,303102,52,0,0,13991,208,130,131,,182520,Armor -57,10230001,303102,20,0,0,1824,146,409,410,,9600,Armor -58,10231001,303102,22,0,0,5463,158,133,134,,33000,Armor -59,10232001,303102,23,0,0,6189,166,136,137,,35040,Armor -60,10233001,303102,67,0,0,11056,228,139,140,,455400,Armor -62,10240000,303103,250,0,0,25000,294,102400001,102400002,,1166700,Armor -63,10241000,303103,120,0,0,10000,261,102410001,102410002,,1173660,Armor -64,10242000,303103,120,0,0,14000,270,102420001,102420002,,1188720,Armor -65,10243000,303103,180,0,0,18000,280,102430001,102430002,,1345500,Armor -66,10244000,303103,180,0,0,22000,287,102440001,102440002,,1345500,Armor -67,10250001,303104,360,0,0,3000,335,102500011,102500012,,500000,Armor -68,10251001,303104,360,0,0,3000,315,102510011,102510012,,500000,Armor -69,10252001,303104,360,0,0,3000,315,102520011,102520012,102520013,1000000,Armor -70,10253001,303104,360,0,0,3000,335,102530011,102530012,,1000000,Armor -71,10254001,303104,360,0,0,3000,335,102540011,102540012,102540013,1000000,Armor -87,10314000,303200,18,0,0,1560,134,202,203,,954,Belt -91,10323000,303201,22,0,0,5796,162,211,212,,2992,Belt -92,10324000,303201,45,0,0,10472,203,214,215,,122220,Belt -94,10331000,303202,11,0,0,410,90,217,218,,387,Belt -97,10334000,303202,150,0,0,20000,251,226,227,,737100,Belt -101,10343000,303203,76,0,0,26015,240,235,236,,1128600,Belt -103,10350000,303203,250,0,0,25000,296,103500001,103500002,,4177800,Belt -104,10351000,303203,120,0,0,10000,260,103510001,103510002,,4347000,Belt -105,10352000,303203,120,0,0,14000,269,103520001,103520002,,4395600,Belt -106,10353000,303203,180,0,0,18000,278,103530001,103530002,,4441500,Belt -107,10354000,303203,180,0,0,22000,287,103540001,103540002,,4638900,Belt -111,10413000,303300,15,0,0,368,84,259,260,,32,Necklace -116,10423000,303301,25,0,0,7728,178,271,272,,3472,Necklace -117,10424000,303301,150,0,0,13419,202,274,275,,116880,Necklace -121,10433000,303302,55,0,0,15284,212,283,284,,195120,Necklace -122,10434000,303302,70,0,0,22649,232,286,287,,472500,Necklace -123,10440000,303303,77,0,0,9093,249,451,452,,729000,Necklace -128,10450000,303303,250,0,0,25000,293,104500001,104500002,,4361400,Necklace -129,10451000,303303,120,0,0,10000,255,104510001,104510002,,4536000,Necklace -130,10452000,303303,120,0,0,14000,264,104520001,104520002,,4584600,Necklace -131,10453000,303303,180,0,0,18000,274,104530001,104530002,,4630500,Necklace -132,10454000,303303,180,0,0,22000,284,104540001,104540002,,4889100,Necklace -133,10510000,303400,2,0,0,5,17,457,458,,1,Ring -137,10514000,303400,24,0,0,6642,170,322,323,,2544,Ring -139,10521000,303401,9,0,0,195,57,325,326,,22,Ring -141,10523000,303401,28,0,0,10493,198,331,332,,3808,Ring -142,10524000,303401,49,0,0,12758,205,334,335,,132900,Ring -144,10531000,303402,16,0,0,1278,120,337,338,,5568,Ring -146,10533000,303402,64,0,0,19523,224,343,344,,748800,Ring -147,10534000,303402,76,0,0,26075,243,346,347,,889200,Ring -148,10540000,303403,250,0,0,25000,298,105400001,105400002,,1170000,Ring -149,10541000,303403,120,0,0,10000,258,105410001,105410002,,1160400,Ring -150,10542000,303403,120,0,0,14000,268,105420001,105420002,,1160760,Ring -151,10543000,303403,180,0,0,18000,275,105430001,105430002,,1340700,Ring -152,10544000,303403,180,0,0,22000,285,105440001,105440002,,1340700,Ring -153,10550000,303404,360,0,0,3000,340,105500001,105500002,,500000,Ring -154,10551000,303404,360,0,0,3000,325,105510001,105510002,,500000,Ring -155,10552000,303404,360,0,0,3000,325,105520001,105520002,105520003,1000000,Ring -156,10553000,303404,360,0,0,3000,340,105530001,105530002,,1000000,Ring -157,10554000,303404,360,0,0,3000,340,105540001,105540002,105540003,1000000,Ring -158,12001001,600101,100,0,0,10,999,120010011,120010012,,0,Belt -159,12001002,600101,100,0,0,10,999,120010021,120010022,,0,Necklace -160,12001003,600101,50,0,0,10,999,120010031,120010032,,0,Ring -161,10350001,303204,360,0,0,3000,330,103500011,103500012,,500000,Belt -162,10351001,303204,360,0,0,3000,310,103510011,103510012,,500000,Belt -163,10352001,303204,360,0,0,3000,310,103520011,103520012,103520013,1000000,Belt -164,10353001,303204,360,0,0,3000,330,103530011,103530012,,1000000,Belt -165,10354001,303204,360,0,0,3000,330,103540011,103540012,103540013,1000000,Belt -166,10450001,303304,360,0,0,3000,335,104500011,104500012,,500000,Necklace -167,10451001,303304,360,0,0,3000,320,104510011,104510012,,500000,Necklace -168,10452001,303304,360,0,0,3000,320,104520011,104520012,104520013,1000000,Necklace -169,10453001,303304,360,0,0,3000,335,104530011,104530012,,1000000,Necklace -170,10454001,303304,360,0,0,3000,335,104540011,104540012,104540013,1000000,Necklace -171,10610000,0,0,0,0,10000000,999,106100001,,,0,Aura -172,10620000,0,0,0,0,10000000,999,106200001,,,0,Aura -173,10630000,0,0,0,0,10000000,999,106300001,,,0,Aura -174,10620001,0,0,0,0,10000000,999,106200011,,,0,Aura -175,10630001,0,0,0,0,10000000,999,106300011,,,0,Aura -176,10640001,0,0,0,0,10000000,999,106400011,,,0,Aura -177,10650001,0,0,0,0,10000000,999,106500011,,,0,Aura -178,10650002,0,0,0,0,10000000,999,106500021,,,0,Aura -179,10620002,0,0,0,0,10000000,999,106200021,,,0,Aura -180,10630002,0,0,0,0,10000000,999,106300021,,,0,Aura -181,10640002,0,0,0,0,10000000,999,106400021,,,0,Aura -182,10650003,0,0,0,0,10000000,999,106500031,,,0,Aura -183,10650004,0,0,0,0,10000000,999,106500041,,,0,Aura -184,10620003,0,0,0,0,10000000,999,106200031,,,0,Aura -185,10630003,0,0,0,0,10000000,999,106300031,,,0,Aura -186,10640003,0,0,0,0,10000000,999,106400031,,,0,Aura -187,10650005,0,0,0,0,10000000,999,106500051,,,0,Aura -188,10650006,0,0,0,0,10000000,999,106500061,,,0,Aura -189,10150001,303000,1,0,0,5,1,101500011,101500012,,1,Weapon -190,10151001,303000,1,0,0,5,1,101510011,101510012,,1,Weapon -191,10152001,303000,1,0,0,5,1,101520011,101520012,,1,Weapon -192,10153001,303000,1,0,0,5,1,101530011,101530012,,1,Weapon -193,10154001,303000,1,0,0,5,1,101540011,101540012,,1,Weapon -194,10250000,303000,1,0,0,5,1,102500001,102500002,,1,Armor -195,10251000,303000,1,0,0,5,1,102510001,102510002,,1,Armor -196,10252000,303000,1,0,0,5,1,102520001,102520002,,1,Armor -197,10253000,303000,1,0,0,5,1,102530001,102530002,,1,Armor -198,10254000,303000,1,0,0,5,1,102540001,102540002,,1,Armor -199,10350002,303000,1,0,0,5,1,103500021,103500022,,1,Belt -200,10351002,303000,1,0,0,5,1,103510021,103510022,,1,Belt -201,10352002,303000,1,0,0,5,1,103520021,103520022,,1,Belt -202,10353002,303000,1,0,0,5,1,103530021,103530022,,1,Belt -203,10354002,303000,1,0,0,5,1,103540021,103540022,,1,Belt -204,10450002,303000,1,0,0,5,1,104500021,104500022,,1,Necklace -205,10451002,303000,1,0,0,5,1,104510021,104510022,,1,Necklace -206,10452002,303000,1,0,0,5,1,104520021,104520022,,1,Necklace -207,10453002,303000,1,0,0,5,1,104530021,104530022,,1,Necklace -208,10454002,303000,1,0,0,5,1,104540021,104540022,,1,Necklace -209,10550001,303000,1,0,0,5,1,105500011,105500012,,1,Ring -210,10551001,303000,1,0,0,5,1,105510011,105510012,,1,Ring -211,10552001,303000,1,0,0,5,1,105520011,105520012,,1,Ring -212,10553001,303000,1,0,0,5,1,105530011,105530012,,1,Ring -213,10554001,303000,1,0,0,5,1,105540011,105540012,,1,Ring \ No newline at end of file +id,result_equipment_id,material_id,material_count,required_action_point,required_gold,required_block_index,unlock_stage,sub_recipe_id,sub_recipe_id_2,sub_recipe_id_3,required_crystal,item_sub_type +1,10110000,303000,2,0,0,5,3,373,374,,0,Weapon +5,10114000,303000,12,0,0,477,99,10,11,,64,Weapon +6,10120000,303001,4,0,0,37,27,376,377,,8,Weapon +10,10124000,303001,24,0,0,7155,174,22,23,,22560,Weapon +14,10133000,303002,27,0,0,9807,190,31,32,,41040,Weapon +15,10134000,303002,47,0,0,11585,204,34,35,,167040,Weapon +18,10132001,303002,21,0,0,5190,154,40,41,,32040,Weapon +19,10133001,303002,61,0,0,18050,220,43,44,,216180,Weapon +20,10134001,303002,73,0,0,24302,236,46,47,,495900,Weapon +21,10140000,303003,250,0,0,25000,299,101400001,101400002,,1404000,Weapon +22,10141000,303003,120,0,0,10000,255,101410001,101410002,,1532100,Weapon +23,10142000,303003,120,0,0,14000,265,101420001,101420002,,1532100,Weapon +24,10143000,303003,180,0,0,18000,277,101430001,101430002,,1532100,Weapon +25,10144000,303003,180,0,0,22000,290,101440001,101440002,,1532100,Weapon +26,10150000,303004,360,0,0,3000,330,101500001,101500002,,500000,Weapon +27,10151000,303004,360,0,0,3000,305,101510001,101510002,,500000,Weapon +28,10152000,303004,360,0,0,3000,305,101520001,101520002,101520003,500000,Weapon +29,10153000,303004,360,0,0,3000,330,101530001,101530002,,500000,Weapon +30,10154000,303004,360,0,0,3000,330,101540001,101540002,101540003,500000,Weapon +43,10211000,303100,2,0,0,5,13,97,98,,2,Armor +46,10214000,303100,14,0,0,1076,108,106,107,,742,Armor +49,10222000,303101,7,0,0,120,45,112,113,,11,Armor +51,10224000,303101,26,0,0,8361,182,118,119,,23920,Armor +55,10233000,303102,40,0,0,10426,201,127,128,,140400,Armor +56,10234000,303102,52,0,0,13991,208,130,131,,182520,Armor +57,10230001,303102,20,0,0,1824,146,409,410,,9600,Armor +58,10231001,303102,22,0,0,5463,158,133,134,,33000,Armor +59,10232001,303102,23,0,0,6189,166,136,137,,35040,Armor +60,10233001,303102,67,0,0,11056,228,139,140,,455400,Armor +62,10240000,303103,250,0,0,25000,294,102400001,102400002,,1166700,Armor +63,10241000,303103,120,0,0,10000,261,102410001,102410002,,1173660,Armor +64,10242000,303103,120,0,0,14000,270,102420001,102420002,,1188720,Armor +65,10243000,303103,180,0,0,18000,280,102430001,102430002,,1345500,Armor +66,10244000,303103,180,0,0,22000,287,102440001,102440002,,1345500,Armor +67,10250001,303104,360,0,0,3000,335,102500011,102500012,,500000,Armor +68,10251001,303104,360,0,0,3000,315,102510011,102510012,,500000,Armor +69,10252001,303104,360,0,0,3000,315,102520011,102520012,102520013,1000000,Armor +70,10253001,303104,360,0,0,3000,335,102530011,102530012,,1000000,Armor +71,10254001,303104,360,0,0,3000,335,102540011,102540012,102540013,1000000,Armor +87,10314000,303200,18,0,0,1560,134,202,203,,954,Belt +91,10323000,303201,22,0,0,5796,162,211,212,,2992,Belt +92,10324000,303201,45,0,0,10472,203,214,215,,122220,Belt +94,10331000,303202,11,0,0,410,90,217,218,,387,Belt +97,10334000,303202,150,0,0,20000,251,226,227,,737100,Belt +101,10343000,303203,76,0,0,26015,240,235,236,,1128600,Belt +103,10350000,303203,250,0,0,25000,296,103500001,103500002,,4177800,Belt +104,10351000,303203,120,0,0,10000,260,103510001,103510002,,4347000,Belt +105,10352000,303203,120,0,0,14000,269,103520001,103520002,,4395600,Belt +106,10353000,303203,180,0,0,18000,278,103530001,103530002,,4441500,Belt +107,10354000,303203,180,0,0,22000,287,103540001,103540002,,4638900,Belt +111,10413000,303300,15,0,0,368,84,259,260,,32,Necklace +116,10423000,303301,25,0,0,7728,178,271,272,,3472,Necklace +117,10424000,303301,150,0,0,13419,202,274,275,,116880,Necklace +121,10433000,303302,55,0,0,15284,212,283,284,,195120,Necklace +122,10434000,303302,70,0,0,22649,232,286,287,,472500,Necklace +123,10440000,303303,77,0,0,9093,249,451,452,,729000,Necklace +128,10450000,303303,250,0,0,25000,293,104500001,104500002,,4361400,Necklace +129,10451000,303303,120,0,0,10000,255,104510001,104510002,,4536000,Necklace +130,10452000,303303,120,0,0,14000,264,104520001,104520002,,4584600,Necklace +131,10453000,303303,180,0,0,18000,274,104530001,104530002,,4630500,Necklace +132,10454000,303303,180,0,0,22000,284,104540001,104540002,,4889100,Necklace +133,10510000,303400,2,0,0,5,17,457,458,,1,Ring +137,10514000,303400,24,0,0,6642,170,322,323,,2544,Ring +139,10521000,303401,9,0,0,195,57,325,326,,22,Ring +141,10523000,303401,28,0,0,10493,198,331,332,,3808,Ring +142,10524000,303401,49,0,0,12758,205,334,335,,132900,Ring +144,10531000,303402,16,0,0,1278,120,337,338,,5568,Ring +146,10533000,303402,64,0,0,19523,224,343,344,,748800,Ring +147,10534000,303402,76,0,0,26075,243,346,347,,889200,Ring +148,10540000,303403,250,0,0,25000,298,105400001,105400002,,1170000,Ring +149,10541000,303403,120,0,0,10000,258,105410001,105410002,,1160400,Ring +150,10542000,303403,120,0,0,14000,268,105420001,105420002,,1160760,Ring +151,10543000,303403,180,0,0,18000,275,105430001,105430002,,1340700,Ring +152,10544000,303403,180,0,0,22000,285,105440001,105440002,,1340700,Ring +153,10550000,303404,360,0,0,3000,340,105500001,105500002,,500000,Ring +154,10551000,303404,360,0,0,3000,325,105510001,105510002,,500000,Ring +155,10552000,303404,360,0,0,3000,325,105520001,105520002,105520003,1000000,Ring +156,10553000,303404,360,0,0,3000,340,105530001,105530002,,1000000,Ring +157,10554000,303404,360,0,0,3000,340,105540001,105540002,105540003,1000000,Ring +158,12001001,600101,100,0,0,10,999,120010011,120010012,,0,Belt +159,12001002,600101,100,0,0,10,999,120010021,120010022,,0,Necklace +160,12001003,600101,50,0,0,10,999,120010031,120010032,,0,Ring +161,10350001,303204,360,0,0,3000,330,103500011,103500012,,500000,Belt +162,10351001,303204,360,0,0,3000,310,103510011,103510012,,500000,Belt +163,10352001,303204,360,0,0,3000,310,103520011,103520012,103520013,1000000,Belt +164,10353001,303204,360,0,0,3000,330,103530011,103530012,,1000000,Belt +165,10354001,303204,360,0,0,3000,330,103540011,103540012,103540013,1000000,Belt +166,10450001,303304,360,0,0,3000,335,104500011,104500012,,500000,Necklace +167,10451001,303304,360,0,0,3000,320,104510011,104510012,,500000,Necklace +168,10452001,303304,360,0,0,3000,320,104520011,104520012,104520013,1000000,Necklace +169,10453001,303304,360,0,0,3000,335,104530011,104530012,,1000000,Necklace +170,10454001,303304,360,0,0,3000,335,104540011,104540012,104540013,1000000,Necklace +171,10610000,0,0,0,0,10000000,999,106100001,,,0,Aura +172,10620000,0,0,0,0,10000000,999,106200001,,,0,Aura +173,10630000,0,0,0,0,10000000,999,106300001,,,0,Aura +174,10620001,0,0,0,0,10000000,999,106200011,,,0,Aura +175,10630001,0,0,0,0,10000000,999,106300011,,,0,Aura +176,10640001,0,0,0,0,10000000,999,106400011,,,0,Aura +177,10650001,0,0,0,0,10000000,999,106500011,,,0,Aura +178,10650002,0,0,0,0,10000000,999,106500021,,,0,Aura +179,10620002,0,0,0,0,10000000,999,106200021,,,0,Aura +180,10630002,0,0,0,0,10000000,999,106300021,,,0,Aura +181,10640002,0,0,0,0,10000000,999,106400021,,,0,Aura +182,10650003,0,0,0,0,10000000,999,106500031,,,0,Aura +183,10650004,0,0,0,0,10000000,999,106500041,,,0,Aura +184,10620003,0,0,0,0,10000000,999,106200031,,,0,Aura +185,10630003,0,0,0,0,10000000,999,106300031,,,0,Aura +186,10640003,0,0,0,0,10000000,999,106400031,,,0,Aura +187,10650005,0,0,0,0,10000000,999,106500051,,,0,Aura +188,10650006,0,0,0,0,10000000,999,106500061,,,0,Aura +189,10150001,303000,1,0,0,5,390,101500011,101500012,,1,Weapon +190,10151001,303000,1,0,0,5,360,101510011,101510012,,1,Weapon +191,10152001,303000,1,0,0,5,360,101520011,101520012,,1,Weapon +192,10153001,303000,1,0,0,5,375,101530011,101530012,,1,Weapon +193,10154001,303000,1,0,0,5,375,101540011,101540012,,1,Weapon +194,10250000,303000,1,0,0,5,390,102500001,102500002,,1,Armor +195,10251000,303000,1,0,0,5,360,102510001,102510002,,1,Armor +196,10252000,303000,1,0,0,5,360,102520001,102520002,,1,Armor +197,10253000,303000,1,0,0,5,375,102530001,102530002,,1,Armor +198,10254000,303000,1,0,0,5,375,102540001,102540002,,1,Armor +199,10350002,303000,1,0,0,5,390,103500021,103500022,,1,Belt +200,10351002,303000,1,0,0,5,360,103510021,103510022,,1,Belt +201,10352002,303000,1,0,0,5,360,103520021,103520022,,1,Belt +202,10353002,303000,1,0,0,5,375,103530021,103530022,,1,Belt +203,10354002,303000,1,0,0,5,375,103540021,103540022,,1,Belt +204,10450002,303000,1,0,0,5,390,104500021,104500022,,1,Necklace +205,10451002,303000,1,0,0,5,360,104510021,104510022,,1,Necklace +206,10452002,303000,1,0,0,5,360,104520021,104520022,,1,Necklace +207,10453002,303000,1,0,0,5,375,104530021,104530022,,1,Necklace +208,10454002,303000,1,0,0,5,375,104540021,104540022,,1,Necklace +209,10550001,303000,1,0,0,5,390,105500011,105500012,,1,Ring +210,10551001,303000,1,0,0,5,360,105510011,105510012,,1,Ring +211,10552001,303000,1,0,0,5,360,105520011,105520012,,1,Ring +212,10553001,303000,1,0,0,5,375,105530011,105530012,,1,Ring +213,10554001,303000,1,0,0,5,375,105540011,105540012,,1,Ring \ No newline at end of file From 8a50bc75d4992c59207f4307712bf3657aac7166 Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 20 Feb 2024 11:07:09 +0900 Subject: [PATCH 10/78] Add unlock stage comment to check test condition --- .Lib9c.Tests/Action/UnlockEquipmentRecipeTest.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.Lib9c.Tests/Action/UnlockEquipmentRecipeTest.cs b/.Lib9c.Tests/Action/UnlockEquipmentRecipeTest.cs index b9df75da54..033480fc19 100644 --- a/.Lib9c.Tests/Action/UnlockEquipmentRecipeTest.cs +++ b/.Lib9c.Tests/Action/UnlockEquipmentRecipeTest.cs @@ -60,6 +60,10 @@ public UnlockEquipmentRecipeTest() } [Theory] + // Recipe 5 unlocks at stage 99 + // Recipe 6 unlocks at stage 27 + // Recipe 94 unlocks at stage 90 + // Recipe 133 unlocks at stage 17 [InlineData(new[] { 6, 5 }, true, false, false, true, true, null)] [InlineData(new[] { 6 }, true, false, false, true, true, null)] // Unlock Belt without Armor unlock. From 990a05e4f00a3f449adae1e62f14abd6ad3e3ec7 Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 20 Feb 2024 12:02:13 +0900 Subject: [PATCH 11/78] Ignore lint: Stage prefix of world 8 --- _typos.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/_typos.toml b/_typos.toml index d1445d382a..ace23414f7 100644 --- a/_typos.toml +++ b/_typos.toml @@ -12,6 +12,7 @@ ba = "ba" # byte array oce = "oce" # OperationCanceledException ist = "ist" # ItemSubType Equipments = "Equipments" # FIXME: Equipment is noncount word but our team doesn't have the policy about it. +Hel = "Hel" # Stage prefix of world 8 [files] extend-exclude = [ From 8fc2b2f67d1995427be60866516b79174fd6b970 Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 20 Feb 2024 17:54:11 +0900 Subject: [PATCH 12/78] Add new skill category: TwinAttack --- Lib9c/Model/Skill/SkillCategory.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib9c/Model/Skill/SkillCategory.cs b/Lib9c/Model/Skill/SkillCategory.cs index 62fe414dcb..09da57fd96 100644 --- a/Lib9c/Model/Skill/SkillCategory.cs +++ b/Lib9c/Model/Skill/SkillCategory.cs @@ -7,6 +7,7 @@ public enum SkillCategory DoubleAttack, AreaAttack, BuffRemovalAttack, + TwinAttack, Heal, From d8ffe1e4355b56f81fe8ccf9820ca87b2a59beb0 Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 20 Feb 2024 17:55:04 +0900 Subject: [PATCH 13/78] Introduce TwinAttack --- .../BattleStatus/Arena/ArenaTwinAttack.cs | 23 ++++++++++ Lib9c/Model/BattleStatus/TwinAttack.cs | 21 +++++++++ Lib9c/Model/Skill/Arena/ArenaTwinAttack.cs | 43 +++++++++++++++++++ Lib9c/Model/Skill/TwinAttack.cs | 31 +++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 Lib9c/Model/BattleStatus/Arena/ArenaTwinAttack.cs create mode 100644 Lib9c/Model/BattleStatus/TwinAttack.cs create mode 100644 Lib9c/Model/Skill/Arena/ArenaTwinAttack.cs create mode 100644 Lib9c/Model/Skill/TwinAttack.cs diff --git a/Lib9c/Model/BattleStatus/Arena/ArenaTwinAttack.cs b/Lib9c/Model/BattleStatus/Arena/ArenaTwinAttack.cs new file mode 100644 index 0000000000..d2d33f4413 --- /dev/null +++ b/Lib9c/Model/BattleStatus/Arena/ArenaTwinAttack.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Nekoyume.Model.BattleStatus.Arena +{ + [Serializable] + public class ArenaTwinAttack : ArenaSkill + { + public ArenaTwinAttack( + ArenaCharacter character, + IEnumerable skillInfos, + IEnumerable buffInfos) + : base(character, skillInfos, buffInfos) + { + } + + public override IEnumerator CoExecute(IArena arena) + { + yield return arena.CoTwinAttack(Character, SkillInfos, BuffInfos); + } + } +} diff --git a/Lib9c/Model/BattleStatus/TwinAttack.cs b/Lib9c/Model/BattleStatus/TwinAttack.cs new file mode 100644 index 0000000000..48cb885512 --- /dev/null +++ b/Lib9c/Model/BattleStatus/TwinAttack.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Nekoyume.Model.BattleStatus +{ + [Serializable] + public class TwinAttack : Skill + { + public TwinAttack + (int skillId, CharacterBase character, IEnumerable skillInfos, IEnumerable buffInfos) + : base(skillId, character, skillInfos, buffInfos) + { + } + + public override IEnumerator CoExecute(IStage stage) + { + yield return stage.CoTwinAttack(Character, SkillId, SkillInfos, BuffInfos); + } + } +} diff --git a/Lib9c/Model/Skill/Arena/ArenaTwinAttack.cs b/Lib9c/Model/Skill/Arena/ArenaTwinAttack.cs new file mode 100644 index 0000000000..8efb3c0101 --- /dev/null +++ b/Lib9c/Model/Skill/Arena/ArenaTwinAttack.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using Nekoyume.Model.Stat; +using Nekoyume.TableData; + +namespace Nekoyume.Model.Skill.Arena +{ + [Serializable] + public class ArenaTwinAttack : ArenaAttackSkill + { + public ArenaTwinAttack( + SkillSheet.Row skillRow, + long power, + int chance, + int statPowerRatio, + StatType referencedStatType) : base(skillRow, power, chance, statPowerRatio, referencedStatType) + { + } + + public override BattleStatus.Arena.ArenaSkill Use( + ArenaCharacter caster, + ArenaCharacter target, + int turn, + IEnumerable buffs) + { + var clone = (ArenaCharacter)caster.Clone(); + var damage = ProcessDamage(caster, target, turn); + var buff = ProcessBuff(caster, target, turn, buffs); + + return new BattleStatus.Arena.ArenaDoubleAttack(clone, damage, buff); + } + + [Obsolete("Use Use")] + public override BattleStatus.Arena.ArenaSkill UseV1( + ArenaCharacter caster, + ArenaCharacter target, + int turn, + IEnumerable buffs) + { + return Use(caster, target, turn, buffs); + } + } +} diff --git a/Lib9c/Model/Skill/TwinAttack.cs b/Lib9c/Model/Skill/TwinAttack.cs new file mode 100644 index 0000000000..017334a530 --- /dev/null +++ b/Lib9c/Model/Skill/TwinAttack.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using Nekoyume.Model.Stat; +using Nekoyume.TableData; + +namespace Nekoyume.Model.Skill +{ + [Serializable] + public class TwinAttack : AttackSkill + { + public TwinAttack( + SkillSheet.Row skillRow, + long power, + int chance, + int statPowerRatio, + StatType referencedStatType) : base(skillRow, power, chance, statPowerRatio, referencedStatType) + { + } + + public override BattleStatus.Skill Use(CharacterBase caster, + int simulatorWaveTurn, + IEnumerable buffs, bool copyCharacter) + { + var clone = copyCharacter ? (CharacterBase) caster.Clone() : null; + var damage = ProcessDamage(caster, simulatorWaveTurn, copyCharacter: copyCharacter); + var buff = ProcessBuff(caster, simulatorWaveTurn, buffs, copyCharacter); + + return new Model.BattleStatus.DoubleAttack(SkillRow.Id, clone, damage, buff); + } + } +} From 3a3cdecfc12b2fc9fe072a9f0d5c991ff5888202 Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 20 Feb 2024 17:55:31 +0900 Subject: [PATCH 14/78] Consider attackCount(combo) for TwinAttack skill --- Lib9c/Model/Skill/AttackSkill.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Lib9c/Model/Skill/AttackSkill.cs b/Lib9c/Model/Skill/AttackSkill.cs index 18bd604a22..bdeda11d92 100644 --- a/Lib9c/Model/Skill/AttackSkill.cs +++ b/Lib9c/Model/Skill/AttackSkill.cs @@ -69,19 +69,27 @@ protected AttackSkill( } else { + // Consider attack count: combo bonus + var considerAttackCount = + isNormalAttack + || SkillRow.SkillCategory is SkillCategory.TwinAttack; // 모션 배율 적용. - damage = caster.GetDamage(damage, isNormalAttack); + damage = caster.GetDamage( + damage, + considerAttackCount + ); // 속성 적용. damage = elementalType.GetDamage(target.defElementType, damage); // 치명 적용. - isCritical = caster.IsCritical(isNormalAttack); + isCritical = caster.IsCritical(considerAttackCount); if (isCritical) { damage = CriticalHelper.GetCriticalDamage(caster, damage); } // double attack must be shown as critical attack - isCritical |= SkillRow.SkillCategory == SkillCategory.DoubleAttack; + isCritical |= SkillRow.SkillCategory is SkillCategory.DoubleAttack + or SkillCategory.TwinAttack; } target.CurrentHP -= damage; From 0d3fd7f3b499af73d7772028adf56d7c047630a2 Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 20 Feb 2024 17:55:43 +0900 Subject: [PATCH 15/78] Create coroutine interfaces --- Lib9c/Model/IArena.cs | 1 + Lib9c/Model/IStage.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/Lib9c/Model/IArena.cs b/Lib9c/Model/IArena.cs index 71f96b6caa..b69384d202 100644 --- a/Lib9c/Model/IArena.cs +++ b/Lib9c/Model/IArena.cs @@ -11,6 +11,7 @@ public interface IArena IEnumerator CoNormalAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBlowAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoDoubleAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); + IEnumerator CoTwinAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoAreaAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBuffRemovalAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoHeal(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); diff --git a/Lib9c/Model/IStage.cs b/Lib9c/Model/IStage.cs index 4a8f6c79d5..34c728615a 100644 --- a/Lib9c/Model/IStage.cs +++ b/Lib9c/Model/IStage.cs @@ -15,6 +15,7 @@ public interface IStage IEnumerator CoNormalAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBlowAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoDoubleAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); + IEnumerator CoTwinAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoAreaAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBuffRemovalAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoHeal(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); From 9e791a3ac4436b1866964e88a6b41ce60721669b Mon Sep 17 00:00:00 2001 From: hyeon Date: Wed, 21 Feb 2024 15:47:04 +0900 Subject: [PATCH 16/78] Add TwinAttack tests --- .Lib9c.Tests/Model/Skill/TwinAttackTest.cs | 111 +++++++++++++++++++++ Lib9c/TableCSV/Skill/SkillSheet.csv | 4 +- 2 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 .Lib9c.Tests/Model/Skill/TwinAttackTest.cs diff --git a/.Lib9c.Tests/Model/Skill/TwinAttackTest.cs b/.Lib9c.Tests/Model/Skill/TwinAttackTest.cs new file mode 100644 index 0000000000..5ee5e9b2a8 --- /dev/null +++ b/.Lib9c.Tests/Model/Skill/TwinAttackTest.cs @@ -0,0 +1,111 @@ +namespace Lib9c.Tests.Model.Skill +{ + using System; + using System.Collections.Generic; + using System.Linq; + using Lib9c.Tests.Action; + using Libplanet.Crypto; + using Nekoyume.Battle; + using Nekoyume.Model; + using Nekoyume.Model.Buff; + using Nekoyume.Model.Skill; + using Nekoyume.Model.Stat; + using Nekoyume.Model.State; + using Xunit; + + public class TwinAttackTest + { + private readonly TableSheets _tableSheets = new (TableSheetsImporter.ImportSheets()); + + [Theory] + // Attack count returns to 1 when exceeds max attack(combo) count. + // lvl. 1 ~ 10 : Max 2 combo + [InlineData(1, 0, 2, true)] + [InlineData(1, 0, 2, false)] + [InlineData(1, 1, 1, true)] + [InlineData(1, 1, 1, false)] + [InlineData(1, 2, 2, true)] + [InlineData(1, 2, 2, false)] + // lvl. 11 ~ 99 : max 3 combo + [InlineData(11, 1, 3, true)] + [InlineData(11, 1, 3, false)] + [InlineData(11, 2, 1, true)] + [InlineData(11, 2, 1, false)] + [InlineData(11, 3, 2, true)] + [InlineData(11, 3, 2, false)] + // lvl. 100 ~ 249 : max 4 combo + [InlineData(100, 2, 4, true)] + [InlineData(100, 2, 4, false)] + [InlineData(100, 3, 1, true)] + [InlineData(100, 3, 1, false)] + [InlineData(100, 4, 2, true)] + [InlineData(100, 4, 2, false)] + // lvl. 250 ~ : max 5 combo + [InlineData(250, 3, 5, true)] + [InlineData(250, 3, 5, false)] + [InlineData(250, 4, 1, true)] + [InlineData(250, 4, 1, false)] + [InlineData(250, 5, 2, true)] + [InlineData(250, 5, 2, false)] + public void UseTwinAttack(int level, int initialAttackCount, int expectedAttackCount, bool copyCharacter) + { + Assert.True(_tableSheets.SkillSheet.TryGetValue(700008, out var skillRow)); + var twinAttack = new TwinAttack(skillRow, 100, 100, default, StatType.NONE); + var avatarState = new AvatarState( + new PrivateKey().Address, + new PrivateKey().Address, + 0, + _tableSheets.GetAvatarSheets(), + new GameConfigState(), + new PrivateKey().Address + ) + { + level = level, + }; + var worldRow = _tableSheets.WorldSheet.First; + Assert.NotNull(worldRow); + + var simulator = new StageSimulator( + new TestRandom(), + avatarState, + new List(), + null, + new List(), + 1, + 1, + _tableSheets.StageSheet[1], + _tableSheets.StageWaveSheet[1], + false, + 20, + _tableSheets.GetSimulatorSheets(), + _tableSheets.EnemySkillSheet, + _tableSheets.CostumeStatSheet, + StageSimulator.GetWaveRewards( + new TestRandom(), + _tableSheets.StageSheet[1], + _tableSheets.MaterialItemSheet), + copyCharacter + ); + var player = new Player(avatarState, simulator) + { + AttackCount = initialAttackCount, + }; + + var enemyRow = _tableSheets.CharacterSheet.OrderedList + .FirstOrDefault(e => e.Id > 200000); + Assert.NotNull(enemyRow); + + var enemy = new Enemy(player, enemyRow, 1); + + player.Targets.Add(enemy); + + Assert.Equal(initialAttackCount, player.AttackCount); + var battleStatus = twinAttack.Use(player, 0, new List(), copyCharacter); + + Assert.NotNull(battleStatus); + Assert.Equal(!copyCharacter, battleStatus.Character is null); + Assert.Equal(2, battleStatus.SkillInfos.Count()); + Assert.Equal(expectedAttackCount, player.AttackCount); + } + } +} diff --git a/Lib9c/TableCSV/Skill/SkillSheet.csv b/Lib9c/TableCSV/Skill/SkillSheet.csv index c8d48594a4..32a52c7f06 100644 --- a/Lib9c/TableCSV/Skill/SkillSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillSheet.csv @@ -171,6 +171,6 @@ _250001,속도 증가(전체),Normal,Buff,SpeedBuff,Ally,1,1 // 미구현 700005,기절,Normal,Debuff,Buff,Enemies,1,15 700006,흡혈,Normal,Buff,Buff,Self,1,15 700007,집중,Normal,Buff,Buff,Self,1,15 -700008,더블 어택,Normal,Attack,BlowAttack,Enemy,1,15 +700008,더블 어택,Normal,Attack,TwinAttack,Enemy,2,15 700009,디버프 제거,Normal,Buff,Buff,Self,1,15 -700010,HP 비례 데미지,Normal,Attack,BlowAttack,Enemy,1,15 \ No newline at end of file +700010,HP 비례 데미지,Normal,Attack,BlowAttack,Enemy,1,15 From 7041fa28a5f21e79c9f6ca7eb4a28b8c0c74cf22 Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 22 Feb 2024 14:18:12 +0900 Subject: [PATCH 17/78] Use DoubleAttack, not create TwinAttack --- .Lib9c.Tests/Model/Skill/TwinAttackTest.cs | 111 ------------------ .../BattleStatus/Arena/ArenaTwinAttack.cs | 23 ---- Lib9c/Model/BattleStatus/TwinAttack.cs | 21 ---- Lib9c/Model/IArena.cs | 1 - Lib9c/Model/IStage.cs | 1 - Lib9c/Model/Skill/Arena/ArenaTwinAttack.cs | 43 ------- Lib9c/Model/Skill/SkillCategory.cs | 3 +- Lib9c/Model/Skill/TwinAttack.cs | 31 ----- 8 files changed, 1 insertion(+), 233 deletions(-) delete mode 100644 .Lib9c.Tests/Model/Skill/TwinAttackTest.cs delete mode 100644 Lib9c/Model/BattleStatus/Arena/ArenaTwinAttack.cs delete mode 100644 Lib9c/Model/BattleStatus/TwinAttack.cs delete mode 100644 Lib9c/Model/Skill/Arena/ArenaTwinAttack.cs delete mode 100644 Lib9c/Model/Skill/TwinAttack.cs diff --git a/.Lib9c.Tests/Model/Skill/TwinAttackTest.cs b/.Lib9c.Tests/Model/Skill/TwinAttackTest.cs deleted file mode 100644 index 5ee5e9b2a8..0000000000 --- a/.Lib9c.Tests/Model/Skill/TwinAttackTest.cs +++ /dev/null @@ -1,111 +0,0 @@ -namespace Lib9c.Tests.Model.Skill -{ - using System; - using System.Collections.Generic; - using System.Linq; - using Lib9c.Tests.Action; - using Libplanet.Crypto; - using Nekoyume.Battle; - using Nekoyume.Model; - using Nekoyume.Model.Buff; - using Nekoyume.Model.Skill; - using Nekoyume.Model.Stat; - using Nekoyume.Model.State; - using Xunit; - - public class TwinAttackTest - { - private readonly TableSheets _tableSheets = new (TableSheetsImporter.ImportSheets()); - - [Theory] - // Attack count returns to 1 when exceeds max attack(combo) count. - // lvl. 1 ~ 10 : Max 2 combo - [InlineData(1, 0, 2, true)] - [InlineData(1, 0, 2, false)] - [InlineData(1, 1, 1, true)] - [InlineData(1, 1, 1, false)] - [InlineData(1, 2, 2, true)] - [InlineData(1, 2, 2, false)] - // lvl. 11 ~ 99 : max 3 combo - [InlineData(11, 1, 3, true)] - [InlineData(11, 1, 3, false)] - [InlineData(11, 2, 1, true)] - [InlineData(11, 2, 1, false)] - [InlineData(11, 3, 2, true)] - [InlineData(11, 3, 2, false)] - // lvl. 100 ~ 249 : max 4 combo - [InlineData(100, 2, 4, true)] - [InlineData(100, 2, 4, false)] - [InlineData(100, 3, 1, true)] - [InlineData(100, 3, 1, false)] - [InlineData(100, 4, 2, true)] - [InlineData(100, 4, 2, false)] - // lvl. 250 ~ : max 5 combo - [InlineData(250, 3, 5, true)] - [InlineData(250, 3, 5, false)] - [InlineData(250, 4, 1, true)] - [InlineData(250, 4, 1, false)] - [InlineData(250, 5, 2, true)] - [InlineData(250, 5, 2, false)] - public void UseTwinAttack(int level, int initialAttackCount, int expectedAttackCount, bool copyCharacter) - { - Assert.True(_tableSheets.SkillSheet.TryGetValue(700008, out var skillRow)); - var twinAttack = new TwinAttack(skillRow, 100, 100, default, StatType.NONE); - var avatarState = new AvatarState( - new PrivateKey().Address, - new PrivateKey().Address, - 0, - _tableSheets.GetAvatarSheets(), - new GameConfigState(), - new PrivateKey().Address - ) - { - level = level, - }; - var worldRow = _tableSheets.WorldSheet.First; - Assert.NotNull(worldRow); - - var simulator = new StageSimulator( - new TestRandom(), - avatarState, - new List(), - null, - new List(), - 1, - 1, - _tableSheets.StageSheet[1], - _tableSheets.StageWaveSheet[1], - false, - 20, - _tableSheets.GetSimulatorSheets(), - _tableSheets.EnemySkillSheet, - _tableSheets.CostumeStatSheet, - StageSimulator.GetWaveRewards( - new TestRandom(), - _tableSheets.StageSheet[1], - _tableSheets.MaterialItemSheet), - copyCharacter - ); - var player = new Player(avatarState, simulator) - { - AttackCount = initialAttackCount, - }; - - var enemyRow = _tableSheets.CharacterSheet.OrderedList - .FirstOrDefault(e => e.Id > 200000); - Assert.NotNull(enemyRow); - - var enemy = new Enemy(player, enemyRow, 1); - - player.Targets.Add(enemy); - - Assert.Equal(initialAttackCount, player.AttackCount); - var battleStatus = twinAttack.Use(player, 0, new List(), copyCharacter); - - Assert.NotNull(battleStatus); - Assert.Equal(!copyCharacter, battleStatus.Character is null); - Assert.Equal(2, battleStatus.SkillInfos.Count()); - Assert.Equal(expectedAttackCount, player.AttackCount); - } - } -} diff --git a/Lib9c/Model/BattleStatus/Arena/ArenaTwinAttack.cs b/Lib9c/Model/BattleStatus/Arena/ArenaTwinAttack.cs deleted file mode 100644 index d2d33f4413..0000000000 --- a/Lib9c/Model/BattleStatus/Arena/ArenaTwinAttack.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; - -namespace Nekoyume.Model.BattleStatus.Arena -{ - [Serializable] - public class ArenaTwinAttack : ArenaSkill - { - public ArenaTwinAttack( - ArenaCharacter character, - IEnumerable skillInfos, - IEnumerable buffInfos) - : base(character, skillInfos, buffInfos) - { - } - - public override IEnumerator CoExecute(IArena arena) - { - yield return arena.CoTwinAttack(Character, SkillInfos, BuffInfos); - } - } -} diff --git a/Lib9c/Model/BattleStatus/TwinAttack.cs b/Lib9c/Model/BattleStatus/TwinAttack.cs deleted file mode 100644 index 48cb885512..0000000000 --- a/Lib9c/Model/BattleStatus/TwinAttack.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; - -namespace Nekoyume.Model.BattleStatus -{ - [Serializable] - public class TwinAttack : Skill - { - public TwinAttack - (int skillId, CharacterBase character, IEnumerable skillInfos, IEnumerable buffInfos) - : base(skillId, character, skillInfos, buffInfos) - { - } - - public override IEnumerator CoExecute(IStage stage) - { - yield return stage.CoTwinAttack(Character, SkillId, SkillInfos, BuffInfos); - } - } -} diff --git a/Lib9c/Model/IArena.cs b/Lib9c/Model/IArena.cs index b69384d202..71f96b6caa 100644 --- a/Lib9c/Model/IArena.cs +++ b/Lib9c/Model/IArena.cs @@ -11,7 +11,6 @@ public interface IArena IEnumerator CoNormalAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBlowAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoDoubleAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); - IEnumerator CoTwinAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoAreaAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBuffRemovalAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoHeal(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); diff --git a/Lib9c/Model/IStage.cs b/Lib9c/Model/IStage.cs index 34c728615a..4a8f6c79d5 100644 --- a/Lib9c/Model/IStage.cs +++ b/Lib9c/Model/IStage.cs @@ -15,7 +15,6 @@ public interface IStage IEnumerator CoNormalAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBlowAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoDoubleAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); - IEnumerator CoTwinAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoAreaAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBuffRemovalAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoHeal(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); diff --git a/Lib9c/Model/Skill/Arena/ArenaTwinAttack.cs b/Lib9c/Model/Skill/Arena/ArenaTwinAttack.cs deleted file mode 100644 index 8efb3c0101..0000000000 --- a/Lib9c/Model/Skill/Arena/ArenaTwinAttack.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using Nekoyume.Model.Stat; -using Nekoyume.TableData; - -namespace Nekoyume.Model.Skill.Arena -{ - [Serializable] - public class ArenaTwinAttack : ArenaAttackSkill - { - public ArenaTwinAttack( - SkillSheet.Row skillRow, - long power, - int chance, - int statPowerRatio, - StatType referencedStatType) : base(skillRow, power, chance, statPowerRatio, referencedStatType) - { - } - - public override BattleStatus.Arena.ArenaSkill Use( - ArenaCharacter caster, - ArenaCharacter target, - int turn, - IEnumerable buffs) - { - var clone = (ArenaCharacter)caster.Clone(); - var damage = ProcessDamage(caster, target, turn); - var buff = ProcessBuff(caster, target, turn, buffs); - - return new BattleStatus.Arena.ArenaDoubleAttack(clone, damage, buff); - } - - [Obsolete("Use Use")] - public override BattleStatus.Arena.ArenaSkill UseV1( - ArenaCharacter caster, - ArenaCharacter target, - int turn, - IEnumerable buffs) - { - return Use(caster, target, turn, buffs); - } - } -} diff --git a/Lib9c/Model/Skill/SkillCategory.cs b/Lib9c/Model/Skill/SkillCategory.cs index 09da57fd96..cf48ba05aa 100644 --- a/Lib9c/Model/Skill/SkillCategory.cs +++ b/Lib9c/Model/Skill/SkillCategory.cs @@ -4,10 +4,9 @@ public enum SkillCategory { NormalAttack, BlowAttack, - DoubleAttack, + DoubleAttack, // Attack enemy two times AreaAttack, BuffRemovalAttack, - TwinAttack, Heal, diff --git a/Lib9c/Model/Skill/TwinAttack.cs b/Lib9c/Model/Skill/TwinAttack.cs deleted file mode 100644 index 017334a530..0000000000 --- a/Lib9c/Model/Skill/TwinAttack.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using Nekoyume.Model.Stat; -using Nekoyume.TableData; - -namespace Nekoyume.Model.Skill -{ - [Serializable] - public class TwinAttack : AttackSkill - { - public TwinAttack( - SkillSheet.Row skillRow, - long power, - int chance, - int statPowerRatio, - StatType referencedStatType) : base(skillRow, power, chance, statPowerRatio, referencedStatType) - { - } - - public override BattleStatus.Skill Use(CharacterBase caster, - int simulatorWaveTurn, - IEnumerable buffs, bool copyCharacter) - { - var clone = copyCharacter ? (CharacterBase) caster.Clone() : null; - var damage = ProcessDamage(caster, simulatorWaveTurn, copyCharacter: copyCharacter); - var buff = ProcessBuff(caster, simulatorWaveTurn, buffs, copyCharacter); - - return new Model.BattleStatus.DoubleAttack(SkillRow.Id, clone, damage, buff); - } - } -} From 363328cd54ca86b9230129511179821a242a48b7 Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 22 Feb 2024 14:18:45 +0900 Subject: [PATCH 18/78] Add combo column to SkillSheet and use this to count attck count --- Lib9c/Model/Skill/AttackSkill.cs | 11 +++-------- Lib9c/TableCSV/Skill/SkillSheet.csv | 4 ++-- Lib9c/TableData/Skill/SkillSheet.cs | 10 +++++++++- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Lib9c/Model/Skill/AttackSkill.cs b/Lib9c/Model/Skill/AttackSkill.cs index bdeda11d92..d96bd3e6cb 100644 --- a/Lib9c/Model/Skill/AttackSkill.cs +++ b/Lib9c/Model/Skill/AttackSkill.cs @@ -69,27 +69,22 @@ protected AttackSkill( } else { - // Consider attack count: combo bonus - var considerAttackCount = - isNormalAttack - || SkillRow.SkillCategory is SkillCategory.TwinAttack; // 모션 배율 적용. damage = caster.GetDamage( damage, - considerAttackCount + isNormalAttack || SkillRow.Combo ); // 속성 적용. damage = elementalType.GetDamage(target.defElementType, damage); // 치명 적용. - isCritical = caster.IsCritical(considerAttackCount); + isCritical = caster.IsCritical(isNormalAttack || SkillRow.Combo); if (isCritical) { damage = CriticalHelper.GetCriticalDamage(caster, damage); } // double attack must be shown as critical attack - isCritical |= SkillRow.SkillCategory is SkillCategory.DoubleAttack - or SkillCategory.TwinAttack; + isCritical |= SkillRow.SkillCategory is SkillCategory.DoubleAttack; } target.CurrentHP -= damage; diff --git a/Lib9c/TableCSV/Skill/SkillSheet.csv b/Lib9c/TableCSV/Skill/SkillSheet.csv index 32a52c7f06..8367bf1a2a 100644 --- a/Lib9c/TableCSV/Skill/SkillSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillSheet.csv @@ -1,4 +1,4 @@ -id,_name,elemental_type,skill_type,skill_category,skill_target_type,hit_count,cooldown +id,_name,elemental_type,skill_type,skill_category,skill_target_type,hit_count,cooldown,combo 100000,기본 공격,Normal,Attack,NormalAttack,Enemy,1,0 100001,일격,Normal,Attack,BlowAttack,Enemy,1,1 _100002,일격(전체),Normal,Attack,BlowAttack,Enemies,1,1 // 노멀 속성의 전체 일격은 추가하면 안 됩니다. @@ -171,6 +171,6 @@ _250001,속도 증가(전체),Normal,Buff,SpeedBuff,Ally,1,1 // 미구현 700005,기절,Normal,Debuff,Buff,Enemies,1,15 700006,흡혈,Normal,Buff,Buff,Self,1,15 700007,집중,Normal,Buff,Buff,Self,1,15 -700008,더블 어택,Normal,Attack,TwinAttack,Enemy,2,15 +700008,더블 어택,Normal,Attack,DoubleAttack,Enemy,2,15,true 700009,디버프 제거,Normal,Buff,Buff,Self,1,15 700010,HP 비례 데미지,Normal,Attack,BlowAttack,Enemy,1,15 diff --git a/Lib9c/TableData/Skill/SkillSheet.cs b/Lib9c/TableData/Skill/SkillSheet.cs index 71ccd7d633..4c636b57ec 100644 --- a/Lib9c/TableData/Skill/SkillSheet.cs +++ b/Lib9c/TableData/Skill/SkillSheet.cs @@ -23,6 +23,7 @@ public class Row : SheetRow, IState public int HitCount { get; private set; } public int Cooldown { get; private set; } + public bool Combo { get; private set; } public Row() {} public Row(Bencodex.Types.Dictionary serialized) @@ -35,6 +36,10 @@ public Row(Bencodex.Types.Dictionary serialized) SkillTargetType = (SkillTargetType) Enum.Parse(typeof(SkillTargetType), (Bencodex.Types.Text) serialized["skill_target_type"]); HitCount = (Bencodex.Types.Integer) serialized["hit_count"]; Cooldown = (Bencodex.Types.Integer) serialized["cooldown"]; + if (serialized.ContainsKey("combo")) + { + Combo = serialized["combo"] is not null && (Bencodex.Types.Boolean)serialized["combo"]; + } } public override void Set(IReadOnlyList fields) @@ -46,6 +51,7 @@ public override void Set(IReadOnlyList fields) SkillTargetType = (SkillTargetType) Enum.Parse(typeof(SkillTargetType), fields[4]); HitCount = ParseInt(fields[5]); Cooldown = ParseInt(fields[6]); + Combo = fields.Count > 7 && ParseBool(fields[7], false); } public IValue Serialize() @@ -57,7 +63,9 @@ public IValue Serialize() .Add("skill_category", SkillCategory.ToString()) .Add("skill_target_type", SkillTargetType.ToString()) .Add("hit_count", HitCount) - .Add("cooldown", Cooldown); + .Add("cooldown", Cooldown) + .Add("combo", Combo) + ; return dict; } From f947da329aa0dcdd5bdbc1c27442bc023c9bd14b Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 22 Feb 2024 14:19:14 +0900 Subject: [PATCH 19/78] Create tests for DoubleAttack --- .Lib9c.Tests/Model/Skill/DoubleAttackTest.cs | 124 +++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 .Lib9c.Tests/Model/Skill/DoubleAttackTest.cs diff --git a/.Lib9c.Tests/Model/Skill/DoubleAttackTest.cs b/.Lib9c.Tests/Model/Skill/DoubleAttackTest.cs new file mode 100644 index 0000000000..def039c70e --- /dev/null +++ b/.Lib9c.Tests/Model/Skill/DoubleAttackTest.cs @@ -0,0 +1,124 @@ +namespace Lib9c.Tests.Model.Skill +{ + using System; + using System.Collections.Generic; + using System.Linq; + using Lib9c.Tests.Action; + using Libplanet.Crypto; + using Nekoyume.Battle; + using Nekoyume.Model; + using Nekoyume.Model.Buff; + using Nekoyume.Model.Skill; + using Nekoyume.Model.Stat; + using Nekoyume.Model.State; + using Xunit; + + public class DoubleAttackTest + { + private readonly TableSheets _tableSheets = new (TableSheetsImporter.ImportSheets()); + + [Theory] + // DoubleAttack: Does not consider attack count + [InlineData(100003, 1, 0, 0, true)] + [InlineData(100003, 1, 0, 0, false)] + [InlineData(100003, 1, 2, 2, true)] + [InlineData(100003, 1, 2, 2, false)] + + // TwinAttack : Increase attack count per each attack + // Attack count returns to 1 when exceeds max attack(combo) count. + // lvl. 1 ~ 10 : Max 2 combo + [InlineData(700008, 1, 0, 2, true)] + [InlineData(700008, 1, 0, 2, false)] + [InlineData(700008, 1, 1, 1, true)] + [InlineData(700008, 1, 1, 1, false)] + [InlineData(700008, 1, 2, 2, true)] + [InlineData(700008, 1, 2, 2, false)] + // lvl. 11 ~ 99 : max 3 combo + [InlineData(700008, 11, 1, 3, true)] + [InlineData(700008, 11, 1, 3, false)] + [InlineData(700008, 11, 2, 1, true)] + [InlineData(700008, 11, 2, 1, false)] + [InlineData(700008, 11, 3, 2, true)] + [InlineData(700008, 11, 3, 2, false)] + // lvl. 100 ~ 249 : max 4 combo + [InlineData(700008, 100, 2, 4, true)] + [InlineData(700008, 100, 2, 4, false)] + [InlineData(700008, 100, 3, 1, true)] + [InlineData(700008, 100, 3, 1, false)] + [InlineData(700008, 100, 4, 2, true)] + [InlineData(700008, 100, 4, 2, false)] + // lvl. 250 ~ : max 5 combo + [InlineData(700008, 250, 3, 5, true)] + [InlineData(700008, 250, 3, 5, false)] + [InlineData(700008, 250, 4, 1, true)] + [InlineData(700008, 250, 4, 1, false)] + [InlineData(700008, 250, 5, 2, true)] + [InlineData(700008, 250, 5, 2, false)] + public void DoubleAttack( + int skillId, + int level, + int initialAttackCount, + int expectedAttackCount, + bool copyCharacter + ) + { + Assert.True(_tableSheets.SkillSheet.TryGetValue(skillId, out var skillRow)); + var twinAttack = new DoubleAttack(skillRow, 100, 100, default, StatType.NONE); + var avatarState = new AvatarState( + new PrivateKey().Address, + new PrivateKey().Address, + 0, + _tableSheets.GetAvatarSheets(), + new GameConfigState(), + new PrivateKey().Address + ) + { + level = level, + }; + var worldRow = _tableSheets.WorldSheet.First; + Assert.NotNull(worldRow); + + var simulator = new StageSimulator( + new TestRandom(), + avatarState, + new List(), + null, + new List(), + 1, + 1, + _tableSheets.StageSheet[1], + _tableSheets.StageWaveSheet[1], + false, + 20, + _tableSheets.GetSimulatorSheets(), + _tableSheets.EnemySkillSheet, + _tableSheets.CostumeStatSheet, + StageSimulator.GetWaveRewards( + new TestRandom(), + _tableSheets.StageSheet[1], + _tableSheets.MaterialItemSheet), + copyCharacter + ); + var player = new Player(avatarState, simulator) + { + AttackCount = initialAttackCount, + }; + + var enemyRow = _tableSheets.CharacterSheet.OrderedList + .FirstOrDefault(e => e.Id > 200000); + Assert.NotNull(enemyRow); + + var enemy = new Enemy(player, enemyRow, 1); + + player.Targets.Add(enemy); + + Assert.Equal(initialAttackCount, player.AttackCount); + var battleStatus = twinAttack.Use(player, 0, new List(), copyCharacter); + + Assert.NotNull(battleStatus); + Assert.Equal(!copyCharacter, battleStatus.Character is null); + Assert.Equal(2, battleStatus.SkillInfos.Count()); + Assert.Equal(expectedAttackCount, player.AttackCount); + } + } +} From 3667fe9330e82da91395ec8abf2516e068f2486c Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 22 Feb 2024 17:07:44 +0900 Subject: [PATCH 20/78] Update ArenaDoubleAttack to use TwinAttack skill in it --- Lib9c/Model/Character/ArenaCharacter.cs | 2 +- Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib9c/Model/Character/ArenaCharacter.cs b/Lib9c/Model/Character/ArenaCharacter.cs index 0edd1ae786..e0acb3ca0c 100644 --- a/Lib9c/Model/Character/ArenaCharacter.cs +++ b/Lib9c/Model/Character/ArenaCharacter.cs @@ -37,7 +37,7 @@ public class ArenaCharacter : ICloneable private readonly int _attackCountMax; private ArenaCharacter _target; - private int _attackCount; + public int _attackCount { get; private set; } public Guid Id { get; } = Guid.NewGuid(); public BattleStatus.Arena.ArenaSkill SkillLog { get; private set; } diff --git a/Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs b/Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs index 2acb4a85c7..5fc79bafab 100644 --- a/Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs +++ b/Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs @@ -44,9 +44,9 @@ protected ArenaAttackSkill( { damage = caster.ATK + Power + statAdditionalPower; damage = (long) (damage * multiplier); - damage = caster.GetDamage(damage, isNormalAttack); + damage = caster.GetDamage(damage, isNormalAttack || SkillRow.Combo); damage = elementalType.GetDamage(target.DefenseElementalType, damage); - isCritical = caster.IsCritical(isNormalAttack); + isCritical = caster.IsCritical(isNormalAttack || SkillRow.Combo); if (isCritical) { damage = CriticalHelper.GetCriticalDamageForArena(caster, damage); From 44a0a14691bc27f94b57cfcb4a463e5436c64185 Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 22 Feb 2024 17:08:09 +0900 Subject: [PATCH 21/78] Test ArenaDoubleAttack --- .../Skill/Arena/ArenaDoubleAttackTest.cs | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 .Lib9c.Tests/Model/Skill/Arena/ArenaDoubleAttackTest.cs diff --git a/.Lib9c.Tests/Model/Skill/Arena/ArenaDoubleAttackTest.cs b/.Lib9c.Tests/Model/Skill/Arena/ArenaDoubleAttackTest.cs new file mode 100644 index 0000000000..465151799b --- /dev/null +++ b/.Lib9c.Tests/Model/Skill/Arena/ArenaDoubleAttackTest.cs @@ -0,0 +1,68 @@ +namespace Lib9c.Tests.Model.Skill.Arena +{ + using System.Collections.Generic; + using System.Linq; + using Lib9c.Tests.Action; + using Nekoyume.Arena; + using Nekoyume.Model; + using Nekoyume.Model.Buff; + using Nekoyume.Model.Skill.Arena; + using Nekoyume.Model.Stat; + using Nekoyume.Model.State; + using Xunit; + + public class ArenaDoubleAttackTest + { + private readonly TableSheets _tableSheets; + private readonly AvatarState _avatar1; + private readonly AvatarState _avatar2; + private readonly ArenaAvatarState _arenaAvatar1; + private readonly ArenaAvatarState _arenaAvatar2; + + public ArenaDoubleAttackTest() + { + _tableSheets = new TableSheets(TableSheetsImporter.ImportSheets()); + _avatar1 = new AvatarState( + default, + default, + 0, + _tableSheets.GetAvatarSheets(), + new GameConfigState(), + default + ); + _avatar2 = new AvatarState( + default, + default, + 0, + _tableSheets.GetAvatarSheets(), + new GameConfigState(), + default + ); + + _arenaAvatar1 = new ArenaAvatarState(_avatar1); + _arenaAvatar2 = new ArenaAvatarState(_avatar2); + } + + [Theory] + [InlineData(100003, 0)] + [InlineData(700008, 2)] + public void DoubleAttackTest(int skillId, int expectedAttackCount) + { + var simulator = new ArenaSimulator(new TestRandom()); + var myDigest = new ArenaPlayerDigest(_avatar1, _arenaAvatar1); + var enemyDigest = new ArenaPlayerDigest(_avatar2, _arenaAvatar2); + var arenaSheets = _tableSheets.GetArenaSimulatorSheets(); + var challenger = + new ArenaCharacter(simulator, myDigest, arenaSheets, simulator.HpModifier); + var enemy = + new ArenaCharacter(simulator, enemyDigest, arenaSheets, simulator.HpModifier); + + var skillRow = _tableSheets.SkillSheet.OrderedList.First(s => s.Id == skillId); + var skill = new ArenaDoubleAttack(skillRow, 100, 100, 0, StatType.NONE); + var used = skill.Use(challenger, enemy, simulator.Turn, new List()); + Assert.Equal(expectedAttackCount, challenger._attackCount); + Assert.Equal(2, used.SkillInfos.Count()); + Assert.True(used.SkillInfos.First().Effect <= used.SkillInfos.Last().Effect); + } + } +} From 23c1f5f8133c1ca6405d9b203e524ccc02cccc1e Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 22 Feb 2024 17:50:29 +0900 Subject: [PATCH 22/78] Make Focus skill works in arena --- Lib9c/Model/Character/ArenaCharacter.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Lib9c/Model/Character/ArenaCharacter.cs b/Lib9c/Model/Character/ArenaCharacter.cs index 0edd1ae786..4da15d9b49 100644 --- a/Lib9c/Model/Character/ArenaCharacter.cs +++ b/Lib9c/Model/Character/ArenaCharacter.cs @@ -914,12 +914,17 @@ public bool IsCritical(bool considerAttackCount = true) return CRI >= chance; var additionalCriticalChance = - AttackCountHelper.GetAdditionalCriticalChance(_attackCount, _attackCountMax); + AttackCountHelper.GetAdditionalCriticalChance(AttackCount, _attackCountMax); return CRI + additionalCriticalChance >= chance; } public virtual bool IsHit(ArenaCharacter caster) { + if (caster.ActionBuffs.Any(buff => buff is Focus)) + { + return true; + } + var isHit = HitHelper.IsHitWithoutLevelCorrection( caster.Level, caster.HIT, From 5426a3adcf71ad3cb3d018c5d01a5be45e175536 Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 22 Feb 2024 17:51:00 +0900 Subject: [PATCH 23/78] Make AttackCount public to see it works --- Lib9c/Model/Character/ArenaCharacter.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Lib9c/Model/Character/ArenaCharacter.cs b/Lib9c/Model/Character/ArenaCharacter.cs index 4da15d9b49..151e5a4d85 100644 --- a/Lib9c/Model/Character/ArenaCharacter.cs +++ b/Lib9c/Model/Character/ArenaCharacter.cs @@ -37,7 +37,7 @@ public class ArenaCharacter : ICloneable private readonly int _attackCountMax; private ArenaCharacter _target; - private int _attackCount; + public int AttackCount { get; private set; } public Guid Id { get; } = Guid.NewGuid(); public BattleStatus.Arena.ArenaSkill SkillLog { get; private set; } @@ -216,8 +216,8 @@ private ArenaCharacter(ArenaCharacter value) Buffs.Add(pair.Key, (Buff.Buff) pair.Value.Clone()); } - _attackCountMax = value._attackCount; - _attackCount = value._attackCount; + _attackCountMax = value.AttackCount; + AttackCount = value.AttackCount; _target = value._target; CurrentHP = value.CurrentHP; } @@ -933,7 +933,7 @@ public virtual bool IsHit(ArenaCharacter caster) _simulator.Random.Next(0, 100)); if (!isHit) { - caster._attackCount = 0; + caster.AttackCount = 0; } return isHit; @@ -944,13 +944,13 @@ public long GetDamage(long damage, bool considerAttackCount = true) if (!considerAttackCount) return damage; - _attackCount++; - if (_attackCount > _attackCountMax) + AttackCount++; + if (AttackCount > _attackCountMax) { - _attackCount = 1; + AttackCount = 1; } - var damageMultiplier = AttackCountHelper.GetDamageMultiplier(_attackCount, _attackCountMax); + var damageMultiplier = AttackCountHelper.GetDamageMultiplier(AttackCount, _attackCountMax); damage *= damageMultiplier; return damage; } From 2378b5594eedda333a38bd504b4ff8abcb2dc35a Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 22 Feb 2024 17:51:20 +0900 Subject: [PATCH 24/78] Test focus skill in arena --- .../Skill/Arena/ArenaNormalAttackTest.cs | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 .Lib9c.Tests/Model/Skill/Arena/ArenaNormalAttackTest.cs diff --git a/.Lib9c.Tests/Model/Skill/Arena/ArenaNormalAttackTest.cs b/.Lib9c.Tests/Model/Skill/Arena/ArenaNormalAttackTest.cs new file mode 100644 index 0000000000..f47cb694ec --- /dev/null +++ b/.Lib9c.Tests/Model/Skill/Arena/ArenaNormalAttackTest.cs @@ -0,0 +1,103 @@ +namespace Lib9c.Tests.Model.Skill.Arena +{ + using System.Collections.Generic; + using System.Linq; + using Lib9c.Tests.Action; + using Nekoyume.Arena; + using Nekoyume.Model; + using Nekoyume.Model.Buff; + using Nekoyume.Model.Skill; + using Nekoyume.Model.Skill.Arena; + using Nekoyume.Model.Stat; + using Nekoyume.Model.State; + using Xunit; + + public class ArenaNormalAttackTest + { + private readonly TableSheets _tableSheets; + private readonly AvatarState _avatar1; + private readonly AvatarState _avatar2; + + private readonly ArenaAvatarState _arenaAvatar1; + private readonly ArenaAvatarState _arenaAvatar2; + + public ArenaNormalAttackTest() + { + _tableSheets = new TableSheets(TableSheetsImporter.ImportSheets()); + _avatar1 = new AvatarState( + default, + default, + 0, + _tableSheets.GetAvatarSheets(), + new GameConfigState(), + default + ); + _avatar2 = new AvatarState( + default, + default, + 0, + _tableSheets.GetAvatarSheets(), + new GameConfigState(), + default + ); + + _arenaAvatar1 = new ArenaAvatarState(_avatar1); + _arenaAvatar2 = new ArenaAvatarState(_avatar2); + } + + [Fact] + public void NormalAttack() + { + var simulator = new ArenaSimulator(new TestRandom()); + var myDigest = new ArenaPlayerDigest(_avatar1, _arenaAvatar1); + var enemyDigest = new ArenaPlayerDigest(_avatar2, _arenaAvatar2); + var arenaSheets = _tableSheets.GetArenaSimulatorSheets(); + var challenger = + new ArenaCharacter(simulator, myDigest, arenaSheets, simulator.HpModifier); + var enemy = + new ArenaCharacter(simulator, enemyDigest, arenaSheets, simulator.HpModifier); + + var skillRow = _tableSheets.SkillSheet.OrderedList.First(s => s.Id == 100000); + var skill = new ArenaNormalAttack(skillRow, 100, 100, 0, StatType.NONE); + var used = skill.Use(challenger, enemy, simulator.Turn, new List()); + Assert.Single(used.SkillInfos); + Assert.Equal(1, challenger.AttackCount); + } + + [Fact] + public void FocusSkill() + { + const int seed = 10; + var myDigest = new ArenaPlayerDigest(_avatar1, _arenaAvatar1); + var enemyDigest = new ArenaPlayerDigest(_avatar2, _arenaAvatar2); + var arenaSheets = _tableSheets.GetArenaSimulatorSheets(); + + // Without Focus buff + var simulator = new ArenaSimulator(new TestRandom(seed)); + var challenger = + new ArenaCharacter(simulator, myDigest, arenaSheets, simulator.HpModifier); + var enemy = + new ArenaCharacter(simulator, enemyDigest, arenaSheets, simulator.HpModifier); + var skillRow = _tableSheets.SkillSheet.OrderedList.First(s => s.Id == 100000); + var skill = new ArenaNormalAttack(skillRow, 100, 100, 0, StatType.NONE); + var used = skill.Use(challenger, enemy, simulator.Turn, new List()); + Assert.Equal(0, challenger.AttackCount); + + // With Focus Buff + simulator = new ArenaSimulator(new TestRandom(seed)); + challenger = new ArenaCharacter(simulator, myDigest, arenaSheets, simulator.HpModifier); + enemy = new ArenaCharacter(simulator, enemyDigest, arenaSheets, simulator.HpModifier); + + challenger.AddBuff(new Focus( + _tableSheets.ActionBuffSheet.OrderedList.First(s => + s.ActionBuffType == ActionBuffType.Focus) + )); + Assert.Single(challenger.ActionBuffs); + + skill = new ArenaNormalAttack(skillRow, 100, 100, 0, StatType.NONE); + used = skill.Use(challenger, enemy, simulator.Turn, new List()); + Assert.Single(used.SkillInfos); + Assert.Equal(1, challenger.AttackCount); + } + } +} From 9d8d17041261d177a578b7d4654867e3f53ee88a Mon Sep 17 00:00:00 2001 From: jonny Date: Wed, 21 Feb 2024 10:55:44 +0900 Subject: [PATCH 25/78] world 8 cheat test setting --- Lib9c.DevExtensions/Data/TestbedCreateAvatar.json | 10 ++++++++-- Lib9c/Model/WorldInformation.cs | 14 +++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json b/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json index 198279aa91..956e075105 100644 --- a/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json +++ b/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json @@ -1,5 +1,5 @@ { - "Level": 300, + "Level": 400, "TradableMaterialCount": 6000, "MaterialCount": 5000, "RuneStoneCount": 4000, @@ -12,7 +12,13 @@ 103, 128, 148, - 152 + 152, + 170, + 165, + 160, + 157, + 71, + 30 ], "CustomEquipmentItems": [ { diff --git a/Lib9c/Model/WorldInformation.cs b/Lib9c/Model/WorldInformation.cs index c0db140a72..62727f48df 100644 --- a/Lib9c/Model/WorldInformation.cs +++ b/Lib9c/Model/WorldInformation.cs @@ -155,7 +155,19 @@ public WorldInformation( { foreach (var row in orderedSheet) { - _worlds.Add(row.Id, new World(row, blockIndex, blockIndex, row.StageEnd)); + //for test world 8 + if(row.Id == 7) + { + _worlds.Add(row.Id, new World(row, blockIndex, blockIndex, row.StageEnd - 1)); + } + else if(row.Id == 8) + { + _worlds.Add(row.Id, new World(row)); + } + else + { + _worlds.Add(row.Id, new World(row, blockIndex, blockIndex, row.StageEnd)); + } } } else From 40792d758551d9bca452e213190ab80a918d1489 Mon Sep 17 00:00:00 2001 From: jonny Date: Wed, 21 Feb 2024 19:28:56 +0900 Subject: [PATCH 26/78] enable test_log define symbol --- Lib9c/Battle/HitHelper.cs | 5 +++++ Lib9c/Model/Character/CharacterBase.cs | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/Lib9c/Battle/HitHelper.cs b/Lib9c/Battle/HitHelper.cs index f4b8c7c751..1082a6a9eb 100644 --- a/Lib9c/Battle/HitHelper.cs +++ b/Lib9c/Battle/HitHelper.cs @@ -2,6 +2,11 @@ using System; +#if TEST_LOG +using System.Text; +using UnityEngine; +#endif + namespace Nekoyume.Battle { public static class HitHelper diff --git a/Lib9c/Model/Character/CharacterBase.cs b/Lib9c/Model/Character/CharacterBase.cs index 9e5f7d588f..3f619b0468 100644 --- a/Lib9c/Model/Character/CharacterBase.cs +++ b/Lib9c/Model/Character/CharacterBase.cs @@ -2,6 +2,10 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +#if TEST_LOG +using System.Text; +using UnityEngine; +#endif using BTAI; using Nekoyume.Battle; using Nekoyume.Model.BattleStatus; From b5cd00a9640f516d04f4893eb82099ef0f4f4003 Mon Sep 17 00:00:00 2001 From: jonny Date: Wed, 21 Feb 2024 19:29:57 +0900 Subject: [PATCH 27/78] change test create avatar setting --- .../Data/TestbedCreateAvatar.json | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json b/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json index 956e075105..1dd435e31f 100644 --- a/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json +++ b/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json @@ -335,12 +335,21 @@ ] }, { - "ID": 10540000, - "Level": 12, + "ID": 10254001, + "Level": 30, + "OptionIds": [ + 1045400214, + 1055400013, + 1055400013 + ] + }, + { + "ID": 10354001, + "Level": 30, "OptionIds": [ - 1054000011, - 1054000012, - 1054000013 + 1055400033, + 1055400033, + 1065000612 ] } ] From cdeeb00971726a89248ef65c1d7e6ee5e19fad13 Mon Sep 17 00:00:00 2001 From: jonny Date: Thu, 22 Feb 2024 11:54:33 +0900 Subject: [PATCH 28/78] delete wrong sheet data and fix data --- Lib9c/TableCSV/Skill/SkillBuffSheet.csv | 4 +--- Lib9c/TableCSV/Skill/SkillSheet.csv | 2 +- Lib9c/TableCSV/Skill/StatBuffSheet.csv | 4 +--- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/Lib9c/TableCSV/Skill/SkillBuffSheet.csv b/Lib9c/TableCSV/Skill/SkillBuffSheet.csv index ecfd39f498..ebb87b6aa2 100644 --- a/Lib9c/TableCSV/Skill/SkillBuffSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillBuffSheet.csv @@ -218,6 +218,4 @@ skill_id,buff_id 230007,104005 230007,204003 240006,105003 -210012,202004 -700007,704000 -700009,705000 \ No newline at end of file +210012,202004 \ No newline at end of file diff --git a/Lib9c/TableCSV/Skill/SkillSheet.csv b/Lib9c/TableCSV/Skill/SkillSheet.csv index 8367bf1a2a..f228954bfc 100644 --- a/Lib9c/TableCSV/Skill/SkillSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillSheet.csv @@ -170,7 +170,7 @@ _250001,속도 증가(전체),Normal,Buff,SpeedBuff,Ally,1,1 // 미구현 700004,기절,Normal,Debuff,Buff,Enemy,1,15 700005,기절,Normal,Debuff,Buff,Enemies,1,15 700006,흡혈,Normal,Buff,Buff,Self,1,15 -700007,집중,Normal,Buff,Buff,Self,1,15 +700007,집중,Normal,Buff,Focus,Self,1,15 700008,더블 어택,Normal,Attack,DoubleAttack,Enemy,2,15,true 700009,디버프 제거,Normal,Buff,Buff,Self,1,15 700010,HP 비례 데미지,Normal,Attack,BlowAttack,Enemy,1,15 diff --git a/Lib9c/TableCSV/Skill/StatBuffSheet.csv b/Lib9c/TableCSV/Skill/StatBuffSheet.csv index 1d9a200585..0d8c4cef1a 100644 --- a/Lib9c/TableCSV/Skill/StatBuffSheet.csv +++ b/Lib9c/TableCSV/Skill/StatBuffSheet.csv @@ -121,6 +121,4 @@ id,group,_name,chance,duration,target_type,stat_type,modify_type,modify_value,is 504011,504011,Serimnir Furious Enemy CDMG,100,8,Enemy,CDMG,Add,10000,true 701000,701000,DRV (Rune),100,0,Self,DRV,Add,0,true 702000,701000,DRR (Rune),100,0,Self,DRR,Add,0,true -703000,703000,CDMG (Rune),100,0,Self,CDMG,Add,0,true -704000,704000,집중,100,10,Self,CDMG,Add,100,true -705000,705000,디버프 제거,100,5,Self,CDMG,Add,100,true \ No newline at end of file +703000,703000,CDMG (Rune),100,0,Self,CDMG,Add,0,true \ No newline at end of file From fab7c57ecca9c7fcf3cdc6439f29a2bf3b5a368d Mon Sep 17 00:00:00 2001 From: jonny Date: Thu, 22 Feb 2024 19:13:10 +0900 Subject: [PATCH 29/78] change focus buff duration 0 -> 20 for Test --- Lib9c/TableCSV/Skill/ActionBuffSheet.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib9c/TableCSV/Skill/ActionBuffSheet.csv b/Lib9c/TableCSV/Skill/ActionBuffSheet.csv index 2a32f7a41d..6260b49bf3 100644 --- a/Lib9c/TableCSV/Skill/ActionBuffSheet.csv +++ b/Lib9c/TableCSV/Skill/ActionBuffSheet.csv @@ -6,4 +6,4 @@ id,group,_name,chance,duration,target_type,buff_type,elemental_type,atk_power_ra 704000,704000,기절,100,0,Enemy,Stun,Normal,0 704001,704000,기절,100,0,Enemies,Stun,Normal,0 705000,705000,흡혈,100,0,Self,Vampiric,Normal,0 -706000,706000,집중,100,0,Self,Focus,Normal,0 +706000,706000,집중,100,20,Self,Focus,Normal,0 From 71a790fb5b86ea1e5419dc0dff614bf0797d5b8e Mon Sep 17 00:00:00 2001 From: hyeon Date: Mon, 26 Feb 2024 11:54:18 +0900 Subject: [PATCH 30/78] Add Dispel skill type --- Lib9c/Model/Buff/Dispel.cs | 28 ++++++++++++++++++++++++++++ Lib9c/Model/Skill/ActionBuffType.cs | 1 + 2 files changed, 29 insertions(+) create mode 100644 Lib9c/Model/Buff/Dispel.cs diff --git a/Lib9c/Model/Buff/Dispel.cs b/Lib9c/Model/Buff/Dispel.cs new file mode 100644 index 0000000000..bd76463faa --- /dev/null +++ b/Lib9c/Model/Buff/Dispel.cs @@ -0,0 +1,28 @@ +using System; +using Nekoyume.Model.Skill; +using Nekoyume.TableData; + +namespace Nekoyume.Model.Buff +{ + [Serializable] + public class Dispel : ActionBuff + { + public Dispel(ActionBuffSheet.Row row) : base(row) + { + } + + public Dispel(SkillCustomField customField, ActionBuffSheet.Row row) + : base(customField, row) + { + } + + protected Dispel(ActionBuff value) : base(value) + { + } + + public override object Clone() + { + return new Dispel(this); + } + } +} diff --git a/Lib9c/Model/Skill/ActionBuffType.cs b/Lib9c/Model/Skill/ActionBuffType.cs index de4238457c..41007ef9db 100644 --- a/Lib9c/Model/Skill/ActionBuffType.cs +++ b/Lib9c/Model/Skill/ActionBuffType.cs @@ -7,5 +7,6 @@ public enum ActionBuffType Stun, Vampiric, Focus, + Dispel, // Erase/defence debuffs on me } } From 80bd14682ef98e35397db79e3b2b8b1bfad4a6b7 Mon Sep 17 00:00:00 2001 From: hyeon Date: Mon, 26 Feb 2024 11:56:25 +0900 Subject: [PATCH 31/78] Dispel on action: remove prev. buffs on me --- Lib9c/Model/BattleStatus/Skill.cs | 9 +++++-- Lib9c/Model/Character/CharacterBase.cs | 14 ++++++++-- Lib9c/Model/Skill/Skill.cs | 36 +++++++++++++++++++++++--- 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/Lib9c/Model/BattleStatus/Skill.cs b/Lib9c/Model/BattleStatus/Skill.cs index 17240eab63..d0d571ee3e 100644 --- a/Lib9c/Model/BattleStatus/Skill.cs +++ b/Lib9c/Model/BattleStatus/Skill.cs @@ -22,13 +22,17 @@ public class SkillInfo public readonly long Thorn; public readonly bool IsDead; public readonly Guid CharacterId; + public readonly IEnumerable? DispelList; public readonly Model.Buff.Buff? Buff; - public SkillInfo(Guid characterId, bool isDead, long thorn, long effect, bool critical, SkillCategory skillCategory, + public SkillInfo(Guid characterId, bool isDead, long thorn, long effect, bool critical, + SkillCategory skillCategory, int waveTurn, ElementalType elementalType = ElementalType.Normal, - SkillTargetType targetType = SkillTargetType.Enemy, Model.Buff.Buff? buff = null, CharacterBase? target = null) + SkillTargetType targetType = SkillTargetType.Enemy, Model.Buff.Buff? buff = null, + CharacterBase? target = null, + IEnumerable? dispelList = null) { CharacterId = characterId; IsDead = isDead; @@ -41,6 +45,7 @@ public SkillInfo(Guid characterId, bool isDead, long thorn, long effect, bool cr Buff = buff; WaveTurn = waveTurn; Target = target; + DispelList = dispelList; } } diff --git a/Lib9c/Model/Character/CharacterBase.cs b/Lib9c/Model/Character/CharacterBase.cs index 9e5f7d588f..0575c4bfc3 100644 --- a/Lib9c/Model/Character/CharacterBase.cs +++ b/Lib9c/Model/Character/CharacterBase.cs @@ -375,6 +375,17 @@ public void AddBuff(Buff.Buff buff, bool updateImmediate = true) } } + public void RemoveActionBuff(ActionBuff removedBuff) + { + Buffs.Remove(removedBuff.RowData.GroupId); + } + + public void RemoveStatBuff(StatBuff removedBuff) + { + Stats.RemoveBuff(removedBuff); + Buffs.Remove(removedBuff.RowData.GroupId); + } + public void RemoveRecentStatBuff() { StatBuff removedBuff = null; @@ -405,8 +416,7 @@ public void RemoveRecentStatBuff() if (removedBuff != null) { - Stats.RemoveBuff(removedBuff); - Buffs.Remove(removedBuff.RowData.GroupId); + RemoveStatBuff(removedBuff); } } diff --git a/Lib9c/Model/Skill/Skill.cs b/Lib9c/Model/Skill/Skill.cs index 65a5599383..8c92d0b95d 100644 --- a/Lib9c/Model/Skill/Skill.cs +++ b/Lib9c/Model/Skill/Skill.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using Bencodex.Types; +using Nekoyume.Model.Buff; using Nekoyume.Model.Elemental; using Nekoyume.Model.Stat; using Nekoyume.Model.State; @@ -76,12 +77,39 @@ public override int GetHashCode() foreach (var buff in buffs) { var targets = buff.GetTarget(caster); - foreach (var target in targets.Where(target => target.GetChance(buff.BuffInfo.Chance))) + foreach (var target in targets.Where(target => + target.GetChance(buff.BuffInfo.Chance))) { target.AddBuff(buff); - infos.Add(new Model.BattleStatus.Skill.SkillInfo(target.Id, target.IsDead, target.Thorn, 0, false, - SkillRow.SkillCategory, simulatorWaveTurn, ElementalType.Normal, SkillRow.SkillTargetType, - buff, copyCharacter ? (CharacterBase)target.Clone() : target)); + var dispelList = new List(); + if (buff is Dispel) + { + foreach (var debuff in caster.StatBuffs.Where(bf => bf.RowData.Value < 0)) + { + if (caster.Simulator.Random.Next(0, 100) < Chance) + { + dispelList.Add(debuff); + caster.RemoveStatBuff(debuff); + } + } + + foreach (var debuff in caster.ActionBuffs.Where(bf => + bf.RowData.ActionBuffType is ActionBuffType.Bleed + or ActionBuffType.Stun or ActionBuffType.Vampiric)) + { + if (caster.Simulator.Random.Next(0, 100) < Chance) + { + dispelList.Add(debuff); + caster.RemoveActionBuff(debuff); + } + } + } + + infos.Add(new Model.BattleStatus.Skill.SkillInfo(target.Id, target.IsDead, + target.Thorn, 0, false, + SkillRow.SkillCategory, simulatorWaveTurn, ElementalType.Normal, + SkillRow.SkillTargetType, + buff, copyCharacter ? (CharacterBase)target.Clone() : target, dispelList)); } } From cce9b951eb5b76659489ca7419205dae2f41e01f Mon Sep 17 00:00:00 2001 From: hyeon Date: Mon, 26 Feb 2024 11:58:21 +0900 Subject: [PATCH 32/78] Make simulator public to use simulator.random from outside --- Lib9c/Model/Character/ArenaCharacter.cs | 40 ++++++++++++------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/Lib9c/Model/Character/ArenaCharacter.cs b/Lib9c/Model/Character/ArenaCharacter.cs index 151e5a4d85..8dc9f39783 100644 --- a/Lib9c/Model/Character/ArenaCharacter.cs +++ b/Lib9c/Model/Character/ArenaCharacter.cs @@ -28,9 +28,9 @@ public class ArenaCharacter : ICloneable private readonly StatBuffSheet _statBuffSheet; private readonly SkillActionBuffSheet _skillActionBuffSheet; private readonly ActionBuffSheet _actionBuffSheet; - private readonly IArenaSimulator _simulator; private readonly ArenaSkills _skills; + public readonly IArenaSimulator Simulator; public readonly ArenaSkills _runeSkills = new ArenaSkills(); public readonly Dictionary RuneSkillCooldownMap = new Dictionary(); @@ -108,7 +108,7 @@ public ArenaCharacter( _skillActionBuffSheet = sheets.SkillActionBuffSheet; _actionBuffSheet = sheets.ActionBuffSheet; - _simulator = simulator; + Simulator = simulator; Stats = GetStatV1( digest, row, @@ -140,7 +140,7 @@ public ArenaCharacter( _skillActionBuffSheet = sheets.SkillActionBuffSheet; _actionBuffSheet = sheets.ActionBuffSheet; - _simulator = simulator; + Simulator = simulator; Stats = GetStatV1( digest, row, @@ -175,7 +175,7 @@ public ArenaCharacter( _skillActionBuffSheet = sheets.SkillActionBuffSheet; _actionBuffSheet = sheets.ActionBuffSheet; - _simulator = simulator; + Simulator = simulator; Stats = GetStat( digest, row, @@ -205,7 +205,7 @@ private ArenaCharacter(ArenaCharacter value) _skillActionBuffSheet = value._skillActionBuffSheet; _actionBuffSheet = value._actionBuffSheet; - _simulator = value._simulator; + Simulator = value.Simulator; Stats = new CharacterStats(value.Stats); _skills = value._skills; Buffs = new Dictionary(); @@ -567,7 +567,7 @@ private void Act() if (OnPreSkill()) { usedSkill = new ArenaTick((ArenaCharacter)Clone()); - _simulator.Log.Add(usedSkill); + Simulator.Log.Add(usedSkill); } else { @@ -631,9 +631,9 @@ or SkillCategory.AreaAttack { foreach (var effect in attackSkills .Select(skillInfo => - vampiric.GiveEffectForArena(this, skillInfo, _simulator.Turn))) + vampiric.GiveEffectForArena(this, skillInfo, Simulator.Turn))) { - _simulator.Log.Add(effect); + Simulator.Log.Add(effect); } } } @@ -641,8 +641,8 @@ or SkillCategory.AreaAttack var bleeds = Buffs.Values.OfType().OrderBy(x => x.BuffInfo.Id); foreach (var bleed in bleeds) { - var effect = bleed.GiveEffectForArena(this, _simulator.Turn); - _simulator.Log.Add(effect); + var effect = bleed.GiveEffectForArena(this, Simulator.Turn); + Simulator.Log.Add(effect); } // Apply thorn damage if target has thorn @@ -651,7 +651,7 @@ or SkillCategory.AreaAttack if (skillInfo.Target.Thorn > 0) { var effect = GiveThornDamage(skillInfo.Target.Thorn); - _simulator.Log.Add(effect); + Simulator.Log.Add(effect); } } } @@ -669,7 +669,7 @@ private ArenaSkill GiveThornDamage(long targetThorn) thornDamage, false, SkillCategory.TickDamage, - _simulator.Turn, + Simulator.Turn, ElementalType.Normal, SkillTargetType.Enemy) }; @@ -700,13 +700,13 @@ private void ReduceSkillCooldown() private BattleStatus.Arena.ArenaSkill UseSkill() { - var selectedRuneSkill = _runeSkills.SelectWithoutDefaultAttack(_simulator.Random); + var selectedRuneSkill = _runeSkills.SelectWithoutDefaultAttack(Simulator.Random); var selectedSkill = selectedRuneSkill ?? - _skills.Select(_simulator.Random); + _skills.Select(Simulator.Random); var usedSkill = selectedSkill.Use( this, _target, - _simulator.Turn, + Simulator.Turn, BuffFactory.GetBuffs( Stats, selectedSkill, @@ -736,18 +736,18 @@ selectedSkill is ArenaBuffSkill && _runeSkills.SetCooldown(selectedSkill.SkillRow.Id, row.Cooldown); } - _simulator.Log.Add(usedSkill); + Simulator.Log.Add(usedSkill); return usedSkill; } [Obsolete("Use UseSkill")] private void UseSkillV1() { - var selectedSkill = _skills.Select(_simulator.Random); + var selectedSkill = _skills.Select(Simulator.Random); SkillLog = selectedSkill.UseV1( this, _target, - _simulator.Turn, + Simulator.Turn, BuffFactory.GetBuffs( Stats, selectedSkill, @@ -909,7 +909,7 @@ public void Heal(long heal) public bool IsCritical(bool considerAttackCount = true) { - var chance = _simulator.Random.Next(0, 100); + var chance = Simulator.Random.Next(0, 100); if (!considerAttackCount) return CRI >= chance; @@ -930,7 +930,7 @@ public virtual bool IsHit(ArenaCharacter caster) caster.HIT, Level, HIT, - _simulator.Random.Next(0, 100)); + Simulator.Random.Next(0, 100)); if (!isHit) { caster.AttackCount = 0; From 6efcfca81c708411a3b444ee5630894153785b81 Mon Sep 17 00:00:00 2001 From: hyeon Date: Mon, 26 Feb 2024 11:59:23 +0900 Subject: [PATCH 33/78] Dispel skill for arena --- Lib9c/Model/BattleStatus/Arena/ArenaSkill.cs | 6 ++-- Lib9c/Model/Character/ArenaCharacter.cs | 15 ++++++-- Lib9c/Model/Skill/Arena/ArenaSkill.cs | 36 ++++++++++++++++++-- 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/Lib9c/Model/BattleStatus/Arena/ArenaSkill.cs b/Lib9c/Model/BattleStatus/Arena/ArenaSkill.cs index f4a4d1aae3..da3d99178b 100644 --- a/Lib9c/Model/BattleStatus/Arena/ArenaSkill.cs +++ b/Lib9c/Model/BattleStatus/Arena/ArenaSkill.cs @@ -19,13 +19,14 @@ public class ArenaSkillInfo public readonly ElementalType ElementalType; public readonly SkillTargetType SkillTargetType; public readonly int Turn; - + public readonly IEnumerable? DispelList; public readonly Model.Buff.Buff? Buff; public ArenaSkillInfo(ArenaCharacter character, long effect, bool critical, SkillCategory skillCategory, int turn, ElementalType elementalType = ElementalType.Normal, - SkillTargetType targetType = SkillTargetType.Enemy, Model.Buff.Buff? buff = null) + SkillTargetType targetType = SkillTargetType.Enemy, Model.Buff.Buff? buff = null, + IEnumerable? dispelList = null) { Target = character; Effect = effect; @@ -35,6 +36,7 @@ public ArenaSkillInfo(ArenaCharacter character, long effect, bool critical, Skil SkillTargetType = targetType; Buff = buff; Turn = turn; + DispelList = dispelList; } } diff --git a/Lib9c/Model/Character/ArenaCharacter.cs b/Lib9c/Model/Character/ArenaCharacter.cs index 8dc9f39783..867c228201 100644 --- a/Lib9c/Model/Character/ArenaCharacter.cs +++ b/Lib9c/Model/Character/ArenaCharacter.cs @@ -867,6 +867,18 @@ public void AddBuffV1(Buff.Buff buff, bool updateImmediate = true) Stats.AddBuff(clone, updateImmediate); } + public void RemoveActionBuff(ActionBuff removedBuff) + { + Buffs.Remove(removedBuff.RowData.GroupId); + } + + public void RemoveStatBuff(StatBuff removedBuff) + { + Stats.RemoveBuff(removedBuff); + Buffs.Remove(removedBuff.RowData.GroupId); + + } + public void RemoveRecentStatBuff() { StatBuff removedBuff = null; @@ -897,8 +909,7 @@ public void RemoveRecentStatBuff() if (removedBuff != null) { - Stats.RemoveBuff(removedBuff); - Buffs.Remove(removedBuff.RowData.GroupId); + RemoveStatBuff(removedBuff); } } diff --git a/Lib9c/Model/Skill/Arena/ArenaSkill.cs b/Lib9c/Model/Skill/Arena/ArenaSkill.cs index 59c75216c9..0e21eb9bbc 100644 --- a/Lib9c/Model/Skill/Arena/ArenaSkill.cs +++ b/Lib9c/Model/Skill/Arena/ArenaSkill.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Linq; +using Nekoyume.Model.Buff; using Nekoyume.Model.Elemental; using Nekoyume.Model.Stat; using Nekoyume.TableData; @@ -95,6 +97,31 @@ public override int GetHashCode() case SkillTargetType.Self: case SkillTargetType.Ally: caster.AddBuff(buff); + var dispelList = new List(); + if (buff is Dispel) + { + foreach (var debuff in caster.StatBuffs.Where(bf => + bf.RowData.Value < 0)) + { + if (caster.Simulator.Random.Next(0, 100) < Chance) + { + dispelList.Add(debuff); + caster.RemoveStatBuff(debuff); + } + } + + foreach (var debuff in caster.ActionBuffs.Where(bf => + bf.RowData.ActionBuffType is ActionBuffType.Bleed + or ActionBuffType.Stun or ActionBuffType.Vampiric)) + { + if (caster.Simulator.Random.Next(0, 100) < Chance) + { + dispelList.Add(debuff); + caster.RemoveActionBuff(debuff); + } + } + } + infos.Add(GetSkillInfo(caster, turn, buff)); break; default: @@ -137,17 +164,20 @@ public override int GetHashCode() return infos; } - private BattleStatus.Arena.ArenaSkill.ArenaSkillInfo GetSkillInfo(ICloneable target, int turn, Buff.Buff buff) + private BattleStatus.Arena.ArenaSkill.ArenaSkillInfo GetSkillInfo(ICloneable target, + int turn, Buff.Buff buff, IEnumerable dispelList = null) { return new BattleStatus.Arena.ArenaSkill.ArenaSkillInfo( - (ArenaCharacter) target.Clone(), + (ArenaCharacter)target.Clone(), 0, false, SkillRow.SkillCategory, turn, ElementalType.Normal, SkillRow.SkillTargetType, - buff); + buff, + dispelList + ); } From 0edb58054d8b0515a140396e3beaef26b097417b Mon Sep 17 00:00:00 2001 From: jonny Date: Mon, 26 Feb 2024 19:04:42 +0900 Subject: [PATCH 34/78] fix twinattack sheet --- .../Data/TestbedCreateAvatar.json | 7 +++++ .../Item/EquipmentItemOptionSheet.csv | 30 +++++++++---------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json b/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json index 1dd435e31f..c7aa72e118 100644 --- a/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json +++ b/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json @@ -351,6 +351,13 @@ 1055400033, 1065000612 ] + }, + { + "ID": 10153000, + "Level": 19, + "OptionIds": [ + 1055000114 + ] } ] } \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv b/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv index d475574332..6c9a371991 100644 --- a/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv +++ b/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv @@ -1873,7 +1873,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1015000111,ATK,1,1,,,,,,,, 1015000112,HIT,1,1,,,,,,,, 1015000113,ATK,1,1,,,,,,,, -1015000114,,,,700008,80000,12000,28,28,,, +1015000114,,,,700008,80000,120000,28,28,,, 1015000121,ATK,1,1,,,,,,,, 1015000122,HIT,1,1,,,,,,,, 1015000123,DEF,1,1,,,,,,,, @@ -1881,7 +1881,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1015100111,ATK,1,1,,,,,,,, 1015100112,HIT,1,1,,,,,,,, 1015100113,ATK,1,1,,,,,,,, -1015100114,,,,700008,80000,12000,28,28,,, +1015100114,,,,700008,80000,120000,28,28,,, 1015100121,ATK,1,1,,,,,,,, 1015100122,HIT,1,1,,,,,,,, 1015100123,DEF,1,1,,,,,,,, @@ -1889,7 +1889,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1015200111,ATK,1,1,,,,,,,, 1015200112,HIT,1,1,,,,,,,, 1015200113,ATK,1,1,,,,,,,, -1015200114,,,,700008,80000,12000,28,28,,, +1015200114,,,,700008,80000,120000,28,28,,, 1015200121,ATK,1,1,,,,,,,, 1015200122,HIT,1,1,,,,,,,, 1015200123,DEF,1,1,,,,,,,, @@ -1897,7 +1897,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1015300111,ATK,1,1,,,,,,,, 1015300112,HIT,1,1,,,,,,,, 1015300113,ATK,1,1,,,,,,,, -1015300114,,,,700008,80000,12000,28,28,,, +1015300114,,,,700008,80000,120000,28,28,,, 1015300121,ATK,1,1,,,,,,,, 1015300122,HIT,1,1,,,,,,,, 1015300123,DEF,1,1,,,,,,,, @@ -1905,7 +1905,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1015400111,ATK,1,1,,,,,,,, 1015400112,HIT,1,1,,,,,,,, 1015400113,ATK,1,1,,,,,,,, -1015400114,,,,700008,80000,12000,28,28,,, +1015400114,,,,700008,80000,120000,28,28,,, 1015400121,ATK,1,1,,,,,,,, 1015400122,HIT,1,1,,,,,,,, 1015400123,DEF,1,1,,,,,,,, @@ -1953,7 +1953,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1035000211,SPD,1,1,,,,,,,, 1035000212,HIT,1,1,,,,,,,, 1035000213,ATK,1,1,,,,,,,, -1035000214,,,,700008,80000,12000,28,28,,, +1035000214,,,,700008,80000,120000,28,28,,, 1035000221,SPD,1,1,,,,,,,, 1035000222,HIT,1,1,,,,,,,, 1035000223,DEF,1,1,,,,,,,, @@ -1961,7 +1961,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1035100211,SPD,1,1,,,,,,,, 1035100212,HIT,1,1,,,,,,,, 1035100213,ATK,1,1,,,,,,,, -1035100214,,,,700008,80000,12000,28,28,,, +1035100214,,,,700008,80000,120000,28,28,,, 1035100221,SPD,1,1,,,,,,,, 1035100222,HIT,1,1,,,,,,,, 1035100223,DEF,1,1,,,,,,,, @@ -1969,7 +1969,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1035200211,SPD,1,1,,,,,,,, 1035200212,HIT,1,1,,,,,,,, 1035200213,ATK,1,1,,,,,,,, -1035200214,,,,700008,80000,12000,28,28,,, +1035200214,,,,700008,80000,120000,28,28,,, 1035200221,SPD,1,1,,,,,,,, 1035200222,HIT,1,1,,,,,,,, 1035200223,DEF,1,1,,,,,,,, @@ -1977,7 +1977,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1035300211,SPD,1,1,,,,,,,, 1035300212,HIT,1,1,,,,,,,, 1035300213,ATK,1,1,,,,,,,, -1035300214,,,,700008,80000,12000,28,28,,, +1035300214,,,,700008,80000,120000,28,28,,, 1035300221,SPD,1,1,,,,,,,, 1035300222,HIT,1,1,,,,,,,, 1035300223,DEF,1,1,,,,,,,, @@ -1985,7 +1985,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1035400211,SPD,1,1,,,,,,,, 1035400212,HIT,1,1,,,,,,,, 1035400213,ATK,1,1,,,,,,,, -1035400214,,,,700008,80000,12000,28,28,,, +1035400214,,,,700008,80000,120000,28,28,,, 1035400221,SPD,1,1,,,,,,,, 1035400222,HIT,1,1,,,,,,,, 1035400223,DEF,1,1,,,,,,,, @@ -2033,7 +2033,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1055000111,DEF,1,1,,,,,,,, 1055000112,HIT,1,1,,,,,,,, 1055000113,ATK,1,1,,,,,,,, -1055000114,,,,700008,80000,12000,28,28,,, +1055000114,,,,700008,80000,120000,28,28,,, 1055000121,DEF,1,1,,,,,,,, 1055000122,HIT,1,1,,,,,,,, 1055000123,DEF,1,1,,,,,,,, @@ -2041,7 +2041,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1055100111,DEF,1,1,,,,,,,, 1055100112,HIT,1,1,,,,,,,, 1055100113,ATK,1,1,,,,,,,, -1055100114,,,,700008,80000,12000,28,28,,, +1055100114,,,,700008,80000,120000,28,28,,, 1055100121,DEF,1,1,,,,,,,, 1055100122,HIT,1,1,,,,,,,, 1055100123,DEF,1,1,,,,,,,, @@ -2049,7 +2049,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1055200111,DEF,1,1,,,,,,,, 1055200112,HIT,1,1,,,,,,,, 1055200113,ATK,1,1,,,,,,,, -1055200114,,,,700008,80000,12000,28,28,,, +1055200114,,,,700008,80000,120000,28,28,,, 1055200121,DEF,1,1,,,,,,,, 1055200122,HIT,1,1,,,,,,,, 1055200123,DEF,1,1,,,,,,,, @@ -2057,7 +2057,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1055300111,DEF,1,1,,,,,,,, 1055300112,HIT,1,1,,,,,,,, 1055300113,ATK,1,1,,,,,,,, -1055300114,,,,700008,80000,12000,28,28,,, +1055300114,,,,700008,80000,120000,28,28,,, 1055300121,DEF,1,1,,,,,,,, 1055300122,HIT,1,1,,,,,,,, 1055300123,DEF,1,1,,,,,,,, @@ -2065,7 +2065,7 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1055400111,DEF,1,1,,,,,,,, 1055400112,HIT,1,1,,,,,,,, 1055400113,ATK,1,1,,,,,,,, -1055400114,,,,700008,80000,12000,28,28,,, +1055400114,,,,700008,80000,120000,28,28,,, 1055400121,DEF,1,1,,,,,,,, 1055400122,HIT,1,1,,,,,,,, 1055400123,DEF,1,1,,,,,,,, From ba54aaafc95b135eff34e698942d4215bf1504fb Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 27 Feb 2024 09:17:48 +0900 Subject: [PATCH 35/78] Add dispel to BuffFactory --- Lib9c/Model/Buff/BuffFactory.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Lib9c/Model/Buff/BuffFactory.cs b/Lib9c/Model/Buff/BuffFactory.cs index 17586b1f0c..b09eff7bf7 100644 --- a/Lib9c/Model/Buff/BuffFactory.cs +++ b/Lib9c/Model/Buff/BuffFactory.cs @@ -31,6 +31,8 @@ public static ActionBuff GetActionBuff(Stats stat, ActionBuffSheet.Row row) return new Vampiric(row, 0); case ActionBuffType.Focus: return new Focus(row); + case ActionBuffType.Dispel: + return new Dispel(row); default: throw new ArgumentOutOfRangeException(); } @@ -48,6 +50,8 @@ public static ActionBuff GetCustomActionBuff(SkillCustomField customField, Actio return new Vampiric(customField, row); case ActionBuffType.Focus: return new Focus(customField, row); + case ActionBuffType.Dispel: + return new Dispel(customField, row); default: throw new ArgumentOutOfRangeException(); } From 43b4ef4552ebcd91be7342861b5d08d2c1def224 Mon Sep 17 00:00:00 2001 From: jonny Date: Tue, 27 Feb 2024 20:32:30 +0900 Subject: [PATCH 36/78] world 8 test clear stage --- Lib9c/Model/State/AvatarState.cs | 2 +- Lib9c/Model/WorldInformation.cs | 30 ++++++++++++++++++++---------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/Lib9c/Model/State/AvatarState.cs b/Lib9c/Model/State/AvatarState.cs index 327c96e09c..a76e738afd 100644 --- a/Lib9c/Model/State/AvatarState.cs +++ b/Lib9c/Model/State/AvatarState.cs @@ -79,7 +79,7 @@ public AvatarState(Address address, level = 1; exp = 0; inventory = new Inventory(); - worldInformation = new WorldInformation(blockIndex, avatarSheets.WorldSheet, GameConfig.IsEditor); + worldInformation = new WorldInformation(blockIndex, avatarSheets.WorldSheet, GameConfig.IsEditor, name); updatedAt = blockIndex; this.agentAddress = agentAddress; questList = new QuestList( diff --git a/Lib9c/Model/WorldInformation.cs b/Lib9c/Model/WorldInformation.cs index 62727f48df..edde6d1d05 100644 --- a/Lib9c/Model/WorldInformation.cs +++ b/Lib9c/Model/WorldInformation.cs @@ -141,7 +141,7 @@ private IDictionary worlds public WorldInformation( long blockIndex, WorldSheet worldSheet, - bool openAllOfWorldsAndStages = false) + bool openAllOfWorldsAndStages = false, string avatarName = "") { if (worldSheet is null) { @@ -153,18 +153,28 @@ public WorldInformation( if (openAllOfWorldsAndStages) { - foreach (var row in orderedSheet) + if(avatarName == "8World") { - //for test world 8 - if(row.Id == 7) - { - _worlds.Add(row.Id, new World(row, blockIndex, blockIndex, row.StageEnd - 1)); - } - else if(row.Id == 8) + foreach (var row in orderedSheet) { - _worlds.Add(row.Id, new World(row)); + //for test world 8 + if(row.Id == 7) + { + _worlds.Add(row.Id, new World(row, blockIndex, blockIndex, row.StageEnd - 1)); + } + else if(row.Id == 8) + { + _worlds.Add(row.Id, new World(row)); + } + else + { + _worlds.Add(row.Id, new World(row, blockIndex, blockIndex, row.StageEnd)); + } } - else + } + else + { + foreach (var row in orderedSheet) { _worlds.Add(row.Id, new World(row, blockIndex, blockIndex, row.StageEnd)); } From 39afc2f3cd54df5f1f2b027fc1f2f21b32df89f1 Mon Sep 17 00:00:00 2001 From: Syu Date: Wed, 28 Feb 2024 22:57:12 +0900 Subject: [PATCH 37/78] Update 8World Data --- Lib9c/TableCSV/Item/ItemRequirementSheet.csv | 50 ++++++------ Lib9c/TableCSV/WorldAndStage/StageSheet.csv | 80 +++++++++---------- .../TableCSV/WorldAndStage/StageWaveSheet.csv | 54 ++++++------- 3 files changed, 92 insertions(+), 92 deletions(-) diff --git a/Lib9c/TableCSV/Item/ItemRequirementSheet.csv b/Lib9c/TableCSV/Item/ItemRequirementSheet.csv index 0a88772ec5..5aaecfe741 100644 --- a/Lib9c/TableCSV/Item/ItemRequirementSheet.csv +++ b/Lib9c/TableCSV/Item/ItemRequirementSheet.csv @@ -35,11 +35,11 @@ item_id,level,mimislevel 10142001,999,999 10143001,999,999 10144001,999,999 -10150001,1,1 -10151001,1,1 -10152001,1,1 -10153001,1,1 -10154001,1,1 +10150001,340,340 +10151001,305,305 +10152001,305,305 +10153001,320,320 +10154001,320,320 10155000,999,999 10200000,1,1 10210000,1,1 @@ -77,11 +77,11 @@ item_id,level,mimislevel 10242001,999,999 10243001,999,999 10244001,999,999 -10250000,1,1 -10251000,1,1 -10252000,1,1 -10253000,1,1 -10254000,1,1 +10250000,340,340 +10251000,305,305 +10252000,305,305 +10253000,320,320 +10254000,320,320 10255000,999,999 10310000,1,1 10311000,1,1 @@ -314,18 +314,18 @@ item_id,level,mimislevel 10640003,1,1 10650005,1,1 10650006,1,1 -10350002,1,1 -10351002,1,1 -10352002,1,1 -10353002,1,1 -10354002,1,1 -10450002,1,1 -10451002,1,1 -10452002,1,1 -10453002,1,1 -10454002,1,1 -10550001,1,1 -10551001,1,1 -10552001,1,1 -10553001,1,1 -10554001,1,1 \ No newline at end of file +10350002,340,340 +10351002,305,305 +10352002,305,305 +10353002,320,320 +10354002,320,320 +10450002,340,340 +10451002,305,305 +10452002,305,305 +10453002,320,320 +10454002,320,320 +10550001,340,340 +10551001,305,305 +10552001,305,305 +10553001,320,320 +10554001,320,320 \ No newline at end of file diff --git a/Lib9c/TableCSV/WorldAndStage/StageSheet.csv b/Lib9c/TableCSV/WorldAndStage/StageSheet.csv index c860746f10..60f8bff45a 100644 --- a/Lib9c/TableCSV/WorldAndStage/StageSheet.csv +++ b/Lib9c/TableCSV/WorldAndStage/StageSheet.csv @@ -350,55 +350,55 @@ id,cost_ap,turn_limit,hp_additional,atk_additional,def_additional,cri_additional 349,5,150,8000,10900,4313,0,16000,5600,chapter_07_01,bgm_niflheim_01,303304,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 350,5,150,9000,11000,4330,0,16500,6000,chapter_07_03,bgm_niflheim_03,303404,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 351,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,1,4,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 -352,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,0.4,1,1,306075,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -353,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303004,0.4,1,1,306075,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -354,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,0.4,1,1,306075,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -355,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,0.4,1,1,306075,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +352,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,0.4,1,1,306090,0.45,2,3,306085,0.1,1,1,306086,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +353,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303004,0.4,1,1,306090,0.45,2,3,306085,0.1,1,1,306086,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +354,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,0.4,1,1,306090,0.45,2,3,306085,0.1,1,1,306089,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +355,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,0.4,1,1,306090,0.45,2,3,306085,0.1,1,1,306089,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 356,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303204,1,4,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 -357,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,0.4,1,1,306076,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -358,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303204,0.4,1,1,306076,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -359,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,0.4,1,1,306076,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -360,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303204,0.4,1,1,306076,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +357,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,0.4,1,1,306091,0.45,2,3,306085,0.1,1,1,306086,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +358,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303204,0.4,1,1,306091,0.45,2,3,306085,0.1,1,1,306086,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +359,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,0.4,1,1,306091,0.45,2,3,306085,0.1,1,1,306089,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +360,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303204,0.4,1,1,306091,0.45,2,3,306085,0.1,1,1,306089,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 361,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,1,4,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 -362,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,0.4,1,1,306077,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -363,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303104,0.4,1,1,306077,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -364,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,0.4,1,1,306077,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -365,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,0.4,1,1,306077,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +362,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,0.4,1,1,306092,0.45,2,3,306085,0.1,1,1,306086,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +363,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303104,0.4,1,1,306092,0.45,2,3,306085,0.1,1,1,306086,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +364,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,0.4,1,1,306092,0.45,2,3,306085,0.1,1,1,306089,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +365,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,0.4,1,1,306092,0.45,2,3,306085,0.1,1,1,306089,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 366,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303304,1,4,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 -367,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306078,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -368,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303304,0.4,1,1,306078,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -369,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306078,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -370,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303304,0.4,1,1,306078,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +367,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306093,0.45,2,3,306085,0.1,1,1,306086,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +368,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303304,0.4,1,1,306093,0.45,2,3,306085,0.1,1,1,306086,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +369,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306093,0.45,2,3,306085,0.1,1,1,306089,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +370,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303304,0.4,1,1,306093,0.45,2,3,306085,0.1,1,1,306089,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 371,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,1,4,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 -372,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306079,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -373,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303404,0.4,1,1,306079,0.45,2,3,306070,0.1,1,1,306071,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -374,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306079,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 -375,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306079,0.45,2,3,306070,0.1,1,1,306074,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +372,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306094,0.45,2,3,306085,0.1,1,1,306086,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +373,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303404,0.4,1,1,306094,0.45,2,3,306085,0.1,1,1,306086,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +374,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306094,0.45,2,3,306085,0.1,1,1,306089,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 +375,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306094,0.45,2,3,306085,0.1,1,1,306089,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,2,3 376,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303004,1,6,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,6 377,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,1,6,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,6 -378,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303004,0.4,1,1,306080,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 -379,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,0.4,1,1,306081,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 -380,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303004,0.4,1,1,306080,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 -381,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,0.4,1,1,306081,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 -382,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,0.4,1,1,306080,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 -383,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303204,0.4,1,1,306081,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +378,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303004,0.4,1,1,306095,0.45,3,4,306085,0.1,1,1,306088,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +379,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,0.4,1,1,306096,0.45,3,4,306085,0.1,1,1,306087,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +380,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303004,0.4,1,1,306095,0.45,3,4,306085,0.1,1,1,306087,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +381,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303204,0.4,1,1,306096,0.45,3,4,306085,0.1,1,1,306088,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +382,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303004,0.4,1,1,306095,0.45,3,4,306085,0.1,1,1,306088,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +383,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303204,0.4,1,1,306096,0.45,3,4,306070,0.1,1,1,306087,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 384,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,1,6,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,6 385,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,1,6,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,6 -386,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303104,0.4,1,1,306082,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 -387,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306083,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 -388,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303104,0.4,1,1,306082,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 -389,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306083,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 -390,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303104,0.4,1,1,306082,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 -391,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306083,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +386,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303104,0.4,1,1,306097,0.45,3,4,306085,0.1,1,1,306088,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +387,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306098,0.45,3,4,306085,0.1,1,1,306087,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +388,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303104,0.4,1,1,306097,0.45,3,4,306085,0.1,1,1,306087,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +389,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306098,0.45,3,4,306085,0.1,1,1,306088,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +390,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303104,0.4,1,1,306097,0.45,3,4,306085,0.1,1,1,306088,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +391,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,1,1,306098,0.45,3,4,306085,0.1,1,1,306087,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 392,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,1,6,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,6 -393,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303404,0.4,1,1,306084,0.45,3,4,306070,0.1,1,1,306073,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 -394,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306084,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 -395,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306084,0.45,3,4,306070,0.1,1,1,306072,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 -396,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303004,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 -397,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 -398,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303204,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 -399,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 -400,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303404,0.4,2,3,306070,0.2,1,1,306071,0.1,1,1,306074,0.1,1,1,306073,0.1,1,1,306072,0.1,1,1,306072,0.1,1,1,,,,,,,,,,,,,2,3 +393,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303404,0.4,1,1,306099,0.45,3,4,306085,0.1,1,1,306088,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +394,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306099,0.45,3,4,306085,0.1,1,1,306087,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +395,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303404,0.4,1,1,306099,0.45,3,4,306085,0.1,1,1,306087,0.05,1,1,,,,,,,,,,,,,,,,,,,,,,,,,3,4 +396,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303004,0.4,2,3,306085,0.2,1,1,306086,0.1,1,1,306089,0.1,1,1,306088,0.1,1,1,306087,0.1,1,1,306087,0.1,1,1,,,,,,,,,,,,,2,3 +397,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303104,0.4,2,3,306085,0.2,1,1,306086,0.1,1,1,306089,0.1,1,1,306088,0.1,1,1,306087,0.1,1,1,306087,0.1,1,1,,,,,,,,,,,,,2,3 +398,5,150,9000,11000,4330,0,16500,6000,chapter_08_02,bgm_hel_02,303204,0.4,2,3,306085,0.2,1,1,306086,0.1,1,1,306089,0.1,1,1,306088,0.1,1,1,306087,0.1,1,1,306087,0.1,1,1,,,,,,,,,,,,,2,3 +399,5,150,9000,11000,4330,0,16500,6000,chapter_08_01,bgm_hel_01,303304,0.4,2,3,306085,0.2,1,1,306086,0.1,1,1,306089,0.1,1,1,306088,0.1,1,1,306087,0.1,1,1,306087,0.1,1,1,,,,,,,,,,,,,2,3 +400,5,150,9000,11000,4330,0,16500,6000,chapter_08_03,bgm_hel_03,303404,0.4,2,3,306085,0.2,1,1,306086,0.1,1,1,306089,0.1,1,1,306088,0.1,1,1,306087,0.1,1,1,306087,0.1,1,1,,,,,,,,,,,,,2,3 10000001,10,150,184,132,132,0,184,132,chapter_99_01,bgm_hard1,303200,0.15,1,1,306064,0.25,1,2,306065,0.1,1,2,306058,0.4,1,1,306059,0.1,1,1,,,,,,,,,,,,,,,,,,,,,4,4 10000002,10,150,228,163,163,0,228,163,chapter_99_01,bgm_hard2,303200,0.15,1,1,306064,0.25,1,2,306065,0.1,1,2,306058,0.4,1,1,306059,0.1,1,1,,,,,,,,,,,,,,,,,,,,,4,4 10000003,10,150,245,175,175,0,245,175,chapter_99_01,bgm_hard1,303200,0.15,1,1,306064,0.25,1,2,306065,0.1,1,2,306058,0.4,1,1,306059,0.1,1,1,,,,,,,,,,,,,,,,,,,,,4,4 diff --git a/Lib9c/TableCSV/WorldAndStage/StageWaveSheet.csv b/Lib9c/TableCSV/WorldAndStage/StageWaveSheet.csv index b7f2aa2f3f..8bafe6b064 100644 --- a/Lib9c/TableCSV/WorldAndStage/StageWaveSheet.csv +++ b/Lib9c/TableCSV/WorldAndStage/StageWaveSheet.csv @@ -1049,33 +1049,33 @@ stage_id,wave,monster1_id,monster1_level,monster1_count,monster2_id,monster2_lev 350,1,208004,354,2,208003,354,1,208005,354,1,,,,0 350,2,208001,354,4,208002,354,3,208003,354,3,,,,0 350,3,208007,355,1,,,,,,,,,,1 -351,1,209000,305,2,,,,,,,,,,0 -351,2,209001,305,2,,,,,,,,,,0 -351,3,209000,305,3,,,,,,,,,,0 -352,1,209000,306,2,,,,,,,,,,0 -352,2,209001,306,2,,,,,,,,,,0 -352,3,209000,307,2,209001,307,1,,,,,,,1 -353,1,209000,307,1,209001,307,1,,,,,,,0 -353,2,209001,307,2,,,,,,,,,,0 -353,3,209003,307,1,,,,,,,,,,0 -354,1,209000,308,3,,,,,,,,,,0 -354,2,209001,308,1,209000,308,1,,,,,,,0 -354,3,209000,309,1,209001,309,2,,,,,,,1 -355,1,209000,309,2,209001,309,1,,,,,,,0 -355,2,209000,309,3,,,,,,,,,,0 -355,3,209000,309,2,209001,309,1,,,,,,,0 -356,1,209000,310,2,209001,310,2,,,,,,,0 -356,2,209000,310,3,209001,310,1,,,,,,,0 -356,3,209003,311,1,209000,311,1,,,,,,,1 -357,1,209000,311,2,209002,311,1,,,,,,,0 -357,2,209000,311,4,209001,311,1,,,,,,,0 -357,3,209000,311,3,209002,311,2,,,,,,,0 -358,1,209000,312,3,209002,312,1,,,,,,,0 -358,2,209000,312,3,209001,312,2,,,,,,,0 -358,3,209000,313,4,209002,313,2,,,,,,,1 -359,1,209000,313,3,209001,313,2,,,,,,,0 -359,2,209000,313,4,209002,313,1,,,,,,,0 -359,3,209000,313,3,209002,313,3,,,,,,,0 +351,1,209000,300,1,,,,,,,,,,0 +351,2,209000,300,1,,,,,,,,,,0 +351,3,209000,300,1,209001,300,1,,,,,,,0 +352,1,209001,300,1,,,,,,,,,,0 +352,2,209001,300,1,,,,,,,,,,0 +352,3,209001,300,1,209002,300,1,,,,,,,1 +353,1,209002,300,1,,,,,,,,,,0 +353,2,209002,300,1,,,,,,,,,,0 +353,3,209002,300,1,209003,300,1,,,,,,,0 +354,1,209003,300,1,,,,,,,,,,0 +354,2,209003,300,1,,,,,,,,,,0 +354,3,209003,300,1,209004,300,1,,,,,,,1 +355,1,209004,300,1,,,,,,,,,,0 +355,2,209004,300,1,,,,,,,,,,0 +355,3,209004,300,1,209005,300,1,,,,,,,0 +356,1,209005,300,1,,,,,,,,,,0 +356,2,209005,300,1,,,,,,,,,,0 +356,3,209005,300,1,209006,300,1,,,,,,,1 +357,1,209006,300,1,,,,,,,,,,0 +357,2,209006,300,1,,,,,,,,,,0 +357,3,209006,300,1,209007,300,1,,,,,,,0 +358,1,209007,300,1,,,,,,,,,,0 +358,2,209007,300,1,,,,,,,,,,0 +358,3,209007,300,1,209008,300,1,,,,,,,1 +359,1,209008,300,1,,,,,,,,,,0 +359,2,209008,300,1,,,,,,,,,,0 +359,3,209008,300,1,,,,,,,,,,0 360,1,209000,314,3,209002,314,2,,,,,,,0 360,2,209001,314,3,209002,314,1,,,,,,,0 360,3,209003,315,1,209001,315,1,,,,,,,1 From fe5b1a82ced7d9eeabbeba615b15eaa9677d4a54 Mon Sep 17 00:00:00 2001 From: Syu Date: Wed, 28 Feb 2024 23:49:57 +0900 Subject: [PATCH 38/78] Stage Wave Change --- Lib9c/TableCSV/WorldAndStage/StageWaveSheet.csv | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib9c/TableCSV/WorldAndStage/StageWaveSheet.csv b/Lib9c/TableCSV/WorldAndStage/StageWaveSheet.csv index 8bafe6b064..f0a18a8724 100644 --- a/Lib9c/TableCSV/WorldAndStage/StageWaveSheet.csv +++ b/Lib9c/TableCSV/WorldAndStage/StageWaveSheet.csv @@ -1072,10 +1072,10 @@ stage_id,wave,monster1_id,monster1_level,monster1_count,monster2_id,monster2_lev 357,3,209006,300,1,209007,300,1,,,,,,,0 358,1,209007,300,1,,,,,,,,,,0 358,2,209007,300,1,,,,,,,,,,0 -358,3,209007,300,1,209008,300,1,,,,,,,1 -359,1,209008,300,1,,,,,,,,,,0 -359,2,209008,300,1,,,,,,,,,,0 -359,3,209008,300,1,,,,,,,,,,0 +358,3,209007,300,1,,,,,,,,,,1 +359,1,209000,314,3,209002,314,2,,,,,,,0 +359,2,209001,314,3,209002,314,1,,,,,,,0 +359,3,209003,315,1,209001,315,1,,,,,,,0 360,1,209000,314,3,209002,314,2,,,,,,,0 360,2,209001,314,3,209002,314,1,,,,,,,0 360,3,209003,315,1,209001,315,1,,,,,,,1 From 54f238c482479e069f799a8f972aa4db4a0af8cd Mon Sep 17 00:00:00 2001 From: Syu Date: Thu, 29 Feb 2024 00:10:42 +0900 Subject: [PATCH 39/78] Update Character size Change --- Lib9c/TableCSV/Character/CharacterSheet.csv | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Lib9c/TableCSV/Character/CharacterSheet.csv b/Lib9c/TableCSV/Character/CharacterSheet.csv index eeb00b3936..d1edea9d10 100644 --- a/Lib9c/TableCSV/Character/CharacterSheet.csv +++ b/Lib9c/TableCSV/Character/CharacterSheet.csv @@ -74,11 +74,11 @@ id,_name,size_type,elemental_type,hp,atk,def,cri,hit,spd,lv_hp,lv_atk,lv_def,lv_ 208005,라이딩 전사,L,2,3500,55,25,4,90,14,140,2.2,1,0,3.6,0.56,1.8,0.6 208006,영혼 지배자,L,2,3000,63,30,4,90,16,120,2.52,1.2,0,3.6,0.64,2.4,0.3 208007,요르문간드,XL,2,15000,130,50,6,90,10,600,5.2,2,0,3.6,0.4,4,0.3 -209000,강글라티,XS,1,210,35,20,4,90,25,8.4,1.4,0.8,0,3.6,1,0.8,1.5 -209001,강글로트,S,1,500,35,40,4,90,5,20,1.4,1.6,0,3.6,0.2,0.86,0.8 -209002,헬헤스트,M,1,360,47,30,4,90,10,14.4,1.88,1.2,0,3.6,0.4,2.4,1 +209000,강글라티,M,1,210,35,20,4,90,25,8.4,1.4,0.8,0,3.6,1,1.7,1.5 +209001,강글로트,M,1,500,35,40,4,90,5,20,1.4,1.6,0,3.6,0.2,1.7,0.8 +209002,헬헤스트,L,1,360,47,30,4,90,10,14.4,1.88,1.2,0,3.6,0.4,2.4,1 209003,흐림,L,1,1800,50,10,4,90,10,72,2,0.4,0,3.6,0.4,2.1,0.8 -209004,모드구드,L,1,4500,75,40,4,90,6,180,3,1.6,0,3.6,0.24,1.65,0.4 -209005,흐림그림니르,L,1,3500,55,25,4,90,14,140,2.2,1,0,3.6,0.56,1.8,0.6 -209006,가름,L,1,3000,63,30,4,90,16,120,2.52,1.2,0,3.6,0.64,2.4,0.3 +209004,모드구드,L,1,4500,75,40,4,90,6,180,3,1.6,0,3.6,0.24,2.7,0.4 +209005,흐림그림니르,XL,1,3500,55,25,4,90,14,140,2.2,1,0,3.6,0.56,3,0.6 +209006,가름,XL,1,3000,63,30,4,90,16,120,2.52,1.2,0,3.6,0.64,3.2,0.3 209007,헤라,XL,1,15000,130,50,6,90,10,600,5.2,2,0,3.6,0.4,4,0.3 \ No newline at end of file From c1953c442367a1c93379a1e6dbdec699f97ea56b Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 29 Feb 2024 17:41:17 +0900 Subject: [PATCH 40/78] Add dispel skill to csv --- Lib9c/TableCSV/Skill/ActionBuffSheet.csv | 2 ++ Lib9c/TableCSV/Skill/SkillActionBuffSheet.csv | 2 ++ Lib9c/TableCSV/Skill/SkillSheet.csv | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Lib9c/TableCSV/Skill/ActionBuffSheet.csv b/Lib9c/TableCSV/Skill/ActionBuffSheet.csv index 2a32f7a41d..d9f4bfb9b9 100644 --- a/Lib9c/TableCSV/Skill/ActionBuffSheet.csv +++ b/Lib9c/TableCSV/Skill/ActionBuffSheet.csv @@ -7,3 +7,5 @@ id,group,_name,chance,duration,target_type,buff_type,elemental_type,atk_power_ra 704001,704000,기절,100,0,Enemies,Stun,Normal,0 705000,705000,흡혈,100,0,Self,Vampiric,Normal,0 706000,706000,집중,100,0,Self,Focus,Normal,0 +707000,707000,치유,100,0,Self,Dispel,Normal,0 +708000,708000,면역(1),100,1,Self,Dispel,Normal,0 diff --git a/Lib9c/TableCSV/Skill/SkillActionBuffSheet.csv b/Lib9c/TableCSV/Skill/SkillActionBuffSheet.csv index bf669c50d3..f38d791a32 100644 --- a/Lib9c/TableCSV/Skill/SkillActionBuffSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillActionBuffSheet.csv @@ -7,3 +7,5 @@ skill_id,buff_id 700005,704001 700006,705000 700007,706000 +700009,707000 +700010,708000 diff --git a/Lib9c/TableCSV/Skill/SkillSheet.csv b/Lib9c/TableCSV/Skill/SkillSheet.csv index 8367bf1a2a..bc8e47e51c 100644 --- a/Lib9c/TableCSV/Skill/SkillSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillSheet.csv @@ -173,4 +173,5 @@ _250001,속도 증가(전체),Normal,Buff,SpeedBuff,Ally,1,1 // 미구현 700007,집중,Normal,Buff,Buff,Self,1,15 700008,더블 어택,Normal,Attack,DoubleAttack,Enemy,2,15,true 700009,디버프 제거,Normal,Buff,Buff,Self,1,15 -700010,HP 비례 데미지,Normal,Attack,BlowAttack,Enemy,1,15 +700010,면역,Normal,Buff,Buff,Self,1,15 +700011,HP 비례 데미지,Normal,Attack,BlowAttack,Enemy,1,15 From 45b3a362722a1cc70caa0172c4cb2d638263cfc6 Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 29 Feb 2024 18:10:30 +0900 Subject: [PATCH 41/78] Remove old, unused logic --- Lib9c/Model/Skill/Arena/ArenaSkill.cs | 27 --------------------------- Lib9c/Model/Skill/Skill.cs | 24 ------------------------ 2 files changed, 51 deletions(-) diff --git a/Lib9c/Model/Skill/Arena/ArenaSkill.cs b/Lib9c/Model/Skill/Arena/ArenaSkill.cs index 0e21eb9bbc..6de8adc6fe 100644 --- a/Lib9c/Model/Skill/Arena/ArenaSkill.cs +++ b/Lib9c/Model/Skill/Arena/ArenaSkill.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using Nekoyume.Model.Buff; using Nekoyume.Model.Elemental; using Nekoyume.Model.Stat; using Nekoyume.TableData; @@ -97,31 +95,6 @@ public override int GetHashCode() case SkillTargetType.Self: case SkillTargetType.Ally: caster.AddBuff(buff); - var dispelList = new List(); - if (buff is Dispel) - { - foreach (var debuff in caster.StatBuffs.Where(bf => - bf.RowData.Value < 0)) - { - if (caster.Simulator.Random.Next(0, 100) < Chance) - { - dispelList.Add(debuff); - caster.RemoveStatBuff(debuff); - } - } - - foreach (var debuff in caster.ActionBuffs.Where(bf => - bf.RowData.ActionBuffType is ActionBuffType.Bleed - or ActionBuffType.Stun or ActionBuffType.Vampiric)) - { - if (caster.Simulator.Random.Next(0, 100) < Chance) - { - dispelList.Add(debuff); - caster.RemoveActionBuff(debuff); - } - } - } - infos.Add(GetSkillInfo(caster, turn, buff)); break; default: diff --git a/Lib9c/Model/Skill/Skill.cs b/Lib9c/Model/Skill/Skill.cs index 8c92d0b95d..1f3f4ca71a 100644 --- a/Lib9c/Model/Skill/Skill.cs +++ b/Lib9c/Model/Skill/Skill.cs @@ -80,30 +80,6 @@ public override int GetHashCode() foreach (var target in targets.Where(target => target.GetChance(buff.BuffInfo.Chance))) { - target.AddBuff(buff); - var dispelList = new List(); - if (buff is Dispel) - { - foreach (var debuff in caster.StatBuffs.Where(bf => bf.RowData.Value < 0)) - { - if (caster.Simulator.Random.Next(0, 100) < Chance) - { - dispelList.Add(debuff); - caster.RemoveStatBuff(debuff); - } - } - - foreach (var debuff in caster.ActionBuffs.Where(bf => - bf.RowData.ActionBuffType is ActionBuffType.Bleed - or ActionBuffType.Stun or ActionBuffType.Vampiric)) - { - if (caster.Simulator.Random.Next(0, 100) < Chance) - { - dispelList.Add(debuff); - caster.RemoveActionBuff(debuff); - } - } - } infos.Add(new Model.BattleStatus.Skill.SkillInfo(target.Id, target.IsDead, target.Thorn, 0, false, From 0f133c695ebc71f5a5aa73520a8abe5a49fa6027 Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 29 Feb 2024 18:11:05 +0900 Subject: [PATCH 42/78] Add Dispel to skill category --- Lib9c/Model/Skill/SkillCategory.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib9c/Model/Skill/SkillCategory.cs b/Lib9c/Model/Skill/SkillCategory.cs index cf48ba05aa..11047dc15f 100644 --- a/Lib9c/Model/Skill/SkillCategory.cs +++ b/Lib9c/Model/Skill/SkillCategory.cs @@ -23,5 +23,6 @@ public enum SkillCategory Debuff, TickDamage, Focus, // Always hit enemy. + Dispel, // Remove/defence debuffs } } From 89945669b6cdc3690e67f731a0806bbae2a78b6f Mon Sep 17 00:00:00 2001 From: hyeon Date: Mon, 4 Mar 2024 11:19:25 +0900 Subject: [PATCH 43/78] Introduce Dispel skill - Add `affected` to SkillInfo to check current dispel is affected - Update `ProcussBuff` function: Add dispel effect - `AddBuff` function now returns dispelList which is removed by dispel buff --- Lib9c/Model/BattleStatus/Skill.cs | 1 + Lib9c/Model/Character/ArenaCharacter.cs | 72 +++++++++++++++++++---- Lib9c/Model/Character/CharacterBase.cs | 77 ++++++++++++++++++++----- Lib9c/Model/Skill/Arena/ArenaSkill.cs | 9 +-- Lib9c/Model/Skill/Skill.cs | 19 +++++- 5 files changed, 146 insertions(+), 32 deletions(-) diff --git a/Lib9c/Model/BattleStatus/Skill.cs b/Lib9c/Model/BattleStatus/Skill.cs index d0d571ee3e..c23d737def 100644 --- a/Lib9c/Model/BattleStatus/Skill.cs +++ b/Lib9c/Model/BattleStatus/Skill.cs @@ -32,6 +32,7 @@ public SkillInfo(Guid characterId, bool isDead, long thorn, long effect, bool cr int waveTurn, ElementalType elementalType = ElementalType.Normal, SkillTargetType targetType = SkillTargetType.Enemy, Model.Buff.Buff? buff = null, CharacterBase? target = null, + bool affected = true, IEnumerable? dispelList = null) { CharacterId = characterId; diff --git a/Lib9c/Model/Character/ArenaCharacter.cs b/Lib9c/Model/Character/ArenaCharacter.cs index 867c228201..8e178cb802 100644 --- a/Lib9c/Model/Character/ArenaCharacter.cs +++ b/Lib9c/Model/Character/ArenaCharacter.cs @@ -836,23 +836,73 @@ public void SpawnV2(ArenaCharacter target) InitAIV2(); } - public void AddBuff(Buff.Buff buff, bool updateImmediate = true) + public IEnumerable AddBuff(Buff.Buff buff, bool updateImmediate = true) { if (Buffs.TryGetValue(buff.BuffInfo.GroupId, out var outBuff) && outBuff.BuffInfo.Id > buff.BuffInfo.Id) - return; + return null; - if (buff is StatBuff stat) - { - var clone = (StatBuff)stat.Clone(); - Buffs[stat.RowData.GroupId] = clone; - Stats.AddBuff(clone, updateImmediate); - } - else if (buff is ActionBuff action) + var dispelList = new List(); + switch (buff) { - var clone = (ActionBuff)action.Clone(); - Buffs[action.RowData.GroupId] = clone; + // StatBuff Modifies stats + case StatBuff stat: + { + var clone = (StatBuff)stat.Clone(); + Buffs[stat.RowData.GroupId] = clone; + Stats.AddBuff(clone, updateImmediate); + break; + } + case ActionBuff action: + { + var clone = (ActionBuff)action.Clone(); + + switch (action) + { + // Stun freezes target + case Stun stun: + { + Buffs[stun.BuffInfo.GroupId] = clone; + break; + } + // Dispel removes debuffs + case Dispel dispel: + { + var debuffList = _skillSheet.Values + .Where(s => s.SkillType == SkillType.Debuff).Select(s => s.Id); + Buffs[dispel.BuffInfo.GroupId] = clone; + foreach (var debuff in + StatBuffs.Where(bf => debuffList.Contains(bf.RowData.Id))) + { + if (Simulator.Random.Next(0, 100) < action.RowData.Chance) + { + dispelList.Add(debuff); + RemoveStatBuff(debuff); + } + } + + foreach (var debuff in + ActionBuffs.Where(bf => debuffList.Contains(bf.RowData.Id))) + { + if (Simulator.Random.Next(0, 100) < action.RowData.Chance) + { + dispelList.Add(debuff); + RemoveActionBuff(debuff); + } + } + + break; + } + default: + Buffs[action.RowData.GroupId] = clone; + break; + } + + break; + } } + + return dispelList; } [Obsolete("Use AddBuff")] diff --git a/Lib9c/Model/Character/CharacterBase.cs b/Lib9c/Model/Character/CharacterBase.cs index 0575c4bfc3..92bccef59f 100644 --- a/Lib9c/Model/Character/CharacterBase.cs +++ b/Lib9c/Model/Character/CharacterBase.cs @@ -351,28 +351,73 @@ protected virtual void EndTurn() #region Buff - public void AddBuff(Buff.Buff buff, bool updateImmediate = true) + public IEnumerable AddBuff(Buff.Buff buff, bool updateImmediate = true) { if (Buffs.TryGetValue(buff.BuffInfo.GroupId, out var outBuff) && outBuff.BuffInfo.Id > buff.BuffInfo.Id) - return; + return null; - if (buff is StatBuff stat) - { - var clone = (StatBuff)stat.Clone(); - Buffs[stat.RowData.GroupId] = clone; - Stats.AddBuff(clone, updateImmediate); - } - else if (buff is ActionBuff action) - { - var clone = (ActionBuff)action.Clone(); - Buffs[action.RowData.GroupId] = clone; - } - else if (buff is Stun stun) + var dispelList = new List(); + switch (buff) { - var clone = (Stun)stun.Clone(); - Buffs[stun.BuffInfo.GroupId] = clone; + // StatBuff Modifies stats + case StatBuff stat: + { + var clone = (StatBuff)stat.Clone(); + Buffs[stat.RowData.GroupId] = clone; + Stats.AddBuff(clone, updateImmediate); + break; + } + case ActionBuff action: + { + var clone = (ActionBuff)action.Clone(); + + switch (action) + { + // Stun freezes target + case Stun stun: + { + Buffs[stun.BuffInfo.GroupId] = clone; + break; + } + // Dispel removes debuffs + case Dispel dispel: + { + var debuffList = Simulator.SkillSheet.Values + .Where(s => s.SkillType == SkillType.Debuff).Select(s => s.Id); + Buffs[dispel.BuffInfo.GroupId] = clone; + foreach (var debuff in + StatBuffs.Where(bf => debuffList.Contains(bf.RowData.Id))) + { + if (Simulator.Random.Next(0, 100) < action.RowData.Chance) + { + dispelList.Add(debuff); + RemoveStatBuff(debuff); + } + } + + foreach (var debuff in + ActionBuffs.Where(bf => debuffList.Contains(bf.RowData.Id))) + { + if (Simulator.Random.Next(0, 100) < action.RowData.Chance) + { + dispelList.Add(debuff); + RemoveActionBuff(debuff); + } + } + + break; + } + default: + Buffs[action.RowData.GroupId] = clone; + break; + } + + break; + } } + + return dispelList; } public void RemoveActionBuff(ActionBuff removedBuff) diff --git a/Lib9c/Model/Skill/Arena/ArenaSkill.cs b/Lib9c/Model/Skill/Arena/ArenaSkill.cs index 6de8adc6fe..e125fec53e 100644 --- a/Lib9c/Model/Skill/Arena/ArenaSkill.cs +++ b/Lib9c/Model/Skill/Arena/ArenaSkill.cs @@ -84,18 +84,19 @@ public override int GetHashCode() var infos = new List(); foreach (var buff in buffs) { + IEnumerable dispelList; switch (buff.BuffInfo.SkillTargetType) { case SkillTargetType.Enemy: case SkillTargetType.Enemies: - target.AddBuff(buff); - infos.Add(GetSkillInfo(target, turn, buff)); + dispelList = target.AddBuff(buff); + infos.Add(GetSkillInfo(target, turn, buff, dispelList: dispelList)); break; case SkillTargetType.Self: case SkillTargetType.Ally: - caster.AddBuff(buff); - infos.Add(GetSkillInfo(caster, turn, buff)); + dispelList = caster.AddBuff(buff); + infos.Add(GetSkillInfo(caster, turn, buff, dispelList:dispelList)); break; default: throw new ArgumentOutOfRangeException(); diff --git a/Lib9c/Model/Skill/Skill.cs b/Lib9c/Model/Skill/Skill.cs index 1f3f4ca71a..78e929ec6b 100644 --- a/Lib9c/Model/Skill/Skill.cs +++ b/Lib9c/Model/Skill/Skill.cs @@ -80,12 +80,29 @@ public override int GetHashCode() foreach (var target in targets.Where(target => target.GetChance(buff.BuffInfo.Chance))) { + var affected = true; + IEnumerable dispelList = null; + var dispel = target.Buffs.Values.FirstOrDefault(bf => bf is Dispel); + // Defence debuff if target has dispel + if (dispel is not null) + { + if (target.Simulator.Random.Next(0, 100) < dispel.BuffInfo.Chance) + { + affected = false; + } + } + + if (affected) + { + dispelList = target.AddBuff(buff); + } infos.Add(new Model.BattleStatus.Skill.SkillInfo(target.Id, target.IsDead, target.Thorn, 0, false, SkillRow.SkillCategory, simulatorWaveTurn, ElementalType.Normal, SkillRow.SkillTargetType, - buff, copyCharacter ? (CharacterBase)target.Clone() : target, dispelList)); + buff, copyCharacter ? (CharacterBase)target.Clone() : target, + affected: affected, dispelList: dispelList)); } } From 0d4c545e07f290593c3dd6bd4d51ad707cebadbe Mon Sep 17 00:00:00 2001 From: hyeon Date: Mon, 4 Mar 2024 23:21:42 +0900 Subject: [PATCH 44/78] Remove wrong, unused draft data --- Lib9c/TableCSV/Skill/SkillBuffSheet.csv | 2 -- Lib9c/TableCSV/Skill/StatBuffSheet.csv | 2 -- 2 files changed, 4 deletions(-) diff --git a/Lib9c/TableCSV/Skill/SkillBuffSheet.csv b/Lib9c/TableCSV/Skill/SkillBuffSheet.csv index ecfd39f498..90fa4d8f9d 100644 --- a/Lib9c/TableCSV/Skill/SkillBuffSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillBuffSheet.csv @@ -219,5 +219,3 @@ skill_id,buff_id 230007,204003 240006,105003 210012,202004 -700007,704000 -700009,705000 \ No newline at end of file diff --git a/Lib9c/TableCSV/Skill/StatBuffSheet.csv b/Lib9c/TableCSV/Skill/StatBuffSheet.csv index 1d9a200585..ce99ed9b2c 100644 --- a/Lib9c/TableCSV/Skill/StatBuffSheet.csv +++ b/Lib9c/TableCSV/Skill/StatBuffSheet.csv @@ -122,5 +122,3 @@ id,group,_name,chance,duration,target_type,stat_type,modify_type,modify_value,is 701000,701000,DRV (Rune),100,0,Self,DRV,Add,0,true 702000,701000,DRR (Rune),100,0,Self,DRR,Add,0,true 703000,703000,CDMG (Rune),100,0,Self,CDMG,Add,0,true -704000,704000,집중,100,10,Self,CDMG,Add,100,true -705000,705000,디버프 제거,100,5,Self,CDMG,Add,100,true \ No newline at end of file From 2e8cf7c6f65d71c4d0166e525de070f2f4e47f9e Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 5 Mar 2024 00:36:09 +0900 Subject: [PATCH 45/78] Add Affected to check skill is affected to target --- Lib9c/Model/BattleStatus/Skill.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib9c/Model/BattleStatus/Skill.cs b/Lib9c/Model/BattleStatus/Skill.cs index c23d737def..a6746da450 100644 --- a/Lib9c/Model/BattleStatus/Skill.cs +++ b/Lib9c/Model/BattleStatus/Skill.cs @@ -23,7 +23,7 @@ public class SkillInfo public readonly bool IsDead; public readonly Guid CharacterId; public readonly IEnumerable? DispelList; - + public readonly bool Affected; public readonly Model.Buff.Buff? Buff; @@ -46,6 +46,7 @@ public SkillInfo(Guid characterId, bool isDead, long thorn, long effect, bool cr Buff = buff; WaveTurn = waveTurn; Target = target; + Affected = affected; DispelList = dispelList; } } From d476f6aab9770a6254fd4d0ecbff41d510c92b88 Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 5 Mar 2024 00:36:54 +0900 Subject: [PATCH 46/78] Update Dispel logic to get target debuff --- Lib9c/Model/Character/CharacterBase.cs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Lib9c/Model/Character/CharacterBase.cs b/Lib9c/Model/Character/CharacterBase.cs index 92bccef59f..ca55d52f15 100644 --- a/Lib9c/Model/Character/CharacterBase.cs +++ b/Lib9c/Model/Character/CharacterBase.cs @@ -383,11 +383,22 @@ protected virtual void EndTurn() // Dispel removes debuffs case Dispel dispel: { - var debuffList = Simulator.SkillSheet.Values - .Where(s => s.SkillType == SkillType.Debuff).Select(s => s.Id); Buffs[dispel.BuffInfo.GroupId] = clone; + var debuffSkillIdList = Simulator.SkillSheet.Values + .Where(s => s.SkillType == SkillType.Debuff).Select(s => s.Id); + var statDebuffList = Simulator.SkillBuffSheet.Values.Where( + bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( + new List(), + (current, bf) => current.Concat(bf.BuffIds).ToList() + ); + var actionDebuffList = Simulator.SkillActionBuffSheet.Values.Where( + bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( + new List(), + (current, bf) => current.Concat(bf.BuffIds).ToList() + ); + foreach (var debuff in - StatBuffs.Where(bf => debuffList.Contains(bf.RowData.Id))) + StatBuffs.Where(bf => statDebuffList.Contains(bf.RowData.Id))) { if (Simulator.Random.Next(0, 100) < action.RowData.Chance) { @@ -397,7 +408,8 @@ protected virtual void EndTurn() } foreach (var debuff in - ActionBuffs.Where(bf => debuffList.Contains(bf.RowData.Id))) + ActionBuffs.Where(bf => + actionDebuffList.Contains(bf.RowData.Id))) { if (Simulator.Random.Next(0, 100) < action.RowData.Chance) { From 11427356c2f9c361326737098f2f1f2700c9183c Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 5 Mar 2024 00:37:10 +0900 Subject: [PATCH 47/78] Test Dispel skill --- .Lib9c.Tests/Model/Skill/CombatTest.cs | 77 ++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/.Lib9c.Tests/Model/Skill/CombatTest.cs b/.Lib9c.Tests/Model/Skill/CombatTest.cs index 45ae780ce0..d352f1f8f5 100644 --- a/.Lib9c.Tests/Model/Skill/CombatTest.cs +++ b/.Lib9c.Tests/Model/Skill/CombatTest.cs @@ -137,6 +137,83 @@ public void Bleed() Assert.Equal(currentHP, skillInfo.Target!.CurrentHP); } + [Theory] + [InlineData(700009, new[] { 600001 })] + [InlineData(700010, new[] { 600001, 704000 })] + public void DispelOnUse(int dispelId, int[] debuffIdList) + { + var actionBuffSheet = _tableSheets.ActionBuffSheet; + + // Add Debuff + foreach (var debuffId in debuffIdList) + { + var debuff = actionBuffSheet.Values.First(bf => bf.Id == debuffId); // 600001 is bleed + _player.AddBuff(BuffFactory.GetActionBuff(_player.Stats, debuff)); + } + + Assert.Equal(debuffIdList.Length, _player.Buffs.Count()); + + // Use Dispel + var skillRow = _tableSheets.SkillSheet.Values.First(bf => bf.Id == dispelId); + var dispelRow = _tableSheets.ActionBuffSheet.Values.First( + bf => bf.Id == _tableSheets.SkillActionBuffSheet.OrderedList.First( + abf => abf.SkillId == dispelId) + .BuffIds.First() + ); + var dispel = new BuffSkill(skillRow, 0, 100, 0, StatType.NONE); + var battleStatus = dispel.Use( + _player, + 0, + BuffFactory.GetBuffs( + _player.Stats, + dispel, + _tableSheets.SkillBuffSheet, + _tableSheets.StatBuffSheet, + _tableSheets.SkillActionBuffSheet, + _tableSheets.ActionBuffSheet + ), + false); + Assert.NotNull(battleStatus); + // Remove Bleed, add Dispel + Assert.Single(_player.Buffs); + Assert.Equal(dispelRow.GroupId, _player.Buffs.First().Value.BuffInfo.GroupId); + } + + [Fact] + public void DispelOnDuration() + { + const int actionBuffId = 708000; // Dispel with duration + var actionBuffSheet = _tableSheets.ActionBuffSheet; + + // Use Dispel first + var dispel = actionBuffSheet.Values.First(bf => bf.Id == actionBuffId); + _player.AddBuff(BuffFactory.GetActionBuff(_player.Stats, dispel)); + Assert.Single(_player.Buffs); + + // Use Bleed + var debuffRow = + _tableSheets.SkillSheet.Values.First(bf => bf.Id == 600001); // 600001 is bleed + var debuff = new BuffSkill(debuffRow, 100, 100, 0, StatType.NONE); + var battleStatus = debuff.Use( + _enemy, + 0, + BuffFactory.GetBuffs( + _enemy.Stats, + debuff, + _tableSheets.SkillBuffSheet, + _tableSheets.StatBuffSheet, + _tableSheets.SkillActionBuffSheet, + _tableSheets.ActionBuffSheet + ), + false); + + // Bleed should be blocked + Assert.NotNull(battleStatus); + // Remove Bleed, add Dispel + Assert.Single(_player.Buffs); + Assert.False(battleStatus.SkillInfos.First().Affected); + } + [Theory] // Buff [InlineData(SkillType.Buff, true)] From 02b74c5c57edd4f1be5010619ace154bda0b9bfd Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 5 Mar 2024 10:30:20 +0900 Subject: [PATCH 48/78] Dispel blocks only debuffs --- .Lib9c.Tests/Model/Skill/CombatTest.cs | 37 +++++++++++++++++++++++++- Lib9c/Model/Skill/Skill.cs | 7 ++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/.Lib9c.Tests/Model/Skill/CombatTest.cs b/.Lib9c.Tests/Model/Skill/CombatTest.cs index d352f1f8f5..5a44df0ed2 100644 --- a/.Lib9c.Tests/Model/Skill/CombatTest.cs +++ b/.Lib9c.Tests/Model/Skill/CombatTest.cs @@ -180,7 +180,7 @@ public void DispelOnUse(int dispelId, int[] debuffIdList) } [Fact] - public void DispelOnDuration() + public void DispelOnDuration_Block() { const int actionBuffId = 708000; // Dispel with duration var actionBuffSheet = _tableSheets.ActionBuffSheet; @@ -214,6 +214,41 @@ public void DispelOnDuration() Assert.False(battleStatus.SkillInfos.First().Affected); } + [Fact] + public void DispelOnDuration_Affect() + { + const int actionBuffId = 708000; // Dispel with duration + var actionBuffSheet = _tableSheets.ActionBuffSheet; + + // Use Dispel first + var dispel = actionBuffSheet.Values.First(bf => bf.Id == actionBuffId); + _player.AddBuff(BuffFactory.GetActionBuff(_player.Stats, dispel)); + Assert.Single(_player.Buffs); + + // Use Bleed + var debuffRow = + _tableSheets.SkillSheet.Values.First(bf => bf.Id == 700007); // 700007 is Focus + var debuff = new BuffSkill(debuffRow, 100, 100, 0, StatType.NONE); + var battleStatus = debuff.Use( + _player, + 0, + BuffFactory.GetBuffs( + _player.Stats, + debuff, + _tableSheets.SkillBuffSheet, + _tableSheets.StatBuffSheet, + _tableSheets.SkillActionBuffSheet, + _tableSheets.ActionBuffSheet + ), + false); + + // Bleed should be blocked + Assert.NotNull(battleStatus); + // Add Focus without block + Assert.Equal(2, _player.Buffs.Count); + Assert.True(battleStatus.SkillInfos.First().Affected); + } + [Theory] // Buff [InlineData(SkillType.Buff, true)] diff --git a/Lib9c/Model/Skill/Skill.cs b/Lib9c/Model/Skill/Skill.cs index 78e929ec6b..3e394b57ca 100644 --- a/Lib9c/Model/Skill/Skill.cs +++ b/Lib9c/Model/Skill/Skill.cs @@ -84,7 +84,12 @@ public override int GetHashCode() IEnumerable dispelList = null; var dispel = target.Buffs.Values.FirstOrDefault(bf => bf is Dispel); // Defence debuff if target has dispel - if (dispel is not null) + if (dispel is not null && + ((buff is StatBuff statBuff && statBuff.RowData.Value < 0) || + (buff is ActionBuff actionBuff && + actionBuff.RowData.ActionBuffType is + ActionBuffType.Bleed or ActionBuffType.Stun)) + ) { if (target.Simulator.Random.Next(0, 100) < dispel.BuffInfo.Chance) { From bd2a2db82d0b37bba7ef22c2be52a9153a8b3cc8 Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 5 Mar 2024 11:33:35 +0900 Subject: [PATCH 49/78] Make Dispel works on arena --- Lib9c/Model/BattleStatus/Arena/ArenaSkill.cs | 3 ++ Lib9c/Model/Character/ArenaCharacter.cs | 20 +++++++++++--- Lib9c/Model/Skill/Arena/ArenaSkill.cs | 29 +++++++++++++++++--- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/Lib9c/Model/BattleStatus/Arena/ArenaSkill.cs b/Lib9c/Model/BattleStatus/Arena/ArenaSkill.cs index da3d99178b..896420b710 100644 --- a/Lib9c/Model/BattleStatus/Arena/ArenaSkill.cs +++ b/Lib9c/Model/BattleStatus/Arena/ArenaSkill.cs @@ -19,6 +19,7 @@ public class ArenaSkillInfo public readonly ElementalType ElementalType; public readonly SkillTargetType SkillTargetType; public readonly int Turn; + public readonly bool Affected; public readonly IEnumerable? DispelList; public readonly Model.Buff.Buff? Buff; @@ -26,6 +27,7 @@ public class ArenaSkillInfo public ArenaSkillInfo(ArenaCharacter character, long effect, bool critical, SkillCategory skillCategory, int turn, ElementalType elementalType = ElementalType.Normal, SkillTargetType targetType = SkillTargetType.Enemy, Model.Buff.Buff? buff = null, + bool affected = true, IEnumerable? dispelList = null) { Target = character; @@ -36,6 +38,7 @@ public ArenaSkillInfo(ArenaCharacter character, long effect, bool critical, Skil SkillTargetType = targetType; Buff = buff; Turn = turn; + Affected = affected; DispelList = dispelList; } } diff --git a/Lib9c/Model/Character/ArenaCharacter.cs b/Lib9c/Model/Character/ArenaCharacter.cs index c504defa90..7a690d4ea7 100644 --- a/Lib9c/Model/Character/ArenaCharacter.cs +++ b/Lib9c/Model/Character/ArenaCharacter.cs @@ -894,11 +894,22 @@ public void SpawnV2(ArenaCharacter target) // Dispel removes debuffs case Dispel dispel: { - var debuffList = _skillSheet.Values - .Where(s => s.SkillType == SkillType.Debuff).Select(s => s.Id); Buffs[dispel.BuffInfo.GroupId] = clone; + var debuffSkillIdList = _skillSheet.Values + .Where(s => s.SkillType == SkillType.Debuff).Select(s => s.Id); + var statDebuffList = _skillBuffSheet.Values.Where( + bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( + new List(), + (current, bf) => current.Concat(bf.BuffIds).ToList() + ); + var actionDebuffList = _skillActionBuffSheet.Values.Where( + bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( + new List(), + (current, bf) => current.Concat(bf.BuffIds).ToList() + ); + foreach (var debuff in - StatBuffs.Where(bf => debuffList.Contains(bf.RowData.Id))) + StatBuffs.Where(bf => statDebuffList.Contains(bf.RowData.Id))) { if (Simulator.Random.Next(0, 100) < action.RowData.Chance) { @@ -908,7 +919,8 @@ public void SpawnV2(ArenaCharacter target) } foreach (var debuff in - ActionBuffs.Where(bf => debuffList.Contains(bf.RowData.Id))) + ActionBuffs.Where(bf => + actionDebuffList.Contains(bf.RowData.Id))) { if (Simulator.Random.Next(0, 100) < action.RowData.Chance) { diff --git a/Lib9c/Model/Skill/Arena/ArenaSkill.cs b/Lib9c/Model/Skill/Arena/ArenaSkill.cs index e125fec53e..2e0033bf37 100644 --- a/Lib9c/Model/Skill/Arena/ArenaSkill.cs +++ b/Lib9c/Model/Skill/Arena/ArenaSkill.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Linq; +using Nekoyume.Model.Buff; using Nekoyume.Model.Elemental; using Nekoyume.Model.Stat; using Nekoyume.TableData; @@ -84,13 +86,31 @@ public override int GetHashCode() var infos = new List(); foreach (var buff in buffs) { - IEnumerable dispelList; + IEnumerable dispelList = null; switch (buff.BuffInfo.SkillTargetType) { case SkillTargetType.Enemy: case SkillTargetType.Enemies: - dispelList = target.AddBuff(buff); - infos.Add(GetSkillInfo(target, turn, buff, dispelList: dispelList)); + var affected = true; + var dispel = target.Buffs.Values.FirstOrDefault(bf => bf is Dispel); + if (dispel is not null && + ((buff is StatBuff statBuff && statBuff.RowData.Value < 0) || + (buff is ActionBuff actionBuff && actionBuff.RowData.ActionBuffType is + ActionBuffType.Bleed or ActionBuffType.Stun)) + ) + { + if (target.Simulator.Random.Next(0, 100) < dispel.BuffInfo.Chance) + { + affected = false; + } + } + + if (affected) + { + dispelList = target.AddBuff(buff); + } + + infos.Add(GetSkillInfo(target, turn, buff, affected: affected, dispelList: dispelList)); break; case SkillTargetType.Self: @@ -139,7 +159,7 @@ public override int GetHashCode() } private BattleStatus.Arena.ArenaSkill.ArenaSkillInfo GetSkillInfo(ICloneable target, - int turn, Buff.Buff buff, IEnumerable dispelList = null) + int turn, Buff.Buff buff, bool affected = true, IEnumerable dispelList = null) { return new BattleStatus.Arena.ArenaSkill.ArenaSkillInfo( (ArenaCharacter)target.Clone(), @@ -150,6 +170,7 @@ private BattleStatus.Arena.ArenaSkill.ArenaSkillInfo GetSkillInfo(ICloneable tar ElementalType.Normal, SkillRow.SkillTargetType, buff, + affected, dispelList ); } From f46b27d72f63e8bb90c0c59d7e01696276d19574 Mon Sep 17 00:00:00 2001 From: hyeon Date: Wed, 6 Mar 2024 09:31:37 +0900 Subject: [PATCH 50/78] Embed debuff list to simulator --- Lib9c/Battle/Simulator.cs | 17 +++++++++++++++++ Lib9c/Model/Character/CharacterBase.cs | 17 +++-------------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Lib9c/Battle/Simulator.cs b/Lib9c/Battle/Simulator.cs index 7d43a46bcd..76b6532a27 100644 --- a/Lib9c/Battle/Simulator.cs +++ b/Lib9c/Battle/Simulator.cs @@ -5,6 +5,7 @@ using Nekoyume.Model; using Nekoyume.Model.BattleStatus; using Nekoyume.Model.Item; +using Nekoyume.Model.Skill; using Nekoyume.Model.State; using Nekoyume.TableData; using Priority_Queue; @@ -28,6 +29,10 @@ public abstract class Simulator : ISimulator public readonly CharacterSheet CharacterSheet; public readonly CharacterLevelSheet CharacterLevelSheet; public readonly EquipmentItemSetEffectSheet EquipmentItemSetEffectSheet; + + public readonly List StatDebuffList; + public readonly List ActionDebuffList; + protected const int MaxTurn = 200; public int TurnNumber; public int WaveNumber { get; protected set; } @@ -60,6 +65,18 @@ SimulatorSheetsV1 simulatorSheets CharacterSheet = simulatorSheets.CharacterSheet; CharacterLevelSheet = simulatorSheets.CharacterLevelSheet; EquipmentItemSetEffectSheet = simulatorSheets.EquipmentItemSetEffectSheet; + var debuffSkillIdList = SkillSheet.Values + .Where(s => s.SkillType == SkillType.Debuff).Select(s => s.Id); + StatDebuffList = SkillBuffSheet.Values.Where( + bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( + new List(), + (current, bf) => current.Concat(bf.BuffIds).ToList() + ); + ActionDebuffList = SkillActionBuffSheet.Values.Where( + bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( + new List(), + (current, bf) => current.Concat(bf.BuffIds).ToList() + ); Log = new BattleLog(); player.Simulator = this; Player = player; diff --git a/Lib9c/Model/Character/CharacterBase.cs b/Lib9c/Model/Character/CharacterBase.cs index 7e84d25f99..2b31803312 100644 --- a/Lib9c/Model/Character/CharacterBase.cs +++ b/Lib9c/Model/Character/CharacterBase.cs @@ -389,21 +389,10 @@ protected virtual void EndTurn() case Dispel dispel: { Buffs[dispel.BuffInfo.GroupId] = clone; - var debuffSkillIdList = Simulator.SkillSheet.Values - .Where(s => s.SkillType == SkillType.Debuff).Select(s => s.Id); - var statDebuffList = Simulator.SkillBuffSheet.Values.Where( - bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( - new List(), - (current, bf) => current.Concat(bf.BuffIds).ToList() - ); - var actionDebuffList = Simulator.SkillActionBuffSheet.Values.Where( - bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( - new List(), - (current, bf) => current.Concat(bf.BuffIds).ToList() - ); foreach (var debuff in - StatBuffs.Where(bf => statDebuffList.Contains(bf.RowData.Id))) + StatBuffs.Where(bf => + Simulator.StatDebuffList.Contains(bf.RowData.Id))) { if (Simulator.Random.Next(0, 100) < action.RowData.Chance) { @@ -414,7 +403,7 @@ protected virtual void EndTurn() foreach (var debuff in ActionBuffs.Where(bf => - actionDebuffList.Contains(bf.RowData.Id))) + Simulator.ActionDebuffList.Contains(bf.RowData.Id))) { if (Simulator.Random.Next(0, 100) < action.RowData.Chance) { From 5002869bc66f3fd1b4f3e6d7a001dcbd97e15866 Mon Sep 17 00:00:00 2001 From: hyeon Date: Wed, 6 Mar 2024 11:24:27 +0900 Subject: [PATCH 51/78] Set debuff list to ArenaCharacter --- Lib9c/Model/Character/ArenaCharacter.cs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Lib9c/Model/Character/ArenaCharacter.cs b/Lib9c/Model/Character/ArenaCharacter.cs index 7a690d4ea7..40a6c0a377 100644 --- a/Lib9c/Model/Character/ArenaCharacter.cs +++ b/Lib9c/Model/Character/ArenaCharacter.cs @@ -30,6 +30,9 @@ public class ArenaCharacter : ICloneable private readonly ActionBuffSheet _actionBuffSheet; private readonly ArenaSkills _skills; + private readonly List _statDebuffList; + private readonly List _actionDebuffList; + public readonly IArenaSimulator Simulator; public readonly ArenaSkills _runeSkills = new ArenaSkills(); public readonly Dictionary RuneSkillCooldownMap = new Dictionary(); @@ -141,6 +144,20 @@ public ArenaCharacter( _skillActionBuffSheet = sheets.SkillActionBuffSheet; _actionBuffSheet = sheets.ActionBuffSheet; + var debuffSkillIdList = _skillSheet.Values + .Where(s => s.SkillType == SkillType.Debuff).Select(s => s.Id); + _statDebuffList = _skillBuffSheet.Values.Where( + bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( + new List(), + (current, bf) => current.Concat(bf.BuffIds).ToList() + ); + _actionDebuffList = _skillActionBuffSheet.Values.Where( + bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( + new List(), + (current, bf) => current.Concat(bf.BuffIds).ToList() + ); + + Simulator = simulator; Stats = GetStatV1( digest, @@ -221,6 +238,9 @@ private ArenaCharacter(ArenaCharacter value) _skillActionBuffSheet = value._skillActionBuffSheet; _actionBuffSheet = value._actionBuffSheet; + _statDebuffList = value._statDebuffList; + _actionDebuffList = value._actionDebuffList; + Simulator = value.Simulator; Stats = new CharacterStats(value.Stats); _skills = value._skills; From d6e397dd3860c6ad2707362bab15c5a80ac57c66 Mon Sep 17 00:00:00 2001 From: hyeon Date: Wed, 6 Mar 2024 11:24:44 +0900 Subject: [PATCH 52/78] Test Dispel skill --- .../Model/Skill/Arena/ArenaCombatTest.cs | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 .Lib9c.Tests/Model/Skill/Arena/ArenaCombatTest.cs diff --git a/.Lib9c.Tests/Model/Skill/Arena/ArenaCombatTest.cs b/.Lib9c.Tests/Model/Skill/Arena/ArenaCombatTest.cs new file mode 100644 index 0000000000..7db7484ce0 --- /dev/null +++ b/.Lib9c.Tests/Model/Skill/Arena/ArenaCombatTest.cs @@ -0,0 +1,100 @@ +namespace Lib9c.Tests.Model.Skill.Arena +{ + using System.Collections.Generic; + using System.Linq; + using Lib9c.Tests.Action; + using Nekoyume.Arena; + using Nekoyume.Model; + using Nekoyume.Model.Buff; + using Nekoyume.Model.Skill.Arena; + using Nekoyume.Model.Stat; + using Nekoyume.Model.State; + using Xunit; + + public class ArenaCombatTest + { + private readonly TableSheets _tableSheets; + private readonly AvatarState _avatar1; + private readonly AvatarState _avatar2; + + private readonly ArenaAvatarState _arenaAvatar1; + private readonly ArenaAvatarState _arenaAvatar2; + + public ArenaCombatTest() + { + _tableSheets = new TableSheets(TableSheetsImporter.ImportSheets()); + _avatar1 = new AvatarState( + default, + default, + 0, + _tableSheets.GetAvatarSheets(), + new GameConfigState(), + default + ); + _avatar2 = new AvatarState( + default, + default, + 0, + _tableSheets.GetAvatarSheets(), + new GameConfigState(), + default + ); + + _arenaAvatar1 = new ArenaAvatarState(_avatar1); + _arenaAvatar2 = new ArenaAvatarState(_avatar2); + } + + [Theory] + [InlineData(700009, new[] { 600001 })] + [InlineData(700010, new[] { 600001, 704000 })] + public void DispelOnUse(int dispelId, int[] debuffIdList) + { + var arenaSheets = _tableSheets.GetArenaSimulatorSheets(); + var myDigest = new ArenaPlayerDigest(_avatar1, _arenaAvatar1); + var enemyDigest = new ArenaPlayerDigest(_avatar2, _arenaAvatar2); + var simulator = new ArenaSimulator(new TestRandom()); + var challenger = new ArenaCharacter( + simulator, + myDigest, + arenaSheets, + simulator.HpModifier, + new List() + ); + var enemy = new ArenaCharacter( + simulator, + enemyDigest, + arenaSheets, + simulator.HpModifier, + new List() + ); + + // Add Debuff to avatar1 + foreach (var debuffId in debuffIdList) + { + var debuffRow = _tableSheets.ActionBuffSheet.Values.First(bf => bf.Id == debuffId); + challenger.AddBuff(BuffFactory.GetActionBuff(challenger.Stats, debuffRow)); + } + + Assert.Equal(debuffIdList.Length, challenger.Buffs.Count); + + // Use Dispel + var skillRow = _tableSheets.SkillSheet.Values.First(bf => bf.Id == dispelId); + var dispelRow = _tableSheets.ActionBuffSheet.Values.First( + bf => bf.Id == _tableSheets.SkillActionBuffSheet.OrderedList.First( + abf => abf.SkillId == dispelId) + .BuffIds.First() + ); + var dispel = new ArenaBuffSkill(skillRow, 0, 100, 0, StatType.NONE); + dispel.Use(challenger, challenger, simulator.Turn, BuffFactory.GetBuffs( + challenger.Stats, + dispel, + _tableSheets.SkillBuffSheet, + _tableSheets.StatBuffSheet, + _tableSheets.SkillActionBuffSheet, + _tableSheets.ActionBuffSheet + )); + Assert.Single(challenger.Buffs); + Assert.Equal(dispelRow.GroupId, challenger.Buffs.First().Value.BuffInfo.GroupId); + } + } +} From a994e49a0cbcf2e32abd2e2d74d0ebf1c0e0756f Mon Sep 17 00:00:00 2001 From: hyeon Date: Wed, 6 Mar 2024 18:02:10 +0900 Subject: [PATCH 53/78] Merge two loops to one --- Lib9c/Model/Character/ArenaCharacter.cs | 34 +++++++++---------- Lib9c/Model/Character/CharacterBase.cs | 43 ++++++++++++++++--------- 2 files changed, 44 insertions(+), 33 deletions(-) diff --git a/Lib9c/Model/Character/ArenaCharacter.cs b/Lib9c/Model/Character/ArenaCharacter.cs index 40a6c0a377..5675523e74 100644 --- a/Lib9c/Model/Character/ArenaCharacter.cs +++ b/Lib9c/Model/Character/ArenaCharacter.cs @@ -917,35 +917,35 @@ public void SpawnV2(ArenaCharacter target) Buffs[dispel.BuffInfo.GroupId] = clone; var debuffSkillIdList = _skillSheet.Values .Where(s => s.SkillType == SkillType.Debuff).Select(s => s.Id); - var statDebuffList = _skillBuffSheet.Values.Where( + var debuffList = _skillBuffSheet.Values.Where( bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( new List(), (current, bf) => current.Concat(bf.BuffIds).ToList() ); - var actionDebuffList = _skillActionBuffSheet.Values.Where( + + debuffList = _skillActionBuffSheet.Values.Where( bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( - new List(), + debuffList, (current, bf) => current.Concat(bf.BuffIds).ToList() ); - foreach (var debuff in - StatBuffs.Where(bf => statDebuffList.Contains(bf.RowData.Id))) + foreach (var debuff in Buffs.Values) { - if (Simulator.Random.Next(0, 100) < action.RowData.Chance) + if (debuff is StatBuff statBuff && + debuffList.Contains(statBuff.RowData.Id) && + Simulator.Random.Next(0, 100) < action.RowData.Chance + ) { - dispelList.Add(debuff); - RemoveStatBuff(debuff); + dispelList.Add(statBuff); + RemoveStatBuff(statBuff); } - } - - foreach (var debuff in - ActionBuffs.Where(bf => - actionDebuffList.Contains(bf.RowData.Id))) - { - if (Simulator.Random.Next(0, 100) < action.RowData.Chance) + else if (debuff is ActionBuff actionBuff && + debuffList.Contains(actionBuff.RowData.Id) && + Simulator.Random.Next(0, 100) < action.RowData.Chance + ) { - dispelList.Add(debuff); - RemoveActionBuff(debuff); + dispelList.Add(actionBuff); + RemoveActionBuff(actionBuff); } } diff --git a/Lib9c/Model/Character/CharacterBase.cs b/Lib9c/Model/Character/CharacterBase.cs index 2b31803312..5862994ee9 100644 --- a/Lib9c/Model/Character/CharacterBase.cs +++ b/Lib9c/Model/Character/CharacterBase.cs @@ -389,26 +389,37 @@ protected virtual void EndTurn() case Dispel dispel: { Buffs[dispel.BuffInfo.GroupId] = clone; - - foreach (var debuff in - StatBuffs.Where(bf => - Simulator.StatDebuffList.Contains(bf.RowData.Id))) + var debuffSkillIdList = Simulator.SkillSheet.Values + .Where(s => s.SkillType == SkillType.Debuff).Select(s => s.Id); + var debuffList = Simulator.SkillBuffSheet.Values.Where( + bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( + new List(), + (current, bf) => current.Concat(bf.BuffIds).ToList() + ); + + debuffList = Simulator.SkillActionBuffSheet.Values.Where( + bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( + debuffList, + (current, bf) => current.Concat(bf.BuffIds).ToList() + ); + + foreach (var debuff in Buffs.Values) { - if (Simulator.Random.Next(0, 100) < action.RowData.Chance) + if (debuff is StatBuff statBuff && + debuffList.Contains(statBuff.RowData.Id) && + Simulator.Random.Next(0, 100) < action.RowData.Chance + ) { - dispelList.Add(debuff); - RemoveStatBuff(debuff); + dispelList.Add(statBuff); + RemoveStatBuff(statBuff); } - } - - foreach (var debuff in - ActionBuffs.Where(bf => - Simulator.ActionDebuffList.Contains(bf.RowData.Id))) - { - if (Simulator.Random.Next(0, 100) < action.RowData.Chance) + else if (debuff is ActionBuff actionBuff && + debuffList.Contains(actionBuff.RowData.Id) && + Simulator.Random.Next(0, 100) < action.RowData.Chance + ) { - dispelList.Add(debuff); - RemoveActionBuff(debuff); + dispelList.Add(actionBuff); + RemoveActionBuff(actionBuff); } } From 998c92ad938098c1a9f23fbf047884ca0148b395 Mon Sep 17 00:00:00 2001 From: hyeon Date: Wed, 6 Mar 2024 18:05:46 +0900 Subject: [PATCH 54/78] Add Dispel type to SkillSheet --- Lib9c/TableCSV/Skill/SkillSheet.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib9c/TableCSV/Skill/SkillSheet.csv b/Lib9c/TableCSV/Skill/SkillSheet.csv index d929a7db83..35d1a0c54f 100644 --- a/Lib9c/TableCSV/Skill/SkillSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillSheet.csv @@ -173,5 +173,5 @@ _250001,속도 증가(전체),Normal,Buff,SpeedBuff,Ally,1,1 // 미구현 700007,집중,Normal,Buff,Focus,Self,1,15 700008,더블 어택,Normal,Attack,DoubleAttack,Enemy,2,15,true 700009,디버프 제거,Normal,Buff,Buff,Self,1,15 -700010,면역,Normal,Buff,Buff,Self,1,15 +700010,면역,Normal,Buff,Dispel,Self,1,15 700011,HP 비례 데미지,Normal,Attack,BlowAttack,Enemy,1,15 From 80f534cac16166a50d134b0b27358b8187ea04c4 Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 7 Mar 2024 09:42:07 +0900 Subject: [PATCH 55/78] Write summary to AddBuff function to help to understand dispel effect --- Lib9c/Model/Character/CharacterBase.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Lib9c/Model/Character/CharacterBase.cs b/Lib9c/Model/Character/CharacterBase.cs index 5862994ee9..667e0fd0cb 100644 --- a/Lib9c/Model/Character/CharacterBase.cs +++ b/Lib9c/Model/Character/CharacterBase.cs @@ -356,6 +356,14 @@ protected virtual void EndTurn() #region Buff + /// + /// Add buff/debuff to target; it means buff/debuff is used by caster. + /// When `Dispel` is used, it can remove prev. debuffs on target. + /// All the removed debuffs will be returned and saved in battle log. + /// + /// + /// + /// An enumerable of removed debuffs from target. `null` will be returned if nothing eliminated. public IEnumerable AddBuff(Buff.Buff buff, bool updateImmediate = true) { if (Buffs.TryGetValue(buff.BuffInfo.GroupId, out var outBuff) && @@ -408,7 +416,7 @@ protected virtual void EndTurn() if (debuff is StatBuff statBuff && debuffList.Contains(statBuff.RowData.Id) && Simulator.Random.Next(0, 100) < action.RowData.Chance - ) + ) { dispelList.Add(statBuff); RemoveStatBuff(statBuff); From 974bb9d688a2c2bd42192e443aac5d566355717b Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 7 Mar 2024 10:17:39 +0900 Subject: [PATCH 56/78] Update ISkill interface to get this skill is buff or not --- Lib9c/Model/Skill/ISkill.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Lib9c/Model/Skill/ISkill.cs b/Lib9c/Model/Skill/ISkill.cs index 59972fe7a7..725756a8c0 100644 --- a/Lib9c/Model/Skill/ISkill.cs +++ b/Lib9c/Model/Skill/ISkill.cs @@ -16,5 +16,8 @@ public interface ISkill public StatType ReferencedStatType { get; } public SkillCustomField? CustomField { get; } public void Update(int chance, long power, int statPowerRatio); + + public bool IsBuff(); + public bool IsDebuff(); } } From 30229314c017e5694ae3f1f7e7cbe96dbf5d1723 Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 7 Mar 2024 10:19:26 +0900 Subject: [PATCH 57/78] Make all skills and buffs can check it is buff or not --- Lib9c/Model/Buff/ActionBuff.cs | 18 ++++++++++++++++++ Lib9c/Model/Buff/Buff.cs | 3 +++ Lib9c/Model/Buff/StatBuff.cs | 10 ++++++++++ Lib9c/Model/Skill/Arena/ArenaSkill.cs | 10 ++++++++++ Lib9c/Model/Skill/Skill.cs | 10 ++++++++++ 5 files changed, 51 insertions(+) diff --git a/Lib9c/Model/Buff/ActionBuff.cs b/Lib9c/Model/Buff/ActionBuff.cs index 91ecac20fd..b6cab331f0 100644 --- a/Lib9c/Model/Buff/ActionBuff.cs +++ b/Lib9c/Model/Buff/ActionBuff.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using Nekoyume.Model.Skill; using Nekoyume.TableData; @@ -7,6 +9,12 @@ namespace Nekoyume.Model.Buff [Serializable] public abstract class ActionBuff : Buff { + private readonly IEnumerable _debuffTypes = new List + { + ActionBuffType.Bleed, + ActionBuffType.Stun, + }; + public ActionBuffSheet.Row RowData { get; } public SkillCustomField? CustomField { get; } @@ -27,5 +35,15 @@ protected ActionBuff(ActionBuff value) : base(value) RowData = value.RowData; CustomField = value.CustomField; } + + public override bool IsBuff() + { + return !IsDebuff(); + } + + public override bool IsDebuff() + { + return _debuffTypes.Contains(RowData.ActionBuffType); + } } } diff --git a/Lib9c/Model/Buff/Buff.cs b/Lib9c/Model/Buff/Buff.cs index b057503e47..3659f5e7af 100644 --- a/Lib9c/Model/Buff/Buff.cs +++ b/Lib9c/Model/Buff/Buff.cs @@ -29,6 +29,9 @@ public virtual IEnumerable GetTarget(CharacterBase caster) return BuffInfo.SkillTargetType.GetTarget(caster); } + public abstract bool IsBuff(); + public abstract bool IsDebuff(); + public abstract object Clone(); } diff --git a/Lib9c/Model/Buff/StatBuff.cs b/Lib9c/Model/Buff/StatBuff.cs index 4af2e726db..348adc9967 100644 --- a/Lib9c/Model/Buff/StatBuff.cs +++ b/Lib9c/Model/Buff/StatBuff.cs @@ -42,6 +42,16 @@ public StatModifier GetModifier() value); } + public override bool IsBuff() + { + return RowData.Value >= 0; + } + + public override bool IsDebuff() + { + return RowData.Value < 0; + } + public override object Clone() { return new StatBuff(this); diff --git a/Lib9c/Model/Skill/Arena/ArenaSkill.cs b/Lib9c/Model/Skill/Arena/ArenaSkill.cs index 2e0033bf37..d02f97cfb0 100644 --- a/Lib9c/Model/Skill/Arena/ArenaSkill.cs +++ b/Lib9c/Model/Skill/Arena/ArenaSkill.cs @@ -182,5 +182,15 @@ public void Update(int chance, long power, int statPowerRatio) Power = power; StatPowerRatio = statPowerRatio; } + + public bool IsBuff() + { + return SkillRow.SkillType is SkillType.Buff; + } + + public bool IsDebuff() + { + return SkillRow.SkillType is SkillType.Debuff; + } } } diff --git a/Lib9c/Model/Skill/Skill.cs b/Lib9c/Model/Skill/Skill.cs index 3e394b57ca..d44ab0beed 100644 --- a/Lib9c/Model/Skill/Skill.cs +++ b/Lib9c/Model/Skill/Skill.cs @@ -121,6 +121,16 @@ public void Update(int chance, long power, int statPowerRatio) StatPowerRatio = statPowerRatio; } + public bool IsBuff() + { + return SkillRow.SkillType is SkillType.Buff; + } + + public bool IsDebuff() + { + return SkillRow.SkillType is SkillType.Debuff; + } + public IValue Serialize() { var dict = new Bencodex.Types.Dictionary(new Dictionary From c6513df44e28fd9a819cf2fee6b4726554a746ef Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 7 Mar 2024 10:20:31 +0900 Subject: [PATCH 58/78] Update buff logic - Use `IsDebuff()` in `AddBuff()` method - Use `IsDebuff()` in `ProcessBuff()` method --- Lib9c/Model/Character/ArenaCharacter.cs | 48 +++++++++---------------- Lib9c/Model/Character/CharacterBase.cs | 44 ++++++++--------------- Lib9c/Model/Skill/Arena/ArenaSkill.cs | 14 ++++---- Lib9c/Model/Skill/Skill.cs | 7 +--- 4 files changed, 38 insertions(+), 75 deletions(-) diff --git a/Lib9c/Model/Character/ArenaCharacter.cs b/Lib9c/Model/Character/ArenaCharacter.cs index 5675523e74..3230e94bc5 100644 --- a/Lib9c/Model/Character/ArenaCharacter.cs +++ b/Lib9c/Model/Character/ArenaCharacter.cs @@ -915,37 +915,22 @@ public void SpawnV2(ArenaCharacter target) case Dispel dispel: { Buffs[dispel.BuffInfo.GroupId] = clone; - var debuffSkillIdList = _skillSheet.Values - .Where(s => s.SkillType == SkillType.Debuff).Select(s => s.Id); - var debuffList = _skillBuffSheet.Values.Where( - bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( - new List(), - (current, bf) => current.Concat(bf.BuffIds).ToList() - ); - - debuffList = _skillActionBuffSheet.Values.Where( - bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( - debuffList, - (current, bf) => current.Concat(bf.BuffIds).ToList() - ); - - foreach (var debuff in Buffs.Values) - { - if (debuff is StatBuff statBuff && - debuffList.Contains(statBuff.RowData.Id) && - Simulator.Random.Next(0, 100) < action.RowData.Chance + + foreach (var bff in Buffs.Values.Where( + bff => bff.IsDebuff() && + Simulator.Random.Next(0, 100) < + action.RowData.Chance) ) + { + dispelList.Add(bff); + switch (bff) { - dispelList.Add(statBuff); - RemoveStatBuff(statBuff); - } - else if (debuff is ActionBuff actionBuff && - debuffList.Contains(actionBuff.RowData.Id) && - Simulator.Random.Next(0, 100) < action.RowData.Chance - ) - { - dispelList.Add(actionBuff); - RemoveActionBuff(actionBuff); + case StatBuff statBuff: + RemoveStatBuff(statBuff); + break; + case ActionBuff actionBuff: + RemoveActionBuff(actionBuff); + break; } } @@ -982,9 +967,8 @@ public void RemoveActionBuff(ActionBuff removedBuff) public void RemoveStatBuff(StatBuff removedBuff) { - Stats.RemoveBuff(removedBuff); - Buffs.Remove(removedBuff.RowData.GroupId); - + Stats.RemoveBuff(removedBuff); + Buffs.Remove(removedBuff.RowData.GroupId); } public void RemoveRecentStatBuff() diff --git a/Lib9c/Model/Character/CharacterBase.cs b/Lib9c/Model/Character/CharacterBase.cs index 667e0fd0cb..02e5ebd382 100644 --- a/Lib9c/Model/Character/CharacterBase.cs +++ b/Lib9c/Model/Character/CharacterBase.cs @@ -397,37 +397,23 @@ protected virtual void EndTurn() case Dispel dispel: { Buffs[dispel.BuffInfo.GroupId] = clone; - var debuffSkillIdList = Simulator.SkillSheet.Values - .Where(s => s.SkillType == SkillType.Debuff).Select(s => s.Id); - var debuffList = Simulator.SkillBuffSheet.Values.Where( - bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( - new List(), - (current, bf) => current.Concat(bf.BuffIds).ToList() - ); - - debuffList = Simulator.SkillActionBuffSheet.Values.Where( - bf => debuffSkillIdList.Contains(bf.SkillId)).Aggregate( - debuffList, - (current, bf) => current.Concat(bf.BuffIds).ToList() - ); - - foreach (var debuff in Buffs.Values) + + foreach (var bff in Buffs.Values.Where( + bff => bff.IsDebuff() && + Simulator.Random.Next(0, 100) < + action.RowData.Chance) + ) { - if (debuff is StatBuff statBuff && - debuffList.Contains(statBuff.RowData.Id) && - Simulator.Random.Next(0, 100) < action.RowData.Chance - ) - { - dispelList.Add(statBuff); - RemoveStatBuff(statBuff); - } - else if (debuff is ActionBuff actionBuff && - debuffList.Contains(actionBuff.RowData.Id) && - Simulator.Random.Next(0, 100) < action.RowData.Chance - ) + dispelList.Add(bff); + + switch (bff) { - dispelList.Add(actionBuff); - RemoveActionBuff(actionBuff); + case StatBuff statBuff: + RemoveStatBuff(statBuff); + break; + case ActionBuff actionBuff: + RemoveActionBuff(actionBuff); + break; } } diff --git a/Lib9c/Model/Skill/Arena/ArenaSkill.cs b/Lib9c/Model/Skill/Arena/ArenaSkill.cs index d02f97cfb0..eb6625c782 100644 --- a/Lib9c/Model/Skill/Arena/ArenaSkill.cs +++ b/Lib9c/Model/Skill/Arena/ArenaSkill.cs @@ -93,11 +93,7 @@ public override int GetHashCode() case SkillTargetType.Enemies: var affected = true; var dispel = target.Buffs.Values.FirstOrDefault(bf => bf is Dispel); - if (dispel is not null && - ((buff is StatBuff statBuff && statBuff.RowData.Value < 0) || - (buff is ActionBuff actionBuff && actionBuff.RowData.ActionBuffType is - ActionBuffType.Bleed or ActionBuffType.Stun)) - ) + if (dispel is not null && buff.IsDebuff()) { if (target.Simulator.Random.Next(0, 100) < dispel.BuffInfo.Chance) { @@ -110,13 +106,14 @@ public override int GetHashCode() dispelList = target.AddBuff(buff); } - infos.Add(GetSkillInfo(target, turn, buff, affected: affected, dispelList: dispelList)); + infos.Add(GetSkillInfo(target, turn, buff, affected: affected, + dispelList: dispelList)); break; case SkillTargetType.Self: case SkillTargetType.Ally: dispelList = caster.AddBuff(buff); - infos.Add(GetSkillInfo(caster, turn, buff, dispelList:dispelList)); + infos.Add(GetSkillInfo(caster, turn, buff, dispelList: dispelList)); break; default: throw new ArgumentOutOfRangeException(); @@ -159,7 +156,8 @@ public override int GetHashCode() } private BattleStatus.Arena.ArenaSkill.ArenaSkillInfo GetSkillInfo(ICloneable target, - int turn, Buff.Buff buff, bool affected = true, IEnumerable dispelList = null) + int turn, Buff.Buff buff, bool affected = true, + IEnumerable dispelList = null) { return new BattleStatus.Arena.ArenaSkill.ArenaSkillInfo( (ArenaCharacter)target.Clone(), diff --git a/Lib9c/Model/Skill/Skill.cs b/Lib9c/Model/Skill/Skill.cs index d44ab0beed..ba35590cd1 100644 --- a/Lib9c/Model/Skill/Skill.cs +++ b/Lib9c/Model/Skill/Skill.cs @@ -84,12 +84,7 @@ public override int GetHashCode() IEnumerable dispelList = null; var dispel = target.Buffs.Values.FirstOrDefault(bf => bf is Dispel); // Defence debuff if target has dispel - if (dispel is not null && - ((buff is StatBuff statBuff && statBuff.RowData.Value < 0) || - (buff is ActionBuff actionBuff && - actionBuff.RowData.ActionBuffType is - ActionBuffType.Bleed or ActionBuffType.Stun)) - ) + if (dispel is not null && buff.IsDebuff()) { if (target.Simulator.Random.Next(0, 100) < dispel.BuffInfo.Chance) { From 089b0c00ed02b75001d0ee280f46acf2ffdd8dff Mon Sep 17 00:00:00 2001 From: jonny Date: Thu, 7 Mar 2024 15:25:37 +0900 Subject: [PATCH 59/78] add Divinity Grade --- Lib9c/Model/EnumType/Grade.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib9c/Model/EnumType/Grade.cs b/Lib9c/Model/EnumType/Grade.cs index dab43467d7..5512e2d237 100644 --- a/Lib9c/Model/EnumType/Grade.cs +++ b/Lib9c/Model/EnumType/Grade.cs @@ -7,5 +7,6 @@ public enum Grade Epic = 3, Unique = 4, Legendary = 5, + Divinity = 6, } } From 154469dd79b36f511c145970aba70f87e2097747 Mon Sep 17 00:00:00 2001 From: Syu Date: Thu, 7 Mar 2024 15:52:33 +0900 Subject: [PATCH 60/78] Update Item Data Change --- Lib9c/TableCSV/Item/EquipmentItemSheet.csv | 50 ++++++++++---------- Lib9c/TableCSV/Item/ItemRequirementSheet.csv | 6 +++ 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/Lib9c/TableCSV/Item/EquipmentItemSheet.csv b/Lib9c/TableCSV/Item/EquipmentItemSheet.csv index e7c861b0a1..4404a53f27 100644 --- a/Lib9c/TableCSV/Item/EquipmentItemSheet.csv +++ b/Lib9c/TableCSV/Item/EquipmentItemSheet.csv @@ -35,11 +35,11 @@ id,_name,item_sub_type,grade,elemental_type,set_id,stat_type,stat_value,attack_r 10142001,Asgardian Sword,Weapon,5,Water,13,ATK,798,2,10142001,2 10143001,Asgardian Sword,Weapon,5,Land,14,ATK,1221,2,10143001,2 10144001,Asgardian Sword,Weapon,5,Wind,15,ATK,1525,2,10144001,2 -10150001,Surt's Sword,Weapon,5,Normal,16,ATK,2157,2,10150001,2 -10151001,Surt's Sword,Weapon,5,Fire,17,ATK,2190,2,10151001,2 -10152001,Surt's Sword,Weapon,5,Water,18,ATK,2223,2,10152001,2 -10153001,Surt's Sword,Weapon,5,Land,19,ATK,3390,2,10153001,2 -10154001,Surt's Sword,Weapon,5,Wind,20,ATK,4219,2,10154001,2 +10150001,Surt's Sword,Weapon,6,Normal,0,ATK,2157,2,10150001,2 +10151001,Surt's Sword,Weapon,6,Fire,0,ATK,2190,2,10151001,2 +10152001,Surt's Sword,Weapon,6,Water,0,ATK,2223,2,10152001,2 +10153001,Surt's Sword,Weapon,6,Land,0,ATK,3390,2,10153001,2 +10154001,Surt's Sword,Weapon,6,Wind,0,ATK,4219,2,10154001,2 10155000,Valkyrie’s Sword,Weapon,5,Normal,15,ATK,2902,2,10155000,2 10200000,Ragged Clothes,Armor,0,Normal,0,HP,30,2,Character/Player/10200000,12 10210000,Casual Clothes,Armor,1,Normal,1,HP,180,2,Character/Player/10210000,5 @@ -72,11 +72,11 @@ id,_name,item_sub_type,grade,elemental_type,set_id,stat_type,stat_value,attack_r 10252001,Ancient Armor,Armor,5,Water,13,HP,48224,2,Character/Player/10252001,1800000 10253001,Ancient Armor,Armor,5,Land,14,HP,67513,2,Character/Player/10253001,2400000 10254001,Ancient Armor,Armor,5,Wind,15,HP,67513,2,Character/Player/10254001,2400000 -10250000,Legendary Armor,Armor,5,Normal,11,HP,15550,2,Character/Player/10250000,2 -10251000,Legendary Armor,Armor,5,Fire,12,HP,15848,2,Character/Player/10251000,2 -10252000,Legendary Armor,Armor,5,Water,13,HP,16146,2,Character/Player/10252000,2 -10253000,Legendary Armor,Armor,5,Land,14,HP,24665,2,Character/Player/10253000,2 -10254000,Legendary Armor,Armor,5,Wind,15,HP,30823,2,Character/Player/10254000,2 +10250000,Legendary Armor,Armor,6,Normal,0,HP,15550,2,Character/Player/10250000,2 +10251000,Legendary Armor,Armor,6,Fire,0,HP,15848,2,Character/Player/10251000,2 +10252000,Legendary Armor,Armor,6,Water,0,HP,16146,2,Character/Player/10252000,2 +10253000,Legendary Armor,Armor,6,Land,0,HP,24665,2,Character/Player/10253000,2 +10254000,Legendary Armor,Armor,6,Wind,0,HP,30823,2,Character/Player/10254000,2 10240001,Asgardian Armor,Armor,5,Normal,11,HP,10358,2,Character/Player/10240001,2 10241001,Asgardian Armor,Armor,5,Fire,12,HP,10571,2,Character/Player/10241001,2 10242001,Asgardian Armor,Armor,5,Water,13,HP,10783,2,Character/Player/10242001,2 @@ -193,18 +193,18 @@ id,_name,item_sub_type,grade,elemental_type,set_id,stat_type,stat_value,attack_r 10640003,Barrage Aura,Aura,4,Normal,0,ATK,10,0,10620001,6000 10650005,Barrage Aura,Aura,5,Normal,0,ATK,10,0,10620001,60000 10650006,Lord's Barrage Aura,Aura,5,Normal,0,ATK,10,0,10620001,60000 -10350002,,Belt,5,Normal,0,SPD,1,2,10350002,1 -10351002,,Belt,5,Fire,0,SPD,1,2,10351002,1 -10352002,,Belt,5,Water,0,SPD,1,2,10352002,1 -10353002,,Belt,5,Land,0,SPD,1,2,10353002,1 -10354002,,Belt,5,Wind,0,SPD,1,2,10354002,1 -10450002,,Necklace,5,Normal,0,HIT,1,0,10450002,1 -10451002,,Necklace,5,Fire,0,HIT,1,0,10451002,1 -10452002,,Necklace,5,Water,0,HIT,1,0,10452002,1 -10453002,,Necklace,5,Land,0,HIT,1,0,10453002,1 -10454002,,Necklace,5,Wind,0,HIT,1,0,10454002,1 -10550001,,Ring,5,Normal,0,DEF,1,0,10550001,1 -10551001,,Ring,5,Fire,0,DEF,1,0,10551001,1 -10552001,,Ring,5,Water,0,DEF,1,0,10552001,1 -10553001,,Ring,5,Land,0,DEF,1,0,10553001,1 -10554001,,Ring,5,Wind,0,DEF,1,0,10554001,1 \ No newline at end of file +10350002,,Belt,6,Normal,0,SPD,1,2,10350002,1 +10351002,,Belt,6,Fire,0,SPD,1,2,10351002,1 +10352002,,Belt,6,Water,0,SPD,1,2,10352002,1 +10353002,,Belt,6,Land,0,SPD,1,2,10353002,1 +10354002,,Belt,6,Wind,0,SPD,1,2,10354002,1 +10450002,,Necklace,6,Normal,0,HIT,1,0,10450002,1 +10451002,,Necklace,6,Fire,0,HIT,1,0,10451002,1 +10452002,,Necklace,6,Water,0,HIT,1,0,10452002,1 +10453002,,Necklace,6,Land,0,HIT,1,0,10453002,1 +10454002,,Necklace,6,Wind,0,HIT,1,0,10454002,1 +10550001,,Ring,6,Normal,0,DEF,1,0,10550001,1 +10551001,,Ring,6,Fire,0,DEF,1,0,10551001,1 +10552001,,Ring,6,Water,0,DEF,1,0,10552001,1 +10553001,,Ring,6,Land,0,DEF,1,0,10553001,1 +10554001,,Ring,6,Wind,0,DEF,1,0,10554001,1 \ No newline at end of file diff --git a/Lib9c/TableCSV/Item/ItemRequirementSheet.csv b/Lib9c/TableCSV/Item/ItemRequirementSheet.csv index 5aaecfe741..b2f3d3ffab 100644 --- a/Lib9c/TableCSV/Item/ItemRequirementSheet.csv +++ b/Lib9c/TableCSV/Item/ItemRequirementSheet.csv @@ -295,6 +295,12 @@ item_id,level,mimislevel 201032,300,300 201033,320,320 201034,1,1 +201035,330,330 +201036,350,350 +201037,370,370 +201038,330,330 +201039,350,350 +201040,370,370 900101,1,1 900102,1,1 900103,1,1 From 725f424fb58311d8819cec7ea302c3f3110da6dd Mon Sep 17 00:00:00 2001 From: jonny Date: Thu, 7 Mar 2024 16:47:57 +0900 Subject: [PATCH 61/78] add skillId in arena double attack --- Lib9c/Model/BattleStatus/Arena/ArenaDoubleAttack.cs | 7 +++++-- Lib9c/Model/IArena.cs | 2 +- Lib9c/Model/Skill/Arena/ArenaDoubleAttack.cs | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Lib9c/Model/BattleStatus/Arena/ArenaDoubleAttack.cs b/Lib9c/Model/BattleStatus/Arena/ArenaDoubleAttack.cs index c2981308cb..4bb8bc6e23 100644 --- a/Lib9c/Model/BattleStatus/Arena/ArenaDoubleAttack.cs +++ b/Lib9c/Model/BattleStatus/Arena/ArenaDoubleAttack.cs @@ -7,17 +7,20 @@ namespace Nekoyume.Model.BattleStatus.Arena [Serializable] public class ArenaDoubleAttack : ArenaSkill { + public readonly int skillId; public ArenaDoubleAttack( ArenaCharacter character, IEnumerable skillInfos, - IEnumerable buffInfos) + IEnumerable buffInfos, + int skillId) : base(character, skillInfos, buffInfos) { + this.skillId = skillId; } public override IEnumerator CoExecute(IArena arena) { - yield return arena.CoDoubleAttack(Character, SkillInfos, BuffInfos); + yield return arena.CoDoubleAttack(Character, SkillInfos, BuffInfos, skillId); } } } diff --git a/Lib9c/Model/IArena.cs b/Lib9c/Model/IArena.cs index 71f96b6caa..aa6c18888a 100644 --- a/Lib9c/Model/IArena.cs +++ b/Lib9c/Model/IArena.cs @@ -10,7 +10,7 @@ public interface IArena IEnumerator CoNormalAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBlowAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); - IEnumerator CoDoubleAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); + IEnumerator CoDoubleAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos, int skillId); IEnumerator CoAreaAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBuffRemovalAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoHeal(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); diff --git a/Lib9c/Model/Skill/Arena/ArenaDoubleAttack.cs b/Lib9c/Model/Skill/Arena/ArenaDoubleAttack.cs index 01f5b5109e..065ad09363 100644 --- a/Lib9c/Model/Skill/Arena/ArenaDoubleAttack.cs +++ b/Lib9c/Model/Skill/Arena/ArenaDoubleAttack.cs @@ -27,7 +27,7 @@ public override BattleStatus.Arena.ArenaSkill Use( var damage = ProcessDamage(caster, target, turn); var buff = ProcessBuff(caster, target, turn, buffs); - return new BattleStatus.Arena.ArenaDoubleAttack(clone, damage, buff); + return new BattleStatus.Arena.ArenaDoubleAttack(clone, damage, buff, SkillRow.Id); } [Obsolete("Use Use")] @@ -41,7 +41,7 @@ public override BattleStatus.Arena.ArenaSkill UseV1( var damage = ProcessDamage(caster, target, turn); var buff = ProcessBuffV1(caster, target, turn, buffs); - return new BattleStatus.Arena.ArenaDoubleAttack(clone, damage, buff); + return new BattleStatus.Arena.ArenaDoubleAttack(clone, damage, buff, SkillRow.Id); } } } From c8926ebcb85dc312add18d69298bd9d571e8856a Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 7 Mar 2024 17:50:52 +0900 Subject: [PATCH 62/78] Add new skill category: ShatterStrike --- Lib9c/Model/Skill/SkillCategory.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib9c/Model/Skill/SkillCategory.cs b/Lib9c/Model/Skill/SkillCategory.cs index cf48ba05aa..5dc9e1434c 100644 --- a/Lib9c/Model/Skill/SkillCategory.cs +++ b/Lib9c/Model/Skill/SkillCategory.cs @@ -7,6 +7,7 @@ public enum SkillCategory DoubleAttack, // Attack enemy two times AreaAttack, BuffRemovalAttack, + ShatterStrike, // Damage based on enemy's full HP Heal, From 4e553d7840e29a26dda1e6a536afb01a1d2a23be Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 7 Mar 2024 17:53:19 +0900 Subject: [PATCH 63/78] Introduce new attack skill: Shatter Strike - This skill gives damage based on target's max HP. - This skill never makes critical hit. --- .../BattleStatus/Arena/ArenaShatterStrike.cs | 23 ++++++++++++++ Lib9c/Model/BattleStatus/ShatterStrike.cs | 21 +++++++++++++ Lib9c/Model/IArena.cs | 1 + Lib9c/Model/IStage.cs | 2 +- Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs | 9 ++++-- Lib9c/Model/Skill/Arena/ArenaShatterStrike.cs | 30 +++++++++++++++++++ Lib9c/Model/Skill/AttackSkill.cs | 9 +++++- Lib9c/Model/Skill/ShatterStrike.cs | 28 +++++++++++++++++ Lib9c/Model/Skill/SkillFactory.cs | 3 ++ 9 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 Lib9c/Model/BattleStatus/Arena/ArenaShatterStrike.cs create mode 100644 Lib9c/Model/BattleStatus/ShatterStrike.cs create mode 100644 Lib9c/Model/Skill/Arena/ArenaShatterStrike.cs create mode 100644 Lib9c/Model/Skill/ShatterStrike.cs diff --git a/Lib9c/Model/BattleStatus/Arena/ArenaShatterStrike.cs b/Lib9c/Model/BattleStatus/Arena/ArenaShatterStrike.cs new file mode 100644 index 0000000000..5ee0189c58 --- /dev/null +++ b/Lib9c/Model/BattleStatus/Arena/ArenaShatterStrike.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Nekoyume.Model.BattleStatus.Arena +{ + [Serializable] + public class ArenaShatterStrike : ArenaSkill + { + public ArenaShatterStrike( + ArenaCharacter character, + IEnumerable skillInfos, + IEnumerable buffInfos + ) : base(character, skillInfos, buffInfos) + { + } + + public override IEnumerator CoExecute(IArena arena) + { + yield return arena.CoShatterStrike(Character, SkillInfos, BuffInfos); + } + } +} diff --git a/Lib9c/Model/BattleStatus/ShatterStrike.cs b/Lib9c/Model/BattleStatus/ShatterStrike.cs new file mode 100644 index 0000000000..b3d992a8e5 --- /dev/null +++ b/Lib9c/Model/BattleStatus/ShatterStrike.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Nekoyume.Model.BattleStatus +{ + [Serializable] + public class ShatterStrike : Skill + { + public ShatterStrike(int skillId, CharacterBase character, + IEnumerable skillInfos, IEnumerable buffInfos) + : base(skillId, character, skillInfos, buffInfos) + { + } + + public override IEnumerator CoExecute(IStage stage) + { + yield return stage.CoShatterStrike(Character, SkillId, SkillInfos, BuffInfos); + } + } +} diff --git a/Lib9c/Model/IArena.cs b/Lib9c/Model/IArena.cs index 71f96b6caa..88da9a4ce8 100644 --- a/Lib9c/Model/IArena.cs +++ b/Lib9c/Model/IArena.cs @@ -13,6 +13,7 @@ public interface IArena IEnumerator CoDoubleAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoAreaAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBuffRemovalAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); + IEnumerator CoShatterStrike(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoHeal(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBuff(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoTickDamage(ArenaCharacter affectedCharacter, IEnumerable skillInfos); diff --git a/Lib9c/Model/IStage.cs b/Lib9c/Model/IStage.cs index 4a8f6c79d5..d996083c56 100644 --- a/Lib9c/Model/IStage.cs +++ b/Lib9c/Model/IStage.cs @@ -20,7 +20,7 @@ public interface IStage IEnumerator CoHeal(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBuff(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoTickDamage(CharacterBase affectedCharacter, int skillId, IEnumerable skillInfos); - + IEnumerator CoShatterStrike(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); #endregion IEnumerator CoRemoveBuffs(CharacterBase caster); diff --git a/Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs b/Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs index 5fc79bafab..129a212767 100644 --- a/Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs +++ b/Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs @@ -42,11 +42,14 @@ protected ArenaAttackSkill( if (target.IsHit(caster)) { - damage = caster.ATK + Power + statAdditionalPower; - damage = (long) (damage * multiplier); + damage = (long)(SkillRow.SkillCategory is SkillCategory.ShatterStrike + ? target.HP * powerMultiplier + : caster.ATK + Power + statAdditionalPower); + damage = (long)(damage * multiplier); damage = caster.GetDamage(damage, isNormalAttack || SkillRow.Combo); damage = elementalType.GetDamage(target.DefenseElementalType, damage); - isCritical = caster.IsCritical(isNormalAttack || SkillRow.Combo); + isCritical = SkillRow.SkillCategory is not SkillCategory.ShatterStrike && + caster.IsCritical(isNormalAttack || SkillRow.Combo); if (isCritical) { damage = CriticalHelper.GetCriticalDamageForArena(caster, damage); diff --git a/Lib9c/Model/Skill/Arena/ArenaShatterStrike.cs b/Lib9c/Model/Skill/Arena/ArenaShatterStrike.cs new file mode 100644 index 0000000000..f1521f1eb7 --- /dev/null +++ b/Lib9c/Model/Skill/Arena/ArenaShatterStrike.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using Nekoyume.Model.Stat; +using Nekoyume.TableData; + +namespace Nekoyume.Model.Skill.Arena +{ + [Serializable] + public class ArenaShatterStrike: ArenaAttackSkill + { + public ArenaShatterStrike(SkillSheet.Row skillRow, long power, int chance, int statPowerRatio, StatType referencedStatType) : base(skillRow, power, chance, statPowerRatio, referencedStatType) + { + } + + public override BattleStatus.Arena.ArenaSkill Use(ArenaCharacter caster, ArenaCharacter target, int turn, IEnumerable buffs) + { + var clone = (ArenaCharacter)caster.Clone(); + var damage = ProcessDamage(caster, target, turn); + var buff = ProcessBuff(caster, target, turn, buffs); + + return new BattleStatus.Arena.ArenaShatterStrike(clone, damage, buff); + } + + [Obsolete("Use Use")] + public override BattleStatus.Arena.ArenaSkill UseV1(ArenaCharacter caster, ArenaCharacter target, int turn, IEnumerable buffs) + { + return Use(caster, target, turn, buffs); + } + } +} diff --git a/Lib9c/Model/Skill/AttackSkill.cs b/Lib9c/Model/Skill/AttackSkill.cs index d96bd3e6cb..bc348e69f3 100644 --- a/Lib9c/Model/Skill/AttackSkill.cs +++ b/Lib9c/Model/Skill/AttackSkill.cs @@ -49,6 +49,11 @@ protected AttackSkill( foreach (var target in targets) { + if (SkillRow.SkillCategory is SkillCategory.ShatterStrike) + { + totalDamage = (long)(target.HP * powerMultiplier); + } + long damage = 0; var isCritical = false; // Skill or when normal attack hit. @@ -77,7 +82,9 @@ protected AttackSkill( // 속성 적용. damage = elementalType.GetDamage(target.defElementType, damage); // 치명 적용. - isCritical = caster.IsCritical(isNormalAttack || SkillRow.Combo); + isCritical = + SkillRow.SkillCategory is not SkillCategory.ShatterStrike && + caster.IsCritical(isNormalAttack || SkillRow.Combo); if (isCritical) { damage = CriticalHelper.GetCriticalDamage(caster, damage); diff --git a/Lib9c/Model/Skill/ShatterStrike.cs b/Lib9c/Model/Skill/ShatterStrike.cs new file mode 100644 index 0000000000..d7e4f89ee0 --- /dev/null +++ b/Lib9c/Model/Skill/ShatterStrike.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using Nekoyume.Model.Stat; +using Nekoyume.TableData; + +namespace Nekoyume.Model.Skill +{ + [Serializable] + public class ShatterStrike : AttackSkill + { + public ShatterStrike( + SkillSheet.Row skillRow, + long power, int chance, + int statPowerRatio, StatType referencedStatType + ) : base(skillRow, power, chance, statPowerRatio, referencedStatType) + { + } + + public override BattleStatus.Skill Use(CharacterBase caster, int simulatorWaveTurn, + IEnumerable buffs, bool copyCharacter) + { + var clone = copyCharacter ? (CharacterBase) caster.Clone() : null; + var damage = ProcessDamage(caster, simulatorWaveTurn, copyCharacter: copyCharacter); + var buff = ProcessBuff(caster, simulatorWaveTurn, buffs, copyCharacter); + return new Model.BattleStatus.ShatterStrike(SkillRow.Id, clone, damage, buff); + } + } +} diff --git a/Lib9c/Model/Skill/SkillFactory.cs b/Lib9c/Model/Skill/SkillFactory.cs index 5a99433217..15e9d67b47 100644 --- a/Lib9c/Model/Skill/SkillFactory.cs +++ b/Lib9c/Model/Skill/SkillFactory.cs @@ -31,6 +31,9 @@ public static Skill Get( return new AreaAttack(skillRow, power, chance, statPowerRatio, referencedStatType); case SkillCategory.BuffRemovalAttack: return new BuffRemovalAttack(skillRow, power, chance, statPowerRatio, referencedStatType); + case SkillCategory.ShatterStrike: + return new ShatterStrike(skillRow, power, chance, statPowerRatio, + referencedStatType); default: return new NormalAttack(skillRow, power, chance, statPowerRatio, referencedStatType); } From a51335bb7d53998609c56e77a61f871c630df9e6 Mon Sep 17 00:00:00 2001 From: hyeon Date: Thu, 7 Mar 2024 17:55:53 +0900 Subject: [PATCH 64/78] Set indentation to mult. of 4 --- Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs | 32 ++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs b/Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs index 129a212767..6025242684 100644 --- a/Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs +++ b/Lib9c/Model/Skill/Arena/ArenaAttackSkill.cs @@ -19,7 +19,7 @@ protected ArenaAttackSkill( { } - protected IEnumerable ProcessDamage( + protected IEnumerable ProcessDamage( ArenaCharacter caster, ArenaCharacter target, int simulatorWaveTurn, @@ -79,21 +79,21 @@ protected ArenaAttackSkill( return infos; } - private static decimal[] GetMultiplier(int hitCount, decimal totalDamage) - { - if (hitCount == 1) return new[] {totalDamage}; - var multiplier = new List(); - var avg = totalDamage / hitCount; - var lastDamage = avg * 1.3m; - var lastHitIndex = hitCount - 1; - var eachDamage = (totalDamage - lastDamage) / lastHitIndex; - for (var i = 0; i < hitCount; i++) - { - var result = i == lastHitIndex ? lastDamage : eachDamage; - multiplier.Add(result); - } + private static decimal[] GetMultiplier(int hitCount, decimal totalDamage) + { + if (hitCount == 1) return new[] { totalDamage }; + var multiplier = new List(); + var avg = totalDamage / hitCount; + var lastDamage = avg * 1.3m; + var lastHitIndex = hitCount - 1; + var eachDamage = (totalDamage - lastDamage) / lastHitIndex; + for (var i = 0; i < hitCount; i++) + { + var result = i == lastHitIndex ? lastDamage : eachDamage; + multiplier.Add(result); + } - return multiplier.ToArray(); - } + return multiplier.ToArray(); + } } } From 981fde02e278e9e1d2884ed61008ada4f1e8ee34 Mon Sep 17 00:00:00 2001 From: jonny Date: Fri, 8 Mar 2024 15:27:21 +0900 Subject: [PATCH 65/78] change DoubleAttack effect flow --- .../BattleStatus/Arena/ArenaDoubleAttack.cs | 7 ++---- .../Arena/ArenaDoubleAttackWithCombo.cs | 23 +++++++++++++++++++ .../BattleStatus/DoubleAttackWithCombo.cs | 20 ++++++++++++++++ Lib9c/Model/IArena.cs | 3 ++- Lib9c/Model/IStage.cs | 1 + Lib9c/Model/Skill/Arena/ArenaDoubleAttack.cs | 18 +++++++++++++-- Lib9c/Model/Skill/DoubleAttack.cs | 10 ++++++-- 7 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 Lib9c/Model/BattleStatus/Arena/ArenaDoubleAttackWithCombo.cs create mode 100644 Lib9c/Model/BattleStatus/DoubleAttackWithCombo.cs diff --git a/Lib9c/Model/BattleStatus/Arena/ArenaDoubleAttack.cs b/Lib9c/Model/BattleStatus/Arena/ArenaDoubleAttack.cs index 4bb8bc6e23..c2981308cb 100644 --- a/Lib9c/Model/BattleStatus/Arena/ArenaDoubleAttack.cs +++ b/Lib9c/Model/BattleStatus/Arena/ArenaDoubleAttack.cs @@ -7,20 +7,17 @@ namespace Nekoyume.Model.BattleStatus.Arena [Serializable] public class ArenaDoubleAttack : ArenaSkill { - public readonly int skillId; public ArenaDoubleAttack( ArenaCharacter character, IEnumerable skillInfos, - IEnumerable buffInfos, - int skillId) + IEnumerable buffInfos) : base(character, skillInfos, buffInfos) { - this.skillId = skillId; } public override IEnumerator CoExecute(IArena arena) { - yield return arena.CoDoubleAttack(Character, SkillInfos, BuffInfos, skillId); + yield return arena.CoDoubleAttack(Character, SkillInfos, BuffInfos); } } } diff --git a/Lib9c/Model/BattleStatus/Arena/ArenaDoubleAttackWithCombo.cs b/Lib9c/Model/BattleStatus/Arena/ArenaDoubleAttackWithCombo.cs new file mode 100644 index 0000000000..eff8febae6 --- /dev/null +++ b/Lib9c/Model/BattleStatus/Arena/ArenaDoubleAttackWithCombo.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Nekoyume.Model.BattleStatus.Arena +{ + [Serializable] + public class ArenaDoubleAttackWithCombo : ArenaSkill + { + public ArenaDoubleAttackWithCombo( + ArenaCharacter character, + IEnumerable skillInfos, + IEnumerable buffInfos) + : base(character, skillInfos, buffInfos) + { + } + + public override IEnumerator CoExecute(IArena arena) + { + yield return arena.CoDoubleAttackWithCombo(Character, SkillInfos, BuffInfos); + } + } +} diff --git a/Lib9c/Model/BattleStatus/DoubleAttackWithCombo.cs b/Lib9c/Model/BattleStatus/DoubleAttackWithCombo.cs new file mode 100644 index 0000000000..e4e4146730 --- /dev/null +++ b/Lib9c/Model/BattleStatus/DoubleAttackWithCombo.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Nekoyume.Model.BattleStatus +{ + [Serializable] + public class DoubleAttackWithCombo : Skill + { + public DoubleAttackWithCombo(int skillId, CharacterBase character, IEnumerable skillInfos, IEnumerable buffInfos) + : base(skillId, character, skillInfos, buffInfos) + { + } + + public override IEnumerator CoExecute(IStage stage) + { + yield return stage.CoDoubleAttackWithCombo(Character, SkillId, SkillInfos, BuffInfos); + } + } +} diff --git a/Lib9c/Model/IArena.cs b/Lib9c/Model/IArena.cs index aa6c18888a..bcd9eb7343 100644 --- a/Lib9c/Model/IArena.cs +++ b/Lib9c/Model/IArena.cs @@ -10,7 +10,8 @@ public interface IArena IEnumerator CoNormalAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBlowAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); - IEnumerator CoDoubleAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos, int skillId); + IEnumerator CoDoubleAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); + IEnumerator CoDoubleAttackWithCombo(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoAreaAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBuffRemovalAttack(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoHeal(ArenaCharacter caster, IEnumerable skillInfos, IEnumerable buffInfos); diff --git a/Lib9c/Model/IStage.cs b/Lib9c/Model/IStage.cs index 4a8f6c79d5..48dceb826a 100644 --- a/Lib9c/Model/IStage.cs +++ b/Lib9c/Model/IStage.cs @@ -15,6 +15,7 @@ public interface IStage IEnumerator CoNormalAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBlowAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoDoubleAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); + IEnumerator CoDoubleAttackWithCombo(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoAreaAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoBuffRemovalAttack(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); IEnumerator CoHeal(CharacterBase caster, int skillId, IEnumerable skillInfos, IEnumerable buffInfos); diff --git a/Lib9c/Model/Skill/Arena/ArenaDoubleAttack.cs b/Lib9c/Model/Skill/Arena/ArenaDoubleAttack.cs index 065ad09363..b023208fd9 100644 --- a/Lib9c/Model/Skill/Arena/ArenaDoubleAttack.cs +++ b/Lib9c/Model/Skill/Arena/ArenaDoubleAttack.cs @@ -27,7 +27,14 @@ public override BattleStatus.Arena.ArenaSkill Use( var damage = ProcessDamage(caster, target, turn); var buff = ProcessBuff(caster, target, turn, buffs); - return new BattleStatus.Arena.ArenaDoubleAttack(clone, damage, buff, SkillRow.Id); + if (SkillRow.Combo) + { + return new BattleStatus.Arena.ArenaDoubleAttackWithCombo(clone, damage, buff); + } + else + { + return new BattleStatus.Arena.ArenaDoubleAttack(clone, damage, buff); + } } [Obsolete("Use Use")] @@ -41,7 +48,14 @@ public override BattleStatus.Arena.ArenaSkill UseV1( var damage = ProcessDamage(caster, target, turn); var buff = ProcessBuffV1(caster, target, turn, buffs); - return new BattleStatus.Arena.ArenaDoubleAttack(clone, damage, buff, SkillRow.Id); + if (SkillRow.Combo) + { + return new BattleStatus.Arena.ArenaDoubleAttackWithCombo(clone, damage, buff); + } + else + { + return new BattleStatus.Arena.ArenaDoubleAttack(clone, damage, buff); + } } } } diff --git a/Lib9c/Model/Skill/DoubleAttack.cs b/Lib9c/Model/Skill/DoubleAttack.cs index c2661d28e4..f9c4e39f63 100644 --- a/Lib9c/Model/Skill/DoubleAttack.cs +++ b/Lib9c/Model/Skill/DoubleAttack.cs @@ -24,8 +24,14 @@ public override BattleStatus.Skill Use(CharacterBase caster, var clone = copyCharacter ? (CharacterBase) caster.Clone() : null; var damage = ProcessDamage(caster, simulatorWaveTurn, copyCharacter: copyCharacter); var buff = ProcessBuff(caster, simulatorWaveTurn, buffs, copyCharacter); - - return new Model.BattleStatus.DoubleAttack(SkillRow.Id, clone, damage, buff); + if (SkillRow.Combo) + { + return new Model.BattleStatus.DoubleAttackWithCombo(SkillRow.Id, clone, damage, buff); + } + else + { + return new Model.BattleStatus.DoubleAttack(SkillRow.Id, clone, damage, buff); + } } } } From 1d56a478a4b9e17ddd8cddf04986964b8aece06f Mon Sep 17 00:00:00 2001 From: hyeon Date: Fri, 8 Mar 2024 16:47:30 +0900 Subject: [PATCH 66/78] Test ShatterStrike skill --- .../Skill/Arena/ArenaShatterStrikeTest.cs | 78 +++++++++++++++++++ .Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs | 76 ++++++++++++++++++ Lib9c/TableCSV/Skill/SkillSheet.csv | 2 +- 3 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 .Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs create mode 100644 .Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs diff --git a/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs b/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs new file mode 100644 index 0000000000..7ef0faba8c --- /dev/null +++ b/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs @@ -0,0 +1,78 @@ +namespace Lib9c.Tests.Model.Skill.Arena +{ + using System.Collections.Generic; + using System.Linq; + using Lib9c.Tests.Action; + using Nekoyume.Arena; + using Nekoyume.Model; + using Nekoyume.Model.Buff; + using Nekoyume.Model.Skill.Arena; + using Nekoyume.Model.Stat; + using Nekoyume.Model.State; + using Xunit; + + public class ArenaShatterStrikeTest + { + private readonly TableSheets _tableSheets; + private readonly AvatarState _avatar1; + private readonly AvatarState _avatar2; + + private readonly ArenaAvatarState _arenaAvatar1; + private readonly ArenaAvatarState _arenaAvatar2; + + public ArenaShatterStrikeTest() + { + _tableSheets = new TableSheets(TableSheetsImporter.ImportSheets()); + _avatar1 = new AvatarState( + default, + default, + 0, + _tableSheets.GetAvatarSheets(), + new GameConfigState(), + default + ); + _avatar2 = new AvatarState( + default, + default, + 0, + _tableSheets.GetAvatarSheets(), + new GameConfigState(), + default + ); + + _arenaAvatar1 = new ArenaAvatarState(_avatar1); + _arenaAvatar2 = new ArenaAvatarState(_avatar2); + } + + [Fact] + public void Use() + { + var simulator = new ArenaSimulator(new TestRandom()); + var myDigest = new ArenaPlayerDigest(_avatar1, _arenaAvatar1); + var enemyDigest = new ArenaPlayerDigest(_avatar2, _arenaAvatar2); + var arenaSheets = _tableSheets.GetArenaSimulatorSheets(); + var challenger = + new ArenaCharacter( + simulator, + myDigest, + arenaSheets, + simulator.HpModifier, + new List() + ); + var enemy = + new ArenaCharacter( + simulator, + enemyDigest, + arenaSheets, + simulator.HpModifier, + new List() + ); + + var skillRow = _tableSheets.SkillSheet.OrderedList.First(s => s.Id == 700010); + var shatterStrike = new ArenaShatterStrike(skillRow, 0, 0, 10000, StatType.NONE); + var used = shatterStrike.Use(challenger, enemy, simulator.Turn, new List()); + Assert.Single(used.SkillInfos); + Assert.Equal(enemy.HP - enemy.DEF, used.SkillInfos.First().Effect); + } + } +} diff --git a/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs b/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs new file mode 100644 index 0000000000..af991713d7 --- /dev/null +++ b/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs @@ -0,0 +1,76 @@ +namespace Lib9c.Tests.Model.Skill +{ + using System; + using System.Collections.Generic; + using System.Linq; + using Lib9c.Tests.Action; + using Libplanet.Crypto; + using Nekoyume.Battle; + using Nekoyume.Model; + using Nekoyume.Model.Buff; + using Nekoyume.Model.Skill; + using Nekoyume.Model.Stat; + using Nekoyume.Model.State; + using Xunit; + + public class ShatterStrikeTest + { + private readonly TableSheets _tableSheets = new (TableSheetsImporter.ImportSheets()); + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void Use(bool copyCharacter) + { + Assert.True(_tableSheets.SkillSheet.TryGetValue(700010, out var skillRow)); // 700010 is ShatterStrike + var shatterStrike = new ShatterStrike(skillRow, 0, 0, 10000, StatType.NONE); + + var avatarState = new AvatarState( + new PrivateKey().Address, + new PrivateKey().Address, + 0, + _tableSheets.GetAvatarSheets(), + new GameConfigState(), + new PrivateKey().Address + ); + var worldRow = _tableSheets.WorldSheet.First; + Assert.NotNull(worldRow); + + var random = new TestRandom(); + var simulator = new StageSimulator( + random, + avatarState, + new List(), + null, + new List(), + 1, + 1, + _tableSheets.StageSheet[1], + _tableSheets.StageWaveSheet[1], + false, + 20, + _tableSheets.GetSimulatorSheets(), + _tableSheets.EnemySkillSheet, + _tableSheets.CostumeStatSheet, + StageSimulator.GetWaveRewards( + random, + _tableSheets.StageSheet[1], + _tableSheets.MaterialItemSheet), + new List(), + copyCharacter + ); + var player = new Player(avatarState, simulator); + var enemyRow = _tableSheets.CharacterSheet.OrderedList + .FirstOrDefault(e => e.Id > 200000); + Assert.NotNull(enemyRow); + + var enemy = new Enemy(player, enemyRow, 1); + + player.Targets.Add(enemy); + var used = shatterStrike.Use(player, 0, new List(), copyCharacter); + Assert.NotNull(used); + var skillInfo = Assert.Single(used.SkillInfos); + Assert.Equal(enemy.HP - enemy.DEF, skillInfo.Effect); + } + } +} diff --git a/Lib9c/TableCSV/Skill/SkillSheet.csv b/Lib9c/TableCSV/Skill/SkillSheet.csv index f228954bfc..ff6c886f3f 100644 --- a/Lib9c/TableCSV/Skill/SkillSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillSheet.csv @@ -173,4 +173,4 @@ _250001,속도 증가(전체),Normal,Buff,SpeedBuff,Ally,1,1 // 미구현 700007,집중,Normal,Buff,Focus,Self,1,15 700008,더블 어택,Normal,Attack,DoubleAttack,Enemy,2,15,true 700009,디버프 제거,Normal,Buff,Buff,Self,1,15 -700010,HP 비례 데미지,Normal,Attack,BlowAttack,Enemy,1,15 +700010,HP 비례 데미지,Normal,Attack,ShatterStrike,Enemy,1,15 From b81f34b4f8e2643cda2aad6f291bed04327a61aa Mon Sep 17 00:00:00 2001 From: hyeon Date: Fri, 8 Mar 2024 17:11:10 +0900 Subject: [PATCH 67/78] Add more test cases --- .../Skill/Arena/ArenaShatterStrikeTest.cs | 15 ++++++++---- .Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs | 24 ++++++++++++++----- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs b/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs index 7ef0faba8c..b7a8014d21 100644 --- a/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs +++ b/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs @@ -44,8 +44,12 @@ public ArenaShatterStrikeTest() _arenaAvatar2 = new ArenaAvatarState(_avatar2); } - [Fact] - public void Use() + [Theory] + // 1bp == 0.01% + [InlineData(10000)] + [InlineData(1000)] + [InlineData(3700)] + public void Use(int ratioBp) { var simulator = new ArenaSimulator(new TestRandom()); var myDigest = new ArenaPlayerDigest(_avatar1, _arenaAvatar1); @@ -69,10 +73,13 @@ public void Use() ); var skillRow = _tableSheets.SkillSheet.OrderedList.First(s => s.Id == 700010); - var shatterStrike = new ArenaShatterStrike(skillRow, 0, 0, 10000, StatType.NONE); + var shatterStrike = new ArenaShatterStrike(skillRow, 0, 0, ratioBp, StatType.NONE); var used = shatterStrike.Use(challenger, enemy, simulator.Turn, new List()); Assert.Single(used.SkillInfos); - Assert.Equal(enemy.HP - enemy.DEF, used.SkillInfos.First().Effect); + Assert.Equal( + (long)(enemy.HP * ratioBp / 10000m) - enemy.DEF + challenger.ArmorPenetration, + used.SkillInfos.First().Effect + ); } } } diff --git a/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs b/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs index af991713d7..cdd18fac70 100644 --- a/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs +++ b/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs @@ -18,12 +18,21 @@ public class ShatterStrikeTest private readonly TableSheets _tableSheets = new (TableSheetsImporter.ImportSheets()); [Theory] - [InlineData(true)] - [InlineData(false)] - public void Use(bool copyCharacter) + // 10000bp == 100% + [InlineData(10000, true)] + [InlineData(10000, false)] + // 1000bp == 10% + [InlineData(1000, true)] + [InlineData(1000, false)] + // 3700bp == 37% + [InlineData(3700, true)] + [InlineData(3700, false)] + public void Use(int ratioBp, bool copyCharacter) { - Assert.True(_tableSheets.SkillSheet.TryGetValue(700010, out var skillRow)); // 700010 is ShatterStrike - var shatterStrike = new ShatterStrike(skillRow, 0, 0, 10000, StatType.NONE); + Assert.True( + _tableSheets.SkillSheet.TryGetValue(700010, out var skillRow) + ); // 700010 is ShatterStrike + var shatterStrike = new ShatterStrike(skillRow, 0, 0, ratioBp, StatType.NONE); var avatarState = new AvatarState( new PrivateKey().Address, @@ -70,7 +79,10 @@ public void Use(bool copyCharacter) var used = shatterStrike.Use(player, 0, new List(), copyCharacter); Assert.NotNull(used); var skillInfo = Assert.Single(used.SkillInfos); - Assert.Equal(enemy.HP - enemy.DEF, skillInfo.Effect); + Assert.Equal( + (long)(enemy.HP * ratioBp / 10000m) - enemy.DEF + player.ArmorPenetration, + skillInfo.Effect + ); } } } From 8106929efa8f718cf65e37e19d1807eb1c290c7c Mon Sep 17 00:00:00 2001 From: hyeon Date: Fri, 8 Mar 2024 17:42:20 +0900 Subject: [PATCH 68/78] Add test case: kill enemy --- .../Model/Skill/Arena/ArenaShatterStrikeTest.cs | 5 +++++ .Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs | 10 +++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs b/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs index b7a8014d21..c616f3e393 100644 --- a/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs +++ b/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs @@ -49,6 +49,7 @@ public ArenaShatterStrikeTest() [InlineData(10000)] [InlineData(1000)] [InlineData(3700)] + [InlineData(100000)] public void Use(int ratioBp) { var simulator = new ArenaSimulator(new TestRandom()); @@ -80,6 +81,10 @@ public void Use(int ratioBp) (long)(enemy.HP * ratioBp / 10000m) - enemy.DEF + challenger.ArmorPenetration, used.SkillInfos.First().Effect ); + if (ratioBp > 10000) + { + Assert.True(enemy.IsDead); + } } } } diff --git a/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs b/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs index cdd18fac70..c64b7b16d1 100644 --- a/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs +++ b/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs @@ -18,15 +18,15 @@ public class ShatterStrikeTest private readonly TableSheets _tableSheets = new (TableSheetsImporter.ImportSheets()); [Theory] - // 10000bp == 100% + // 1bp == 0.01% [InlineData(10000, true)] [InlineData(10000, false)] - // 1000bp == 10% [InlineData(1000, true)] [InlineData(1000, false)] - // 3700bp == 37% [InlineData(3700, true)] [InlineData(3700, false)] + [InlineData(100000, true)] + [InlineData(100000, false)] public void Use(int ratioBp, bool copyCharacter) { Assert.True( @@ -83,6 +83,10 @@ public void Use(int ratioBp, bool copyCharacter) (long)(enemy.HP * ratioBp / 10000m) - enemy.DEF + player.ArmorPenetration, skillInfo.Effect ); + if (ratioBp > 10000) + { + Assert.True(skillInfo.IsDead); + } } } } From 3ff93925082ba79c00d2d3345ec231a038e67769 Mon Sep 17 00:00:00 2001 From: hyeon Date: Mon, 11 Mar 2024 11:34:23 +0900 Subject: [PATCH 69/78] Fix wrong skill code during merge --- .Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs | 2 +- .Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs | 4 ++-- Lib9c/TableCSV/Skill/SkillSheet.csv | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs b/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs index c616f3e393..4aaec7502b 100644 --- a/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs +++ b/.Lib9c.Tests/Model/Skill/Arena/ArenaShatterStrikeTest.cs @@ -73,7 +73,7 @@ public void Use(int ratioBp) new List() ); - var skillRow = _tableSheets.SkillSheet.OrderedList.First(s => s.Id == 700010); + var skillRow = _tableSheets.SkillSheet.OrderedList.First(s => s.Id == 700011); var shatterStrike = new ArenaShatterStrike(skillRow, 0, 0, ratioBp, StatType.NONE); var used = shatterStrike.Use(challenger, enemy, simulator.Turn, new List()); Assert.Single(used.SkillInfos); diff --git a/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs b/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs index c64b7b16d1..190ce2540c 100644 --- a/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs +++ b/.Lib9c.Tests/Model/Skill/ShatterStrikeTest.cs @@ -30,8 +30,8 @@ public class ShatterStrikeTest public void Use(int ratioBp, bool copyCharacter) { Assert.True( - _tableSheets.SkillSheet.TryGetValue(700010, out var skillRow) - ); // 700010 is ShatterStrike + _tableSheets.SkillSheet.TryGetValue(700011, out var skillRow) + ); // 700011 is ShatterStrike var shatterStrike = new ShatterStrike(skillRow, 0, 0, ratioBp, StatType.NONE); var avatarState = new AvatarState( diff --git a/Lib9c/TableCSV/Skill/SkillSheet.csv b/Lib9c/TableCSV/Skill/SkillSheet.csv index 35d1a0c54f..3a3d59cfe0 100644 --- a/Lib9c/TableCSV/Skill/SkillSheet.csv +++ b/Lib9c/TableCSV/Skill/SkillSheet.csv @@ -174,4 +174,4 @@ _250001,속도 증가(전체),Normal,Buff,SpeedBuff,Ally,1,1 // 미구현 700008,더블 어택,Normal,Attack,DoubleAttack,Enemy,2,15,true 700009,디버프 제거,Normal,Buff,Buff,Self,1,15 700010,면역,Normal,Buff,Dispel,Self,1,15 -700011,HP 비례 데미지,Normal,Attack,BlowAttack,Enemy,1,15 +700011,HP 비례 데미지,Normal,Attack,ShatterStrike,Enemy,1,15 From 74902fd8efa4879d2f18a719f6d7b1dd16051878 Mon Sep 17 00:00:00 2001 From: jonny Date: Mon, 11 Mar 2024 18:21:50 +0900 Subject: [PATCH 70/78] fix dispel error --- Lib9c/Model/Character/CharacterBase.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Lib9c/Model/Character/CharacterBase.cs b/Lib9c/Model/Character/CharacterBase.cs index 02e5ebd382..fe27fa77c8 100644 --- a/Lib9c/Model/Character/CharacterBase.cs +++ b/Lib9c/Model/Character/CharacterBase.cs @@ -398,14 +398,12 @@ protected virtual void EndTurn() { Buffs[dispel.BuffInfo.GroupId] = clone; - foreach (var bff in Buffs.Values.Where( - bff => bff.IsDebuff() && - Simulator.Random.Next(0, 100) < - action.RowData.Chance) - ) + dispelList = Buffs.Values.Where( + bff => bff.IsDebuff() && + Simulator.Random.Next(0, 100) < + action.RowData.Chance).ToList(); + foreach (var bff in dispelList) { - dispelList.Add(bff); - switch (bff) { case StatBuff statBuff: From 95a5bf3f7193e227bf1163da3cc95fa7e582201e Mon Sep 17 00:00:00 2001 From: jonny Date: Mon, 11 Mar 2024 19:53:37 +0900 Subject: [PATCH 71/78] fix arena dispel exception --- Lib9c/Model/Character/ArenaCharacter.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib9c/Model/Character/ArenaCharacter.cs b/Lib9c/Model/Character/ArenaCharacter.cs index 3230e94bc5..81d2ddd848 100644 --- a/Lib9c/Model/Character/ArenaCharacter.cs +++ b/Lib9c/Model/Character/ArenaCharacter.cs @@ -916,13 +916,13 @@ public void SpawnV2(ArenaCharacter target) { Buffs[dispel.BuffInfo.GroupId] = clone; - foreach (var bff in Buffs.Values.Where( - bff => bff.IsDebuff() && + dispelList = Buffs.Values.Where( + bff => bff.IsDebuff() && Simulator.Random.Next(0, 100) < - action.RowData.Chance) - ) + action.RowData.Chance).ToList(); + + foreach (var bff in dispelList) { - dispelList.Add(bff); switch (bff) { case StatBuff statBuff: From 03c922fff7006dc4f8020056723f25192ec3527c Mon Sep 17 00:00:00 2001 From: jonny Date: Mon, 11 Mar 2024 21:16:33 +0900 Subject: [PATCH 72/78] fix sentence --- Lib9c/Model/Character/CharacterBase.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib9c/Model/Character/CharacterBase.cs b/Lib9c/Model/Character/CharacterBase.cs index fe27fa77c8..1e87d7308c 100644 --- a/Lib9c/Model/Character/CharacterBase.cs +++ b/Lib9c/Model/Character/CharacterBase.cs @@ -400,8 +400,9 @@ protected virtual void EndTurn() dispelList = Buffs.Values.Where( bff => bff.IsDebuff() && - Simulator.Random.Next(0, 100) < - action.RowData.Chance).ToList(); + Simulator.Random.Next(0, 100) < + action.RowData.Chance).ToList(); + foreach (var bff in dispelList) { switch (bff) From 50f8f968079df335e811b6f185b49f98a40d6291 Mon Sep 17 00:00:00 2001 From: jonny Date: Mon, 11 Mar 2024 21:17:00 +0900 Subject: [PATCH 73/78] apply dispel test data --- Lib9c.DevExtensions/Data/TestbedCreateAvatar.json | 8 +++++--- Lib9c/TableCSV/Skill/ActionBuffSheet.csv | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json b/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json index c7aa72e118..67be6cba9d 100644 --- a/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json +++ b/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json @@ -353,10 +353,12 @@ ] }, { - "ID": 10153000, - "Level": 19, + "ID": 10354001, + "Level": 17, "OptionIds": [ - 1055000114 + 1055100124, + 1055400033, + 1065000612 ] } ] diff --git a/Lib9c/TableCSV/Skill/ActionBuffSheet.csv b/Lib9c/TableCSV/Skill/ActionBuffSheet.csv index 1d15c64089..070d95ec38 100644 --- a/Lib9c/TableCSV/Skill/ActionBuffSheet.csv +++ b/Lib9c/TableCSV/Skill/ActionBuffSheet.csv @@ -8,4 +8,4 @@ id,group,_name,chance,duration,target_type,buff_type,elemental_type,atk_power_ra 705000,705000,흡혈,100,0,Self,Vampiric,Normal,0 706000,706000,집중,100,20,Self,Focus,Normal,0 707000,707000,치유,100,0,Self,Dispel,Normal,0 -708000,708000,면역(1),100,1,Self,Dispel,Normal,0 +708000,708000,면역(1),100,20,Self,Dispel,Normal,0 From 23563050702f1941e316a564c6796a727423d631 Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 12 Mar 2024 09:59:44 +0900 Subject: [PATCH 74/78] Add dispel affect test on arena --- .../Model/Skill/Arena/ArenaCombatTest.cs | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/.Lib9c.Tests/Model/Skill/Arena/ArenaCombatTest.cs b/.Lib9c.Tests/Model/Skill/Arena/ArenaCombatTest.cs index 7db7484ce0..97307544db 100644 --- a/.Lib9c.Tests/Model/Skill/Arena/ArenaCombatTest.cs +++ b/.Lib9c.Tests/Model/Skill/Arena/ArenaCombatTest.cs @@ -13,6 +13,8 @@ namespace Lib9c.Tests.Model.Skill.Arena public class ArenaCombatTest { + private const int ActionBuffId = 708000; // Dispel with duration + private readonly TableSheets _tableSheets; private readonly AvatarState _avatar1; private readonly AvatarState _avatar2; @@ -96,5 +98,101 @@ public void DispelOnUse(int dispelId, int[] debuffIdList) Assert.Single(challenger.Buffs); Assert.Equal(dispelRow.GroupId, challenger.Buffs.First().Value.BuffInfo.GroupId); } + + [Fact] + public void DispelOnDuration_Block() + { + var arenaSheets = _tableSheets.GetArenaSimulatorSheets(); + var myDigest = new ArenaPlayerDigest(_avatar1, _arenaAvatar1); + var enemyDigest = new ArenaPlayerDigest(_avatar2, _arenaAvatar2); + var simulator = new ArenaSimulator(new TestRandom()); + var challenger = new ArenaCharacter( + simulator, + myDigest, + arenaSheets, + simulator.HpModifier, + new List() + ); + var enemy = new ArenaCharacter( + simulator, + enemyDigest, + arenaSheets, + simulator.HpModifier, + new List() + ); + + // Use Dispel first + var dispel = _tableSheets.ActionBuffSheet.Values.First(bf => bf.Id == ActionBuffId); + challenger.AddBuff(BuffFactory.GetActionBuff(challenger.Stats, dispel)); + Assert.Single(challenger.Buffs); + + // Use Bleed + var debuffRow = + _tableSheets.SkillSheet.Values.First(bf => bf.Id == 600001); // 600001 is bleed + var debuff = new ArenaBuffSkill(debuffRow, 100, 100, 0, StatType.NONE); + var battleStatus = debuff.Use( + enemy, + challenger, + simulator.Turn, + BuffFactory.GetBuffs( + challenger.Stats, + debuff, + _tableSheets.SkillBuffSheet, + _tableSheets.StatBuffSheet, + _tableSheets.SkillActionBuffSheet, + _tableSheets.ActionBuffSheet + ) + ); + Assert.Single(challenger.Buffs); + Assert.False(battleStatus.SkillInfos.First().Affected); + } + + [Fact] + public void DispelOnDuration_Affect() + { + var arenaSheets = _tableSheets.GetArenaSimulatorSheets(); + var myDigest = new ArenaPlayerDigest(_avatar1, _arenaAvatar1); + var enemyDigest = new ArenaPlayerDigest(_avatar2, _arenaAvatar2); + var simulator = new ArenaSimulator(new TestRandom()); + var challenger = new ArenaCharacter( + simulator, + myDigest, + arenaSheets, + simulator.HpModifier, + new List() + ); + var enemy = new ArenaCharacter( + simulator, + enemyDigest, + arenaSheets, + simulator.HpModifier, + new List() + ); + + // Use Dispel first + var dispel = _tableSheets.ActionBuffSheet.Values.First(bf => bf.Id == ActionBuffId); + challenger.AddBuff(BuffFactory.GetActionBuff(challenger.Stats, dispel)); + Assert.Single(challenger.Buffs); + + // Use Focus + var buffRow = + _tableSheets.SkillSheet.Values.First(bf => bf.Id == 700007); // 700007 is Focus + var buff = new ArenaBuffSkill(buffRow, 100, 100, 0, StatType.NONE); + var battleStatus = buff.Use( + challenger, + challenger, + simulator.Turn, + BuffFactory.GetBuffs( + challenger.Stats, + buff, + _tableSheets.SkillBuffSheet, + _tableSheets.StatBuffSheet, + _tableSheets.SkillActionBuffSheet, + _tableSheets.ActionBuffSheet + ) + ); + Assert.Equal(2, challenger.Buffs.Count); + Assert.True(battleStatus.SkillInfos.First().Affected); + } } } From 274edd85cc7067f8808a39f2294492dec49f1488 Mon Sep 17 00:00:00 2001 From: hyeon Date: Tue, 12 Mar 2024 09:59:59 +0900 Subject: [PATCH 75/78] Fix wrong name in test --- .Lib9c.Tests/Model/Skill/CombatTest.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.Lib9c.Tests/Model/Skill/CombatTest.cs b/.Lib9c.Tests/Model/Skill/CombatTest.cs index 5a44df0ed2..652f03b4b2 100644 --- a/.Lib9c.Tests/Model/Skill/CombatTest.cs +++ b/.Lib9c.Tests/Model/Skill/CombatTest.cs @@ -225,16 +225,16 @@ public void DispelOnDuration_Affect() _player.AddBuff(BuffFactory.GetActionBuff(_player.Stats, dispel)); Assert.Single(_player.Buffs); - // Use Bleed - var debuffRow = + // Use Focus + var buffRow = _tableSheets.SkillSheet.Values.First(bf => bf.Id == 700007); // 700007 is Focus - var debuff = new BuffSkill(debuffRow, 100, 100, 0, StatType.NONE); - var battleStatus = debuff.Use( + var buff = new BuffSkill(buffRow, 100, 100, 0, StatType.NONE); + var battleStatus = buff.Use( _player, 0, BuffFactory.GetBuffs( _player.Stats, - debuff, + buff, _tableSheets.SkillBuffSheet, _tableSheets.StatBuffSheet, _tableSheets.SkillActionBuffSheet, From 5be7238c79fcf799285715d26ffb02ccbfb1a88a Mon Sep 17 00:00:00 2001 From: jonny Date: Tue, 12 Mar 2024 16:00:04 +0900 Subject: [PATCH 76/78] test data for shatter strike --- Lib9c.DevExtensions/Data/TestbedCreateAvatar.json | 11 ++++++++++- Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json b/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json index 67be6cba9d..0d522af818 100644 --- a/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json +++ b/Lib9c.DevExtensions/Data/TestbedCreateAvatar.json @@ -356,7 +356,16 @@ "ID": 10354001, "Level": 17, "OptionIds": [ - 1055100124, + 1015200124, + 1055400033, + 1065000612 + ] + }, + { + "ID": 10354001, + "Level": 17, + "OptionIds": [ + 1055400125, 1055400033, 1065000612 ] diff --git a/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv b/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv index 6c9a371991..6472ca678d 100644 --- a/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv +++ b/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv @@ -2069,4 +2069,5 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1055400121,DEF,1,1,,,,,,,, 1055400122,HIT,1,1,,,,,,,, 1055400123,DEF,1,1,,,,,,,, -1055400124,,,,700010,50,80,28,28,,, \ No newline at end of file +1055400124,,,,700010,50,80,28,28,,, +1055400125,,,,700011,50,80,28,28,,, \ No newline at end of file From f8a679518b9c39c54cae6794175da4056c7169cb Mon Sep 17 00:00:00 2001 From: Jonny <138189475+jonny-jeahyunchoi@users.noreply.github.com> Date: Tue, 12 Mar 2024 18:23:54 +0900 Subject: [PATCH 77/78] Update Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv --- Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv b/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv index 6472ca678d..2d99f2f1e2 100644 --- a/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv +++ b/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv @@ -2070,4 +2070,4 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1055400122,HIT,1,1,,,,,,,, 1055400123,DEF,1,1,,,,,,,, 1055400124,,,,700010,50,80,28,28,,, -1055400125,,,,700011,50,80,28,28,,, \ No newline at end of file +1055400125,,,,700011,,,28,28,2300,2300, \ No newline at end of file From e5af4d8a408b104bc8c5418c2975f85c2c3cb8e8 Mon Sep 17 00:00:00 2001 From: jonny Date: Tue, 12 Mar 2024 20:26:55 +0900 Subject: [PATCH 78/78] fix add custom item recent version --- Lib9c/Action/CombinationEquipment5.cs | 8 +++++++- Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Lib9c/Action/CombinationEquipment5.cs b/Lib9c/Action/CombinationEquipment5.cs index ba19c84b6a..48488e37ab 100644 --- a/Lib9c/Action/CombinationEquipment5.cs +++ b/Lib9c/Action/CombinationEquipment5.cs @@ -29,7 +29,13 @@ public static Skill GetSkill(EquipmentItemOptionSheet.Row row, SkillSheet skillS var skillRow = skillSheet.OrderedList.First(r => r.Id == row.SkillId); var dmg = random.Next(row.SkillDamageMin, row.SkillDamageMax + 1); var chance = random.Next(row.SkillChanceMin, row.SkillChanceMax + 1); - var skill = SkillFactory.GetV1(skillRow, dmg, chance); + + var hasStatDamageRatio = row.StatDamageRatioMin != default && row.StatDamageRatioMax != default; + var statDamageRatio = hasStatDamageRatio ? + random.Next(row.StatDamageRatioMin, row.StatDamageRatioMax + 1) : default; + var refStatType = hasStatDamageRatio ? row.ReferencedStatType : StatType.NONE; + + var skill = SkillFactory.Get(skillRow, dmg, chance, statDamageRatio, refStatType); return skill; } catch (InvalidOperationException) diff --git a/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv b/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv index 2d99f2f1e2..c3cfb65888 100644 --- a/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv +++ b/Lib9c/TableCSV/Item/EquipmentItemOptionSheet.csv @@ -2070,4 +2070,4 @@ id,stat_type,stat_min,stat_max,skill_id,skill_damage_min,skill_damage_max,skill_ 1055400122,HIT,1,1,,,,,,,, 1055400123,DEF,1,1,,,,,,,, 1055400124,,,,700010,50,80,28,28,,, -1055400125,,,,700011,,,28,28,2300,2300, \ No newline at end of file +1055400125,,,,700011,0,0,28,28,2300,2300,HP \ No newline at end of file