Преглед на файлове

Added remove option for importing & item updates

Cydh преди 5 години
родител
ревизия
be9fc60377

+ 2 - 0
db/import-tmpl/item_synthesis.yml

@@ -12,7 +12,9 @@
 #   SourceItem:         # List of item required
 #     - Item:           # (int) Item ID for source
 #       Amount:         # (int) Item amount will be consumed (Default: 1)
+#       Remove:         # (optional, any) Remove this item from the list while importing
 #   Reward:             # (string) Script on synthesis success
+#   ClearSourceItem:    # (optional, any) Can be used to clear SourceItem list while importing
 ###########################################################################
 
 Header:

+ 2 - 0
db/import-tmpl/item_upgrade.yml

@@ -12,7 +12,9 @@
 #   NotSocketEnchantItem: # (bool) Target item must not has enchant stone (default: true)
 #   TargetItem:           # List of possible item to be upgraded
 #     - Item:             # (int) Target's Item ID
+#       Remove:           # (optional, any) Remove this item from the list while importing
 #   Result:               # (string) Script on upgrade success
+#   ClearTargetItem:      # (optional, any) Can be used to clear TargetItem list while importing
 ###########################################################################
 
 Header:

+ 2 - 0
db/pre-re/item_synthesis.yml

@@ -12,7 +12,9 @@
 #   SourceItem:         # List of item required
 #     - Item:           # (int) Item ID for source
 #       Amount:         # (int) Item amount will be consumed (Default: 1)
+#       Remove:         # (optional, any) Remove this item from the list while importing
 #   Reward:             # (string) Script on synthesis success
+#   ClearSourceItem:    # (optional, any) Can be used to clear SourceItem list while importing
 ###########################################################################
 
 Header:

+ 2 - 0
db/pre-re/item_upgrade.yml

@@ -12,7 +12,9 @@
 #   NotSocketEnchantItem: # (bool) Target item must not has enchant stone (default: true)
 #   TargetItem:           # List of possible item to be upgraded
 #     - Item:             # (int) Target's Item ID
+#       Remove:           # (optional, any) Remove this item from the list while importing
 #   Result:               # (string) Script on upgrade success
+#   ClearTargetItem:      # (optional, any) Can be used to clear TargetItem list while importing
 ###########################################################################
 
 Header:

+ 20 - 10
db/re/item_package.txt

@@ -4916,7 +4916,8 @@ IG_PhysicalMagical_Mix,24398,1,1,1,0,0,0 // 매지컬 아머 쉐도우
 IG_PhysicalMagical_Mix,24396,1,1,1,0,0,0 // 매지컬 슈즈 쉐도우
 IG_PhysicalMagical_Mix,24397,1,1,1,0,0,0 // 매지컬 쉴드 쉐도우
 
-IG_Silver_Statue,28945,1,1,1,0,0,0 // 피빛의 기사의 방패
+IG_Silver_Statue,28942,900,1,1,0,0,0 // 저주받은 기사의 방패
+IG_Silver_Statue,28945,99,1,1,0,0,0 // 피빛의 기사의 방패
 IG_Silver_Statue,28946,1,1,1,0,0,0 // 정화된 기사의 방패
 
 IG_Stability_Shadow_Box,24352,1,1,1,0,0,0 // S_Plasterer's_Armor_II
@@ -4940,7 +4941,7 @@ IG_Gemstone_S_Conversion_Box,24336,1,1,1,0,0,0 // 젬스톤 쉴드 쉐도우 II
 IG_Status_S_Conversion_Box,24339,1,1,1,0,0,0 // 올마이티 이어링 쉐도우
 IG_Status_S_Conversion_Box,24340,1,1,1,0,0,0 // 올마이티 펜던트 쉐도우
 
-// TODO: Need 'yellow' shadow equipment as seen on https://ro.gnjoy.com.tw/notice/notice_view.aspx?id=1154
+//! TODO: http://ro.gnjoy.com/news/probability/View.asp?seq=3954787
 IG_Shadow_Exchange_Box,24018,1,1,1,0,0,0
 IG_Shadow_Exchange_Box,24019,1,1,1,0,0,0
 IG_Shadow_Exchange_Box,24020,1,1,1,0,0,0
@@ -5382,8 +5383,7 @@ IG_Shadow_Exchange_Box,24473,1,1,1,0,0,0
 IG_Shadow_Exchange_Box,24474,1,1,1,0,0,0
 IG_Shadow_Exchange_Box,24475,1,1,1,0,0,0
 
-//!TODO : as item directly or boxes?
-//http://www.inven.co.kr/board/ro/1951/4571
+//!TODO http://ro.gnjoy.com/news/probability/View.asp?&seq=3954790
 IG_Costume_Enchant_Stone_Box,22826,1,1,1,0,0,0 // 의상 인챈트 스톤 상자4
 IG_Costume_Enchant_Stone_Box,22868,1,1,1,0,0,0 // 의상 인챈트 스톤 상자5
 IG_Costume_Enchant_Stone_Box,22905,1,1,1,0,0,0 // 의상 인챈트 스톤 상자6
@@ -5420,7 +5420,7 @@ IG_EnchantStone_Recipe_9m,23629,1,1,1,0,0,0 // 의상 인챈트 스톤 상자14
 IG_EnchantStone_Recipe_9m,23682,1,1,1,0,0,0 // 의상 인챈트 스톤 상자15
 IG_EnchantStone_Recipe_9m,23770,1,1,1,0,0,0 // 의상 인챈트 스톤 상자16
 
-// http://ro.gnjoy.com/news/probability/View.asp?category=6&seq=3955672
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3955672
 IG_Class_Shadow_Pendant,24250,1,1,1,0,0,0
 IG_Class_Shadow_Pendant,24251,1,1,1,0,0,0
 IG_Class_Shadow_Pendant,24252,1,1,1,0,0,0
@@ -5428,7 +5428,7 @@ IG_Class_Shadow_Pendant,24253,1,1,1,0,0,0
 IG_Class_Shadow_Pendant,24254,1,1,1,0,0,0
 IG_Class_Shadow_Pendant,24255,1,1,1,0,0,0
 
-// http://ro.gnjoy.com/news/probability/View.asp?category=6&seq=3955674
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3955674
 IG_Class_Shadow_Earring,24246,1,1,1,0,0,0
 IG_Class_Shadow_Earring,24247,1,1,1,0,0,0
 IG_Class_Shadow_Earring,24248,1,1,1,0,0,0
@@ -5436,7 +5436,7 @@ IG_Class_Shadow_Earring,24249,1,1,1,0,0,0
 IG_Class_Shadow_Earring,28391,1,1,1,0,0,0
 IG_Class_Shadow_Earring,28392,1,1,1,0,0,0
 
-// http://ro.gnjoy.com/news/probability/View.asp?category=6&seq=3955671
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3955671
 IG_Class_Shadow_Shield,24301,1,1,1,0,0,0
 IG_Class_Shadow_Shield,24302,1,1,1,0,0,0
 IG_Class_Shadow_Shield,24303,1,1,1,0,0,0
@@ -5457,7 +5457,7 @@ IG_Class_Shadow_Shield,24317,1,1,1,0,0,0
 IG_Class_Shadow_Shield,24318,1,1,1,0,0,0
 IG_Class_Shadow_Shield,24319,1,1,1,0,0,0
 
-// http://ro.gnjoy.com/news/probability/View.asp?category=6&seq=3955669
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3955669
 IG_Class_Shadow_Shoes,24256,1,1,1,0,0,0
 IG_Class_Shadow_Shoes,24257,1,1,1,0,0,0
 IG_Class_Shadow_Shoes,24258,1,1,1,0,0,0
@@ -5479,7 +5479,7 @@ IG_Class_Shadow_Shoes,24411,1,1,1,0,0,0
 IG_Class_Shadow_Shoes,24413,1,1,1,0,0,0
 IG_Class_Shadow_Shoes,24415,1,1,1,0,0,0
 
-// http://ro.gnjoy.com/news/probability/View.asp?category=6&seq=3955664
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3955664
 IG_Class_Shadow_Armor,24269,1,1,1,0,0,0
 IG_Class_Shadow_Armor,24270,1,1,1,0,0,0
 IG_Class_Shadow_Armor,24271,1,1,1,0,0,0
@@ -5501,7 +5501,7 @@ IG_Class_Shadow_Armor,24410,1,1,1,0,0,0
 IG_Class_Shadow_Armor,24412,1,1,1,0,0,0
 IG_Class_Shadow_Armor,24414,1,1,1,0,0,0
 
-// http://ro.gnjoy.com/news/probability/View.asp?category=6&seq=3955662
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3955662
 IG_Class_Shadow_Weapon,24282,1,1,1,0,0,0
 IG_Class_Shadow_Weapon,24283,1,1,1,0,0,0
 IG_Class_Shadow_Weapon,24284,1,1,1,0,0,0
