Browse Source

Merge remote-tracking branch 'upstream/master' into refactor/cmake

Vincent Stumpf 1 year ago
parent
commit
008d25cfb2

+ 4 - 0
conf/atcommands.yml

@@ -365,6 +365,10 @@ Body:
     Help: |
       Params: [<item type>]
       Throws all your possession on the ground. No type specified will drop all items.
+  - Command: stockall
+    Help: |
+      Params: [<item type>]
+      Transfer items from cart to your inventory. No type specified will transfer all items.
   - Command: storeall
     Help: |
       Puts all your possessions in storage.

+ 5 - 0
conf/msg_conf/map_msg.conf

@@ -1815,5 +1815,10 @@
 1531: Invalid position.
 1532: Invalid slot number.
 
+//@stockall
+1533: You do not have a cart.
+1534: Usage: @stockall {<type>}
+1535: %d items are transferred (%d skipped)!
+
 //Custom translations
 import: conf/msg_conf/import/map_msg_eng_conf.txt

+ 996 - 60
db/re/item_combos.yml

@@ -137,13 +137,15 @@ Body:
       bonus bMaxHPrate,-10;
   - Combos:
       - Combo:
-          - Durga
-          - Whikebain_Suit
+          - Durga    # 1287
+          - Whikebain_Suit    # 15123
+      - Combo:
+          - Durga    # 1287
+          - Whikebain_Suit_BR    # 15248
     Script: |
       if (getequiprefinerycnt(EQI_HAND_R) >= 7) {
-         autobonus "{ bonus bIgnoreDefClass,Class_Normal; }",1000,3000,BF_SHORT|BF_NORMAL;
+         autobonus "{ bonus bIgnoreDefClass,Class_Normal; }",70,3000,BF_WEAPON;
       }
-      /* Confirm: Success rate */
   - Combos:
       - Combo:
           - War_Axe_IL
@@ -10515,6 +10517,9 @@ Body:
       - Combo:
           - Shoes_Of_Punishment     # 22120
           - Holy_Stick     # 1631
+      - Combo:
+          - Shoes_Of_Punishment     # 22225
+          - Holy_Stick     # 1631
     Script: |
       .@r = getequiprefinerycnt(EQI_HAND_R);
       .@cast = -5*getskilllv("AB_ORATIO");
@@ -13953,25 +13958,54 @@ Body:
       }
   - Combos:
       - Combo:
-          - UnrivaledSpear
-          - UnrivaledRing
+          - UnrivaledSpear    # 1448
+          - UnrivaledRing    # 32234
+      - Combo:
+          - UnrivaledGun    # 13133
+          - UnrivaledRing    # 32234
+      - Combo:
+          - UnrivaledMace    # 16055
+          - UnrivaledRing    # 32234
+      - Combo:
+          - UnrivaledBow    # 18142
+          - UnrivaledRing    # 32234
+      - Combo:
+          - UnrivaledStaff    # 26102
+          - UnrivaledRing    # 32234
+      - Combo:
+          - UnrivaledDagger    # 28715
+          - UnrivaledRing    # 32234
     Script: |
       bonus2 bAddRace,RC_Brute,20;
+      bonus2 bAddRace,RC_Player_Doram,20;
       bonus2 bAddRace,RC_Plant,20;
       bonus2 bMagicAddRace,RC_Brute,20;
+      bonus2 bMagicAddRace,RC_Player_Doram,20;
       bonus2 bMagicAddRace,RC_Plant,20;
       bonus2 bAddEle,Ele_Wind,20;
       bonus2 bAddEle,Ele_Earth,20;
       bonus2 bMagicAddEle,Ele_Wind,20;
       bonus2 bMagicAddEle,Ele_Earth,20;
+  - Combos:
+      - Combo:
+          - Arrow    # 1750
+          - UnrivaledBow    # 18142
+    Script: |
+      bonus2 bAddRace,RC_Brute,15;
+      bonus2 bAddRace,RC_Player_Doram,15;
+      bonus2 bAddRace,RC_Plant,15;
+      bonus2 bAddEle,Ele_Wind,15;
+      bonus2 bAddEle,Ele_Earth,15;
   - Combos:
       - Combo:
           - Sky_Ground
           - UnrivaledRing
     Script: |
       bonus2 bAddRace,RC_Brute,15;
+      bonus2 bAddRace,RC_Player_Doram,15;
       bonus2 bAddRace,RC_Plant,15;
       bonus2 bMagicAddRace,RC_Brute,15;
+      bonus2 bMagicAddRace,RC_Player_Doram,15;
       bonus2 bMagicAddRace,RC_Plant,15;
       bonus2 bAddEle,Ele_Wind,15;
       bonus2 bAddEle,Ele_Earth,15;
@@ -14543,24 +14577,33 @@ Body:
       bonus bStr,4;
   - Combos:
       - Combo:
-          - Stripe_Hat
-          - MH_P89_OS
+          - Comp_Stripe_Hat    # 15965
+          - MH_P89_OS    # 18179
+      - Combo:
+          - MH_P89_OS    # 18179
+          - Stripe_Hat    # 400049
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus2 bSkillAtk,"WM_SEVERE_RAINSTORM_MELEE",10;
       bonus bLongAtkRate,3*(.@r_weapon/2);
   - Combos:
       - Combo:
-          - Stripe_Hat
-          - AC_B44_OS
+          - Comp_Stripe_Hat    # 15965
+          - AC_B44_OS    # 18180
+      - Combo:
+          - AC_B44_OS    # 18180
+          - Stripe_Hat    # 400049
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus bDelayrate,-10;
       bonus bLongAtkRate,3*(.@r_weapon/2);
   - Combos:
       - Combo:
-          - Stripe_Hat
-          - Boost_Lance_OS
+          - Comp_Stripe_Hat    # 15965
+          - Boost_Lance_OS    # 32019
+      - Combo:
+          - Boost_Lance_OS    # 32019
+          - Stripe_Hat    # 400049
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus bBaseAtk,30;
@@ -14588,24 +14631,33 @@ Body:
       }
   - Combos:
       - Combo:
-          - Large_Sorcerer_Crown
-          - Cannon_Rapier_OS
+          - Cannon_Rapier_OS    # 13493
+          - Comp_L_Sorcerer_Crown    # 15962
+      - Combo:
+          - Cannon_Rapier_OS    # 13493
+          - Large_Sorcerer_Crown    # 400054
     Script: |
       .@r = getequiprefinerycnt(EQI_HAND_R);
       bonus bMatk,30;
       bonus2 bSkillAtk,"WL_HELLINFERNO",4*(.@r/2);
   - Combos:
       - Combo:
-          - Large_Sorcerer_Crown
-          - Rutilus_Stick_OS
+          - Comp_L_Sorcerer_Crown    # 15962
+          - Rutilus_Stick_OS    # 26151
+      - Combo:
+          - Rutilus_Stick_OS    # 26151
+          - Large_Sorcerer_Crown    # 400054
     Script: |
       .@r = getequiprefinerycnt(EQI_HAND_R);
       bonus bMatk,30;
       bonus2 bSkillAtk,"WL_COMET",5*(.@r/2);
   - Combos:
       - Combo:
-          - Large_Sorcerer_Crown
-          - Kuroiro_OS
+          - Comp_L_Sorcerer_Crown    # 15962
+          - Kuroiro_OS    # 28755
+      - Combo:
+          - Kuroiro_OS    # 28755
+          - Large_Sorcerer_Crown    # 400054
     Script: |
       .@r = getequiprefinerycnt(EQI_HAND_R);
       bonus2 bMagicAtkEle,Ele_Fire,5;
@@ -15923,16 +15975,22 @@ Body:
       autobonus3 "{ bonus2 bSkillAtk,\"RL_FIRE_RAIN\",35; }",1000,60000,"RL_RICHS_COIN";
   - Combos:
       - Combo:
-          - Phantom_Cap
-          - Ultio_Spes_OS
+          - Comp_Phantom_Cap    # 15959
+          - Ultio_Spes_OS    # 16089
+      - Combo:
+          - Ultio_Spes_OS    # 16089
+          - Phantom_Cap    # 400044
     Script: |
       .@r = getequiprefinerycnt(EQI_HAND_R);
       bonus2 bMagicAtkEle,Ele_Holy,5;
       bonus bVariableCastrate,-3*(.@r/2);
   - Combos:
       - Combo:
-          - Phantom_Cap
-          - Rutilus_Stick_OS
+          - Comp_Phantom_Cap   # 15959
+          - Rutilus_Stick_OS   # 26151
+      - Combo:
+          - Rutilus_Stick_OS   # 26151
+          - Phantom_Cap    # 400044
     Script: |
       .@r = getequiprefinerycnt(EQI_HAND_R);
       bonus bMatk,30;
@@ -15940,8 +15998,11 @@ Body:
       bonus2 bSkillAtk,"SP_SWHOO",4*(.@r/2);
   - Combos:
       - Combo:
-          - Phantom_Cap
-          - ElectricFox_OS
+          - Comp_Phantom_Cap   # 15959
+          - ElectricFox_OS    # 26164
+      - Combo:
+          - ElectricFox_OS    # 26164
+          - Phantom_Cap    # 400044
     Script: |
       .@r = getequiprefinerycnt(EQI_HAND_R);
       bonus2 bSkillCooldown,"SU_CN_METEOR",-1000;
@@ -17748,8 +17809,11 @@ Body:
       bonus bVariableCastrate,-10;
   - Combos:
       - Combo:
-          - Clock_Casket_RD
-          - Beam_Claymore_OS
+          - Comp_Clock_Casket_RD    # 15961
+          - Beam_Claymore_OS    # 21047
+      - Combo:
+          - Beam_Claymore_OS    # 21047
+          - Clock_Casket_RD    # 400021
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus bCritical,10;
@@ -17757,88 +17821,121 @@ Body:
       bonus2 bMagicAddSize,Size_Large,4*(.@r_weapon/2);
   - Combos:
       - Combo:
-          - Clock_Casket_RD
-          - Meuchler_OS
+          - Comp_Clock_Casket_RD    # 15961
+          - Meuchler_OS    # 28038
+      - Combo:
+          - Meuchler_OS    # 28038
+          - Clock_Casket_RD    # 400021
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus bBaseAtk,30;
       bonus2 bSkillAtk,"GC_ROLLINGCUTTER",4*(.@r_weapon/2);
   - Combos:
       - Combo:
-          - Clock_Casket_RD
-          - Circuit_Board_OS
+          - Comp_Clock_Casket_RD    # 15961
+          - Circuit_Board_OS    # 28629
+      - Combo:
+          - Circuit_Board_OS    # 28629
+          - Clock_Casket_RD    # 400021
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus bBaseAtk,30;
       bonus2 bSkillAtk,"SJ_SOLARBURST",4*(.@r_weapon/2);
   - Combos:
       - Combo:
-          - Ignis_CapK
-          - Saphir_Hall_OS
+          - Comp_Ignis_CapK    # 15963
+          - Saphir_Hall_OS    # 16088
+      - Combo:
+          - Saphir_Hall_OS    # 16088
+          - Ignis_CapK    # 400022
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus bBaseAtk,30;
       bonus2 bSkillAtk,"GN_CARTCANNON",4*(.@r_weapon/2);
   - Combos:
       - Combo:
-          - Ignis_CapK
-          - Virtual_Bow_OS
+          - Comp_Ignis_CapK    # 15963
+          - Virtual_Bow_OS    # 18178
+      - Combo:
+          - Virtual_Bow_OS    # 18178
+          - Ignis_CapK    # 400022
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus2 bSkillCooldown,"RA_ARROWSTORM",-2500;
       bonus2 bWeaponDamageRate,W_BOW,7*(.@r_weapon/2);
   - Combos:
       - Combo:
-          - Ignis_CapK
-          - Blasti_OS
+          - Comp_Ignis_CapK    # 15963
+          - Blasti_OS    # 28136
+      - Combo:
+          - Blasti_OS    # 28136
+          - Ignis_CapK    # 400022
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus bMaxHPrate,5;
       bonus2 bSubSize,Size_Small,3*(.@r_weapon/2);
   - Combos:
       - Combo:
-          - Scorpio_Diadem_K
-          - Cannon_Rapier_OS
+          - Cannon_Rapier_OS    # 13493
+          - Comp_Scorpio_Diadem_K    # 15960
+      - Combo:
+          - Cannon_Rapier_OS    # 13493
+          - Scorpio_Diadem_K    # 400059
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus2 bMagicAtkEle,Ele_Holy,5;
       bonus2 bSkillAtk,"LG_RAYOFGENESIS",4*(.@r_weapon/2);
   - Combos:
       - Combo:
-          - Scorpio_Diadem_K
-          - Ultio_Spes_OS
+          - Comp_Scorpio_Diadem_K    # 15960
+          - Ultio_Spes_OS    # 16089
+      - Combo:
+          - Ultio_Spes_OS    # 16089
+          - Scorpio_Diadem_K    # 400059
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus2 bMagicAtkEle,Ele_Holy,5;
       bonus2 bSkillAtk,"AB_JUDEX",3*(.@r_weapon/2);
   - Combos:
       - Combo:
-          - Scorpio_Diadem_K
-          - Rutilus_Stick_OS
+          - Comp_Scorpio_Diadem_K    # 15960
+          - Rutilus_Stick_OS    # 26151
+      - Combo:
+          - Rutilus_Stick_OS    # 26151
+          - Scorpio_Diadem_K    # 400059
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus bMatk,30;
       bonus2 bSkillAtk,"SO_PSYCHIC_WAVE",3*(.@r_weapon/2);
   - Combos:
       - Combo:
-          - Sagittarius_DiademK
-          - Burning_Knuckle_OS
+          - Burning_Knuckle_OS    # 1862
+          - Comp_Sagi_DiademK    # 15964
+      - Combo:
+          - Burning_Knuckle_OS    # 1862
+          - Sagittarius_DiademK    # 400061
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus2 bSkillCooldown,"SR_RAMPAGEBLASTER",-1000;
       bonus bLongAtkRate,3*(.@r_weapon/2);
   - Combos:
       - Combo:
-          - Sagittarius_DiademK
-          - Saphir_Hall_OS
+          - Comp_Sagi_DiademK    # 15964
+          - Saphir_Hall_OS    # 16088
+      - Combo:
+          - Saphir_Hall_OS    # 16088
+          - Sagittarius_DiademK    # 400061
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus bVariableCastrate,-10;
       bonus2 bSkillAtk,"CR_ACIDDEMONSTRATION",3*(.@r_weapon/2);
   - Combos:
       - Combo:
-          - Sagittarius_DiademK
-          - HR_S55_OS
+          - Comp_Sagi_DiademK    # 15964
+          - HR_S55_OS    # 28253
+      - Combo:
+          - HR_S55_OS    # 28253
+          - Sagittarius_DiademK    # 400061
     Script: |
       .@r_weapon = getequiprefinerycnt(EQI_HAND_R);
       bonus bLongAtkRate,5;
@@ -26684,7 +26781,7 @@ Body:
           - Moaning_of_EvilSpirits    # 470112
           - Goddess_of_Abundance    # 311073
     Script: |
-      bonus2 bMagicAddRace,RC_Player_Human,50;
+      bonus2 bMagicAddRace,RC_Player_Doram,50;
   - Combos:
       - Combo:
           - Sealed_F_Bishop_Card_J    # 300334
@@ -26698,7 +26795,7 @@ Body:
           - Moaning_of_EvilSpirits    # 470112
           - Goddess_of_Abundance    # 311073
     Script: |
-      bonus2 bMagicAddRace,RC_Player_Human,20;
+      bonus2 bMagicAddRace,RC_Player_Doram,20;
   - Combos:
       - Combo:
           - Moaning_of_EvilSpirits    # 470112
@@ -29921,18 +30018,36 @@ Body:
       - Combo:
           - aegis_15948    # 15948
           - Orc_Hero_Card    # 4143
+      - Combo:
+          - aegis_15948    # 15948
+          - Sealed_Orc_Hero_Card    # 4492
+      - Combo:
+          - aegis_15949    # 15949
+          - Orc_Hero_Card    # 4143
+      - Combo:
+          - aegis_15949    # 15949
+          - Sealed_Orc_Hero_Card    # 4492
     Script: |
       bonus bBaseAtk,50;
       if (BaseLevel>=170)
          bonus bBaseAtk,50;
   - Combos:
       - Combo:
-          - aegis_15948    # 15948
+          - aegis_15950    # 15950
+          - Orc_Hero_Card    # 4143
+      - Combo:
+          - aegis_15950    # 15950
+          - Sealed_Orc_Hero_Card    # 4492
+      - Combo:
+          - aegis_15951    # 15951
+          - Orc_Hero_Card    # 4143
+      - Combo:
+          - aegis_15951    # 15951
           - Sealed_Orc_Hero_Card    # 4492
     Script: |
-      bonus bBaseAtk,50;
+      bonus bBaseAtk,30;
       if (BaseLevel>=170)
-         bonus bBaseAtk,50;
+         bonus bBaseAtk,30;
   - Combos:
       - Combo:
           - Temporal_Ring_TW    # 490030
@@ -38138,10 +38253,16 @@ Body:
       - Combo:
           - Dark_Lord_Card    # 4168
           - Destroy_World_Boots    # 470095
+      - Combo:
+          - Dark_Lord_Card    # 4168
+          - aegis_470245    # 470245
+      - Combo:
+          - Sealed_D_Lord_Card    # 4488
+          - aegis_470245    # 470245
     Script: |
       bonus bMatk,50;
       bonus2 bMagicAddClass,Class_Boss,30;
-      bonus3 bAutoSpellWhenHit,"WL_COMET",1,50;
+      bonus3 bAutoSpellWhenHit,"WL_COMET",1,30;
       autobonus "{ bonus bInt,30; bonus bMatkRate,20; }",50,10000,BF_MAGIC;
   - Combos:
       - Combo:
@@ -44121,20 +44242,20 @@ Body:
   - Combos:
       - Combo:
           - Illusion_Armor_A    # 15376
-          - aegis_420239    # 420239
+          - Adventure_Clover    # 420239
       - Combo:
           - Illusion_Armor_B    # 15377
-          - aegis_420239    # 420239
+          - Adventure_Clover    # 420239
     Script: |
       bonus bAtkRate,20;
       bonus bMatkRate,20;
       bonus2 bExpAddRace,RC_All,2;
   - Combos:
       - Combo:
-          - aegis_420239    # 420239
+          - Adventure_Clover    # 420239
           - Auto_Armor_A    # 450127
       - Combo:
-          - aegis_420239    # 420239
+          - Adventure_Clover    # 420239
           - Auto_Armor_B    # 450128
     Script: |
       bonus bAtkRate,20;
@@ -44142,10 +44263,10 @@ Body:
       bonus2 bExpAddRace,RC_All,3;
   - Combos:
       - Combo:
-          - aegis_420239    # 420239
+          - Adventure_Clover    # 420239
           - Gray_W_Suits    # 450177
       - Combo:
-          - aegis_420239    # 420239
+          - Adventure_Clover    # 420239
           - Gray_W_Robe    # 450178
     Script: |
       bonus bAtkRate,20;
@@ -47143,3 +47264,818 @@ Body:
             bonus4 bAutoSpellOnSkill,"NW_SPIRAL_SHOOTING","NW_WILD_FIRE",getskilllv("NW_WILD_FIRE"),1000;
          }
       }
