Random options update (#3993)

* Implemented additional random options from official server
Fixed #3988

Thanks to @Stolao @cydh @aleos89
This commit is contained in:
Jittapan Pluemsumran 2020-07-01 04:39:40 +07:00 committed by GitHub
parent fb00561fc1
commit 2e04ca98b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 214 additions and 47 deletions

View File

@ -48,7 +48,7 @@ RDMOPT_ATTR_TOLERACE_SAINT 31
RDMOPT_ATTR_TOLERACE_DARKNESS 32
RDMOPT_ATTR_TOLERACE_TELEKINESIS 33
RDMOPT_ATTR_TOLERACE_UNDEAD 34
RDMOPT_ATTR_TOLERACE_ALL 35
RDMOPT_ATTR_TOLERACE_ALLBUTNOTHING 35
RDMOPT_DAMAGE_PROPERTY_NOTHING_USER 36
RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET 37
RDMOPT_DAMAGE_PROPERTY_WATER_USER 38
@ -186,27 +186,51 @@ RDMOPT_HEAL_MODIFY_PERCENT 169
RDMOPT_DEC_SPELL_CAST_TIME 170
RDMOPT_DEC_SPELL_DELAY_TIME 171
RDMOPT_DEC_SP_CONSUMPTION 172
RDMOPT_HP_DRAIN 173
RDMOPT_SP_DRAIN 174
RDMOPT_WEAPON_ATTR_NOTHING 175
RDMOPT_WEAPON_ATTR_WATER 176
RDMOPT_WEAPON_ATTR_GROUND 177
RDMOPT_WEAPON_ATTR_FIRE 178
RDMOPT_WEAPON_ATTR_WIND 179
RDMOPT_WEAPON_ATTR_POISON 180
RDMOPT_WEAPON_ATTR_SAINT 181
RDMOPT_WEAPON_ATTR_DARKNESS 182
RDMOPT_WEAPON_ATTR_TELEKINESIS 183
RDMOPT_WEAPON_ATTR_UNDEAD 184
RDMOPT_WEAPON_INDESTRUCTIBLE 185
RDMOPT_BODY_INDESTRUCTIBLE 186
RDMOPT_MDAMAGE_SIZE_SMALL_TARGET 187
RDMOPT_MDAMAGE_SIZE_MIDIUM_TARGET 188
RDMOPT_MDAMAGE_SIZE_LARGE_TARGET 189
RDMOPT_MDAMAGE_SIZE_SMALL_USER 190
RDMOPT_MDAMAGE_SIZE_MIDIUM_USER 191
RDMOPT_MDAMAGE_SIZE_LARGE_USER 192
//RDMOPT_ATTR_TOLERACE_ALL 193
RDMOPT_WEAPON_ATTR_NOTHING 173
RDMOPT_WEAPON_ATTR_WATER 174
RDMOPT_WEAPON_ATTR_GROUND 175
RDMOPT_WEAPON_ATTR_FIRE 176
RDMOPT_WEAPON_ATTR_WIND 177
RDMOPT_WEAPON_ATTR_POISON 178
RDMOPT_WEAPON_ATTR_SAINT 179
RDMOPT_WEAPON_ATTR_DARKNESS 180
RDMOPT_WEAPON_ATTR_TELEKINESIS 181
RDMOPT_WEAPON_ATTR_UNDEAD 182
RDMOPT_WEAPON_INDESTRUCTIBLE 183
RDMOPT_BODY_INDESTRUCTIBLE 184
RDMOPT_MDAMAGE_SIZE_SMALL_TARGET 185
RDMOPT_MDAMAGE_SIZE_MIDIUM_TARGET 186
RDMOPT_MDAMAGE_SIZE_LARGE_TARGET 187
RDMOPT_MDAMAGE_SIZE_SMALL_USER 188
RDMOPT_MDAMAGE_SIZE_MIDIUM_USER 189
RDMOPT_MDAMAGE_SIZE_LARGE_USER 190
RDMOPT_ATTR_TOLERACE_ALL 191
RDMOPT_RACE_WEAPON_TOLERACE_NOTHING 192
RDMOPT_RACE_WEAPON_TOLERACE_UNDEAD 193
RDMOPT_RACE_WEAPON_TOLERACE_ANIMAL 194
RDMOPT_RACE_WEAPON_TOLERACE_PLANT 195
RDMOPT_RACE_WEAPON_TOLERACE_INSECT 196
RDMOPT_RACE_WEAPON_TOLERACE_FISHS 197
RDMOPT_RACE_WEAPON_TOLERACE_DEVIL 198
RDMOPT_RACE_WEAPON_TOLERACE_HUMAN 199
RDMOPT_RACE_WEAPON_TOLERACE_ANGEL 200
RDMOPT_RACE_WEAPON_TOLERACE_DRAGON 201
RDMOPT_RANGE_WEAPON_ATTACK_DAMAGE_TARGET 202
RDMOPT_RANGE_WEAPON_ATTACK_DAMAGE_USER 203
RDMOPT_RACE_TOLERACE_PLAYER_DORAM 204
RDMOPT_RACE_DAMAGE_PLAYER_HUMAN 205
RDMOPT_RACE_DAMAGE_PLAYER_DORAM 206
RDMOPT_RACE_MDAMAGE_PLAYER_HUMAN 207
RDMOPT_RACE_MDAMAGE_PLAYER_DORAM 208
RDMOPT_RACE_CRI_PERCENT_PLAYER_HUMAN 209
RDMOPT_RACE_CRI_PERCENT_PLAYER_DORAM 210
RDMOPT_RACE_IGNORE_DEF_PERCENT_PLAYER_HUMAN 211
RDMOPT_RACE_IGNORE_DEF_PERCENT_PLAYER_DORAM 212
RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLAYER_HUMAN 213
RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLAYER_DORAM 214
RDMOPT_REFLECT_DAMAGE_PERCENT 215
RDMOPT_MELEE_ATTACK_DAMAGE_TARGET 216
RDMOPT_MELEE_ATTACK_DAMAGE_USER 217
SWORDCLAN 1
ARCWANDCLAN 2

View File

@ -36,9 +36,7 @@ RDMOPT_ATTR_TOLERACE_SAINT,{ bonus2 bSubEle,Ele_Holy,getrandomoptinfo(ROA_VALUE)
RDMOPT_ATTR_TOLERACE_DARKNESS,{ bonus2 bSubEle,Ele_Dark,getrandomoptinfo(ROA_VALUE); }
RDMOPT_ATTR_TOLERACE_TELEKINESIS,{ bonus2 bSubEle,Ele_Ghost,getrandomoptinfo(ROA_VALUE); }
RDMOPT_ATTR_TOLERACE_UNDEAD,{ bonus2 bSubEle,Ele_Undead,getrandomoptinfo(ROA_VALUE); }
RDMOPT_ATTR_TOLERACE_ALL,{ bonus2 bSubEle,Ele_All,getrandomoptinfo(ROA_VALUE); }
// TODO: Confirm if damage reduction is implemented correctly.
// kRO desc : <ELEMENT> 몬스터로부터 받는 물리 데미지 %d%% 감소.
RDMOPT_ATTR_TOLERACE_ALLBUTNOTHING,{ for(.@i = Ele_Water; .@i < Ele_Undead; ++.@i) bonus2 bSubEle,.@i,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_NOTHING_USER,{ bonus2 bSubDefEle,Ele_Neutral,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET,{ bonus2 bAddEle,Ele_Neutral,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_WATER_USER,{ bonus2 bSubDefEle,Ele_Water,getrandomoptinfo(ROA_VALUE); }
@ -89,7 +87,7 @@ RDMOPT_BODY_ATTR_SAINT,{ bonus bDefEle,Ele_Holy; }
RDMOPT_BODY_ATTR_DARKNESS,{ bonus bDefEle,Ele_Dark; }
RDMOPT_BODY_ATTR_TELEKINESIS,{ bonus bDefEle,Ele_Ghost; }
RDMOPT_BODY_ATTR_UNDEAD,{ bonus bDefEle,Ele_Undead; }
//RDMOPT_BODY_ATTR_ALL,{ /* Needs more info */ }
//RDMOPT_BODY_ATTR_ALL,{}
RDMOPT_RACE_TOLERACE_NOTHING,{ bonus2 bSubRace,RC_Formless,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_TOLERACE_UNDEAD,{ bonus2 bSubRace,RC_Undead,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_TOLERACE_ANIMAL,{ bonus2 bSubRace,RC_Brute,getrandomoptinfo(ROA_VALUE); }
@ -97,7 +95,7 @@ RDMOPT_RACE_TOLERACE_PLANT,{ bonus2 bSubRace,RC_Plant,getrandomoptinfo(ROA_VALUE
RDMOPT_RACE_TOLERACE_INSECT,{ bonus2 bSubRace,RC_Insect,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_TOLERACE_FISHS,{ bonus2 bSubRace,RC_Fish,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_TOLERACE_DEVIL,{ bonus2 bSubRace,RC_Demon,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_TOLERACE_HUMAN,{ bonus2 bSubRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE); bonus2 bSubRace,RC_Player_Human,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_TOLERACE_HUMAN,{ bonus2 bSubRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_TOLERACE_ANGEL,{ bonus2 bSubRace,RC_Angel,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_TOLERACE_DRAGON,{ bonus2 bSubRace,RC_Dragon,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_DAMAGE_NOTHING,{ bonus2 bAddRace,RC_Formless,getrandomoptinfo(ROA_VALUE); }
@ -107,7 +105,7 @@ RDMOPT_RACE_DAMAGE_PLANT,{ bonus2 bAddRace,RC_Plant,getrandomoptinfo(ROA_VALUE);
RDMOPT_RACE_DAMAGE_INSECT,{ bonus2 bAddRace,RC_Insect,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_DAMAGE_FISHS,{ bonus2 bAddRace,RC_Fish,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_DAMAGE_DEVIL,{ bonus2 bAddRace,RC_Demon,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_DAMAGE_HUMAN,{ bonus2 bAddRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE); bonus2 bAddRace,RC_Player_Human,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_DAMAGE_HUMAN,{ bonus2 bAddRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_DAMAGE_ANGEL,{ bonus2 bAddRace,RC_Angel,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_DAMAGE_DRAGON,{ bonus2 bAddRace,RC_Dragon,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_MDAMAGE_NOTHING,{ bonus2 bMagicAddRace,RC_Formless,getrandomoptinfo(ROA_VALUE); }
@ -117,7 +115,7 @@ RDMOPT_RACE_MDAMAGE_PLANT,{ bonus2 bMagicAddRace,RC_Plant,getrandomoptinfo(ROA_V
RDMOPT_RACE_MDAMAGE_INSECT,{ bonus2 bMagicAddRace,RC_Insect,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_MDAMAGE_FISHS,{ bonus2 bMagicAddRace,RC_Fish,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_MDAMAGE_DEVIL,{ bonus2 bMagicAddRace,RC_Demon,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_MDAMAGE_HUMAN,{ bonus2 bMagicAddRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE); bonus2 bMagicAddRace,RC_Player_Human,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_MDAMAGE_HUMAN,{ bonus2 bMagicAddRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_MDAMAGE_ANGEL,{ bonus2 bMagicAddRace,RC_Angel,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_MDAMAGE_DRAGON,{ bonus2 bMagicAddRace,RC_Dragon,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_CRI_PERCENT_NOTHING,{ bonus2 bCriticalAddRace,RC_Formless,getrandomoptinfo(ROA_VALUE)/10; }
@ -127,7 +125,7 @@ RDMOPT_RACE_CRI_PERCENT_PLANT,{ bonus2 bCriticalAddRace,RC_Plant,getrandomoptinf
RDMOPT_RACE_CRI_PERCENT_INSECT,{ bonus2 bCriticalAddRace,RC_Insect,getrandomoptinfo(ROA_VALUE)/10; }
RDMOPT_RACE_CRI_PERCENT_FISHS,{ bonus2 bCriticalAddRace,RC_Fish,getrandomoptinfo(ROA_VALUE)/10; }
RDMOPT_RACE_CRI_PERCENT_DEVIL,{ bonus2 bCriticalAddRace,RC_Demon,getrandomoptinfo(ROA_VALUE)/10; }
RDMOPT_RACE_CRI_PERCENT_HUMAN,{ bonus2 bCriticalAddRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE)/10; bonus2 bCriticalAddRace,RC_Player_Human,getrandomoptinfo(ROA_VALUE)/10; }
RDMOPT_RACE_CRI_PERCENT_HUMAN,{ bonus2 bCriticalAddRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE)/10; }
RDMOPT_RACE_CRI_PERCENT_ANGEL,{ bonus2 bCriticalAddRace,RC_Angel,getrandomoptinfo(ROA_VALUE)/10; }
RDMOPT_RACE_CRI_PERCENT_DRAGON,{ bonus2 bCriticalAddRace,RC_Dragon,getrandomoptinfo(ROA_VALUE)/10; }
RDMOPT_RACE_IGNORE_DEF_PERCENT_NOTHING,{ bonus2 bIgnoreDefRaceRate,RC_Formless,getrandomoptinfo(ROA_VALUE); }
@ -137,7 +135,7 @@ RDMOPT_RACE_IGNORE_DEF_PERCENT_PLANT,{ bonus2 bIgnoreDefRaceRate,RC_Plant,getran
RDMOPT_RACE_IGNORE_DEF_PERCENT_INSECT,{ bonus2 bIgnoreDefRaceRate,RC_Insect,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_DEF_PERCENT_FISHS,{ bonus2 bIgnoreDefRaceRate,RC_Fish,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_DEF_PERCENT_DEVIL,{ bonus2 bIgnoreDefRaceRate,RC_Demon,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_DEF_PERCENT_HUMAN,{ bonus2 bIgnoreDefRaceRate,RC_DemiHuman,getrandomoptinfo(ROA_VALUE); bonus2 bIgnoreDefRaceRate,RC_Player_Human,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_DEF_PERCENT_HUMAN,{ bonus2 bIgnoreDefRaceRate,RC_DemiHuman,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_DEF_PERCENT_ANGEL,{ bonus2 bIgnoreDefRaceRate,RC_Angel,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_DEF_PERCENT_DRAGON,{ bonus2 bIgnoreDefRaceRate,RC_Dragon,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_MDEF_PERCENT_NOTHING,{ bonus2 bIgnoreMdefRaceRate,RC_Formless,getrandomoptinfo(ROA_VALUE); }
@ -147,7 +145,7 @@ RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLANT,{ bonus2 bIgnoreMdefRaceRate,RC_Plant,getr
RDMOPT_RACE_IGNORE_MDEF_PERCENT_INSECT,{ bonus2 bIgnoreMdefRaceRate,RC_Insect,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_MDEF_PERCENT_FISHS,{ bonus2 bIgnoreMdefRaceRate,RC_Fish,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_MDEF_PERCENT_DEVIL,{ bonus2 bIgnoreMdefRaceRate,RC_Demon,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_MDEF_PERCENT_HUMAN,{ bonus2 bIgnoreMdefRaceRate,RC_DemiHuman,getrandomoptinfo(ROA_VALUE); bonus2 bIgnoreMdefRaceRate,RC_Player_Human,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_MDEF_PERCENT_HUMAN,{ bonus2 bIgnoreMdefRaceRate,RC_DemiHuman,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_MDEF_PERCENT_ANGEL,{ bonus2 bIgnoreMdefRaceRate,RC_Angel,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_MDEF_PERCENT_DRAGON,{ bonus2 bIgnoreMdefRaceRate,RC_Dragon,getrandomoptinfo(ROA_VALUE); }
RDMOPT_CLASS_DAMAGE_NORMAL_TARGET,{ bonus2 bAddClass,Class_Normal,getrandomoptinfo(ROA_VALUE); }
@ -168,7 +166,7 @@ RDMOPT_DAMAGE_SIZE_MIDIUM_USER,{ bonus2 bSubSize,Size_Medium,getrandomoptinfo(RO
RDMOPT_DAMAGE_SIZE_LARGE_USER,{ bonus2 bSubSize,Size_Large,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_SIZE_PERFECT,{ bonus bNoSizeFix,1; }
RDMOPT_DAMAGE_CRI_TARGET,{ bonus bCritAtkRate,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_CRI_USER,{ bonus bCriticalDef,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_CRI_USER,{ bonus bCritDefRate,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RANGE_ATTACK_DAMAGE_TARGET,{ bonus bLongAtkRate,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RANGE_ATTACK_DAMAGE_USER,{ bonus bLongAtkDef,getrandomoptinfo(ROA_VALUE); }
RDMOPT_HEAL_VALUE,{ bonus bHealPower,getrandomoptinfo(ROA_VALUE); }
@ -193,8 +191,33 @@ RDMOPT_BODY_INDESTRUCTIBLE,{ bonus bUnbreakableArmor,1; }
RDMOPT_MDAMAGE_SIZE_SMALL_TARGET,{ bonus2 bMagicAddSize,Size_Small,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_SIZE_MIDIUM_TARGET,{ bonus2 bMagicAddSize,Size_Medium,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_SIZE_LARGE_TARGET,{ bonus2 bMagicAddSize,Size_Large,getrandomoptinfo(ROA_VALUE); }
//RDMOPT_MDAMAGE_SIZE_SMALL_USER,{}
//RDMOPT_MDAMAGE_SIZE_MIDIUM_USER,{}
//RDMOPT_MDAMAGE_SIZE_LARGE_USER,{}
//redefined?
//RDMOPT_ATTR_TOLERACE_ALL,{}
RDMOPT_MDAMAGE_SIZE_SMALL_USER,{ bonus2 bMagicSubSize,Size_Small,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_SIZE_MIDIUM_USER,{ bonus2 bMagicSubSize,Size_Medium,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_SIZE_LARGE_USER,{ bonus2 bMagicSubSize,Size_Large,getrandomoptinfo(ROA_VALUE); }
RDMOPT_ATTR_TOLERACE_ALL,{ bonus2 bSubEle,Ele_All,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_WEAPON_TOLERACE_NOTHING,{ bonus3 bSubRace,RC_Formless,getrandomoptinfo(ROA_VALUE),BF_WEAPON; }
RDMOPT_RACE_WEAPON_TOLERACE_UNDEAD,{ bonus3 bSubRace,RC_Undead,getrandomoptinfo(ROA_VALUE),BF_WEAPON; }
RDMOPT_RACE_WEAPON_TOLERACE_ANIMAL,{ bonus3 bSubRace,RC_Brute,getrandomoptinfo(ROA_VALUE),BF_WEAPON; }
RDMOPT_RACE_WEAPON_TOLERACE_PLANT,{ bonus3 bSubRace,RC_Plant,getrandomoptinfo(ROA_VALUE),BF_WEAPON; }
RDMOPT_RACE_WEAPON_TOLERACE_INSECT,{ bonus3 bSubRace,RC_Insect,getrandomoptinfo(ROA_VALUE),BF_WEAPON; }
RDMOPT_RACE_WEAPON_TOLERACE_FISHS,{ bonus3 bSubRace,RC_Fish,getrandomoptinfo(ROA_VALUE),BF_WEAPON; }
RDMOPT_RACE_WEAPON_TOLERACE_DEVIL,{ bonus3 bSubRace,RC_Demon,getrandomoptinfo(ROA_VALUE),BF_WEAPON; }
RDMOPT_RACE_WEAPON_TOLERACE_HUMAN,{ bonus3 bSubRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE),BF_WEAPON; }
RDMOPT_RACE_WEAPON_TOLERACE_ANGEL,{ bonus3 bSubRace,RC_Angel,getrandomoptinfo(ROA_VALUE),BF_WEAPON; }
RDMOPT_RACE_WEAPON_TOLERACE_DRAGON,{ bonus3 bSubRace,RC_Dragon,getrandomoptinfo(ROA_VALUE),BF_WEAPON; }
// RDMOPT_RANGE_WEAPON_ATTACK_DAMAGE_TARGET,{}
// RDMOPT_RANGE_WEAPON_ATTACK_DAMAGE_USER,{}
RDMOPT_RACE_TOLERACE_PLAYER_DORAM,{ bonus2 bSubRace,RC_Player_Doram,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_DAMAGE_PLAYER_HUMAN,{ bonus2 bAddRace,RC_Player_Human,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_DAMAGE_PLAYER_DORAM,{ bonus2 bAddRace,RC_Player_Doram,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_MDAMAGE_PLAYER_HUMAN,{ bonus2 bMagicAddRace,RC_Player_Human,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_MDAMAGE_PLAYER_DORAM,{ bonus2 bMagicAddRace,RC_Player_Doram,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_CRI_PERCENT_PLAYER_HUMAN,{ bonus2 bCriticalAddRace,RC_Player_Human,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_CRI_PERCENT_PLAYER_DORAM,{ bonus2 bCriticalAddRace,RC_Player_Doram,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_DEF_PERCENT_PLAYER_HUMAN,{ bonus2 bIgnoreDefRaceRate,RC_Player_Human,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_DEF_PERCENT_PLAYER_DORAM,{ bonus2 bIgnoreDefRaceRate,RC_Player_Doram,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLAYER_HUMAN,{ bonus2 bIgnoreMdefRaceRate,RC_Player_Human,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLAYER_DORAM,{ bonus2 bIgnoreMdefRaceRate,RC_Player_Doram,getrandomoptinfo(ROA_VALUE); }
// RDMOPT_REFLECT_DAMAGE_PERCENT,{}
RDMOPT_MELEE_ATTACK_DAMAGE_TARGET,{ bonus bShortAtkRate,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MELEE_ATTACK_DAMAGE_USER,{ bonus bNearAtkDef,getrandomoptinfo(ROA_VALUE); }

View File

@ -1360,7 +1360,7 @@ Affected files:
-- atcommand: atcommand_athena.conf, groups.conf
-- battleconf: battle_athena.conf, battle_conf.txt
-- instancedb: instance_db.txt
-- itemdb: item_db.txt, item_group_db.txt, item_trade.txt, item_noequip.txt, item_nouse.txt, item_combo_db.txt, item_avail.txt, item_stack.txt, item_delay.txt, item_buyingstore.txt, item_flag.txt
-- itemdb: item_db.txt, item_group_db.txt, item_trade.txt, item_noequip.txt, item_nouse.txt, item_combo_db.txt, item_avail.txt, item_stack.txt, item_delay.txt, item_buyingstore.txt, item_flag.txt, item_randomopt_db.txt, item_randomopt_group.txt
-- mobdb: mob_db.txt, mob_item_ratio.txt, mob_chat_db.txt, mob_avail.txt, mob_race2_db.txt, mob_branch.txt, mob_poring.txt, mob_boss.txt, mob_pouch.txt, mob_classchange.txt, pet_db.yml, homunculus_db.txt, homun_skill_tree.txt, exp_homun.txt, mercenary_db.txt, mercenary_skill_db.txt, elemental_db.txt, elemental_skill_db.txt
-- motd: motd.txt
-- msgconf: atcommand_athena.conf

View File

@ -171,6 +171,7 @@ bonus2 bSkillAtk,sk,n; Increases damage of skill sk by n%
bonus bShortAtkRate,n; Increases damage of short ranged attacks by n%
bonus bLongAtkRate,n; Increases damage of long ranged attacks by n%
bonus bCritAtkRate,n; Increases critical damage by +n%
bonus bCritDefRate,n; Decreases critical damage received by n%
bonus bCriticalDef,n; Decreases the chance of being hit by critical hits by n%
bonus2 bWeaponAtk,w,n; Adds n ATK when weapon of type w is equipped
bonus2 bWeaponDamageRate,w,n; Adds n% damage to normal attacks when weapon of type w is equipped
@ -232,6 +233,7 @@ bonus2 bSubDefEle,e,x; +x% damage reduction from enemy with defense element
bonus2 bAddRace,r,x; +x% physical damage against race r
bonus2 bMagicAddRace,r,x; +x% magical damage against race r
bonus2 bSubRace,r,x; +x% damage reduction against race r
bonus3 bSubRace,r,x,bf; +x% damage reduction against race r with trigger criteria bf
bonus2 bAddClass,c,x; +x% physical damage against class c
bonus2 bMagicAddClass,c,x; +x% magical damage against class c
@ -240,6 +242,7 @@ bonus2 bSubClass,c,x; +x% damage reduction against class c
bonus2 bAddSize,s,x; +x% physical damage against size s
bonus2 bMagicAddSize,s,x; +x% magical damage against size s
bonus2 bSubSize,s,x; +x% damage reduction against size s
bonus2 bMagicSubSize,s,x; +x% magic damage reduction against size s
bonus bNoSizeFix; Ignores the size modifier when calculating damage
bonus2 bAddDamageClass,mid,x; +x% physical damage against monster mid

View File

@ -698,8 +698,19 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
cardfix = cardfix * (100 - ele_fix) / 100;
}
cardfix = cardfix * (100 - tsd->subsize[sstatus->size] - tsd->subsize[SZ_ALL]) / 100;
cardfix = cardfix * (100 - tsd->magic_subsize[sstatus->size] - tsd->magic_subsize[SZ_ALL]) / 100;
cardfix = cardfix * (100 - tsd->subrace2[s_race2]) / 100;
cardfix = cardfix * (100 - tsd->subrace[sstatus->race] - tsd->subrace[RC_ALL]) / 100;
int race_fix = tsd->subrace[sstatus->race] - tsd->subrace[RC_ALL];
for (const auto &it : tsd->subrace3) {
if (it.race != sstatus->race)
continue;
if (!(((it.flag)&flag)&BF_WEAPONMASK &&
((it.flag)&flag)&BF_RANGEMASK &&
((it.flag)&flag)&BF_SKILLMASK))
continue;
race_fix += it.rate;
}
cardfix = cardfix * (100 - race_fix) / 100;
cardfix = cardfix * (100 - tsd->subclass[sstatus->class_] - tsd->subclass[CLASS_ALL]) / 100;
for (const auto &it : tsd->add_mdef) {
@ -898,7 +909,17 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
}
cardfix = cardfix * (100 - tsd->subsize[sstatus->size] - tsd->subsize[SZ_ALL]) / 100;
cardfix = cardfix * (100 - tsd->subrace2[s_race2]) / 100;
cardfix = cardfix * (100 - tsd->subrace[sstatus->race] - tsd->subrace[RC_ALL]) / 100;
int race_fix = tsd->subrace[sstatus->race] - tsd->subrace[RC_ALL];
for (const auto &it : tsd->subrace3) {
if (it.race != sstatus->race)
continue;
if (!(((it.flag)&flag)&BF_WEAPONMASK &&
((it.flag)&flag)&BF_RANGEMASK &&
((it.flag)&flag)&BF_SKILLMASK))
continue;
race_fix += it.rate;
}
cardfix = cardfix * (100 - race_fix) / 100;
cardfix = cardfix * (100 - tsd->subclass[sstatus->class_] - tsd->subclass[CLASS_ALL]) / 100;
for (const auto &it : tsd->add_def) {
if (it.id == s_class) {
@ -935,9 +956,20 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
ele_fix += tsd->subdefele[s_defele] + tsd->subdefele[ELE_ALL];
cardfix = cardfix * (100 - ele_fix) / 100;
}
int race_fix = tsd->subrace[sstatus->race] - tsd->subrace[RC_ALL];
for (const auto &it : tsd->subrace3) {
if (it.race != sstatus->race)
continue;
if (!(((it.flag)&flag)&BF_WEAPONMASK &&
((it.flag)&flag)&BF_RANGEMASK &&
((it.flag)&flag)&BF_SKILLMASK))
continue;
race_fix += it.rate;
}
cardfix = cardfix * (100 - race_fix) / 100;
cardfix = cardfix * (100 - tsd->subsize[sstatus->size] - tsd->subsize[SZ_ALL]) / 100;
cardfix = cardfix * (100 - tsd->subrace2[s_race2]) / 100;
cardfix = cardfix * (100 - tsd->subrace[sstatus->race] - tsd->subrace[RC_ALL]) / 100;
cardfix = cardfix * (100 - tsd->subclass[sstatus->class_] - tsd->subclass[CLASS_ALL]) / 100;
cardfix = cardfix * (100 - tsd->bonus.misc_def_rate) / 100;
if( flag&BF_SHORT )
@ -3257,6 +3289,8 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list *
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
struct map_session_data *sd = BL_CAST(BL_PC, src);
struct map_session_data *tsd = BL_CAST(BL_PC, target);
uint16 i;
std::bitset<NK_MAX> nk = battle_skill_get_damage_properties(skill_id, wd->miscflag);
@ -3467,6 +3501,11 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list *
}
}
}
#ifndef RENEWAL
if(tsd != nullptr & tsd->bonus.crit_def_rate != 0 && !skill_id && is_attack_critical(wd, src, target, skill_id, skill_lv, false)) {
ATK_ADDRATE(wd->damage, wd->damage2, -tsd->bonus.crit_def_rate);
}
#endif
break;
} //End switch(skill_id)
}
@ -5795,11 +5834,15 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
#ifdef RENEWAL
if (is_attack_critical(&wd, src, target, skill_id, skill_lv, false)) {
if (sd) { //Check for player so we don't crash out, monsters don't have bonus crit rates [helvetica]
wd.damage = (int)floor((float)((wd.damage * 140) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100);
wd.damage = (int64)floor((float)((wd.damage * 140) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100);
if (is_attack_left_handed(src, skill_id))
wd.damage2 = (int)floor((float)((wd.damage2 * 140) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100);
wd.damage2 = (int64)floor((float)((wd.damage2 * 140) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100);
} else
wd.damage = (int)floor((float)(wd.damage * 140) / 100);
wd.damage = (int64)floor((float)(wd.damage * 140) / 100);
if (tsd && tsd->bonus.crit_def_rate != 0) {
ATK_ADDRATE(wd.damage, wd.damage2, -tsd->bonus.crit_def_rate);
}
}
#endif

View File

@ -505,7 +505,7 @@ enum _sp {
SP_STATE_NORECOVER_RACE, SP_CRITICAL_RANGEATK, SP_MAGIC_ADDRACE2, SP_IGNORE_MDEF_RACE2_RATE, // 2079-2082
SP_WEAPON_ATK_RATE, SP_WEAPON_MATK_RATE, SP_DROP_ADDRACE, SP_DROP_ADDCLASS, SP_NO_MADO_FUEL, // 2083-2087
SP_IGNORE_DEF_CLASS_RATE, SP_REGEN_PERCENT_HP, SP_REGEN_PERCENT_SP, SP_SKILL_DELAY, SP_NO_WALK_DELAY, //2088-2093
SP_LONG_SP_GAIN_VALUE, SP_LONG_HP_GAIN_VALUE, SP_SHORT_ATK_RATE // 2094-2096
SP_LONG_SP_GAIN_VALUE, SP_LONG_HP_GAIN_VALUE, SP_SHORT_ATK_RATE, SP_MAGIC_SUBSIZE, SP_CRIT_DEF_RATE // 2094-2098
};
enum _look {

View File

@ -2890,6 +2890,49 @@ static void pc_bonus_subele(struct map_session_data* sd, unsigned char ele, shor
sd->subele2.push_back(entry);
}
/**
* Adjust race damage to target when attacking
* @param sd: Player data
* @param race: Race to adjust
* @param rate: Success chance
* @param flag: Battle flag
*/
static void pc_bonus_subrace(struct map_session_data* sd, unsigned char race, short rate, short flag)
{
if (sd->subrace3.size() == MAX_PC_BONUS) {
ShowWarning("pc_bonus_subrace: Reached max (%d) number of resist race damage bonuses per character!\n", MAX_PC_BONUS);
return;
}
if (!(flag&BF_RANGEMASK))
flag |= BF_SHORT | BF_LONG;
if (!(flag&BF_WEAPONMASK))
flag |= BF_WEAPON;
if (!(flag&BF_SKILLMASK)) {
if (flag&(BF_MAGIC | BF_MISC))
flag |= BF_SKILL;
if (flag&BF_WEAPON)
flag |= BF_NORMAL | BF_SKILL;
}
for (auto &it : sd->subrace3) {
if (it.race == race && it.flag == flag) {
it.rate = cap_value(it.rate + rate, -10000, 10000);
return;
}
}
struct s_addrace2 entry = {};
if (rate < -10000 || rate > 10000)
ShowWarning("pc_bonus_subrace: Item bonus rate %d exceeds -10000~10000 range, capping.\n", rate);
entry.race = race;
entry.rate = cap_value(rate, -10000, 10000);
entry.flag = flag;
sd->subrace3.push_back(entry);
}
/**
* General item bonus for player
* @param bonus: Bonus array
@ -3469,6 +3512,10 @@ void pc_bonus(struct map_session_data *sd,int type,int val)
if(sd->state.lr_flag != 2)
sd->bonus.crit_atk_rate += val;
break;
case SP_CRIT_DEF_RATE:
if(sd->state.lr_flag != 2)
sd->bonus.crit_def_rate += val;
break;
case SP_NO_REGEN:
if(sd->state.lr_flag != 2)
sd->regen.state.block|=val;
@ -3924,6 +3971,11 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
if(sd->state.lr_flag != 2)
sd->subsize[type2]+=val;
break;
case SP_MAGIC_SUBSIZE: // bonus2 bMagicSubSize,s,x;
PC_BONUS_CHK_SIZE(type2,SP_MAGIC_SUBSIZE);
if(sd->state.lr_flag != 2)
sd->magic_subsize[type2]+=val;
break;
case SP_SUBRACE2: // bonus2 bSubRace2,mr,x;
PC_BONUS_CHK_RACE2(type2,SP_SUBRACE2);
if(sd->state.lr_flag != 2)
@ -4281,7 +4333,13 @@ void pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
if (sd->state.lr_flag != 2)
pc_bonus_subele(sd, (unsigned char)type2, type3, val);
break;
case SP_SUBRACE: // bonus3 bSubRace,r,x,bf;
PC_BONUS_CHK_RACE(type2, SP_SUBRACE);
if (sd->state.lr_flag != 2)
pc_bonus_subrace(sd, (unsigned char)type2, type3, val);
break;
case SP_SP_VANISH_RACE_RATE: // bonus3 bSPVanishRaceRate,r,x,n;
PC_BONUS_CHK_RACE(type2,SP_SP_VANISH_RACE_RATE);
if(sd->state.lr_flag != 2) {
@ -8731,6 +8789,7 @@ int64 pc_readparam(struct map_session_data* sd,int64 type)
#else
val = sd->castrate; break;
#endif
case SP_CRIT_DEF_RATE: val = sd->bonus.crit_def_rate; break;
default:
ShowError("pc_readparam: Attempt to read unknown parameter '%lld'.\n", type);
return -1;

View File

@ -151,6 +151,12 @@ struct s_addele2 {
unsigned char ele;
};
/// AddRace bonus struct
struct s_addrace2 {
short flag, rate;
unsigned char race;
};
struct weapon_data {
int atkmods[SZ_ALL];
// all the variables except atkmods get zero'ed in each call of status_calc_pc
@ -181,6 +187,7 @@ struct weapon_data {
std::vector<s_item_bonus> add_dmg;
std::vector<s_addele2> addele2;
std::vector<s_addrace2> addrace3;
};
/// AutoSpell bonus struct
@ -440,6 +447,7 @@ struct map_session_data {
int magic_addclass[CLASS_MAX];
int magic_addsize[SZ_MAX];
int magic_atk_ele[ELE_MAX];
int magic_subsize[SZ_MAX];
int critaddrace[RC_MAX];
int expaddrace[RC_MAX];
int expaddclass[CLASS_MAX];
@ -462,6 +470,7 @@ struct map_session_data {
std::vector<s_add_drop> add_drop;
std::vector<s_addele2> subele2;
std::vector<s_vanish_bonus> sp_vanish, hp_vanish;
std::vector<s_addrace2> subrace3;
std::vector<s_autobonus> autobonus, autobonus2, autobonus3; //Auto script on attack, when attacked, on skill usage
// zeroed structures start here
@ -502,6 +511,7 @@ struct map_session_data {
int magic_damage_return; // AppleGirl Was Here
int break_weapon_rate,break_armor_rate;
int crit_atk_rate;
int crit_def_rate;
int classchange; // [Valaris]
int speed_rate, speed_add_rate, aspd_add;
int itemhealrate2; // [Epoque] Increase heal rate of all healing items.

View File

@ -753,6 +753,9 @@
export_constant2("bNoWalkDelay",SP_NO_WALK_DELAY);
export_constant2("bLongSPGainValue",SP_LONG_SP_GAIN_VALUE);
export_constant2("bLongHPGainValue",SP_LONG_HP_GAIN_VALUE);
export_constant2("bMagicSubSize",SP_MAGIC_SUBSIZE);
export_constant2("bCritDefRate",SP_CRIT_DEF_RATE);
/* equip indices */
export_constant(EQI_COMPOUND_ON);

View File

@ -3832,6 +3832,7 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
+ sizeof(sd->magic_addclass)
+ sizeof(sd->magic_addsize)
+ sizeof(sd->magic_atk_ele)
+ sizeof(sd->magic_subsize)
+ sizeof(sd->critaddrace)
+ sizeof(sd->expaddrace)
+ sizeof(sd->expaddclass)
@ -3914,6 +3915,7 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
sd->add_drop.clear();
sd->itemhealrate.clear();
sd->subele2.clear();
sd->subrace3.clear();
sd->skilldelay.clear();
sd->sp_vanish.clear();
sd->hp_vanish.clear();