@@ -5522,6 +5522,7 @@ IG_Class_Shadow_Weapon,24298,1,1,1,0,0,0
 IG_Class_Shadow_Weapon,24299,1,1,1,0,0,0
 IG_Class_Shadow_Weapon,24300,1,1,1,0,0,0
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3954791
 IG_Costume_Exchange_Box,19876,1,1,1,0,0,0
 IG_Costume_Exchange_Box,19654,1,1,1,0,0,0
 IG_Costume_Exchange_Box,19608,1,1,1,0,0,0
@@ -6300,3 +6301,12 @@ IG_Costume_Enchant_Stone_Box19,25017,370,1,1	// 마공스톤(하단)
 IG_Costume_Enchant_Stone_Box19,25304,370,1,1	// 크리티컬스톤(상단)
 IG_Costume_Enchant_Stone_Box19,25060,370,1,1	// 크리티컬스톤(중단)
 IG_Costume_Enchant_Stone_Box19,25305,370,1,1	// 크리티컬스톤(하단)
+
+IG_PERFECTSIZE_MIX,24425,1 // 퍼펙트 사이즈 웨폰 쉐도우
+IG_PERFECTSIZE_MIX,24426,1 // 퍼펙트 사이즈 아머 쉐도우
+
+IG_MAGICPIERCING_MIX,24427,1 // 매직 엑소시스트 커럽트 웨폰 쉐도우
+IG_MAGICPIERCING_MIX,24428,1 // 매직 바이브레이션 드래곤킬러 웨폰 쉐도우
+IG_MAGICPIERCING_MIX,24429,1 // 매직 시저스 헌팅 웨폰 쉐도우
+IG_MAGICPIERCING_MIX,24430,1 // 매직 피싱 인섹트 웨폰 쉐도우
+IG_MAGICPIERCING_MIX,24431,1 // 매직 액서큐서너 홀리워터 웨폰 쉐도우

+ 4 - 2
db/re/item_synthesis.yml

@@ -12,7 +12,9 @@
 #   SourceItem:         # List of item required
 #     - Item:           # (int) Item ID for source
 #       Amount:         # (int) Item amount will be consumed (Default: 1)
+#       Remove:         # (optional, any) Remove this item from the list while importing
 #   Reward:             # (string) Script on synthesis success
+#   ClearSourceItem:    # (optional, any) Can be used to clear SourceItem list while importing
 ###########################################################################
 
 Header:
@@ -77,7 +79,7 @@ Body:
   - Item: 24072
   - Item: 24073
   - Item: 24074
-  Reward: getitem(24426,1);
+  Reward: getgroupitem(IG_PERFECTSIZE_MIX);
 - Id: 100011 # MagicPiercing_Mix
   SourceNeeded: 2
   NeedRefineMin: 7
@@ -92,7 +94,7 @@ Body:
   - Item: 24177
   - Item: 24178
   - Item: 24179
-  Reward: getitem(24436,1);
+  Reward: getgroupitem(IG_MAGICPIERCING_MIX);
 - Id: 100000 # IDTest_Special
   SourceNeeded: 3
   SourceItem:

+ 2 - 0
db/re/item_upgrade.yml

@@ -12,7 +12,9 @@
 #   NotSocketEnchantItem: # (bool) Target item must not has enchant stone (default: true)
 #   TargetItem:           # List of possible item to be upgraded
 #     - Item:             # (int) Target's Item ID
+#       Remove:           # (optional, any) Remove this item from the list while importing
 #   Result:               # (string) Script on upgrade success
+#   ClearTargetItem:      # (optional, any) Can be used to clear TargetItem list while importing
 ###########################################################################
 
 Header:

+ 113 - 96
npc/re/other/LapineEnchants.txt

@@ -218,7 +218,7 @@ function	script	F_Lapine_Ancient_Hero_Wisdom	{
 }
 
 function	script	F_Lapine_ILL_Piece_A	{
-	.@r = rand(320); // No rates info
+	.@r = rand(320); //! TODO: Official Rates info
 		 if (.@r < 100) { set getarg(0), RDMOPT_VAR_MAXHPAMOUNT; set getarg(1), rand(100,1500); if (rand(100) < 80) return; }
 	else if (.@r < 200) { set getarg(0), RDMOPT_VAR_ATKPERCENT; set getarg(1), rand(1,3); if (rand(100) < 80) return; }
 	else if (.@r < 210) { set getarg(0), RDMOPT_DEC_SP_CONSUMPTION; set getarg(1), rand(1,10); }
@@ -233,7 +233,7 @@ function	script	F_Lapine_ILL_Piece_A	{
 	else if (.@r < 300) { set getarg(0), RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET; set getarg(1), rand(1,10); }
 	else if (.@r < 310) { set getarg(0), RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET; set getarg(1), rand(1,10); }
 	else if (.@r < 320) { set getarg(0), RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET; set getarg(1), rand(1,10); }
-	.@r = rand(170); // No rates info
+	.@r = rand(170); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(2), RDMOPT_RACE_DAMAGE_NOTHING; set getarg(3), rand(1,10); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_RACE_DAMAGE_UNDEAD; set getarg(3), rand(1,10); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_RACE_DAMAGE_ANIMAL; set getarg(3), rand(1,10); }
@@ -255,7 +255,7 @@ function	script	F_Lapine_ILL_Piece_A	{
 }
 
 function	script	F_Lapine_ILL_Piece_B	{
-	.@r = rand(320); // No rates info
+	.@r = rand(320); //! TODO: Official Rates info
 		 if (.@r < 100) { set getarg(0), RDMOPT_VAR_MAXHPAMOUNT; set getarg(1), rand(100,1500); if (rand(100) < 80) return; }
 	else if (.@r < 200) { set getarg(0), RDMOPT_DEC_SPELL_CAST_TIME; set getarg(1), rand(3,5); if (rand(100) < 80) return; }
 	else if (.@r < 210) { set getarg(0), RDMOPT_DEC_SP_CONSUMPTION; set getarg(1), rand(1,10); }
@@ -270,7 +270,7 @@ function	script	F_Lapine_ILL_Piece_B	{
 	else if (.@r < 300) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_DARKNESS_TARGET; set getarg(1), rand(1,10); }
 	else if (.@r < 310) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_TELEKINESIS_TARGET; set getarg(1), rand(1,10); }
 	else if (.@r < 320) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_UNDEAD_TARGET; set getarg(1), rand(1,10); }