+  - Combos:
+      - Combo:
+          - Hero    # 29509
+          - aegis_312300    # 312300
+    Script: |
+      bonus2 bSkillCooldown,"BO_ACIDIFIED_ZONE_FIRE",-200;
+      bonus2 bSkillCooldown,"BO_ACIDIFIED_ZONE_WATER",-200;
+      bonus2 bSkillCooldown,"BO_ACIDIFIED_ZONE_WIND",-200;
+      bonus2 bSkillCooldown,"BO_ACIDIFIED_ZONE_GROUND",-200;
+  - Combos:
+      - Combo:
+          - Hero    # 29509
+          - aegis_312691    # 312691
+    Script: |
+      bonus2 bSkillCooldown,"CD_PETITIO",-200;
+  - Combos:
+      - Combo:
+          - aegis_15981    # 15981
+          - aegis_27426    # 27426
+    Script: |
+      bonus bMatk,100;
+  - Combos:
+      - Combo:
+          - aegis_15981    # 15981
+          - aegis_27425    # 27425
+    Script: |
+      bonus bDelayrate,-15;
+  - Combos:
+      - Combo:
+          - aegis_15982    # 15982
+          - aegis_27423    # 27423
+    Script: |
+      bonus bHit,50;
+  - Combos:
+      - Combo:
+          - aegis_15982    # 15982
+          - aegis_27424    # 27424
+      - Combo:
+          - aegis_15983    # 15983
+          - aegis_27421    # 27421
+    Script: |
+      bonus bBaseAtk,80;
+  - Combos:
+      - Combo:
+          - aegis_15983    # 15983
+          - aegis_27422    # 27422
+    Script: |
+      bonus bCritical,30;
+      bonus bCritAtkRate,30;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - Vivatus_F_Axe    # 520009
+    Script: |
+      bonus2 bSkillAtk,"MT_AXE_STOMP",25;
+      bonus2 bSkillAtk,"MT_RUSH_QUAKE",25;
+      bonus2 bSubRace,RC_Player_Human,10;
+      bonus2 bSubRace,RC_Player_Doram,10;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - Vivatus_F_G_Spear    # 530014
+    Script: |
+      bonus2 bSkillAtk,"IG_OVERSLASH",25;
+      bonus2 bSkillAtk,"IG_GRAND_JUDGEMENT",25;
+      bonus2 bSkillAtk,"IG_SHIELD_SHOOTING",25;
+      bonus2 bSubRace,RC_Player_Human,10;
+      bonus2 bSubRace,RC_Player_Doram,10;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - Vivatus_F_Katar    # 610023
+    Script: |
+      bonus2 bSkillAtk,"SHC_IMPACT_CRATER",25;
+      bonus2 bSkillAtk,"SHC_SAVAGE_IMPACT",25;
+      bonus2 bSubRace,RC_Player_Human,40;
+      bonus2 bSubRace,RC_Player_Doram,40;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - Vivatus_F_C_Bow    # 700033
+    Script: |
+      bonus2 bSkillAtk,"ABC_CHAIN_REACTION_SHOT",25;
+      bonus2 bSkillAtk,"ABC_FRENZY_SHOT",25;
+      bonus2 bSubRace,RC_Player_Human,40;
+      bonus2 bSubRace,RC_Player_Doram,40;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - Vivatus_F_Violin    # 570019
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - Vivatus_F_C_Rope    # 580019
+    Script: |
+      bonus2 bSkillAtk,"TR_RHYTHMSHOOTING",25;
+      bonus2 bSkillAtk,"TR_ROSEBLOSSOM",25;
+      bonus2 bSubRace,RC_Player_Human,10;
+      bonus2 bSubRace,RC_Player_Doram,10;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - Vivatus_F_T_Staff    # 640021
+    Script: |
+      bonus2 bSkillAtk,"AG_CRIMSON_ARROW",25;
+      bonus2 bSkillAtk,"AG_FROZEN_SLASH",25;
+      bonus2 bSkillAtk,"AG_STORM_CANNON",25;
+      bonus2 bSkillAtk,"AG_ROCK_DOWN",25;
+      bonus2 bSubRace,RC_Player_Human,40;
+      bonus2 bSubRace,RC_Player_Doram,40;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - Vivatus_F_Knuckle    # 560020
+    Script: |
+      bonus2 bSkillAtk,"IQ_MASSIVE_F_BLASTER",25;
+      bonus2 bSkillAtk,"IQ_EXPOSION_BLASTER",25;
+      bonus2 bSubRace,RC_Player_Human,10;
+      bonus2 bSubRace,RC_Player_Doram,10;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - Vivatus_F_Ballista    # 700034
+    Script: |
+      bonus2 bSkillAtk,"WH_CRESCIVE_BOLT",25;
+      bonus2 bSkillAtk,"WH_GALESTORM",25;
+      bonus2 bSubRace,RC_Player_Human,40;
+      bonus2 bSubRace,RC_Player_Doram,40;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - Vivatus_F_M_Book    # 540024
+    Script: |
+      bonus2 bSkillAtk,"EM_CONFLAGRATION",25;
+      bonus2 bSkillAtk,"EM_DIAMOND_STORM",25;
+      bonus2 bSkillAtk,"EM_LIGHTNING_LAND",25;
+      bonus2 bSkillAtk,"EM_TERRA_DRIVE",25;
+      bonus2 bSkillAtk,"EM_VENOM_SWAMP",25;
+      bonus2 bSubRace,RC_Player_Human,10;
+      bonus2 bSubRace,RC_Player_Doram,10;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - Vivatus_F_Lance    # 630013
+    Script: |
+      bonus2 bSkillAtk,"DK_HACKANDSLASHER",25;
+      bonus2 bSkillAtk,"DK_MADNESS_CRUSHER",25;
+      bonus2 bSubRace,RC_Player_Human,40;
+      bonus2 bSubRace,RC_Player_Doram,40;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - Vivatus_F_Lapier    # 500028
+    Script: |
+      bonus2 bSkillAtk,"BO_ACIDIFIED_ZONE_FIRE",25;
+      bonus2 bSkillAtk,"BO_ACIDIFIED_ZONE_WATER",25;
+      bonus2 bSkillAtk,"BO_ACIDIFIED_ZONE_WIND",25;
+      bonus2 bSkillAtk,"BO_ACIDIFIED_ZONE_GROUND",25;
+      bonus2 bSubRace,RC_Player_Human,10;
+      bonus2 bSubRace,RC_Player_Doram,10;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - Vivatus_F_Wand    # 550029
+    Script: |
+      bonus2 bSkillAtk,"CD_ARBITRIUM",25;
+      bonus2 bSkillAtk,"CD_PNEUMATICUS_PROCELLA",25;
+      bonus2 bSkillAtk,"CD_FRAMEN",25;
+      bonus2 bSubRace,RC_Player_Human,10;
+      bonus2 bSubRace,RC_Player_Doram,10;
+  - Combos:
+      - Combo:
+          - EP18_Schulang_Card    # 300227
+          - Goddess_of_Abundance    # 311073
+    Script: |
+      bonus2 bFixedCastrate,"SO_VARETYR_SPEAR",-100;
+      bonus2 bMagicAtkEle,Ele_Wind,30;
+  - Combos:
+      - Combo:
+          - EP18_Demi_Freyja_Card    # 300228
+          - Goddess_of_Abundance    # 311073
+    Script: |
+      autobonus "{}",20,100,BF_MAGIC,"{ sc_start SC_INSPIRATION,10000,1; }";
+  - Combos:
+      - Combo:
+          - EP18_Burning_Fang_Card    # 300217
+          - Goddess_of_Abundance    # 311073
+    Script: |
+      bonus bMaxHPrate,10;
+      bonus bMaxSPrate,10;
+      bonus2 bSubEle,Ele_Earth,15;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - aegis_450286    # 450286
+    Script: |
+      bonus2 bAddSize,Size_All,30;
+      bonus2 bMagicAddSize,Size_All,30;
+  - Combos:
+      - Combo:
+          - Goddess_of_Abundance    # 311073
+          - aegis_420223    # 420223
+    Script: |
+      bonus2 bSubRace,RC_Player_Human,3;
+      bonus2 bSubRace,RC_Player_Doram,3;
+      bonus bNoCastCancel;
+  - Combos:
+      - Combo:
+          - Bakonawa_Tattoo    # 2910
+          - aegis_420129    # 420129
+    Script: |
+      skill "TF_DOUBLE",max(getskilllv("TF_DOUBLE"),3);
+      bonus bAtkRate,(readparam(bStr)+readparam(bLuk))/40;
+  - Combos:
+      - Combo:
+          - Buwaya_Tattoo    # 2907
+          - aegis_420129    # 420129
+    Script: |
+      bonus bFixedCast,-200;
+      bonus bMatkRate,(readparam(bInt)+readparam(bDex))/40;
+  - Combos:
+      - Combo:
+          - Bangungot_Tattoo    # 2911
+          - aegis_420129    # 420129
+    Script: |
+      bonus bMaxHPrate,7;
+      bonus bHealPower2,2*((readparam(bAgi)+readparam(bVit))/40);
+  - Combos:
+      - Combo:
+          - IA_Dress    # 15214
+          - IA_Choker    # 19286
+          - IA_Boots    # 22144
+    Script: |
+      .@a = getequiprefinerycnt(EQI_ARMOR);
+      .@b = getequiprefinerycnt(EQI_SHOES);
+      .@c = (getequiprefinerycnt(EQI_ARMOR)+getequiprefinerycnt(EQI_SHOES))/3;
+      bonus bBaseAtk,5+(.@a*2);
+      bonus bMatk,5+(.@a*2);
+      bonus bAspdRate,.@b;
+      bonus bVariableCastrate,-2*.@c;
+  - Combos:
+      - Combo:
+          - Arbitrator_Shawl_US    # 420246
+          - Platinum_Arbitrator    # 450257
+    Script: |
+      .@r = getequiprefinerycnt(EQI_ARMOR);
+      bonus bAtkRate,5;
+      bonus bPerfectHitAddRate,20;
+      if (.@r>=8) {
+         bonus bMaxHPrate,5;
+         bonus bMaxSPrate,5;
+      }
+      if (.@r>=9) {
+         bonus bAtkRate,10;
+         bonus bMaxHPrate,10;
+         bonus bMaxSPrate,10;
+      }
+      if (.@r>=10) {
+         bonus2 bSkillCooldown,"LG_CANNONSPEAR",-1500;
+         bonus2 bSkillAtk,"LG_CANNONSPEAR",30;
+      }
+      if (.@r>=11) {
+         bonus2 bSkillAtk,"LG_CANNONSPEAR",BaseLevel/2;
+         bonus2 bSkillAtk,"LG_BANISHINGPOINT",2*(BaseLevel/2);
+      }
+  - Combos:
+      - Combo:
+          - Lunar_E_Armor_LT    # 450263
+          - Eclipsedefmind_TW    # 490086
+    Script: |
+      bonus bSta,8;
+      bonus bWis,8;
+      bonus bFixedCast,-300;
+  - Combos:
+      - Combo:
+          - Marc_Card    # 4105
+          - Lunar_E_Armor_LT    # 450263
+    Script: |
+      if (getequiprefinerycnt(EQI_ARMOR)>=7) {
+         bonus bMaxHPrate,25;
+         bonus2 bAddSize,Size_All,15;
+         bonus2 bMagicAddSize,Size_All,15;
+         bonus2 bSubSize,Size_Medium,10;
+         bonus2 bSubSize,Size_Large,10;
+      }
+  - Combos:
+      - Combo:
+          - Garm_Card    # 4324
+          - Lunar_E_Armor_LT    # 450263
+    Script: |
+      if (getequiprefinerycnt(EQI_ARMOR)>=7) {
+         bonus bMaxHPrate,70;
+         bonus2 bAddSize,Size_All,25;
+         bonus2 bMagicAddSize,Size_All,25;
+         bonus2 bResEff,Eff_Freeze,10000;
+         bonus2 bSubSize,Size_Medium,15;
+         bonus2 bSubSize,Size_Large,15;
+      }
+  - Combos:
+      - Combo:
+          - Coyote_Card    # 27179
+          - aegis_470245    # 470245
+    Script: |
+      bonus bMatk,50;
+      bonus2 bMagicAddClass,Class_Boss,10;
+      bonus3 bAutoSpellWhenHit,"WL_COMET",1,10;
+  - Combos:
+      - Combo:
+          - aegis_490464    # 490464
+          - Up_Shiver_Katar_K    # 610008
+      - Combo:
+          - aegis_490465    # 490465
+          - Up_Shiver_Katar_K    # 610008
+    Script: |
+      bonus2 bAddRace,RC_All,8;
+      if (getequiprefinerycnt(EQI_HAND_R)>=11)
+         bonus2 bSkillAtk,"GC_CROSSIMPACT",(readparam(bStr)+readparam(bLuk))/12;
+  - Combos:
+      - Combo:
+          - aegis_490464    # 490464
+          - Up_Blade_Katar    # 610009
+      - Combo:
+          - aegis_490465    # 490465
+          - Up_Blade_Katar    # 610009
+    Script: |
+      bonus bShortAtkRate,8;
+      if (getequiprefinerycnt(EQI_HAND_R)>=11)
+         bonus2 bSkillAtk,"GC_ROLLINGCUTTER",(readparam(bStr)+readparam(bDex))/12;
+  - Combos:
+      - Combo:
+          - Manteau_Of_Guardsman    # 20942
+          - ShoesOfGuardsman    # 22142
+    Script: |
+      bonus2 bSubEle,Ele_Neutral,10;
+      bonus2 bSubRace,RC_Player_Doram,10;
+      bonus2 bResEff,Eff_Stone,10000;
+  - Combos:
+      - Combo:
+          - YSF01_Plate_J    # 15213
+          - YSF01_Manteau_J    # 20858
+          - YSF01_Greave_J    # 22143
+    Script: |
+      .@a = getequiprefinerycnt(EQI_ARMOR);
+      .@b = getequiprefinerycnt(EQI_GARMENT);
+      .@c = getequiprefinerycnt(EQI_SHOES);
+      bonus bDelayrate,-10;
+      bonus2 bSkillAtk,"LK_SPIRALPIERCE",50;
+      bonus2 bSkillAtk,"KN_SPEARBOOMERANG",100;
+      bonus2 bSkillAtk,"RK_HUNDREDSPEAR",50;
+      if (.@a >= 7 && .@b >= 7 && .@c >= 7) {
+         bonus bDelayrate,-20;
+         bonus2 bSkillAtk,"LK_SPIRALPIERCE",100;
+         bonus2 bSkillAtk,"KN_SPEARBOOMERANG",200;
+         bonus2 bSkillAtk,"RK_HUNDREDSPEAR",100;
+      }
+      if (.@a >= 9 && .@b >= 9 && .@c >= 9) {
+         bonus bDelayrate,-20;
+         bonus2 bSkillAtk,"LK_SPIRALPIERCE",100;
+         bonus2 bSkillAtk,"KN_SPEARBOOMERANG",200;
+         bonus2 bSkillAtk,"RK_HUNDREDSPEAR",100;
+      }
+  - Combos:
+      - Combo:
+          - Return_TW_1th_Armor    # 15211
+          - Return_TW_1th_Hat    # 19276
+    Script: |
+      if ((getequiprefinerycnt(EQI_HEAD_TOP)+getequiprefinerycnt(EQI_ARMOR)) >=18)
+         bonus bAspd,1;
+  - Combos:
+      - Combo:
+          - 60Lv_Suits    # 15220
+          - 60Lv_Hood    # 20867
+          - 60Lv_Sandal    # 22150
+          - 60Lv_Ring    # 28539
+    Script: |
+      bonus bBaseAtk,15;
+      bonus bMatk,15;
+      if ((getequiprefinerycnt(EQI_ARMOR)+getequiprefinerycnt(EQI_GARMENT)+getequiprefinerycnt(EQI_SHOES)) >=17) {
+         bonus bAspdRate,3;
+         bonus bVariableCastrate,-5;
+      }
+  - Combos:
+      - Combo:
+          - 70Lv_Armor    # 15221
+          - 70Lv_Manteau    # 20868
+          - 70Lv_Boots    # 22151
+          - 70Lv_Ring    # 28540
+    Script: |
+      bonus bBaseAtk,20;
+      if ((getequiprefinerycnt(EQI_ARMOR)+getequiprefinerycnt(EQI_GARMENT)+getequiprefinerycnt(EQI_SHOES)) >=21) {
+         bonus bAspdRate,5;
+         bonus bFixedCastrate,-5;
+      }
+  - Combos:
+      - Combo:
+          - 70Lv_Robe    # 15222
+          - 70Lv_Muffler    # 20869
+          - 70Lv_Shoes    # 22152
+          - 70Lv_Mring    # 28541
+    Script: |
+      bonus bMatk,20;
+      if ((getequiprefinerycnt(EQI_ARMOR)+getequiprefinerycnt(EQI_GARMENT)+getequiprefinerycnt(EQI_SHOES)) >=21) {
+         bonus bVariableCastrate,-5;
+         bonus bFixedCastrate,-5;
+      }
+  - Combos:
+      - Combo:
+          - 80Lv_Mail    # 15223
+          - 80Lv_Manteau    # 20870
+          - 80Lv_Greave    # 22153
+          - 80Lv_Aring    # 28542
+    Script: |
+      bonus bBaseAtk,25;
+      if ((getequiprefinerycnt(EQI_ARMOR)+getequiprefinerycnt(EQI_GARMENT)+getequiprefinerycnt(EQI_SHOES)) >=25) {
+         bonus bAspdRate,7;
+         bonus bCritAtkRate,2;
+         bonus bFixedCastrate,-10;
+      }
+  - Combos:
+      - Combo:
+          - 80Lv_Cloth    # 15224
+          - 80Lv_Cloak    # 20871
+          - 80Lv_Boots    # 22154
+          - 80Lv_Gloves    # 28543
+    Script: |
+      bonus bBaseAtk,25;
+      if ((getequiprefinerycnt(EQI_ARMOR)+getequiprefinerycnt(EQI_GARMENT)+getequiprefinerycnt(EQI_SHOES)) >=25) {
+         bonus bAspdRate,7;
+         bonus bLongAtkRate,2;
+         bonus bFixedCastrate,-10;
+      }
+  - Combos:
+      - Combo:
+          - 80Lv_Robe    # 15225
+          - 80Lv_Muffler    # 20872
+          - 80Lv_Shoes    # 22155
+          - 80Lv_Mring    # 28544
+    Script: |
+      bonus bMatk,25;
+      if ((getequiprefinerycnt(EQI_ARMOR)+getequiprefinerycnt(EQI_GARMENT)+getequiprefinerycnt(EQI_SHOES)) >=25) {
+         bonus bMatkRate,2;
+         bonus bVariableCastrate,-7;
+         bonus bFixedCastrate,-10;
+      }
+  - Combos:
+      - Combo:
+          - 80Lv_Dress    # 15226
+          - 80Lv_Cape    # 20873
+          - 80Lv_Sandal    # 22156
+          - 80Lv_Necklace    # 28545
+    Script: |
+      bonus bMatk,25;
+      if ((getequiprefinerycnt(EQI_ARMOR)+getequiprefinerycnt(EQI_GARMENT)+getequiprefinerycnt(EQI_SHOES)) >=25) {
+         bonus bHealPower,2;
+         bonus bVariableCastrate,-7;
+         bonus bFixedCastrate,-10;
+      }
+  - Combos:
+      - Combo:
+          - 90Lv_Mail    # 15227
+          - 90Lv_Manteau    # 20874
+          - 90Lv_Greave    # 22157
+          - 90Lv_Aring    # 28546
+    Script: |
+      bonus bBaseAtk,30;
+      if ((getequiprefinerycnt(EQI_ARMOR)+getequiprefinerycnt(EQI_GARMENT)+getequiprefinerycnt(EQI_SHOES)) >=27) {
+         bonus bAspdRate,10;
+         bonus bCritAtkRate,4;
+         bonus bFixedCastrate,-15;
+      }
+  - Combos:
+      - Combo:
+          - 90Lv_Cloth    # 15228
+          - 90Lv_Cloak    # 20875
+          - 90Lv_Boots    # 22158
+          - 90Lv_Gloves    # 28547
+    Script: |
+      bonus bBaseAtk,30;
+      if ((getequiprefinerycnt(EQI_ARMOR)+getequiprefinerycnt(EQI_GARMENT)+getequiprefinerycnt(EQI_SHOES)) >=27) {
+         bonus bAspdRate,10;
+         bonus bLongAtkRate,4;
+         bonus bFixedCastrate,-15;
+      }
+  - Combos:
+      - Combo:
+          - 90Lv_Robe    # 15229
+          - 90Lv_Muffler    # 20876
+          - 90Lv_Shoes    # 22159
+          - 90Lv_Mring    # 28548
+    Script: |
+      bonus bMatk,30;
+      if ((getequiprefinerycnt(EQI_ARMOR)+getequiprefinerycnt(EQI_GARMENT)+getequiprefinerycnt(EQI_SHOES)) >=27) {
+         bonus bMatkRate,4;
+         bonus bVariableCastrate,-10;
+         bonus bFixedCastrate,-15;
+      }
+  - Combos:
+      - Combo:
+          - 90Lv_Dress    # 15230
+          - 90Lv_Cape    # 20877
+          - 90Lv_Sandal    # 22160
+          - 90Lv_Necklace    # 28549
+    Script: |
+      bonus bMatk,30;
+      if ((getequiprefinerycnt(EQI_ARMOR)+getequiprefinerycnt(EQI_GARMENT)+getequiprefinerycnt(EQI_SHOES)) >=27) {
+         bonus bHealPower,4;
+         bonus bVariableCastrate,-10;
+         bonus bFixedCastrate,-15;
+      }
+  - Combos:
+      - Combo:
+          - aegis_311439    # 311439
+          - aegis_450309    # 450309
+    Script: |
+      bonus bFixedCastrate,-70;
+  - Combos:
+      - Combo:
+          - P_Amdarais_Card    # 4635
+          - aegis_410270    # 410270
+      - Combo:
+          - P_Amdarais_Card    # 4635
+          - aegis_410271    # 410271
+      - Combo:
+          - P_Amdarais_Card    # 4635
+          - aegis_410272    # 410272
+      - Combo:
+          - P_Amdarais_Card    # 4635
+          - aegis_410273    # 410273
+      - Combo:
+          - P_Amdarais_Card    # 4635
+          - aegis_410274    # 410274
+      - Combo:
+          - P_Amdarais_Card    # 4635
+          - aegis_410275    # 410275
+    Script: |
+      .@r = getequiprefinerycnt(EQI_ARMOR);
+      bonus bMaxHP,2500*(.@r/3);
+      bonus bMaxSP,2000*(.@r/3);
+      if (.@r>=6) {
+         bonus bSPrecovRate,30;
+         if (.@r>=9) {
+             bonus bVariableCastrate,-10;
+             if (.@r>=12) {
+                 bonus bDelayrate,-10;
+             }
+         }
+      }
+  - Combos:
+      - Combo:
+          - ROZ_Bijou_Hat_Str    # 400574
+          - aegis_410270    # 410270
+      - Combo:
+          - ROZ_Bijou_Hat_Agi    # 400575
+          - aegis_410271    # 410271
+      - Combo:
+          - ROZ_Bijou_Hat_Vit    # 400576
+          - aegis_410272    # 410272
+      - Combo:
+          - ROZ_Bijou_Hat_Int    # 400577
+          - aegis_410273    # 410273
+      - Combo:
+          - ROZ_Bijou_Hat_Dex    # 400578
+          - aegis_410274    # 410274
+      - Combo:
+          - ROZ_Bijou_Hat_Luk    # 400579
+          - aegis_410275    # 410275
+    Script: |
+      bonus bUseSPrate,-5;
+  - Combos:
+      - Combo:
+          - Doram_Only_Suit_J    # 15275
+          - Doram_Only_Cape_J    # 20915
+          - Doram_Only_Shoes_J    # 22185
+    Script: |
+      bonus bSpeedRate,25;
+      bonus2 bHPRegenRate,500,5000;
+      bonus2 bSPRegenRate,5,5000;
+  - Combos:
+      - Combo:
+          - Doram_High_Suit_J    # 15276
+          - Doram_High_Cape_J    # 20916
+          - Doram_High_Shoes_J    # 22186
+    Script: |
+      bonus bSpeedRate,25;
+      bonus2 bHPRegenRate,1000,5000;
+      bonus2 bSPRegenRate,10,5000;
+  - Combos:
+      - Combo:
+          - Mad_Bunny_K    # 28901
+          - Giant_Mad_Bunny_TW    # 480372
+      - Combo:
+          - Mad_Bunny_K_    # 28902
+          - Giant_Mad_Bunny_TW    # 480372
+    Script: |
+      bonus2 bAddClass,Class_Boss,10;
+      bonus2 bMagicAddClass,Class_Boss,10;
+      autobonus "{ .@r = getequiprefinerycnt(EQI_GARMENT); .@a = getequiprefinerycnt(EQI_HAND_L); bonus bBaseAtk,20*((.@r+.@a)/2); bonus bMatk,20*((.@r+.@a)/2); }",10,7000,BF_WEAPON|BF_MAGIC,"{ transform 1947,7000; }";
+  - Combos:
+      - Combo:
+          - Mad_Bunny_K_LT    # 460020
+          - Giant_Mad_Bunny_TW    # 480372
+    Script: |
+      .@g = getenchantgrade(EQI_HAND_L);
+      .@val = 10;
+      bonus2 bAddClass,Class_Boss,15;
+      bonus2 bMagicAddClass,Class_Boss,15;
+      if (.@g >= ENCHANTGRADE_B) {
+         .@val += 10;
+      }
+      if (.@g >= ENCHANTGRADE_A) {
+         .@val += 10;
+      }
+      autobonus "{ .@r = getequiprefinerycnt(EQI_GARMENT); .@a = getequiprefinerycnt(EQI_HAND_L); bonus bBaseAtk,30*((.@r+.@a)/3); bonus bMatk,30*((.@r+.@a)/3); bonus2 bAddClass,Class_Boss,2*((.@r+.@a)/3); bonus2 bMagicAddClass,Class_Boss,2*((.@r+.@a)/3); }",.@val,7000,BF_WEAPON|BF_MAGIC,"{ transform 1947,7000; }";
+  - Combos:
+      - Combo:
+          - Bloody_Knight_Shield    # 28942
+          - aegis_470247    # 470247
+      - Combo:
+          - Bloody_Knight_Shield_    # 28945
+          - aegis_470247    # 470247
+    Script: |
+      bonus2 bAddClass,Class_Boss,15;
+      bonus2 bMagicAddClass,Class_Boss,15;
+      if (getequiprefinerycnt(EQI_SHOES)>=13)
+         autobonus "{ bonus bStr,150; bonus bInt,150; bonus bDex,150; }",50,10000,BF_WEAPON|BF_MAGIC;
+  - Combos:
+      - Combo:
+          - Bloody_Knight_Shield__    # 28946
+          - aegis_470247    # 470247
+    Script: |
+      bonus2 bAddClass,Class_Boss,30;
+      bonus2 bMagicAddClass,Class_Boss,30;
+      if (getequiprefinerycnt(EQI_SHOES)>=13)
+         autobonus "{ bonus bStr,200; bonus bInt,200; bonus bDex,200; }",50,10000,BF_WEAPON|BF_MAGIC;
+  - Combos:
+      - Combo:
+          - aegis_490469    # 490469
+          - Up_OneSkyOneSun    # 540010
+      - Combo:
+          - aegis_490470    # 490470
+          - Up_OneSkyOneSun    # 540010
+    Script: |
+      bonus bShortAtkRate,8;
+      if (getequiprefinerycnt(EQI_HAND_R)>=11)
+         bonus2 bSkillAtk,"SJ_SOLARBURST",(readparam(bStr)+readparam(bLuk))/12;
+  - Combos:
+      - Combo:
+          - aegis_490469    # 490469
+          - Up_SoulWeight    # 550015
+      - Combo:
+          - aegis_490470    # 490470
+          - Up_SoulWeight    # 550015
+    Script: |
+      bonus2 bMagicAddRace,RC_All,8;
+      if (getequiprefinerycnt(EQI_HAND_R)>=11)
+         bonus2 bSkillAtk,"SP_SPA",(readparam(bAgi)+readparam(bInt))/12;
+  - Combos:
+      - Combo:
+          - Crow_Tengu_Mask    # 5933
+          - Comp_Tengu_Scroll    # 420247
+      - Combo:
+          - Comp_Crow_Tengu_Mask    # 410269
+          - Comp_Tengu_Scroll    # 420247
+    Script: |
+      bonus2 bAddSize,Size_All,1;
+      bonus bLongAtkRate,2;
+      if (readparam(bStr) >= 108) {
+         bonus2 bAddSize,Size_All,2;
+         bonus bLongAtkRate,1;
+      }
+      if (readparam(bStr) >= 120) {
+         bonus2 bAddSize,Size_All,3;
+         bonus bLongAtkRate,1;
+      }
+  - Combos:
+      - Combo:
+          - aegis_400512    # 400512
+          - aegis_420248    # 420248
+      - Combo:
+          - aegis_400513    # 400513
+          - aegis_420248    # 420248
+      - Combo:
+          - aegis_400512    # 400512
+          - aegis_420249    # 420249
+      - Combo:
+          - aegis_400513    # 400513
+          - aegis_420249    # 420249
+    Script: |
+      bonus2 bDropAddRace,RC_All,getequiprefinerycnt(EQI_HEAD_TOP);
+  - Combos:
+      - Combo:
+          - aegis_400512    # 400512
+          - aegis_490282    # 490282
+      - Combo:
+          - aegis_400512    # 400512
+          - aegis_490283    # 490283
+      - Combo:
+          - aegis_400513    # 400513
+          - aegis_490282    # 490282
+      - Combo:
+          - aegis_400513    # 400513
+          - aegis_490283    # 490283
+    Script: |
+      bonus2 bSkillAtk,"KN_BOWLINGBASH",50;
+      bonus bNoWalkDelay;
+  - Combos:
+      - Combo:
+          - Tablet_IL    # 28626
+          - aegis_420251    # 420251
+    Script: |
+      .@r = getequiprefinerycnt(EQI_HAND_R);
+      bonus bHit,30;
+      bonus bAspd,1;
+      bonus2 bSkillAtk,"SJ_FLASHKICK",5*(.@r/3);
+      bonus2 bSkillAtk,"SJ_FALLINGSTAR",5*(.@r/3);
+  - Combos:
+      - Combo:
+          - Hunter_Bow_IL    # 18174
+          - aegis_420251    # 420251
+    Script: |
+      .@r = getequiprefinerycnt(EQI_HAND_R);
+      bonus bCriticalLong,30;
+      if (.@r>=7) {
+         bonus bCritAtkRate,10;
+         bonus2 bSkillCooldown,"RA_AIMEDBOLT",-1000;
+         if (.@r>=9) {
+             bonus2 bSkillAtk,"SN_SHARPSHOOTING",35;
+             bonus2 bSkillAtk,"RA_AIMEDBOLT",35;
+             if (.@r>=11) {
+                 bonus bDelayrate,-10;
+             }
+         }
+      }
+  - Combos:
+      - Combo:
+          - Lunar_E_Armor_LT    # 450263
+          - Eclipsedefmind_LT    # 490440
+    Script: |
+      bonus bSta,8;
+      bonus bWis,8;
+      bonus bFixedCast,-300;
+      bonus bLongAtkDef,8;
+      bonus bNearAtkDef,8;
+      if (getenchantgrade(EQI_ARMOR) >= ENCHANTGRADE_A) {
+         bonus2 bAddRace,RC_All,15;
+         bonus2 bMagicAddRace,RC_All,15;
+         bonus2 bAddEffWhenHit,Eff_Freeze,1000;
+      }
+  - Combos:
+      - Combo:
+          - S_Wolf_Card_E    # 27390
+          - S_Poe_Card_E    # 27392
+    Script: |
+      bonus bAtkRate,5;
+      bonus bMatkRate,5;
+      bonus2 bAddSize,Size_Medium,5;
+      bonus2 bMagicAddSize,Size_Medium,5;
+  - Combos:
+      - Combo:
+          - Release_Of_Magic    # 29371
+          - aegis_312303    # 312303
+    Script: |
+      bonus2 bSkillCooldown,"EM_CONFLAGRATION",-2000;
+      bonus2 bSkillCooldown,"EM_LIGHTNING_LAND",-2000;
+  - Combos:
+      - Combo:
+          - Hero    # 29509
+          - aegis_312034    # 312034
+    Script: |
+      autobonus "{ bonus2 bSkillUseSP,\"IQ_MASSIVE_F_BLASTER\",299; bonus2 bSkillUseSP,\"IQ_EXPOSION_BLASTER\",169; }",20,10000,BF_WEAPON;
+  - Combos:
+      - Combo:
+          - Hero    # 29509
+          - aegis_312033    # 312033
+    Script: |
+      bonus2 bSkillCooldown,"ABC_ABYSS_DAGGER",-200;
+      bonus2 bSkillCooldown,"ABC_DEFT_STAB",-200;
+  - Combos:
+      - Combo:
+          - Release_Of_Magic    # 29371
+          - aegis_312035    # 312035
+    Script: |
+      bonus2 bSkillCooldown,"IG_CROSS_RAIN",-1000;
+  - Combos:
+      - Combo:
+          - Hero    # 29509
+          - aegis_312036    # 312036
+    Script: |
+      bonus2 bSkillCooldown,"WH_CRESCIVE_BOLT",-200;
+      bonus2 bSkillCooldown,"WH_GALESTORM",-200;
+  - Combos:
+      - Combo:
+          - Hero    # 29509
+          - aegis_312039    # 312039
+    Script: |
+      bonus2 bSkillCooldown,"SHC_SHADOW_STAB",-500;
+  - Combos:
+      - Combo:
+          - aegis_15969    # 15969
+          - Improve_Orb_Speed    # 29537
+    Script: |
+      bonus bLongAtkRate,4;
+      bonus bShortAtkRate,4;
+      bonus bMatkRate,4;
+  - Combos:
+      - Combo:
+          - aegis_15969    # 15969
+          - Improve_Orb_Cast    # 29538
+    Script: |
+      bonus2 bMagicAddRace,RC_All,6;
+  - Combos:
+      - Combo:
+          - aegis_15969    # 15969
+          - Improve_Orb_Cri    # 29539
+    Script: |
+      bonus2 bAddRace,RC_All,6;

