Compare commits

..

20 Commits

Author SHA1 Message Date
Lemongrass3110
036a5b1950 Refactored safe math to templates
This way it can also be used for smaller numeric types.
2024-02-26 22:16:09 +01:00
Pokye
eb308dcad2 Implemented Dialog Types (#8110)
Fixes #8109

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-02-26 22:08:52 +01:00
AoShinHo
e196eadcaa Suppressing C4018 (#8123)
* suppressing warning C4018

* dinamically get decltype suggested by vstumpf
2024-02-24 00:15:28 -08:00
BotGigo
464c122b40 Correct some conditions (#8142)
Correct comparations in conditions for some base level achievements to work with the multi level check of achievements.
2024-02-20 00:07:12 -08:00
Atemo
f9073574d3 Updated map and items up to febuary 2024 (#8136)
* Implemented equipment and etc items up to 05022024
* Added 1@vrsn map
2024-02-18 15:20:19 +01:00
Kakaroto
9305da45dc Hateffect update (#8124)
Co-authored-by: Pokye <98105181+Pokye@users.noreply.github.com>
2024-02-17 20:17:44 +01:00
Atemo
a0bbbf1729 Rebalance Wind Hawk 20240205 (#8133)
* Gale Storm
- Reduces skill cooldown from 1.2 seconds to 0.7 seconds.
- Increases base damage from 10000%Atk to 13500%Atk based on level 5.

* Crescive Bolt
- Increases base damage from 9400%Atk to 13500%Atk based on level 10.
- Increases damage bonus on standing still from 10% per stack (up to 30% on 3 stacks) to 20% per stack (up to 60% on 3 stacks).
- Changes sound effect.

* Calamity Gale
- Reduces AP consumption from 200 to 125.
- Reduces skill cooldown from 180 seconds to 60 seconds.

* Added missing clif_skill_nodamage for WH_GALESTORM

Thanks to @Haydrich !
2024-02-17 20:14:22 +01:00
Atemo
83067220bc Rebalance Arch Mage 20240205 (#8131)
* Climax
- Reduces AP consumption from 150 to 125.
- Reduces skill cooldown from 300 seconds to 60 seconds.

* Floral Flare Road
- Increases global cooldown from 0.25 seconds to 0.75 seconds based on level 5.

* Tornado Storm
- Increases global cooldown from 0.25 seconds to 0.75 seconds based on level 5.

* Stratum Tremor
- Increases global cooldown from 0.25 seconds to 0.75 seconds based on level 5.

* Rain of Crystal
- Increases global cooldown from 0.25 seconds to 0.75 seconds based on level 5.

* Crimson Arrow
- Increases base damage from 1750%/3500%Matk to 2000%/3750%Matk based on level 5.

* Storm Cannon
- Increases base damage from 6000%/7500%(Climax)Matk to 7750%/9250%(Climax)Matk based on level 5.

* Frozen Slash
- Increases base damage from 4900%/6800%(Climax)Matk to 5200%/7100%(Climax)Matk based on level 5.

* Mystery Illusion
- Increases global cooldown from 0.5 seconds to 0.75 seconds based on level 5.

* All Bloom
- Increases global cooldown from 0.5 seconds to 1 second based on level 5.

* Violent Quake
- Increases global cooldown from 0.5 seconds to 1 second based on level 5.

* Soul Vulcan Strike
- Increases base damage from 1250%Matk to 1500%Matk per hit based on level 5.

* Astral Strike
- Increases global cooldown from 0.5 seconds to 1 second based on level 10.
2024-02-17 18:35:38 +01:00
Atemo
893b133444 Rebalance Shadow Cross 20240205 (#8134)
* Savage Impact
- Increases base damage from 900%/1100%(Shadow Exceed)Atk to 1050%/1250%(Shadow Exceed)Atk per hit based on level 10.

* Shadow Stab
- Unifies number of hit from 2/3(Cloaking Exceed) hits to 3 hits regardless of Cloaking Exceed buff.
- Increases base damage from 1750%/2000%(Cloaking Exceed)Atk to 2750%/3250%(Cloaking Exceed)Atk per hit based on level 5.

* Eternal Slash
- Attack count no longer be removed by Dispell or Clearance.
- Increases base damage from 1325%/1825%(Shadow Exceed)Atk to 1500%/2100%(Shadow Exceed)Atk per hit based on level 5.
2024-02-17 14:55:47 +01:00
Atemo
8e2ee12b18 Rebalance Cardinal 20240205 (#8132)
* Framen
- Increases base damage from 4750+(Fidus Animus skill level x 25)%/5250+(Fidus Animus skill level x 25)%(demon and undead)Matk
  to
  6500+(Fidus Animus skill level x 25)%/6750+(Fidus Animus skill level x 25)%(demon and undead)Matk
  based on level 5.

* Pneumaticus Procella
- Reduces AP consumption from 30 to 20.
- Changes damage property from holy to neutral.
- Addes global cooldown by 0.5 seconds.
- Changes sound effect.
2024-02-17 14:33:59 +01:00
Atemo
c43f7b369e Archmage skill corrections (#8120)
Corrections of several Archmage skills and High wizard skill HW_MAGICPOWER :
    AG_FROZEN_SLASH : 3 hits are displayed instead of a single hit.
    TargetType of 4th ground skills is now Ground. Ground skills don't trigger HW_SOULDRAIN. Skills affected :
        AG_VIOLENT_QUAKE_ATK
        AG_ALL_BLOOM_ATK
        AG_ALL_BLOOM_ATK2
        AG_CRYSTAL_IMPACT_ATK
        AG_ASTRAL_STRIKE_ATK
    Fixed cast time of HW_MAGICPOWER is not affected by item bonus anymore.
2024-01-31 16:13:57 +01:00
Atemo
e965e2794b Added null pointer checks in map_delblock (#7930) 2024-01-26 15:02:51 +01:00
Atemo
04904c0947 Corrected Shrink Stuns target (#8075)
Fixed #8072

Thanks to @LadyNanuia
2024-01-26 15:00:36 +01:00
Atemo
9f90e4e9e1 Rebalance Hyper Novice 20221221 (#8111)
* Double Bowling Bash
- Reduces knock-back distance from 2 cells to 1 cell.
- Increases base damage from 2650%Atk to 3200%Atk per hit based on level 10.

* Mega Sonic Blow
- Increases cooldown from 0.3 seconds to 0.35 seconds.
- Increases base damage from 5350%Atk to 8400%Atk based on level 10.

* Shield Chain Rush
- Increases cooldown from 0.3 seconds to 0.35 seconds.
- Increases base damage from 5100%Atk to 5700%Atk based on level 10.

* Spiral Pierce Max
- Increases cooldown from 0.3 seconds to 0.35 seconds.
- Increases base damage from 4050%Atk to 8700%Atk based on level 10.

* Hell's Drive
- Increases SP consumption from 98 to 115 based on level 10.

* Ground Gravitation
- Increases SP consumption from 100 to 120 based on level 10.

* Breaking Limit
- Increases damage bonus of Mega Sonic Blow and Spiral Pierce Max from 70% to 100%.
- Increases damage bonus of Double Bowling Bash and Shield Chain Rush from 50% to 70%.
2024-01-19 14:35:17 +01:00
Ahmed Shawky
51ca9c4923 Added illusion Merchant (#7854) 2024-01-18 20:31:18 +01:00
Atemo
c8ab735348 Updated Level 250/50 to 260/55 (#8108)
Updated Level 250/50 to 260/55.
Hp and Sp are unknown.
Additionally updated Super_Novice_E job level from 50 to 70 (note: this class doesn't get additional stats by job level).
2024-01-18 15:53:29 +01:00
Lemongrass3110
72b3d1bf0e Initial implementation of Hyper Novice (#8101)
Taken from #7024

Co-authored-by: munkrej <schmunk@posteo.de>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-01-17 21:20:20 +01:00
Lemongrass3110
d3fcb66d3a Fixed some memleaks (#8107)
Improved memleak location reporting for parse_script
2024-01-17 18:58:13 +01:00
Atemo
f5909c3d78 Update renewal Base exp and Job exp (#8103)
* Updated Base exp
* Updated job exp
2024-01-17 14:37:05 +01:00
Atemo
5ad81d67ea Corrected the boss spawn in lhz_dun_n (#8099)
* Removed the use of killedrid in the script in case the killer is not a player.
2024-01-16 13:56:27 +01:00
41 changed files with 6469 additions and 1389 deletions

View File

@@ -1610,5 +1610,8 @@ map: 3@vrpop
// Depth biosphere 2nd floor
map: bl_depth2
// Fantasy Series Sonic Collaboration - Dr. Eggman's Secret Base
map: 1@vrsn
//------------------------- Clone Maps ---------------------------
//------------------------- Extra Maps ---------------------------

View File

@@ -24,9 +24,9 @@
###########################################################################
# - Item Item that triggers Laphine Upgrade.
# RandomOptionGroup Name of the random option group that will be applied. (Default: none)
# ResultRefine: Refine level after the upgrade. (Default: none)
# - Level Refine level.
# Rate Rate per level. The total rate is the sum of the rates. (Default: 1)
# ResultRefine Absolute refine level after the upgrade. (Default: none)
# ResultRefineMinimum Minimum refine level after the upgrade. (Default: none)
# ResultRefineMaximum Maximum refine level after the upgrade. (Default: none)
# MinimumRefine Minimum refine level of the required items. (Default: 0)
# MaximumRefine Maximum refine level of the required items. (Default: MAX_REFINE)
# RequiredRandomOptions How many random options have to be in the item? (Default: 0)
@@ -37,4 +37,4 @@
Header:
Type: LAPHINE_UPGRADE_DB
Version: 2
Version: 1

View File

@@ -24,9 +24,9 @@
###########################################################################
# - Item Item that triggers Laphine Upgrade.
# RandomOptionGroup Name of the random option group that will be applied. (Default: none)
# ResultRefine: Refine level after the upgrade. (Default: none)
# - Level Refine level.
# Rate Rate per level. The total rate is the sum of the rates. (Default: 1)
# ResultRefine Absolute refine level after the upgrade. (Default: none)
# ResultRefineMinimum Minimum refine level after the upgrade. (Default: none)
# ResultRefineMaximum Maximum refine level after the upgrade. (Default: none)
# MinimumRefine Minimum refine level of the required items. (Default: 0)
# MaximumRefine Maximum refine level of the required items. (Default: MAX_REFINE)
# RequiredRandomOptions How many random options have to be in the item? (Default: 0)
@@ -37,7 +37,7 @@
Header:
Type: LAPHINE_UPGRADE_DB
Version: 2
Version: 1
Footer:
Imports:

Binary file not shown.

View File

@@ -1240,6 +1240,7 @@ t_garden
2@vrpop
3@vrpop
bl_depth2
1@vrsn
//======================================================================================
// - Other/Extra maps -

View File

@@ -532,3 +532,23 @@ Body:
Points: 4545
- Level: 250
Points: 4545
- Level: 251
Points: 4545
- Level: 252
Points: 4545
- Level: 253
Points: 4545
- Level: 254
Points: 4545
- Level: 255
Points: 4545
- Level: 256
Points: 4545
- Level: 257
Points: 4545
- Level: 258
Points: 4545
- Level: 259
Points: 4545
- Level: 260
Points: 4545

View File

@@ -2049,21 +2049,21 @@ Body:
- Id: 200032
Group: Goal_Level
Name: The start of another adventure!
Condition: " BaseLevel == 100 "
Condition: " BaseLevel >= 100 "
Rewards:
Item: Rebeginer_Box_100
Score: 10
- Id: 200033
Group: Goal_Level
Name: With a new mind!(1)
Condition: " BaseLevel == 170 && (Class >= JOB_RUNE_KNIGHT && Class <= JOB_GUILLOTINE_CROSS_T) "
Condition: " BaseLevel >= 170 && (Class >= JOB_RUNE_KNIGHT && Class <= JOB_GUILLOTINE_CROSS_T) "
Rewards:
Item: Costume_Ticket
Score: 50
- Id: 200034
Group: Goal_Level
Name: With a new mind!(2)
Condition: " BaseLevel == 170 && (Class >= JOB_ROYAL_GUARD && Class <= JOB_SHADOW_CHASER_T) "
Condition: " BaseLevel >= 170 && (Class >= JOB_ROYAL_GUARD && Class <= JOB_SHADOW_CHASER_T) "
Rewards:
Item: Costume_Ticket
Score: 50

View File

@@ -48064,3 +48064,562 @@ Body:
- Improve_Orb_Cri # 29539
Script: |
bonus2 bAddRace,RC_All,6;
- Combos:
- Combo:
- Signet_Of_Pow3 # 312984
- Star_Cluster_Of_Pow3 # 310676
Script: |
bonus2 bAddRace,RC_All,10;
bonus2 bAddRace,RC_Player_Human,-10;
bonus2 bAddRace,RC_Player_Doram,-10;
- Combos:
- Combo:
- Signet_Of_Pow4 # 312985
- Star_Cluster_Of_Pow3 # 310676
Script: |
bonus2 bAddRace,RC_All,15;
bonus2 bAddRace,RC_Player_Human,-15;
bonus2 bAddRace,RC_Player_Doram,-15;
- Combos:
- Combo:
- Signet_Of_Pow5 # 312986
- Star_Cluster_Of_Pow3 # 310676
Script: |
bonus2 bAddRace,RC_All,20;
bonus2 bAddRace,RC_Player_Human,-20;
bonus2 bAddRace,RC_Player_Doram,-20;
- Combos:
- Combo:
- Signet_Of_Con3 # 312989
- Star_Cluster_Of_Con3 # 310682
Script: |
bonus2 bAddRace,RC_All,10;
bonus2 bAddRace,RC_Player_Human,-10;
bonus2 bAddRace,RC_Player_Doram,-10;
- Combos:
- Combo:
- Signet_Of_Con4 # 312990
- Star_Cluster_Of_Con3 # 310682
Script: |
bonus2 bAddRace,RC_All,15;
bonus2 bAddRace,RC_Player_Human,-15;
bonus2 bAddRace,RC_Player_Doram,-15;
- Combos:
- Combo:
- Signet_Of_Con5 # 312991
- Star_Cluster_Of_Con3 # 310682
Script: |
bonus2 bAddRace,RC_All,20;
bonus2 bAddRace,RC_Player_Human,-20;
bonus2 bAddRace,RC_Player_Doram,-20;
- Combos:
- Combo:
- Signet_Of_Spl3 # 312994
- Star_Cluster_Of_Spl3 # 310688
Script: |
bonus2 bMagicAddRace,RC_All,10;
bonus2 bMagicAddRace,RC_Player_Human,-10;
bonus2 bMagicAddRace,RC_Player_Doram,-10;
- Combos:
- Combo:
- Signet_Of_Spl4 # 312995
- Star_Cluster_Of_Spl3 # 310688
Script: |
bonus2 bMagicAddRace,RC_All,15;
bonus2 bMagicAddRace,RC_Player_Human,-15;
bonus2 bMagicAddRace,RC_Player_Doram,-15;
- Combos:
- Combo:
- Signet_Of_Spl5 # 312996
- Star_Cluster_Of_Spl3 # 310688
Script: |
bonus2 bMagicAddRace,RC_All,20;
bonus2 bMagicAddRace,RC_Player_Human,-20;
bonus2 bMagicAddRace,RC_Player_Doram,-20;
- Combos:
- Combo:
- Signet_Of_Sta3 # 312999
- Star_Cluster_Of_Sta3 # 310679
Script: |
bonus bMaxHPrate,5;
- Combos:
- Combo:
- Signet_Of_Sta4 # 313000
- Star_Cluster_Of_Sta3 # 310679
Script: |
bonus bMaxHPrate,7;
- Combos:
- Combo:
- Signet_Of_Sta5 # 313001
- Star_Cluster_Of_Sta3 # 310679
Script: |
bonus bMaxHPrate,10;
- Combos:
- Combo:
- Signet_Of_Crt3 # 313004
- Star_Cluster_Of_Crt3 # 310685
Script: |
bonus2 bAddRace,RC_All,10;
bonus2 bAddRace,RC_Player_Human,-10;
bonus2 bAddRace,RC_Player_Doram,-10;
- Combos:
- Combo:
- Signet_Of_Crt4 # 313005
- Star_Cluster_Of_Crt3 # 310685
Script: |
bonus2 bAddRace,RC_All,15;
bonus2 bAddRace,RC_Player_Human,-15;
bonus2 bAddRace,RC_Player_Doram,-15;
- Combos:
- Combo:
- Signet_Of_Crt5 # 313006
- Star_Cluster_Of_Crt3 # 310685
Script: |
bonus2 bAddRace,RC_All,20;
bonus2 bAddRace,RC_Player_Human,-20;
bonus2 bAddRace,RC_Player_Doram,-20;
- Combos:
- Combo:
- Signet_Of_Wis3 # 313009
- Star_Cluster_Of_Wis3 # 310691
Script: |
bonus bMaxSPrate,5;
- Combos:
- Combo:
- Signet_Of_Wis4 # 313010
- Star_Cluster_Of_Wis3 # 310691
Script: |
bonus bMaxSPrate,7;
- Combos:
- Combo:
- Signet_Of_Wis5 # 313011
- Star_Cluster_Of_Wis3 # 310691
Script: |
bonus bMaxSPrate,10;
- Combos:
- Combo:
- Life_of_Spring_Pow # 313012
- Star_Armor_Of_Pow # 450169
Script: |
bonus2 bAddEle,Ele_All,2;
if (getenchantgrade(EQI_ARMOR)>=ENCHANTGRADE_A) {
bonus2 bAddEle,Ele_All,3*(getequiprefinerycnt(EQI_ARMOR)/2);
}
- Combos:
- Combo:
- Life_of_Spring_Sta # 313013
- Star_Armor_Of_Sta # 450170
Script: |
.@r_armor = getequiprefinerycnt(EQI_ARMOR);
bonus bMaxHPrate,3;
if (getenchantgrade(EQI_ARMOR)>=ENCHANTGRADE_A) {
bonus bMaxHPrate,(.@r_armor/2);
bonus bRes,20*(.@r_armor/2);
}
- Combos:
- Combo:
- Life_of_Spring_Crt # 313014
- Star_Suit_Of_Crt # 450172
Script: |
bonus bCritAtkRate,3;
if (getenchantgrade(EQI_ARMOR)>=ENCHANTGRADE_A) {
bonus bCritAtkRate,3*(getequiprefinerycnt(EQI_ARMOR)/2);
}
- Combos:
- Combo:
- Life_of_Summer_Con # 313015
- Star_Suit_Of_Con # 450171
Script: |
bonus2 bAddEle,Ele_All,2;
if (getenchantgrade(EQI_ARMOR)>=ENCHANTGRADE_A) {
bonus2 bAddEle,Ele_All,3*(getequiprefinerycnt(EQI_ARMOR)/2);
}
- Combos:
- Combo:
- Life_of_Summer_Sta # 313016
- Star_Armor_Of_Sta # 450170
Script: |
.@r_armor = getequiprefinerycnt(EQI_ARMOR);
bonus bMaxHPrate,3;
if (getenchantgrade(EQI_ARMOR)>=ENCHANTGRADE_A) {
bonus bMaxHPrate,(.@r_armor/2);
bonus bRes,20*(.@r_armor/2);
}
- Combos:
- Combo:
- Life_of_Summer_Crt # 313017
- Star_Suit_Of_Crt # 450172
Script: |
bonus bCritAtkRate,3;
if (getenchantgrade(EQI_ARMOR)>=ENCHANTGRADE_A) {
bonus bCritAtkRate,3*(getequiprefinerycnt(EQI_ARMOR)/2);
}
- Combos:
- Combo:
- Life_of_Autumn_Spl # 313018
- Star_Robe_Of_Spl # 450173
Script: |
bonus2 bMagicAddEle,Ele_All,2;
if (getenchantgrade(EQI_ARMOR)>=ENCHANTGRADE_A) {
bonus2 bMagicAddEle,Ele_All,3*(getequiprefinerycnt(EQI_ARMOR)/2);
}
- Combos:
- Combo:
- Life_of_Autumn_Sta # 313019
- Star_Armor_Of_Sta # 450170
Script: |
.@r_armor = getequiprefinerycnt(EQI_ARMOR);
bonus bMaxHPrate,3;
if (getenchantgrade(EQI_ARMOR)>=ENCHANTGRADE_A) {
bonus bMaxHPrate,(.@r_armor/2);
bonus bRes,20*(.@r_armor/2);
}
- Combos:
- Combo:
- Life_of_Autumn_Wis # 313020
- Star_Robe_Of_Wis # 450174
Script: |
.@r_armor = getequiprefinerycnt(EQI_ARMOR);
bonus bDelayrate,-3;
if (getenchantgrade(EQI_ARMOR)>=ENCHANTGRADE_A) {
bonus bDelayrate,-2*(.@r_armor/2);
bonus bMaxSPrate,(.@r_armor/2);
}
- Combos:
- Combo:
- Life_of_Winter_Pow # 313021
- Star_Armor_Of_Pow # 450169
Script: |
bonus bCritAtkRate,3;
if (getenchantgrade(EQI_ARMOR)>=ENCHANTGRADE_A) {
bonus bCritAtkRate,3*(getequiprefinerycnt(EQI_ARMOR)/2);
}
- Combos:
- Combo:
- Life_of_Winter_Con # 313022
- Star_Suit_Of_Con # 450171
Script: |
bonus bCritAtkRate,3;
if (getenchantgrade(EQI_ARMOR)>=ENCHANTGRADE_A) {
bonus bCritAtkRate,3*(getequiprefinerycnt(EQI_ARMOR)/2);
}
- Combos:
- Combo:
- Life_of_Winter_Crt # 313023
- Star_Suit_Of_Crt # 450172
Script: |
bonus2 bAddEle,Ele_All,2;
if (getenchantgrade(EQI_ARMOR)>=ENCHANTGRADE_A) {
bonus2 bAddEle,Ele_All,3*(getequiprefinerycnt(EQI_ARMOR)/2);
}
- Combos:
- Combo:
- Star_Cluster_Of_Str1 # 313024
- Token_Of_Life # 312981
Script: |
bonus2 bAddClass,Class_Normal,3;
bonus2 bAddClass,Class_Boss,3;
- Combos:
- Combo:
- Star_Cluster_Of_Str2 # 313025
- Token_Of_Life # 312981
Script: |
bonus2 bAddClass,Class_Normal,6;
bonus2 bAddClass,Class_Boss,6;
- Combos:
- Combo:
- Star_Cluster_Of_Str3 # 313026
- Token_Of_Life # 312981
Script: |
bonus2 bAddClass,Class_Normal,9;
bonus2 bAddClass,Class_Boss,9;
- Combos:
- Combo:
- Star_Cluster_Of_Str4 # 313027
- Token_Of_Life # 312981
Script: |
bonus2 bAddClass,Class_Normal,12;
bonus2 bAddClass,Class_Boss,12;
- Combos:
- Combo:
- Star_Cluster_Of_Str5 # 313028
- Token_Of_Life # 312981
Script: |
bonus2 bAddClass,Class_Normal,15;
bonus2 bAddClass,Class_Boss,15;
- Combos:
- Combo:
- Star_Cluster_Of_Luk1 # 313029
- Token_Of_Life # 312981
Script: |
bonus2 bAddClass,Class_Normal,3;
bonus2 bAddClass,Class_Boss,3;
- Combos:
- Combo:
- Star_Cluster_Of_Luk2 # 313030
- Token_Of_Life # 312981
Script: |
bonus2 bAddClass,Class_Normal,6;
bonus2 bAddClass,Class_Boss,6;
- Combos:
- Combo:
- Star_Cluster_Of_Luk3 # 313031
- Token_Of_Life # 312981
Script: |
bonus2 bAddClass,Class_Normal,9;
bonus2 bAddClass,Class_Boss,9;
- Combos:
- Combo:
- Star_Cluster_Of_Luk4 # 313032
- Token_Of_Life # 312981
Script: |
bonus2 bAddClass,Class_Normal,12;
bonus2 bAddClass,Class_Boss,12;
- Combos:
- Combo:
- Star_Cluster_Of_Luk5 # 313033
- Token_Of_Life # 312981
Script: |
bonus2 bAddClass,Class_Normal,15;
bonus2 bAddClass,Class_Boss,15;
- Combos:
- Combo:
- Star_Cluster_Of_Int1 # 313034
- Token_Of_Life # 312981
Script: |
bonus2 bMagicAddClass,Class_Normal,3;
bonus2 bMagicAddClass,Class_Boss,3;
- Combos:
- Combo:
- Star_Cluster_Of_Int2 # 313035
- Token_Of_Life # 312981
Script: |
bonus2 bMagicAddClass,Class_Normal,6;
bonus2 bMagicAddClass,Class_Boss,6;
- Combos:
- Combo:
- Star_Cluster_Of_Int3 # 313036
- Token_Of_Life # 312981
Script: |
bonus2 bMagicAddClass,Class_Normal,9;
bonus2 bMagicAddClass,Class_Boss,9;
- Combos:
- Combo:
- Star_Cluster_Of_Int4 # 313037
- Token_Of_Life # 312981
Script: |
bonus2 bMagicAddClass,Class_Normal,12;
bonus2 bMagicAddClass,Class_Boss,12;
- Combos:
- Combo:
- Star_Cluster_Of_Int5 # 313038
- Token_Of_Life # 312981
Script: |
bonus2 bMagicAddClass,Class_Normal,15;
bonus2 bMagicAddClass,Class_Boss,15;
- Combos:
- Combo:
- Star_Cluster_Of_Res1 # 313039
- Token_Of_Life # 312981
Script: |
bonus bMaxHPrate,1;
bonus bMaxSPrate,1;
- Combos:
- Combo:
- Star_Cluster_Of_Res2 # 313040
- Token_Of_Life # 312981
Script: |
bonus bMaxHPrate,2;
bonus bMaxSPrate,2;
- Combos:
- Combo:
- Star_Cluster_Of_Res3 # 313041
- Token_Of_Life # 312981
Script: |
bonus bMaxHPrate,3;
bonus bMaxSPrate,3;
- Combos:
- Combo:
- Star_Cluster_Of_Res4 # 313042
- Token_Of_Life # 312981
Script: |
bonus bMaxHPrate,4;
bonus bMaxSPrate,4;
- Combos:
- Combo:
- Star_Cluster_Of_Res5 # 313043
- Token_Of_Life # 312981
Script: |
bonus bMaxHPrate,5;
bonus bMaxSPrate,5;
- Combos:
- Combo:
- aegis_313059 # 313059
- Runeknight_Top3 # 310881
Script: |
bonus2 bAddSize,Size_All,3*(getskilllv("DK_TWOHANDDEF")/2);
- Combos:
- Combo:
- aegis_313059 # 313059
- Runeknight_Middle3 # 310882
Script: |
bonus2 bSkillAtk,"DK_HACKANDSLASHER",10;
- Combos:
- Combo:
- aegis_313059 # 313059
- Runeknight_Bottom3 # 310883
Script: |
bonus bCRate,3;
bonus2 bSkillAtk,"DK_STORMSLASH",15;
- Combos:
- Combo:
- aegis_313060 # 313060
- Royalguard_Top3 # 310887
Script: |
bonus2 bSkillAtk,"IG_CROSS_RAIN",15;
- Combos:
- Combo:
- aegis_313060 # 313060
- Royalguard_Middle3 # 310888
Script: |
bonus2 bMagicAddSize,Size_All,10;
- Combos:
- Combo:
- aegis_313060 # 313060
- Royalguard_Bottom3 # 310889
Script: |
bonus2 bMagicAddEle,Ele_All,3*(getskilllv("IG_SHIELD_MASTERY")/2);
- Combos:
- Combo:
- aegis_313061 # 313061
- aegis_311463 # 311463
Script: |
bonus2 bSkillAtk,"NW_THE_VIGILANTE_AT_NIGHT",10;
- Combos:
- Combo:
- aegis_313061 # 313061
- aegis_311464 # 311464
Script: |
bonus2 bSkillAtk,"NW_SPIRAL_SHOOTING",15;
- Combos:
- Combo:
- aegis_313061 # 313061
- aegis_311465 # 311465
Script: |
bonus2 bSkillAtk,"NW_MAGAZINE_FOR_ONE",10;
- Combos:
- Combo:
- FuriousCirclet_WH # 400608
- StormBow_Furious # 700100
Script: |
bonus2 bSkillAtk,"WH_GALESTORM",15;
- Combos:
- Combo:
- FuriousCirclet_WH # 400608
- TornadoBow_Furious # 700101
Script: |
bonus2 bSkillAtk,"WH_CRESCIVE_BOLT",15;
- Combos:
- Combo:
- FuriousCirclet_CD # 400609
- SaintBook_Furious # 540086
Script: |
bonus2 bSkillAtk,"CD_PETITIO",15;
- Combos:
- Combo:
- FuriousCirclet_CD # 400609
- SaintWand_Furious # 550141
Script: |
bonus2 bSkillAtk,"CD_FRAMEN",15;
- Combos:
- Combo:
- FuriousCirclet_SKE # 400610
- SunBook_Furious # 540087
Script: |
bonus2 bSkillAtk,"SKE_NOON_BLAST",15;
- Combos:
- Combo:
- FuriousCirclet_SKE # 400610
- MoonBook_Furious # 540088
Script: |
bonus2 bSkillAtk,"SKE_MIDNIGHT_KICK",15;
- Combos:
- Combo:
- Signet_Of_Spring # 490483
- Circul_Of_Life_Spring # 480349
Script: |
.@val = 5+3*(getequiprefinerycnt(EQI_GARMENT)/2);
bonus2 bAddRace,RC_All,.@val;
bonus2 bAddRace,RC_Player_Human,-.@val;
bonus2 bAddRace,RC_Player_Doram,-.@val;
bonus bDelayrate,-10;
- Combos:
- Combo:
- Signet_Of_Summer # 490484
- Circul_Of_Life_Summer # 480350
Script: |
.@val = 5+3*(getequiprefinerycnt(EQI_GARMENT)/2);
bonus2 bAddRace,RC_All,.@val;
bonus2 bAddRace,RC_Player_Human,-.@val;
bonus2 bAddRace,RC_Player_Doram,-.@val;
bonus bDelayrate,-10;
- Combos:
- Combo:
- Signet_Of_Autumn # 490485
- Circul_Of_Life_Autumn # 480351
Script: |
.@val = 5+3*(getequiprefinerycnt(EQI_GARMENT)/2);
bonus2 bMagicAddRace,RC_All,.@val;
bonus2 bMagicAddRace,RC_Player_Human,-.@val;
bonus2 bMagicAddRace,RC_Player_Doram,-.@val;
bonus bDelayrate,-10;
- Combos:
- Combo:
- Signet_Of_Winter # 490486
- Circul_Of_Life_Winter # 480352
Script: |
.@val = 5+3*(getequiprefinerycnt(EQI_GARMENT)/2);
bonus2 bAddRace,RC_All,.@val;
bonus2 bAddRace,RC_Player_Human,-.@val;
bonus2 bAddRace,RC_Player_Doram,-.@val;
bonus bDelayrate,-10;
- Combos:
- Combo:
- SaintBook_Furious # 540086
- FuriousBoots # 470265
Script: |
autobonus "{ .@sum = getequiprefinerycnt(EQI_HAND_R)+getequiprefinerycnt(EQI_SHOES); bonus2 bSkillAtk,\"AB_DUPLELIGHT_MELEE\",(15*.@sum); bonus2 bSkillAtk,\"AB_DUPLELIGHT_MAGIC\",(15*.@sum); }",70,10000,BF_WEAPON;
- Combos:
- Combo:
- SunBook_Furious # 540087
- FuriousBoots # 470265
Script: |
bonus bDelayrate,-10;
- Combos:
- Combo:
- MoonBook_Furious # 540088
- FuriousBoots # 470265
Script: |
.@sum = getequiprefinerycnt(EQI_HAND_R)+getequiprefinerycnt(EQI_SHOES);
bonus2 bSkillAtk,"SKE_MIDNIGHT_KICK",15;
bonus2 bSkillAtk,"SKE_DAWN_BREAK",.@sum*2;
- Combos:
- Combo:
- SaintWand_Furious # 550141
- FuriousBoots # 470265
Script: |
.@sum = getequiprefinerycnt(EQI_HAND_R)+getequiprefinerycnt(EQI_SHOES);
bonus bDelayrate,-10;
bonus2 bSkillAtk,"CD_FRAMEN",.@sum;
- Combos:
- Combo:
- StormBow_Furious # 700100
- FuriousBoots # 470265
Script: |
bonus2 bSkillUseSP,"WH_GALESTORM",20;
- Combos:
- Combo:
- TornadoBow_Furious # 700101
- FuriousBoots # 470265
Script: |
bonus bDelayrate,-10;

View File

@@ -57882,6 +57882,17 @@ Body:
AegisName: Dark_Lord_Egg
Name: Dark Lord Egg
Type: PetEgg
- Id: 9156
AegisName: Sonic_Chao_Egg
Name: Chao's Egg # !todo check english name
Type: PetEgg
Trade:
NoDrop: true
NoTrade: true
NoCart: true
NoGuildStorage: true
NoMail: true
NoAuction: true
- Id: 10001
AegisName: Skull_Helm
Name: Skull Helm
@@ -115621,6 +115632,16 @@ Body:
Costume_Head_Top: true
Costume_Head_Mid: true
ArmorLevel: 1
- Id: 21400
AegisName: aegis_21400
Name: Costume Blue Dragon Statue # !todo check english name
Type: Armor
Locations:
Costume_Head_Top: true
Costume_Head_Mid: true
Costume_Head_Low: true
ArmorLevel: 1
View: 2494
- Id: 22000
AegisName: Temporal_Str_Boots
Name: Temporal Str Boots
@@ -160306,6 +160327,14 @@ Body:
if (.@r>=11) {
bonus2 bAddSize,Size_All,10;
}
- Id: 400100
AegisName: aegis_400100
Name: Costume Leon Wig # !todo check english name
Type: Armor
Locations:
Costume_Head_Low: true
ArmorLevel: 1
View: 2373
- Id: 400101
AegisName: GatesofNetherworld
Name: Gate of Netherworld
@@ -167787,6 +167816,21 @@ Body:
bonus2 bSkillAtk,"WS_CARTTERMINATION",15;
if (.@r>=7)
bonus2 bSkillAtk,"WS_CARTTERMINATION",15;
- Id: 400502
AegisName: C_Sonic_Ring
Name: Costume ring # !todo check english name
Type: Armor
Locations:
Costume_Head_Top: true
ArmorLevel: 1
View: 2433
Trade:
NoDrop: true
NoTrade: true
NoCart: true
NoGuildStorage: true
NoMail: true
NoAuction: true
- Id: 400503
AegisName: C_Hosangto_Hat
Name: Costume Bunny Ear Hat
@@ -169416,6 +169460,181 @@ Body:
Costume_Head_Top: true
ArmorLevel: 1
View: 2488
- Id: 400605
AegisName: C_VIP_Poring_Cake_Cap
Name: Costume Birthday Cake Hat # !todo check english name
Type: Armor
Locations:
Costume_Head_Top: true
ArmorLevel: 1
View: 417
Trade:
NoDrop: true
NoTrade: true
NoSell: true
NoCart: true
NoGuildStorage: true
NoMail: true
NoAuction: true
- Id: 400608
AegisName: FuriousCirclet_WH
Name: Crown of Wrath (Windhawk) # !todo check english name
Type: Armor
Weight: 300
Defense: 30
Slots: 1
Jobs:
Hunter: true
Classes:
Fourth: true
Locations:
Head_Top: true
ArmorLevel: 2
EquipLevelMin: 235
Refineable: true
Gradable: true
View: 2415
Script: |
.@g = getenchantgrade();
.@r = getrefine();
bonus bBaseAtk,10*(.@r/2);
bonus2 bSkillAtk,"WH_CRESCIVE_BOLT",4*(.@r/3);
bonus2 bSkillAtk,"WH_GALESTORM",4*(.@r/3);
if (.@r>=7) {
bonus bVariableCastrate,-15;
if (.@r>=9) {
bonus bLongAtkRate,10;
if (.@r>=11) {
bonus bFixedCast,-300;
bonus bAtkRate,5;
}
}
}
if (.@g>=ENCHANTGRADE_D) {
bonus bPAtk,3;
bonus bPow,5;
bonus bCon,5;
if (.@g>=ENCHANTGRADE_C) {
bonus bLongAtkRate,10;
if (.@g>=ENCHANTGRADE_B) {
bonus bFixedCast,-200;
bonus bAtkRate,5;
if (.@g>=ENCHANTGRADE_A) {
bonus bCritAtkRate,15;
bonus bCRate,5;
}
}
}
}
- Id: 400609
AegisName: FuriousCirclet_CD
Name: Crown of Wrath (Cardinal) # !todo check english name
Type: Armor
Weight: 300
Defense: 30
Slots: 1
Jobs:
Priest: true
Classes:
Fourth: true
Locations:
Head_Top: true
ArmorLevel: 2
EquipLevelMin: 235
Refineable: true
Gradable: true
View: 2415
Script: |
.@g = getenchantgrade();
.@r = getrefine();
bonus bMatk,10*(.@r/2);
bonus bBaseAtk,10*(.@r/2);
bonus2 bSkillAtk,"CD_PETITIO",4*(.@r/3);
bonus2 bSkillAtk,"CD_FRAMEN",4*(.@r/3);
if (.@r>=7) {
bonus bVariableCastrate,-15;
if (.@r>=9) {
bonus bShortAtkRate,10;
bonus2 bMagicAtkEle,Ele_All,10;
if (.@r>=11) {
bonus bFixedCast,-300;
bonus bMatkRate,5;
bonus bAtkRate,5;
}
}
}
if (.@g>=ENCHANTGRADE_D) {
bonus bPAtk,3;
bonus bSMatk,3;
bonus bPow,5;
bonus bSpl,5;
bonus bCon,5;
if (.@g>=ENCHANTGRADE_C) {
bonus bShortAtkRate,10;
bonus2 bMagicAtkEle,Ele_All,10;
if (.@g>=ENCHANTGRADE_B) {
bonus bFixedCast,-200;
bonus bMatkRate,5;
bonus bAtkRate,5;
if (.@g>=ENCHANTGRADE_A) {
bonus2 bMagicAtkEle,Ele_All,15;
bonus bCritAtkRate,15;
bonus bPAtk,5;
bonus bSMatk,5;
}
}
}
}
- Id: 400610
AegisName: FuriousCirclet_SKE
Name: Crown of Wrath (Sky Emperor) # !todo check english name
Type: Armor
Weight: 300
Defense: 30
Slots: 1
Jobs:
StarGladiator: true
Classes:
Fourth: true
Locations:
Head_Top: true
ArmorLevel: 2
EquipLevelMin: 235
Refineable: true
Gradable: true
View: 2415
Script: |
.@g = getenchantgrade();
.@r = getrefine();
bonus bBaseAtk,10*(.@r/2);
bonus2 bSkillAtk,"SKE_NOON_BLAST",4*(.@r/3);
bonus2 bSkillAtk,"SKE_MIDNIGHT_KICK",4*(.@r/3);
if (.@r>=7) {
bonus bVariableCastrate,-15;
if (.@r>=9) {
bonus bShortAtkRate,10;
if (.@r>=11) {
bonus bFixedCast,-300;
bonus bAtkRate,5;
}
}
}
if (.@g>=ENCHANTGRADE_D) {
bonus bPAtk,3;
bonus bPow,5;
bonus bCon,5;
if (.@g>=ENCHANTGRADE_C) {
bonus bShortAtkRate,10;
if (.@g>=ENCHANTGRADE_B) {
bonus bFixedCast,-200;
bonus bAtkRate,5;
if (.@g>=ENCHANTGRADE_A) {
bonus bShortAtkRate,15;
bonus bPAtk,5;
}
}
}
}
- Id: 410000
AegisName: Resonate_Taego_J
Name: Ancient Resonance
@@ -172199,6 +172418,66 @@ Body:
Costume_Head_Mid: true
ArmorLevel: 1
View: 2421
- Id: 410262
AegisName: C_Sonic_Mini
Name: Costume Sonic Mini Me # !todo check english name
Type: Armor
Locations:
Costume_Head_Mid: true
ArmorLevel: 1
View: 2429
Trade:
NoDrop: true
NoTrade: true
NoCart: true
NoGuildStorage: true
NoMail: true
NoAuction: true
- Id: 410263
AegisName: C_Super_Sonic_Mini
Name: Costume Super Sonic Mini Me # !todo check english name
Type: Armor
Locations:
Costume_Head_Mid: true
ArmorLevel: 1
View: 2430
Trade:
NoDrop: true
NoTrade: true
NoCart: true
NoGuildStorage: true
NoMail: true
NoAuction: true
- Id: 410264
AegisName: C_Tails_Mini
Name: Costume Tales Mini Me # !todo check english name
Type: Armor
Locations:
Costume_Head_Mid: true
ArmorLevel: 1
View: 2431
Trade:
NoDrop: true
NoTrade: true
NoCart: true
NoGuildStorage: true
NoMail: true
NoAuction: true
- Id: 410265
AegisName: C_S_Attack_Ring
Name: Costume Power Ring Drop # !todo check english name
Type: Armor
Locations:
Costume_Head_Low: true
ArmorLevel: 1
View: 2432
Trade:
NoDrop: true
NoTrade: true
NoCart: true
NoGuildStorage: true
NoMail: true
NoAuction: true
- Id: 410266
AegisName: C_H_N_Hat
Name: Costume Miss Rabbit and Little Dog
@@ -174747,6 +175026,21 @@ Body:
ArmorLevel: 1
EquipLevelMin: 150
View: 2448
- Id: 420303
AegisName: C_Chaos_Emerald
Name: Costume Chaos Emerald # !todo check english name
Type: Armor
Locations:
Costume_Head_Low: true
ArmorLevel: 1
View: 2485
Trade:
NoDrop: true
NoTrade: true
NoCart: true
NoGuildStorage: true
NoMail: true
NoAuction: true
- Id: 420304
AegisName: aegis_420304
Name: Costume Routiers Night Sky # !todo check english name
@@ -175224,6 +175518,23 @@ Body:
Costume_Head_Low: true
ArmorLevel: 1
View: 2147
- Id: 440012
AegisName: C_Dr_Eggman_Mask
Name: Costume Dr. Eggman Mask # !todo check english name
Type: Armor
Locations:
Costume_Head_Top: true
Costume_Head_Mid: true
Costume_Head_Low: true
ArmorLevel: 1
View: 2434
Trade:
NoDrop: true
NoTrade: true
NoCart: true
NoGuildStorage: true
NoMail: true
NoAuction: true
- Id: 450000
AegisName: IDTest_armor
Name: IDTest armor
@@ -189367,6 +189678,58 @@ Body:
}
}
}
- Id: 470265
AegisName: FuriousBoots
Name: Boots of Wrath # !todo check english name
Type: Armor
Weight: 1500
Defense: 30
Slots: 1
Locations:
Shoes: true
ArmorLevel: 2
EquipLevelMin: 220
Refineable: true
Gradable: true
Script: |
.@g = getenchantgrade();
.@r = getrefine();
if (BaseLevel>=230) {
bonus2 bAddClass,Class_Normal,5;
bonus2 bMagicAddClass,Class_Normal,5;
bonus2 bAddClass,Class_Boss,5;
bonus2 bMagicAddClass,Class_Boss,5;
}
if (.@r>=7) {
bonus bMatkRate,5;
bonus bAtkRate,5;
if (.@r>=9) {
bonus bVariableCastrate,-10;
if (.@r>=10) {
bonus bFixedCast,-700;
if (.@r>=11) {
bonus2 bMagicAtkEle,Ele_All,10;
bonus bShortAtkRate,10;
bonus bLongAtkRate,10;
}
}
}
}
if (.@g>=ENCHANTGRADE_D) {
bonus bMatkRate,5;
bonus bAtkRate,5;
if (.@g>=ENCHANTGRADE_C) {
bonus bFixedCast,-300;
if (.@g>=ENCHANTGRADE_B) {
bonus bPAtk,5;
bonus bSMatk,5;
if (.@g>=ENCHANTGRADE_A) {
bonus bPAtk,2;
bonus bSMatk,2;
}
}
}
}
- Id: 480000
AegisName: Atker_Manteau
Name: Attacker Booster Manteau
@@ -195128,6 +195491,14 @@ Body:
Costume_Garment: true
ArmorLevel: 1
View: 202
- Id: 480408
AegisName: aegis_480408
Name: Costume Dragon Wings # !todo check english name
Type: Armor
Locations:
Costume_Garment: true
ArmorLevel: 1
View: 204
- Id: 490004
AegisName: Atker_Ring
Name: Attacker Booster Ring
@@ -201377,6 +201748,90 @@ Body:
bonus bDelayrate,-3;
bonus bAtkRate,6;
bonus bMatkRate,6;
- Id: 490483
AegisName: Signet_Of_Spring
Name: "Seal of Circulation: Spring" # !todo check english name
Type: Armor
Weight: 500
Defense: 10
Slots: 1
Locations:
Left_Accessory: true
ArmorLevel: 2
EquipLevelMin: 250
Trade:
NoDrop: true
NoTrade: true
NoCart: true
NoGuildStorage: true
NoMail: true
NoAuction: true
Script: |
bonus bShortAtkRate,10;
bonus bVariableCastrate,-10;
- Id: 490484
AegisName: Signet_Of_Summer
Name: "Seal of Circulation: Summer" # !todo check english name
Type: Armor
Weight: 500
Defense: 10
Slots: 1
Locations:
Left_Accessory: true
ArmorLevel: 2
EquipLevelMin: 250
Trade:
NoDrop: true
NoTrade: true
NoCart: true
NoGuildStorage: true
NoMail: true
NoAuction: true
Script: |
bonus bLongAtkRate,10;
bonus bVariableCastrate,-10;
- Id: 490485
AegisName: Signet_Of_Autumn
Name: "Seal of Circulation: Autumn" # !todo check english name
Type: Armor
Weight: 500
Defense: 10
Slots: 1
Locations:
Left_Accessory: true
ArmorLevel: 2
EquipLevelMin: 250
Trade:
NoDrop: true
NoTrade: true
NoCart: true
NoGuildStorage: true
NoMail: true
NoAuction: true
Script: |
bonus2 bMagicAtkEle,Ele_All,10;
bonus bVariableCastrate,-10;
- Id: 490486
AegisName: Signet_Of_Winter
Name: "Seal of Circulation: Winter" # !todo check english name
Type: Armor
Weight: 500
Defense: 10
Slots: 1
Locations:
Left_Accessory: true
ArmorLevel: 2
EquipLevelMin: 250
Trade:
NoDrop: true
NoTrade: true
NoCart: true
NoGuildStorage: true
NoMail: true
NoAuction: true
Script: |
bonus bCritAtkRate,10;
bonus bVariableCastrate,-10;
- Id: 500000
AegisName: IDTest_weapon
Name: IDTest weapon
@@ -210820,6 +211275,181 @@ Body:
}
}
}
- Id: 540086
AegisName: SaintBook_Furious
Name: Bible of Wrath # !todo check english name
Type: Weapon
SubType: Book
Weight: 1200
Attack: 175
MagicAttack: 145
Range: 1
Slots: 2
Jobs:
Priest: true
Classes:
Fourth: true
Locations:
Right_Hand: true
WeaponLevel: 5
EquipLevelMin: 205
Refineable: true
Gradable: true
Script: |
.@g = getenchantgrade();
.@r = getrefine();
bonus2 bSkillAtk,"CD_PETITIO",5;
if (BaseLevel>=210) {
bonus bAtkRate,4;
bonus bBaseAtk,40;
}
if (BaseLevel>=220) {
bonus2 bSkillAtk,"CD_PETITIO",5;
}
if (BaseLevel>=230) {
bonus2 bAddSize,Size_All,10;
bonus2 bMagicAddSize,Size_All,10;
}
if (.@r>=7) {
bonus bCritAtkRate,10;
if (.@r>=9) {
bonus2 bSkillAtk,"CD_PETITIO",10;
if (.@r>=10) {
if (.@r>=11) {
bonus2 bSkillAtk,"CD_PETITIO",10;
}
}
}
}
if (.@g>=ENCHANTGRADE_D) {
bonus bCritAtkRate,10;
if (.@g>=ENCHANTGRADE_C) {
bonus2 bSkillAtk,"CD_PETITIO",5;
if (.@g>=ENCHANTGRADE_B) {
bonus2 bSkillAtk,"CD_PETITIO",10;
if (.@g>=ENCHANTGRADE_A) {
bonus bPAtk,3*(.@r/2);
bonus bAtkRate,3*(.@r/2);
}
}
}
}
- Id: 540087
AegisName: SunBook_Furious
Name: Sunshine Book of Wrath # !todo check english name
Type: Weapon
SubType: Book
Weight: 1400
Attack: 175
Range: 1
Slots: 2
Jobs:
StarGladiator: true
Classes:
Fourth: true
Locations:
Right_Hand: true
WeaponLevel: 5
EquipLevelMin: 205
Refineable: true
Gradable: true
Script: |
.@g = getenchantgrade();
.@r = getrefine();
bonus2 bSkillAtk,"SKE_NOON_BLAST",5;
if (BaseLevel>=210) {
bonus bAtkRate,4;
bonus bBaseAtk,40;
}
if (BaseLevel>=220) {
bonus2 bSkillAtk,"SKE_NOON_BLAST",5;
}
if (BaseLevel>=230) {
bonus2 bAddSize,Size_All,10;
}
if (.@r>=7) {
bonus bCritAtkRate,10;
if (.@r>=9) {
bonus2 bSkillAtk,"SKE_NOON_BLAST",10;
if (.@r>=10) {
bonus bCritical,10;
if (.@r>=11) {
bonus2 bSkillAtk,"SKE_NOON_BLAST",10;
}
}
}
}
if (.@g>=ENCHANTGRADE_D) {
bonus bCritAtkRate,10;
if (.@g>=ENCHANTGRADE_C) {
bonus2 bSkillAtk,"SKE_NOON_BLAST",5;
if (.@g>=ENCHANTGRADE_B) {
bonus2 bSkillAtk,"SKE_NOON_BLAST",10;
if (.@g>=ENCHANTGRADE_A) {
bonus bPAtk,3*(.@r/2);
bonus bAtkRate,3*(.@r/2);
}
}
}
}
- Id: 540088
AegisName: MoonBook_Furious
Name: Furious Moon Word # !todo check english name
Type: Weapon
SubType: Book
Weight: 1200
Attack: 175
Range: 1
Slots: 2
Jobs:
StarGladiator: true
Classes:
Fourth: true
Locations:
Right_Hand: true
WeaponLevel: 5
EquipLevelMin: 205
Refineable: true
Gradable: true
Script: |
.@g = getenchantgrade();
.@r = getrefine();
bonus2 bSkillAtk,"SKE_MIDNIGHT_KICK",5;
if (BaseLevel>=210) {
bonus bAtkRate,4;
bonus bBaseAtk,40;
}
if (BaseLevel>=220) {
bonus2 bSkillAtk,"SKE_MIDNIGHT_KICK",5;
}
if (BaseLevel>=230) {
bonus2 bAddSize,Size_All,10;
}
if (.@r>=7) {
bonus bShortAtkRate,10;
if (.@r>=9) {
bonus2 bSkillAtk,"SKE_MIDNIGHT_KICK",10;
if (.@r>=10) {
bonus bVariableCastrate,-10;
if (.@r>=11) {
bonus2 bSkillAtk,"SKE_MIDNIGHT_KICK",10;
}
}
}
}
if (.@g>=ENCHANTGRADE_D) {
bonus bShortAtkRate,10;
if (.@g>=ENCHANTGRADE_C) {
bonus2 bSkillAtk,"SKE_MIDNIGHT_KICK",5;
if (.@g>=ENCHANTGRADE_B) {
bonus2 bSkillAtk,"SKE_MIDNIGHT_KICK",10;
if (.@g>=ENCHANTGRADE_A) {
bonus bPAtk,3*(.@r/2);
bonus bAtkRate,3*(.@r/2);
}
}
}
}
- Id: 550001
AegisName: Boost_Soul_Rod
Name: Booster Rod
@@ -215210,6 +215840,66 @@ Body:
}
}
}
- Id: 550141
AegisName: SaintWand_Furious
Name: Furious Saint Wand # !todo check english name
Type: Weapon
SubType: Staff
Weight: 1400
Attack: 100
MagicAttack: 180
Range: 1
Slots: 2
Jobs:
Priest: true
Classes:
Fourth: true
Locations:
Right_Hand: true
WeaponLevel: 5
EquipLevelMin: 205
Refineable: true
Gradable: true
Script: |
.@g = getenchantgrade();
.@r = getrefine();
bonus bUnbreakableWeapon;
bonus2 bSkillAtk,"CD_FRAMEN",5;
if (BaseLevel>=210) {
bonus bMatkRate,4;
bonus bMatk,40;
}
if (BaseLevel>=220) {
bonus2 bSkillAtk,"CD_FRAMEN",5;
}
if (BaseLevel>=230) {
bonus2 bMagicAddSize,Size_All,10;
}
if (.@r>=7) {
bonus2 bMagicAtkEle,Ele_Holy,10;
if (.@r>=9) {
bonus2 bSkillAtk,"CD_FRAMEN",10;
if (.@r>=10) {
bonus bVariableCastrate,-10;
if (.@r>=11) {
bonus2 bSkillAtk,"CD_FRAMEN",10;
}
}
}
}
if (.@g>=ENCHANTGRADE_D) {
bonus2 bMagicAtkEle,Ele_Holy,10;
if (.@g>=ENCHANTGRADE_C) {
bonus2 bSkillAtk,"CD_FRAMEN",5;
if (.@g>=ENCHANTGRADE_B) {
bonus2 bSkillAtk,"CD_FRAMEN",10;
if (.@g>=ENCHANTGRADE_A) {
bonus bSMatk,3*(.@r/2);
bonus bMatkRate,3*(.@r/2);
}
}
}
}
- Id: 560000
AegisName: Boost_Knuckle
Name: Booster Knuckles
@@ -230740,6 +231430,122 @@ Body:
}
}
}
- Id: 700100
AegisName: StormBow_Furious
Name: Furious Storm Bow # !todo check english name
Type: Weapon
SubType: Bow
Weight: 1800
Attack: 210
Range: 5
Slots: 2
Jobs:
Hunter: true
Classes:
Fourth: true
Locations:
Both_Hand: true
WeaponLevel: 5
EquipLevelMin: 205
Refineable: true
Gradable: true
Script: |
.@g = getenchantgrade();
.@r = getrefine();
bonus2 bSkillAtk,"WH_GALESTORM",5;
if (BaseLevel>=210) {
bonus bAtkRate,7;
bonus bBaseAtk,70;
}
if (BaseLevel>=220) {
bonus2 bSkillAtk,"WH_GALESTORM",5;
}
if (BaseLevel>=230) {
bonus2 bAddSize,Size_All,10;
}
if (.@r>=7) {
bonus bCritAtkRate,10;
if (.@r>=9) {
bonus2 bSkillAtk,"WH_GALESTORM",10;
if (.@r>=10) {
bonus bCritical,10;
if (.@r>=11) {
bonus2 bSkillAtk,"WH_GALESTORM",10;
}
}
}
}
if (.@g>=ENCHANTGRADE_D) {
bonus bCritAtkRate,15;
if (.@g>=ENCHANTGRADE_C) {
bonus2 bSkillAtk,"WH_GALESTORM",5;
if (.@g>=ENCHANTGRADE_B) {
bonus2 bSkillAtk,"WH_GALESTORM",10;
if (.@g>=ENCHANTGRADE_A) {
bonus bPAtk,4*(.@r/2);
bonus bAtkRate,4*(.@r/2);
}
}
}
}
- Id: 700101
AegisName: TornadoBow_Furious
Name: Wrath Gale Bow # !todo check english name
Type: Weapon
SubType: Bow
Weight: 1800
Attack: 210
Range: 5
Slots: 2
Jobs:
Hunter: true
Classes:
Fourth: true
Locations:
Both_Hand: true
WeaponLevel: 5
EquipLevelMin: 205
Refineable: true
Gradable: true
Script: |
.@g = getenchantgrade();
.@r = getrefine();
bonus2 bSkillAtk,"WH_CRESCIVE_BOLT",5;
if (BaseLevel>=210) {
bonus bAtkRate,7;
bonus bBaseAtk,70;
}
if (BaseLevel>=220) {
bonus2 bSkillAtk,"WH_CRESCIVE_BOLT",5;
}
if (BaseLevel>=230) {
bonus2 bAddSize,Size_All,10;
}
if (.@r>=7) {
bonus bCritAtkRate,10;
if (.@r>=9) {
bonus2 bSkillAtk,"WH_CRESCIVE_BOLT",10;
if (.@r>=10) {
bonus bVariableCastrate,-10;
if (.@r>=11) {
bonus2 bSkillAtk,"WH_CRESCIVE_BOLT",10;
}
}
}
}
if (.@g>=ENCHANTGRADE_D) {
bonus bCritAtkRate,15;
if (.@g>=ENCHANTGRADE_C) {
bonus2 bSkillAtk,"WH_CRESCIVE_BOLT",5;
if (.@g>=ENCHANTGRADE_B) {
bonus2 bSkillAtk,"WH_CRESCIVE_BOLT",10;
if (.@g>=ENCHANTGRADE_A) {
bonus bPAtk,4*(.@r/2);
bonus bAtkRate,4*(.@r/2);
}
}
}
}
- Id: 800000
AegisName: IDTest_gun
Name: IDTest gun

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -8884,6 +8884,15 @@ Body:
- Level: 50
Vit: 1
Pow: 1
- Level: 51
Crt: 1
- Level: 52
Pow: 1
- Level: 54
Pow: 1
Crt: 1
- Level: 55
Sta: 1
- Jobs:
Meister: true
Meister2: true
@@ -9017,6 +9026,15 @@ Body:
- Level: 50
Pow: 1
Wis: 1
- Level: 51
Pow: 1
- Level: 52
Con: 1
- Level: 53
Sta: 1
Wis: 1
- Level: 55
Pow: 1
- Jobs:
Shadow_Cross: true
MaxWeight: 32000
@@ -9149,6 +9167,15 @@ Body:
- Level: 50
Pow: 1
Crt: 1
- Level: 51
Pow: 1
- Level: 53
Con: 1
- Level: 54
Sta: 1
Crt: 1
- Level: 55
Crt: 1
- Jobs:
Arch_Mage: true
MaxWeight: 30000
@@ -9281,6 +9308,15 @@ Body:
- Level: 50
Sta: 1
Wis: 1
- Level: 52
Spl: 1
- Level: 53
Con: 1
- Level: 54
Sta: 1
Wis: 1
- Level: 55
Spl: 1
- Jobs:
Cardinal: true
MaxWeight: 30000
@@ -9413,6 +9449,16 @@ Body:
- Level: 50
Spl: 1
Crt: 1
- Level: 51
Spl: 1
- Level: 52
Pow: 1
- Level: 53
Sta: 1
- Level: 54
Wis: 1
- Level: 55
Crt: 1
- Jobs:
Windhawk: true
Windhawk2: true
@@ -9546,6 +9592,15 @@ Body:
- Level: 50
Dex: 1
Con: 1
- Level: 51
Con: 1
- Level: 52
Pow: 1
Con: 1
- Level: 53
Sta: 1
- Level: 55
Pow: 1
- Jobs:
Imperial_Guard: true
Imperial_Guard2: true
@@ -9680,6 +9735,15 @@ Body:
- Level: 50
Pow: 1
Sta: 1
- Level: 51
Pow: 1
- Level: 52
Sta: 1
- Level: 53
Sta: 1
- Level: 55
Wis: 1
Con: 1
- Jobs:
Biolo: true
MaxWeight: 32000
@@ -9812,6 +9876,15 @@ Body:
- Level: 50
Str: 1
Crt: 1
- Level: 51
Crt: 1
- Level: 52
Sta: 1
- Level: 53
Pow: 1
Crt: 1
- Level: 55
Con: 1
- Jobs:
Abyss_Chaser: true
MaxWeight: 28000
@@ -9944,6 +10017,15 @@ Body:
- Level: 50
Pow: 1
Spl: 1
- Level: 51
Pow: 1
- Level: 52
Crt: 1
- Level: 54
Sta: 1
- Level: 55
Sta: 1
Con: 1
- Jobs:
Elemental_Master: true
MaxWeight: 30000
@@ -10076,6 +10158,16 @@ Body:
- Level: 50
Wis: 1
Spl: 1
- Level: 51
Spl: 1
- Level: 52
Sta: 1
- Level: 53
Sta: 1
- Level: 54
Wis: 1
- Level: 55
Spl: 1
- Jobs:
Inquisitor: true
MaxWeight: 30000
@@ -10208,6 +10300,15 @@ Body:
- Level: 50
Pow: 1
Wis: 1
- Level: 51
Pow: 1
- Level: 52
Sta: 1
- Level: 53
Sta: 1
- Level: 55
Pow: 1
Wis: 1
- Jobs:
Troubadour: true
MaxWeight: 32000
@@ -10340,6 +10441,15 @@ Body:
Con: 1
- Level: 50
Dex: 1
- Level: 51
Con: 1
- Level: 52
Spl: 1
- Level: 53
Sta: 1
- Level: 55
Pow: 1
Con: 1
- Jobs:
Trouvere: true
MaxWeight: 32000
@@ -10473,6 +10583,15 @@ Body:
Con: 1
- Level: 50
Agi: 1
- Level: 51
Con: 1
- Level: 52
Sta: 1
- Level: 53
Spl: 1
- Level: 55
Pow: 1
Con: 1
- Jobs:
Sky_Emperor: true
MaxWeight: 42000
@@ -10607,6 +10726,14 @@ Body:
- Level: 50
Pow: 1
Crt: 1
- Level: 51
Sta: 1
Con: 1
- Level: 53
Sta: 1
- Level: 55
Pow: 1
Con: 1
- Jobs:
Soul_Ascetic: true
MaxWeight: 42000
@@ -10730,6 +10857,16 @@ Body:
- Level: 50
Wis: 1
Spl: 1
- Level: 51
Spl: 1
- Level: 52
Con: 1
- Level: 53
Wis: 1
- Level: 54
Sta: 1
- Level: 55
Spl: 1
- Jobs:
Shinkiro: true
MaxWeight: 45000
@@ -10863,6 +11000,16 @@ Body:
- Level: 50
Pow: 1
Crt: 1
- Level: 51
Crt: 1
- Level: 52
Con: 1
- Level: 53
Wis: 1
- Level: 54
Sta: 1
- Level: 55
Sta: 1
- Jobs:
Shiranui: true
MaxWeight: 45000
@@ -10985,6 +11132,15 @@ Body:
- Level: 50
Wis: 1
Spl: 1
- Level: 51
Pow: 1
- Level: 52
Spl: 1
- Level: 54
Spl: 1
- Level: 55
Spl: 1
Con: 1
- Jobs:
Night_Watch: true
MaxWeight: 48000
@@ -11112,6 +11268,15 @@ Body:
Con: 1
- Level: 50
Pow: 1
- Level: 51
Con: 1
- Level: 53
Pow: 1
Con: 1
- Level: 54
Wis: 1
- Level: 55
Pow: 1
- Jobs:
Hyper_Novice: true
MaxWeight: 40000
@@ -11248,6 +11413,15 @@ Body:
- Level: 50
Agi: 1
Dex: 1
- Level: 51
Con: 1
- Level: 52
Pow: 1
Con: 1
- Level: 53
Sta: 1
- Level: 55
Spl: 1
- Jobs:
Spirit_Handler: true
MaxWeight: 42000
@@ -11379,3 +11553,13 @@ Body:
Crt: 1
- Level: 50
Pow: 1
- Level: 51
Con: 1
- Level: 52
Pow: 1
- Level: 53
Spl: 1
- Level: 54
Wis: 1
- Level: 55
Sta: 1

View File

@@ -1,5 +1,5 @@
# This file is a part of rAthena.
# Copyright(C) 2024 rAthena Development Team
# Copyright(C) 2022 rAthena Development Team
# https://rathena.org - https://github.com/rathena
#
# This program is free software: you can redistribute it and/or modify
@@ -24,9 +24,9 @@
###########################################################################
# - Item Item that triggers Laphine Upgrade.
# RandomOptionGroup Name of the random option group that will be applied. (Default: none)
# ResultRefine: Refine level after the upgrade. (Default: none)
# - Level Refine level.
# Rate Rate per level. The total rate is the sum of the rates. (Default: 1)
# ResultRefine Absolute refine level after the upgrade. (Default: none)
# ResultRefineMinimum Minimum refine level after the upgrade. (Default: none)
# ResultRefineMaximum Maximum refine level after the upgrade. (Default: none)
# MinimumRefine Minimum refine level of the required items. (Default: 0)
# MaximumRefine Maximum refine level of the required items. (Default: MAX_REFINE)
# RequiredRandomOptions How many random options have to be in the item? (Default: 0)
@@ -37,7 +37,7 @@
Header:
Type: LAPHINE_UPGRADE_DB
Version: 2
Version: 1
Body:
- Item: Ein_Ddbox
@@ -62,8 +62,7 @@ Body:
- Item: Ein_1HGUN
- Item: Ein_1H_Foxtail
- Item: Metal_Rifine_Ticket
ResultRefine:
- Level: 7
ResultRefine: 7
CardsAllowed: true
TargetItems:
- Item: Metal_Katar
@@ -118,11 +117,8 @@ Body:
- Item: Temporal_M_Dex
- Item: Temporal_M_Luk
- Item: Frozen_Box_IL
ResultRefine:
- Level: 7
- Level: 8
- Level: 9
- Level: 10
ResultRefineMinimum: 7
ResultRefineMaximum: 10
MinimumRefine: 4
MaximumRefine: 9
CardsAllowed: true
@@ -133,8 +129,7 @@ Body:
- Item: Clack_Of_Servival_IL
- Item: Herald_Of_GOD_IL
- Item: True_Hunting_9Refine
ResultRefine:
- Level: 9
ResultRefine: 9
MaximumRefine: 8
CardsAllowed: true
TargetItems:
@@ -157,27 +152,8 @@ Body:
# - Item: True_Hunting_Ring2
# Source: https://ro.gnjoy.com/news/probability/View.asp?seq=3954806
- Item: Shadow_Refine_Hammer
ResultRefine:
- Level: 1
Rate: 440
- Level: 2
Rate: 879
- Level: 3
Rate: 1703
- Level: 4
Rate: 3516
- Level: 5
Rate: 1758
- Level: 6
Rate: 879
- Level: 7
Rate: 440
- Level: 8
Rate: 220
- Level: 9
Rate: 110
- Level: 10
Rate: 55
ResultRefineMinimum: 1
ResultRefineMaximum: 10
MaximumRefine: 9
CardsAllowed: true
TargetItems:
@@ -1719,8 +1695,7 @@ Body:
- Item: Lava_Leather_Suits
- Item: Lava_Leather_Robe
- Item: Shadow_9_Refine_Hammer
ResultRefine:
- Level: 9
ResultRefine: 9
MaximumRefine: 8
CardsAllowed: true
TargetItems:
@@ -2708,8 +2683,7 @@ Body:
- Item: Comp_Light_Blade
- Item: Comp_Scalet_DragonL_Bow
- Item: Boost_Up_1
ResultRefine:
- Level: 10
ResultRefine: 10
MaximumRefine: 9
CardsAllowed: true
TargetItems:
@@ -2726,8 +2700,7 @@ Body:
- Item: Defn_Muffler
- Item: Defn_Shoes
- Item: Boost_Up_2
ResultRefine:
- Level: 10
ResultRefine: 10
CardsAllowed: true
TargetItems:
- Item: Boost_TH_Sword
@@ -2749,8 +2722,7 @@ Body:
- Item: Boost_Soul_Rod
- Item: Boost_Foxtail
- Item: Metal_7_Ticket
ResultRefine:
- Level: 7
ResultRefine: 7
MaximumRefine: 6
CardsAllowed: true
TargetItems:
@@ -2767,8 +2739,7 @@ Body:
- Item: Metal_Revolver
- Item: Metal_Huuma_Shuriken
- Item: Noblesse_Rifine_Ticket
ResultRefine:
- Level: 9
ResultRefine: 9
CardsAllowed: true
TargetItems:
- Item: Noblesse_Breath_Armor
@@ -2812,8 +2783,7 @@ Body:
- Item: Noblesse_Attack_Manteau
- Item: Noblesse_Magic_Manteau
- Item: Imperial_Rifine_Ticket
ResultRefine:
- Level: 9
ResultRefine: 9
CardsAllowed: true
TargetItems:
- Item: Imperial_Breath_Armor
@@ -2857,8 +2827,7 @@ Body:
- Item: Imperial_Attack_Manteau
- Item: Imperial_Magic_Manteau
- Item: Grace_Rifine_Ticket
ResultRefine:
- Level: 9
ResultRefine: 9
CardsAllowed: true
TargetItems:
- Item: Grace_Breath_Armor
@@ -3862,8 +3831,7 @@ Body:
# - Item: S_Evilcurse_Pendant
# - Item: S_Evilcurse_Shoes
- Item: Illu_Enhance_Cube
ResultRefine:
- Level: 7
ResultRefine: 7
MinimumRefine: 4
MaximumRefine: 6
CardsAllowed: true
@@ -3875,8 +3843,7 @@ Body:
- Item: Illusion_Leg_A
- Item: Illusion_Leg_B
- Item: Auto_Enhance_Cube
ResultRefine:
- Level: 7
ResultRefine: 7
MinimumRefine: 4
MaximumRefine: 6
CardsAllowed: true
@@ -3888,8 +3855,7 @@ Body:
- Item: Auto_Leg_A
- Item: Auto_Leg_B
- Item: Temporal_Refine_Cube
ResultRefine:
- Level: 11
ResultRefine: 11
MaximumRefine: 10
CardsAllowed: true
TargetItems:
@@ -3930,8 +3896,7 @@ Body:
- Item: Modify_Dex_Boots_
- Item: Modify_Luk_Boots_
- Item: Geffen_Refine_Cube
ResultRefine:
- Level: 12
ResultRefine: 12
MaximumRefine: 11
CardsAllowed: true
TargetItems:
@@ -3940,8 +3905,7 @@ Body:
- Item: Geffen_Magic_Muffler
- Item: Anti_Magic_Manteau
- Item: Old_Refine_Cube
ResultRefine:
- Level: 12
ResultRefine: 12
MaximumRefine: 11
CardsAllowed: true
TargetItems:
@@ -3960,8 +3924,7 @@ Body:
- Item: Old_Protect_Of_Crown
- Item: Old_Camo_RabbitHood
- Item: Refine_Hero_Weapon
ResultRefine:
- Level: 9
ResultRefine: 9
MaximumRefine: 8
CardsAllowed: true
TargetItems:
@@ -4002,15 +3965,13 @@ Body:
- Item: Blue_Crystal_Staff
- Item: Freezing_Rod
- Item: Refine_Hero_Boots
ResultRefine:
- Level: 9
ResultRefine: 9
MaximumRefine: 8
CardsAllowed: true
TargetItems:
- Item: Ancient_Hero_Boots
- Item: OS_Weapon_Refine_Cube
ResultRefine:
- Level: 11
ResultRefine: 11
MaximumRefine: 10
CardsAllowed: true
TargetItems:
@@ -4031,8 +3992,7 @@ Body:
- Item: Kuroiro_OS
- Item: Boost_Lance_OS
- Item: Racecap_Refine_Cube
ResultRefine:
- Level: 11
ResultRefine: 11
MaximumRefine: 10
CardsAllowed: true
TargetItems:
@@ -4056,8 +4016,7 @@ Body:
- Item: Racing_C_Star
- Item: Racing_C_Soul
- Item: Booster_W_Up_1
ResultRefine:
- Level: 9
ResultRefine: 9
MaximumRefine: 8
CardsAllowed: true
TargetItems:
@@ -4087,8 +4046,7 @@ Body:
- Item: MV_B_Violin
- Item: MV_B_Whip
- Item: Booster_W_Up_2
ResultRefine:
- Level: 11
ResultRefine: 11
MaximumRefine: 10
CardsAllowed: true
TargetItems:
@@ -4118,8 +4076,7 @@ Body:
- Item: MV_B_Violin
- Item: MV_B_Whip
- Item: Booster_W_Up_3
ResultRefine:
- Level: 13
ResultRefine: 13
MaximumRefine: 12
CardsAllowed: true
TargetItems:
@@ -4162,8 +4119,7 @@ Body:
- Item: SP_B_Saber
- Item: SI_B_Saber
- Item: E_ILL_Up
ResultRefine:
- Level: 10
ResultRefine: 10
MaximumRefine: 9
CardsAllowed: true
TargetItems:
@@ -4174,8 +4130,7 @@ Body:
- Item: E_Illusion_Leg_A
- Item: E_Illusion_Leg_B
- Item: Auto_Armor_Refine_Cube
ResultRefine:
- Level: 11
ResultRefine: 11
MaximumRefine: 10
CardsAllowed: true
TargetItems:
@@ -4186,8 +4141,7 @@ Body:
- Item: Auto_Leg_A
- Item: Auto_Leg_B
- Item: Bio_Weapon_Refine_Cube
ResultRefine:
- Level: 12
ResultRefine: 12
MaximumRefine: 11
CardsAllowed: true
TargetItems:
@@ -4253,11 +4207,8 @@ Body:
# - Item: MD_Geffen_Shield
# - Item: MD_Geffen_Shield2
- Item: Moonlight_Box_IL
ResultRefine:
- Level: 7
- Level: 8
- Level: 9
- Level: 10
ResultRefineMinimum: 7
ResultRefineMaximum: 10
MinimumRefine: 4
MaximumRefine: 9
CardsAllowed: true
@@ -4272,11 +4223,8 @@ Body:
- Item: Puente_Robe_IL
- Item: Apple_Of_Archer_IL
- Item: S_Moonlight_Box_IL
ResultRefine:
- Level: 9
- Level: 10
- Level: 11
- Level: 12
ResultRefineMinimum: 9
ResultRefineMaximum: 12
MinimumRefine: 4
MaximumRefine: 11
CardsAllowed: true
@@ -4367,11 +4315,8 @@ Body:
- Item: Up_OneSkyOneSun
- Item: Up_SoulWeight
- Item: Vampire_Box_IL
ResultRefine:
- Level: 7
- Level: 8
- Level: 9
- Level: 10
ResultRefineMinimum: 7
ResultRefineMaximum: 10
MinimumRefine: 4
MaximumRefine: 9
CardsAllowed: true
@@ -4383,11 +4328,8 @@ Body:
- Item: Ghoul_Leg_IL
- Item: Cape_Of_Ancient_Lord_IL
- Item: S_Vampire_Box_IL
ResultRefine:
- Level: 9
- Level: 10
- Level: 11
- Level: 12
ResultRefineMinimum: 9
ResultRefineMaximum: 12
MinimumRefine: 4
MaximumRefine: 11
CardsAllowed: true
@@ -4399,11 +4341,8 @@ Body:
- Item: Ghoul_Leg_IL
- Item: Cape_Of_Ancient_Lord_IL
- Item: S_Frozen_Box_IL
ResultRefine:
- Level: 9
- Level: 10
- Level: 11
- Level: 12
ResultRefineMinimum: 9
ResultRefineMaximum: 12
MinimumRefine: 4
MaximumRefine: 11
CardsAllowed: true
@@ -4414,11 +4353,8 @@ Body:
- Item: Clack_Of_Servival_IL
- Item: Herald_Of_GOD_IL
- Item: Turtle_Is_Box_IL
ResultRefine:
- Level: 7
- Level: 8
- Level: 9
- Level: 10
ResultRefineMinimum: 7
ResultRefineMaximum: 10
MinimumRefine: 4
MaximumRefine: 9
CardsAllowed: true
@@ -4430,11 +4366,8 @@ Body:
- Item: Pole_Axe_IL
- Item: Fancy_Flower_IL
- Item: S_Turtle_Is_Box_IL
ResultRefine:
- Level: 9
- Level: 10
- Level: 11
- Level: 12
ResultRefineMinimum: 9
ResultRefineMaximum: 12
MinimumRefine: 4
MaximumRefine: 11
CardsAllowed: true
@@ -4446,11 +4379,8 @@ Body:
- Item: Pole_Axe_IL
- Item: Fancy_Flower_IL
- Item: Teddy_Bear_Box_IL
ResultRefine:
- Level: 7
- Level: 8
- Level: 9
- Level: 10
ResultRefineMinimum: 7
ResultRefineMaximum: 10
MinimumRefine: 4
MaximumRefine: 9
CardsAllowed: true
@@ -4461,11 +4391,8 @@ Body:
- Item: Headband_Of_Power_IL
- Item: Boots_IL
- Item: S_Teddy_Bear_Box_IL
ResultRefine:
- Level: 9
- Level: 10
- Level: 11
- Level: 12
ResultRefineMinimum: 9
ResultRefineMaximum: 12
MinimumRefine: 4
MaximumRefine: 11
CardsAllowed: true
@@ -4476,11 +4403,8 @@ Body:
- Item: Headband_Of_Power_IL
- Item: Boots_IL
- Item: Luanda_Box_IL
ResultRefine:
- Level: 7
- Level: 8
- Level: 9
- Level: 10
ResultRefineMinimum: 7
ResultRefineMaximum: 10
MinimumRefine: 4
MaximumRefine: 9
CardsAllowed: true
@@ -4492,11 +4416,8 @@ Body:
- Item: Goibne_Shoulder_IL
- Item: Goibne_Boots_IL
- Item: S_Luanda_Box_IL
ResultRefine:
- Level: 9
- Level: 10
- Level: 11
- Level: 12
ResultRefineMinimum: 9
ResultRefineMaximum: 12
MinimumRefine: 4
MaximumRefine: 11
CardsAllowed: true
@@ -4508,11 +4429,8 @@ Body:
- Item: Goibne_Shoulder_IL
- Item: Goibne_Boots_IL
- Item: Labyrinth_Box_IL
ResultRefine:
- Level: 7
- Level: 8
- Level: 9
- Level: 10
ResultRefineMinimum: 7
ResultRefineMaximum: 10
MinimumRefine: 4
MaximumRefine: 9
CardsAllowed: true
@@ -4524,11 +4442,8 @@ Body:
- Item: Morpheus_Hood_IL
- Item: Morpheus_Shawl_IL
- Item: S_Teddy_Labyrinth_IL
ResultRefine:
- Level: 9
- Level: 10
- Level: 11
- Level: 12
ResultRefineMinimum: 9
ResultRefineMaximum: 12
MinimumRefine: 4
MaximumRefine: 11
CardsAllowed: true
@@ -4540,11 +4455,8 @@ Body:
- Item: Morpheus_Hood_IL
- Item: Morpheus_Shawl_IL
- Item: Underwater_Box_IL
ResultRefine:
- Level: 7
- Level: 8
- Level: 9
- Level: 10
ResultRefineMinimum: 7
ResultRefineMaximum: 10
MinimumRefine: 4
MaximumRefine: 9
CardsAllowed: true
@@ -4561,11 +4473,8 @@ Body:
- Item: Morrigane_Helm_IL
- Item: Morrigane_Manyeau_IL
- Item: S_Underwater_Box_IL
ResultRefine:
- Level: 9
- Level: 10
- Level: 11
- Level: 12
ResultRefineMinimum: 9
ResultRefineMaximum: 12
MinimumRefine: 4
MaximumRefine: 11
CardsAllowed: true
@@ -4582,8 +4491,7 @@ Body:
- Item: Morrigane_Helm_IL
- Item: Morrigane_Manyeau_IL
- Item: Circlet_Refine_Cube
ResultRefine:
- Level: 11
ResultRefine: 11
MaximumRefine: 10
CardsAllowed: true
TargetItems:
@@ -4798,8 +4706,7 @@ Body:
# - Item: Blue_Mental_Pendant
# - Item: Red_Force_Pendant
- Item: GrayWolf_7_Ticket
ResultRefine:
- Level: 7
ResultRefine: 7
MaximumRefine: 6
CardsAllowed: true
TargetItems:
@@ -4810,8 +4717,7 @@ Body:
- Item: Gray_W_Boots
- Item: Gray_W_Shoes
- Item: GrayWolf_9_Ticket
ResultRefine:
- Level: 9
ResultRefine: 9
MaximumRefine: 8
CardsAllowed: true
TargetItems:
@@ -4986,8 +4892,7 @@ Body:
# - Item: Vivatus_F_C_Humma
# - Item: Vivatus_F_Humma
- Item: Bio_Helm_Refine_Cube
ResultRefine:
- Level: 11
ResultRefine: 11
MaximumRefine: 10
CardsAllowed: true
TargetItems:
@@ -5004,11 +4909,8 @@ Body:
- Item: BioWeapon_Helm_SC
- Item: BioWeapon_Helm_GC
- Item: Twins_Box_IL
ResultRefine:
- Level: 7
- Level: 8
- Level: 9
- Level: 10
ResultRefineMinimum: 7
ResultRefineMaximum: 10
MinimumRefine: 4
MaximumRefine: 9
CardsAllowed: true
@@ -5025,11 +4927,8 @@ Body:
- Item: Dea_Staff_IL
- Item: Sprint_Mail_IL
- Item: S_Twins_Box_IL
ResultRefine:
- Level: 9
- Level: 10
- Level: 11
- Level: 12
ResultRefineMinimum: 9
ResultRefineMaximum: 12
MinimumRefine: 4
MaximumRefine: 11
CardsAllowed: true
@@ -5246,8 +5145,7 @@ Body:
# - Item: S_Creative_Weapon
# - Item: S_Creative_Shield
- Item: Snow_F_Refine
ResultRefine:
- Level: 9
ResultRefine: 9
MaximumRefine: 8
CardsAllowed: true
TargetItems:
@@ -5258,8 +5156,7 @@ Body:
- Item: Snowflower_Boots
- Item: Snowflower_Shoes
- Item: Glacier_W_Refine
ResultRefine:
- Level: 9
ResultRefine: 9
MaximumRefine: 8
CardsAllowed: true
TargetItems:
@@ -5314,8 +5211,7 @@ Body:
# - Item: S_M_Mammoth_Earring
# - Item: S_M_Mammoth_Pendant
- Item: SubjectCape_Refine_Cube
ResultRefine:
- Level: 12
ResultRefine: 12
MaximumRefine: 11
CardsAllowed: true
TargetItems:
@@ -5323,8 +5219,7 @@ Body:
- Item: Subject_CapeMagic_TH
- Item: Subject_CapeMelee_TH
- Item: GMT_Robe_Stone
ResultRefine:
- Level: 12
ResultRefine: 12
MaximumRefine: 11
CardsAllowed: true
TargetItems:

View File

@@ -10125,6 +10125,7 @@ Body:
FixedCastTime: 700
CastTimeFlags:
IgnoreDex: true
IgnoreItemBonus: true
Requires:
SpCost:
- Level: 1
@@ -35442,7 +35443,7 @@ Body:
Element: Water
CastCancel: true
CastTime: 3000
AfterCastActDelay: 250
AfterCastActDelay: 750
Duration1: 4000
Cooldown: 5000
FixedCastTime: 1500
@@ -35489,7 +35490,7 @@ Body:
Element: Dark
CastCancel: true
CastTime: 4000
AfterCastActDelay: 500
AfterCastActDelay: 750
Duration1: 4000
Cooldown: 4000
FixedCastTime: 1500
@@ -35546,7 +35547,7 @@ Body:
Area: 4
CastCancel: true
CastTime: 4000
AfterCastActDelay: 500
AfterCastActDelay: 1000
Duration1:
- Level: 1
Time: 1200
@@ -35597,7 +35598,7 @@ Body:
Description: Violent Quake Attack
MaxLevel: 5
Type: Magic
TargetType: Attack
TargetType: Ground
Range: 9
Hit: Single
HitCount: 1
@@ -35674,7 +35675,7 @@ Body:
Element: Earth
CastCancel: true
CastTime: 3000
AfterCastActDelay: 250
AfterCastActDelay: 750
Duration1: 4000
Cooldown: 5000
FixedCastTime: 1500
@@ -35731,7 +35732,7 @@ Body:
Area: 4
CastCancel: true
CastTime: 4000
AfterCastActDelay: 500
AfterCastActDelay: 1000
Duration1:
- Level: 1
Time: 1200
@@ -35782,7 +35783,7 @@ Body:
Description: All Bloom Attack
MaxLevel: 5
Type: Magic
TargetType: Attack
TargetType: Ground
Range: 9
Hit: Single
HitCount: 1
@@ -35802,7 +35803,7 @@ Body:
Description: All Bloom Attack 2
MaxLevel: 5
Type: Magic
TargetType: Attack
TargetType: Ground
Range: 9
Hit: Single
HitCount: 1
@@ -35873,7 +35874,7 @@ Body:
Description: Crystal Impact Attack
MaxLevel: 5
Type: Magic
TargetType: Attack
TargetType: Ground
DamageFlags:
Splash: true
Hit: Single
@@ -35893,7 +35894,7 @@ Body:
Element: Wind
CastCancel: true
CastTime: 3000
AfterCastActDelay: 250
AfterCastActDelay: 750
Duration1: 3000
Cooldown: 5000
FixedCastTime: 1500
@@ -35944,7 +35945,7 @@ Body:
Element: Fire
CastCancel: true
CastTime: 3000
AfterCastActDelay: 250
AfterCastActDelay: 750
Duration1: 5000
Cooldown: 5000
FixedCastTime: 1500
@@ -36012,7 +36013,7 @@ Body:
Area: 5
CastCancel: true
CastTime: 8000
AfterCastActDelay: 500
AfterCastActDelay: 1000
Duration1: 6000
Cooldown: 6000
FixedCastTime: 2000
@@ -36052,7 +36053,7 @@ Body:
Description: Astral Strike Attack
MaxLevel: 10
Type: Magic
TargetType: Attack
TargetType: Ground
Range: 9
Hit: Single
HitCount: 1
@@ -36071,11 +36072,11 @@ Body:
CastCancel: true
AfterCastActDelay: 300
Duration1: 300000
Cooldown: 300000
Cooldown: 60000
FixedCastTime: 4000
Requires:
SpCost: 60
ApCost: 150
ApCost: 125
Status: Climax
- Id: 5233
Name: AG_ROCK_DOWN
@@ -36241,8 +36242,8 @@ Body:
TargetType: Self
DamageFlags:
Splash: true
Hit: Single
HitCount: 1
Hit: Multi_Hit
HitCount: -3
Element: Water
SplashArea:
- Level: 1
@@ -37534,15 +37535,16 @@ Body:
Range: 9
Hit: Multi_Hit
HitCount: -10
Element: Holy
Element: Neutral
CastCancel: true
CastTime: 3000
AfterCastActDelay: 500
Duration1: 12000
Cooldown: 5000
FixedCastTime: 2000
Requires:
SpCost: 150
ApCost: 30
ApCost: 20
Unit:
Id: Pneumaticus_Procella
Range:
@@ -38051,7 +38053,7 @@ Body:
IgnoreDefense: true
Range: 2
Hit: Multi_Hit
HitCount: 2
HitCount: 3
Element: Weapon
GiveAp: 2
CastCancel: true
@@ -39158,11 +39160,11 @@ Body:
CastCancel: true
AfterCastActDelay: 500
Duration1: 180000
Cooldown: 180000
Cooldown: 60000
FixedCastTime: 1000
Requires:
SpCost: 300
ApCost: 200
ApCost: 125
Status: CalamityGale
- Id: 5329
Name: WH_HAWKBOOMERANG
@@ -39223,7 +39225,7 @@ Body:
CastCancel: true
CastTime: 3500
AfterCastActDelay: 500
Cooldown: 1200
Cooldown: 700
FixedCastTime: 500
Requires:
SpCost:
@@ -41385,6 +41387,786 @@ Body:
SplashArea: 6
Requires:
SpCost: 1
- Id: 5449
Name: HN_SELFSTUDY_TATICS
Description: Self Study Tactics
MaxLevel: 10
- Id: 5450
Name: HN_SELFSTUDY_SOCERY
Description: Self Study Sorcery
MaxLevel: 10
- Id: 5451
Name: HN_DOUBLEBOWLINGBASH
Description: Double Bowling Bash
MaxLevel: 10
Type: Weapon
TargetType: Attack
Range: 2
Hit: Multi_Hit
HitCount: 3
Element: Weapon
DamageFlags:
Splash: true
SplashArea: 4
Knockback: 1
CastCancel: true
CastTime: 300
AfterCastActDelay: 1000
GiveAp: 3
Cooldown: 1000
FixedCastTime: 200
Duration2: 1000
Requires:
SpCost:
- Level: 1
Amount: 38
- Level: 2
Amount: 41
- Level: 3
Amount: 44
- Level: 4
Amount: 47
- Level: 5
Amount: 50
- Level: 6
Amount: 53
- Level: 7
Amount: 56
- Level: 8
Amount: 59
- Level: 9
Amount: 62
- Level: 10
Amount: 65
Status: Hnnoweapon
- Id: 5452
Name: HN_MEGA_SONIC_BLOW
Description: Mega Sonic Blow
MaxLevel: 10
Type: Weapon
TargetType: Attack
DamageFlags:
Critical: true
Range: 2
Hit: Multi_Hit
HitCount: -8
GiveAp: 2
Element: Weapon
AfterCastActDelay: 500
Cooldown: 350
Duration2: 5000
Requires:
SpCost:
- Level: 1
Amount: 42
- Level: 2
Amount: 44
- Level: 3
Amount: 46
- Level: 4
Amount: 48
- Level: 5
Amount: 50
- Level: 6
Amount: 52
- Level: 7
Amount: 54
- Level: 8
Amount: 56
- Level: 9
Amount: 58
- Level: 10
Amount: 60
- Id: 5453
Name: HN_SHIELD_CHAIN_RUSH
Description: Shield Chain Rush
MaxLevel: 10
Type: Weapon
TargetType: Attack
Range: 7
Hit: Multi_Hit
HitCount: -5
DamageFlags:
Splash: true
SplashArea: 4
GiveAp: 2
Element: Weapon
CastCancel: true
CastTime: 1200
AfterCastActDelay: 500
Cooldown: 350
FixedCastTime: 300
Duration1: 5000
Duration2: 1200
Requires:
SpCost:
- Level: 1
Amount: 35
- Level: 2
Amount: 38
- Level: 3
Amount: 41
- Level: 4
Amount: 44
- Level: 5
Amount: 47
- Level: 6
Amount: 50
- Level: 7
Amount: 53
- Level: 8
Amount: 56
- Level: 9
Amount: 59
- Level: 10
Amount: 62
State: Shield
Status: Shieldchainrush
- Id: 5454
Name: HN_SPIRAL_PIERCE_MAX
Description: Spiral Pierce Max
MaxLevel: 10
Type: Weapon
TargetType: Attack
Range: 7
Hit: Multi_Hit
HitCount: -5
Element: Weapon
GiveAp: 2
CastCancel: true
CastTime: 1000
AfterCastActDelay: 500
Cooldown: 350
FixedCastTime: 300
Duration2: 2000
Requires:
SpCost:
- Level: 1
Amount: 37
- Level: 2
Amount: 39
- Level: 3
Amount: 41
- Level: 4
Amount: 43
- Level: 5
Amount: 45
- Level: 6
Amount: 47
- Level: 7
Amount: 49
- Level: 8
Amount: 51
- Level: 9
Amount: 53
- Level: 10
Amount: 55
- Id: 5455
Name: HN_METEOR_STORM_BUSTER
Description: Meteor Storm Buster
MaxLevel: 10
Type: Magic
TargetType: Ground
Range: -9
Hit: Multi_Hit
HitCount: 1
Element: Fire
GiveAp: 3
DamageFlags:
Splash: true
SplashArea: 2
CastCancel: true
CastTime: 4000
Cooldown:
- Level: 1
Time: 2100
- Level: 2
Time: 2200
- Level: 3
Time: 2300
- Level: 4
Time: 2400
- Level: 5
Time: 2500
- Level: 6
Time: 2600
- Level: 7
Time: 2700
- Level: 8
Time: 2800
- Level: 9
Time: 2900
- Level: 10
Time: 3000
FixedCastTime: 1500
Duration1:
- Level: 1
Time: 1000
- Level: 2
Time: 1000
- Level: 3
Time: 1500
- Level: 4
Time: 1500
- Level: 5
Time: 2000
- Level: 6
Time: 2000
- Level: 7
Time: 2000
- Level: 8
Time: 2500
- Level: 9
Time: 2500
- Level: 10
Time: 2500
Duration2: 500
Requires:
SpCost:
- Level: 1
Amount: 74
- Level: 2
Amount: 78
- Level: 3
Amount: 82
- Level: 4
Amount: 86
- Level: 5
Amount: 90
- Level: 6
Amount: 94
- Level: 7
Amount: 98
- Level: 8
Amount: 102
- Level: 9
Amount: 106
- Level: 10
Amount: 110
Unit:
Id: Dummyskill
Range:
- Level: 1
Size: 3
- Level: 2
Size: 3
- Level: 3
Size: 3
- Level: 4
Size: 3
- Level: 5
Size: 3
- Level: 6
Size: 3
- Level: 7
Size: 3
- Level: 8
Size: 4
- Level: 9
Size: 4
- Level: 10
Size: 4
Interval: 1500
Target: Enemy
Flag:
PathCheck: true
- Id: 5456
Name: HN_JUPITEL_THUNDER_STORM
Description: Jupitel Thunderstorm
MaxLevel: 10
Type: Magic
TargetType: Attack
Range: 11
Hit: Multi_Hit
HitCount: -10
Element: Wind
GiveAp: 2
DamageFlags:
Splash: true
SplashArea:
- Level: 1
Area: 2
- Level: 2
Area: 2
- Level: 3
Area: 2
- Level: 4
Area: 2
- Level: 5
Area: 3
- Level: 6
Area: 3
- Level: 7
Area: 3
- Level: 8
Area: 3
- Level: 9
Area: 4
- Level: 10
Area: 4
CastCancel: true
CastTime:
- Level: 1
Time: 1100
- Level: 2
Time: 1200
- Level: 3
Time: 1300
- Level: 4
Time: 1400
- Level: 5
Time: 1500
- Level: 6
Time: 1600
- Level: 7
Time: 1700
- Level: 8
Time: 1800
- Level: 9
Time: 1900
- Level: 10
Time: 2000
AfterCastActDelay: 500
Cooldown: 1800
FixedCastTime: 1000
Requires:
SpCost:
- Level: 1
Amount: 75
- Level: 2
Amount: 80
- Level: 3
Amount: 85
- Level: 4
Amount: 90
- Level: 5
Amount: 95
- Level: 6
Amount: 100
- Level: 7
Amount: 105
- Level: 8
Amount: 110
- Level: 9
Amount: 115
- Level: 10
Amount: 120
- Id: 5457
Name: HN_JACK_FROST_NOVA
Description: Jack Frost Nova
MaxLevel: 10
Type: Magic
TargetType: Ground
Range: -9
Hit: Multi_Hit
HitCount: -2
Element: Water
GiveAp: 3
DamageFlags:
Splash: true
SplashArea:
- Level: 1
Area: 3
- Level: 2
Area: 3
- Level: 3
Area: 3
- Level: 4
Area: 3
- Level: 5
Area: 3
- Level: 6
Area: 4
- Level: 7
Area: 4
- Level: 8
Area: 4
- Level: 9
Area: 4
- Level: 10
Area: 4
CastCancel: true
CastTime:
- Level: 1
Time: 1600
- Level: 2
Time: 1700
- Level: 3
Time: 1800
- Level: 4
Time: 1900
- Level: 5
Time: 2000
- Level: 6
Time: 2100
- Level: 7
Time: 2200
- Level: 8
Time: 2300
- Level: 9
Time: 2400
- Level: 10
Time: 2500
AfterCastActDelay: 300
Cooldown: 3000
FixedCastTime: 1500
Duration1:
- Level: 1
Time: 900
- Level: 2
Time: 1200
- Level: 3
Time: 1500
- Level: 4
Time: 1800
- Level: 5
Time: 2100
- Level: 6
Time: 2400
- Level: 7
Time: 2700
- Level: 8
Time: 3000
- Level: 9
Time: 3300
- Level: 10
Time: 3600
Duration2: 5000
Requires:
SpCost:
- Level: 1
Amount: 68
- Level: 2
Amount: 71
- Level: 3
Amount: 74
- Level: 4
Amount: 77
- Level: 5
Amount: 80
- Level: 6
Amount: 83
- Level: 7
Amount: 86
- Level: 8
Amount: 89
- Level: 9
Amount: 92
- Level: 10
Amount: 95
Unit:
Id: JACK_FROST_NOVA
Range:
- Level: 1
Size: 3
- Level: 2
Size: 3
- Level: 3
Size: 3
- Level: 4
Size: 3
- Level: 5
Size: 3
- Level: 6
Size: 4
- Level: 7
Size: 4
- Level: 8
Size: 4
- Level: 9
Size: 4
- Level: 10
Size: 4
Interval: 300
Target: Enemy
Flag:
PathCheck: true
Status: Mistyfrost
- Id: 5458
Name: HN_HELLS_DRIVE
Description: Hell's Drive
MaxLevel: 10
Type: Magic
TargetType: Self
Range: 1
Hit: Multi_Hit
HitCount: -3
Element: Earth
GiveAp: 2
DamageFlags:
Splash: true
SplashArea:
- Level: 1
Area: 1
- Level: 2
Area: 1
- Level: 3
Area: 1
- Level: 4
Area: 2
- Level: 5
Area: 2
- Level: 6
Area: 2
- Level: 7
Area: 3
- Level: 8
Area: 3
- Level: 9
Area: 3
- Level: 10
Area: 4
CastCancel: true
CastTime: 1200
AfterCastActDelay: 1000
Cooldown:
- Level: 1
Time: 2500
- Level: 2
Time: 2300
- Level: 3
Time: 2100
- Level: 4
Time: 1900
- Level: 5
Time: 1700
- Level: 6
Time: 1500
- Level: 7
Time: 1300
- Level: 8
Time: 1100
- Level: 9
Time: 900
- Level: 10
Time: 700
FixedCastTime: 1000
Requires:
SpCost:
- Level: 1
Amount: 88
- Level: 2
Amount: 91
- Level: 3
Amount: 94
- Level: 4
Amount: 97
- Level: 5
Amount: 100
- Level: 6
Amount: 103
- Level: 7
Amount: 106
- Level: 8
Amount: 109
- Level: 9
Amount: 112
- Level: 10
Amount: 115
- Id: 5459
Name: HN_GROUND_GRAVITATION
Description: Ground Gravitation
MaxLevel: 10
Type: Magic
TargetType: Self
Range: -9
Hit: Multi_Hit
HitCount: 1
Element: Neutral
GiveAp: 5
DamageFlags:
Splash: true
SplashArea:
- Level: 1
Area: 2
- Level: 2
Area: 2
- Level: 3
Area: 2
- Level: 4
Area: 2
- Level: 5
Area: 3
- Level: 6
Area: 3
- Level: 7
Area: 3
- Level: 8
Area: 3
- Level: 9
Area: 4
- Level: 10
Area: 4
CastCancel: true
CastTime:
- Level: 1
Time: 3000
- Level: 2
Time: 3000
- Level: 3
Time: 3000
- Level: 4
Time: 3200
- Level: 5
Time: 3500
- Level: 6
Time: 3800
- Level: 7
Time: 4100
- Level: 8
Time: 4400
- Level: 9
Time: 4700
- Level: 10
Time: 5000
AfterCastActDelay:
- Level: 1
Time: 2000
- Level: 2
Time: 2000
- Level: 3
Time: 2000
- Level: 4
Time: 1800
- Level: 5
Time: 1800
- Level: 6
Time: 1800
- Level: 7
Time: 1600
- Level: 8
Time: 1400
- Level: 9
Time: 1200
- Level: 10
Time: 1000
Cooldown: 5000
FixedCastTime: 1500
Duration1: 5000
Duration2: 5000
Requires:
SpCost:
- Level: 1
Amount: 93
- Level: 2
Amount: 96
- Level: 3
Amount: 99
- Level: 4
Amount: 102
- Level: 5
Amount: 105
- Level: 6
Amount: 108
- Level: 7
Amount: 111
- Level: 8
Amount: 114
- Level: 9
Amount: 117
- Level: 10
Amount: 120
Unit:
Id: GROUND_GRAVITATION
Range:
- Level: 1
Size: 2
- Level: 2
Size: 2
- Level: 3
Size: 2
- Level: 4
Size: 2
- Level: 5
Size: 3
- Level: 6
Size: 3
- Level: 7
Size: 3
- Level: 8
Size: 3
- Level: 9
Size: 4
- Level: 10
Size: 4
Interval: 500
Target: Enemy
Flag:
PathCheck: true
Status: Groundgravity
- Id: 5460
Name: HN_NAPALM_VULCAN_STRIKE
Description: Napalm Vulcan Strike
MaxLevel: 10
Type: Magic
TargetType: Attack
Range: 11
Hit: Multi_Hit
HitCount: -7
Element: Ghost
GiveAp: 2
DamageFlags:
Splash: true
SplashArea: 3
CastCancel: true
CastTime: 500
Cooldown: 300
AfterCastActDelay: 500
FixedCastTime: 1000
Requires:
SpCost:
- Level: 1
Amount: 48
- Level: 2
Amount: 51
- Level: 3
Amount: 54
- Level: 4
Amount: 57
- Level: 5
Amount: 60
- Level: 6
Amount: 63
- Level: 7
Amount: 66
- Level: 8
Amount: 69
- Level: 9
Amount: 72
- Level: 10
Amount: 75
- Id: 5461
Name: HN_BREAKINGLIMIT
Description: Breaking Limit
MaxLevel: 1
Type: Magic
TargetType: Self
DamageFlags:
NoDamage: true
Duration1: 300000
Cooldown: 60000
CastCancel: true
FixedCastTime: 1000
Requires:
SpCost: 150
ApCost: 150
Status: Breakinglimit
- Id: 5462
Name: HN_RULEBREAK
Description: Rule Break
MaxLevel: 1
Type: Magic
TargetType: Self
DamageFlags:
NoDamage: true
Duration1: 300000
Cooldown: 60000
CastCancel: true
FixedCastTime: 1000
Requires:
SpCost: 150
ApCost: 150
Status: Rulebreak
- Id: 6001
Name: DK_DRAGONIC_BREATH
Description: Dragonic Breath

View File

@@ -7864,3 +7864,89 @@ Body:
Royal_Guard: true
Royal_Guard_T: true
Imperial_Guard: true
- Job: Hyper_Novice
Inherit:
Novice: true
Supernovice: true
Super_Novice_E: true
Tree:
- Name: HN_SELFSTUDY_TATICS
MaxLevel: 10
- Name: HN_SELFSTUDY_SOCERY
MaxLevel: 10
- Name: HN_DOUBLEBOWLINGBASH
MaxLevel: 10
Requires:
- Name: HN_SELFSTUDY_TATICS
Level: 5
- Name: HN_SHIELD_CHAIN_RUSH
MaxLevel: 10
Requires:
- Name: HN_SELFSTUDY_TATICS
Level: 5
- Name: HN_METEOR_STORM_BUSTER
MaxLevel: 10
Requires:
- Name: HN_SELFSTUDY_SOCERY
Level: 5
- Name: HN_JUPITEL_THUNDER_STORM
MaxLevel: 10
Requires:
- Name: HN_SELFSTUDY_SOCERY
Level: 5
- Name: HN_JACK_FROST_NOVA
MaxLevel: 10
Requires:
- Name: HN_SELFSTUDY_SOCERY
Level: 5
- Name: HN_HELLS_DRIVE
MaxLevel: 10
Requires:
- Name: HN_SELFSTUDY_SOCERY
Level: 5
- Name: HN_MEGA_SONIC_BLOW
MaxLevel: 10
Requires:
- Name: HN_DOUBLEBOWLINGBASH
Level: 7
- Name: HN_SPIRAL_PIERCE_MAX
MaxLevel: 10
Requires:
- Name: HN_SHIELD_CHAIN_RUSH
Level: 7
- Name: HN_GROUND_GRAVITATION
MaxLevel: 10
Requires:
- Name: HN_SELFSTUDY_SOCERY
Level: 5
- Name: HN_NAPALM_VULCAN_STRIKE
MaxLevel: 10
Requires:
- Name: HN_SELFSTUDY_SOCERY
Level: 5
- Name: HN_BREAKINGLIMIT
MaxLevel: 1
Requires:
- Name: HN_DOUBLEBOWLINGBASH
Level: 7
- Name: HN_MEGA_SONIC_BLOW
Level: 7
- Name: HN_SHIELD_CHAIN_RUSH
Level: 7
- Name: HN_SPIRAL_PIERCE_MAX
Level: 7
- Name: HN_RULEBREAK
MaxLevel: 1
Requires:
- Name: HN_METEOR_STORM_BUSTER
Level: 5
- Name: HN_JUPITEL_THUNDER_STORM
Level: 5
- Name: HN_JACK_FROST_NOVA
Level: 5
- Name: HN_HELLS_DRIVE
Level: 5
- Name: HN_GROUND_GRAVITATION
Level: 5
- Name: HN_NAPALM_VULCAN_STRIKE
Level: 5

View File

@@ -582,3 +582,33 @@ Body:
- Level: 250
Points: 4099
TraitPoints: 190
- Level: 251
Points: 4099
TraitPoints: 193
- Level: 252
Points: 4099
TraitPoints: 196
- Level: 253
Points: 4099
TraitPoints: 199
- Level: 254
Points: 4099
TraitPoints: 202
- Level: 255
Points: 4099
TraitPoints: 209
- Level: 256
Points: 4099
TraitPoints: 212
- Level: 257
Points: 4099
TraitPoints: 215
- Level: 258
Points: 4099
TraitPoints: 218
- Level: 259
Points: 4099
TraitPoints: 221
- Level: 260
Points: 4099
TraitPoints: 228

View File

@@ -7890,6 +7890,8 @@ Body:
BlEffect: true
DisplayPc: true
SendVal1: true
NoDispell: true
NoClearance: true
- Status: Shadow_Weapon
Icon: EFST_SHADOW_WEAPON
DurationLookup: SHC_ENCHANTING_SHADOW
@@ -8753,3 +8755,31 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
- Status: Hnnoweapon
Icon: EFST_NOEQUIPWEAPON
DurationLookup: HN_DOUBLEBOWLINGBASH
- Status: Shieldchainrush
Icon: EFST_SHIELDCHAINRUSH
DurationLookup: HN_SHIELD_CHAIN_RUSH
CalcFlags:
Speed: true
Flags:
BossResist: true
- Status: Mistyfrost
Icon: EFST_MISTYFROST
DurationLookup: HN_JACK_FROST_NOVA
Flags:
BossResist: true
- Status: Groundgravity
Icon: EFST_GROUNDGRAVITY
DurationLookup: HN_GROUND_GRAVITATION
CalcFlags:
Speed: true
Flags:
BossResist: true
- Status: Breakinglimit
Icon: EFST_BREAKINGLIMIT
DurationLookup: HN_BREAKINGLIMIT
- Status: Rulebreak
Icon: EFST_RULEBREAK
DurationLookup: HN_RULEBREAK

View File

@@ -11412,3 +11412,37 @@ Example:
autoloot(10000); // 100.00%
---------------------------------------
*setdialogalign(<align>);
Set vertical or horizontal align in NPC dialog.
Valid aligns:
- horizontal align:
DIALOG_ALIGN_LEFT
DIALOG_ALIGN_CENTER
DIALOG_ALIGN_RIGHT
- vertical align:
DIALOG_ALIGN_TOP
DIALOG_ALIGN_MIDDLE
DIALOG_ALIGN_BOTTOM
---------------------------------------
*setdialogsize(<width>, <height>)
Set size for NPC dialog in pixels.
---------------------------------------
*setdialogpos(<x>, <y>)
Set position for NPC dialog in pixels.
---------------------------------------
*setdialogpospercent(<x>, <y>)
Set position for NPC dialog in screen size percent.
---------------------------------------

View File

@@ -412,6 +412,20 @@ Body:
- Index: 3
Item: IllusionStone
Amount: 120
- Name: resonance_stone_barter
Items:
- Index: 0
Item: ILL_Piece_A
RequiredItems:
- Index: 0
Item: IllusionStone
Amount: 10
- Index: 1
Item: ILL_Piece_B
RequiredItems:
- Index: 0
Item: IllusionStone
Amount: 10
- Name: barter_ill_moonlight
Items:
- Index: 0

View File

@@ -14,6 +14,7 @@
//= 1.5 Added Illusion of Luanda enchanter [Capuche]
//= 1.6 Added Illusion of Underwater exchange [Capuche]
//= 1.7 Added Illusion of Twins enchanter [Capuche]
//= 1.8 Added Illusion Merchant [Haydrich]
//============================================================
//============================================================
@@ -846,3 +847,40 @@ OnInit:
setunitdata .@npc_id, UNPC_HAIRCOLOR, 6;
end;
}
//============================================================
//= Illusion Merchant
//============================================================
- marketshop market_resonance_stone -1,100003:2000000:99999,100004:2000000:99999
prontera,88,113,5 script Illusion Merchant#0829 HIDDEN_NPC,{
mes "[Illusion Merchant]";
mes "I'm selling two random optional weapon grant scrolls that I made myself. You can choose the payment method you like.";
next;
switch( select( "Purchase with Zeny.", "Purchase with Illusion Stones" )) {
case 1:
mes "[Illusion Merchant]";
mes "I hope you like it.";
close2;
callshop "market_resonance_stone";
end;
case 2:
mes "[Illusion Merchant]";
mes "I hope you like it.";
close2;
callshop "resonance_stone_barter";
end;
}
OnInit:
.@npc_id = getnpcid(0);
setunitdata .@npc_id,UNPC_CLASS, JOB_MAGE_HIGH;
setunitdata .@npc_id,UNPC_SEX,SEX_FEMALE;
setunitdata .@npc_id,UNPC_HEADTOP,142;
setunitdata .@npc_id,UNPC_HEADMIDDLE,92;
setunitdata .@npc_id,UNPC_HAIRSTYLE,2;
setunitdata .@npc_id,UNPC_HAIRCOLOR,2;
// Restock
npcshopupdate "market_resonance_stone",100003,2000000,99999;
npcshopupdate "market_resonance_stone",100004,2000000,99999;
end;
}

View File

@@ -9,35 +9,66 @@
// monsters killed. [Capuche]
//============================================================
lhz_dun_n,0,0 monster Eremes Guille 3208,20,5000,0,"lhz_dun_n::OnRegularDead"
lhz_dun_n,0,0 monster Magaleta Sorin 3209,10,5000,0,"lhz_dun_n::OnRegularDead"
lhz_dun_n,0,0 monster Catherine Cheiron 3210,15,5000,0,"lhz_dun_n::OnRegularDead"
lhz_dun_n,0,0 monster Shecil Damon 3211,20,5000,0,"lhz_dun_n::OnRegularDead"
lhz_dun_n,0,0 monster Harword Alt-Eisen 3212,10,5000,0,"lhz_dun_n::OnRegularDead"
lhz_dun_n,0,0 monster Seyren Windsor 3213,10,5000,0,"lhz_dun_n::OnRegularDead"
lhz_dun_n,0,0 monster Eremes Guille 3208,20,5000,0,"lhz_dun_n::OnRegularDead3208"
lhz_dun_n,0,0 monster Magaleta Sorin 3209,10,5000,0,"lhz_dun_n::OnRegularDead3209"
lhz_dun_n,0,0 monster Catherine Cheiron 3210,15,5000,0,"lhz_dun_n::OnRegularDead3210"
lhz_dun_n,0,0 monster Shecil Damon 3211,20,5000,0,"lhz_dun_n::OnRegularDead3211"
lhz_dun_n,0,0 monster Harword Alt-Eisen 3212,10,5000,0,"lhz_dun_n::OnRegularDead3212"
lhz_dun_n,0,0 monster Seyren Windsor 3213,10,5000,0,"lhz_dun_n::OnRegularDead3213"
lhz_dun_n,0,0 monster Randel Lawrence 3226,10,5000,0,"lhz_dun_n::OnRegularDead"
lhz_dun_n,0,0 monster Flamel Emule 3227,10,5000,0,"lhz_dun_n::OnRegularDead"
lhz_dun_n,0,0 monster Celia Alde 3228,15,5000,0,"lhz_dun_n::OnRegularDead"
lhz_dun_n,0,0 monster Chen Liu 3229,15,5000,0,"lhz_dun_n::OnRegularDead"
lhz_dun_n,0,0 monster Gertie Wie 3230,15,5000,0,"lhz_dun_n::OnRegularDead"
lhz_dun_n,0,0 monster Alphoccio Basil 3231,10,5000,0,"lhz_dun_n::OnRegularDead"
lhz_dun_n,0,0 monster Trentini 3232,10,5000,0,"lhz_dun_n::OnRegularDead"
lhz_dun_n,0,0 monster Randel Lawrence 3226,10,5000,0,"lhz_dun_n::OnRegularDead3226"
lhz_dun_n,0,0 monster Flamel Emule 3227,10,5000,0,"lhz_dun_n::OnRegularDead3227"
lhz_dun_n,0,0 monster Celia Alde 3228,15,5000,0,"lhz_dun_n::OnRegularDead3228"
lhz_dun_n,0,0 monster Chen Liu 3229,15,5000,0,"lhz_dun_n::OnRegularDead3229"
lhz_dun_n,0,0 monster Gertie Wie 3230,15,5000,0,"lhz_dun_n::OnRegularDead3230"
lhz_dun_n,0,0 monster Alphoccio Basil 3231,10,5000,0,"lhz_dun_n::OnRegularDead3231"
lhz_dun_n,0,0 monster Trentini 3232,10,5000,0,"lhz_dun_n::OnRegularDead3232"
lhz_dun_n,0,0,0 script lhz_dun_n -1,{
end;
OnRegularDead:
.@mob_id = killedrid;
OnRegularDead3208: callsub( S_Regular, 3208 );
OnRegularDead3209: callsub( S_Regular, 3209 );
OnRegularDead3210: callsub( S_Regular, 3210 );
OnRegularDead3211: callsub( S_Regular, 3211 );
OnRegularDead3212: callsub( S_Regular, 3212 );
OnRegularDead3213: callsub( S_Regular, 3213 );
OnRegularDead3226: callsub( S_Regular, 3226 );
OnRegularDead3227: callsub( S_Regular, 3227 );
OnRegularDead3228: callsub( S_Regular, 3228 );
OnRegularDead3229: callsub( S_Regular, 3229 );
OnRegularDead3230: callsub( S_Regular, 3230 );
OnRegularDead3231: callsub( S_Regular, 3231 );
OnRegularDead3232: callsub( S_Regular, 3232 );
S_Regular:
.@mob_id = getarg(0);
if (.lhz_dun_n[.@mob_id] < 110 && .lhz_dun_n_boss == 0) {
.lhz_dun_n[.@mob_id]++;
if (.lhz_dun_n[.@mob_id] == 110) {
.@mini_boss = .@mob_id + 6 + (.@mob_id > 3213); // mini boss version ID: regular ID +6 for non-transcendent, +7 for others
monster "lhz_dun_n",0,0,"--en--",.@mini_boss,1, "lhz_dun_n::OnMiniDead";
.@mini_boss = .@mob_id + 6 + (.@mob_id > 3219); // mini boss version ID: regular ID +6 for non-transcendent, +7 for others
monster "lhz_dun_n",0,0,"--en--",.@mini_boss,1, "lhz_dun_n::OnMiniDead" + .@mini_boss;
}
}
end;
OnMiniDead:
.@mob_id = killedrid;
OnMiniDead3214: callsub( S_Mini, 3214 );
OnMiniDead3215: callsub( S_Mini, 3215 );
OnMiniDead3216: callsub( S_Mini, 3216 );
OnMiniDead3217: callsub( S_Mini, 3217 );
OnMiniDead3218: callsub( S_Mini, 3218 );
OnMiniDead3219: callsub( S_Mini, 3219 );
OnMiniDead3233: callsub( S_Mini, 3233 );
OnMiniDead3234: callsub( S_Mini, 3234 );
OnMiniDead3235: callsub( S_Mini, 3235 );
OnMiniDead3236: callsub( S_Mini, 3236 );
OnMiniDead3237: callsub( S_Mini, 3237 );
OnMiniDead3238: callsub( S_Mini, 3238 );
OnMiniDead3239: callsub( S_Mini, 3239 );
S_Mini:
.@mob_id = getarg(0);
if (.lhz_dun_n[.@mob_id] < 4 && .lhz_dun_n_boss == 0) {
.lhz_dun_n[.@mob_id]++;
.@regular = .@mob_id - 6 - (.@mob_id > 3219);
@@ -53,11 +84,7 @@ OnMiniDead:
monster "lhz_dun_n",140,230,"--en--", F_Rand(3220,3221,3222,3223,3224,3225,3240,3241,3242,3243,3244,3245,3246),1, "lhz_dun_n::OnMyMVPDead";
mapannounce "lhz_dun_n", "Voice of Reaper: It's been a while.", bc_map; // unknown message
.lhz_dun_n_boss = 1;
for ( .@i = 0; .@i < 13; ++.@i ) {
.@regular = .@mini_boss_list[.@i] - 6 - (.@mini_boss_list[.@i] > 3219);
.lhz_dun_n[.@regular] = 0;
.lhz_dun_n[.@mini_boss_list[.@i]] = 0;
}
deletearray .lhz_dun_n;
}
}
end;

View File

@@ -69,52 +69,6 @@ int levenshtein(const std::string &s1, const std::string &s2)
return result;
}
bool rathena::util::safe_substraction( int64 a, int64 b, int64& result ){
#if __has_builtin( __builtin_sub_overflow ) || ( defined( __GNUC__ ) && !defined( __clang__ ) && defined( GCC_VERSION ) && GCC_VERSION >= 50100 )
return __builtin_sub_overflow( a, b, &result );
#else
bool overflow = false;
if( b < 0 ){
if( a > ( INT64_MAX + b ) ){
overflow = true;
}
}else{
if( a < ( INT64_MIN + b ) ){
overflow = true;
}
}
result = a - b;
return overflow;
#endif
}
bool rathena::util::safe_multiplication( int64 a, int64 b, int64& result ){
#if __has_builtin( __builtin_mul_overflow ) || ( defined( __GNUC__ ) && !defined( __clang__ ) && defined( GCC_VERSION ) && GCC_VERSION >= 50100 )
return __builtin_mul_overflow( a, b, &result );
#else
result = a * b;
if( a > 0 ){
if( b > 0 ){
return result < 0;
}else if( b < 0 ){
return result > 0;
}
}else if( a < 0 ){
if( b > 0 ){
return result > 0;
}else if( b < 0 ){
return result < 0;
}
}
return false;
#endif
}
void rathena::util::string_left_pad_inplace(std::string& str, char padding, size_t num)
{
str.insert(0, min(0, num - str.length()), padding);

View File

@@ -233,26 +233,25 @@ namespace rathena {
}
}
template <typename T, typename = std::enable_if<std::is_integral<T>::value, T>::type>
bool safe_addition( T a, T b, T& result ){
#if __has_builtin( __builtin_add_overflow ) || ( defined( __GNUC__ ) && !defined( __clang__ ) && defined( GCC_VERSION ) && GCC_VERSION >= 50100 )
template <typename T> bool safe_addition(T a, T b, T &result) {
return __builtin_add_overflow(a, b, &result);
}
return __builtin_add_overflow( a, b, &result );
#else
template <typename T> bool safe_addition( T a, T b, T& result ){
bool overflow = false;
if( std::numeric_limits<T>::is_signed ){
if( b < 0 ){
if( a < ( (std::numeric_limits<T>::min)() - b ) ){
if( a < ( std::numeric_limits<T>::min() - b ) ){
overflow = true;
}
}else{
if( a > ( (std::numeric_limits<T>::max)() - b ) ){
if( a > ( std::numeric_limits<T>::max() - b ) ){
overflow = true;
}
}
}else{
if( a > ( (std::numeric_limits<T>::max)() - b ) ){
if( a > ( std::numeric_limits<T>::max() - b ) ){
overflow = true;
}
}
@@ -260,11 +259,56 @@ namespace rathena {
result = a + b;
return overflow;
}
#endif
}
bool safe_substraction( int64 a, int64 b, int64& result );
bool safe_multiplication( int64 a, int64 b, int64& result );
template <typename T, typename = std::enable_if<std::is_integral<T>::value, T>::type>
bool safe_substraction( T a, T b, T& result ){
#if __has_builtin( __builtin_sub_overflow ) || ( defined( __GNUC__ ) && !defined( __clang__ ) && defined( GCC_VERSION ) && GCC_VERSION >= 50100 )
return __builtin_sub_overflow( a, b, &result );
#else
bool overflow = false;
if( b < 0 ){
if( a > ( std::numeric_limits<T>::max() + b ) ){
overflow = true;
}
}else{
if( a < ( std::numeric_limits<T>::min() + b ) ){
overflow = true;
}
}
result = a - b;
return overflow;
#endif
}
template <typename T, typename = std::enable_if<std::is_integral<T>::value, T>::type>
bool safe_multiplication( T a, T b, T& result ){
#if __has_builtin( __builtin_mul_overflow ) || ( defined( __GNUC__ ) && !defined( __clang__ ) && defined( GCC_VERSION ) && GCC_VERSION >= 50100 )
return __builtin_mul_overflow( a, b, &result );
#else
result = a * b;
if( a > 0 ){
if( b > 0 ){
return result < 0;
}else if( b < 0 ){
return result > 0;
}
}else if( a < 0 ){
if( b > 0 ){
return result > 0;
}else if( b < 0 ){
return result < 0;
}
}
return false;
#endif
}
/**
* Safely add values without overflowing.

View File

@@ -350,7 +350,7 @@ int logclif_parse_reqauth_sso( int fd, login_session_data& sd, char* ip ){
return 0;
}
if( RFIFOREST( fd ) < p->packetLength ){
if( static_cast<decltype(p->packetLength)>(RFIFOREST(fd)) < p->packetLength){
return 0;
}

View File

@@ -580,6 +580,12 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
ratio += 50;
#else
damage += (int64)(damage * 50 / 100);
#endif
if (tsc->getSCE(SC_MISTYFROST))
#ifdef RENEWAL
ratio += 15;
#else
damage += (int64)(damage * 15 / 100);
#endif
break;
case ELE_EARTH:
@@ -1377,7 +1383,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
unit_set_walkdelay(target, gettick(), delay, 1);
#ifdef RENEWAL
if (sc->getSCE(SC_SHRINK))
sc_start(src, target, SC_STUN, 50, skill_lv, skill_get_time2(skill_id, skill_lv));
sc_start(target, src, SC_STUN, 50, skill_lv, skill_get_time2(skill_id, skill_lv));
#else
if (sc->getSCE(SC_SHRINK) && rnd() % 100 < 5 * sce->val1)
skill_blown(target, src, skill_get_blewcount(CR_SHRINK, 1), -1, BLOWN_NONE);
@@ -1569,6 +1575,11 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
damage *= 4;
#endif
if (tsc->getSCE(SC_GROUNDGRAVITY) && flag&(BF_MAGIC|BF_WEAPON))
damage += damage * 15 / 100;
if (tsc->getSCE(SC_SHIELDCHAINRUSH))
damage += damage / 10;
if (tsc->getSCE(SC_AETERNA) && skill_id != PF_SOULBURN) {
if (src->type != BL_MER || !skill_id)
damage *= 2; // Lex Aeterna only doubles damage of regular attacks from mercenaries
@@ -1831,6 +1842,36 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
status_change* sc = status_get_sc(src);
if (sc && sc->count) {
if (sc->getSCE(SC_BREAKINGLIMIT)) {
switch (skill_id) {
case HN_SHIELD_CHAIN_RUSH:
case HN_DOUBLEBOWLINGBASH:
damage += damage * 70 / 100;
break;
case HN_MEGA_SONIC_BLOW:
case HN_SPIRAL_PIERCE_MAX:
damage *= 2;
break;
}
}
if (sc->getSCE(SC_RULEBREAK)) {
switch (skill_id) {
case HN_METEOR_STORM_BUSTER:
case HN_GROUND_GRAVITATION:
damage += damage / 2;
break;
case HN_JUPITEL_THUNDER_STORM:
case HN_JACK_FROST_NOVA:
case HN_HELLS_DRIVE:
damage += damage * 70 / 100;
break;
case HN_NAPALM_VULCAN_STRIKE:
damage += damage * 40 / 100;
break;
}
}
if( sc->getSCE(SC_INVINCIBLE) && !sc->getSCE(SC_INVINCIBLEOFF) )
damage += damage * 75 / 100;
@@ -5538,7 +5579,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
RE_LVL_DMOD(100);
break;
case SHC_SAVAGE_IMPACT:
skillratio += -100 + 90 * skill_lv + 5 * sstatus->pow;
skillratio += -100 + 105 * skill_lv + 5 * sstatus->pow;
if( sc != nullptr && sc->getSCE( SC_SHADOW_EXCEED ) ){
skillratio += 20 * skill_lv + 3 * sstatus->pow; // !TODO: check POW ratio
@@ -5547,19 +5588,19 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
RE_LVL_DMOD(100);
break;
case SHC_ETERNAL_SLASH:
skillratio += -100 + 265 * skill_lv + 2 * sstatus->pow;
skillratio += -100 + 300 * skill_lv + 2 * sstatus->pow;
if( sc != nullptr && sc->getSCE( SC_SHADOW_EXCEED ) ){
skillratio += 100 * skill_lv + sstatus->pow;
skillratio += 120 * skill_lv + sstatus->pow;
}
RE_LVL_DMOD(100);
break;
case SHC_SHADOW_STAB:
skillratio += -100 + 350 * skill_lv + 5 * sstatus->pow;
skillratio += -100 + 550 * skill_lv + 5 * sstatus->pow;
if( sc && sc->getSCE( SC_CLOAKINGEXCEED ) ){
skillratio += 50 * skill_lv + 2 * sstatus->pow;
skillratio += 100 * skill_lv + 2 * sstatus->pow;
}
RE_LVL_DMOD(100);
@@ -5649,17 +5690,19 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
RE_LVL_DMOD(100);
break;
case WH_GALESTORM:
skillratio += -100 + 1000 * skill_lv + 10 * sstatus->con;
skillratio += -100 + 1350 * skill_lv;
skillratio += 10 * sstatus->con;
RE_LVL_DMOD(100);
if (sc && sc->getSCE(SC_CALAMITYGALE) && (tstatus->race == RC_BRUTE || tstatus->race == RC_FISH))
skillratio += skillratio * 50 / 100;
break;
case WH_CRESCIVE_BOLT:
skillratio += -100 + 400 + 900 * skill_lv + 5 * sstatus->con;
skillratio += -100 + 500 + 1300 * skill_lv;
skillratio += 5 * sstatus->con;
RE_LVL_DMOD(100);
if (sc) {
if (sc->getSCE(SC_CRESCIVEBOLT))
skillratio += skillratio * (10 * sc->getSCE(SC_CRESCIVEBOLT)->val1) / 100;
skillratio += skillratio * (20 * sc->getSCE(SC_CRESCIVEBOLT)->val1) / 100;
if (sc->getSCE(SC_CALAMITYGALE)) {
skillratio += skillratio * 20 / 100;
@@ -5775,6 +5818,43 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
case ABR_INFINITY_BUSTER:// Need official formula.
skillratio += -100 + 50000;
break;
case HN_SPIRAL_PIERCE_MAX:
skillratio += -100 + 700 + 800 * skill_lv;
skillratio += pc_checkskill(sd, HN_SELFSTUDY_TATICS) * 3 * skill_lv;
skillratio += 5 * sstatus->pow;
switch (status_get_size(target)){
case SZ_SMALL:
skillratio = skillratio * 150 / 100;
break;
case SZ_MEDIUM:
skillratio = skillratio * 130 / 100;
break;
case SZ_BIG:
skillratio = skillratio * 120 / 100;
break;
}
RE_LVL_DMOD(100);
break;
case HN_SHIELD_CHAIN_RUSH:
skillratio += -100 + 700 + 500 * skill_lv;
skillratio += pc_checkskill(sd, HN_SELFSTUDY_TATICS) * 3 * skill_lv;
skillratio += 5 * sstatus->pow;
RE_LVL_DMOD(100);
break;
case HN_MEGA_SONIC_BLOW:
skillratio += -100 + 900 + 750 * skill_lv;
skillratio += pc_checkskill(sd, HN_SELFSTUDY_TATICS) * 5 * skill_lv;
skillratio += 5 * sstatus->pow;
if (status_get_hp(target) < status_get_max_hp(target) / 2)
skillratio *= 2;
RE_LVL_DMOD(100);
break;
case HN_DOUBLEBOWLINGBASH:
skillratio += -100 + 200 + 300 * skill_lv;
skillratio += pc_checkskill(sd, HN_SELFSTUDY_TATICS) * 3 * skill_lv;
skillratio += 5 * sstatus->pow;
RE_LVL_DMOD(100);
break;
}
return skillratio;
}
@@ -6715,10 +6795,6 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
if (sc && sc->getSCE(SC_E_SLASH_COUNT))
wd.div_ = sc->getSCE(SC_E_SLASH_COUNT)->val1;
break;
case SHC_SHADOW_STAB:
if (wd.miscflag == 2)
wd.div_ = 3;
break;
case SHC_IMPACT_CRATER:
if (sc && sc->getSCE(SC_ROLLINGCUTTER))
wd.div_ = sc->getSCE(SC_ROLLINGCUTTER)->val1;
@@ -6742,6 +6818,10 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
if (sc && sc->getSCE(SC_RESEARCHREPORT))
wd.div_ = 4;
break;
case HN_DOUBLEBOWLINGBASH:
if (wd.miscflag > 1)
wd.div_ += min(4, wd.miscflag);
break;
}
} else {
bool is_long = false;
@@ -7922,7 +8002,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
}
break;
case AG_SOUL_VC_STRIKE:
skillratio += -100 + 250 * skill_lv + 3 * sstatus->spl;
skillratio += -100 + 300 * skill_lv + 3 * sstatus->spl;
RE_LVL_DMOD(100);
break;
case AG_STRANTUM_TREMOR:
@@ -7981,7 +8061,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
RE_LVL_DMOD(100);
break;
case AG_ROCK_DOWN:
skillratio += -100 + 1200 * skill_lv + 5 * sstatus->spl;
skillratio += -100 + 1550 * skill_lv + 5 * sstatus->spl;
if( sc != nullptr && sc->getSCE( SC_CLIMAX ) ){
skillratio += 300 * skill_lv;
@@ -7990,7 +8070,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
RE_LVL_DMOD(100);
break;
case AG_STORM_CANNON:
skillratio += -100 + 1200 * skill_lv + 5 * sstatus->spl;
skillratio += -100 + 1550 * skill_lv + 5 * sstatus->spl;
if( sc != nullptr && sc->getSCE( SC_CLIMAX ) ){
skillratio += 300 * skill_lv;
@@ -7999,15 +8079,15 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
RE_LVL_DMOD(100);
break;
case AG_CRIMSON_ARROW:
skillratio += -100 + 350 * skill_lv + 5 * sstatus->spl;
skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl;
RE_LVL_DMOD(100);
break;
case AG_CRIMSON_ARROW_ATK:
skillratio += -100 + 700 * skill_lv + 5 * sstatus->spl;
skillratio += -100 + 750 * skill_lv + 5 * sstatus->spl;
RE_LVL_DMOD(100);
break;
case AG_FROZEN_SLASH:
skillratio += -100 + 400 + 900 * skill_lv + 5 * sstatus->spl;
skillratio += -100 + 450 + 950 * skill_lv + 5 * sstatus->spl;
if( sc != nullptr && sc->getSCE( SC_CLIMAX ) ){
skillratio += 150 + 350 * skill_lv;
@@ -8052,9 +8132,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
RE_LVL_DMOD(100);
break;
case CD_FRAMEN:
skillratio += -100 + (950 + 5 * pc_checkskill(sd,CD_FIDUS_ANIMUS)) * skill_lv + 5 * sstatus->spl;
skillratio += -100 + 1300 * skill_lv;
skillratio += 5 * pc_checkskill(sd,CD_FIDUS_ANIMUS) * skill_lv;
skillratio += 5 * sstatus->spl;
if (tstatus->race == RC_UNDEAD || tstatus->race == RC_DEMON)
skillratio += 100 * skill_lv;
skillratio += 50 * skill_lv;
RE_LVL_DMOD(100);
break;
case AG_DESTRUCTIVE_HURRICANE_CLIMAX:// Is this affected by BaseLV and SPL too??? [Rytech]
@@ -8177,6 +8259,57 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
case NPC_RAINOFMETEOR:
skillratio += 350; // unknown ratio
break;
case HN_NAPALM_VULCAN_STRIKE:
skillratio += -100 + 350 + 650 * skill_lv;
skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 4 * skill_lv;
skillratio += 5 * sstatus->spl;
RE_LVL_DMOD(100);
break;
case HN_JUPITEL_THUNDER_STORM:
skillratio += -100 + 1800 * skill_lv;
skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 3 * skill_lv;
skillratio += 5 * sstatus->spl;
RE_LVL_DMOD(100);
break;
case HN_HELLS_DRIVE:
skillratio += -100 + 1500 + 700 * skill_lv;
skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 4 * skill_lv;
skillratio += 5 * sstatus->spl;
RE_LVL_DMOD(100);
break;
case HN_GROUND_GRAVITATION:
if (mflag & SKILL_ALTDMG_FLAG) {
skillratio += -100 + 3000 + 1500 * skill_lv;
skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 4 * skill_lv;
ad.div_ = -2;
} else {
skillratio += -100 + 800 + 700 * skill_lv;
skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 2 * skill_lv;
}
skillratio += 5 * sstatus->spl;
RE_LVL_DMOD(100);
break;
case HN_JACK_FROST_NOVA:
if (mflag & SKILL_ALTDMG_FLAG) {
skillratio += -100 + 200 * skill_lv;
} else {
skillratio += -100 + 400 + 500 * skill_lv;
}
skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 3 * skill_lv;
skillratio += 5 * sstatus->spl;
RE_LVL_DMOD(100);
break;
case HN_METEOR_STORM_BUSTER:
if (mflag & SKILL_ALTDMG_FLAG) {
skillratio += -100 + 300 + 160 * skill_lv * 2;
ad.div_ = -3;
} else {
skillratio += -100 + 450 + 160 * skill_lv;
}
skillratio += pc_checkskill(sd, HN_SELFSTUDY_SOCERY) * 5 * skill_lv;
skillratio += 5 * sstatus->spl;
RE_LVL_DMOD(100);
break;
}
if (sc) {// Insignia's increases the damage of offensive magic by a fixed percentage depending on the element.

View File

@@ -23568,31 +23568,20 @@ void clif_parse_laphine_upgrade( int fd, map_session_data* sd ){
}
// Change the refine rate if needed
if (!upgrade->resultRefine.empty()) {
int total_rate = 0;
// Get the total rate (sum of the rate)
for (const auto& it : upgrade->resultRefine) {
if (it.second == 0) // Level removed on import
continue;
total_rate += it.second;
}
if (total_rate > 0) {
int chance = rnd_value(1, total_rate);
int sum_rate = 0;
for (const auto& it : upgrade->resultRefine) {
if (it.second == 0)
continue;
sum_rate += it.second;
if (chance <= sum_rate) {
item->refine = cap_value(it.first, 0, MAX_REFINE);
break;
}
}
if( upgrade->resultRefine > 0 ){
// Absolute refine level change
item->refine = max( item->refine, upgrade->resultRefine );
}else if( upgrade->resultRefineMaximum > 0 ){
// If a minimum is specified it can also downgrade
if( upgrade->resultRefineMinimum ){
item->refine = static_cast<uint8>( rnd_value<uint16>( upgrade->resultRefineMinimum, upgrade->resultRefineMaximum ) );
}else{
// Otherwise it can only be upgraded until the maximum, but not downgraded
item->refine = static_cast<uint8>( 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 = static_cast<uint8>( rnd_value<uint16>( upgrade->resultRefineMinimum, MAX_REFINE ) );
}
// Log retrieving the item again -> with the new options
@@ -25198,6 +25187,57 @@ void clif_parse_reset_skill( int fd, map_session_data* sd ){
#endif
}
void clif_set_dialog_align(map_session_data& sd, int npcid, e_say_dialog_align align)
{
#if PACKETVER_MAIN_NUM >= 20210203 || PACKETVER_RE_NUM >= 20211103 || PACKETVER_ZERO_NUM >= 20221024
PACKET_ZC_DIALOG_TEXT_ALIGN p = {};
p.PacketType = HEADER_ZC_DIALOG_TEXT_ALIGN;
p.align = align;
clif_send( &p, sizeof( p ), &sd.bl, SELF );
#endif // PACKETVER_MAIN_NUM >= 20210203 || PACKETVER_RE_NUM >= 20211103 || PACKETVER_ZERO_NUM >= 20221024
}
void clif_set_npc_window_size(map_session_data& sd, int width, int height)
{
#if PACKETVER_MAIN_NUM >= 20220504
PACKET_ZC_DIALOG_WINDOW_SIZE p = {};
p.PacketType = HEADER_ZC_DIALOG_WINDOW_SIZE;
p.width = width;
p.height = height;
clif_send( &p, sizeof( p ), &sd.bl, SELF );
#endif // PACKETVER_MAIN_NUM >= 20220504
}
void clif_set_npc_window_pos(map_session_data& sd, int x, int y)
{
#if PACKETVER_MAIN_NUM >= 20220504
PACKET_ZC_DIALOG_WINDOW_POS p = {};
p.PacketType = HEADER_ZC_DIALOG_WINDOW_POS;
p.x = x;
p.y = y;
clif_send( &p, sizeof( p ), &sd.bl, SELF );
#endif // PACKETVER_MAIN_NUM >= 20220504
}
void clif_set_npc_window_pos_percent(map_session_data& sd, int x, int y)
{
#if PACKETVER_MAIN_NUM >= 20220504
PACKET_ZC_DIALOG_WINDOW_POS2 p = {};
p.PacketType = HEADER_ZC_DIALOG_WINDOW_POS2;
p.x = x;
p.y = y;
clif_send( &p, sizeof( p ), &sd.bl, SELF );
#endif // PACKETVER_MAIN_NUM >= 20220504
}
/*==========================================
* Main client packet processing function
*------------------------------------------*/

View File

@@ -1254,4 +1254,9 @@ void clif_macro_reporter_status(map_session_data &sd, e_macro_report_status styp
void clif_dynamicnpc_result( map_session_data& sd, e_dynamicnpc_result result );
void clif_set_dialog_align(map_session_data& sd, int npcid, e_say_dialog_align align);
void clif_set_npc_window_size(map_session_data& sd, int width, int height);
void clif_set_npc_window_pos(map_session_data& sd, int x, int y);
void clif_set_npc_window_pos_percent(map_session_data& sd, int x, int y);
#endif /* CLIF_HPP */

View File

@@ -1793,30 +1793,60 @@ uint64 LaphineUpgradeDatabase::parseBodyNode( const ryml::NodeRef& node ){
}
}
if (this->nodeExists(node, "ResultRefine")) {
const auto& refineNode = node["ResultRefine"];
if( this->nodeExists( node, "ResultRefine" ) ){
uint16 refine;
for (const auto& refineit : refineNode) {
uint16 level;
if( !this->asUInt16( node, "ResultRefine", refine ) ){
return 0;
}
if (!this->asUInt16Rate(refineit, "Level", level, MAX_REFINE))
return 0;
if( refine > MAX_REFINE ){
this->invalidWarning( node["ResultRefine"], "Result refine %hu is too high, capping to MAX_REFINE...\n", refine );
refine = MAX_REFINE;
}
bool refine_exists = util::umap_find(entry->resultRefine, level) != nullptr;
entry->resultRefine = refine;
}else{
if( !exists ){
entry->resultRefine = 0;
}
}
if (this->nodeExists(refineit, "Rate")) {
uint16 rate;
if( this->nodeExists( node, "ResultRefineMinimum" ) ){
uint16 refine;
if (!this->asUInt16Rate(refineit, "Rate", rate)) {
return 0;
}
entry->resultRefine[level] = rate;
}
else {
if (!refine_exists) {
entry->resultRefine[level] = 1;
}
}
if( !this->asUInt16( node, "ResultRefineMinimum", refine ) ){
return 0;
}
if( refine > MAX_REFINE ){
this->invalidWarning( node["ResultRefineMinimum"], "Result refine minimum %hu is too high, capping to MAX_REFINE...\n", refine );
refine = MAX_REFINE;
}
entry->resultRefineMinimum = refine;
}else{
if( !exists ){
entry->resultRefineMinimum = 0;
}
}
if( this->nodeExists( node, "ResultRefineMaximum" ) ){
uint16 refine;
if( !this->asUInt16( node, "ResultRefineMaximum", refine ) ){
return 0;
}
if( refine > MAX_REFINE ){
this->invalidWarning( node["ResultRefineMaximum"], "Result refine maximum %hu is too high, capping to MAX_REFINE...\n", refine );
refine = MAX_REFINE;
}
entry->resultRefineMaximum = refine;
}else{
if( !exists ){
entry->resultRefineMaximum = 0;
}
}
@@ -4260,7 +4290,7 @@ uint64 RandomOptionDatabase::parseBodyNode(const ryml::NodeRef& node) {
return 0;
if (randopt->script) {
aFree(randopt->script);
script_free_code( randopt->script );
randopt->script = nullptr;
}

View File

@@ -2417,12 +2417,14 @@ struct s_laphine_upgrade{
uint16 requiredRandomOptions;
bool cardsAllowed;
std::shared_ptr<s_random_opt_group> randomOptionGroup;
std::unordered_map<uint16, uint16> resultRefine;
uint16 resultRefine;
uint16 resultRefineMinimum;
uint16 resultRefineMaximum;
};
class LaphineUpgradeDatabase : public TypesafeYamlDatabase<t_itemid, s_laphine_upgrade>{
public:
LaphineUpgradeDatabase() : TypesafeYamlDatabase( "LAPHINE_UPGRADE_DB", 2 ){
LaphineUpgradeDatabase() : TypesafeYamlDatabase( "LAPHINE_UPGRADE_DB", 1 ){
}

View File

@@ -349,7 +349,7 @@ int map_addblock(struct block_list* bl)
struct map_data *mapdata = map_getmapdata(m);
if (mapdata->cell == nullptr) // Player warped to a freed map. Stop them!
if (mapdata == nullptr || mapdata->cell == nullptr) // Player warped to a freed map. Stop them!
return 1;
if( x < 0 || x >= mapdata->xs || y < 0 || y >= mapdata->ys )
@@ -402,6 +402,8 @@ int map_delblock(struct block_list* bl)
struct map_data *mapdata = map_getmapdata(bl->m);
nullpo_ret(mapdata);
pos = bl->x/BLOCK_SIZE+(bl->y/BLOCK_SIZE)*mapdata->bxs;
if (bl->next)
@@ -409,8 +411,10 @@ int map_delblock(struct block_list* bl)
if (bl->prev == &bl_head) {
//Since the head of the list, update the block_list map of []
if (bl->type == BL_MOB) {
nullpo_ret(mapdata->block_mob);
mapdata->block_mob[pos] = bl->next;
} else {
nullpo_ret(mapdata->block);
mapdata->block[pos] = bl->next;
}
} else {
@@ -434,6 +438,8 @@ int map_delblock(struct block_list* bl)
*/
int map_moveblock(struct block_list *bl, int x1, int y1, t_tick tick)
{
nullpo_ret(bl);
int x0 = bl->x, y0 = bl->y;
status_change *sc = NULL;
int moveblock = ( x0/BLOCK_SIZE != x1/BLOCK_SIZE || y0/BLOCK_SIZE != y1/BLOCK_SIZE);

View File

@@ -66,7 +66,7 @@ void map_msg_reload(void);
#define NATURAL_HEAL_INTERVAL 500
#define MIN_FLOORITEM 2
#define MAX_FLOORITEM START_ACCOUNT_NUM
#define MAX_LEVEL 250
#define MAX_LEVEL 260
#define MAX_DROP_PER_MAP 48
#define MAX_IGNORE_LIST 20 // official is 14
#define MAX_VENDING 12
@@ -861,6 +861,18 @@ struct map_data_other_server {
uint16 port;
};
/**
* align for packet ZC_SAY_DIALOG_ALIGN
**/
enum e_say_dialog_align : uint8 {
DIALOG_ALIGN_LEFT = 0,
DIALOG_ALIGN_RIGHT = 1,
DIALOG_ALIGN_CENTER = 2,
DIALOG_ALIGN_TOP = 3,
DIALOG_ALIGN_MIDDLE = 4,
DIALOG_ALIGN_BOTTOM = 5
};
struct inter_conf {
uint32 start_status_points;
bool emblem_woe_change;

View File

@@ -5159,10 +5159,7 @@ static const char* npc_parse_function(char* w1, char* w2, char* w3, char* w4, co
struct script_code *oldscript = (struct script_code*)db_data2ptr(&old_data);
ShowInfo("npc_parse_function: Overwriting user function [%s] (%s:%d)\n", w3, filepath, strline(buffer,start-buffer));
script_stop_scriptinstances(oldscript);
script_free_vars(oldscript->local.vars);
aFree(oldscript->script_buf);
aFree(oldscript);
script_free_code( oldscript );
}
return end;

View File

@@ -2472,8 +2472,7 @@ void script_warning(const char* src, const char* file, int start_line, const cha
/*==========================================
* Analysis of the script
*------------------------------------------*/
struct script_code* parse_script(const char *src,const char *file,int line,int options)
{
struct script_code* parse_script_( const char *src, const char *file, int line, int options, const char* src_file, int src_line, const char* src_func ){
const char *p,*tmpp;
int i;
struct script_code* code = NULL;
@@ -2653,7 +2652,7 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
}
#endif
CREATE(code,struct script_code,1);
CREATE2( code, struct script_code, 1, src_file, src_line, src_func );
code->script_buf = script_buf;
code->script_size = script_size;
code->local.vars = NULL;
@@ -27124,6 +27123,106 @@ BUILDIN_FUNC(opentips){
#endif
}
BUILDIN_FUNC(setdialogalign){
map_session_data *sd;
if ( !script_rid2sd(sd) ) {
return SCRIPT_CMD_FAILURE;
}
int32 align = script_getnum( st, 2 );
if( align < DIALOG_ALIGN_LEFT || align > DIALOG_ALIGN_BOTTOM ){
ShowError( "buildin_setdialogalign: Unknown align value %d\n", align );
return SCRIPT_CMD_FAILURE;
}
clif_set_dialog_align( *sd, st->oid, static_cast<e_say_dialog_align>( align ) );
return SCRIPT_CMD_SUCCESS;
}
BUILDIN_FUNC(setdialogsize){
map_session_data *sd;
if ( !script_rid2sd(sd) ) {
script_pushint(st, 0);
return SCRIPT_CMD_FAILURE;
}
int32 x = script_getnum( st, 2 );
if( x < 0 || x > INT16_MAX ){
ShowError( "buildin_setdialogsize: x size %d is out of range [0,%d]\n", x, INT16_MAX );
return SCRIPT_CMD_FAILURE;
}
int32 y = script_getnum( st, 3 );
if( y < 0 || y > INT16_MAX ){
ShowError( "buildin_setdialogsize: y size %d is out of range [0,%d]\n", y, INT16_MAX );
return SCRIPT_CMD_FAILURE;
}
clif_set_npc_window_size( *sd, x, y );
return SCRIPT_CMD_SUCCESS;
}
BUILDIN_FUNC(setdialogpos){
map_session_data *sd;
if ( !script_rid2sd(sd) ) {
script_pushint(st, 0);
return SCRIPT_CMD_FAILURE;
}
int32 x = script_getnum( st, 2 );
if( x < 0 || x > INT16_MAX ){
ShowError( "buildin_setdialogpos: x position %d is out of range [0,%d]\n", x, INT16_MAX );
return SCRIPT_CMD_FAILURE;
}
int32 y = script_getnum( st, 3 );
if( y < 0 || y > INT16_MAX ){
ShowError( "buildin_setdialogpos: y position %d is out of range [0,%d]\n", y, INT16_MAX );
return SCRIPT_CMD_FAILURE;
}
clif_set_npc_window_pos( *sd, x, y );
return SCRIPT_CMD_SUCCESS;
}
BUILDIN_FUNC(setdialogpospercent){
map_session_data *sd;
if ( !script_rid2sd(sd) ) {
script_pushint(st, 0);
return SCRIPT_CMD_FAILURE;
}
int32 x = script_getnum( st, 2 );
if( x < 0 || x > 100 ){
ShowError( "buildin_setdialogpospercent: x rate %d is out of range [0,100]\n", x );
return SCRIPT_CMD_FAILURE;
}
int32 y = script_getnum( st, 3 );
if( y < 0 || y > 100 ){
ShowError( "buildin_setdialogpospercent: y rate %d is out of range [0,100]\n", y );
return SCRIPT_CMD_FAILURE;
}
clif_set_npc_window_pos_percent( *sd, x, y );
return SCRIPT_CMD_SUCCESS;
}
#include <custom/script.inc>
// declarations that were supposed to be exported from npc_chat.cpp
@@ -27884,6 +27983,11 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(autoloot,"??"),
BUILDIN_DEF(opentips, "i?"),
BUILDIN_DEF(setdialogalign, "i"),
BUILDIN_DEF(setdialogsize, "ii"),
BUILDIN_DEF(setdialogpos, "ii"),
BUILDIN_DEF(setdialogpospercent, "ii"),
#include <custom/script_def.inc>
{NULL,NULL,NULL},

View File

@@ -10,6 +10,7 @@
#include <common/database.hpp>
#include <common/cbasetypes.hpp>
#include <common/db.hpp>
#include <common/malloc.hpp>
#include <common/mmo.hpp>
#include <common/timer.hpp>
@@ -2120,8 +2121,13 @@ enum e_hat_effects : int16{
HAT_EF_AUTUMN_FULL_MOON,
HAT_EF_NIFLHEIM_NIGHT_SKY,
HAT_EF_C_ROS2023_CAPE_1,
HAT_EF_BLACK_THUNDER_,
HAT_EF_C_ROS2023_CAPE_2,
HAT_EF_C_15TH_NOV_HELMET,
HAT_EF_COSMIC_CONNECTION,
HAT_EF_C_BABY_GLOOM,
HAT_EF_WINTERNIGHTBELLS,
HAT_EF_NIGHTSKYOFRUTIE,
HAT_EF_MAX
};
@@ -2205,7 +2211,8 @@ void script_error(const char* src, const char* file, int start_line, const char*
void script_warning(const char* src, const char* file, int start_line, const char* error_msg, const char* error_pos);
bool is_number(const char *p);
struct script_code* parse_script(const char* src,const char* file,int line,int options);
struct script_code* parse_script_( const char *src, const char *file, int line, int options, const char* src_file, int src_line, const char* src_func );
#define parse_script( src, file, line, options ) parse_script_( ( src ), ( file ), ( line ), ( options ), ALC_MARK )
void run_script(struct script_code *rootscript,int pos,int rid,int oid);
bool set_reg_num(struct script_state* st, map_session_data* sd, int64 num, const char* name, const int64 value, struct reg_db *ref);

View File

@@ -1894,6 +1894,12 @@
export_constant(SC_RUSH_QUAKE1);
export_constant(SC_RUSH_QUAKE2);
export_constant(SC_G_LIFEPOTION);
export_constant(SC_HNNOWEAPON);
export_constant(SC_SHIELDCHAINRUSH);
export_constant(SC_MISTYFROST);
export_constant(SC_GROUNDGRAVITY);
export_constant(SC_BREAKINGLIMIT);
export_constant(SC_RULEBREAK);
#ifdef RENEWAL
export_constant(SC_EXTREMITYFIST2);
@@ -9616,8 +9622,13 @@
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_BLACK_THUNDER_);
export_constant(HAT_EF_C_ROS2023_CAPE_2);
export_constant(HAT_EF_C_15TH_NOV_HELMET);
export_constant(HAT_EF_COSMIC_CONNECTION);
export_constant(HAT_EF_C_BABY_GLOOM);
export_constant(HAT_EF_WINTERNIGHTBELLS);
export_constant(HAT_EF_NIGHTSKYOFRUTIE);
/* pet catch */
export_constant(PET_CATCH_UNIVERSAL);
@@ -10065,12 +10076,21 @@
export_constant(UNT_LIGHTNING_LAND);
export_constant(UNT_VENOM_SWAMP);
export_constant(UNT_CONFLAGRATION);
export_constant(UNT_DEEPBLINDTRAP);
export_constant(UNT_SOLIDTRAP);
export_constant(UNT_SWIFTTRAP);
export_constant(UNT_FLAMETRAP);
export_constant(UNT_TWINKLING_GALAXY);
export_constant(UNT_STAR_CANNON);
export_constant(UNT_GRENADES_DROPPING);
export_constant(UNT_FUUMASHOUAKU);
export_constant(UNT_MISSION_BOMBARD);
export_constant(UNT_TOTEM_OF_TUTELARY);
export_constant(UNT_HYUN_ROKS_BREEZE);
export_constant(UNT_SHINKIROU);
export_constant(UNT_JACK_FROST_NOVA);
export_constant(UNT_GROUND_GRAVITATION);
export_constant(UNT_KUNAIWAIKYOKU);
export_constant(UNT_GD_LEADERSHIP);
export_constant(UNT_GD_GLORYWOUNDS);
export_constant(UNT_GD_SOULCOLD);

View File

@@ -1434,6 +1434,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
break;
case AS_SONICBLOW:
case HN_MEGA_SONIC_BLOW:
sc_start(src,bl,SC_STUN,(2*skill_lv+10),skill_lv,skill_get_time2(skill_id,skill_lv));
break;
@@ -1480,6 +1481,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
break;
case WZ_METEOR:
case HN_METEOR_STORM_BUSTER:
sc_start(src,bl,SC_STUN,3*skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv));
break;
@@ -1696,6 +1698,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
case LK_SPIRALPIERCE:
case ML_SPIRALPIERCE:
case HN_SPIRAL_PIERCE_MAX:
if( dstsd || ( dstmd && !status_bl_has_mode(bl,MD_STATUSIMMUNE) ) ) //Does not work on status immune
sc_start(src,bl,SC_STOP,100,0,skill_get_time2(skill_id,skill_lv));
break;
@@ -1729,6 +1732,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
break;
case HW_NAPALMVULCAN:
case HN_NAPALM_VULCAN_STRIKE:
sc_start(src,bl,SC_CURSE,5*skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv));
break;
@@ -2203,6 +2207,11 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
case MT_RUSH_QUAKE:
sc_start( src, bl, SC_RUSH_QUAKE1, 100, skill_lv, skill_get_time( skill_id, skill_lv ) );
break;
case HN_SHIELD_CHAIN_RUSH:
case HN_JACK_FROST_NOVA:
case HN_GROUND_GRAVITATION:
sc_start(src, bl, skill_get_sc(skill_id), 100, 0, skill_get_time2(skill_id, skill_lv));
break;
} //end switch skill_id
if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai && md->special_state.ai != AI_ABR && md->special_state.ai != AI_BIONIC)
@@ -4769,6 +4778,22 @@ static TIMER_FUNC(skill_timerskill){
case NC_MAGMA_ERUPTION:
skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,0);
break;
case HN_METEOR_STORM_BUSTER: {
int16 area = 4;
int16 tmpx = rnd_value( skl->x - area, skl->x + area );
int16 tmpy = rnd_value( skl->y - area, skl->y + area );
if( map_getcell(src->m, tmpx, tmpy, CELL_CHKLANDPROTECTOR) ) {
return 0;
}
int splash = skill_get_splash(skl->skill_id, skl->skill_lv);
clif_skill_poseffect(src, skl->skill_id, skl->skill_lv, tmpx, tmpy, tick);
map_foreachinarea(skill_area_sub, src->m, tmpx - splash, tmpy - splash, tmpx + splash, tmpy + splash, BL_CHAR, src, skl->skill_id, skl->skill_lv, tick, skl->flag | BCT_ENEMY | SD_SPLASH | SKILL_ALTDMG_FLAG | 1, skill_castend_damage_id);
skill_unitsetting(src, skl->skill_id, skl->skill_lv, tmpx, tmpy, skill_get_unit_interval(skl->skill_id));
}
break;
}
}
} while (0);
@@ -5220,6 +5245,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case WH_HAWKBOOMERANG:
case TR_ROSEBLOSSOM:
case TR_RHYTHMSHOOTING:
case HN_MEGA_SONIC_BLOW:
case HN_SPIRAL_PIERCE_MAX:
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
if (skill_id == DK_DRAGONIC_AURA)
@@ -5236,9 +5263,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
break;
case SHC_SHADOW_STAB:
if (sc && sc->getSCE(SC_CLOAKINGEXCEED))
flag |= 2;// Flag to deal 3 hits.
status_change_end(src, SC_CLOAKING);
status_change_end(src, SC_CLOAKINGEXCEED);
@@ -5669,6 +5693,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case IG_SHIELD_SHOOTING:
case TR_METALIC_FURY:
case IG_GRAND_JUDGEMENT:
case HN_JUPITEL_THUNDER_STORM:
if( flag&1 ) {//Recursive invocation
int sflag = skill_area_temp[0] & 0xFFF;
int heal = 0;
@@ -5739,6 +5764,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case DK_DRAGONIC_BREATH:
case DK_HACKANDSLASHER:
case MT_SPARK_BLASTER:
case HN_JUPITEL_THUNDER_STORM:
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
break;
#ifdef RENEWAL
@@ -5846,6 +5872,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case WH_GALESTORM:// Give AP if 3 or more targets are hit.
if (sd && map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, BCT_ENEMY, skill_area_sub_count) >= 3)
status_heal(src, 0, 0, 10, 0);
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
break;
case BO_ACIDIFIED_ZONE_WATER:
case BO_ACIDIFIED_ZONE_GROUND:
@@ -6087,6 +6114,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case AG_ASTRAL_STRIKE_ATK:
case AG_DESTRUCTIVE_HURRICANE_CLIMAX:
case CD_ARBITRIUM:
case HN_METEOR_STORM_BUSTER:
skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);
break;
@@ -7011,6 +7039,44 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
sc_start(src, bl, SC_VENOMIMPRESS, 100, skill_lv, skill_get_time(skill_id,skill_lv));
break;
case HN_DOUBLEBOWLINGBASH:
if (flag & 1) {
skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, skill_area_temp[0] & 0xFFF);
} else {
int splash = skill_get_splash(skill_id, skill_lv);
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
skill_area_temp[0] = map_foreachinallrange(skill_area_sub, bl, splash, BL_CHAR, src, skill_id, skill_lv, tick, BCT_ENEMY, skill_area_sub_count);
map_foreachinrange(skill_area_sub, bl, splash, BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id);
sc_start(src, src, SC_HNNOWEAPON, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
}
break;
case HN_SHIELD_CHAIN_RUSH:
if (flag & 1) {
skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
} else {
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id);
sc_start(src, src, SC_HNNOWEAPON, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
}
break;
case HN_JACK_FROST_NOVA:
case HN_HELLS_DRIVE:
case HN_GROUND_GRAVITATION:
if (flag & 1)
skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
break;
case HN_NAPALM_VULCAN_STRIKE:
if (flag & 1) {
skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
} else {
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id);
}
break;
default:
ShowWarning("skill_castend_damage_id: Unknown skill used:%d\n",skill_id);
clif_skill_damage(src, bl, tick, status_get_amotion(src), tstatus->dmotion,
@@ -7900,6 +7966,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case NPC_DAMAGE_HEAL:
case NPC_RELIEVE_ON:
case NPC_RELIEVE_OFF:
case HN_BREAKINGLIMIT:
case HN_RULEBREAK:
clif_skill_nodamage(src,bl,skill_id,skill_lv,
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
break;
@@ -12792,6 +12860,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
}
break;
case HN_HELLS_DRIVE:
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | 1, skill_castend_damage_id);
break;
default: {
std::shared_ptr<s_skill_db> skill = skill_db.find(skill_id);
ShowWarning("skill_castend_nodamage_id: missing code case for skill %s(%d)\n", skill ? skill->name : "UNKNOWN", skill_id);
@@ -13529,6 +13602,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
case SC_ESCAPE:
case SU_CN_METEOR:
case NPC_RAINOFMETEOR:
case HN_METEOR_STORM_BUSTER:
break; //Effect is displayed on respective switch case.
default:
if(skill_get_inf(skill_id)&INF_SELF_SKILL)
@@ -14436,6 +14510,41 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
}
break;
case HN_JACK_FROST_NOVA:
case HN_GROUND_GRAVITATION: {
if( map_getcell(src->m, x, y, CELL_CHKLANDPROTECTOR) ) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL,0);
return 0;
}
int splash = skill_get_splash(skill_id, skill_lv);
map_foreachinarea(skill_area_sub, src->m, x - splash, y - splash, x + splash, y + splash, BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | SKILL_ALTDMG_FLAG | 1, skill_castend_damage_id);
skill_unitsetting(src, skill_id, skill_lv, x, y, flag);
for (i = 1; i <= (skill_get_time(skill_id, skill_lv) / skill_get_unit_interval(skill_id)); i++) {
skill_addtimerskill(src, tick + (t_tick)i*skill_get_unit_interval(skill_id), 0, x, y, skill_id, skill_lv, 0, flag);
}
}
break;
case HN_METEOR_STORM_BUSTER: {
if( map_getcell(src->m, x, y, CELL_CHKLANDPROTECTOR) ) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL,0);
return 0;
}
int splash = skill_get_splash(skill_id, skill_lv);
map_foreachinarea(skill_area_sub, src->m, x - splash, y - splash, x + splash, y + splash, BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | SKILL_ALTDMG_FLAG | 1, skill_castend_damage_id);
skill_unitsetting(src, skill_id, skill_lv, x, y, skill_get_unit_interval(skill_id));
for (i = 1; i <= (skill_get_time(skill_id, skill_lv) / skill_get_time2(skill_id, skill_lv)); i++) {
skill_addtimerskill(src, tick + (t_tick)i*skill_get_time2(skill_id, skill_lv), 0, x, y, skill_id, skill_lv, 0, flag);
}
}
break;
default:
ShowWarning("skill_castend_pos2: Unknown skill used:%d\n",skill_id);
return 1;
@@ -14775,6 +14884,7 @@ std::shared_ptr<s_skill_unit_group> skill_unitsetting(struct block_list *src, ui
case SU_CN_METEOR:
case SU_CN_METEOR2:
case NPC_RAINOFMETEOR:
case HN_METEOR_STORM_BUSTER:
limit = flag;
flag = 0; // Flag should not influence anything else for these skills
break;
@@ -21108,7 +21218,8 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
default:
if (group->val2 == 1 && (group->skill_id == WZ_METEOR || group->skill_id == SU_CN_METEOR || group->skill_id == SU_CN_METEOR2 ||
group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR)) {
group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR ||
group->skill_id == HN_METEOR_STORM_BUSTER)) {
// Deal damage before expiration
break;
}
@@ -21164,7 +21275,8 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
break;
default:
if (group->skill_id == WZ_METEOR || group->skill_id == SU_CN_METEOR || group->skill_id == SU_CN_METEOR2 ||
group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR) {
group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR ||
group->skill_id == HN_METEOR_STORM_BUSTER) {
if (group->val2 == 0 && (DIFF_TICK(tick, group->tick) >= group->limit - group->interval || DIFF_TICK(tick, group->tick) >= unit->limit - group->interval)) {
// Unit will expire the next interval, start dropping Meteor
block_list *src = map_id2bl(group->src_id);
@@ -21206,6 +21318,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
}
else if (group->skill_id == WZ_METEOR || group->skill_id == SU_CN_METEOR || group->skill_id == SU_CN_METEOR2 ||
group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR ||
group->skill_id == HN_METEOR_STORM_BUSTER ||
((group->skill_id == CR_GRANDCROSS || group->skill_id == NPC_GRANDDARKNESS) && unit->val1 <= 0)) {
skill_delunit(unit);
return 0;

View File

@@ -39,6 +39,9 @@ class status_change;
/// Used with tracking the hitcount of Earthquake for skills that can avoid the first attack
#define NPC_EARTHQUAKE_FLAG 0x800
/// To control alternative skill scalings
#define SKILL_ALTDMG_FLAG 0x10
/// Constants to identify a skill's nk value (damage properties)
/// The NK value applies only to non INF_GROUND_SKILL skills
/// when determining skill castend function to invoke.

View File

@@ -4379,6 +4379,10 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt)
base_status->patk += skill * 3;
base_status->smatk += skill * 3;
}
if ((skill = pc_checkskill(sd, HN_SELFSTUDY_TATICS)) > 0)
base_status->patk += skill;
if ((skill = pc_checkskill(sd, HN_SELFSTUDY_SOCERY)) > 0)
base_status->smatk += skill;
// 2-Handed Staff Mastery
if( sd->status.weapon == W_2HSTAFF && ( skill = pc_checkskill( sd, AG_TWOHANDSTAFF ) ) > 0 ){
@@ -8012,6 +8016,10 @@ static unsigned short status_calc_speed(struct block_list *bl, status_change *sc
val = max(val, sc->getSCE(SC_SP_SHA)->val2);
if (sc->getSCE(SC_CREATINGSTAR))
val = max(val, 90);
if (sc->getSCE(SC_SHIELDCHAINRUSH))
val = max(val, 20);
if (sc->getSCE(SC_GROUNDGRAVITY))
val = max(val, 20);
if( sd && sd->bonus.speed_rate + sd->bonus.speed_add_rate > 0 ) // Permanent item-based speedup
val = max( val, sd->bonus.speed_rate + sd->bonus.speed_add_rate );

View File

@@ -1284,6 +1284,15 @@ enum sc_type : int16 {
SC_RUSH_QUAKE2,
SC_G_LIFEPOTION,
// Hyper Novice
SC_HNNOWEAPON,
SC_SHIELDCHAINRUSH,
SC_MISTYFROST,
SC_GROUNDGRAVITY,
SC_BREAKINGLIMIT,
SC_RULEBREAK,
#ifdef RENEWAL
SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
#endif

View File

@@ -12,7 +12,6 @@ static bool upgrade_status_db(std::string file, const uint32 source_version);
static bool upgrade_map_drops_db(std::string file, const uint32 source_version);
static bool upgrade_enchantgrade_db( std::string file, const uint32 source_version );
static bool upgrade_item_group_db( std::string file, const uint32 source_version );
static bool upgrade_laphine_upgrade( std::string file, const uint32 source_version );
template<typename Func>
bool process(const std::string &type, uint32 version, const std::vector<std::string> &paths, const std::string &name, Func lambda) {
@@ -151,11 +150,6 @@ bool YamlUpgradeTool::initialize( int argc, char* argv[] ){
} ) ){
return false;
}
if( !process( "LAPHINE_UPGRADE_DB", 2, root_paths, "laphine_upgrade", []( const std::string& path, const std::string& name_ext, uint32 source_version ) -> bool {
return upgrade_laphine_upgrade( path + name_ext, source_version );
} ) ){
return false;
}
return true;
}
@@ -522,63 +516,6 @@ static bool upgrade_item_group_db( std::string file, const uint32 source_version
return true;
}
static bool upgrade_laphine_upgrade(std::string file, const uint32 source_version) {
size_t entries = 0;
for (auto input : inNode["Body"]) {
if (source_version < 2) {
if (input["ResultRefine"].IsDefined()) {
// Convert ResultRefine to a ResultRefine array
uint16 refine_level = input["ResultRefine"].as<uint16>();
// Remove the existing Refine entry
input.remove("ResultRefine");
// Add the ResultRefine array
auto RatesNode = input["ResultRefine"];
auto RateNode = RatesNode[0];
RateNode["Level"] = refine_level;
}
// Convert the values between ResultRefineMinimum and ResultRefineMaximum to a ResultRefine array
if (input["ResultRefineMinimum"].IsDefined() || input["ResultRefineMaximum"].IsDefined()) {
uint16 refine_level_min = 0, refine_level_max = MAX_REFINE;
// Save data and remove the existing ResultRefineMinimum/ResultRefineMaximum entry
if (input["ResultRefineMinimum"].IsDefined()) {
refine_level_min = input["ResultRefineMinimum"].as<uint16>();
input.remove("ResultRefineMinimum");
}
if (input["ResultRefineMaximum"].IsDefined()) {
refine_level_max = input["ResultRefineMaximum"].as<uint16>();
input.remove("ResultRefineMaximum");
}
// Remove existing ResultRefine entry (shouldn't happen)
if (input["ResultRefine"].IsDefined())
input.remove("ResultRefine");
// Add the ResultRefine array
auto RatesNode = input["ResultRefine"];
for (int i = refine_level_min, j = 0; i <= refine_level_max; i++, j++) {
auto RateNode = RatesNode[j];
RateNode["Level"] = i;
}
}
}
body << input;
entries++;
}
ShowStatus("Done converting/upgrading '" CL_WHITE "%zu" CL_RESET "' entries in '" CL_WHITE "%s" CL_RESET "'.\n", entries, file.c_str());
return true;
}
int main( int argc, char *argv[] ){
return main_core<YamlUpgradeTool>( argc, argv );