-	.@r = rand(150); // No rates info
+	.@r = rand(150); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(2), RDMOPT_RACE_MDAMAGE_NOTHING; set getarg(3), rand(1,10); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_RACE_MDAMAGE_UNDEAD; set getarg(3), rand(1,10); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_RACE_MDAMAGE_ANIMAL; set getarg(3), rand(1,10); }
@@ -289,9 +289,10 @@ function	script	F_Lapine_ILL_Piece_B	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3999573
 function	script	F_Lapine_Gemstone_Of_Time	{
 	// Option:1
-	.@r = rand(170); // No rates info
+	.@r = rand(170);
 		 if (.@r < 10)  { set getarg(0), RDMOPT_VAR_ATTPOWER; set getarg(1), rand(3,20); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_VAR_ATKPERCENT; set getarg(1), rand(1,3); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_VAR_ATTMPOWER; set getarg(1), rand(3,20); }
@@ -309,6 +310,7 @@ function	script	F_Lapine_Gemstone_Of_Time	{
 	else if (.@r < 150) { set getarg(0), RDMOPT_HEAL_VALUE; set getarg(1), rand(3,20); }
 	else if (.@r < 160) { set getarg(0), RDMOPT_RANGE_ATTACK_DAMAGE_TARGET; set getarg(1), rand(3,20); }
 	else if (.@r < 170) { set getarg(0), RDMOPT_DEC_SPELL_DELAY_TIME; set getarg(1), rand(3,20); }
+	if (rand(2) == 1) return;
 	// Option: 2
 	.@r = rand(280);
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_ATTPOWER; set getarg(3), rand(3,20); }
@@ -342,9 +344,10 @@ function	script	F_Lapine_Gemstone_Of_Time	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3999574
 function	script	F_Lapine_Time_Unseal_Key	{
 	// Option:1
-	.@r = rand(170); // No rates info
+	.@r = rand(170);
 	if (.@r < 10)  { set getarg(0), RDMOPT_VAR_ATTPOWER; set getarg(1), rand(5,40); return; }
 	if (.@r < 20)  { set getarg(0), RDMOPT_VAR_ATKPERCENT; set getarg(1), rand(1,6); return; }
 	if (.@r < 30)  { set getarg(0), RDMOPT_VAR_ATTMPOWER; set getarg(1), rand(5,40); return; }
@@ -367,14 +370,14 @@ function	script	F_Lapine_Time_Unseal_Key	{
 
 function	script	F_Lapine_Magma_Essence	{
 	// Option:1
-	.@r = rand(40); // No rates info
+	.@r = rand(40); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(0), RDMOPT_VAR_MAXHPAMOUNT; set getarg(1), rand(150,350); }
 	else if (.@r < 20) { set getarg(0), RDMOPT_VAR_MAXSPAMOUNT; set getarg(1), rand(25,50); }
 	else if (.@r < 30) { set getarg(0), RDMOPT_VAR_MAXHPPERCENT; set getarg(1), rand(1,5); }
 	else if (.@r < 40) { set getarg(0), RDMOPT_VAR_MAXSPPERCENT; set getarg(1), rand(1,5); }
 
 	// Option:2
-	.@r = rand(260); // No rates info
+	.@r = rand(260); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(2), RDMOPT_VAR_HPACCELERATION; set getarg(3), rand(15,50); }
 	else if (.@r < 20) { set getarg(2), RDMOPT_VAR_SPACCELERATION; set getarg(3), rand(15,50); }
 	else if (.@r < 30) { set getarg(2), RDMOPT_VAR_AVOIDSUCCESSVALUE; set getarg(3), rand(5,15); }
@@ -403,7 +406,7 @@ function	script	F_Lapine_Magma_Essence	{
 	else if (.@r < 260) { set getarg(2), RDMOPT_MDAMAGE_PROPERTY_TELEKINESIS_USER; set getarg(3), rand(5,10); }
 
 	// Option:3
-	.@r = rand(80); // No rates info
+	.@r = rand(80); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(4), RDMOPT_VAR_MAXHPAMOUNT; set getarg(5), rand(150,300); }
 	else if (.@r < 20) { set getarg(4), RDMOPT_VAR_MAXSPAMOUNT; set getarg(5), rand(25,50); }
 	else if (.@r < 30) { set getarg(4), RDMOPT_RACE_TOLERACE_NOTHING; set getarg(5), rand(3,7); }
@@ -418,7 +421,7 @@ function	script	F_Lapine_Magma_Essence	{
 	else if (.@r < 120) { set getarg(4), RDMOPT_RACE_TOLERACE_DRAGON; set getarg(5), rand(3,7); }
 
 	// Option:4
-	.@r = rand(70); // No rates info
+	.@r = rand(70); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(6), RDMOPT_BODY_INDESTRUCTIBLE; }
 	else if (.@r < 20) { set getarg(6), RDMOPT_WEAPON_ATTR_WATER; }
 	else if (.@r < 30) { set getarg(6), RDMOPT_WEAPON_ATTR_GROUND; }
@@ -431,7 +434,7 @@ function	script	F_Lapine_Magma_Essence	{
 
 // Normal Modification Part (Physical)
 function	script	F_Lapine_EP17_1_SPC05	{
-	.@r = rand(140); // No rates info
+	.@r = rand(140); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(3,15); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(3,15); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(3,15); }
@@ -446,7 +449,7 @@ function	script	F_Lapine_EP17_1_SPC05	{
 	else if (.@r < 120) { set getarg(0), RDMOPT_VAR_ATKPERCENT; set getarg(1), rand(1,5); }
 	else if (.@r < 130) { set getarg(0), RDMOPT_VAR_HITSUCCESSVALUE; set getarg(1), rand(3,10); }
 	else if (.@r < 140) { set getarg(0), RDMOPT_VAR_CRITICALSUCCESSVALUE; set getarg(1), rand(3,10); }
-	.@r = rand(180); // No rates info
+	.@r = rand(180); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_PLUSASPD; set getarg(3), 1; }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_VAR_AVOIDSUCCESSVALUE; set getarg(3), rand(5,15); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_DAMAGE_SIZE_SMALL_TARGET; set getarg(3), rand(3,10); }
@@ -470,7 +473,7 @@ function	script	F_Lapine_EP17_1_SPC05	{
 
 // Advanced Modification Part (Physical)
 function	script	F_Lapine_EP17_1_SPC06	{
-	.@r = rand(140); // No rates info
+	.@r = rand(140); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(3,20); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(3,20); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(3,20); }
@@ -485,7 +488,7 @@ function	script	F_Lapine_EP17_1_SPC06	{
 	else if (.@r < 120) { set getarg(0), RDMOPT_VAR_ATKPERCENT; set getarg(1), rand(1,10); }
 	else if (.@r < 130) { set getarg(0), RDMOPT_VAR_HITSUCCESSVALUE; set getarg(1), rand(3,15); }
 	else if (.@r < 140) { set getarg(0), RDMOPT_VAR_CRITICALSUCCESSVALUE; set getarg(1), rand(3,15); }
-	.@r = rand(190); // No rates info
+	.@r = rand(190); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_PLUSASPD; set getarg(3), 1; }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_VAR_AVOIDSUCCESSVALUE; set getarg(3), rand(5,30); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_DAMAGE_SIZE_SMALL_TARGET; set getarg(3), rand(3,15); }
@@ -510,7 +513,7 @@ function	script	F_Lapine_EP17_1_SPC06	{
 
 // Premium Modification Part (Physical)
 function	script	F_Lapine_EP17_1_SPC07	{
-	.@r = rand(140); // No rates info
+	.@r = rand(140); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(5,25); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(5,25); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(5,25); }
@@ -525,7 +528,7 @@ function	script	F_Lapine_EP17_1_SPC07	{
 	else if (.@r < 120) { set getarg(0), RDMOPT_VAR_ATKPERCENT; set getarg(1), rand(3,15); }
 	else if (.@r < 130) { set getarg(0), RDMOPT_VAR_HITSUCCESSVALUE; set getarg(1), rand(3,20); }
 	else if (.@r < 140) { set getarg(0), RDMOPT_VAR_CRITICALSUCCESSVALUE; set getarg(1), rand(3,20); }
-	.@r = rand(200); // No rates info
+	.@r = rand(200); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_PLUSASPD; set getarg(3), rand(1,2); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_VAR_AVOIDSUCCESSVALUE; set getarg(3), rand(5,45); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_DAMAGE_SIZE_SMALL_TARGET; set getarg(3), rand(3,20); }
@@ -551,7 +554,7 @@ function	script	F_Lapine_EP17_1_SPC07	{
 
 // Normal Modification Part (Magic)
 function	script	F_Lapine_EP17_1_SPC08	{
-	.@r = rand(130); // No rates info
+	.@r = rand(130); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(3,15); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(3,15); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(3,15); }
@@ -565,7 +568,7 @@ function	script	F_Lapine_EP17_1_SPC08	{
 	else if (.@r < 110) { set getarg(0), RDMOPT_VAR_MATTPOWER; set getarg(1), rand(5,20); }
 	else if (.@r < 120) { set getarg(0), RDMOPT_VAR_MAGICATKPERCENT; set getarg(1), rand(1,5); }
 	else if (.@r < 130) { set getarg(0), RDMOPT_VAR_PLUSASPDPERCENT; set getarg(1), rand(3,10); }
-	.@r = rand(160); // No rates info
+	.@r = rand(160); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_PLUSASPD; set getarg(3), 1; }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_VAR_AVOIDSUCCESSVALUE; set getarg(3), rand(5,15); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_MDAMAGE_SIZE_SMALL_TARGET; set getarg(3), rand(3,10); }
@@ -587,7 +590,7 @@ function	script	F_Lapine_EP17_1_SPC08	{
 
 // Advanced Modification Part (Magic)
 function	script	F_Lapine_EP17_1_SPC09	{
-	.@r = rand(130); // No rates info
+	.@r = rand(130); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(3,20); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(3,20); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(3,20); }
@@ -601,7 +604,7 @@ function	script	F_Lapine_EP17_1_SPC09	{
 	else if (.@r < 110) { set getarg(0), RDMOPT_VAR_MATTPOWER; set getarg(1), rand(15,40); }
 	else if (.@r < 120) { set getarg(0), RDMOPT_VAR_MAGICATKPERCENT; set getarg(1), rand(1,10); }
 	else if (.@r < 130) { set getarg(0), RDMOPT_VAR_PLUSASPDPERCENT; set getarg(1), rand(3,10); }
-	.@r = rand(190); // No rates info
+	.@r = rand(190); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_PLUSASPD; set getarg(3), 1; }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_VAR_AVOIDSUCCESSVALUE; set getarg(3), rand(5,30); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_MDAMAGE_SIZE_SMALL_TARGET; set getarg(3), rand(3,15); }
@@ -624,7 +627,7 @@ function	script	F_Lapine_EP17_1_SPC09	{
 
 // Premium Modification Part (Magic)
 function	script	F_Lapine_EP17_1_SPC10	{
-	.@r = rand(130); // No rates info
+	.@r = rand(130); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(5,25); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(5,25); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(5,25); }
@@ -638,7 +641,7 @@ function	script	F_Lapine_EP17_1_SPC10	{
 	else if (.@r < 110) { set getarg(0), RDMOPT_VAR_MATTPOWER; set getarg(1), rand(20,60); }
 	else if (.@r < 120) { set getarg(0), RDMOPT_VAR_MAGICATKPERCENT; set getarg(1), rand(3,15); }
 	else if (.@r < 130) { set getarg(0), RDMOPT_VAR_PLUSASPDPERCENT; set getarg(1), rand(3,10); }
-	.@r = rand(180); // No rates info
+	.@r = rand(180); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_PLUSASPD; set getarg(3), rand(1,2); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_VAR_AVOIDSUCCESSVALUE; set getarg(3), rand(5,45); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_MDAMAGE_SIZE_SMALL_TARGET; set getarg(3), rand(3,20); }
@@ -661,7 +664,7 @@ function	script	F_Lapine_EP17_1_SPC10	{
 }
 
 function	script	F_Lapine_Charleston_Parts_W	{
-	.@r = rand(2600); // NO rate info
+	.@r = rand(2600); //! TODO: Official Rates info
 	if (.@r < 100) {
 		.@option = RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET;
 		.@value = rand(1,20);
@@ -749,7 +752,7 @@ function	script	F_Lapine_Charleston_Parts_W	{
 }
 
 function	script	F_Lapine_Charleston_Parts_R	{
-	.@r = rand(2500); // NO rate info
+	.@r = rand(2500); //! TODO: Official Rates info
 	if (.@r < 100) {
 		.@option = RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET;
 		.@value = rand(1,20);
@@ -834,7 +837,7 @@ function	script	F_Lapine_Charleston_Parts_R	{
 }
 
 function	script	F_Lapine_Gray_Charcoal_Range	{
-	.@r = rand(150); // No rates info
+	.@r = rand(150); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(1,20); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(1,20); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(1,20); }
@@ -851,7 +854,7 @@ function	script	F_Lapine_Gray_Charcoal_Range	{
 	else if (.@r < 140) { set getarg(0), RDMOPT_RANGE_ATTACK_DAMAGE_TARGET; set getarg(1), rand(5,10); }
 	else if (.@r < 150) { set getarg(0), RDMOPT_WEAPON_INDESTRUCTIBLE; set getarg(1), 1; }
 
-	.@r = rand(140); // No rates info
+	.@r = rand(140); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(2), RDMOPT_RACE_DAMAGE_NOTHING; set getarg(3), rand(1,20); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_RACE_DAMAGE_UNDEAD; set getarg(3), rand(1,20); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_RACE_DAMAGE_ANIMAL; set getarg(3), rand(1,20); }
@@ -871,7 +874,7 @@ function	script	F_Lapine_Gray_Charcoal_Range	{
 }
 
 function	script	F_Lapine_Gray_Charcoal_Magic	{
-	.@r = rand(140); // No rates info
+	.@r = rand(140); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(1,20); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(1,20); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(1,20); }
@@ -887,7 +890,7 @@ function	script	F_Lapine_Gray_Charcoal_Magic	{
 	else if (.@r < 130) { set getarg(0), RDMOPT_DEC_SP_CONSUMPTION; set getarg(1), rand(5,10); }
 	else if (.@r < 140) { set getarg(0), RDMOPT_DEC_SPELL_DELAY_TIME; set getarg(1), rand(1,5); }
 
-	.@r = rand(140); // No rates info
+	.@r = rand(140); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(2), RDMOPT_RACE_MDAMAGE_NOTHING; set getarg(3), rand(1,20); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_RACE_MDAMAGE_UNDEAD; set getarg(3), rand(1,20); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_RACE_MDAMAGE_ANIMAL; set getarg(3), rand(1,20); }
@@ -907,7 +910,7 @@ function	script	F_Lapine_Gray_Charcoal_Magic	{
 }
 
 function	script	F_Lapine_Gray_Charcoal_Melee	{
-	.@r = rand(190); // No rates info
+	.@r = rand(190); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(1,20); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(1,20); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(1,20); }
@@ -928,7 +931,7 @@ function	script	F_Lapine_Gray_Charcoal_Melee	{
 	else if (.@r < 180) { set getarg(0), RDMOPT_BODY_ATTR_SAINT; set getarg(1), 1; }
 	else if (.@r < 190) { set getarg(0), RDMOPT_BODY_ATTR_DARKNESS; set getarg(1), 1; }
 
-	.@r = rand(150); // No rates info
+	.@r = rand(150); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(2), RDMOPT_RACE_DAMAGE_NOTHING; set getarg(3), rand(1,20); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_RACE_DAMAGE_UNDEAD; set getarg(3), rand(1,20); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_RACE_DAMAGE_ANIMAL; set getarg(3), rand(1,20); }
@@ -952,7 +955,7 @@ function	script	F_Lapine_Gray_Charcoal_Melee	{
 * Geffen Magic Scroll Accessory
 */
 function	script	F_Lapine_Geffen_Magic_Scroll2	{
-	.@r = rand(130); // No rates info
+	.@r = rand(130); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(0), RDMOPT_VAR_PLUSASPDPERCENT; set getarg(1), rand(3,5); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_DEC_SPELL_CAST_TIME; set getarg(1), rand(5,7); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_DAMAGE_CRI_TARGET; set getarg(1), rand(5,8); }
@@ -960,14 +963,14 @@ function	script	F_Lapine_Geffen_Magic_Scroll2	{
 	else if (.@r < 50)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_WATER_USER; set getarg(1), rand(3,5); }
 	else if (.@r < 60)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_WIND_USER; set getarg(1), rand(3,5); }
 	else if (.@r < 70)  { set getarg(0), RDMOPT_DAMAGE_PROPERTY_GROUND_USER; set getarg(1), rand(3,5); }
-	else if (.@r < 80)  { set getarg(0), RDMOPT_ATTR_TOLERACE_ALL; set getarg(1), rand(1,3); } // it's must be all elements except neutral: RDMOPT_ATTR_TOLERACE_ALLBUTNOTHING
+	else if (.@r < 80)  { set getarg(0), RDMOPT_ATTR_TOLERACE_ALL; set getarg(1), rand(1,3); } // FIXME: To all element except neutral. Change to RDMOPT_ATTR_TOLERACE_ALLBUTNOTHING after #3993
 	else if (.@r < 90)  { set getarg(0), RDMOPT_DEC_SP_CONSUMPTION; set getarg(1), rand(3,5); }
 	else if (.@r < 100) { set getarg(0), RDMOPT_VAR_MAXHPPERCENT; set getarg(1), rand(1,3); }
 	else if (.@r < 110) { set getarg(0), RDMOPT_VAR_MAXSPPERCENT; set getarg(1), rand(1,3); }
 	else if (.@r < 120) { set getarg(0), RDMOPT_VAR_ATKPERCENT; set getarg(1), rand(1,3); }
 	else if (.@r < 130) { set getarg(0), RDMOPT_VAR_MAGICATKPERCENT; set getarg(1), rand(1,3); }
 
-	.@r = rand(130); // No rates info
+	.@r = rand(130); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_PLUSASPDPERCENT; set getarg(3), rand(3,5); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_DEC_SPELL_CAST_TIME; set getarg(3), rand(5,7); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_DAMAGE_CRI_TARGET; set getarg(3), rand(5,8); }
@@ -975,7 +978,7 @@ function	script	F_Lapine_Geffen_Magic_Scroll2	{
 	else if (.@r < 50)  { set getarg(2), RDMOPT_DAMAGE_PROPERTY_WATER_USER; set getarg(3), rand(3,5); }
 	else if (.@r < 60)  { set getarg(2), RDMOPT_DAMAGE_PROPERTY_WIND_USER; set getarg(3), rand(3,5); }
 	else if (.@r < 70)  { set getarg(2), RDMOPT_DAMAGE_PROPERTY_GROUND_USER; set getarg(3), rand(3,5); }
-	else if (.@r < 80)  { set getarg(2), RDMOPT_ATTR_TOLERACE_ALL; set getarg(3), rand(1,3); } // it's must be all elements except neutral: RDMOPT_ATTR_TOLERACE_ALLBUTNOTHING
+	else if (.@r < 80)  { set getarg(2), RDMOPT_ATTR_TOLERACE_ALL; set getarg(3), rand(1,3); } // FIXME: To all element except neutral. Change to RDMOPT_ATTR_TOLERACE_ALLBUTNOTHING after #3993
 	else if (.@r < 90)  { set getarg(2), RDMOPT_DEC_SP_CONSUMPTION; set getarg(3), rand(3,5); }
 	else if (.@r < 100) { set getarg(2), RDMOPT_VAR_MAXHPPERCENT; set getarg(3), rand(1,3); }
 	else if (.@r < 110) { set getarg(2), RDMOPT_VAR_MAXSPPERCENT; set getarg(3), rand(1,3); }
@@ -989,7 +992,7 @@ function	script	F_Lapine_Geffen_Magic_Scroll2	{
 * Geffen Magic Scroll Armor
 */
 function	script	F_Lapine_Geffen_Magic_Scroll	{
-	.@r = rand(80); // No rates info
+	.@r = rand(80); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(0), RDMOPT_VAR_STRAMOUNT; set getarg(1), rand(1,4); }
 	else if (.@r < 20) { set getarg(0), RDMOPT_VAR_AGIAMOUNT; set getarg(1), rand(1,4); }
 	else if (.@r < 30) { set getarg(0), RDMOPT_VAR_VITAMOUNT; set getarg(1), rand(1,4); }
@@ -999,7 +1002,7 @@ function	script	F_Lapine_Geffen_Magic_Scroll	{
 	else if (.@r < 70) { set getarg(0), RDMOPT_VAR_MAXHPPERCENT; set getarg(1), rand(3,5); }
 	else if (.@r < 80) { set getarg(0), RDMOPT_VAR_MAXSPPERCENT; set getarg(1), rand(3,5); }
 
-	.@r = rand(150); // No rates info
+	.@r = rand(150); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_MAXHPAMOUNT; set getarg(3), rand(50,100); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_VAR_MAXSPAMOUNT; set getarg(3), rand(50,100); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_VAR_HITSUCCESSVALUE; set getarg(3), rand(15,30); }
@@ -1391,18 +1394,19 @@ function	script	F_Lapine_Gold_Statue	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3954806
 function	script	F_Lapine_Shadow_Refine_Hammer	{
-	.@r = rand(1000); // No rates info
-		 if (.@r < 20)  { set getarg(0), 1; return; }
-	else if (.@r < 30)  { set getarg(0), 2; return; }
-	else if (.@r < 80)  { set getarg(0), 3; return; }
-	else if (.@r < 700) { set getarg(0), 4; return; }
-	else if (.@r < 80)  { set getarg(0), 5; return; }
-	else if (.@r < 40)  { set getarg(0), 6; return; }
-	else if (.@r < 20)  { set getarg(0), 7; return; }
-	else if (.@r < 15)  { set getarg(0), 8; return; }
-	else if (.@r < 10)  { set getarg(0), 9; return; }
-	else                { set getarg(0), 10; return; }
+	.@r = rand(10000);
+		 if (.@r < 440)  { set getarg(0), 1; return; }
+	else if (.@r < 1319) { set getarg(0), 2; return; }
+	else if (.@r < 3022) { set getarg(0), 3; return; }
+	else if (.@r < 6538) { set getarg(0), 4; return; }
+	else if (.@r < 8296) { set getarg(0), 5; return; }
+	else if (.@r < 9175) { set getarg(0), 6; return; }
+	else if (.@r < 9615) { set getarg(0), 7; return; }
+	else if (.@r < 9835) { set getarg(0), 8; return; }
+	else if (.@r < 9945) { set getarg(0), 9; return; }
+	else                 { set getarg(0), 10; return; }
 	return;
 }
 
@@ -1411,8 +1415,9 @@ function	script	F_Lapine_Shadow_9_Refine_Hammer	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3964879
 function	script	F_Lapine_Magic_Cat_Hand	{
-	.@r = rand(160); // No rates info
+	.@r = rand(160);
 	if (.@r < 10)  { set getarg(0), RDMOPT_VAR_STRAMOUNT; set getarg(1), rand(1,7); }
 	if (.@r < 20)  { set getarg(0), RDMOPT_VAR_AGIAMOUNT; set getarg(1), rand(1,7); }
 	if (.@r < 30)  { set getarg(0), RDMOPT_VAR_VITAMOUNT; set getarg(1), rand(1,7); }
@@ -1430,7 +1435,7 @@ function	script	F_Lapine_Magic_Cat_Hand	{
 	if (.@r < 150) { set getarg(0), RDMOPT_VAR_AVOIDSUCCESSVALUE; set getarg(1), rand(5,20); }
 	if (.@r < 160) { set getarg(0), RDMOPT_DEC_SPELL_DELAY_TIME; set getarg(1), rand(5,10); }
 
-	.@r = rand(80); // No rates info
+	.@r = rand(80);
 	if (.@r < 10) { set getarg(2), RDMOPT_HEAL_VALUE; set getarg(3), rand(5,15); }
 	if (.@r < 20) { set getarg(2), RDMOPT_HEAL_MODIFY_PERCENT; set getarg(3), rand(5,15); }
 	if (.@r < 30) { set getarg(2), RDMOPT_VAR_ATKPERCENT; set getarg(3), rand(1,7); }
@@ -1443,17 +1448,18 @@ function	script	F_Lapine_Magic_Cat_Hand	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3999577
 function	script	F_Lapine_Candy_Pouch_Blessing_Scroll_W	{
-	.@r = rand(70); // No rates info
+	.@r = rand(70);
 		 if (.@r < 10)  { set getarg(0), RDMOPT_VAR_STRAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_VAR_AGIAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_VAR_VITAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 40)  { set getarg(0), RDMOPT_VAR_INTAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 50)  { set getarg(0), RDMOPT_VAR_DEXAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 60)  { set getarg(0), RDMOPT_VAR_LUKAMOUNT; set getarg(1), rand(1,3); }
-	else if (.@r < 70)  { set getarg(0), RDMOPT_DEC_SPELL_DELAY_TIME; set getarg(1), rand(1,5); }
+	else if (.@r < 70)  { set getarg(0), RDMOPT_DEC_SPELL_DELAY_TIME; set getarg(1), rand(1,3); }
 
-	.@r = rand(220); // No rates info
+	.@r = rand(220);
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_HITSUCCESSVALUE; set getarg(3), rand(1,15); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_VAR_AVOIDSUCCESSVALUE; set getarg(3), rand(1,20); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET; set getarg(3), rand(1,7); }
@@ -1480,17 +1486,18 @@ function	script	F_Lapine_Candy_Pouch_Blessing_Scroll_W	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3999578
 function	script	F_Lapine_Candy_Pouch_Blessing_Scroll_R	{
-	.@r = rand(70); // No rates info
+	.@r = rand(70);
 		 if (.@r < 10)  { set getarg(0), RDMOPT_VAR_STRAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_VAR_AGIAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_VAR_VITAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 40)  { set getarg(0), RDMOPT_VAR_INTAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 50)  { set getarg(0), RDMOPT_VAR_DEXAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 60)  { set getarg(0), RDMOPT_VAR_LUKAMOUNT; set getarg(1), rand(1,3); }
-	else if (.@r < 70)  { set getarg(0), RDMOPT_DEC_SPELL_DELAY_TIME; set getarg(1), rand(1,5); }
+	else if (.@r < 70)  { set getarg(0), RDMOPT_DEC_SPELL_DELAY_TIME; set getarg(1), rand(1,3); }
 
-	.@r = rand(220); // No rates info
+	.@r = rand(220);
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_HITSUCCESSVALUE; set getarg(3), rand(1,15); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_VAR_AVOIDSUCCESSVALUE; set getarg(3), rand(1,20); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET; set getarg(3), rand(1,7); }
@@ -1517,17 +1524,18 @@ function	script	F_Lapine_Candy_Pouch_Blessing_Scroll_R	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3999579
 function	script	F_Lapine_Candy_Pouch_Blessing_Scroll_M	{
-	.@r = rand(70); // No rates info
+	.@r = rand(70);
 		 if (.@r < 10)  { set getarg(0), RDMOPT_VAR_STRAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_VAR_AGIAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_VAR_VITAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 40)  { set getarg(0), RDMOPT_VAR_INTAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 50)  { set getarg(0), RDMOPT_VAR_DEXAMOUNT; set getarg(1), rand(1,3); }
 	else if (.@r < 60)  { set getarg(0), RDMOPT_VAR_LUKAMOUNT; set getarg(1), rand(1,3); }
-	else if (.@r < 70)  { set getarg(0), RDMOPT_DEC_SPELL_DELAY_TIME; set getarg(1), rand(1,5); }
+	else if (.@r < 70)  { set getarg(0), RDMOPT_DEC_SPELL_DELAY_TIME; set getarg(1), rand(1,3); }
 
-	.@r = rand(220); // No rates info
+	.@r = rand(220);
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_MDEFPOWER; set getarg(3), rand(1,15); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_VAR_AVOIDSUCCESSVALUE; set getarg(3), rand(1,20); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_MDAMAGE_PROPERTY_NOTHING_TARGET; set getarg(3), rand(1,7); }
@@ -1555,7 +1563,7 @@ function	script	F_Lapine_Candy_Pouch_Blessing_Scroll_M	{
 }
 
 function	script	F_Lapine_Grown_Gunslinger	{
-	.@r = rand(160); // No rates info
+	.@r = rand(160); //! TODO: Official Rates info
 		 if (.@r < 10)  { set getarg(0), RDMOPT_VAR_STRAMOUNT; set getarg(1), rand(1,7); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_VAR_AGIAMOUNT; set getarg(1), rand(1,7); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_VAR_VITAMOUNT; set getarg(1), rand(1,7); }
@@ -1573,7 +1581,7 @@ function	script	F_Lapine_Grown_Gunslinger	{
 	else if (.@r < 150) { set getarg(0), RDMOPT_VAR_AVOIDSUCCESSVALUE; set getarg(1), rand(5,20); }
 	else if (.@r < 160) { set getarg(0), RDMOPT_VAR_PLUSASPDPERCENT; set getarg(1), rand(5,10); }
 
-	.@r = rand(80); // No rates info
+	.@r = rand(80); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(2), RDMOPT_HEAL_VALUE; set getarg(3), rand(5,15); }
 	else if (.@r < 20) { set getarg(2), RDMOPT_HEAL_MODIFY_PERCENT; set getarg(3), rand(1,7); }
 	else if (.@r < 30) { set getarg(2), RDMOPT_VAR_ATKPERCENT; set getarg(3), rand(1,7); }
@@ -1586,9 +1594,10 @@ function	script	F_Lapine_Grown_Gunslinger	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3964871
 function	script	F_Lapine_Uniform_Repair_Kits	{
 	// Option:1
-	.@r = rand(90); // No rates info
+	.@r = rand(90);
 		 if (.@r < 10)  { set getarg(0), RDMOPT_BODY_ATTR_WATER; set getarg(1), rand(1,3); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_BODY_ATTR_GROUND; set getarg(1), rand(1,3); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_BODY_ATTR_FIRE; set getarg(1), rand(1,3); }
@@ -1599,7 +1608,7 @@ function	script	F_Lapine_Uniform_Repair_Kits	{
 	else if (.@r < 80)  { set getarg(0), RDMOPT_VAR_MDEFPOWER; set getarg(1), rand(5,15); }
 	else if (.@r < 90)  { set getarg(0), RDMOPT_BODY_INDESTRUCTIBLE; set getarg(1), 1; }
 
-	.@r = rand(220); // No rates info
+	.@r = rand(220);
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_STRAMOUNT; set getarg(3), rand(1,4); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_VAR_AGIAMOUNT; set getarg(3), rand(1,4); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_VAR_VITAMOUNT; set getarg(3), rand(1,4); }
@@ -1609,9 +1618,10 @@ function	script	F_Lapine_Uniform_Repair_Kits	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3964872
 function	script	F_Lapine_Magical_Booster_Enchant	{
 	// Option:1
-	.@r = rand(160); // No rates info
+	.@r = rand(160);
 		 if (.@r < 10)  { set getarg(0), RDMOPT_VAR_STRAMOUNT; set getarg(1), 1; }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_VAR_AGIAMOUNT; set getarg(1), 1; }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_VAR_VITAMOUNT; set getarg(1), 1; }
@@ -1629,7 +1639,7 @@ function	script	F_Lapine_Magical_Booster_Enchant	{
 	else if (.@r < 150) { set getarg(0), RDMOPT_VAR_AVOIDSUCCESSVALUE; set getarg(1), rand(5,20); }
 	else if (.@r < 160) { set getarg(0), RDMOPT_DEC_SPELL_DELAY_TIME; set getarg(1), rand(1,2); }
 	// Option:2
-	.@r = rand(140); // No rates info
+	.@r = rand(140);
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_STRAMOUNT; set getarg(3), 1; }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_VAR_AGIAMOUNT; set getarg(3), 1; }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_VAR_VITAMOUNT; set getarg(3), 1; }
@@ -1662,8 +1672,9 @@ function	script	F_Lapine_Metal_Rifine_Ticket	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3999572
 function	script	F_Lapine_Fan_Modification_Kits	{
-	.@r = rand(130); // No rates info
+	.@r = rand(130);
 		 if (.@r < 10)  { set getarg(0), RDMOPT_VAR_PLUSASPDPERCENT; set getarg(1), rand(3,5); }
 	else if (.@r < 20)  { set getarg(0), RDMOPT_DEC_SPELL_CAST_TIME; set getarg(1), rand(5,8); }
 	else if (.@r < 30)  { set getarg(0), RDMOPT_DAMAGE_CRI_TARGET; set getarg(1), rand(5,8); }
@@ -1671,13 +1682,13 @@ function	script	F_Lapine_Fan_Modification_Kits	{
 	else if (.@r < 50)  { set getarg(0), RDMOPT_ATTR_TOLERACE_GROUND; set getarg(1), rand(3,5); }
 	else if (.@r < 60)  { set getarg(0), RDMOPT_ATTR_TOLERACE_FIRE; set getarg(1), rand(3,5); }
 	else if (.@r < 70)  { set getarg(0), RDMOPT_ATTR_TOLERACE_WIND; set getarg(1), rand(3,5); }
-	else if (.@r < 80)  { set getarg(0), RDMOPT_ATTR_TOLERACE_ALL; set getarg(1), rand(1,3); } // To all element except neutral
+	else if (.@r < 80)  { set getarg(0), RDMOPT_ATTR_TOLERACE_ALL; set getarg(1), rand(1,3); } // FIXME: To all element except neutral. Change to RDMOPT_ATTR_TOLERACE_ALLBUTNOTHING after #3993
 	else if (.@r < 90)  { set getarg(0), RDMOPT_DEC_SP_CONSUMPTION; set getarg(1), rand(3,5); }
 	else if (.@r < 100) { set getarg(0), RDMOPT_VAR_MAXHPPERCENT; set getarg(1), rand(1,1); }
 	else if (.@r < 110) { set getarg(0), RDMOPT_VAR_MAXSPPERCENT; set getarg(1), rand(1,3); }
 	else if (.@r < 120) { set getarg(0), RDMOPT_VAR_ATKPERCENT; set getarg(1), rand(1,3); }
 	else if (.@r < 130) { set getarg(0), RDMOPT_VAR_MAGICATKPERCENT; set getarg(1), rand(1,3); }
-	.@r = rand(130); // No rates info
+	.@r = rand(130);
 		 if (.@r < 10)  { set getarg(2), RDMOPT_VAR_PLUSASPDPERCENT; set getarg(3), rand(3,5); }
 	else if (.@r < 20)  { set getarg(2), RDMOPT_DEC_SPELL_CAST_TIME; set getarg(3), rand(5,8); }
 	else if (.@r < 30)  { set getarg(2), RDMOPT_DAMAGE_CRI_TARGET; set getarg(3), rand(5,8); }
@@ -1685,7 +1696,7 @@ function	script	F_Lapine_Fan_Modification_Kits	{
 	else if (.@r < 50)  { set getarg(2), RDMOPT_ATTR_TOLERACE_GROUND; set getarg(3), rand(3,5); }
 	else if (.@r < 60)  { set getarg(2), RDMOPT_ATTR_TOLERACE_FIRE; set getarg(3), rand(3,5); }
 	else if (.@r < 70)  { set getarg(2), RDMOPT_ATTR_TOLERACE_WIND; set getarg(3), rand(3,5); }
-	else if (.@r < 80)  { set getarg(2), RDMOPT_ATTR_TOLERACE_ALL; set getarg(3), rand(1,3); } // To all element except neutral
+	else if (.@r < 80)  { set getarg(2), RDMOPT_ATTR_TOLERACE_ALL; set getarg(3), rand(1,3); } // FIXME: To all element except neutral. Change to RDMOPT_ATTR_TOLERACE_ALLBUTNOTHING after #3993
 	else if (.@r < 90)  { set getarg(2), RDMOPT_DEC_SP_CONSUMPTION; set getarg(3), rand(3,5); }
 	else if (.@r < 100) { set getarg(2), RDMOPT_VAR_MAXHPPERCENT; set getarg(3), rand(1,1); }
 	else if (.@r < 110) { set getarg(2), RDMOPT_VAR_MAXSPPERCENT; set getarg(3), rand(1,3); }
@@ -1694,9 +1705,10 @@ function	script	F_Lapine_Fan_Modification_Kits	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3955672
 function	script	F_Lapine_Class_Shadow_Pendant_Options	{
 	// Refine
-	.@r = rand(10000); // No rates info
+	.@r = rand(10000);
 		 if (.@r < 5005) { set getarg(0), 1; }
 	else if (.@r < 7507) { set getarg(0), 2; }
 	else if (.@r < 8758) { set getarg(0), 3; }
@@ -1718,9 +1730,10 @@ function	script	F_Lapine_Class_Shadow_Pendant_Options	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3955674
 function	script	F_Lapine_Class_Shadow_Earring_Options	{
 	// Refine
-	.@r = rand(10000); // No rates info
+	.@r = rand(10000);
 		 if (.@r < 5005) { set getarg(0), 1; }
 	else if (.@r < 7507) { set getarg(0), 2; }
 	else if (.@r < 8758) { set getarg(0), 3; }
@@ -1742,9 +1755,10 @@ function	script	F_Lapine_Class_Shadow_Earring_Options	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3955671
 function	script	F_Lapine_Class_Shadow_Shield_Options	{
 	// Refine
-	.@r = rand(10000); // No rates info
+	.@r = rand(10000);
 		 if (.@r < 5005) { set getarg(0), 1; }
 	else if (.@r < 7507) { set getarg(0), 2; }
 	else if (.@r < 8758) { set getarg(0), 3; }
@@ -1766,9 +1780,10 @@ function	script	F_Lapine_Class_Shadow_Shield_Options	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3955669
 function	script	F_Lapine_Class_Shadow_Shoes_Options	{
 	// Refine
-	.@r = rand(10000); // No rates info
+	.@r = rand(10000);
 		 if (.@r < 5005) { set getarg(0), 1; }
 	else if (.@r < 7507) { set getarg(0), 2; }
 	else if (.@r < 8758) { set getarg(0), 3; }
@@ -1790,9 +1805,10 @@ function	script	F_Lapine_Class_Shadow_Shoes_Options	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3955664
 function	script	F_Lapine_Class_Shadow_Armor_Options	{
 	// Refine
-	.@r = rand(10000); // No rates info
+	.@r = rand(10000);
 		 if (.@r < 5005) { set getarg(0), 1; }
 	else if (.@r < 7507) { set getarg(0), 2; }
 	else if (.@r < 8758) { set getarg(0), 3; }
@@ -1814,9 +1830,10 @@ function	script	F_Lapine_Class_Shadow_Armor_Options	{
 	return;
 }
 
+// http://ro.gnjoy.com/news/probability/View.asp?seq=3955662
 function	script	F_Lapine_Class_Shadow_Weapon_Options	{
 	// Refine
-	.@r = rand(10000); // No rates info
+	.@r = rand(10000);
 		 if (.@r < 5005) { set getarg(0), 1; }
 	else if (.@r < 7507) { set getarg(0), 2; }
 	else if (.@r < 8758) { set getarg(0), 3; }
@@ -1854,7 +1871,7 @@ function	script	F_Lapine_Grace_Refine_Ticket	{
 }
 
 function	script	F_Lapine_Imperial_Convert1	{
-	.@r = rand(100); // No rates info
+	.@r = rand(100); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(0), RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(1,5); return; }
 	else if (.@r < 20) { set getarg(0), RDMOPT_DAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(1,5); return; }
 	else if (.@r < 30) { set getarg(0), RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(1,5); return; }
@@ -1869,7 +1886,7 @@ function	script	F_Lapine_Imperial_Convert1	{
 }
 
 function	script	F_Lapine_Imperial_Convert2	{
-	.@r = rand(100); // No rates info
+	.@r = rand(100); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(1,5); return; }
 	else if (.@r < 20) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(1,5); return; }
 	else if (.@r < 30) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(1,5); return; }
@@ -1884,12 +1901,12 @@ function	script	F_Lapine_Imperial_Convert2	{
 }
 
 function	script	F_Lapine_Imperial_Convert3	{
-	.@r = rand(80); // No rates info
+	.@r = rand(80); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(0), RDMOPT_ATTR_TOLERACE_FIRE; set getarg(1), rand(1,5); return; }
 	else if (.@r < 20) { set getarg(0), RDMOPT_ATTR_TOLERACE_WIND; set getarg(1), rand(1,5); return; }
 	else if (.@r < 30) { set getarg(0), RDMOPT_ATTR_TOLERACE_GROUND; set getarg(1), rand(1,5); return; }
 	else if (.@r < 40) { set getarg(0), RDMOPT_ATTR_TOLERACE_WATER; set getarg(1), rand(1,5); return; }
-	else if (.@r < 50) { set getarg(0), RDMOPT_ATTR_TOLERACE_ALL; set getarg(1), rand(1,5); return; } // All elements except neutral
+	else if (.@r < 50) { set getarg(0), RDMOPT_ATTR_TOLERACE_ALL; set getarg(1), rand(1,5); return; } // FIXME: To all element except neutral. Change to RDMOPT_ATTR_TOLERACE_ALLBUTNOTHING after #3993
 	else if (.@r < 60) { set getarg(0), RDMOPT_DEC_SP_CONSUMPTION; set getarg(1), rand(1,5); return; }
 	else if (.@r < 70) { set getarg(0), RDMOPT_VAR_MAXHPPERCENT; set getarg(1), rand(1,5); return; }
 	else if (.@r < 80) { set getarg(0), RDMOPT_VAR_MAXSPPERCENT; set getarg(1), rand(1,5); return; }
@@ -1897,7 +1914,7 @@ function	script	F_Lapine_Imperial_Convert3	{
 }
 
 function	script	F_Lapine_Imperial_Convert4	{
-	.@r = rand(100); // No rates info
+	.@r = rand(100); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(1,5); return; }
 	else if (.@r < 20) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(1,5); return; }
 	else if (.@r < 30) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(1,5); return; }
@@ -1912,7 +1929,7 @@ function	script	F_Lapine_Imperial_Convert4	{
 }
 
 function	script	F_Lapine_Grace_Convert1	{
-	.@r = rand(100); // No rates info
+	.@r = rand(100); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(0), RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(1,5); }
 	else if (.@r < 20) { set getarg(0), RDMOPT_DAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(1,5); }
 	else if (.@r < 30) { set getarg(0), RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(1,5); }
@@ -1923,7 +1940,7 @@ function	script	F_Lapine_Grace_Convert1	{
 	else if (.@r < 80) { set getarg(0), RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET; set getarg(1), rand(1,5); }
 	else if (.@r < 90) { set getarg(0), RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET; set getarg(1), rand(1,5); }
 	else if (.@r < 100) { set getarg(0), RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET; set getarg(1), rand(1,5); }
-	.@r = rand(130); // No rates info
+	.@r = rand(130); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(2), RDMOPT_RACE_DAMAGE_NOTHING; set getarg(3), rand(1,5); }
 	else if (.@r < 20) { set getarg(2), RDMOPT_RACE_DAMAGE_UNDEAD; set getarg(3), rand(1,5); }
 	else if (.@r < 30) { set getarg(2), RDMOPT_RACE_DAMAGE_ANIMAL; set getarg(3), rand(1,5); }
@@ -1941,7 +1958,7 @@ function	script	F_Lapine_Grace_Convert1	{
 }
 
 function	script	F_Lapine_Grace_Convert2	{
-	.@r = rand(100); // No rates info
+	.@r = rand(100); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_NOTHING_TARGET; set getarg(1), rand(1,5); }
 	else if (.@r < 20) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_WATER_TARGET; set getarg(1), rand(1,5); }
 	else if (.@r < 30) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_GROUND_TARGET; set getarg(1), rand(1,5); }
@@ -1952,7 +1969,7 @@ function	script	F_Lapine_Grace_Convert2	{
 	else if (.@r < 80) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_DARKNESS_TARGET; set getarg(1), rand(1,5); }
 	else if (.@r < 90) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_TELEKINESIS_TARGET; set getarg(1), rand(1,5); }
 	else if (.@r < 100) { set getarg(0), RDMOPT_MDAMAGE_PROPERTY_UNDEAD_TARGET; set getarg(1), rand(1,5); }
-	.@r = rand(130); // No rates info
+	.@r = rand(130); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(2), RDMOPT_RACE_MDAMAGE_NOTHING; set getarg(3), rand(1,5); }
 	else if (.@r < 20) { set getarg(2), RDMOPT_RACE_MDAMAGE_UNDEAD; set getarg(3), rand(1,5); }
 	else if (.@r < 30) { set getarg(2), RDMOPT_RACE_MDAMAGE_ANIMAL; set getarg(3), rand(1,5); }
@@ -1970,16 +1987,16 @@ function	script	F_Lapine_Grace_Convert2	{
 }
 
 function	script	F_Lapine_Grace_Convert3	{
-	.@r = rand(80); // No rates info
+	.@r = rand(80); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(0), RDMOPT_ATTR_TOLERACE_WATER; set getarg(1), rand(1,5); }
 	else if (.@r < 20) { set getarg(0), RDMOPT_ATTR_TOLERACE_GROUND; set getarg(1), rand(1,5); }
 	else if (.@r < 30) { set getarg(0), RDMOPT_ATTR_TOLERACE_FIRE; set getarg(1), rand(1,5); }
 	else if (.@r < 40) { set getarg(0), RDMOPT_ATTR_TOLERACE_WIND; set getarg(1), rand(1,5); }
-	else if (.@r < 50) { set getarg(0), RDMOPT_ATTR_TOLERACE_ALL; set getarg(1), rand(1,5); }
+	else if (.@r < 50) { set getarg(0), RDMOPT_ATTR_TOLERACE_ALL; set getarg(1), rand(1,5); } // FIXME: To all element except neutral. Change to RDMOPT_ATTR_TOLERACE_ALLBUTNOTHING after #3993
 	else if (.@r < 60) { set getarg(0), RDMOPT_DEC_SP_CONSUMPTION; set getarg(1), rand(1,5); }
 	else if (.@r < 70) { set getarg(0), RDMOPT_VAR_MAXHPPERCENT; set getarg(1), rand(1,5); }
 	else if (.@r < 80) { set getarg(0), RDMOPT_VAR_MAXSPPERCENT; set getarg(1), rand(1,5); }
-	.@r = rand(130); // No rates info
+	.@r = rand(130); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(2), RDMOPT_DAMAGE_SIZE_SMALL_TARGET; set getarg(3), rand(1,5); }
 	else if (.@r < 20) { set getarg(2), RDMOPT_DAMAGE_SIZE_LARGE_TARGET; set getarg(3), rand(1,5); }
 	else if (.@r < 30) { set getarg(2), RDMOPT_DAMAGE_SIZE_MIDIUM_USER; set getarg(3), rand(1,5); }
@@ -1997,16 +2014,16 @@ function	script	F_Lapine_Grace_Convert3	{
 }
 
 function	script	F_Lapine_Grace_Convert4	{
-	.@r = rand(80); // No rates info
+	.@r = rand(80); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(0), RDMOPT_ATTR_TOLERACE_WATER; set getarg(1), rand(1,5); }
 	else if (.@r < 20) { set getarg(0), RDMOPT_ATTR_TOLERACE_GROUND; set getarg(1), rand(1,5); }
 	else if (.@r < 30) { set getarg(0), RDMOPT_ATTR_TOLERACE_FIRE; set getarg(1), rand(1,5); }
 	else if (.@r < 40) { set getarg(0), RDMOPT_ATTR_TOLERACE_WIND; set getarg(1), rand(1,5); }
-	else if (.@r < 50) { set getarg(0), RDMOPT_ATTR_TOLERACE_ALL; set getarg(1), rand(1,5); }
+	else if (.@r < 50) { set getarg(0), RDMOPT_ATTR_TOLERACE_ALL; set getarg(1), rand(1,5); } // FIXME: To all element except neutral. Change to RDMOPT_ATTR_TOLERACE_ALLBUTNOTHING after #3993
 	else if (.@r < 60) { set getarg(0), RDMOPT_DEC_SP_CONSUMPTION; set getarg(1), rand(1,5); }
 	else if (.@r < 70) { set getarg(0), RDMOPT_VAR_MAXHPPERCENT; set getarg(1), rand(1,5); }
 	else if (.@r < 80) { set getarg(0), RDMOPT_VAR_MAXSPPERCENT; set getarg(1), rand(1,5); }
-	.@r = rand(130); // No rates info
+	.@r = rand(130); //! TODO: Official Rates info
 		 if (.@r < 10) { set getarg(2), RDMOPT_MDAMAGE_SIZE_SMALL_TARGET; set getarg(3), rand(1,5); }
 	else if (.@r < 20) { set getarg(2), RDMOPT_MDAMAGE_SIZE_LARGE_TARGET; set getarg(3), rand(1,5); }
 	else if (.@r < 30) { set getarg(2), RDMOPT_MDAMAGE_SIZE_MIDIUM_USER; set getarg(3), rand(1,5); }
@@ -2025,7 +2042,7 @@ function	script	F_Lapine_Grace_Convert4	{
 
 function	script	F_Lapine_Shadow_Random_Mix	{
 	// Option:1
-	.@r = rand(200); // No rates info
+	.@r = rand(200); //! TODO: Official Rates info
 	if (.@r < 10)  { set getarg(0), RDMOPT_VAR_ATTPOWER; set getarg(1), rand(1,15); return; }
 	if (.@r < 20)  { set getarg(0), RDMOPT_VAR_ATTMPOWER; set getarg(1), rand(1,15); return; }
 	if (.@r < 30)  { set getarg(0), RDMOPT_VAR_ATKPERCENT; set getarg(1), rand(1,3); return; }
@@ -2049,32 +2066,32 @@ function	script	F_Lapine_Shadow_Random_Mix	{
 	return;
 }
 
-// TODO
+//! TODO
 function	script	F_Lapine_Ein_Ddbox	{
 	return;
 }
 
-// TODO
+//! TODO
 function	script	F_Lapine_Ein_Ddbox2	{
 	return;
 }
 
-// TODO
+//! TODO
 function	script	F_Lapine_Abyss_Ddbox	{
 	return;
 }
 
-// TODO
+//! TODO
 function	script	F_Lapine_Abyss_Ddbox2	{
 	return;
 }
 
-// TODO
+//! TODO
 function	script	F_Lapine_Abyss_Ddbox3	{
 	return;
 }
 
-// TODO
+//! TODO
 function	script	F_Lapine_Abyss_Ddbox4	{
 	return;
 }

+ 27 - 4
src/map/item_synthesis.cpp

@@ -58,12 +58,17 @@ uint64 ItemSynthesisDatabase::parseBodyNode(const YAML::Node &node) {
 			return 0;
 	}
 
+	if (exists && this->nodeExists(node, "ClearSourceItem")) {
+		ShowNotice("item_synthesis: Cleared all items in SourceItem. Synthesis ID: %d\n", id);
+		if (!entry->sources.empty())
+			entry->sources.clear();
+	}
+
 	if (this->nodeExists(node, "SourceItem")) {
 		const YAML::Node& sourceNode = node["SourceItem"];
 
-		if (!entry->sources.empty())
-			entry->sources.clear();
-		entry->sources.reserve(entry->source_needed);
+		if (!exists)
+			entry->sources.reserve(entry->source_needed);
 
 		for (const YAML::Node &source : sourceNode) {
 			s_item_synthesis_source source_item = {};
@@ -76,10 +81,28 @@ uint64 ItemSynthesisDatabase::parseBodyNode(const YAML::Node &node) {
 				continue;
 			}*/
 
+			if (exists && this->nodeExists(source, "Remove")) {
+				entry->sources.erase(std::remove_if(entry->sources.begin(), entry->sources.end(), [&source_item](const s_item_synthesis_source &x) { return x.nameid == source_item.nameid; }));
+				ShowNotice("item_synthesis: Removed '%d' from SourceItem. Synthesis ID: %d\n", source_item.nameid, id);
+				continue;
+			}
+
 			if (this->nodeExists(source, "Amount"))
 				this->asUInt16(source, "Amount", source_item.amount);
 
-			entry->sources.push_back(source_item);
+			if (entry->sources.end() == std::find_if(
+				entry->sources.begin(), entry->sources.end(), [&source_item](s_item_synthesis_source &x)
+			{
+				if (x.nameid == source_item.nameid) {
+					printf("changed %d from %d", x.nameid, x.amount);
+					x.amount = source_item.amount;
+					printf(" to %d\n", x.amount);
+					return true;
+				}
+				return false;
+			}
+			))
+				entry->sources.push_back(source_item);
 		}
 	}
 

+ 13 - 3
src/map/item_upgrade.cpp

@@ -61,13 +61,16 @@ uint64 ItemUpgradeDatabase::parseBodyNode(const YAML::Node &node) {
 		entry->result = code;
 	}
 
+	if (exists && this->nodeExists(node, "ClearTargetItem")) {
+		ShowNotice("item_upgrade: Cleared all items in TargetItem. Upgrade ID: %d\n", id);
+		if (!entry->targets.empty())
+			entry->targets.clear();
+	}
+
 	if (this->nodeExists(node, "TargetItem")) {
 		const YAML::Node& targetNode = node["TargetItem"];
 		unsigned int itemid;
 
-		if (!entry->targets.empty())
-			entry->targets.clear();
-
 		for (const YAML::Node &target : targetNode) {
 			if (!this->asUInt32(target, "Item", itemid))
 				continue;
@@ -76,6 +79,13 @@ uint64 ItemUpgradeDatabase::parseBodyNode(const YAML::Node &node) {
 				this->invalidWarning(target, "Unknown item with ID %u.\n", itemid);
 				continue;
 			}*/
+
+			if (exists && this->nodeExists(target, "Remove")) {
+				entry->targets.erase(std::remove_if(entry->targets.begin(), entry->targets.end(), [&itemid](const unsigned int &x) { return x == itemid; }));
+				ShowNotice("item_upgrade: Removed '%d' from TargetItem. Upgrade ID: %d\n", itemid, id);
+				continue;
+			}
+
 			entry->targets.push_back(itemid);
 		}
 	}

+ 2 - 0
src/map/itemdb.hpp

@@ -783,6 +783,8 @@ enum e_random_item_group {
 	IG_COSTUME_ENCHANT_STONE_BOX17,
 	IG_COSTUME_ENCHANT_STONE_BOX18,
 	IG_COSTUME_ENCHANT_STONE_BOX19,
+	IG_PERFECTSIZE_MIX,
+	IG_MAGICPIERCING_MIX,
 };
 
 /// Enum for bound/sell restricted selling

+ 2 - 0
src/map/script_constants.hpp

@@ -5031,6 +5031,8 @@
 	export_constant(IG_COSTUME_ENCHANT_STONE_BOX17);
 	export_constant(IG_COSTUME_ENCHANT_STONE_BOX18);
 	export_constant(IG_COSTUME_ENCHANT_STONE_BOX19);
+	export_constant(IG_PERFECTSIZE_MIX);
+	export_constant(IG_MAGICPIERCING_MIX);
 
 	/* unit stop walking */
 	export_constant(USW_NONE);