File diff suppressed because it is too large
+ 964 - 14
db/re/item_db_equip.yml


+ 1073 - 30
db/re/item_db_etc.yml

@@ -40182,7 +40182,7 @@ Body:
       DropEffect: CLIENT
     Script: |
       bonus2 bSubClass,Class_Normal,40;
-      bonus2 bSubClass,Class_Boss,40;
+      bonus2 bSubClass,Class_Boss,-40;
   - Id: 27196
     AegisName: S_Nihil_Card
     Name: Nihil M. Heine Card
@@ -42018,6 +42018,20 @@ Body:
       bonus2 bSkillAtk,"SU_CN_METEOR",5+.@r;
       if (.@r>=10)
          bonus2 bSkillAtk,"SU_CN_METEOR",5;
+  - Id: 27368
+    AegisName: Colorful_T_Bear_Card_J
+    Name: Colorful Teddy Bear Card
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Both_Accessory: true
+    Flags:
+      DropEffect: CLIENT
+    Script: |
+      bonus bInt,5;
+      if (readparam(bInt)>=125)
+         bonus bMatkRate,4;
   - Id: 27369
     AegisName: Shining_T_Bear_Card_J
     Name: Shiny Teddy Bear Card
@@ -42033,6 +42047,22 @@ Body:
       bonus bMaxSPrate,-50;
       bonus2 bAddRace,RC_Demon,50;
       bonus2 bAddRace,RC_Undead,50;
+  - Id: 27370
+    AegisName: Pitman_Worker_Card_J
+    Name: Hardworking Pitman Card
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Head_Top: true
+      Head_Mid: true
+      Head_Low: true
+    Flags:
+      DropEffect: CLIENT
+    Script: |
+      bonus2 bAddEle,Ele_Neutral,30;
+      bonus2 bMagicAddEle,Ele_Neutral,30;
+      bonus2 bIgnoreDefRaceRate,RC_Formless,30;
   - Id: 27371
     AegisName: Fragment_Of_Soul_Card_J
     Name: Soul Fragment Card
@@ -42048,6 +42078,71 @@ Body:
       bonus bMaxSPrate,10;
       bonus2 bSkillAtk,"RA_AIMEDBOLT",50;
       bonus2 bSkillAtk,"SN_SHARPSHOOTING",50;
+  - Id: 27372
+    AegisName: Sinister_Obsidian_Card_
+    Name: Evil Obsidian Card
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Both_Accessory: true
+    Flags:
+      DropEffect: CLIENT
+    Script: |
+      bonus bBaseAtk,10;
+      bonus bPerfectHitAddRate,5;
+  - Id: 27373
+    AegisName: Ancient_Trijoint_Card_J
+    Name: Ancient Tri Joint Card
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Head_Top: true
+      Head_Mid: true
+      Head_Low: true
+    Flags:
+      DropEffect: CLIENT
+    Script: |
+      bonus3 bAutoSpell,"TF_STEAL",5,200;
+  - Id: 27374
+    AegisName: Anc_Sta_Golem_Card_J
+    Name: Ancient Stalactic Golem Card
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Both_Accessory: true
+    Flags:
+      DropEffect: CLIENT
+    Script: |
+      bonus bAtkRate,3;
+      bonus bHPGainValue,50;
+      bonus bSPGainValue,5;
+  - Id: 27375
+    AegisName: Anc_Megalith_Card_J
+    Name: Ancient Megalith Card
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Garment: true
+    Flags:
+      DropEffect: CLIENT
+    Script: |
+      .@a = (readparam(bVit)/10);
+      .@b = (readparam(bLuk)/10);
+      bonus bBaseAtk,((3*.@a)+(3*.@b));
+      bonus bHit,5*.@a;
+      bonus bAspdRate,.@b;
+      if (readparam(bVit)>=125) {
+         bonus bBaseAtk,50;
+         bonus bHit,25;
+      }
+      if (readparam(bLuk)>=125) {
+         bonus bBaseAtk,50;
+         bonus bAspdRate,5;
+      }
   - Id: 27376
     AegisName: Anc_Tao_Gunka_Card_J
     Name: Ancient Tao Gunka Card
@@ -42065,6 +42160,59 @@ Body:
       bonus bMdef,-50;
       if (.@r>=9)
          bonus2 bResEff,Eff_Freeze,10000;
+  - Id: 27377
+    AegisName: Anc_S_Shooter_Card_J
+    Name: Ancient Stone Shooter Card
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Head_Top: true
+      Head_Mid: true
+      Head_Low: true
+    Flags:
+      DropEffect: CLIENT
+    Script: |
+      bonus bMaxSP,20*(readparam(bStr)/10);
+      if (readparam(bStr)>=125)
+         bonus bAtkRate,5;
+  - Id: 27378
+    AegisName: Anc_W_Shooter_Card_J
+    Name: Ancient Wootan Shooter Card
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Garment: true
+    Flags:
+      DropEffect: CLIENT
+    Script: |
+      .@a = (readparam(bVit)/10);
+      .@b = (readparam(bLuk)/10);
+      bonus bMatk,((3*.@a)+(3*.@b));
+      bonus bDef,10*.@a;
+      bonus bAspdRate,.@b;
+      if (readparam(bVit)>=125) {
+         bonus bMatk,50;
+         bonus bDef,50;
+      }
+      if (readparam(bLuk)>=125) {
+         bonus bMatk,50;
+         bonus bAspdRate,5;
+      }
+  - Id: 27379
+    AegisName: Anc_W_Fighter_Card_J
+    Name: Ancient Wootan Fighter Card
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Right_Hand: true
+    Flags:
+      DropEffect: CLIENT
+    Script: |
+      bonus bAtkRate,10;
+      skill "SA_SEISMICWEAPON",1;
   - Id: 27380
     AegisName: Anc_W_Deffend_Card_J
     Name: Ancient Wootan Defender Card
@@ -42176,6 +42324,57 @@ Body:
       DropEffect: CLIENT
     Script: |
       bonus bHPrecovRate,50;  /* note: 30% from the description */
+  - Id: 27389
+    AegisName: Wolf_Card_EV
+    Name: Wolfe Card
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Both_Accessory: true
+    Flags:
+      DropEffect: CLIENT
+    Script: |
+      skill "RG_COMPULSION",5;
+  - Id: 27390
+    AegisName: S_Wolf_Card_E
+    Name: Wolfe Lugenburg Card
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Right_Hand: true
+    Flags:
+      DropEffect: CLIENT
+    Script: |
+      bonus2 bAddRace,RC_Insect,15;
+      bonus2 bMagicAddRace,RC_Insect,15;
+  - Id: 27391
+    AegisName: Poe_Card_E
+    Name: Poe Card
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Armor: true
+    Flags:
+      DropEffect: CLIENT
+    Script: |
+      bonus bBaseAtk,150;
+      /*Todo: When hit by a physical attack There is a chance that player will die - Refine will reduce the chance*/
+  - Id: 27392
+    AegisName: S_Poe_Card_E
+    Name: Poe Richard Card
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Right_Hand: true
+    Flags:
+      DropEffect: CLIENT
+    Script: |
+      bonus2 bAddRace,RC_Plant,15;
+      bonus2 bMagicAddRace,RC_Plant,15;
   - Id: 27393
     AegisName: Kathryn_Card
     Name: Kathryn Card
@@ -42374,6 +42573,114 @@ Body:
     Script: |
       bonus bAtkRate,3;
       bonus bMatkRate,3;
+  - Id: 27421
+    AegisName: aegis_27421
+    Name: Shard of Strength Jewel
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Head_Top: true
+      Head_Low: true
+      Head_Mid: true
+    Flags:
+      BuyingStore: true
+      DropEffect: CLIENT
+    Script: |
+      .@r = getrefine();
+      bonus bShortAtkRate,3*(.@r/2);
+      bonus bHit,7*(.@r/2);
+      bonus bAtkRate,3*(.@r/5);
+  - Id: 27422
+    AegisName: aegis_27422
+    Name: Shard of Agility Jewel
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Head_Top: true
+      Head_Low: true
+      Head_Mid: true
+    Flags:
+      BuyingStore: true
+      DropEffect: CLIENT
+    Script: |
+      .@r = getrefine();
+      bonus bAspdRate,5*(.@r/2);
+      bonus bFlee,7*(.@r/2);
+      bonus bAspd,(.@r/5);
+  - Id: 27423
+    AegisName: aegis_27423
+    Name: Shard of Dexterity Jewel
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Head_Top: true
+      Head_Low: true
+      Head_Mid: true
+    Flags:
+      BuyingStore: true
+      DropEffect: CLIENT
+    Script: |
+      .@r = getrefine();
+      bonus bLongAtkRate,3*(.@r/2);
+      bonus bHit,7*(.@r/2);
+      bonus bAtkRate,3*(.@r/5);
+  - Id: 27424
+    AegisName: aegis_27424
+    Name: Shard of Fatality Jewel
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Head_Top: true
+      Head_Low: true
+      Head_Mid: true
+    Flags:
+      BuyingStore: true
+      DropEffect: CLIENT
+    Script: |
+      .@r = getrefine();
+      bonus bCritAtkRate,6*(.@r/2);
+      bonus bCritical,3*(.@r/2);
+      bonus bAtkRate,3*(.@r/5);
+  - Id: 27425
+    AegisName: aegis_27425
+    Name: Shard of Vitality Jewel
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Head_Top: true
+      Head_Low: true
+      Head_Mid: true
+    Flags:
+      BuyingStore: true
+      DropEffect: CLIENT
+    Script: |
+      .@r = getrefine();
+      bonus bVariableCastrate,-5*(.@r/2);
+      bonus bMatk,7*(.@r/2);
+      bonus bMatkRate,3*(.@r/5);
+  - Id: 27426
+    AegisName: aegis_27426
+    Name: Shard of Intelligence Jewel
+    Type: Card
+    Buy: 20
+    Weight: 10
+    Locations:
+      Head_Top: true
+      Head_Low: true
+      Head_Mid: true
+    Flags:
+      BuyingStore: true
+      DropEffect: CLIENT
+    Script: |
+      .@r = getrefine();
+      bonus2 bMagicAtkEle,Ele_All,3*(.@r/2);
+      bonus bMatk,7*(.@r/2);
+      bonus bMatkRate,3*(.@r/5);
   - Id: 29000
     AegisName: Neev_INT_1
     Name: Rune of Intellect Lv 1
@@ -43799,7 +44106,7 @@ Body:
              .@c = 35;
              .@t += 1000;
          }
-         autobonus "{ bonus bVariableCastrate,-100; bonus bDelayrate,-100 }",.@c,.@t,BF_MAGIC;
+         autobonus "{ bonus bVariableCastrate,-100; bonus bDelayrate,-100; }",.@c,.@t,BF_MAGIC;
       }
   - Id: 29175
     AegisName: Reactor_S_CRI
@@ -43824,7 +44131,7 @@ Body:
       }
   - Id: 29176
     AegisName: Sky_Ground
-    Name: Tenji
+    Name: Heaven & Earth
     Type: Card
     SubType: Enchant
     Buy: 10
@@ -43834,14 +44141,16 @@ Body:
       DropEffect: CLIENT
     Script: |
       bonus2 bAddRace,RC_Brute,15;
+      bonus2 bAddRace,RC_Player_Doram,15;
       bonus2 bAddRace,RC_Plant,15;
       bonus2 bMagicAddRace,RC_Brute,15;
+      bonus2 bMagicAddRace,RC_Player_Doram,15;
       bonus2 bMagicAddRace,RC_Plant,15;
       bonus2 bAddEle,Ele_Wind,15;
       bonus2 bAddEle,Ele_Earth,15;
       bonus2 bMagicAddEle,Ele_Wind,15;
       bonus2 bMagicAddEle,Ele_Earth,15;
-      autobonus2 "{ bonus bVariableCastrate,-70;bonus bDelayrate,-70; bonus bIgnoreDefRace,RC_All; bonus bIgnoreMDefRace,RC_All; }",1,10000;
+      autobonus "{ bonus bVariableCastrate,-70;bonus bDelayrate,-70; bonus bIgnoreDefRace,RC_All; bonus bIgnoreMDefRace,RC_All; }",5,10000;
   - Id: 29208
     AegisName: SPdrain2_Top
     Name: SPabsorp2
@@ -45386,9 +45695,34 @@ Body:
     SubType: Enchant
     Script: |
       bonus2 bSkillAtk,"GC_ROLLINGCUTTER",15;
+  - Id: 29525
+    AegisName: NJ_1
+    Name: Ninja Essence Lv1
+    Type: Card
+    SubType: Enchant
+    Script: |
+      .@r = getrefine();
+      bonus bBaseAtk,3*getskilllv("NJ_TOBIDOUGU");
+      bonus2 bSkillAtk,"NJ_KIRIKAGE",20;
+      bonus2 bSkillAtk,"NJ_HUUMA",20;
+      bonus bMaxHP,100*(.@r/2);
+      bonus bHit,5*(.@r/2);
+  - Id: 29526
+    AegisName: NJ_2
+    Name: Ninja Essence Lv2
+    Type: Card
+    SubType: Enchant
+    Script: |
+      .@r = getrefine();
+      bonus bBaseAtk,5*getskilllv("NJ_TOBIDOUGU");
+      bonus2 bSkillAtk,"NJ_KIRIKAGE",20;
+      bonus2 bSkillAtk,"NJ_HUUMA",20;
+      bonus bMaxHP,100*(.@r/2);
+      bonus bHit,5*(.@r/2);
+      autobonus3 "{ bonus bSkillAtk,\"NJ_KIRIKAGE\",20; bonus bSkillAtk,\"NJ_HUUMA\",20; }",1000,60000,"NJ_NEN";
   - Id: 29527
     AegisName: Improve_Orb_Def
-    Name: Modification Orb(Defense)
+    Name: Modification Orb (DEF)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45402,7 +45736,7 @@ Body:
       }
   - Id: 29528
     AegisName: Improve_Orb_Mdef
-    Name: Modification Orb(Magic Defense)
+    Name: Modification Orb (MDEF)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45416,14 +45750,14 @@ Body:
       }
   - Id: 29529
     AegisName: Improve_Orb_HealHP
-    Name: Modification Orb(HP Recovery)
+    Name: Modification Orb (HP Recovery)
     Type: Card
     SubType: Enchant
     Script: |
       bonus bHPrecovRate,20;
   - Id: 29530
     AegisName: Improve_Orb_Spirit
-    Name: Modification Orb(Spirit)
+    Name: Modification Orb (Spirit)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45437,7 +45771,7 @@ Body:
       }
   - Id: 29531
     AegisName: Improve_Orb_Health
-    Name: Modification Orb(Stamina)
+    Name: Modification Orb (Health)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45451,14 +45785,14 @@ Body:
       }
   - Id: 29532
     AegisName: Improve_Orb_HealSP
-    Name: Modification Orb(SP Recovery)
+    Name: Modification Orb (SP Recovery)
     Type: Card
     SubType: Enchant
     Script: |
       bonus bSPrecovRate,20;
   - Id: 29533
     AegisName: Improve_Orb_Heal
-    Name: Modification Orb(Heal)
+    Name: Modification Orb (Heal)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45472,7 +45806,7 @@ Body:
       }
   - Id: 29534
     AegisName: Improve_Orb_Atk
-    Name: Modification Orb(Attack Power)
+    Name: Modification Orb (ATK)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45486,7 +45820,7 @@ Body:
       }
   - Id: 29535
     AegisName: Improve_Orb_Matk
-    Name: Modification Orb(Magic Power)
+    Name: Modification Orb (MATK)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45500,7 +45834,7 @@ Body:
       }
   - Id: 29536
     AegisName: Improve_Orb_Archer
-    Name: Modification Orb(Sharpshooter)
+    Name: Modification Orb (Sharpshooter)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45514,7 +45848,7 @@ Body:
       }
   - Id: 29537
     AegisName: Improve_Orb_Speed
-    Name: Modification Orb(Swift)
+    Name: Modification Orb (Speed)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45528,7 +45862,7 @@ Body:
       }
   - Id: 29538
     AegisName: Improve_Orb_Cast
-    Name: Modification Orb(Caster)
+    Name: Modification Orb (Caster)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45542,7 +45876,7 @@ Body:
       }
   - Id: 29539
     AegisName: Improve_Orb_Cri
-    Name: Modification Orb(Critical)
+    Name: Modification Orb (Critical)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45556,7 +45890,7 @@ Body:
       }
   - Id: 29540
     AegisName: Improve_Orb_Delay
-    Name: Modification Orb(After Skill Delay)
+    Name: Modification Orb (Global Delay)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45570,7 +45904,7 @@ Body:
       }
   - Id: 29541
     AegisName: Improve_Orb_Fix
-    Name: Modification Orb(Fixed Casting Time)
+    Name: Modification Orb (Fixed Casting)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45584,7 +45918,7 @@ Body:
       }
   - Id: 29542
     AegisName: Improve_Orb_Above
-    Name: Modification Orb(Above All)
+    Name: Modification Orb (Above All)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45600,35 +45934,35 @@ Body:
       }
   - Id: 29543
     AegisName: Improve_Orb_Life
-    Name: Modification Orb(Life Drain)
+    Name: Modification Orb (Drain Life)
     Type: Card
     SubType: Enchant
     Script: |
       bonus2 bHPDrainRate,20,2;
   - Id: 29544
     AegisName: Improve_Orb_Soul
-    Name: Modification Orb(Soul Drain)
+    Name: Modification Orb (Drain Soul)
     Type: Card
     SubType: Enchant
     Script: |
       bonus2 bSPDrainRate,10,1;
   - Id: 29545
     AegisName: Improve_Orb_M_Heal
-    Name: Modification Orb(Magic Healing)
+    Name: Modification Orb (Magic Healing)
     Type: Card
     SubType: Enchant
     Script: |
       autobonus "{ bonus2 bHPRegenRate,400,500; }",20,10000,BF_MAGIC,"{ specialeffect2 EF_POTION_BERSERK; }";
   - Id: 29546
     AegisName: Improve_Orb_M_Soul
-    Name: Modification Orb(Magic Soul)
+    Name: Modification Orb (Magic Soul)
     Type: Card
     SubType: Enchant
     Script: |
       autobonus "{ bonus2 bSPRegenRate,80,500; }",10,10000,BF_MAGIC,"{ specialeffect2 EF_POTION_BERSERK; }";
   - Id: 29547
     AegisName: Improve_Orb_L_Vit
-    Name: Modification Orb(Unlimited Vital)
+    Name: Modification Orb (Unlimited Vitality)
     Type: Card
     SubType: Enchant
     Script: |
@@ -45636,35 +45970,35 @@ Body:
       autobonus2 "{ bonus bVit,50; bonus2 bHPRegenRate,400,500; bonus2 bSPLossRate,1,20000; }",50,10000,BF_MAGIC,"{ specialeffect2 EF_POTION_BERSERK; }";
   - Id: 29548
     AegisName: Improve_Orb_L_INT
-    Name: Modification Orb(Spell Buster)
+    Name: Modification Orb (Spell Buster)
     Type: Card
     SubType: Enchant
     Script: |
       autobonus "{ bonus bInt,50; bonus bMatkRate,15; bonus bAtkRate,-15; }",30,10000,BF_MAGIC,"{ specialeffect2 EF_POTION_BERSERK; }";
   - Id: 29549
     AegisName: Improve_Orb_L_DEX
-    Name: Modification Orb(Firing Shot)
+    Name: Modification Orb (Fierce Shooter)
     Type: Card
     SubType: Enchant
     Script: |
       autobonus "{ bonus bDex,50; bonus bLongAtkRate,10; bonus2 bSPLossRate,1,20000; }",30,10000,BF_NORMAL,"{ specialeffect2 EF_POTION_BERSERK; }";
   - Id: 29550
     AegisName: Improve_Orb_L_STR
-    Name: Modification Orb(Over Power)
+    Name: Modification Orb (Overpower)
     Type: Card
     SubType: Enchant
     Script: |
       autobonus "{ bonus bStr,50; bonus bAtkRate,15; bonus bMatkRate,-15; }",30,10000,BF_NORMAL,"{ specialeffect2 EF_POTION_BERSERK; }";
   - Id: 29551
     AegisName: Improve_Orb_L_AGI
-    Name: Modification Orb(Fatal Flash)
+    Name: Modification Orb (Fatal Flash)
     Type: Card
     SubType: Enchant
     Script: |
       autobonus "{ bonus bAgi,50; bonus bCritAtkRate,10; bonus2 bHPLossRate,300,1000; }",30,10000,BF_NORMAL,"{ specialeffect2 EF_POTION_BERSERK; }";
   - Id: 29552
     AegisName: Improve_Orb_L_LUK
-    Name: Modification Orb(Lucky Strike)
+    Name: Modification Orb (Lucky Strike)
     Type: Card
     SubType: Enchant
     Script: |
@@ -60224,6 +60558,102 @@ Body:
     SubType: Enchant
     Script: |
       bonus bMaxHP,25*BaseLevel;
+  - Id: 310833
+    AegisName: Tenacity1_Infinite
+    Name: Indomitable 1
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bShortAtkRate,4;
+      bonus bPerfectHitAddRate,1;
+  - Id: 310834
+    AegisName: Tenacity2_Infinite
+    Name: Indomitable 2
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bShortAtkRate,8;
+      bonus bPerfectHitAddRate,2;
+  - Id: 310835
+    AegisName: Tenacity3_Infinite
+    Name: Indomitable 3
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bShortAtkRate,12;
+      bonus bPerfectHitAddRate,3;
+  - Id: 310836
+    AegisName: Tenacity4_Infinite
+    Name: Indomitable 4
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bShortAtkRate,16;
+      bonus bPerfectHitAddRate,4;
+  - Id: 310837
+    AegisName: Tenacity5_Infinite
+    Name: Indomitable 5
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bShortAtkRate,20;
+      bonus bPerfectHitAddRate,5;
+  - Id: 310838
+    AegisName: Unlimite_Matk1_infinite
+    Name: Infinite Magic Power 1
+    Type: Card
+    SubType: Enchant
+    Script: |
+      .@r = getrefine();
+      bonus bMatk,2*(.@r/2);
+      bonus bHealPower,.@r/2;
+      bonus bMatkRate,.@r/5;
+  - Id: 310839
+    AegisName: Unlimite_Matk2_infinite
+    Name: Infinite Magic Power 2
+    Type: Card
+    SubType: Enchant
+    Script: |
+      .@r = getrefine();
+      bonus bMatk,4*(.@r/2);
+      bonus bHealPower,3*(.@r/2);
+      bonus bMatkRate,2*(.@r/5);
+  - Id: 310840
+    AegisName: Unlimite_Matk3_infinite
+    Name: Infinite Magic Power 3
+    Type: Card
+    SubType: Enchant
+    Script: |
+      .@r = getrefine();
+      bonus bMatk,7*(.@r/2);
+      bonus bHealPower,5*(.@r/2);
+      bonus bMatkRate,3*(.@r/5);
+  - Id: 310841
+    AegisName: LimiteBroken_Fight_Inf
+    Name: Breaking Through (Infinite Fighting Spirit)
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bShortAtkRate,20;
+      bonus bPerfectHitAddRate,5;
+      autobonus "{ bonus bStr,30; bonus bShortAtkRate,15; }",30,10000,BF_WEAPON;
+  - Id: 310842
+    AegisName: LimiteBroken_Matk_Inf
+    Name: Breaking Through (Infinite Magic Power)
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus2 bMagicAtkEle,Ele_All,20;
+      autobonus "{ bonus bInt,30; bonus2 bMagicAtkEle,Ele_All,15; }",30,10000,BF_MAGIC;
+  - Id: 310843
+    AegisName: LimiteBroken_Archer_Inf
+    Name: Breaking Through (Infinite Archery)
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bLongAtkRate,20;
+      bonus bAspdRate,5;
+      autobonus "{ bonus bDex,30; bonus bLongAtkRate,15; }",30,10000,BF_WEAPON;
   - Id: 310844
     AegisName: Summer_Hot_Lv1
     Name: Summer Heat(Lv1)
@@ -60254,6 +60684,15 @@ Body:
     Name: Summer Coolness(Lv3)
     Type: Card
     SubType: Enchant
+  - Id: 310850
+    AegisName: Firework_Effect
+    Name: Firework
+    Type: Card
+    SubType: Enchant
+    Script: |
+      hateffect HAT_EF_firework,true;
+    UnEquipScript: |
+      hateffect HAT_EF_firework,false;
   - Id: 310851
     AegisName: Mad_Bunny_Enchant_1_1
     Name: Delay after skill 1Lv
@@ -69858,11 +70297,83 @@ Body:
     SubType: Enchant
     Script: |
       bonus bLongAtkRate,5+5*getenchantgrade();
+  - Id: 312012
+    AegisName: Sigrun_Orb_Def_Z
+    Name: Sigrun Orb (Defense)
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bDef,25;
+      if (getrefine()>=9)
+         bonus bDef,10;
+  - Id: 312013
+    AegisName: Sigrun_Orb_Mdef_Z
+    Name: Sigrun Orb (Magic Defense)
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMdef,2;
+      if (getrefine()>=9)
+         bonus bMdef,3;
   - Id: 312014
     AegisName: Justice_Power
     Name: Good Spell
     Type: Card
     SubType: Enchant
+  - Id: 312015
+    AegisName: Sigrun_Orb_Speed_Z
+    Name: Sigrun Orb (Quick)
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bAspd,1;
+      if (getrefine()>=9)
+         bonus bAspdRate,3;
+  - Id: 312016
+    AegisName: Sigrun_Orb_Cast_Z
+    Name: Sigrun Orb (Caster)
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bVariableCastrate,-5;
+      if (getrefine()>=9)
+         bonus bVariableCastrate,-3;
+  - Id: 312017
+    AegisName: Sigrun_Orb_Cri_Z
+    Name: Sigrun Orb (Critical)
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bCritical,10;
+      if (getrefine()>=9)
+         bonus bCritAtkRate,5;
+  - Id: 312018
+    AegisName: Sigrun_Orb_Health_Z
+    Name: Sigrun Orb (Health)
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxHPrate,5;
+      if (getrefine()>=9)
+         bonus bMaxHP,750;
+  - Id: 312019
+    AegisName: Sigrun_Orb_Spirit_Z
+    Name: Sigrun Orb (Mental)
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxSPrate,5;
+      if (getrefine()>=9)
+         bonus bMaxSP,150;
+  - Id: 312020
+    AegisName: Sigrun_Orb_Heal_Z
+    Name: Sigrun Orb (Heal)
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bHealPower,5;
+      if (getrefine()>=9)
+         bonus bHealPower,5;
   - Id: 312021
     AegisName: Injustice_Power
     Name: Evil Spell
@@ -69880,6 +70391,33 @@ Body:
     Name: Latent Release (Archmage II)
     Type: Card
     SubType: Enchant
+  - Id: 312032
+    AegisName: aegis_312032
+    Name: Cri + 25
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bCritical,25;
+  - Id: 312033
+    AegisName: aegis_312033
+    Name: Latent Release (Abyss Chaser II)
+    Type: Card
+    SubType: Enchant
+  - Id: 312034
+    AegisName: aegis_312034
+    Name: Latent Release (Inquisitor II)
+    Type: Card
+    SubType: Enchant
+  - Id: 312035
+    AegisName: aegis_312035
+    Name: Latent Release (Imperial Guard II)
+    Type: Card
+    SubType: Enchant
+  - Id: 312036
+    AegisName: aegis_312036
+    Name: Latent Release (Windhawk II)
+    Type: Card
+    SubType: Enchant
   - Id: 312037
     AegisName: aegis_312037
     Name: Latent Release (Elemental Master II)
@@ -69890,6 +70428,11 @@ Body:
     Name: Latent Release (Cardinal II)
     Type: Card
     SubType: Enchant
+  - Id: 312039
+    AegisName: aegis_312039
+    Name: Latent Release (Shadow Cross II)
+    Type: Card
+    SubType: Enchant
   - Id: 312040
     AegisName: aegis_312040
     Name: Latent Release (Dragon Knight II)
@@ -72077,6 +72620,11 @@ Body:
     Name: Latent Release (Dragon Knight III)
     Type: Card
     SubType: Enchant
+  - Id: 312301
+    AegisName: aegis_312301
+    Name: Latent Release (Biolo III)
+    Type: Card
+    SubType: Enchant
   - Id: 312302
     AegisName: DK_Soul_DB
     Name: Dragon Knight Soul (Dragonic Breath)
@@ -72084,6 +72632,11 @@ Body:
     SubType: Enchant
     Script: |
       bonus2 bSkillAtk,"DK_DRAGONIC_BREATH",2+(getrefine()/2);
+  - Id: 312303
+    AegisName: aegis_312303
+    Name: Latent Release (Elemental Master III)
+    Type: Card
+    SubType: Enchant
   - Id: 312304
     AegisName: aegis_312304
     Name: Latent Release (Cardinal III)
@@ -75617,6 +76170,11 @@ Body:
     Name: Evil Vigor (Hyper Novice)
     Type: Card
     SubType: Enchant
+  - Id: 312691
+    AegisName: aegis_312691
+    Name: Latent Release (Cardinal V)
+    Type: Card
+    SubType: Enchant
   - Id: 312692
     AegisName: aegis_312692
     Name: Abyss Chaser Stone (Garment)
@@ -76628,6 +77186,491 @@ Body:
     Name: Evil Vigor (Night Watch)
     Type: Card
     SubType: Enchant
+  - Id: 312848
+    AegisName: Z_Bijou_STR_1
+    Name: STR I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bStr,2;
+  - Id: 312849
+    AegisName: Z_Bijou_STR_2
+    Name: STR II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bStr,3;
+  - Id: 312850
+    AegisName: Z_Bijou_STR_3
+    Name: STR III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bStr,4;
+  - Id: 312851
+    AegisName: Z_Bijou_STR_4
+    Name: STR IV
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bStr,6;
+  - Id: 312852
+    AegisName: Z_Bijou_AGI_1
+    Name: AGI I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bAgi,2;
+  - Id: 312853
+    AegisName: Z_Bijou_AGI_2
+    Name: AGI II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bAgi,3;
+  - Id: 312854
+    AegisName: Z_Bijou_AGI_3
+    Name: AGI III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bAgi,4;
+  - Id: 312855
+    AegisName: Z_Bijou_AGI_4
+    Name: AGI IV
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bAgi,6;
+  - Id: 312856
+    AegisName: Z_Bijou_VIT_1
+    Name: VIT I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bVit,2;
+  - Id: 312857
+    AegisName: Z_Bijou_VIT_2
+    Name: VIT II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bVit,3;
+  - Id: 312858
+    AegisName: Z_Bijou_VIT_3
+    Name: VIT III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bVit,4;
+  - Id: 312859
+    AegisName: Z_Bijou_VIT_4
+    Name: VIT IV
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bVit,6;
+  - Id: 312860
+    AegisName: Z_Bijou_INT_1
+    Name: INT I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bInt,2;
+  - Id: 312861
+    AegisName: Z_Bijou_INT_2
+    Name: INT II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bInt,3;
+  - Id: 312862
+    AegisName: Z_Bijou_INT_3
+    Name: INT III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bInt,4;
+  - Id: 312863
+    AegisName: Z_Bijou_INT_4
+    Name: INT IV
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bInt,6;
+  - Id: 312864
+    AegisName: Z_Bijou_DEX_1
+    Name: DEX I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bDex,2;
+  - Id: 312865
+    AegisName: Z_Bijou_DEX_2
+    Name: DEX II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bDex,3;
+  - Id: 312866
+    AegisName: Z_Bijou_DEX_3
+    Name: DEX III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bDex,4;
+  - Id: 312867
+    AegisName: Z_Bijou_DEX_4
+    Name: DEX IV
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bDex,6;
+  - Id: 312868
+    AegisName: Z_Bijou_LUK_1
+    Name: LUK I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bLuk,2;
+  - Id: 312869
+    AegisName: Z_Bijou_LUK_2
+    Name: LUK II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bLuk,3;
+  - Id: 312870
+    AegisName: Z_Bijou_LUK_3
+    Name: LUK III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bLuk,4;
+  - Id: 312871
+    AegisName: Z_Bijou_LUK_4
+    Name: LUK IV
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bLuk,6;
+  - Id: 312872
+    AegisName: Z_Bijou_DEF_1
+    Name: DEF I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bDef,4;
+  - Id: 312873
+    AegisName: Z_Bijou_DEF_2
+    Name: DEF II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bDef,8;
+  - Id: 312874
+    AegisName: Z_Bijou_DEF_3
+    Name: DEF III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bDef,12;
+  - Id: 312875
+    AegisName: Z_Bijou_DEF_4
+    Name: DEF IV
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bDef,16;
+  - Id: 312876
+    AegisName: Z_Bijou_DEF_5
+    Name: DEF V
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bDef,20;
+  - Id: 312877
+    AegisName: Z_Bijou_MHP_F_1
+    Name: HP I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxHP,475;
+  - Id: 312878
+    AegisName: Z_Bijou_MHP_F_2
+    Name: HP II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxHP,675;
+  - Id: 312879
+    AegisName: Z_Bijou_MHP_F_3
+    Name: HP III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxHP,875;
+  - Id: 312880
+    AegisName: Z_Bijou_MHP_F_4
+    Name: HP IV
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxHP,1075;
+  - Id: 312881
+    AegisName: Z_Bijou_MHP_F_5
+    Name: HP V
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxHP,1275;
+  - Id: 312882
+    AegisName: Z_Bijou_MSP_F_1
+    Name: SP I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxSP,250;
+  - Id: 312883
+    AegisName: Z_Bijou_MSP_F_2
+    Name: SP II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxSP,375;
+  - Id: 312884
+    AegisName: Z_Bijou_MSP_F_3
+    Name: SP III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxSP,500;
+  - Id: 312885
+    AegisName: Z_Bijou_MSP_F_4
+    Name: SP IV
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxSP,625;
+  - Id: 312886
+    AegisName: Z_Bijou_MSP_F_5
+    Name: SP V
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxSP,750;
+  - Id: 312887
+    AegisName: Z_Bijou_MHP_P_1
+    Name: MHP I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxHPrate,2;
+  - Id: 312888
+    AegisName: Z_Bijou_MHP_P_2
+    Name: MHP II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxHPrate,4;
+  - Id: 312889
+    AegisName: Z_Bijou_MHP_P_3
+    Name: MHP III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxHPrate,6;
+  - Id: 312890
+    AegisName: Z_Bijou_MSP_P_1
+    Name: MSP I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxSPrate,2;
+  - Id: 312891
+    AegisName: Z_Bijou_MSP_P_2
+    Name: MSP II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxSPrate,4;
+  - Id: 312892
+    AegisName: Z_Bijou_MSP_P_3
+    Name: MSP III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMaxSPrate,6;
+  - Id: 312893
+    AegisName: Z_Bijou_ATK_1
+    Name: ATK I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bBaseAtk,10;
+  - Id: 312894
+    AegisName: Z_Bijou_ATK_2
+    Name: ATK II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bBaseAtk,18;
+  - Id: 312895
+    AegisName: Z_Bijou_ATK_3
+    Name: ATK III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bBaseAtk,26;
+      bonus bHit,5;
+  - Id: 312896
+    AegisName: Z_Bijou_ATK_4
+    Name: ATK IV
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bBaseAtk,34;
+      bonus bHit,6;
+  - Id: 312897
+    AegisName: Z_Bijou_ATK_5
+    Name: ATK V
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bBaseAtk,42;
+      bonus bHit,7;
+  - Id: 312898
+    AegisName: Z_Bijou_MATK_1
+    Name: MATK I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMatk,10;
+  - Id: 312899
+    AegisName: Z_Bijou_MATK_2
+    Name: MATK II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMatk,18;
+  - Id: 312900
+    AegisName: Z_Bijou_MATK_3
+    Name: MATK III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMatk,26;
+      bonus bVariableCastrate,-5;
+  - Id: 312901
+    AegisName: Z_Bijou_MATK_4
+    Name: MATK IV
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMatk,34;
+      bonus bVariableCastrate,-6;
+  - Id: 312902
+    AegisName: Z_Bijou_MATK_5
+    Name: MATK V
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bMatk,42;
+      bonus bVariableCastrate,-7;
+  - Id: 312903
+    AegisName: Z_Bijou_Range_1
+    Name: Concentration I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bLongAtkRate,6;
+  - Id: 312904
+    AegisName: Z_Bijou_Range_2
+    Name: Concentration II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bLongAtkRate,9;
+  - Id: 312905
+    AegisName: Z_Bijou_Range_3
+    Name: Concentration III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bLongAtkRate,12;
+  - Id: 312906
+    AegisName: Z_Bijou_Melee_1
+    Name: Forearm I
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bShortAtkRate,7;
+  - Id: 312907
+    AegisName: Z_Bijou_Melee_2
+    Name: Forearm II
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bShortAtkRate,10;
+  - Id: 312908
+    AegisName: Z_Bijou_Melee_3
+    Name: Forearm III
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bShortAtkRate,13;
+      bonus bPerfectHitAddRate,1;
+  - Id: 312909
+    AegisName: Z_Bijou_Melee_4
+    Name: Forearm IV
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bShortAtkRate,16;
+      bonus bPerfectHitAddRate,2;
+  - Id: 312910
+    AegisName: Z_Bijou_Melee_5
+    Name: Forearm V
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus bShortAtkRate,19;
+      bonus bPerfectHitAddRate,3;
+  - Id: 312911
+    AegisName: Z_Bijou_MDamage_1
+    Name: Intelligence Ⅰ
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus2 bMagicAtkEle,Ele_All,4;
+  - Id: 312912
+    AegisName: Z_Bijou_MDamage_2
+    Name: Intelligence ⅠI
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus2 bMagicAtkEle,Ele_All,7;
+  - Id: 312913
+    AegisName: Z_Bijou_MDamage_3
+    Name: Intelligence ⅠII
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus2 bMagicAtkEle,Ele_All,10;
+  - Id: 312914
+    AegisName: Z_Bijou_MDamage_4
+    Name: Intelligence ⅠV
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus2 bMagicAtkEle,Ele_All,13;
+  - Id: 312915
+    AegisName: Z_Bijou_MDamage_5
+    Name: Intelligence V
+    Type: Card
+    SubType: Enchant
+    Script: |
+      bonus2 bMagicAtkEle,Ele_All,16;
   - Id: 1000000
     AegisName: IDTest_event
     Name: IDTest event

+ 9 - 0
db/re/item_db_usable.yml

@@ -66932,6 +66932,15 @@ Body:
       Container: true
     Script: |
       getgroupitem(IG_Ponytail_Hair_Box);
+  - Id: 102605
+    AegisName: aegis_102605
+    Name: Costume Enchant Stone Box 33
+    Type: Usable
+    Weight: 10
+    Flags:
+      Container: true
+    Script: |
+      getgroupitem(IG_Enchant_Stone_Box33);
   - Id: 200003
     AegisName: LI_HD_Oridecon_Box2
     Name: (Limited) HD Oridecon Box(Blacksmith)(30)

+ 202 - 0
db/re/item_group_db.yml

@@ -73781,3 +73781,205 @@ Body:
           - Index: 23
             Item: C_Blackhand_Of_Fate
             Rate: 1
+  - Group: ENCHANT_STONE_BOX33
+    SubGroups:
+      - SubGroup: 1
+        List:
+          - Index: 0
+            Item: Range_Stone_Robe_D
+            Rate: 10
+          - Index: 1
+            Item: Melee_Stone_Robe_D
+            Rate: 10
+          - Index: 2
+            Item: Magic_Stone_Robe_D
+            Rate: 10
+          - Index: 3
+            Item: SmatkStone_Robe
+            Rate: 10
+          - Index: 4
+            Item: M_PATKStone_Robe
+            Rate: 10
+          - Index: 5
+            Item: R_PATKStone_Robe
+            Rate: 10
+          - Index: 6
+            Item: ResistDefStone_Robe
+            Rate: 10
+          - Index: 7
+            Item: StaminaWISStone_Robe_D
+            Rate: 10
+          - Index: 8
+            Item: POWStone_Robe_D
+            Rate: 10
+          - Index: 9
+            Item: SplStone_Robe_D
+            Rate: 10
+          - Index: 10
+            Item: ConStone_Robe_D
+            Rate: 10
+          - Index: 11
+            Item: CrtStone_Robe_D
+            Rate: 10
+          - Index: 12
+            Item: MinorCastStone_Robe_D
+            Rate: 10
+          - Index: 13
+            Item: AbysschaserStone_Robe
+            Rate: 10
+          - Index: 14
+            Item: TRTRStone_Robe
+            Rate: 10
+          - Index: 15
+            Item: HNoviceStone_Robe
+            Rate: 10
+          - Index: 16
+            Item: ReloadStone_Robe_D
+            Rate: 10
+          - Index: 17
+            Item: CriticalStone_Robe_D
+            Rate: 10
+          - Index: 18
+            Item: DoubleAttack_Stone
+            Rate: 20
+          - Index: 19
+            Item: Critical_Stone_Robe
+            Rate: 20
+          - Index: 20
+            Item: CastStone_Robe_D
+            Rate: 40
+          - Index: 21
+            Item: SPdrainStone_Robe_D
+            Rate: 40
+          - Index: 22
+            Item: HPdrainStone_Robe_D
+            Rate: 80
+          - Index: 23
+            Item: ASPDStone_Robe_D
+            Rate: 80
+          - Index: 24
+            Item: CastStone_Robe
+            Rate: 80
+          - Index: 25
+            Item: ShadowchasStone_Top3
+            Rate: 80
+          - Index: 26
+            Item: ShadowchasStone_Middle3
+            Rate: 80
+          - Index: 27
+            Item: ShadowchasStone_Bottom3
+            Rate: 80
+          - Index: 28
+            Item: WanderMinsStone_Top3
+            Rate: 80
+          - Index: 29
+            Item: WanderMinsStone_Middle3
+            Rate: 80
+          - Index: 30
+            Item: WanderMinsStone_Bottom3
+            Rate: 80
+          - Index: 31
+            Item: SuNoviceStone_Top
+            Rate: 80
+          - Index: 32
+            Item: SuNoviceStone_Middle
+            Rate: 80
+          - Index: 33
+            Item: SuNoviceStone_Bottom
+            Rate: 80
+          - Index: 34
+            Item: Stone_Robe_Box
+            Rate: 170
+          - Index: 35
+            Item: aegis_102333
+            Rate: 170
+          - Index: 36
+            Item: Magic_Stone_Top
+            Rate: 200
+          - Index: 37
+            Item: Magic_Stone_Middle
+            Rate: 200
+          - Index: 38
+            Item: Magic_Stone_Bottom
+            Rate: 200
+          - Index: 39
+            Item: Range_Stone_Top
+            Rate: 200
+          - Index: 40
+            Item: Range_Stone
+            Rate: 200
+          - Index: 41
+            Item: Range_Stone_Bottom
+            Rate: 200
+          - Index: 42
+            Item: Melee_Stone_Top
+            Rate: 200
+          - Index: 43
+            Item: Melee_Stone_Middle
+            Rate: 200
+          - Index: 44
+            Item: Melee_Stone_Bottom
+            Rate: 200
+          - Index: 45
+            Item: DefenseStone_Top
+            Rate: 200
+          - Index: 46
+            Item: DefenseStone_Middle
+            Rate: 200
+          - Index: 47
+            Item: DefenseStone_Bottom
+            Rate: 200
+          - Index: 48
+            Item: ReloadStone_Top
+            Rate: 200
+          - Index: 49
+            Item: ReloadStone_Middle
+            Rate: 200
+          - Index: 50
+            Item: ReloadStone_Bottom
+            Rate: 200
+          - Index: 51
+            Item: EXPStone_Middle
+            Rate: 200
+          - Index: 52
+            Item: EXPStone_Bottom
+            Rate: 200
+          - Index: 53
+            Item: EXPStone_Top
+            Rate: 200
+          - Index: 54
+            Item: Stone_Top_Box
+            Rate: 400
+          - Index: 55
+            Item: Stone_Top2_Box
+            Rate: 400
+          - Index: 56
+            Item: Stone_Middle_Box
+            Rate: 400
+          - Index: 57
+            Item: Stone_Middle2_Box
+            Rate: 400
+          - Index: 58
+            Item: Stone_Bottom_Box
+            Rate: 400
+          - Index: 59
+            Item: Stone_Bottom2_Box
+            Rate: 400
+          - Index: 60
+            Item: CastingStone_Top
+            Rate: 400
+          - Index: 61
+            Item: CastingStone_Middle
+            Rate: 400
+          - Index: 62
+            Item: CastingStone_Bottom
+            Rate: 400
+          - Index: 63
+            Item: Critical_Stone
+            Rate: 400
+          - Index: 64
+            Item: Critical_Stone_Top
+            Rate: 400
+          - Index: 65
+            Item: Critical_Stone_Bottom
+            Rate: 400

+ 16 - 0
db/re/mob_db.yml

@@ -94088,6 +94088,8 @@ Body:
     ChaseRange: 12
     Size: Small
     Race: Insect
+    RaceGroups:
+      Illusion_Luanda: true
     Element: Earth
     ElementLevel: 1
     WalkSpeed: 200
@@ -94135,6 +94137,8 @@ Body:
     ChaseRange: 12
     Size: Large
     Race: Formless
+    RaceGroups:
+      Illusion_Luanda: true
     Element: Neutral
     ElementLevel: 4
     WalkSpeed: 150
@@ -94182,6 +94186,8 @@ Body:
     ChaseRange: 12
     Size: Large
     Race: Formless
+    RaceGroups:
+      Illusion_Luanda: true
     Element: Neutral
     ElementLevel: 4
     WalkSpeed: 200
@@ -94227,6 +94233,8 @@ Body:
     ChaseRange: 12
     Size: Large
     Race: Demon
+    RaceGroups:
+      Illusion_Luanda: true
     Element: Neutral
     ElementLevel: 3
     WalkSpeed: 150
@@ -94277,6 +94285,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Plant
+    RaceGroups:
+      Illusion_Luanda: true
     Element: Fire
     ElementLevel: 3
     WalkSpeed: 175
@@ -94324,6 +94334,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Demihuman
+    RaceGroups:
+      Illusion_Luanda: true
     Element: Earth
     ElementLevel: 2
     WalkSpeed: 200
@@ -94371,6 +94383,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Demihuman
+    RaceGroups:
+      Illusion_Luanda: true
     Element: Fire
     ElementLevel: 2
     WalkSpeed: 200
@@ -94418,6 +94432,8 @@ Body:
     ChaseRange: 12
     Size: Large
     Race: Demihuman
+    RaceGroups:
+      Illusion_Luanda: true
     Element: Fire
     ElementLevel: 4
     WalkSpeed: 150

+ 2 - 2
db/re/mob_skill_db.txt

@@ -14252,7 +14252,7 @@
 20943,DEATH_WITCH@NPC_PULSESTRIKE,attack,661,5,2000,0,30000,yes,self,always,0,,,,,,32,
 20943,DEATH_WITCH@HW_GANBANTEIN,attack,483,1,2000,0,5000,yes,target,always,0,,,,,,,
 // 20943,DEATH_WITCH@NPC_EARTHQUAKE_K,attack,750,5,10000,1500,25000,no,target,myhpltmaxrate,20,,,,,,,
-20943,DEATH_WITCH@NPC_EARTHQUAKE,attack,653,5,10000,1500,25000,no,target,myhpltmaxrate,20,,,,,,,
+20943,DEATH_WITCH@NPC_EARTHQUAKE,attack,653,5,10000,1500,25000,no,self,myhpltmaxrate,20,,,,,,,
 20943,DEATH_WITCH@NPC_HELLJUDGEMENT,chase,662,2,2000,500,5000,no,self,always,0,,,,,,,
 20943,DEATH_WITCH@NPC_HELLJUDGEMENT,attack,662,2,2000,500,5000,no,self,always,0,,,,,,,
 20943,DEATH_WITCH@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,,
@@ -14320,7 +14320,7 @@
 20928,CHIMERA_THEONE@WZ_WATERBALL,chase,86,5,5000,1000,35000,no,target,always,0,,,,,,,
 // TODO
 // 20928,CHIMERA_THEONE@NPC_EARTHQUAKE_K,chase,750,5,10000,500,20000,no,target,myhpltmaxrate,40,,,,,,,
-20928,CHIMERA_THEONE@NPC_EARTHQUAKE,chase,653,5,10000,500,20000,no,target,myhpltmaxrate,40,,,,,,,
+20928,CHIMERA_THEONE@NPC_EARTHQUAKE,chase,653,5,10000,500,20000,no,self,myhpltmaxrate,40,,,,,,,
 20928,CHIMERA_THEONE@NPC_CALLSLAVE,attack,352,1,10000,0,30000,yes,self,always,0,,,,,,,
 20928,CHIMERA_THEONE@NPC_SUMMONSLAVE,attack,196,1,10000,700,10000,no,self,slavele,2,20920,20921,20922,20923,,,
 20928,CHIMERA_THEONE@NPC_GROUNDATTACK,attack,185,3,500,0,5000,yes,target,always,0,,,,,,6,

+ 22 - 0
doc/atcommands.txt

@@ -780,6 +780,28 @@ To drop all weapons in inventory...
 
 ---------------------------------------
 
+@stockall {<item type>}
+
+Transfer all items from cart to inventory based on the item type.
+
+Valid item types:
+    -1 = All (default)
+     0 = Healing
+     2 = Usable
+     3 = Etc
+     4 = Armors
+     5 = Weapons
+     6 = Cards
+     7 = Pet Eggs
+     8 = Pet Armors
+     10 = Ammunition
+
+Example:
+To transfer all weapons from cart to inventory...
+@stockall 5
+
+---------------------------------------
+
 @storeall
 
 Places all inventory and equipped items directly into your Kafra Storage.

+ 2 - 2
doc/item_bonus.txt

@@ -15,7 +15,7 @@ This list contains all available constants referenced in the 'bonus' commands.
 * Status effect (eff)
 	Eff_Bleeding, Eff_Blind, Eff_Burning, Eff_Confusion, Eff_Crystalize, Eff_Curse, Eff_DPoison,
 	Eff_Fear, Eff_Freeze, Eff_Poison, Eff_Silence, Eff_Sleep, Eff_Stone, Eff_Stun, Eff_Freezing,
-	Eff_Heat, Eff_Deepsleep, Eff_WhiteImprison
+	Eff_Heat, Eff_Deepsleep, Eff_WhiteImprison, Eff_Hallucination
 
 * Element (e)
 	Ele_Dark, Ele_Earth, Ele_Fire, Ele_Ghost, Ele_Holy, Ele_Neutral, Ele_Poison,
@@ -31,7 +31,7 @@ This list contains all available constants referenced in the 'bonus' commands.
 	RC2_Bio5_Swordman_Thief, RC2_Bio5_Acolyte_Merchant, RC2_Bio5_Mage_Archer, RC2_Bio5_MVP,
 	RC2_Clocktower, RC2_Thanatos, RC2_Faceworm, RC2_Hearthunter, RC2_Rockridge, RC2_Werner_Lab,
 	RC2_Temple_Demon, RC2_Illusion_Vampire, RC2_Malangdo, RC2_EP172ALPHA, RC2_EP172BETA, RC2_EP172BATH,
-	RC2_Illusion_Turtle, RC2_Rachel_Sanctuary
+	RC2_Illusion_Turtle, RC2_Rachel_Sanctuary, RC2_Illusion_Luanda
 
 * Class (c)
 	Class_Normal, Class_Boss, Class_Guardian, Class_All

+ 15 - 0
doc/script_commands.txt

@@ -11390,3 +11390,18 @@ Returns current autoloot value on success.
 
 ---------------------------------------
 
+*autoloot({<rate>{, <char_id>}});
+
+This command sets the rate of autoloot.
+If no rate is provided and the user has autoloot disabled it will default to 10000 = 100% (enabled) or
+if the user has autoloot enabled it will default to 0 = 0% (disabled).
+Returns true on success and false on failure.
+
+Example:
+    autoloot();      // toggle on/off depend on existing autoloot
+    autoloot(0);     //   0.00% or off
+    autoloot(100);   //   1.00%
+    autoloot(3333);  //  33.33%
+    autoloot(10000); // 100.00%
+
+---------------------------------------

+ 1 - 0
sql-files/mob_db.sql

@@ -62,6 +62,7 @@ CREATE TABLE `mob_db` (
   `racegroup_ep172bath` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_illusion_turtle` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_rachel_sanctuary` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_illusion_luanda` tinyint(1) unsigned DEFAULT NULL,
   `element` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) unsigned DEFAULT NULL,

+ 1 - 0
sql-files/mob_db2.sql

@@ -62,6 +62,7 @@ CREATE TABLE `mob_db2` (
   `racegroup_ep172bath` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_illusion_turtle` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_rachel_sanctuary` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_illusion_luanda` tinyint(1) unsigned DEFAULT NULL,
   `element` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) unsigned DEFAULT NULL,

+ 1 - 0
sql-files/mob_db2_re.sql

@@ -64,6 +64,7 @@ CREATE TABLE `mob_db2_re` (
   `racegroup_ep172bath` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_illusion_turtle` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_rachel_sanctuary` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_illusion_luanda` tinyint(1) unsigned DEFAULT NULL,
   `element` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) unsigned DEFAULT NULL,

+ 1 - 0
sql-files/mob_db_re.sql

@@ -64,6 +64,7 @@ CREATE TABLE `mob_db_re` (
   `racegroup_ep172bath` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_illusion_turtle` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_rachel_sanctuary` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_illusion_luanda` tinyint(1) unsigned DEFAULT NULL,
   `element` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) unsigned DEFAULT NULL,

+ 12 - 0
sql-files/upgrades/upgrade_20231201.sql

@@ -0,0 +1,12 @@
+ALTER TABLE `mob_db`
+	ADD COLUMN `racegroup_illusion_luanda` tinyint(1) unsigned DEFAULT NULL
+;
+ALTER TABLE `mob_db2`
+	ADD COLUMN `racegroup_illusion_luanda` tinyint(1) unsigned DEFAULT NULL
+;
+ALTER TABLE `mob_db_re`
+	ADD COLUMN `racegroup_illusion_luanda` tinyint(1) unsigned DEFAULT NULL
+;
+ALTER TABLE `mob_db2_re`
+	ADD COLUMN `racegroup_illusion_luanda` tinyint(1) unsigned DEFAULT NULL
+;

+ 1 - 35
src/common/random.cpp

@@ -3,43 +3,9 @@
 
 #include "random.hpp"
 
-#include <random>
-
-std::mt19937 generator;
-std::uniform_int_distribution<int32> int31_distribution;
-std::uniform_int_distribution<uint32> uint32_distribution;
-
-/// Initializes the random number generator
-void rnd_init( void ){
-	std::random_device device;
-	generator = std::mt19937( device() );
-	int31_distribution = std::uniform_int_distribution<int32>( 0, SINT32_MAX );
-	uint32_distribution = std::uniform_int_distribution<uint32>( 0, UINT32_MAX );
-}
+std::uniform_int_distribution<int32> int31_distribution = std::uniform_int_distribution<int32>(0, SINT32_MAX);
 
 /// Generates a random number in the interval [0, SINT32_MAX]
 int32 rnd( void ){
 	return int31_distribution( generator );
 }
-
-/// Generates a random number in the interval [0, UINT32_MAX]
-uint32 rnd_uint32( void ){
-	return uint32_distribution( generator );
-}
-
-/// Generates a random number in the interval [0.0, 1.0)
-/// NOTE: interval is open ended, so 1.0 is excluded
-double rnd_uniform( void ){
-	return rnd_uint32() * ( 1.0 / 4294967296.0 );// divided by 2^32
-}
-
-/// Generates a random number in the interval [min, max]
-/// Returns min if range is invalid.
-int32 rnd_value( int32 min, int32 max ){
-	if( min >= max ){
-		return min;
-	}
-
-	return min + (int32)( rnd_uniform() * ( max - min + 1 ) );
-}
-

+ 22 - 4
src/common/random.hpp

@@ -4,15 +4,33 @@
 #ifndef RANDOM_HPP
 #define RANDOM_HPP
 
+#include <type_traits>
+#include <random>
+
 #include "cbasetypes.hpp"
 
-void rnd_init(void);
+inline std::random_device device;
+inline std::mt19937 generator = std::mt19937(device());
 
 int32 rnd(void);// [0, SINT32_MAX]
-int32 rnd_value(int32 min, int32 max);// [min, max]
 
-template <typename T> bool rnd_chance( T chance, T base ){
-	return rnd_value( 0, base ) < chance;
+/*
+ * Generates a random number in the interval [min, max]
+ * @return random number
+ */
+template <typename T>
+typename std::enable_if<std::is_integral<T>::value, T>::type rnd_value(T min, T max) {
+	std::uniform_int_distribution<T> dist(min, max);
+	return dist(generator);
+}
+
+/*
+ * Simulates a chance based on a given probability
+ * @return true if succeeded / false if it didn't
+ */
+template <typename T>
+typename std::enable_if<std::is_integral<T>::value, bool>::type rnd_chance(T chance, T base) {
+	return rnd_value<T>(1, base) <= chance;
 }
 
 #endif /* RANDOM_HPP */

+ 2 - 2
src/common/utilities.hpp

@@ -159,7 +159,7 @@ namespace rathena {
 		template <typename K, typename V> V& umap_random( std::unordered_map<K, V>& map ){
 			auto it = map.begin();
 
-			std::advance( it, rnd_value( 0, map.size() - 1 ) );
+			std::advance( it, rnd_value<size_t>( 0, map.size() - 1 ) );
 
 			return it->second;
 		}
@@ -172,7 +172,7 @@ namespace rathena {
 		template <typename K> K &vector_random(std::vector<K> &vec) {
 			auto it = vec.begin();
 
-			std::advance(it, rnd_value(0, vec.size() - 1));
+			std::advance( it, rnd_value<size_t>( 0, vec.size() - 1 ) );
 
 			return *it;
 		}

+ 2 - 4
src/login/login.cpp

@@ -403,8 +403,8 @@ int login_mmo_auth(struct login_session_data* sd, bool isServer) {
 
 	// update session data
 	sd->account_id = acc.account_id;
-	sd->login_id1 = rnd() + 1;
-	sd->login_id2 = rnd() + 1;
+	sd->login_id1 = rnd_value(1u, UINT32_MAX);
+	sd->login_id2 = rnd_value(1u, UINT32_MAX);
 	safestrncpy(sd->lastlogin, acc.lastlogin, sizeof(sd->lastlogin));
 	sd->sex = acc.sex;
 	sd->group_id = acc.group_id;
@@ -846,8 +846,6 @@ bool LoginServer::initialize( int argc, char* argv[] ){
 	login_lan_config_read(login_config.lanconf_name);
 	//end config
 
-	rnd_init();
-
 	do_init_loginclif();
 	do_init_loginchrif();
 

+ 2 - 2
src/login/login.hpp

@@ -39,8 +39,8 @@ namespace rathena{
 ///Struct of 1 client connected to login-serv
 struct login_session_data {
 	uint32 account_id;			///also GID
-	long login_id1;
-	long login_id2;
+	uint32 login_id1;
+	uint32 login_id2;
 	char sex;			/// 'F','M','S'
 
 	char userid[NAME_LENGTH];	/// account name

+ 1 - 2
src/login/loginclif.cpp

@@ -377,8 +377,7 @@ static int logclif_parse_reqauth(int fd, struct login_session_data *sd, int comm
 static int logclif_parse_reqkey(int fd, struct login_session_data *sd){
 	RFIFOSKIP(fd,2);
 	{
-		memset(sd->md5key, '\0', sizeof(sd->md5key));
-		sd->md5keylen = (uint16)(12 + rnd() % 4);
+		sd->md5keylen = sizeof( sd->md5key );
 		MD5_Salt(sd->md5keylen, sd->md5key);
 
 		WFIFOHEAD(fd,4 + sd->md5keylen);

+ 61 - 4
src/map/atcommand.cpp

@@ -5960,6 +5960,62 @@ ACMD_FUNC(dropall)
 	return 0;
 }
 
+/*==========================================
+ * @stockall by [Hanashi]
+ * transfer items from cart to inventory
+ *------------------------------------------*/
+ACMD_FUNC(stockall)
+{
+	nullpo_retr(-1, sd);
+	
+	if (!pc_iscarton(sd)) {
+		clif_displaymessage(fd, msg_txt(sd,1533)); // You do not have a cart.
+		return -1;
+	}
+
+	int8 type = -1;
+	if ( message[0] ) {
+		type = atoi(message);
+		switch (type) {
+			case -1:
+			case IT_HEALING:
+			case IT_USABLE:
+			case IT_ETC:
+			case IT_WEAPON:
+			case IT_ARMOR:
+			case IT_CARD:
+			case IT_PETEGG:
+			case IT_PETARMOR:
+			case IT_AMMO:
+				break;
+
+			default:
+				clif_displaymessage(fd, msg_txt(sd, 1534)); // Usage: @stockall {<type>}
+				clif_displaymessage(fd, msg_txt(sd, 1493)); // Type List: (default) all = -1, healing = 0, usable = 2, etc = 3, armor = 4, weapon = 5, card = 6, petegg = 7, petarmor = 8, ammo = 10
+				return -1;
+		}
+	}
+	uint16 count = 0, count2 = 0;
+	for ( uint16 i = 0; i < MAX_CART; i++ ) {
+		if ( sd->cart.u.items_cart[i].amount > 0 ) {
+			std::shared_ptr<item_data> id = item_db.find(sd->cart.u.items_cart[i].nameid);
+			if ( id == nullptr ) {
+				ShowDebug("Non-existent item %u on stockall list (account_id: %d, char_id: %d)\n", sd->cart.u.items_cart[i].nameid, sd->status.account_id, sd->status.char_id);
+				continue;
+			}
+			if ( type == -1 || static_cast<item_types>(type) == id->type ) {
+				if (pc_getitemfromcart(sd, i, sd->cart.u.items_cart[i].amount))
+					count += sd->cart.u.items_cart[i].amount;
+				else
+					count2 += sd->cart.u.items_cart[i].amount;
+			}
+		}
+	}
+	sprintf(atcmd_output, msg_txt(sd,1535), count,count2); // %d items are transferred (%d skipped)!
+	clif_displaymessage(fd, atcmd_output); 
+	return 0;
+}
+
 /*==========================================
  * @storeall by [MouseJstr]
  * Put everything into storage
@@ -7203,7 +7259,7 @@ ACMD_FUNC(pettalk)
 		};
 		int i;
 		ARR_FIND( 0, ARRAYLENGTH(emo), i, stricmp(message, emo[i]) == 0 );
-		if( i == ET_DICE1 ) i = rnd()%6 + ET_DICE1; // randomize /dice
+		if( i == ET_DICE1 ) i = rnd_value<int>(ET_DICE1, ET_DICE6); // randomize /dice
 		if( i < ARRAYLENGTH(emo) )
 		{
 			if (sd->emotionlasttime + 1 >= time(NULL)) { // not more than 1 per second
@@ -7961,7 +8017,7 @@ ACMD_FUNC(hommutate)
 	}
 
 	if (!message || !*message) {
-		homun_id = 6048 + (rnd() % 4);
+		homun_id = rnd_value<uint16>(MER_EIRA, MER_ELEANOR);
 	} else {
 		homun_id = atoi(message);
 	}
@@ -9077,8 +9133,8 @@ ACMD_FUNC(clone)
 	}
 
 	do {
-		x = sd->bl.x + (rnd() % 10 - 5);
-		y = sd->bl.y + (rnd() % 10 - 5);
+		x = sd->bl.x + rnd_value(-5, 5);
+		y = sd->bl.y + rnd_value(-5, 5);
 	} while (map_getcell(sd->bl.m,x,y,CELL_CHKNOPASS) && i++ < 10);
 
 	if (i >= 10) {
@@ -11078,6 +11134,7 @@ void atcommand_basecommands(void) {
 		ACMD_DEF(npcmove),
 		ACMD_DEF(killable),
 		ACMD_DEF(dropall),
+		ACMD_DEF(stockall),
 		ACMD_DEF(storeall),
 		ACMD_DEF(skillid),
 		ACMD_DEF(useskill),

+ 1 - 1
src/map/battleground.cpp

@@ -1172,7 +1172,7 @@ void bg_queue_join_multi(const char *name, map_session_data *sd, std::vector <ma
 			break;
 		}
 
-		bool r = rnd() % 2 != 0;
+		bool r = rnd_chance(50, 100);
 		std::vector<map_session_data *> *team = r ? &queue->teamb_members : &queue->teama_members;
 
 		if (queue->state == QUEUE_STATE_ACTIVE) {

+ 64 - 36
src/map/clif.cpp

@@ -4,6 +4,8 @@
 
 #include "clif.hpp"
 
+#include <unordered_set>
+
 #include <cstdarg>
 #include <cstdio>
 #include <cstdlib>
@@ -20943,69 +20945,95 @@ void clif_merge_item_open( map_session_data& sd ){
 }
 
 /**
- * Process item merger
- * CZ 096E <size>.W { <index>.W }* (CZ_REQ_MERGE_ITEM)
+ * Process item merge request.
+ * 096E <size>.W { <index>.W }* (CZ_REQ_MERGE_ITEM)
  * @param fd
  * @param sd
  **/
-void clif_parse_merge_item_req(int fd, map_session_data* sd) {
-	struct s_packet_db *info = NULL;
-	unsigned short n = 0, indexes[MAX_INVENTORY] = { 0 }, i, j;
-	unsigned int count = 0;
-	struct item_data *id = NULL;
+void clif_parse_merge_item_req( int fd, map_session_data* sd ){
+	struct PACKET_CZ_REQ_MERGE_ITEM* p = (struct PACKET_CZ_REQ_MERGE_ITEM*)RFIFOP( fd, 0 );
 
-	nullpo_retv(sd);
-	if (!clif_session_isValid(sd))
-		return;
-	if (!(info = &packet_db[RFIFOW(fd,0)]) || info->len == 0)
+	int count = ( p->packetLength - sizeof( *p ) ) / sizeof( p->indices[0] );
+
+	// No item need to be merged
+	if( count < 2 ){
+		clif_msg( sd, MERGE_ITEM_NOT_AVAILABLE );
 		return;
+	}
 
-	n = (RFIFOW(fd, info->pos[0]) - 4) / 2;
+	uint16 idx_main = server_index( p->indices[0] );
 
-	if (n < 2) { // No item need to be merged
-		clif_msg(sd, MERGE_ITEM_NOT_AVAILABLE);
+	if( idx_main >= MAX_INVENTORY ){
 		return;
 	}
 
-	for (i = 0, j = 0; i < n; i++) {
-		uint16 idx = server_index( RFIFOW( fd, info->pos[1] + i * 2 ) );
+	if( !clif_merge_item_check( sd->inventory_data[idx_main], &sd->inventory.u.items_inventory[idx_main] ) ){
+		clif_msg( sd, MERGE_ITEM_NOT_AVAILABLE );
+		return;
+	}
+
+	// Ensure each index only comes once
+	std::unordered_set<uint16> indices;
+
+	for( int i = 1; i < count; i++ ){
+		uint16 idx = server_index( p->indices[i] );
 
 		if( idx >= MAX_INVENTORY ){
 			return;
 		}
 
-		if (!clif_merge_item_check((id = sd->inventory_data[idx]), &sd->inventory.u.items_inventory[idx]))
-			continue;
-		indexes[j] = idx;
-		if (j && id->nameid != sd->inventory_data[indexes[0]]->nameid) { // Only can merge 1 kind at once
-			clif_merge_item_ack( *sd, MERGE_ITEM_FAILED_NOT_MERGE );
+		if( sd->inventory_data[idx] == nullptr ){
 			return;
 		}
-		count += sd->inventory.u.items_inventory[idx].amount;
-		j++;
+
+		// Check if it is the same item
+		if( sd->inventory_data[idx]->nameid != sd->inventory_data[idx_main]->nameid ){
+			return;
+		}
+
+		if( !clif_merge_item_check( sd->inventory_data[idx], &sd->inventory.u.items_inventory[idx] ) ){
+			clif_msg( sd, MERGE_ITEM_NOT_AVAILABLE );
+			return;
+		}
+
+		indices.insert( idx );
 	}
 
-	if (n != j || !(id = sd->inventory_data[indexes[0]])) {
-		clif_msg(sd, MERGE_ITEM_NOT_AVAILABLE);
+	if( indices.empty() ){
+		clif_msg( sd, MERGE_ITEM_NOT_AVAILABLE );
 		return;
 	}
 
-	if (count >= (id->stack.amount ? id->stack.amount : MAX_AMOUNT)) {
+	uint32 total_amount = sd->inventory.u.items_inventory[idx_main].amount;
+
+	for( uint16 idx : indices ){
+		total_amount += sd->inventory.u.items_inventory[idx].amount;
+	}
+
+	uint16 stack = sd->inventory_data[idx_main]->stack.amount;
+
+	if( stack == 0 ){
+		stack = MAX_AMOUNT;
+	}
+
+	if( total_amount >= stack ){
 		clif_merge_item_ack( *sd, MERGE_ITEM_FAILED_MAX_COUNT );
 		return;
 	}
 
 	// Merrrrge!!!!
-	for (i = 1; i < n; i++) {
-		unsigned short idx = indexes[i], amt = sd->inventory.u.items_inventory[idx].amount;
-		log_pick_pc(sd, LOG_TYPE_MERGE_ITEM, -amt, &sd->inventory.u.items_inventory[idx]);
-		memset(&sd->inventory.u.items_inventory[idx], 0, sizeof(sd->inventory.u.items_inventory[0]));
-		sd->inventory_data[idx] = NULL;
-		clif_delitem(sd, idx, amt, 0);
+	for( uint16 idx : indices ){
+		uint16 amount = sd->inventory.u.items_inventory[idx].amount;
+
+		log_pick_pc( sd, LOG_TYPE_MERGE_ITEM, -amount, &sd->inventory.u.items_inventory[idx] );
+		memset( &sd->inventory.u.items_inventory[idx], 0, sizeof( sd->inventory.u.items_inventory[0] ) );
+		sd->inventory_data[idx] = nullptr;
+		clif_delitem( sd, idx, amount, 0 );
 	}
-	sd->inventory.u.items_inventory[indexes[0]].amount = count;
 
-	clif_merge_item_ack( *sd, MERGE_ITEM_SUCCESS, indexes[0], count );
+	sd->inventory.u.items_inventory[idx_main].amount = total_amount;
+
+	clif_merge_item_ack( *sd, MERGE_ITEM_SUCCESS, idx_main, total_amount );
 }
 
 /**
@@ -23561,11 +23589,11 @@ void clif_parse_laphine_upgrade( int fd, map_session_data* sd ){
 			item->refine = rnd_value( upgrade->resultRefineMinimum, upgrade->resultRefineMaximum );
 		}else{
 			// Otherwise it can only be upgraded until the maximum, but not downgraded
-			item->refine = rnd_value( item->refine, upgrade->resultRefineMaximum );
+			item->refine = rnd_value<uint16>( item->refine, upgrade->resultRefineMaximum );
 		}
 	}else if( upgrade->resultRefineMinimum > 0 ){
 		// No maximum has been specified, so it can be anything between minimum and MAX_REFINE
-		item->refine = rnd_value( upgrade->resultRefineMinimum, MAX_REFINE );
+		item->refine = rnd_value<uint16>( upgrade->resultRefineMinimum, MAX_REFINE );
 	}
 
 	// Log retrieving the item again -> with the new options

+ 1 - 2
src/map/clif_packetdb.hpp

@@ -1916,7 +1916,7 @@
 	parseable_packet(0x0916,26,clif_parse_GuildInvite2,2);
 	parseable_packet(0x091d,41,clif_parse_PartyBookingRegisterReq,2,4,6);
 	// Merge Item
-	parseable_packet(0x096E,-1,clif_parse_merge_item_req,2,4); // CZ_REQ_MERGE_ITEM
+	parseable_packet( HEADER_CZ_REQ_MERGE_ITEM, -1, clif_parse_merge_item_req, 0 );
 	parseable_packet(0x0974,2,clif_parse_merge_item_cancel,0); // CZ_CANCEL_MERGE_ITEM
 	parseable_packet(0x0844,2,clif_parse_cashshop_open_request,0);
 	packet(0x0849,16); //clif_cashshop_result
@@ -2061,7 +2061,6 @@
 // 2013-08-07Ragexe
 #if PACKETVER >= 20130807
 	// Merge Item
-	parseable_packet(0x096E,-1,clif_parse_merge_item_req,2,4); // CZ_REQ_MERGE_ITEM
 	parseable_packet(0x0974,2,clif_parse_merge_item_cancel,0); // CZ_CANCEL_MERGE_ITEM
 	packet(0x9CD,8); // ZC_MSG_COLOR
 #endif

+ 1 - 1
src/map/elemental.cpp

@@ -622,7 +622,7 @@ static int elemental_ai_sub_timer(s_elemental_data *ed, map_session_data *sd, t_
 			return 1;
 		}
 
-		if( battle_check_range(&ed->bl,target,view_range) && rnd()%100 < 2 ) { // 2% chance to cast attack skill.
+		if( battle_check_range(&ed->bl,target,view_range) && rnd_chance(2, 100) ) { // 2% chance to cast attack skill.
 			if(	elemental_action(ed,target,tick) )
 				return 1;
 		}

+ 5 - 5
src/map/itemdb.cpp

@@ -2872,7 +2872,7 @@ std::shared_ptr<s_item_group_entry> get_random_itemsubgroup(std::shared_ptr<s_it
 	for (size_t j = 0, max = random->data.size() * 3; j < max; j++) {
 		std::shared_ptr<s_item_group_entry> entry = util::umap_random(random->data);
 
-		if (entry->rate == 0 || rnd() % random->total_rate < entry->rate)	// always return entry for rate 0 ('must' item)
+		if (entry->rate == 0 || rnd_chance<uint32>(entry->rate, random->total_rate))	// always return entry for rate 0 ('must' item)
 			return entry;
 	}
 
@@ -2956,9 +2956,9 @@ static void itemdb_pc_get_itemgroup_sub(map_session_data *sd, bool identify, std
 			if( data->refineMinimum > 0 && data->refineMaximum > 0 ){
 				tmp.refine = rnd_value( data->refineMinimum, data->refineMaximum );
 			}else if( data->refineMinimum > 0 ){
-				tmp.refine = rnd_value( data->refineMinimum, MAX_REFINE );
+				tmp.refine = rnd_value<uint16>( data->refineMinimum, MAX_REFINE );
 			}else if( data->refineMaximum > 0 ){
-				tmp.refine = rnd_value( 1, data->refineMaximum );
+				tmp.refine = rnd_value<uint16>( 1, data->refineMaximum );
 			}else{
 				tmp.refine = 0;
 			}
@@ -4456,7 +4456,7 @@ void s_random_opt_group::apply( struct item& item ){
 		for( size_t j = 0, max = this->slots[static_cast<uint16>(i)].size() * 3; j < max; j++ ){
 			std::shared_ptr<s_random_opt_group_entry> option = util::vector_random( this->slots[static_cast<uint16>(i)] );
 
-			if( rnd() % 10000 < option->chance ){
+			if ( rnd_chance<uint16>(option->chance, 10000) ) {
 				apply_sub( item.option[i], option );
 				break;
 			}
@@ -4481,7 +4481,7 @@ void s_random_opt_group::apply( struct item& item ){
 
 			std::shared_ptr<s_random_opt_group_entry> option = util::vector_random( this->random_options );
 
-			if( rnd() % 10000 < option->chance ){
+			if ( rnd_chance<uint16>(option->chance, 10000) ){
 				apply_sub( item.option[i], option );
 			}
 		}

+ 1 - 0
src/map/itemdb.hpp

@@ -2029,6 +2029,7 @@ enum e_random_item_group {
 	IG_DUN_VOUCHER_BOX1,
 	IG_DUN_VOUCHER_BOX2,
 	IG_BLUEBOXOFQUESTIONS,
+	IG_ENCHANT_STONE_BOX33,
 
 	IG_MAX,
 };

+ 10 - 14
src/map/map.cpp

@@ -1669,7 +1669,7 @@ int map_searchrandfreecell(int16 m,int16 *x,int16 *y,int stack) {
 	}
 	if(free_cell==0)
 		return 0;
-	free_cell = rnd()%free_cell;
+	free_cell = rnd_value(0, free_cell-1);
 	*x = free_cells[free_cell][0];
 	*y = free_cells[free_cell][1];
 	return 1;
@@ -1697,8 +1697,6 @@ int map_search_freecell(struct block_list *src, int16 m, int16 *x,int16 *y, int1
 {
 	int tries, spawn=0;
 	int bx, by;
-	int rx2 = 2*rx+1;
-	int ry2 = 2*ry+1;
 
 	if( !src && (!(flag&1) || flag&2) )
 	{
@@ -1728,7 +1726,7 @@ int map_search_freecell(struct block_list *src, int16 m, int16 *x,int16 *y, int1
 	}
 
 	if (rx >= 0 && ry >= 0) {
-		tries = rx2*ry2;
+		tries = (rx * 2 + 1) * (ry * 2 + 1);
 		if (tries > 100) tries = 100;
 	} else {
 		tries = mapdata->xs*mapdata->ys;
@@ -1736,8 +1734,8 @@ int map_search_freecell(struct block_list *src, int16 m, int16 *x,int16 *y, int1
 	}
 
 	while(tries--) {
-		*x = (rx >= 0)?(rnd()%rx2-rx+bx):(rnd()%(mapdata->xs-2)+1);
-		*y = (ry >= 0)?(rnd()%ry2-ry+by):(rnd()%(mapdata->ys-2)+1);
+		*x = (rx >= 0) ? rnd_value(bx - rx, bx + rx) : rnd_value<int16>(1, mapdata->xs - 1);
+		*y = (ry >= 0) ? rnd_value(by - ry, by + ry) : rnd_value<int16>(1, mapdata->ys - 1);
 
 		if (*x == bx && *y == by)
 			continue; //Avoid picking the same target tile.
@@ -1860,7 +1858,6 @@ bool map_closest_freecell(int16 m, int16 *x, int16 *y, int type, int flag)
  *------------------------------------------*/
 int map_addflooritem(struct item *item, int amount, int16 m, int16 x, int16 y, int first_charid, int second_charid, int third_charid, int flags, unsigned short mob_id, bool canShowEffect)
 {
-	int r;
 	struct flooritem_data *fitem = NULL;
 
 	nullpo_ret(item);
@@ -1870,7 +1867,6 @@ int map_addflooritem(struct item *item, int amount, int16 m, int16 x, int16 y, i
 
 	if (!map_searchrandfreecell(m,&x,&y,flags&2?1:0))
 		return 0;
-	r = rnd();
 
 	CREATE(fitem, struct flooritem_data, 1);
 	fitem->bl.type=BL_ITEM;
@@ -1894,8 +1890,8 @@ int map_addflooritem(struct item *item, int amount, int16 m, int16 x, int16 y, i
 
 	memcpy(&fitem->item,item,sizeof(*item));
 	fitem->item.amount = amount;
-	fitem->subx = (r&3)*3+3;
-	fitem->suby = ((r>>2)&3)*3+3;
+	fitem->subx = rnd_value(1, 4) * 3;
+	fitem->suby = rnd_value(1, 4) * 3;
 	fitem->cleartimer = add_timer(gettick()+battle_config.flooritem_lifetime,map_clearflooritem_timer,fitem->bl.id,0);
 
 	map_addiddb(&fitem->bl);
@@ -2125,8 +2121,9 @@ int map_quit(map_session_data *sd) {
 
 	for (i = 0; i < EQI_MAX; i++) {
 		if (sd->equip_index[i] >= 0)
-			if (pc_isequip(sd,sd->equip_index[i]))
+			if( pc_isequip( sd, sd->equip_index[i] ) != ITEM_EQUIP_ACK_OK ){
 				pc_unequipitem(sd,sd->equip_index[i],2);
+			}
 	}
 
 	// Return loot to owner
@@ -3089,8 +3086,8 @@ int map_random_dir(struct block_list *bl, int16 *x, int16 *y)
 	if (dist < 1) dist =1;
 
 	do {
-		short j = 1 + 2*(rnd()%4); //Pick a random diagonal direction
-		short segment = 1+(rnd()%dist); //Pick a random interval from the whole vector in that direction
+		directions j = static_cast<directions>(1 + 2 * rnd_value(0, 3)); //Pick a random diagonal direction
+		short segment = rnd_value((short)1, dist); //Pick a random interval from the whole vector in that direction
 		xi = bl->x + segment*dirx[j];
 		segment = (short)sqrt((float)(dist2 - segment*segment)); //The complement of the previously picked segment
 		yi = bl->y + segment*diry[j];
@@ -5180,7 +5177,6 @@ bool MapServer::initialize( int argc, char *argv[] ){
 #endif
 	cli_get_options(argc,argv);
 
-	rnd_init();
 	map_config_read(MAP_CONF_NAME);
 
 	if (save_settings == CHARSAVE_NONE)

+ 1 - 0
src/map/map.hpp

@@ -365,6 +365,7 @@ enum e_race2 : uint8{
 	RC2_EP172BATH,
 	RC2_ILLUSION_TURTLE,
 	RC2_RACHEL_SANCTUARY,
+	RC2_ILLUSION_LUANDA,
 	RC2_MAX
 };
 

+ 1 - 1
src/map/mercenary.cpp

@@ -421,7 +421,7 @@ bool mercenary_dead(s_mercenary_data *md) {
 void mercenary_killbonus(s_mercenary_data *md) {
 	std::vector<sc_type> scs = { SC_MERC_FLEEUP, SC_MERC_ATKUP, SC_MERC_HPUP, SC_MERC_SPUP, SC_MERC_HITUP };
 
-	sc_start(&md->bl,&md->bl, util::vector_random(scs), 100, rnd() % 5, 600000);
+	sc_start(&md->bl,&md->bl, util::vector_random(scs), 100, rnd_value(1, 5), 600000);
 }
 
 /**

+ 1 - 1
src/map/mob.cpp

@@ -5194,7 +5194,7 @@ static int mob_read_sqldb(void)
 	for( uint8 fi = 0; fi < ARRAYLENGTH(mob_db_name); ++fi ) {
 		// retrieve all rows from the mob database
 		if( SQL_ERROR == Sql_Query(mmysql_handle, "SELECT `id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`sp`,`base_exp`,`job_exp`,`mvp_exp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,"
-			"`racegroup_goblin`,`racegroup_kobold`,`racegroup_orc`,`racegroup_golem`,`racegroup_guardian`,`racegroup_ninja`,`racegroup_gvg`,`racegroup_battlefield`,`racegroup_treasure`,`racegroup_biolab`,`racegroup_manuk`,`racegroup_splendide`,`racegroup_scaraba`,`racegroup_ogh_atk_def`,`racegroup_ogh_hidden`,`racegroup_bio5_swordman_thief`,`racegroup_bio5_acolyte_merchant`,`racegroup_bio5_mage_archer`,`racegroup_bio5_mvp`,`racegroup_clocktower`,`racegroup_thanatos`,`racegroup_faceworm`,`racegroup_hearthunter`,`racegroup_rockridge`,`racegroup_werner_lab`,`racegroup_temple_demon`,`racegroup_illusion_vampire`,`racegroup_malangdo`,`racegroup_ep172alpha`,`racegroup_ep172beta`,`racegroup_ep172bath`,`racegroup_illusion_turtle`,`racegroup_rachel_sanctuary`,"
+			"`racegroup_goblin`,`racegroup_kobold`,`racegroup_orc`,`racegroup_golem`,`racegroup_guardian`,`racegroup_ninja`,`racegroup_gvg`,`racegroup_battlefield`,`racegroup_treasure`,`racegroup_biolab`,`racegroup_manuk`,`racegroup_splendide`,`racegroup_scaraba`,`racegroup_ogh_atk_def`,`racegroup_ogh_hidden`,`racegroup_bio5_swordman_thief`,`racegroup_bio5_acolyte_merchant`,`racegroup_bio5_mage_archer`,`racegroup_bio5_mvp`,`racegroup_clocktower`,`racegroup_thanatos`,`racegroup_faceworm`,`racegroup_hearthunter`,`racegroup_rockridge`,`racegroup_werner_lab`,`racegroup_temple_demon`,`racegroup_illusion_vampire`,`racegroup_malangdo`,`racegroup_ep172alpha`,`racegroup_ep172beta`,`racegroup_ep172bath`,`racegroup_illusion_turtle`,`racegroup_rachel_sanctuary`,`racegroup_illusion_luanda`,"
 			"`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`damage_taken`,`ai`,`class`,"
 			"`mode_canmove`,`mode_looter`,`mode_aggressive`,`mode_assist`,`mode_castsensoridle`,`mode_norandomwalk`,`mode_nocast`,`mode_canattack`,`mode_castsensorchase`,`mode_changechase`,`mode_angry`,`mode_changetargetmelee`,`mode_changetargetchase`,`mode_targetweak`,`mode_randomtarget`,`mode_ignoremelee`,`mode_ignoremagic`,`mode_ignoreranged`,`mode_mvp`,`mode_ignoremisc`,`mode_knockbackimmune`,`mode_teleportblock`,`mode_fixeditemdrop`,`mode_detector`,`mode_statusimmune`,`mode_skillimmune`,"
 			"`mvpdrop1_item`,`mvpdrop1_rate`,`mvpdrop1_option`,`mvpdrop1_index`,`mvpdrop2_item`,`mvpdrop2_rate`,`mvpdrop2_option`,`mvpdrop2_index`,`mvpdrop3_item`,`mvpdrop3_rate`,`mvpdrop3_option`,`mvpdrop3_index`,"

+ 8 - 1
src/map/packets.hpp

@@ -475,6 +475,12 @@ struct PACKET_ZC_ACK_SE_CASH_ITEM_LIST2{
 	struct PACKET_ZC_ACK_SE_CASH_ITEM_LIST2_sub items[];
 } __attribute__((packed));
 
+struct PACKET_CZ_REQ_MERGE_ITEM{
+	int16 packetType;
+	int16 packetLength;
+	uint16 indices[];
+} __attribute__((packed));
+
 // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
 #if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
 	#pragma pack( pop )
@@ -516,7 +522,8 @@ DEFINE_PACKET_HEADER(CZ_REQ_SE_CASH_TAB_CODE, 0x846)
 DEFINE_PACKET_HEADER(ZC_ACK_SE_CASH_ITEM_LIST2, 0x8c0)
 DEFINE_PACKET_HEADER(ZC_ACK_SCHEDULER_CASHITEM, 0x8ca)
 DEFINE_PACKET_HEADER(ZC_CLEAR_DIALOG, 0x8d6)
-DEFINE_PACKET_HEADER(ZC_ENTRY_QUEUE_INIT, 0x90e);
+DEFINE_PACKET_HEADER(ZC_ENTRY_QUEUE_INIT, 0x90e)
+DEFINE_PACKET_HEADER(CZ_REQ_MERGE_ITEM, 0x96e)
 DEFINE_PACKET_HEADER(ZC_BANKING_CHECK, 0x9a6)
 DEFINE_PACKET_HEADER(ZC_ACK_BANKING_DEPOSIT, 0x9a8)
 DEFINE_PACKET_HEADER(ZC_ACK_BANKING_WITHDRAW, 0x9aa)

+ 1 - 1
src/map/party.cpp

@@ -1278,7 +1278,7 @@ int party_share_loot(struct party_data* p, map_session_data* sd, struct item* it
 			}
 
 			while (count > 0) { //Pick a random member.
-				i = rnd()%count;
+				i = rnd_value(0, count-1);
 
 				if (pc_additem(psd[i],item,item->amount,LOG_TYPE_PICKDROP_PLAYER)) { // Discard this receiver.
 					psd[i] = psd[count-1];

+ 1 - 1
src/map/path.cpp

@@ -106,7 +106,7 @@ int path_blownpos(int16 m,int16 x0,int16 y0,int16 dx,int16 dy,int count)
 				int fy = ( dy != 0 && map_getcellp(mapdata,x0,y0+dy,CELL_CHKPASS) );
 				if( fx && fy )
 				{
-					if(rnd()&1)
+					if(rnd_chance(50, 100))
 						dx=0;
 					else
 						dy=0;

+ 14 - 9
src/map/pc.cpp

@@ -6567,17 +6567,17 @@ int pc_cartitem_amount(map_session_data* sd, int idx, int amount)
 /*==========================================
  * Retrieve an item at index idx from cart.
  *------------------------------------------*/
-void pc_getitemfromcart(map_session_data *sd,int idx,int amount)
+bool pc_getitemfromcart(map_session_data *sd,int idx,int amount)
 {
-	nullpo_retv(sd);
+	nullpo_retr(1, sd);
 
 	if (idx < 0 || idx >= MAX_CART) //Invalid index check [Skotlex]
-		return;
+		return false;
 
 	struct item *item_data=&sd->cart.u.items_cart[idx];
 
 	if (item_data->nameid == 0 || amount < 1 || item_data->amount < amount || sd->state.vending || sd->state.prevend)
-		return;
+		return false;
 
 	enum e_additem_result flag = pc_additem(sd, item_data, amount, LOG_TYPE_NONE);
 
@@ -6588,6 +6588,7 @@ void pc_getitemfromcart(map_session_data *sd,int idx,int amount)
 		clif_additem(sd, idx, amount, flag);
 		clif_cart_additem(sd, idx, amount);
 	}
+	return true;
 }
 
 /*==========================================
@@ -6840,8 +6841,9 @@ enum e_setpos pc_setpos(map_session_data* sd, unsigned short mapindex, int x, in
 		}
 		for(int i = 0; i < EQI_MAX; i++ ) {
 			if( sd->equip_index[i] >= 0 )
-				if( pc_isequip(sd,sd->equip_index[i]) )
+				if( pc_isequip( sd, sd->equip_index[i] ) != ITEM_EQUIP_ACK_OK ){
 					pc_unequipitem(sd,sd->equip_index[i],2);
+				}
 		}
 		if (battle_config.clear_unit_onwarp&BL_PC)
 			skill_clear_unitgroup(&sd->bl);
@@ -9147,8 +9149,9 @@ int pc_resetlvl(map_session_data* sd,int type)
 
 	for(i=0;i<EQI_MAX;i++) { // unequip items that can't be equipped by base 1 [Valaris]
 		if(sd->equip_index[i] >= 0)
-			if(pc_isequip(sd,sd->equip_index[i]))
+			if( pc_isequip( sd, sd->equip_index[i] ) != ITEM_EQUIP_ACK_OK ){
 				pc_unequipitem(sd,sd->equip_index[i],2);
+			}
 	}
 
 	if ((type == 1 || type == 2 || type == 3) && sd->status.party_id)
@@ -10783,8 +10786,9 @@ bool pc_jobchange(map_session_data *sd,int job, char upper)
 
 	for(i=0;i<EQI_MAX;i++) {
 		if(sd->equip_index[i] >= 0)
-			if(pc_isequip(sd,sd->equip_index[i]))
+			if( pc_isequip( sd, sd->equip_index[i] ) != ITEM_EQUIP_ACK_OK ){
 				pc_unequipitem(sd,sd->equip_index[i],2);	// unequip invalid item for class
+			}
 	}
 
 	//Change look, if disguised, you need to undisguise
@@ -11810,7 +11814,6 @@ bool pc_equipitem(map_session_data *sd,short n,int req_pos,bool equipswitch)
 {
 	int i, pos, flag = 0, iflag;
 	struct item_data *id;
-	uint8 res = ITEM_EQUIP_ACK_OK;
 	short* equip_index;
 
 	nullpo_retr(false,sd);
@@ -11840,7 +11843,9 @@ bool pc_equipitem(map_session_data *sd,short n,int req_pos,bool equipswitch)
 	if(battle_config.battle_log && !equipswitch)
 		ShowInfo("equip %u (%d) %x:%x\n",sd->inventory.u.items_inventory[n].nameid,n,id?id->equip:0,req_pos);
 
-	if((res = pc_isequip(sd,n))) {
+	uint8 res = pc_isequip( sd, n );
+
+	if( res != ITEM_EQUIP_ACK_OK ){
 		if( equipswitch ){
 			clif_equipswitch_add( sd, n, req_pos, res );
 		}else{

+ 1 - 1
src/map/pc.hpp

@@ -1438,7 +1438,7 @@ int pc_getcash( map_session_data *sd, int cash, int points, e_log_pick_type type
 enum e_additem_result pc_cart_additem(map_session_data *sd,struct item *item_data,int amount,e_log_pick_type log_type);
 void pc_cart_delitem(map_session_data *sd,int n,int amount,int type,e_log_pick_type log_type);
 void pc_putitemtocart(map_session_data *sd,int idx,int amount);
-void pc_getitemfromcart(map_session_data *sd,int idx,int amount);
+bool pc_getitemfromcart(map_session_data *sd,int idx,int amount);
 int pc_cartitem_amount(map_session_data *sd,int idx,int amount);
 
 bool pc_takeitem(map_session_data *sd,struct flooritem_data *fitem);

+ 9 - 9
src/map/pet.cpp

@@ -710,7 +710,7 @@ int pet_attackskill(struct pet_data *pd, int target_id)
 	if (DIFF_TICK(pd->ud.canact_tick, gettick()) > 0)
 		return 0;
 
-	if (rnd()%100 < (pd->a_skill->rate +pd->pet.intimate*pd->a_skill->bonusrate/1000)) { // Skotlex: Use pet's skill
+	if (rnd_chance((pd->a_skill->rate +pd->pet.intimate*pd->a_skill->bonusrate/1000), 100)) { // Skotlex: Use pet's skill
 		int inf;
 		struct block_list *bl;
 
@@ -782,8 +782,8 @@ int pet_target_check(struct pet_data *pd,struct block_list *bl,int type)
 			rate = 1;
 	}
 
-	if(rnd()%10000 < rate) {
-		if(pd->target_id == 0 || rnd()%10000 < pet_db_ptr->change_target_rate)
+	if(rnd_chance(rate, 10000)) {
+		if(pd->target_id == 0 || rnd_chance<uint16>(pet_db_ptr->change_target_rate, 10000))
 			pd->target_id = bl->id;
 	}
 
@@ -942,7 +942,7 @@ static int pet_performance(map_session_data *sd, struct pet_data *pd)
 		val = 1;
 
 	pet_stop_walking(pd,2000<<8);
-	clif_pet_performance(pd, rnd()%val + 1);
+	clif_pet_performance(pd, rnd_value(1, val));
 	pet_lootitem_drop(pd,NULL);
 
 	return 1;
@@ -1315,7 +1315,7 @@ int pet_catch_process2(map_session_data* sd, int target_id)
 	if(battle_config.pet_catch_rate != 100)
 		pet_catch_rate = (pet_catch_rate*battle_config.pet_catch_rate)/100;
 
-	if(rnd()%10000 < pet_catch_rate) {
+	if(rnd_chance(pet_catch_rate, 10000)) {
 		achievement_update_objective(sd, AG_TAMING, 1, md->mob_id);
 		unit_remove_map(&md->bl,CLR_OUTSIGHT);
 		status_kill(&md->bl);
@@ -1672,10 +1672,10 @@ static int pet_randomwalk(struct pet_data *pd,t_tick tick)
 			d = 5;
 
 		for(i = 0; i < retrycount; i++) {
-			int r = rnd(), x, y;
+			int x, y;
 
-			x = pd->bl.x+r%(d*2+1)-d;
-			y = pd->bl.y+r/(d*2+1)%(d*2+1)-d;
+			x = pd->bl.x + rnd_value(-d, d);
+			y = pd->bl.y + rnd_value(-d, d);
 
 			if(map_getcell(pd->bl.m,x,y,CELL_CHKPASS) && unit_walktoxy(&pd->bl,x,y,0)) {
 				pd->move_fail_count = 0;
@@ -1702,7 +1702,7 @@ static int pet_randomwalk(struct pet_data *pd,t_tick tick)
 				c += pd->status.speed;
 		}
 
-		pd->next_walktime = tick+rnd()%1000+MIN_RANDOMWALKTIME+c;
+		pd->next_walktime = tick + MIN_RANDOMWALKTIME + c + rnd_value(0, 999);
 
 		return 1;
 	}

+ 1 - 1
src/map/quest.cpp

@@ -775,7 +775,7 @@ void quest_update_objective(map_session_data *sd, struct mob_data* md)
 		for (const auto &it : qi->dropitem) {
 			if (it->mob_id != 0 && it->mob_id != md->mob_id)
 				continue;
-			if (it->rate < 10000 && rnd()%10000 >= it->rate)
+			if (it->rate < 10000 && !rnd_chance<uint16>(it->rate, 10000))
 				continue; // TODO: Should this be affected by server rates?
 			if (!item_db.exists(it->nameid))
 				continue;

+ 49 - 13
src/map/script.cpp

@@ -5582,17 +5582,17 @@ BUILDIN_FUNC(rand)
 		min = script_getnum(st,2);
 		if( max < min )
 			SWAP(min, max);
-		range = max - min + 1;
+		range = max;
 	}
 	else
 	{// range
 		min = 0;
-		range = script_getnum(st,2);
+		range = script_getnum( st, 2 ) - 1;
 	}
 	if( range <= 1 )
 		script_pushint(st, min);
 	else
-		script_pushint(st, rnd()%range + min);
+		script_pushint( st, rnd_value( min, range ) );
 
 	return SCRIPT_CMD_SUCCESS;
 }
@@ -5656,8 +5656,8 @@ static int buildin_areawarp_sub(struct block_list *bl,va_list ap)
 
 		// find a suitable map cell
 		do {
-			tx = rnd()%(x3-x2+1)+x2;
-			ty = rnd()%(y3-y2+1)+y2;
+			tx = rnd_value(x2, x3);
+			ty = rnd_value(y2, y3);
 			j++;
 		} while( map_getcell(m,tx,ty,CELL_CHKNOPASS) && j < max );
 
@@ -5815,8 +5815,8 @@ BUILDIN_FUNC(warpparty)
 
 			i = 0;
 			do {
-				x = rnd()%(mapdata->xs - 2) + 1;
-				y = rnd()%(mapdata->ys - 2) + 1;
+				x = rnd_value(1, mapdata->xs - 1);
+				y = rnd_value(1, mapdata->ys - 1);
 			} while ((map_getcell(m,x,y,CELL_CHKNOPASS) || (!battle_config.teleport_on_portal && npc_check_areanpc(1,m,x,y,1))) && (i++) < 1000);
 
 			if (i >= 1000) {
@@ -5881,8 +5881,8 @@ BUILDIN_FUNC(warpparty)
 					uint8 attempts = 10;
 
 					do {
-						nx = x0 + rnd()%(x1 - x0 + 1);
-						ny = y0 + rnd()%(y1 - y0 + 1);
+						nx = x0 + rnd_value(x0, x1);
+						ny = y0 + rnd_value(y0, y1);
 					} while ((--attempts) > 0 && !map_getcell(m, nx, ny, CELL_CHKPASS));
 
 					if (attempts != 0) { //Keep the original coordinates if fails to find a valid cell within the range
@@ -10693,8 +10693,8 @@ BUILDIN_FUNC(savepoint)
 			x0 = x - dx, y0 = y - dy;
 		uint8 n = 10;
 		do {
-			x = x0 + rnd()%(x1-x0+1);
-			y = y0 + rnd()%(y1-y0+1);
+			x = rnd_value(x0, x1);
+			y = rnd_value(y0, y1);
 		} while (m != -1 && (--n) > 0 && !map_getcell(m, x, y, CELL_CHKPASS));
 	}
 
@@ -12536,7 +12536,7 @@ BUILDIN_FUNC(homunculus_evolution)
  *------------------------------------------*/
 BUILDIN_FUNC(homunculus_mutate)
 {
-	int homun_id;
+	uint16 homun_id;
 	TBL_PC *sd;
 
 	if( !script_rid2sd(sd) || sd->hd == NULL )
@@ -12545,7 +12545,7 @@ BUILDIN_FUNC(homunculus_mutate)
 	if(script_hasdata(st,2))
 		homun_id = script_getnum(st,2);
 	else
-		homun_id = 6048 + (rnd() % 4);
+		homun_id = rnd_value<uint16>(MER_EIRA, MER_ELEANOR);
 
 	if( sd->hd->homunculus.vaporize == HOM_ST_MORPH ) {
 		int m_class = hom_class2mapid(sd->hd->homunculus.class_);
@@ -27016,6 +27016,41 @@ BUILDIN_FUNC(has_autoloot) {
 	return SCRIPT_CMD_SUCCESS;
 }
 
+// ===================================
+// *autoloot({<rate>{, <char_id>}});
+// This command sets the rate of autoloot.
+// If no rate is provided and the user has autoloot disabled it will default to 10000 = 100% (enabled) or
+// if the user has autoloot enabled it will default to 0 = 0% (disabled).
+// Returns true on success and false on failure.
+// ===================================
+BUILDIN_FUNC(autoloot) {
+	map_session_data *sd = nullptr;
+
+	if (!script_charid2sd(3, sd)) {
+		script_pushint(st, false);
+		return SCRIPT_CMD_FAILURE;
+	}
+
+	int rate;
+
+	if (script_hasdata(st, 2)) {
+		rate = script_getnum(st, 2);
+
+		if (rate < 0 || rate > 10000) {
+			ShowWarning("buildin_autoloot: Invalid rate value %d, should be between 0 ~ 10000.\n", rate);		
+			script_pushint(st, false);
+			return SCRIPT_CMD_FAILURE;
+		}
+	} else {
+		rate = (sd->state.autoloot > 0 ? 0 : 10000);
+	}
+
+	sd->state.autoloot = rate;
+	script_pushint(st, true);
+
+	return SCRIPT_CMD_SUCCESS;
+}
+
 BUILDIN_FUNC(opentips){
 #if PACKETVER < 20171122
 	ShowError( "buildin_opentips: This command requires PACKETVER 20171122 or newer.\n" );
@@ -27789,6 +27824,7 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(isdead, "?"),
 	BUILDIN_DEF(macro_detector, "?"),
 	BUILDIN_DEF(has_autoloot,"?"),
+	BUILDIN_DEF(autoloot,"??"),
 	BUILDIN_DEF(opentips, "i?"),
 
 #include <custom/script_def.inc>

+ 34 - 0
src/map/script.hpp

@@ -2088,6 +2088,40 @@ enum e_hat_effects : int16{
 	HAT_EF_ALICE_TEA,
 	HAT_EF_C_DARK_LORD_CLOAK,
 	HAT_EF_C_SAKURA_FUBUKI,
+	HAT_EF_C_DARK_LORD_MANTEAU,
+	HAT_EF_DECORATION_OF_MUSIC,
+	HAT_EF_2023RTC_S_ROBE1,
+	HAT_EF_2023RTC_S_ROBE2,
+	HAT_EF_2023RTC_S_ROBE3,
+	HAT_EF_C_CONSECRATE_F_AUREOLA,
+	HAT_EF_C_BULB_WREATH,
+	HAT_EF_MD_HOL_BARRIER1,
+	HAT_EF_MD_HOL_BARRIER2,
+	HAT_EF_MD_HOL_BARRIER3,
+	HAT_EF_MD_HOL_BARRIER4,
+	HAT_EF_MD_HOL_BARRIER5,
+	HAT_EF_MD_HOL_BARRIER6,
+	HAT_EF_MD_HOL_BARRIER7,
+	HAT_EF_MD_HOL_BARRIER8,
+	HAT_EF_MD_HOL_BARRIER9,
+	HAT_EF_MD_HOL_BARRIER10,
+	HAT_EF_MD_HOL_BARRIER11,
+	HAT_EF_MD_HOL_BARRIER12,
+	HAT_EF_MD_HOL_BARRIER13,
+	HAT_EF_MD_HOL_BARRIER14,
+	HAT_EF_MD_HOL_BARRIER15,
+	HAT_EF_MD_HOL_BARRIER16,
+	HAT_EF_MD_HOL_BARRIER17,
+	HAT_EF_MD_HOL_BARRIER18,
+	HAT_EF_MD_HOL_BARRIER19,
+	HAT_EF_MD_HOL_BARRIER20,
+	HAT_EF_C_FLUTTERING_HAZE,
+	HAT_EF_EFST_CINNAMON,
+	HAT_EF_AUTUMN_FULL_MOON,
+	HAT_EF_NIFLHEIM_NIGHT_SKY,
+	HAT_EF_C_ROS2023_CAPE_1,
+	HAT_EF_C_ROS2023_CAPE_2,
+	HAT_EF_C_15TH_NOV_HELMET,
 	HAT_EF_MAX
 };
 

+ 37 - 0
src/map/script_constants.hpp

@@ -964,6 +964,7 @@
 	export_constant2("Eff_Heat",SC_BURNT);
 	export_constant2("Eff_Deepsleep",SC_DEEPSLEEP);
 	export_constant2("Eff_WhiteImprison",SC_WHITEIMPRISON);
+	export_constant2("Eff_Hallucination",SC_HALLUCINATION);
 
 	export_constant2("SC_ALL",SC_NONE);
 
@@ -4223,6 +4224,7 @@
 	export_constant(RC2_EP172BATH);
 	export_constant(RC2_ILLUSION_TURTLE);
 	export_constant(RC2_RACHEL_SANCTUARY);
+	export_constant(RC2_ILLUSION_LUANDA);
 	export_constant(RC2_MAX);
 
 	/* monster ai */
@@ -6973,6 +6975,7 @@
 	export_constant(IG_DUN_VOUCHER_BOX1);
 	export_constant(IG_DUN_VOUCHER_BOX2);
 	export_constant(IG_BLUEBOXOFQUESTIONS);
+	export_constant(IG_ENCHANT_STONE_BOX33);
 
 	/* unit stop walking */
 	export_constant(USW_NONE);
@@ -9581,6 +9584,40 @@
 	export_constant(HAT_EF_ALICE_TEA);
 	export_constant(HAT_EF_C_DARK_LORD_CLOAK);
 	export_constant(HAT_EF_C_SAKURA_FUBUKI);
+	export_constant(HAT_EF_C_DARK_LORD_MANTEAU);
+	export_constant(HAT_EF_DECORATION_OF_MUSIC);
+	export_constant(HAT_EF_2023RTC_S_ROBE1);
+	export_constant(HAT_EF_2023RTC_S_ROBE2);
+	export_constant(HAT_EF_2023RTC_S_ROBE3);
+	export_constant(HAT_EF_C_CONSECRATE_F_AUREOLA);
+	export_constant(HAT_EF_C_BULB_WREATH);
+	export_constant(HAT_EF_MD_HOL_BARRIER1);
+	export_constant(HAT_EF_MD_HOL_BARRIER2);
+	export_constant(HAT_EF_MD_HOL_BARRIER3);
+	export_constant(HAT_EF_MD_HOL_BARRIER4);
+	export_constant(HAT_EF_MD_HOL_BARRIER5);
+	export_constant(HAT_EF_MD_HOL_BARRIER6);
+	export_constant(HAT_EF_MD_HOL_BARRIER7);
+	export_constant(HAT_EF_MD_HOL_BARRIER8);
+	export_constant(HAT_EF_MD_HOL_BARRIER9);
+	export_constant(HAT_EF_MD_HOL_BARRIER10);
+	export_constant(HAT_EF_MD_HOL_BARRIER11);
+	export_constant(HAT_EF_MD_HOL_BARRIER12);
+	export_constant(HAT_EF_MD_HOL_BARRIER13);
+	export_constant(HAT_EF_MD_HOL_BARRIER14);
+	export_constant(HAT_EF_MD_HOL_BARRIER15);
+	export_constant(HAT_EF_MD_HOL_BARRIER16);
+	export_constant(HAT_EF_MD_HOL_BARRIER17);
+	export_constant(HAT_EF_MD_HOL_BARRIER18);
+	export_constant(HAT_EF_MD_HOL_BARRIER19);
+	export_constant(HAT_EF_MD_HOL_BARRIER20);
+	export_constant(HAT_EF_C_FLUTTERING_HAZE);
+	export_constant(HAT_EF_EFST_CINNAMON);
+	export_constant(HAT_EF_AUTUMN_FULL_MOON);
+	export_constant(HAT_EF_NIFLHEIM_NIGHT_SKY);
+	export_constant(HAT_EF_C_ROS2023_CAPE_1);
+	export_constant(HAT_EF_C_ROS2023_CAPE_2);
+	export_constant(HAT_EF_C_15TH_NOV_HELMET);
 
 	/* pet catch */
 	export_constant(PET_CATCH_UNIVERSAL);

+ 4 - 4
src/map/skill.cpp

@@ -1927,7 +1927,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
 		break;
 	case LG_HESPERUSLIT:
 		if( pc_checkskill(sd,LG_PINPOINTATTACK) > 0 && sc && sc->getSCE(SC_BANDING) && sc->getSCE(SC_BANDING)->val2 > 5 )
-			skill_castend_damage_id(src,bl,LG_PINPOINTATTACK,rnd_value(1, pc_checkskill(sd,LG_PINPOINTATTACK)),tick,0);
+			skill_castend_damage_id(src,bl,LG_PINPOINTATTACK, rnd_value<uint16>(1, pc_checkskill(sd,LG_PINPOINTATTACK)),tick,0);
 		break;
 	case SR_DRAGONCOMBO:
 		sc_start(src,bl, SC_STUN, 1 + skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
@@ -2332,7 +2332,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
 			uint16 autospl_skill_lv = it.lv ? it.lv : 1;
 
 			if (it.flag & AUTOSPELL_FORCE_RANDOM_LEVEL)
-				autospl_skill_lv = rnd_value( 1, autospl_skill_lv );
+				autospl_skill_lv = rnd_value<uint16>( 1, autospl_skill_lv );
 
 			int rate = (!sd->state.arrow_atk) ? it.rate : it.rate / 2;
 
@@ -2479,7 +2479,7 @@ int skill_onskillusage(map_session_data *sd, struct block_list *bl, uint16 skill
 		uint16 skill_lv = it.lv ? it.lv : 1;
 
 		if (it.flag & AUTOSPELL_FORCE_RANDOM_LEVEL)
-			skill_lv = rnd_value( 1, skill_lv ); //random skill_lv
+			skill_lv = rnd_value<uint16>( 1, skill_lv ); //random skill_lv
 
 		e_cast_type type = skill_get_casttype(skill);
 
@@ -2699,7 +2699,7 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list *
 			uint16 autospl_skill_id = it.id, autospl_skill_lv = it.lv ? it.lv : 1;
 
 			if (it.flag & AUTOSPELL_FORCE_RANDOM_LEVEL)
-				autospl_skill_lv = rnd_value( 1, autospl_skill_lv );
+				autospl_skill_lv = rnd_value<uint16>( 1, autospl_skill_lv );
 
 			int autospl_rate = it.rate;
 

+ 2 - 2
src/map/unit.cpp

@@ -2603,7 +2603,7 @@ int unit_calc_pos(struct block_list *bl, int tx, int ty, uint8 dir)
 
 	nullpo_ret(ud);
 
-	if(dir > 7)
+	if(dir >= DIR_MAX || dir <= DIR_CENTER)
 		return 1;
 
 	ud->to_x = tx;
@@ -2630,7 +2630,7 @@ int unit_calc_pos(struct block_list *bl, int tx, int ty, uint8 dir)
 			int i;
 
 			for( i = 0; i < 12; i++ ) {
-				int k = rnd()%8; // Pick a Random Dir
+				int k = rnd_value<int>(DIR_NORTH, DIR_NORTHEAST); // Pick a Random Dir
 
 				dx = -dirx[k] * 2;
 				dy = -diry[k] * 2;

Some files were not shown because too many files changed in this diff