Converts the random option databases to YAML (#5494)

* Fixes #3084.
* Creating random option groups now further reflects official behavior.
* Group bonuses can now be created without having to create multiple permutations of the same group.
* Specific slot options can now be defined which guarantee a bonus.
* Non-guaranteed options can now be defined along with a maximum amount.
* Random option value can now be defined as a range instead of a static value.
* Adds conversion of official random option groups.
* Includes CSV2YAML conversion tool.
Thanks to @Lemongrass3110!
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
This commit is contained in:
Aleos 2020-11-08 12:21:52 -05:00 committed by GitHub
parent b49e7a0dd9
commit be9babee32
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 9540 additions and 852 deletions

View File

@ -14,237 +14,6 @@
// in field Value. Depending on the implementation values assigned by scripts to parameters will affect
// runtime values, such as Zeny, as well (see pc_readparam/pc_setparam).
RDMOPT_VAR_MAXHPAMOUNT 1
RDMOPT_VAR_MAXSPAMOUNT 2
RDMOPT_VAR_STRAMOUNT 3
RDMOPT_VAR_AGIAMOUNT 4
RDMOPT_VAR_VITAMOUNT 5
RDMOPT_VAR_INTAMOUNT 6
RDMOPT_VAR_DEXAMOUNT 7
RDMOPT_VAR_LUKAMOUNT 8
RDMOPT_VAR_MAXHPPERCENT 9
RDMOPT_VAR_MAXSPPERCENT 10
RDMOPT_VAR_HPACCELERATION 11
RDMOPT_VAR_SPACCELERATION 12
RDMOPT_VAR_ATKPERCENT 13
RDMOPT_VAR_MAGICATKPERCENT 14
RDMOPT_VAR_PLUSASPD 15
RDMOPT_VAR_PLUSASPDPERCENT 16
RDMOPT_VAR_ATTPOWER 17
RDMOPT_VAR_HITSUCCESSVALUE 18
RDMOPT_VAR_ATTMPOWER 19
RDMOPT_VAR_ITEMDEFPOWER 20
RDMOPT_VAR_MDEFPOWER 21
RDMOPT_VAR_AVOIDSUCCESSVALUE 22
RDMOPT_VAR_PLUSAVOIDSUCCESSVALUE 23
RDMOPT_VAR_CRITICALSUCCESSVALUE 24
RDMOPT_ATTR_TOLERACE_NOTHING 25
RDMOPT_ATTR_TOLERACE_WATER 26
RDMOPT_ATTR_TOLERACE_GROUND 27
RDMOPT_ATTR_TOLERACE_FIRE 28
RDMOPT_ATTR_TOLERACE_WIND 29
RDMOPT_ATTR_TOLERACE_POISON 30
RDMOPT_ATTR_TOLERACE_SAINT 31
RDMOPT_ATTR_TOLERACE_DARKNESS 32
RDMOPT_ATTR_TOLERACE_TELEKINESIS 33
RDMOPT_ATTR_TOLERACE_UNDEAD 34
RDMOPT_ATTR_TOLERACE_ALLBUTNOTHING 35
RDMOPT_DAMAGE_PROPERTY_NOTHING_USER 36
RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET 37
RDMOPT_DAMAGE_PROPERTY_WATER_USER 38
RDMOPT_DAMAGE_PROPERTY_WATER_TARGET 39
RDMOPT_DAMAGE_PROPERTY_GROUND_USER 40
RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET 41
RDMOPT_DAMAGE_PROPERTY_FIRE_USER 42
RDMOPT_DAMAGE_PROPERTY_FIRE_TARGET 43
RDMOPT_DAMAGE_PROPERTY_WIND_USER 44
RDMOPT_DAMAGE_PROPERTY_WIND_TARGET 45
RDMOPT_DAMAGE_PROPERTY_POISON_USER 46
RDMOPT_DAMAGE_PROPERTY_POISON_TARGET 47
RDMOPT_DAMAGE_PROPERTY_SAINT_USER 48
RDMOPT_DAMAGE_PROPERTY_SAINT_TARGET 49
RDMOPT_DAMAGE_PROPERTY_DARKNESS_USER 50
RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET 51
RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_USER 52
RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET 53
RDMOPT_DAMAGE_PROPERTY_UNDEAD_USER 54
RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET 55
RDMOPT_MDAMAGE_PROPERTY_NOTHING_USER 56
RDMOPT_MDAMAGE_PROPERTY_NOTHING_TARGET 57
RDMOPT_MDAMAGE_PROPERTY_WATER_USER 58
RDMOPT_MDAMAGE_PROPERTY_WATER_TARGET 59
RDMOPT_MDAMAGE_PROPERTY_GROUND_USER 60
RDMOPT_MDAMAGE_PROPERTY_GROUND_TARGET 61
RDMOPT_MDAMAGE_PROPERTY_FIRE_USER 62
RDMOPT_MDAMAGE_PROPERTY_FIRE_TARGET 63
RDMOPT_MDAMAGE_PROPERTY_WIND_USER 64
RDMOPT_MDAMAGE_PROPERTY_WIND_TARGET 65
RDMOPT_MDAMAGE_PROPERTY_POISON_USER 66
RDMOPT_MDAMAGE_PROPERTY_POISON_TARGET 67
RDMOPT_MDAMAGE_PROPERTY_SAINT_USER 68
RDMOPT_MDAMAGE_PROPERTY_SAINT_TARGET 69
RDMOPT_MDAMAGE_PROPERTY_DARKNESS_USER 70
RDMOPT_MDAMAGE_PROPERTY_DARKNESS_TARGET 71
RDMOPT_MDAMAGE_PROPERTY_TELEKINESIS_USER 72
RDMOPT_MDAMAGE_PROPERTY_TELEKINESIS_TARGET 73
RDMOPT_MDAMAGE_PROPERTY_UNDEAD_USER 74
RDMOPT_MDAMAGE_PROPERTY_UNDEAD_TARGET 75
RDMOPT_BODY_ATTR_NOTHING 76
RDMOPT_BODY_ATTR_WATER 77
RDMOPT_BODY_ATTR_GROUND 78
RDMOPT_BODY_ATTR_FIRE 79
RDMOPT_BODY_ATTR_WIND 80
RDMOPT_BODY_ATTR_POISON 81
RDMOPT_BODY_ATTR_SAINT 82
RDMOPT_BODY_ATTR_DARKNESS 83
RDMOPT_BODY_ATTR_TELEKINESIS 84
RDMOPT_BODY_ATTR_UNDEAD 85
//RDMOPT_BODY_ATTR_ALL 86
RDMOPT_RACE_TOLERACE_NOTHING 87
RDMOPT_RACE_TOLERACE_UNDEAD 88
RDMOPT_RACE_TOLERACE_ANIMAL 89
RDMOPT_RACE_TOLERACE_PLANT 90
RDMOPT_RACE_TOLERACE_INSECT 91
RDMOPT_RACE_TOLERACE_FISHS 92
RDMOPT_RACE_TOLERACE_DEVIL 93
RDMOPT_RACE_TOLERACE_HUMAN 94
RDMOPT_RACE_TOLERACE_ANGEL 95
RDMOPT_RACE_TOLERACE_DRAGON 96
RDMOPT_RACE_DAMAGE_NOTHING 97
RDMOPT_RACE_DAMAGE_UNDEAD 98
RDMOPT_RACE_DAMAGE_ANIMAL 99
RDMOPT_RACE_DAMAGE_PLANT 100
RDMOPT_RACE_DAMAGE_INSECT 101
RDMOPT_RACE_DAMAGE_FISHS 102
RDMOPT_RACE_DAMAGE_DEVIL 103
RDMOPT_RACE_DAMAGE_HUMAN 104
RDMOPT_RACE_DAMAGE_ANGEL 105
RDMOPT_RACE_DAMAGE_DRAGON 106
RDMOPT_RACE_MDAMAGE_NOTHING 107
RDMOPT_RACE_MDAMAGE_UNDEAD 108
RDMOPT_RACE_MDAMAGE_ANIMAL 109
RDMOPT_RACE_MDAMAGE_PLANT 110
RDMOPT_RACE_MDAMAGE_INSECT 111
RDMOPT_RACE_MDAMAGE_FISHS 112
RDMOPT_RACE_MDAMAGE_DEVIL 113
RDMOPT_RACE_MDAMAGE_HUMAN 114
RDMOPT_RACE_MDAMAGE_ANGEL 115
RDMOPT_RACE_MDAMAGE_DRAGON 116
RDMOPT_RACE_CRI_PERCENT_NOTHING 117
RDMOPT_RACE_CRI_PERCENT_UNDEAD 118
RDMOPT_RACE_CRI_PERCENT_ANIMAL 119
RDMOPT_RACE_CRI_PERCENT_PLANT 120
RDMOPT_RACE_CRI_PERCENT_INSECT 121
RDMOPT_RACE_CRI_PERCENT_FISHS 122
RDMOPT_RACE_CRI_PERCENT_DEVIL 123
RDMOPT_RACE_CRI_PERCENT_HUMAN 124
RDMOPT_RACE_CRI_PERCENT_ANGEL 125
RDMOPT_RACE_CRI_PERCENT_DRAGON 126
RDMOPT_RACE_IGNORE_DEF_PERCENT_NOTHING 127
RDMOPT_RACE_IGNORE_DEF_PERCENT_UNDEAD 128
RDMOPT_RACE_IGNORE_DEF_PERCENT_ANIMAL 129
RDMOPT_RACE_IGNORE_DEF_PERCENT_PLANT 130
RDMOPT_RACE_IGNORE_DEF_PERCENT_INSECT 131
RDMOPT_RACE_IGNORE_DEF_PERCENT_FISHS 132
RDMOPT_RACE_IGNORE_DEF_PERCENT_DEVIL 133
RDMOPT_RACE_IGNORE_DEF_PERCENT_HUMAN 134
RDMOPT_RACE_IGNORE_DEF_PERCENT_ANGEL 135
RDMOPT_RACE_IGNORE_DEF_PERCENT_DRAGON 136
RDMOPT_RACE_IGNORE_MDEF_PERCENT_NOTHING 137
RDMOPT_RACE_IGNORE_MDEF_PERCENT_UNDEAD 138
RDMOPT_RACE_IGNORE_MDEF_PERCENT_ANIMAL 139
RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLANT 140
RDMOPT_RACE_IGNORE_MDEF_PERCENT_INSECT 141
RDMOPT_RACE_IGNORE_MDEF_PERCENT_FISHS 142
RDMOPT_RACE_IGNORE_MDEF_PERCENT_DEVIL 143
RDMOPT_RACE_IGNORE_MDEF_PERCENT_HUMAN 144
RDMOPT_RACE_IGNORE_MDEF_PERCENT_ANGEL 145
RDMOPT_RACE_IGNORE_MDEF_PERCENT_DRAGON 146
RDMOPT_CLASS_DAMAGE_NORMAL_TARGET 147
RDMOPT_CLASS_DAMAGE_BOSS_TARGET 148
RDMOPT_CLASS_DAMAGE_NORMAL_USER 149
RDMOPT_CLASS_DAMAGE_BOSS_USER 150
RDMOPT_CLASS_MDAMAGE_NORMAL 151
RDMOPT_CLASS_MDAMAGE_BOSS 152
RDMOPT_CLASS_IGNORE_DEF_PERCENT_NORMAL 153
RDMOPT_CLASS_IGNORE_DEF_PERCENT_BOSS 154
RDMOPT_CLASS_IGNORE_MDEF_PERCENT_NORMAL 155
RDMOPT_CLASS_IGNORE_MDEF_PERCENT_BOSS 156
RDMOPT_DAMAGE_SIZE_SMALL_TARGET 157
RDMOPT_DAMAGE_SIZE_MIDIUM_TARGET 158
RDMOPT_DAMAGE_SIZE_LARGE_TARGET 159
RDMOPT_DAMAGE_SIZE_SMALL_USER 160
RDMOPT_DAMAGE_SIZE_MIDIUM_USER 161
RDMOPT_DAMAGE_SIZE_LARGE_USER 162
RDMOPT_DAMAGE_SIZE_PERFECT 163
RDMOPT_DAMAGE_CRI_TARGET 164
RDMOPT_DAMAGE_CRI_USER 165
RDMOPT_RANGE_ATTACK_DAMAGE_TARGET 166
RDMOPT_RANGE_ATTACK_DAMAGE_USER 167
RDMOPT_HEAL_VALUE 168
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_RACE_WEAPON_TOLERACE_NOTHING 194
RDMOPT_RACE_WEAPON_TOLERACE_UNDEAD 195
RDMOPT_RACE_WEAPON_TOLERACE_ANIMAL 196
RDMOPT_RACE_WEAPON_TOLERACE_PLANT 197
RDMOPT_RACE_WEAPON_TOLERACE_INSECT 198
RDMOPT_RACE_WEAPON_TOLERACE_FISHS 199
RDMOPT_RACE_WEAPON_TOLERACE_DEVIL 200
RDMOPT_RACE_WEAPON_TOLERACE_HUMAN 201
RDMOPT_RACE_WEAPON_TOLERACE_ANGEL 202
RDMOPT_RACE_WEAPON_TOLERACE_DRAGON 203
//RDMOPT_RANGE_WEAPON_ATTACK_DAMAGE_TARGET 204
//RDMOPT_RANGE_WEAPON_ATTACK_DAMAGE_USER 205
RDMOPT_RACE_TOLERACE_PLAYER_HUMAN 206
RDMOPT_RACE_TOLERACE_PLAYER_DORAM 207
RDMOPT_RACE_DAMAGE_PLAYER_HUMAN 208
RDMOPT_RACE_DAMAGE_PLAYER_DORAM 209
RDMOPT_RACE_MDAMAGE_PLAYER_HUMAN 210
RDMOPT_RACE_MDAMAGE_PLAYER_DORAM 211
RDMOPT_RACE_CRI_PERCENT_PLAYER_HUMAN 212
RDMOPT_RACE_CRI_PERCENT_PLAYER_DORAM 213
RDMOPT_RACE_IGNORE_DEF_PERCENT_PLAYER_HUMAN 214
RDMOPT_RACE_IGNORE_DEF_PERCENT_PLAYER_DORAM 215
RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLAYER_HUMAN 216
RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLAYER_DORAM 217
//RDMOPT_REFLECT_DAMAGE_PERCENT 218
RDMOPT_MELEE_ATTACK_DAMAGE_TARGET 219
RDMOPT_MELEE_ATTACK_DAMAGE_USER 220
//RDMOPT_ADDSKILLMDAMAGE_NOTHING 221
//RDMOPT_ADDSKILLMDAMAGE_WATER 222
//RDMOPT_ADDSKILLMDAMAGE_GROUND 223
//RDMOPT_ADDSKILLMDAMAGE_FIRE 224
//RDMOPT_ADDSKILLMDAMAGE_WIND 225
//RDMOPT_ADDSKILLMDAMAGE_POISON 226
//RDMOPT_ADDSKILLMDAMAGE_SAINT 227
//RDMOPT_ADDSKILLMDAMAGE_DARKNESS 228
//RDMOPT_ADDSKILLMDAMAGE_TELEKINESIS 229
//RDMOPT_ADDSKILLMDAMAGE_UNDEAD 230
SWORDCLAN 1
ARCWANDCLAN 2
GOLDENMACECLAN 3

View File

@ -1,4 +0,0 @@
// Items Random Option Database
//
// Structure of Database:
// ID,{ Bonus Script }

View File

@ -0,0 +1,32 @@
# This file is a part of rAthena.
# Copyright(C) 2020 rAthena Development Team
# https://rathena.org - https://github.com/rathena
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###########################################################################
# Item Random Option Database
###########################################################################
#
# Item Random Option Settings
#
###########################################################################
# - Id Item Random Option ID matching the ID defined in enumvar.lub in the client.
# Option Item Random Option constant.
# Script Bonus script used for option.
###########################################################################
Header:
Type: RANDOM_OPTION_DB
Version: 1

View File

@ -1 +0,0 @@
// <randopt_groupid>,<rate>,<randopt_id1>,<randopt_value1>,<randopt_param1>{,<randopt_id2>,<randopt_value2>,<randopt_param2>,<randopt_id3>,<randopt_value3>,<randopt_param3>,<randopt_id4>,<randopt_value4>,<randopt_param4>,<randopt_id5>,<randopt_value5>,<randopt_param5>}

View File

@ -0,0 +1,46 @@
# This file is a part of rAthena.
# Copyright(C) 2020 rAthena Development Team
# https://rathena.org - https://github.com/rathena
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###########################################################################
# Item Random Option Group Database
###########################################################################
#
# Item Random Option Group Settings
#
###########################################################################
# - Id Item Random Option Group ID.
# Group Item Random Option Group constant.
# Slots: Slot in which an Item Random Option is guaranteed to be applied. Max of MAX_ITEM_RDM_OPT.
# - Slot Slot number.
# Options: List of possible Item Random Options for slot.
# - Option Item Random Option constant.
# MinValue Minimum value. (Default: 0)
# MaxValue Maximum value. (Default: 0)
# Param Parameter value. (Default: 0)
# Chance Chance applied specifically to this Item Random Option (1 = 0.01%, 10000 = 100%). (Default: 0)
# MaxRandom Maximum amount of random options applied. These options are not guaranteed to be applied. Max of (MAX_ITEM_RDM_OPT - Total 'Slots'). (Default: 0)
# Random: List of possible Item Random Options for remaining slots. (Optional)
# - Option Item Random Option constant.
# MinValue Minimum value. (Default: 0)
# MaxValue Maximum value. (Default: 0)
# Param Parameter value. (Default: 0)
# Chance Chance applied specifically to this Item Random Option (1 = 0.01%, 10000 = 100%). (Default: 0)
###########################################################################
Header:
Type: RANDOM_OPTION_GROUP
Version: 1

38
db/item_randomopt_db.yml Normal file
View File

@ -0,0 +1,38 @@
# This file is a part of rAthena.
# Copyright(C) 2020 rAthena Development Team
# https://rathena.org - https://github.com/rathena
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###########################################################################
# Item Random Option Database
###########################################################################
#
# Item Random Option Settings
#
###########################################################################
# - Id Item Random Option ID matching the ID defined in enumvar.lub in the client.
# Option Item Random Option constant.
# Script Bonus script used for option.
###########################################################################
Header:
Type: RANDOM_OPTION_DB
Version: 1
Footer:
Imports:
- Path: db/re/item_randomopt_db.yml
Mode: Renewal
- Path: db/import/item_randomopt_db.yml

View File

@ -0,0 +1,52 @@
# This file is a part of rAthena.
# Copyright(C) 2020 rAthena Development Team
# https://rathena.org - https://github.com/rathena
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###########################################################################
# Item Random Option Group Database
###########################################################################
#
# Item Random Option Group Settings
#
###########################################################################
# - Id Item Random Option Group ID.
# Group Item Random Option Group constant.
# Slots: Slot in which an Item Random Option is guaranteed to be applied. Max of MAX_ITEM_RDM_OPT.
# - Slot Slot number.
# Options: List of possible Item Random Options for slot.
# - Option Item Random Option constant.
# MinValue Minimum value. (Default: 0)
# MaxValue Maximum value. (Default: 0)
# Param Parameter value. (Default: 0)
# Chance Chance applied specifically to this Item Random Option (1 = 0.01%, 10000 = 100%). (Default: 0)
# MaxRandom Maximum amount of random options applied. These options are not guaranteed to be applied. Max of (MAX_ITEM_RDM_OPT - Total 'Slots'). (Default: 0)
# Random: List of possible Item Random Options for remaining slots. (Optional)
# - Option Item Random Option constant.
# MinValue Minimum value. (Default: 0)
# MaxValue Maximum value. (Default: 0)
# Param Parameter value. (Default: 0)
# Chance Chance applied specifically to this Item Random Option (1 = 0.01%, 10000 = 100%). (Default: 0)
###########################################################################
Header:
Type: RANDOM_OPTION_GROUP
Version: 1
Footer:
Imports:
- Path: db/re/item_randomopt_group.yml
Mode: Renewal
- Path: db/import/item_randomopt_group.yml

View File

@ -1,4 +0,0 @@
// Items Random Option Database
//
// Structure of Database:
// ID,{ Bonus Script }

View File

@ -1 +0,0 @@
// <randopt_groupid>,<rate>,<randopt_id1>,<randopt_value1>,<randopt_param1>{,<randopt_id2>,<randopt_value2>,<randopt_param2>,<randopt_id3>,<randopt_value3>,<randopt_param3>,<randopt_id4>,<randopt_value4>,<randopt_param4>,<randopt_id5>,<randopt_value5>,<randopt_param5>}

View File

@ -1,224 +0,0 @@
// Items Random Option Database
//
// Structure of Database:
// ID,{ Bonus Script }
RDMOPT_VAR_MAXHPAMOUNT,{ bonus bMaxHP,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_MAXSPAMOUNT,{ bonus bMaxSP,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_STRAMOUNT,{ bonus bStr,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_AGIAMOUNT,{ bonus bAgi,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_VITAMOUNT,{ bonus bVit,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_INTAMOUNT,{ bonus bInt,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_DEXAMOUNT,{ bonus bDex,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_LUKAMOUNT,{ bonus bLuk,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_MAXHPPERCENT,{ bonus bMaxHPrate,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_MAXSPPERCENT,{ bonus bMaxSPrate,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_HPACCELERATION,{ bonus bHPrecovRate,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_SPACCELERATION,{ bonus bSPrecovRate,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_ATKPERCENT,{ bonus2 bAddClass,Class_All,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_MAGICATKPERCENT,{ bonus bMatkRate,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_PLUSASPD,{ bonus bAspd,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_PLUSASPDPERCENT,{ bonus bAspdRate,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_ATTPOWER,{ bonus bAtk,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_HITSUCCESSVALUE,{ bonus bHit,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_ATTMPOWER,{ bonus bMatk,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_ITEMDEFPOWER,{ bonus bDef,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_MDEFPOWER,{ bonus bMdef,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_AVOIDSUCCESSVALUE,{ bonus bFlee,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_PLUSAVOIDSUCCESSVALUE,{ bonus bFlee2,getrandomoptinfo(ROA_VALUE); }
RDMOPT_VAR_CRITICALSUCCESSVALUE,{ bonus bCritical,getrandomoptinfo(ROA_VALUE); }
RDMOPT_ATTR_TOLERACE_NOTHING,{ bonus2 bSubEle,Ele_Neutral,getrandomoptinfo(ROA_VALUE); }
RDMOPT_ATTR_TOLERACE_WATER,{ bonus2 bSubEle,Ele_Water,getrandomoptinfo(ROA_VALUE); }
RDMOPT_ATTR_TOLERACE_GROUND,{ bonus2 bSubEle,Ele_Earth,getrandomoptinfo(ROA_VALUE); }
RDMOPT_ATTR_TOLERACE_FIRE,{ bonus2 bSubEle,Ele_Fire,getrandomoptinfo(ROA_VALUE); }
RDMOPT_ATTR_TOLERACE_WIND,{ bonus2 bSubEle,Ele_Wind,getrandomoptinfo(ROA_VALUE); }
RDMOPT_ATTR_TOLERACE_POISON,{ bonus2 bSubEle,Ele_Poison,getrandomoptinfo(ROA_VALUE); }
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_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); }
RDMOPT_DAMAGE_PROPERTY_WATER_TARGET,{ bonus2 bAddEle,Ele_Water,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_GROUND_USER,{ bonus2 bSubDefEle,Ele_Earth,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET,{ bonus2 bAddEle,Ele_Earth,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_FIRE_USER,{ bonus2 bSubDefEle,Ele_Fire,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_FIRE_TARGET,{ bonus2 bAddEle,Ele_Fire,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_WIND_USER,{ bonus2 bSubDefEle,Ele_Wind,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_WIND_TARGET,{ bonus2 bAddEle,Ele_Wind,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_POISON_USER,{ bonus2 bSubDefEle,Ele_Poison,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_POISON_TARGET,{ bonus2 bAddEle,Ele_Poison,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_SAINT_USER,{ bonus2 bSubDefEle,Ele_Holy,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_SAINT_TARGET,{ bonus2 bAddEle,Ele_Holy,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_DARKNESS_USER,{ bonus2 bSubDefEle,Ele_Dark,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET,{ bonus2 bAddEle,Ele_Dark,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_USER,{ bonus2 bSubDefEle,Ele_Ghost,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET,{ bonus2 bAddEle,Ele_Ghost,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_UNDEAD_USER,{ bonus2 bSubDefEle,Ele_Undead,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET,{ bonus2 bAddEle,Ele_Undead,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_NOTHING_USER,{ bonus2 bMagicSubDefEle,Ele_Neutral,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_NOTHING_TARGET,{ bonus2 bMagicAddEle,Ele_Neutral,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_WATER_USER,{ bonus2 bMagicSubDefEle,Ele_Water,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_WATER_TARGET,{ bonus2 bMagicAddEle,Ele_Water,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_GROUND_USER,{ bonus2 bMagicSubDefEle,Ele_Earth,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_GROUND_TARGET,{ bonus2 bMagicAddEle,Ele_Earth,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_FIRE_USER,{ bonus2 bMagicSubDefEle,Ele_Fire,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_FIRE_TARGET,{ bonus2 bMagicAddEle,Ele_Fire,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_WIND_USER,{ bonus2 bMagicSubDefEle,Ele_Wind,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_WIND_TARGET,{ bonus2 bMagicAddEle,Ele_Wind,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_POISON_USER,{ bonus2 bMagicSubDefEle,Ele_Poison,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_POISON_TARGET,{ bonus2 bMagicAddEle,Ele_Poison,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_SAINT_USER,{ bonus2 bMagicSubDefEle,Ele_Holy,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_SAINT_TARGET,{ bonus2 bMagicAddEle,Ele_Holy,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_DARKNESS_USER,{ bonus2 bMagicSubDefEle,Ele_Dark,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_DARKNESS_TARGET,{ bonus2 bMagicAddEle,Ele_Dark,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_TELEKINESIS_USER,{ bonus2 bMagicSubDefEle,Ele_Ghost,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_TELEKINESIS_TARGET,{ bonus2 bMagicAddEle,Ele_Ghost,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_UNDEAD_USER,{ bonus2 bMagicSubDefEle,Ele_Undead,getrandomoptinfo(ROA_VALUE); }
RDMOPT_MDAMAGE_PROPERTY_UNDEAD_TARGET,{ bonus2 bMagicAddEle,Ele_Undead,getrandomoptinfo(ROA_VALUE); }
RDMOPT_BODY_ATTR_NOTHING,{ bonus bDefEle,Ele_Neutral; }
RDMOPT_BODY_ATTR_WATER,{ bonus bDefEle,Ele_Water; }
RDMOPT_BODY_ATTR_GROUND,{ bonus bDefEle,Ele_Earth; }
RDMOPT_BODY_ATTR_FIRE,{ bonus bDefEle,Ele_Fire; }
RDMOPT_BODY_ATTR_WIND,{ bonus bDefEle,Ele_Wind; }
RDMOPT_BODY_ATTR_POISON,{ bonus bDefEle,Ele_Poison; }
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,{}
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); }
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); }
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); }
RDMOPT_RACE_DAMAGE_UNDEAD,{ bonus2 bAddRace,RC_Undead,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_DAMAGE_ANIMAL,{ bonus2 bAddRace,RC_Brute,getrandomoptinfo(ROA_VALUE); }
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); }
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); }
RDMOPT_RACE_MDAMAGE_UNDEAD,{ bonus2 bMagicAddRace,RC_Undead,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_MDAMAGE_ANIMAL,{ bonus2 bMagicAddRace,RC_Brute,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_MDAMAGE_PLANT,{ bonus2 bMagicAddRace,RC_Plant,getrandomoptinfo(ROA_VALUE); }
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); }
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; }
RDMOPT_RACE_CRI_PERCENT_UNDEAD,{ bonus2 bCriticalAddRace,RC_Undead,getrandomoptinfo(ROA_VALUE)/10; }
RDMOPT_RACE_CRI_PERCENT_ANIMAL,{ bonus2 bCriticalAddRace,RC_Brute,getrandomoptinfo(ROA_VALUE)/10; }
RDMOPT_RACE_CRI_PERCENT_PLANT,{ bonus2 bCriticalAddRace,RC_Plant,getrandomoptinfo(ROA_VALUE)/10; }
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; }
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); }
RDMOPT_RACE_IGNORE_DEF_PERCENT_UNDEAD,{ bonus2 bIgnoreDefRaceRate,RC_Undead,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_DEF_PERCENT_ANIMAL,{ bonus2 bIgnoreDefRaceRate,RC_Brute,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_DEF_PERCENT_PLANT,{ bonus2 bIgnoreDefRaceRate,RC_Plant,getrandomoptinfo(ROA_VALUE); }
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); }
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); }
RDMOPT_RACE_IGNORE_MDEF_PERCENT_UNDEAD,{ bonus2 bIgnoreMdefRaceRate,RC_Undead,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_MDEF_PERCENT_ANIMAL,{ bonus2 bIgnoreMdefRaceRate,RC_Brute,getrandomoptinfo(ROA_VALUE); }
RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLANT,{ bonus2 bIgnoreMdefRaceRate,RC_Plant,getrandomoptinfo(ROA_VALUE); }
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); }
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); }
RDMOPT_CLASS_DAMAGE_BOSS_TARGET,{ bonus2 bAddClass,Class_Boss,getrandomoptinfo(ROA_VALUE); }
RDMOPT_CLASS_DAMAGE_NORMAL_USER,{ bonus2 bSubClass,Class_Normal,getrandomoptinfo(ROA_VALUE); }
RDMOPT_CLASS_DAMAGE_BOSS_USER,{ bonus2 bSubClass,Class_Boss,getrandomoptinfo(ROA_VALUE); }
RDMOPT_CLASS_MDAMAGE_NORMAL,{ bonus2 bMagicAddClass,Class_Normal,getrandomoptinfo(ROA_VALUE); }
RDMOPT_CLASS_MDAMAGE_BOSS,{ bonus2 bMagicAddClass,Class_Boss,getrandomoptinfo(ROA_VALUE); }
RDMOPT_CLASS_IGNORE_DEF_PERCENT_NORMAL,{ bonus2 bIgnoreDefClassRate,Class_Normal,getrandomoptinfo(ROA_VALUE); }
RDMOPT_CLASS_IGNORE_DEF_PERCENT_BOSS,{ bonus2 bIgnoreDefClassRate,Class_Boss,getrandomoptinfo(ROA_VALUE); }
RDMOPT_CLASS_IGNORE_MDEF_PERCENT_NORMAL,{ bonus2 bIgnoreMdefClassRate,Class_Normal,getrandomoptinfo(ROA_VALUE); }
RDMOPT_CLASS_IGNORE_MDEF_PERCENT_BOSS,{ bonus2 bIgnoreMdefClassRate,Class_Boss,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_SIZE_SMALL_TARGET,{ bonus2 bAddSize,Size_Small,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_SIZE_MIDIUM_TARGET,{ bonus2 bAddSize,Size_Medium,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_SIZE_LARGE_TARGET,{ bonus2 bAddSize,Size_Large,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_SIZE_SMALL_USER,{ bonus2 bSubSize,Size_Small,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DAMAGE_SIZE_MIDIUM_USER,{ bonus2 bSubSize,Size_Medium,getrandomoptinfo(ROA_VALUE); }
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 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); }
RDMOPT_HEAL_MODIFY_PERCENT,{ bonus bHealPower2,getrandomoptinfo(ROA_VALUE); }
RDMOPT_DEC_SPELL_CAST_TIME,{ bonus bVariableCastrate,-(getrandomoptinfo(ROA_VALUE));}
RDMOPT_DEC_SPELL_DELAY_TIME,{ bonus bDelayrate,-(getrandomoptinfo(ROA_VALUE)); }
RDMOPT_DEC_SP_CONSUMPTION,{ bonus bUseSPrate,-(getrandomoptinfo(ROA_VALUE)); }
//RDMOPT_HP_DRAIN,{ /* Needs more info */ }
//RDMOPT_SP_DRAIN,{ /* Needs more info */ }
RDMOPT_WEAPON_ATTR_NOTHING,{ bonus bAtkEle,Ele_Neutral; }
RDMOPT_WEAPON_ATTR_WATER,{ bonus bAtkEle,Ele_Water; }
RDMOPT_WEAPON_ATTR_GROUND,{ bonus bAtkEle,Ele_Earth; }
RDMOPT_WEAPON_ATTR_FIRE,{ bonus bAtkEle,Ele_Fire; }
RDMOPT_WEAPON_ATTR_WIND,{ bonus bAtkEle,Ele_Wind; }
RDMOPT_WEAPON_ATTR_POISON,{ bonus bAtkEle,Ele_Poison; }
RDMOPT_WEAPON_ATTR_SAINT,{ bonus bAtkEle,Ele_Holy; }
RDMOPT_WEAPON_ATTR_DARKNESS,{ bonus bAtkEle,Ele_Dark; }
RDMOPT_WEAPON_ATTR_TELEKINESIS,{ bonus bAtkEle,Ele_Ghost; }
RDMOPT_WEAPON_ATTR_UNDEAD,{ bonus bAtkEle,Ele_Undead; }
RDMOPT_WEAPON_INDESTRUCTIBLE,{ bonus bUnbreakableWeapon,1; }
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,{ 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_HUMAN,{ bonus2 bSubRace,RC_Player_Human,getrandomoptinfo(ROA_VALUE); }
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); }

891
db/re/item_randomopt_db.yml Normal file
View File

@ -0,0 +1,891 @@
# This file is a part of rAthena.
# Copyright(C) 2020 rAthena Development Team
# https://rathena.org - https://github.com/rathena
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###########################################################################
# Item Random Option Database
###########################################################################
#
# Item Random Option Settings
#
###########################################################################
# - Id Item Random Option ID matching the ID defined in enumvar.lub in the client.
# Option Item Random Option constant.
# Script Bonus script used for option.
###########################################################################
Header:
Type: RANDOM_OPTION_DB
Version: 1
Body:
- Id: 1
Option: VAR_MAXHPAMOUNT
Script: |
bonus bMaxHP,getrandomoptinfo(ROA_VALUE);
- Id: 2
Option: VAR_MAXSPAMOUNT
Script: |
bonus bMaxSP,getrandomoptinfo(ROA_VALUE);
- Id: 3
Option: VAR_STRAMOUNT
Script: |
bonus bStr,getrandomoptinfo(ROA_VALUE);
- Id: 4
Option: VAR_AGIAMOUNT
Script: |
bonus bAgi,getrandomoptinfo(ROA_VALUE);
- Id: 5
Option: VAR_VITAMOUNT
Script: |
bonus bVit,getrandomoptinfo(ROA_VALUE);
- Id: 6
Option: VAR_INTAMOUNT
Script: |
bonus bInt,getrandomoptinfo(ROA_VALUE);
- Id: 7
Option: VAR_DEXAMOUNT
Script: |
bonus bDex,getrandomoptinfo(ROA_VALUE);
- Id: 8
Option: VAR_LUKAMOUNT
Script: |
bonus bLuk,getrandomoptinfo(ROA_VALUE);
- Id: 9
Option: VAR_MAXHPPERCENT
Script: |
bonus bMaxHPrate,getrandomoptinfo(ROA_VALUE);
- Id: 10
Option: VAR_MAXSPPERCENT
Script: |
bonus bMaxSPrate,getrandomoptinfo(ROA_VALUE);
- Id: 11
Option: VAR_HPACCELERATION
Script: |
bonus bHPrecovRate,getrandomoptinfo(ROA_VALUE);
- Id: 12
Option: VAR_SPACCELERATION
Script: |
bonus bSPrecovRate,getrandomoptinfo(ROA_VALUE);
- Id: 13
Option: VAR_ATKPERCENT
Script: |
bonus2 bAddClass,Class_All,getrandomoptinfo(ROA_VALUE);
- Id: 14
Option: VAR_MAGICATKPERCENT
Script: |
bonus bMatkRate,getrandomoptinfo(ROA_VALUE);
- Id: 15
Option: VAR_PLUSASPD
Script: |
bonus bAspd,getrandomoptinfo(ROA_VALUE);
- Id: 16
Option: VAR_PLUSASPDPERCENT
Script: |
bonus bAspdRate,getrandomoptinfo(ROA_VALUE);
- Id: 17
Option: VAR_ATTPOWER
Script: |
bonus bAtk,getrandomoptinfo(ROA_VALUE);
- Id: 18
Option: VAR_HITSUCCESSVALUE
Script: |
bonus bHit,getrandomoptinfo(ROA_VALUE);
- Id: 19
Option: VAR_ATTMPOWER
Script: |
bonus bMatk,getrandomoptinfo(ROA_VALUE);
- Id: 20
Option: VAR_ITEMDEFPOWER
Script: |
bonus bDef,getrandomoptinfo(ROA_VALUE);
- Id: 21
Option: VAR_MDEFPOWER
Script: |
bonus bMdef,getrandomoptinfo(ROA_VALUE);
- Id: 22
Option: VAR_AVOIDSUCCESSVALUE
Script: |
bonus bFlee,getrandomoptinfo(ROA_VALUE);
- Id: 23
Option: VAR_PLUSAVOIDSUCCESSVALUE
Script: |
bonus bFlee2,getrandomoptinfo(ROA_VALUE);
- Id: 24
Option: VAR_CRITICALSUCCESSVALUE
Script: |
bonus bCritical,getrandomoptinfo(ROA_VALUE);
- Id: 25
Option: ATTR_TOLERACE_NOTHING
Script: |
bonus2 bSubEle,Ele_Neutral,getrandomoptinfo(ROA_VALUE);
- Id: 26
Option: ATTR_TOLERACE_WATER
Script: |
bonus2 bSubEle,Ele_Water,getrandomoptinfo(ROA_VALUE);
- Id: 27
Option: ATTR_TOLERACE_GROUND
Script: |
bonus2 bSubEle,Ele_Earth,getrandomoptinfo(ROA_VALUE);
- Id: 28
Option: ATTR_TOLERACE_FIRE
Script: |
bonus2 bSubEle,Ele_Fire,getrandomoptinfo(ROA_VALUE);
- Id: 29
Option: ATTR_TOLERACE_WIND
Script: |
bonus2 bSubEle,Ele_Wind,getrandomoptinfo(ROA_VALUE);
- Id: 30
Option: ATTR_TOLERACE_POISON
Script: |
bonus2 bSubEle,Ele_Poison,getrandomoptinfo(ROA_VALUE);
- Id: 31
Option: ATTR_TOLERACE_SAINT
Script: |
bonus2 bSubEle,Ele_Holy,getrandomoptinfo(ROA_VALUE);
- Id: 32
Option: ATTR_TOLERACE_DARKNESS
Script: |
bonus2 bSubEle,Ele_Dark,getrandomoptinfo(ROA_VALUE);
- Id: 33
Option: ATTR_TOLERACE_TELEKINESIS
Script: |
bonus2 bSubEle,Ele_Ghost,getrandomoptinfo(ROA_VALUE);
- Id: 34
Option: ATTR_TOLERACE_UNDEAD
Script: |
bonus2 bSubEle,Ele_Undead,getrandomoptinfo(ROA_VALUE);
- Id: 35
Option: ATTR_TOLERACE_ALLBUTNOTHING
Script: |
for(.@i = Ele_Water; .@i < Ele_Undead; ++.@i)
bonus2 bSubEle,.@i,getrandomoptinfo(ROA_VALUE);
- Id: 36
Option: DAMAGE_PROPERTY_NOTHING_USER
Script: |
bonus2 bSubDefEle,Ele_Neutral,getrandomoptinfo(ROA_VALUE);
- Id: 37
Option: DAMAGE_PROPERTY_NOTHING_TARGET
Script: |
bonus2 bAddEle,Ele_Neutral,getrandomoptinfo(ROA_VALUE);
- Id: 38
Option: DAMAGE_PROPERTY_WATER_USER
Script: |
bonus2 bSubDefEle,Ele_Water,getrandomoptinfo(ROA_VALUE);
- Id: 39
Option: DAMAGE_PROPERTY_WATER_TARGET
Script: |
bonus2 bAddEle,Ele_Water,getrandomoptinfo(ROA_VALUE);
- Id: 40
Option: DAMAGE_PROPERTY_GROUND_USER
Script: |
bonus2 bSubDefEle,Ele_Earth,getrandomoptinfo(ROA_VALUE);
- Id: 41
Option: DAMAGE_PROPERTY_GROUND_TARGET
Script: |
bonus2 bAddEle,Ele_Earth,getrandomoptinfo(ROA_VALUE);
- Id: 42
Option: DAMAGE_PROPERTY_FIRE_USER
Script: |
bonus2 bSubDefEle,Ele_Fire,getrandomoptinfo(ROA_VALUE);
- Id: 43
Option: DAMAGE_PROPERTY_FIRE_TARGET
Script: |
bonus2 bAddEle,Ele_Fire,getrandomoptinfo(ROA_VALUE);
- Id: 44
Option: DAMAGE_PROPERTY_WIND_USER
Script: |
bonus2 bSubDefEle,Ele_Wind,getrandomoptinfo(ROA_VALUE);
- Id: 45
Option: DAMAGE_PROPERTY_WIND_TARGET
Script: |
bonus2 bAddEle,Ele_Wind,getrandomoptinfo(ROA_VALUE);
- Id: 46
Option: DAMAGE_PROPERTY_POISON_USER
Script: |
bonus2 bSubDefEle,Ele_Poison,getrandomoptinfo(ROA_VALUE);
- Id: 47
Option: DAMAGE_PROPERTY_POISON_TARGET
Script: |
bonus2 bAddEle,Ele_Poison,getrandomoptinfo(ROA_VALUE);
- Id: 48
Option: DAMAGE_PROPERTY_SAINT_USER
Script: |
bonus2 bSubDefEle,Ele_Holy,getrandomoptinfo(ROA_VALUE);
- Id: 49
Option: DAMAGE_PROPERTY_SAINT_TARGET
Script: |
bonus2 bAddEle,Ele_Holy,getrandomoptinfo(ROA_VALUE);
- Id: 50
Option: DAMAGE_PROPERTY_DARKNESS_USER
Script: |
bonus2 bSubDefEle,Ele_Dark,getrandomoptinfo(ROA_VALUE);
- Id: 51
Option: DAMAGE_PROPERTY_DARKNESS_TARGET
Script: |
bonus2 bAddEle,Ele_Dark,getrandomoptinfo(ROA_VALUE);
- Id: 52
Option: DAMAGE_PROPERTY_TELEKINESIS_USER
Script: |
bonus2 bSubDefEle,Ele_Ghost,getrandomoptinfo(ROA_VALUE);
- Id: 53
Option: DAMAGE_PROPERTY_TELEKINESIS_TARGET
Script: |
bonus2 bAddEle,Ele_Ghost,getrandomoptinfo(ROA_VALUE);
- Id: 54
Option: DAMAGE_PROPERTY_UNDEAD_USER
Script: |
bonus2 bSubDefEle,Ele_Undead,getrandomoptinfo(ROA_VALUE);
- Id: 55
Option: DAMAGE_PROPERTY_UNDEAD_TARGET
Script: |
bonus2 bAddEle,Ele_Undead,getrandomoptinfo(ROA_VALUE);
- Id: 56
Option: MDAMAGE_PROPERTY_NOTHING_USER
Script: |
bonus2 bMagicSubDefEle,Ele_Neutral,getrandomoptinfo(ROA_VALUE);
- Id: 57
Option: MDAMAGE_PROPERTY_NOTHING_TARGET
Script: |
bonus2 bMagicAddEle,Ele_Neutral,getrandomoptinfo(ROA_VALUE);
- Id: 58
Option: MDAMAGE_PROPERTY_WATER_USER
Script: |
bonus2 bMagicSubDefEle,Ele_Water,getrandomoptinfo(ROA_VALUE);
- Id: 59
Option: MDAMAGE_PROPERTY_WATER_TARGET
Script: |
bonus2 bMagicAddEle,Ele_Water,getrandomoptinfo(ROA_VALUE);
- Id: 60
Option: MDAMAGE_PROPERTY_GROUND_USER
Script: |
bonus2 bMagicSubDefEle,Ele_Earth,getrandomoptinfo(ROA_VALUE);
- Id: 61
Option: MDAMAGE_PROPERTY_GROUND_TARGET
Script: |
bonus2 bMagicAddEle,Ele_Earth,getrandomoptinfo(ROA_VALUE);
- Id: 62
Option: MDAMAGE_PROPERTY_FIRE_USER
Script: |
bonus2 bMagicSubDefEle,Ele_Fire,getrandomoptinfo(ROA_VALUE);
- Id: 63
Option: MDAMAGE_PROPERTY_FIRE_TARGET
Script: |
bonus2 bMagicAddEle,Ele_Fire,getrandomoptinfo(ROA_VALUE);
- Id: 64
Option: MDAMAGE_PROPERTY_WIND_USER
Script: |
bonus2 bMagicSubDefEle,Ele_Wind,getrandomoptinfo(ROA_VALUE);
- Id: 65
Option: MDAMAGE_PROPERTY_WIND_TARGET
Script: |
bonus2 bMagicAddEle,Ele_Wind,getrandomoptinfo(ROA_VALUE);
- Id: 66
Option: MDAMAGE_PROPERTY_POISON_USER
Script: |
bonus2 bMagicSubDefEle,Ele_Poison,getrandomoptinfo(ROA_VALUE);
- Id: 67
Option: MDAMAGE_PROPERTY_POISON_TARGET
Script: |
bonus2 bMagicAddEle,Ele_Poison,getrandomoptinfo(ROA_VALUE);
- Id: 68
Option: MDAMAGE_PROPERTY_SAINT_USER
Script: |
bonus2 bMagicSubDefEle,Ele_Holy,getrandomoptinfo(ROA_VALUE);
- Id: 69
Option: MDAMAGE_PROPERTY_SAINT_TARGET
Script: |
bonus2 bMagicAddEle,Ele_Holy,getrandomoptinfo(ROA_VALUE);
- Id: 70
Option: MDAMAGE_PROPERTY_DARKNESS_USER
Script: |
bonus2 bMagicSubDefEle,Ele_Dark,getrandomoptinfo(ROA_VALUE);
- Id: 71
Option: MDAMAGE_PROPERTY_DARKNESS_TARGET
Script: |
bonus2 bMagicAddEle,Ele_Dark,getrandomoptinfo(ROA_VALUE);
- Id: 72
Option: MDAMAGE_PROPERTY_TELEKINESIS_USER
Script: |
bonus2 bMagicSubDefEle,Ele_Ghost,getrandomoptinfo(ROA_VALUE);
- Id: 73
Option: MDAMAGE_PROPERTY_TELEKINESIS_TARGET
Script: |
bonus2 bMagicAddEle,Ele_Ghost,getrandomoptinfo(ROA_VALUE);
- Id: 74
Option: MDAMAGE_PROPERTY_UNDEAD_USER
Script: |
bonus2 bMagicSubDefEle,Ele_Undead,getrandomoptinfo(ROA_VALUE);
- Id: 75
Option: MDAMAGE_PROPERTY_UNDEAD_TARGET
Script: |
bonus2 bMagicAddEle,Ele_Undead,getrandomoptinfo(ROA_VALUE);
- Id: 76
Option: BODY_ATTR_NOTHING
Script: |
bonus bDefEle,Ele_Neutral;
- Id: 77
Option: BODY_ATTR_WATER
Script: |
bonus bDefEle,Ele_Water;
- Id: 78
Option: BODY_ATTR_GROUND
Script: |
bonus bDefEle,Ele_Earth;
- Id: 79
Option: BODY_ATTR_FIRE
Script: |
bonus bDefEle,Ele_Fire;
- Id: 80
Option: BODY_ATTR_WIND
Script: |
bonus bDefEle,Ele_Wind;
- Id: 81
Option: BODY_ATTR_POISON
Script: |
bonus bDefEle,Ele_Poison;
- Id: 82
Option: BODY_ATTR_SAINT
Script: |
bonus bDefEle,Ele_Holy;
- Id: 83
Option: BODY_ATTR_DARKNESS
Script: |
bonus bDefEle,Ele_Dark;
- Id: 84
Option: BODY_ATTR_TELEKINESIS
Script: |
bonus bDefEle,Ele_Ghost;
- Id: 85
Option: BODY_ATTR_UNDEAD
Script: |
bonus bDefEle,Ele_Undead;
- Id: 87
Option: RACE_TOLERACE_NOTHING
Script: |
bonus2 bSubRace,RC_Formless,getrandomoptinfo(ROA_VALUE);
- Id: 88
Option: RACE_TOLERACE_UNDEAD
Script: |
bonus2 bSubRace,RC_Undead,getrandomoptinfo(ROA_VALUE);
- Id: 89
Option: RACE_TOLERACE_ANIMAL
Script: |
bonus2 bSubRace,RC_Brute,getrandomoptinfo(ROA_VALUE);
- Id: 90
Option: RACE_TOLERACE_PLANT
Script: |
bonus2 bSubRace,RC_Plant,getrandomoptinfo(ROA_VALUE);
- Id: 91
Option: RACE_TOLERACE_INSECT
Script: |
bonus2 bSubRace,RC_Insect,getrandomoptinfo(ROA_VALUE);
- Id: 92
Option: RACE_TOLERACE_FISHS
Script: |
bonus2 bSubRace,RC_Fish,getrandomoptinfo(ROA_VALUE);
- Id: 93
Option: RACE_TOLERACE_DEVIL
Script: |
bonus2 bSubRace,RC_Demon,getrandomoptinfo(ROA_VALUE);
- Id: 94
Option: RACE_TOLERACE_HUMAN
Script: |
bonus2 bSubRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE);
- Id: 95
Option: RACE_TOLERACE_ANGEL
Script: |
bonus2 bSubRace,RC_Angel,getrandomoptinfo(ROA_VALUE);
- Id: 96
Option: RACE_TOLERACE_DRAGON
Script: |
bonus2 bSubRace,RC_Dragon,getrandomoptinfo(ROA_VALUE);
- Id: 97
Option: RACE_DAMAGE_NOTHING
Script: |
bonus2 bAddRace,RC_Formless,getrandomoptinfo(ROA_VALUE);
- Id: 98
Option: RACE_DAMAGE_UNDEAD
Script: |
bonus2 bAddRace,RC_Undead,getrandomoptinfo(ROA_VALUE);
- Id: 99
Option: RACE_DAMAGE_ANIMAL
Script: |
bonus2 bAddRace,RC_Brute,getrandomoptinfo(ROA_VALUE);
- Id: 100
Option: RACE_DAMAGE_PLANT
Script: |
bonus2 bAddRace,RC_Plant,getrandomoptinfo(ROA_VALUE);
- Id: 101
Option: RACE_DAMAGE_INSECT
Script: |
bonus2 bAddRace,RC_Insect,getrandomoptinfo(ROA_VALUE);
- Id: 102
Option: RACE_DAMAGE_FISHS
Script: |
bonus2 bAddRace,RC_Fish,getrandomoptinfo(ROA_VALUE);
- Id: 103
Option: RACE_DAMAGE_DEVIL
Script: |
bonus2 bAddRace,RC_Demon,getrandomoptinfo(ROA_VALUE);
- Id: 104
Option: RACE_DAMAGE_HUMAN
Script: |
bonus2 bAddRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE);
- Id: 105
Option: RACE_DAMAGE_ANGEL
Script: |
bonus2 bAddRace,RC_Angel,getrandomoptinfo(ROA_VALUE);
- Id: 106
Option: RACE_DAMAGE_DRAGON
Script: |
bonus2 bAddRace,RC_Dragon,getrandomoptinfo(ROA_VALUE);
- Id: 107
Option: RACE_MDAMAGE_NOTHING
Script: |
bonus2 bMagicAddRace,RC_Formless,getrandomoptinfo(ROA_VALUE);
- Id: 108
Option: RACE_MDAMAGE_UNDEAD
Script: |
bonus2 bMagicAddRace,RC_Undead,getrandomoptinfo(ROA_VALUE);
- Id: 109
Option: RACE_MDAMAGE_ANIMAL
Script: |
bonus2 bMagicAddRace,RC_Brute,getrandomoptinfo(ROA_VALUE);
- Id: 110
Option: RACE_MDAMAGE_PLANT
Script: |
bonus2 bMagicAddRace,RC_Plant,getrandomoptinfo(ROA_VALUE);
- Id: 111
Option: RACE_MDAMAGE_INSECT
Script: |
bonus2 bMagicAddRace,RC_Insect,getrandomoptinfo(ROA_VALUE);
- Id: 112
Option: RACE_MDAMAGE_FISHS
Script: |
bonus2 bMagicAddRace,RC_Fish,getrandomoptinfo(ROA_VALUE);
- Id: 113
Option: RACE_MDAMAGE_DEVIL
Script: |
bonus2 bMagicAddRace,RC_Demon,getrandomoptinfo(ROA_VALUE);
- Id: 114
Option: RACE_MDAMAGE_HUMAN
Script: |
bonus2 bMagicAddRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE);
- Id: 115
Option: RACE_MDAMAGE_ANGEL
Script: |
bonus2 bMagicAddRace,RC_Angel,getrandomoptinfo(ROA_VALUE);
- Id: 116
Option: RACE_MDAMAGE_DRAGON
Script: |
bonus2 bMagicAddRace,RC_Dragon,getrandomoptinfo(ROA_VALUE);
- Id: 117
Option: RACE_CRI_PERCENT_NOTHING
Script: |
bonus2 bCriticalAddRace,RC_Formless,getrandomoptinfo(ROA_VALUE)/10;
- Id: 118
Option: RACE_CRI_PERCENT_UNDEAD
Script: |
bonus2 bCriticalAddRace,RC_Undead,getrandomoptinfo(ROA_VALUE)/10;
- Id: 119
Option: RACE_CRI_PERCENT_ANIMAL
Script: |
bonus2 bCriticalAddRace,RC_Brute,getrandomoptinfo(ROA_VALUE)/10;
- Id: 120
Option: RACE_CRI_PERCENT_PLANT
Script: |
bonus2 bCriticalAddRace,RC_Plant,getrandomoptinfo(ROA_VALUE)/10;
- Id: 121
Option: RACE_CRI_PERCENT_INSECT
Script: |
bonus2 bCriticalAddRace,RC_Insect,getrandomoptinfo(ROA_VALUE)/10;
- Id: 122
Option: RACE_CRI_PERCENT_FISHS
Script: |
bonus2 bCriticalAddRace,RC_Fish,getrandomoptinfo(ROA_VALUE)/10;
- Id: 123
Option: RACE_CRI_PERCENT_DEVIL
Script: |
bonus2 bCriticalAddRace,RC_Demon,getrandomoptinfo(ROA_VALUE)/10;
- Id: 124
Option: RACE_CRI_PERCENT_HUMAN
Script: |
bonus2 bCriticalAddRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE)/10;
- Id: 125
Option: RACE_CRI_PERCENT_ANGEL
Script: |
bonus2 bCriticalAddRace,RC_Angel,getrandomoptinfo(ROA_VALUE)/10;
- Id: 126
Option: RACE_CRI_PERCENT_DRAGON
Script: |
bonus2 bCriticalAddRace,RC_Dragon,getrandomoptinfo(ROA_VALUE)/10;
- Id: 127
Option: RACE_IGNORE_DEF_PERCENT_NOTHING
Script: |
bonus2 bIgnoreDefRaceRate,RC_Formless,getrandomoptinfo(ROA_VALUE);
- Id: 128
Option: RACE_IGNORE_DEF_PERCENT_UNDEAD
Script: |
bonus2 bIgnoreDefRaceRate,RC_Undead,getrandomoptinfo(ROA_VALUE);
- Id: 129
Option: RACE_IGNORE_DEF_PERCENT_ANIMAL
Script: |
bonus2 bIgnoreDefRaceRate,RC_Brute,getrandomoptinfo(ROA_VALUE);
- Id: 130
Option: RACE_IGNORE_DEF_PERCENT_PLANT
Script: |
bonus2 bIgnoreDefRaceRate,RC_Plant,getrandomoptinfo(ROA_VALUE);
- Id: 131
Option: RACE_IGNORE_DEF_PERCENT_INSECT
Script: |
bonus2 bIgnoreDefRaceRate,RC_Insect,getrandomoptinfo(ROA_VALUE);
- Id: 132
Option: RACE_IGNORE_DEF_PERCENT_FISHS
Script: |
bonus2 bIgnoreDefRaceRate,RC_Fish,getrandomoptinfo(ROA_VALUE);
- Id: 133
Option: RACE_IGNORE_DEF_PERCENT_DEVIL
Script: |
bonus2 bIgnoreDefRaceRate,RC_Demon,getrandomoptinfo(ROA_VALUE);
- Id: 134
Option: RACE_IGNORE_DEF_PERCENT_HUMAN
Script: |
bonus2 bIgnoreDefRaceRate,RC_DemiHuman,getrandomoptinfo(ROA_VALUE);
- Id: 135
Option: RACE_IGNORE_DEF_PERCENT_ANGEL
Script: |
bonus2 bIgnoreDefRaceRate,RC_Angel,getrandomoptinfo(ROA_VALUE);
- Id: 136
Option: RACE_IGNORE_DEF_PERCENT_DRAGON
Script: |
bonus2 bIgnoreDefRaceRate,RC_Dragon,getrandomoptinfo(ROA_VALUE);
- Id: 137
Option: RACE_IGNORE_MDEF_PERCENT_NOTHING
Script: |
bonus2 bIgnoreMdefRaceRate,RC_Formless,getrandomoptinfo(ROA_VALUE);
- Id: 138
Option: RACE_IGNORE_MDEF_PERCENT_UNDEAD
Script: |
bonus2 bIgnoreMdefRaceRate,RC_Undead,getrandomoptinfo(ROA_VALUE);
- Id: 139
Option: RACE_IGNORE_MDEF_PERCENT_ANIMAL
Script: |
bonus2 bIgnoreMdefRaceRate,RC_Brute,getrandomoptinfo(ROA_VALUE);
- Id: 140
Option: RACE_IGNORE_MDEF_PERCENT_PLANT
Script: |
bonus2 bIgnoreMdefRaceRate,RC_Plant,getrandomoptinfo(ROA_VALUE);
- Id: 141
Option: RACE_IGNORE_MDEF_PERCENT_INSECT
Script: |
bonus2 bIgnoreMdefRaceRate,RC_Insect,getrandomoptinfo(ROA_VALUE);
- Id: 142
Option: RACE_IGNORE_MDEF_PERCENT_FISHS
Script: |
bonus2 bIgnoreMdefRaceRate,RC_Fish,getrandomoptinfo(ROA_VALUE);
- Id: 143
Option: RACE_IGNORE_MDEF_PERCENT_DEVIL
Script: |
bonus2 bIgnoreMdefRaceRate,RC_Demon,getrandomoptinfo(ROA_VALUE);
- Id: 144
Option: RACE_IGNORE_MDEF_PERCENT_HUMAN
Script: |
bonus2 bIgnoreMdefRaceRate,RC_DemiHuman,getrandomoptinfo(ROA_VALUE);
- Id: 145
Option: RACE_IGNORE_MDEF_PERCENT_ANGEL
Script: |
bonus2 bIgnoreMdefRaceRate,RC_Angel,getrandomoptinfo(ROA_VALUE);
- Id: 146
Option: RACE_IGNORE_MDEF_PERCENT_DRAGON
Script: |
bonus2 bIgnoreMdefRaceRate,RC_Dragon,getrandomoptinfo(ROA_VALUE);
- Id: 147
Option: CLASS_DAMAGE_NORMAL_TARGET
Script: |
bonus2 bAddClass,Class_Normal,getrandomoptinfo(ROA_VALUE);
- Id: 148
Option: CLASS_DAMAGE_BOSS_TARGET
Script: |
bonus2 bAddClass,Class_Boss,getrandomoptinfo(ROA_VALUE);
- Id: 149
Option: CLASS_DAMAGE_NORMAL_USER
Script: |
bonus2 bSubClass,Class_Normal,getrandomoptinfo(ROA_VALUE);
- Id: 150
Option: CLASS_DAMAGE_BOSS_USER
Script: |
bonus2 bSubClass,Class_Boss,getrandomoptinfo(ROA_VALUE);
- Id: 151
Option: CLASS_MDAMAGE_NORMAL
Script: |
bonus2 bMagicAddClass,Class_Normal,getrandomoptinfo(ROA_VALUE);
- Id: 152
Option: CLASS_MDAMAGE_BOSS
Script: |
bonus2 bMagicAddClass,Class_Boss,getrandomoptinfo(ROA_VALUE);
- Id: 153
Option: CLASS_IGNORE_DEF_PERCENT_NORMAL
Script: |
bonus2 bIgnoreDefClassRate,Class_Normal,getrandomoptinfo(ROA_VALUE);
- Id: 154
Option: CLASS_IGNORE_DEF_PERCENT_BOSS
Script: |
bonus2 bIgnoreDefClassRate,Class_Boss,getrandomoptinfo(ROA_VALUE);
- Id: 155
Option: CLASS_IGNORE_MDEF_PERCENT_NORMAL
Script: |
bonus2 bIgnoreMdefClassRate,Class_Normal,getrandomoptinfo(ROA_VALUE);
- Id: 156
Option: CLASS_IGNORE_MDEF_PERCENT_BOSS
Script: |
bonus2 bIgnoreMdefClassRate,Class_Boss,getrandomoptinfo(ROA_VALUE);
- Id: 157
Option: DAMAGE_SIZE_SMALL_TARGET
Script: |
bonus2 bAddSize,Size_Small,getrandomoptinfo(ROA_VALUE);
- Id: 158
Option: DAMAGE_SIZE_MIDIUM_TARGET
Script: |
bonus2 bAddSize,Size_Medium,getrandomoptinfo(ROA_VALUE);
- Id: 159
Option: DAMAGE_SIZE_LARGE_TARGET
Script: |
bonus2 bAddSize,Size_Large,getrandomoptinfo(ROA_VALUE);
- Id: 160
Option: DAMAGE_SIZE_SMALL_USER
Script: |
bonus2 bSubSize,Size_Small,getrandomoptinfo(ROA_VALUE);
- Id: 161
Option: DAMAGE_SIZE_MIDIUM_USER
Script: |
bonus2 bSubSize,Size_Medium,getrandomoptinfo(ROA_VALUE);
- Id: 162
Option: DAMAGE_SIZE_LARGE_USER
Script: |
bonus2 bSubSize,Size_Large,getrandomoptinfo(ROA_VALUE);
- Id: 163
Option: DAMAGE_SIZE_PERFECT
Script: |
bonus bNoSizeFix,1;
- Id: 164
Option: DAMAGE_CRI_TARGET
Script: |
bonus bCritAtkRate,getrandomoptinfo(ROA_VALUE);
- Id: 165
Option: DAMAGE_CRI_USER
Script: |
bonus bCritDefRate,getrandomoptinfo(ROA_VALUE);
- Id: 166
Option: RANGE_ATTACK_DAMAGE_TARGET
Script: |
bonus bLongAtkRate,getrandomoptinfo(ROA_VALUE);
- Id: 167
Option: RANGE_ATTACK_DAMAGE_USER
Script: |
bonus bLongAtkDef,getrandomoptinfo(ROA_VALUE);
- Id: 168
Option: HEAL_VALUE
Script: |
bonus bHealPower,getrandomoptinfo(ROA_VALUE);
- Id: 169
Option: HEAL_MODIFY_PERCENT
Script: |
bonus bHealPower2,getrandomoptinfo(ROA_VALUE);
- Id: 170
Option: DEC_SPELL_CAST_TIME
Script: |
bonus bVariableCastrate,-(getrandomoptinfo(ROA_VALUE));
- Id: 171
Option: DEC_SPELL_DELAY_TIME
Script: |
bonus bDelayrate,-(getrandomoptinfo(ROA_VALUE));
- Id: 172
Option: DEC_SP_CONSUMPTION
Script: |
bonus bUseSPrate,-(getrandomoptinfo(ROA_VALUE));
- Id: 175
Option: WEAPON_ATTR_NOTHING
Script: |
bonus bAtkEle,Ele_Neutral;
- Id: 176
Option: WEAPON_ATTR_WATER
Script: |
bonus bAtkEle,Ele_Water;
- Id: 177
Option: WEAPON_ATTR_GROUND
Script: |
bonus bAtkEle,Ele_Earth;
- Id: 178
Option: WEAPON_ATTR_FIRE
Script: |
bonus bAtkEle,Ele_Fire;
- Id: 179
Option: WEAPON_ATTR_WIND
Script: |
bonus bAtkEle,Ele_Wind;
- Id: 180
Option: WEAPON_ATTR_POISON
Script: |
bonus bAtkEle,Ele_Poison;
- Id: 181
Option: WEAPON_ATTR_SAINT
Script: |
bonus bAtkEle,Ele_Holy;
- Id: 182
Option: WEAPON_ATTR_DARKNESS
Script: |
bonus bAtkEle,Ele_Dark;
- Id: 183
Option: WEAPON_ATTR_TELEKINESIS
Script: |
bonus bAtkEle,Ele_Ghost;
- Id: 184
Option: WEAPON_ATTR_UNDEAD
Script: |
bonus bAtkEle,Ele_Undead;
- Id: 185
Option: WEAPON_INDESTRUCTIBLE
Script: |
bonus bUnbreakableWeapon,1;
- Id: 186
Option: BODY_INDESTRUCTIBLE
Script: |
bonus bUnbreakableArmor,1;
- Id: 187
Option: MDAMAGE_SIZE_SMALL_TARGET
Script: |
bonus2 bMagicAddSize,Size_Small,getrandomoptinfo(ROA_VALUE);
- Id: 188
Option: MDAMAGE_SIZE_MIDIUM_TARGET
Script: |
bonus2 bMagicAddSize,Size_Medium,getrandomoptinfo(ROA_VALUE);
- Id: 189
Option: MDAMAGE_SIZE_LARGE_TARGET
Script: |
bonus2 bMagicAddSize,Size_Large,getrandomoptinfo(ROA_VALUE);
- Id: 190
Option: MDAMAGE_SIZE_SMALL_USER
Script: |
bonus2 bMagicSubSize,Size_Small,getrandomoptinfo(ROA_VALUE);
- Id: 191
Option: MDAMAGE_SIZE_MIDIUM_USER
Script: |
bonus2 bMagicSubSize,Size_Medium,getrandomoptinfo(ROA_VALUE);
- Id: 192
Option: MDAMAGE_SIZE_LARGE_USER
Script: |
bonus2 bMagicSubSize,Size_Large,getrandomoptinfo(ROA_VALUE);
- Id: 193
Option: ATTR_TOLERACE_ALL
Script: |
bonus2 bSubEle,Ele_All,getrandomoptinfo(ROA_VALUE);
- Id: 194
Option: RACE_WEAPON_TOLERACE_NOTHING
Script: |
bonus3 bSubRace,RC_Formless,getrandomoptinfo(ROA_VALUE),BF_WEAPON;
- Id: 195
Option: RACE_WEAPON_TOLERACE_UNDEAD
Script: |
bonus3 bSubRace,RC_Undead,getrandomoptinfo(ROA_VALUE),BF_WEAPON;
- Id: 196
Option: RACE_WEAPON_TOLERACE_ANIMAL
Script: |
bonus3 bSubRace,RC_Brute,getrandomoptinfo(ROA_VALUE),BF_WEAPON;
- Id: 197
Option: RACE_WEAPON_TOLERACE_PLANT
Script: |
bonus3 bSubRace,RC_Plant,getrandomoptinfo(ROA_VALUE),BF_WEAPON;
- Id: 198
Option: RACE_WEAPON_TOLERACE_INSECT
Script: |
bonus3 bSubRace,RC_Insect,getrandomoptinfo(ROA_VALUE),BF_WEAPON;
- Id: 199
Option: RACE_WEAPON_TOLERACE_FISHS
Script: |
bonus3 bSubRace,RC_Fish,getrandomoptinfo(ROA_VALUE),BF_WEAPON;
- Id: 200
Option: RACE_WEAPON_TOLERACE_DEVIL
Script: |
bonus3 bSubRace,RC_Demon,getrandomoptinfo(ROA_VALUE),BF_WEAPON;
- Id: 201
Option: RACE_WEAPON_TOLERACE_HUMAN
Script: |
bonus3 bSubRace,RC_DemiHuman,getrandomoptinfo(ROA_VALUE),BF_WEAPON;
- Id: 202
Option: RACE_WEAPON_TOLERACE_ANGEL
Script: |
bonus3 bSubRace,RC_Angel,getrandomoptinfo(ROA_VALUE),BF_WEAPON;
- Id: 203
Option: RACE_WEAPON_TOLERACE_DRAGON
Script: |
bonus3 bSubRace,RC_Dragon,getrandomoptinfo(ROA_VALUE),BF_WEAPON;
- Id: 206
Option: RACE_TOLERACE_PLAYER_HUMAN
Script: |
bonus2 bSubRace,RC_Player_Human,getrandomoptinfo(ROA_VALUE);
- Id: 207
Option: RACE_TOLERACE_PLAYER_DORAM
Script: |
bonus2 bSubRace,RC_Player_Doram,getrandomoptinfo(ROA_VALUE);
- Id: 208
Option: RACE_DAMAGE_PLAYER_HUMAN
Script: |
bonus2 bAddRace,RC_Player_Human,getrandomoptinfo(ROA_VALUE);
- Id: 209
Option: RACE_DAMAGE_PLAYER_DORAM
Script: |
bonus2 bAddRace,RC_Player_Doram,getrandomoptinfo(ROA_VALUE);
- Id: 210
Option: RACE_MDAMAGE_PLAYER_HUMAN
Script: |
bonus2 bMagicAddRace,RC_Player_Human,getrandomoptinfo(ROA_VALUE);
- Id: 211
Option: RACE_MDAMAGE_PLAYER_DORAM
Script: |
bonus2 bMagicAddRace,RC_Player_Doram,getrandomoptinfo(ROA_VALUE);
- Id: 212
Option: RACE_CRI_PERCENT_PLAYER_HUMAN
Script: |
bonus2 bCriticalAddRace,RC_Player_Human,getrandomoptinfo(ROA_VALUE);
- Id: 213
Option: RACE_CRI_PERCENT_PLAYER_DORAM
Script: |
bonus2 bCriticalAddRace,RC_Player_Doram,getrandomoptinfo(ROA_VALUE);
- Id: 214
Option: RACE_IGNORE_DEF_PERCENT_PLAYER_HUMAN
Script: |
bonus2 bIgnoreDefRaceRate,RC_Player_Human,getrandomoptinfo(ROA_VALUE);
- Id: 215
Option: RACE_IGNORE_DEF_PERCENT_PLAYER_DORAM
Script: |
bonus2 bIgnoreDefRaceRate,RC_Player_Doram,getrandomoptinfo(ROA_VALUE);
- Id: 216
Option: RACE_IGNORE_MDEF_PERCENT_PLAYER_HUMAN
Script: |
bonus2 bIgnoreMdefRaceRate,RC_Player_Human,getrandomoptinfo(ROA_VALUE);
- Id: 217
Option: RACE_IGNORE_MDEF_PERCENT_PLAYER_DORAM
Script: |
bonus2 bIgnoreMdefRaceRate,RC_Player_Doram,getrandomoptinfo(ROA_VALUE);
- Id: 219
Option: MELEE_ATTACK_DAMAGE_TARGET
Script: |
bonus bShortAtkRate,getrandomoptinfo(ROA_VALUE);
- Id: 220
Option: MELEE_ATTACK_DAMAGE_USER
Script: |
bonus bNearAtkDef,getrandomoptinfo(ROA_VALUE);

View File

@ -1,10 +0,0 @@
// <randopt_groupid>,<rate>,<randopt_id1>,<randopt_value1>,<randopt_param1>{,<randopt_id2>,<randopt_value2>,<randopt_param2>,<randopt_id3>,<randopt_value3>,<randopt_param3>,<randopt_id4>,<randopt_value4>,<randopt_param4>,<randopt_id5>,<randopt_value5>,<randopt_param5>}
// Crimson Weapon
RDMOPTG_Crimson_Weapon,1,RDMOPT_WEAPON_ATTR_NOTHING,0,0
RDMOPTG_Crimson_Weapon,1,RDMOPT_WEAPON_ATTR_WATER,0,0
RDMOPTG_Crimson_Weapon,1,RDMOPT_WEAPON_ATTR_GROUND,0,0
RDMOPTG_Crimson_Weapon,1,RDMOPT_WEAPON_ATTR_FIRE,0,0
RDMOPTG_Crimson_Weapon,1,RDMOPT_WEAPON_ATTR_WIND,0,0
RDMOPTG_Crimson_Weapon,1,RDMOPT_WEAPON_ATTR_SAINT,0,0
RDMOPTG_Crimson_Weapon,1,RDMOPT_WEAPON_ATTR_DARKNESS,0,0

File diff suppressed because it is too large Load Diff

View File

@ -16,108 +16,108 @@
// <flag> : 1 - The item is protected from steal.
// 2 - As MVP Reward
1063,1102,100,RDMOPTG_None // LUNATIC
2770,1102,500,RDMOPTG_None // C2_LUNATIC
2771,1102,500,RDMOPTG_None // C3_LUNATIC
2072,1839,50,RDMOPTG_Crimson_Weapon // JAGUAR
1584,21015,50,RDMOPTG_Crimson_Weapon // TAMRUAN
2639,21015,250,RDMOPTG_Crimson_Weapon // C4_TAMRUAN
1154,13454,50,RDMOPTG_Crimson_Weapon // PASANA
1154,28705,50,RDMOPTG_Crimson_Weapon // PASANA
2719,13454,250,RDMOPTG_Crimson_Weapon // C1_PASANA
2719,28705,250,RDMOPTG_Crimson_Weapon // C1_PASANA
1117,28604,50,RDMOPTG_Crimson_Weapon // EVIL_DRUID
1517,16040,50,RDMOPTG_Crimson_Weapon // LI_ME_MANG_RYANG
2071,28007,50,RDMOPTG_Crimson_Weapon // HEADLESS_MULE
2778,16040,250,RDMOPTG_Crimson_Weapon // C5_LI_ME_MANG_RYANG
2838,28604,50,RDMOPTG_Crimson_Weapon // C5_EVIL_DRUID
1613,13127,50,RDMOPTG_None // METALING
1386,28705,50,RDMOPTG_Crimson_Weapon // SLEEPER
2655,28705,250,RDMOPTG_Crimson_Weapon // C5_SLEEPER
2656,28705,250,RDMOPTG_Crimson_Weapon // C1_SLEEPER
2755,13127,250,RDMOPTG_None // C2_METALING
2756,13127,250,RDMOPTG_None // C3_METALING
1631,1839,50,RDMOPTG_Crimson_Weapon // CHUNG_E_
1215,1443,50,RDMOPTG_Crimson_Weapon // STEM_WORM
2641,1443,250,RDMOPTG_Crimson_Weapon // C1_STEM_WORM
1404,1939,50,RDMOPTG_Crimson_Weapon // MIYABI_NINGYO
1628,13127,50,RDMOPTG_None // MOLE
1619,28705,50,RDMOPTG_Crimson_Weapon // PORCELLIO
2700,28705,250,RDMOPTG_Crimson_Weapon // C2_PORCELLIO
2745,13127,250,RDMOPTG_None // C2_MOLE
2746,1939,250,RDMOPTG_Crimson_Weapon // C3_MIYABI_NINGYO
1102,1680,50,RDMOPTG_None // BATHORY
1155,16040,50,RDMOPTG_Crimson_Weapon // PETIT
2714,16040,250,RDMOPTG_Crimson_Weapon // C1_PETIT
2715,16040,250,RDMOPTG_Crimson_Weapon // C2_PETIT
2885,1680,250,RDMOPTG_None // C4_BATHORY
2199,28705,50,RDMOPTG_Crimson_Weapon // SIORAVA
1143,16040,50,RDMOPTG_Crimson_Weapon // MARIONETTE
1413,1995,50,RDMOPTG_Crimson_Weapon // WILD_GINSENG
2761,16040,250,RDMOPTG_Crimson_Weapon // C3_MARIONETTE
1320,1498,50,RDMOPTG_Crimson_Weapon // OWL_DUKE
1320,2025,50,RDMOPTG_None // OWL_DUKE
1316,16040,50,RDMOPTG_Crimson_Weapon // SOLIDER
2647,16040,250,RDMOPTG_Crimson_Weapon // C2_SOLIDER
2721,1498,250,RDMOPTG_Crimson_Weapon // C3_OWL_DUKE
2721,2025,250,RDMOPTG_None // C3_OWL_DUKE
1408,1839,50,RDMOPTG_Crimson_Weapon // BLOOD_BUTTERFLY
2883,1839,250,RDMOPTG_Crimson_Weapon // C1_BLOOD_BUTTERFLY
1257,28007,50,RDMOPTG_Crimson_Weapon // INJUSTICE
2792,28007,250,RDMOPTG_Crimson_Weapon // C4_INJUSTICE
1302,21015,50,RDMOPTG_Crimson_Weapon // DARK_ILLUSION
1416,1939,50,RDMOPTG_Crimson_Weapon // WICKED_NYMPH
1416,1995,50,RDMOPTG_Crimson_Weapon // WICKED_NYMPH
2617,1939,250,RDMOPTG_Crimson_Weapon // C5_WICKED_NYMPH
2617,1995,250,RDMOPTG_Crimson_Weapon // C5_WICKED_NYMPH
1405,13327,50,RDMOPTG_Crimson_Weapon // TENGU
1030,1498,50,RDMOPTG_Crimson_Weapon // ANACONDAQ
2904,1498,250,RDMOPTG_Crimson_Weapon // C4_ANACONDAQ
1205,13454,50,RDMOPTG_Crimson_Weapon // EXECUTIONER
1135,28106,50,RDMOPTG_Crimson_Weapon // KOBOLD_3
1106,28705,50,RDMOPTG_Crimson_Weapon // DESERT_WOLF
1259,1498,250,RDMOPTG_Crimson_Weapon // GRYPHON
1310,28106,50,RDMOPTG_Crimson_Weapon // MAJORUROS
2767,28106,250,RDMOPTG_Crimson_Weapon // C4_MAJORUROS
1736,1839,50,RDMOPTG_Crimson_Weapon // ALIOT
1296,16040,50,RDMOPTG_Crimson_Weapon // KOBOLD_LEADER
1204,28705,50,RDMOPTG_Crimson_Weapon // TIRFING
1204,13454,50,RDMOPTG_Crimson_Weapon // TIRFING
1993,1443,50,RDMOPTG_Crimson_Weapon // NAGA
1390,1939,50,RDMOPTG_Crimson_Weapon // VIOLY
2621,1939,250,RDMOPTG_Crimson_Weapon // C5_VIOLY
2622,1939,250,RDMOPTG_Crimson_Weapon // C1_VIOLY
2623,1939,250,RDMOPTG_Crimson_Weapon // C2_VIOLY
1295,18130,50,RDMOPTG_None // OWL_BARON
1303,2025,50,RDMOPTG_None // GIANT_HONET
2821,2025,250,RDMOPTG_None // C3_GIANT_HONET
1702,21015,50,RDMOPTG_Crimson_Weapon // RETRIBUTION
2353,28106,50,RDMOPTG_Crimson_Weapon // N_MINOROUS
2684,21015,250,RDMOPTG_Crimson_Weapon // C4_RETRIBUTION
2685,21015,250,RDMOPTG_Crimson_Weapon // C5_RETRIBUTION
2686,21015,250,RDMOPTG_Crimson_Weapon // C1_RETRIBUTION
1219,21015,50,RDMOPTG_Crimson_Weapon // KNIGHT_OF_ABYSS
1703,1939,50,RDMOPTG_Crimson_Weapon // SOLACE
2650,1939,250,RDMOPTG_Crimson_Weapon // C5_SOLACE
2041,28705,50,RDMOPTG_Crimson_Weapon // MYSTELTAINN
2041,13454,50,RDMOPTG_Crimson_Weapon // MYSTELTAINN
2041,21015,50,RDMOPTG_Crimson_Weapon // MYSTELTAINN
1830,18130,50,RDMOPTG_None // BOW_GUARDIAN
1653,28705,50,RDMOPTG_Crimson_Weapon // WHIKEBAIN
1655,1839,50,RDMOPTG_Crimson_Weapon // EREND
1655,16040,50,RDMOPTG_Crimson_Weapon // EREND
1657,1680,50,RDMOPTG_None // RAWREL
1829,21015,50,RDMOPTG_Crimson_Weapon // SWORD_GUARDIAN
2692,1680,250,RDMOPTG_None // C3_RAWREL
1654,13454,50,RDMOPTG_Crimson_Weapon // ARMAIA
1654,28106,50,RDMOPTG_Crimson_Weapon // ARMAIA
1656,1939,50,RDMOPTG_Crimson_Weapon // KAVAC
1656,18130,50,RDMOPTG_None // KAVAC
1652,13454,50,RDMOPTG_Crimson_Weapon // YGNIZEM
1652,21015,50,RDMOPTG_Crimson_Weapon // YGNIZEM
1290,28705,50,RDMOPTG_Crimson_Weapon // SKELETON_GENERAL
2658,28705,250,RDMOPTG_Crimson_Weapon // C3_SKELETON_GENERAL
2659,28705,250,RDMOPTG_Crimson_Weapon // C4_SKELETON_GENERAL
1658,21015,500,RDMOPTG_Crimson_Weapon // B_YGNIZEM
1301,16040,50,RDMOPTG_Crimson_Weapon // AM_MUT
2362,28604,50,RDMOPTG_Crimson_Weapon // N_AMON_RA
1063,1102,100,None // LUNATIC
2770,1102,500,None // C2_LUNATIC
2771,1102,500,None // C3_LUNATIC
2072,1839,50,Group_5 // JAGUAR
1584,21015,50,Group_5 // TAMRUAN
2639,21015,250,Group_5 // C4_TAMRUAN
1154,13454,50,Group_5 // PASANA
1154,28705,50,Group_5 // PASANA
2719,13454,250,Group_5 // C1_PASANA
2719,28705,250,Group_5 // C1_PASANA
1117,28604,50,Group_5 // EVIL_DRUID
1517,16040,50,Group_5 // LI_ME_MANG_RYANG
2071,28007,50,Group_5 // HEADLESS_MULE
2778,16040,250,Group_5 // C5_LI_ME_MANG_RYANG
2838,28604,50,Group_5 // C5_EVIL_DRUID
1613,13127,50,None // METALING
1386,28705,50,Group_5 // SLEEPER
2655,28705,250,Group_5 // C5_SLEEPER
2656,28705,250,Group_5 // C1_SLEEPER
2755,13127,250,None // C2_METALING
2756,13127,250,None // C3_METALING
1631,1839,50,Group_5 // CHUNG_E_
1215,1443,50,Group_5 // STEM_WORM
2641,1443,250,Group_5 // C1_STEM_WORM
1404,1939,50,Group_5 // MIYABI_NINGYO
1628,13127,50,None // MOLE
1619,28705,50,Group_5 // PORCELLIO
2700,28705,250,Group_5 // C2_PORCELLIO
2745,13127,250,None // C2_MOLE
2746,1939,250,Group_5 // C3_MIYABI_NINGYO
1102,1680,50,None // BATHORY
1155,16040,50,Group_5 // PETIT
2714,16040,250,Group_5 // C1_PETIT
2715,16040,250,Group_5 // C2_PETIT
2885,1680,250,None // C4_BATHORY
2199,28705,50,Group_5 // SIORAVA
1143,16040,50,Group_5 // MARIONETTE
1413,1995,50,Group_5 // WILD_GINSENG
2761,16040,250,Group_5 // C3_MARIONETTE
1320,1498,50,Group_5 // OWL_DUKE
1320,2025,50,None // OWL_DUKE
1316,16040,50,Group_5 // SOLIDER
2647,16040,250,Group_5 // C2_SOLIDER
2721,1498,250,Group_5 // C3_OWL_DUKE
2721,2025,250,None // C3_OWL_DUKE
1408,1839,50,Group_5 // BLOOD_BUTTERFLY
2883,1839,250,Group_5 // C1_BLOOD_BUTTERFLY
1257,28007,50,Group_5 // INJUSTICE
2792,28007,250,Group_5 // C4_INJUSTICE
1302,21015,50,Group_5 // DARK_ILLUSION
1416,1939,50,Group_5 // WICKED_NYMPH
1416,1995,50,Group_5 // WICKED_NYMPH
2617,1939,250,Group_5 // C5_WICKED_NYMPH
2617,1995,250,Group_5 // C5_WICKED_NYMPH
1405,13327,50,Group_5 // TENGU
1030,1498,50,Group_5 // ANACONDAQ
2904,1498,250,Group_5 // C4_ANACONDAQ
1205,13454,50,Group_5 // EXECUTIONER
1135,28106,50,Group_5 // KOBOLD_3
1106,28705,50,Group_5 // DESERT_WOLF
1259,1498,250,Group_5 // GRYPHON
1310,28106,50,Group_5 // MAJORUROS
2767,28106,250,Group_5 // C4_MAJORUROS
1736,1839,50,Group_5 // ALIOT
1296,16040,50,Group_5 // KOBOLD_LEADER
1204,28705,50,Group_5 // TIRFING
1204,13454,50,Group_5 // TIRFING
1993,1443,50,Group_5 // NAGA
1390,1939,50,Group_5 // VIOLY
2621,1939,250,Group_5 // C5_VIOLY
2622,1939,250,Group_5 // C1_VIOLY
2623,1939,250,Group_5 // C2_VIOLY
1295,18130,50,None // OWL_BARON
1303,2025,50,None // GIANT_HONET
2821,2025,250,None // C3_GIANT_HONET
1702,21015,50,Group_5 // RETRIBUTION
2353,28106,50,Group_5 // N_MINOROUS
2684,21015,250,Group_5 // C4_RETRIBUTION
2685,21015,250,Group_5 // C5_RETRIBUTION
2686,21015,250,Group_5 // C1_RETRIBUTION
1219,21015,50,Group_5 // KNIGHT_OF_ABYSS
1703,1939,50,Group_5 // SOLACE
2650,1939,250,Group_5 // C5_SOLACE
2041,28705,50,Group_5 // MYSTELTAINN
2041,13454,50,Group_5 // MYSTELTAINN
2041,21015,50,Group_5 // MYSTELTAINN
1830,18130,50,None // BOW_GUARDIAN
1653,28705,50,Group_5 // WHIKEBAIN
1655,1839,50,Group_5 // EREND
1655,16040,50,Group_5 // EREND
1657,1680,50,None // RAWREL
1829,21015,50,Group_5 // SWORD_GUARDIAN
2692,1680,250,None // C3_RAWREL
1654,13454,50,Group_5 // ARMAIA
1654,28106,50,Group_5 // ARMAIA
1656,1939,50,Group_5 // KAVAC
1656,18130,50,None // KAVAC
1652,13454,50,Group_5 // YGNIZEM
1652,21015,50,Group_5 // YGNIZEM
1290,28705,50,Group_5 // SKELETON_GENERAL
2658,28705,250,Group_5 // C3_SKELETON_GENERAL
2659,28705,250,Group_5 // C4_SKELETON_GENERAL
1658,21015,500,Group_5 // B_YGNIZEM
1301,16040,50,Group_5 // AM_MUT
2362,28604,50,Group_5 // N_AMON_RA

View File

@ -0,0 +1,11 @@
###########################################################################
# Item Random Option Database
###########################################################################
#
# Item Random Option Settings
#
###########################################################################
# - Id Item Random Option ID matching the ID defined in enumvar.lub in the client.
# Option Item Random Option constant.
# Script Bonus script used for option.
###########################################################################

View File

@ -0,0 +1,25 @@
###########################################################################
# Item Random Option Group Database
###########################################################################
#
# Item Random Option Group Settings
#
###########################################################################
# - Id Item Random Option Group ID.
# Group Item Random Option Group constant.
# Slots: Slot in which an Item Random Option is guaranteed to be applied. Max of MAX_ITEM_RDM_OPT.
# - Slot Slot number.
# Options: List of possible Item Random Options for slot.
# - Option Item Random Option constant.
# MinValue Minimum value. (Default: 0)
# MaxValue Maximum value. (Default: 0)
# Param Parameter value. (Default: 0)
# Chance Chance applied specifically to this Item Random Option (1 = 0.01%, 10000 = 100%). (Default: 0)
# MaxRandom Maximum amount of random options applied. These options are not guaranteed to be applied. Max of (MAX_ITEM_RDM_OPT - Total 'Slots'). (Default: 0)
# Random: List of possible Item Random Options for remaining slots. (Optional)
# - Option Item Random Option constant.
# MinValue Minimum value. (Default: 0)
# MaxValue Maximum value. (Default: 0)
# Param Parameter value. (Default: 0)
# Chance Chance applied specifically to this Item Random Option (1 = 0.01%, 10000 = 100%). (Default: 0)
###########################################################################

View File

@ -129,7 +129,7 @@ namespace rathena {
}
/**
* Get a random value from the given map
* Get a random value from the given unordered map
* @param map: Unordered Map to search through
* @return A random value by reference
*/
@ -141,6 +141,19 @@ namespace rathena {
return it->second;
}
/**
* Get a random value from the given vector
* @param vec: Vector to search through
* @return A random value by reference
*/
template <typename K> K &vector_random(std::vector<K> &vec) {
auto it = vec.begin();
std::advance(it, rnd_value(0, vec.size() - 1));
return *it;
}
/**
* Get an iterator element
* @param vec: Vector to search through

View File

@ -7411,9 +7411,9 @@ ACMD_FUNC(mobinfo)
j = 0;
for (i = 0; i < MAX_MOB_DROP_TOTAL; i++) {
int droprate;
if (mob->dropitem[i].nameid == 0 || mob->dropitem[i].p < 1 || (item_data = itemdb_exists(mob->dropitem[i].nameid)) == NULL)
if (mob->dropitem[i].nameid == 0 || mob->dropitem[i].rate < 1 || (item_data = itemdb_exists(mob->dropitem[i].nameid)) == NULL)
continue;
droprate = mob->dropitem[i].p;
droprate = mob->dropitem[i].rate;
#ifdef RENEWAL_DROP
if( battle_config.atcommand_mobinfo_type ) {
@ -7450,7 +7450,7 @@ ACMD_FUNC(mobinfo)
if (mob->mvpitem[i].nameid == 0 || (item_data = itemdb_exists(mob->mvpitem[i].nameid)) == NULL)
continue;
//Because if there are 3 MVP drops at 50%, the first has a chance of 50%, the second 25% and the third 12.5%
mvppercent = (float)mob->mvpitem[i].p * mvpremain / 10000.0f;
mvppercent = (float)mob->mvpitem[i].rate * mvpremain / 10000.0f;
if(battle_config.item_drop_mvp_mode == 0) {
mvpremain -= mvppercent;
}

View File

@ -26,8 +26,6 @@ using namespace rathena;
static std::map<uint32, std::shared_ptr<s_item_combo>> itemdb_combo; /// Item Combo DB
static DBMap *itemdb_group; /// Item Group DB
static DBMap *itemdb_randomopt; /// Random option DB
static DBMap *itemdb_randomopt_group; /// Random option group DB
struct s_roulette_db rd;
@ -2275,196 +2273,312 @@ bool itemdb_isNoEquip(struct item_data *id, uint16 m) {
return false;
}
/**
* Retrieves random option data
*/
struct s_random_opt_data* itemdb_randomopt_exists(short id) {
return ((struct s_random_opt_data*)uidb_get(itemdb_randomopt, id));
}
/** Random option
* <ID>,<{Script}>
*/
static bool itemdb_read_randomopt(const char* basedir, bool silent) {
uint32 lines = 0, count = 0;
char line[1024];
char path[256];
FILE* fp;
sprintf(path, "%s/%s", basedir, "item_randomopt_db.txt");
if ((fp = fopen(path, "r")) == NULL) {
if (silent == 0) ShowError("itemdb_read_randomopt: File not found \"%s\".\n", path);
return false;
}
while (fgets(line, sizeof(line), fp)) {
char *str[2], *p;
lines++;
if (line[0] == '/' && line[1] == '/') // Ignore comments
continue;
memset(str, 0, sizeof(str));
p = line;
p = trim(p);
if (*p == '\0')
continue;// empty line
if (!strchr(p, ','))
{
ShowError("itemdb_read_randomopt: Insufficient columns in line %d of \"%s\", skipping.\n", lines, path);
continue;
}
str[0] = p;
p = strchr(p, ',');
*p = '\0';
p++;
str[1] = p;
if (str[1][0] != '{') {
ShowError("itemdb_read_randomopt(#1): Invalid format (Script column) in line %d of \"%s\", skipping.\n", lines, path);
continue;
}
/* no ending key anywhere (missing \}\) */
if (str[1][strlen(str[1]) - 1] != '}') {
ShowError("itemdb_read_randomopt(#2): Invalid format (Script column) in line %d of \"%s\", skipping.\n", lines, path);
continue;
}
else {
int id = -1;
struct s_random_opt_data *data;
struct script_code *code;
str[0] = trim(str[0]);
if (ISDIGIT(str[0][0])) {
id = atoi(str[0]);
}
else {
int64 id_tmp;
if (!script_get_constant(str[0], &id_tmp)) {
ShowError("itemdb_read_randopt: Unknown random option constant \"%s\".\n", str[0]);
continue;
}
id = static_cast<int>(id_tmp);
}
if (id < 0) {
ShowError("itemdb_read_randomopt: Invalid Random Option ID '%s' in line %d of \"%s\", skipping.\n", str[0], lines, path);
continue;
}
if ((data = itemdb_randomopt_exists(id)) == NULL) {
CREATE(data, struct s_random_opt_data, 1);
uidb_put(itemdb_randomopt, id, data);
}
data->id = id;
if ((code = parse_script(str[1], path, lines, 0)) == NULL) {
ShowWarning("itemdb_read_randomopt: Invalid script on option ID #%d.\n", id);
continue;
}
if (data->script) {
script_free_code(data->script);
data->script = NULL;
}
data->script = code;
}
count++;
}
fclose(fp);
ShowStatus("Done reading '" CL_WHITE "%u" CL_RESET "' entries in '" CL_WHITE "%s" CL_RESET "'.\n", count, path);
return true;
const std::string RandomOptionDatabase::getDefaultLocation() {
return std::string(db_path) + "/item_randomopt_db.yml";
}
/**
* Clear Item Random Option Group from memory
* @author [Cydh]
**/
static int itemdb_randomopt_group_free(DBKey key, DBData *data, va_list ap) {
struct s_random_opt_group *g = (struct s_random_opt_group *)db_data2ptr(data);
if (!g)
* Reads and parses an entry from the item_randomopt_db.
* @param node: YAML node containing the entry.
* @return count of successfully parsed rows
*/
uint64 RandomOptionDatabase::parseBodyNode(const YAML::Node &node) {
uint16 id;
if (!this->asUInt16(node, "Id", id))
return 0;
if (g->entries)
aFree(g->entries);
g->entries = NULL;
aFree(g);
std::shared_ptr<s_random_opt_data> randopt = this->find(id);
bool exists = randopt != nullptr;
if (!exists) {
if (!this->nodesExist(node, { "Option", "Script" }))
return 0;
randopt = std::make_shared<s_random_opt_data>();
randopt->id = id;
}
if (this->nodeExists(node, "Option")) {
std::string name;
if (!this->asString(node, "Option", name))
return 0;
if (randopt->name.compare(name) != 0 && random_option_db.option_exists(name)) {
this->invalidWarning(node["Option"], "Found duplicate random option name for %s, skipping.\n", name.c_str());
return 0;
}
randopt->name = name;
}
if (this->nodeExists(node, "Script")) {
std::string script;
if (!this->asString(node, "Script", script))
return 0;
if (randopt->script) {
aFree(randopt->script);
randopt->script = nullptr;
}
randopt->script = parse_script(script.c_str(), this->getCurrentFile().c_str(), id, SCRIPT_IGNORE_EXTERNAL_BRACKETS);
}
if (!exists)
this->put(id, randopt);
return 1;
}
RandomOptionDatabase random_option_db;
/**
* Get Item Random Option Group from itemdb_randomopt_group MapDB
* @param id Random Option Group
* @return Random Option Group data or NULL if not found
* @author [Cydh]
**/
struct s_random_opt_group *itemdb_randomopt_group_exists(int id) {
return (struct s_random_opt_group *)uidb_get(itemdb_randomopt_group, id);
* Check if the given random option name exists.
* @param name: Random option name
* @return True on success or false on failure
*/
bool RandomOptionDatabase::option_exists(std::string name) {
for (const auto &opt : random_option_db) {
if (opt.second->name.compare(name) == 0)
return true;
}
return false;
}
/**
* Read Item Random Option Group from db file
* @author [Cydh]
**/
static bool itemdb_read_randomopt_group(char* str[], int columns, int current) {
int64 id_tmp;
int id = 0;
int i;
unsigned short rate = (unsigned short)strtoul(str[1], NULL, 10);
struct s_random_opt_group *g = NULL;
if (!script_get_constant(str[0], &id_tmp)) {
ShowError("itemdb_read_randomopt_group: Invalid ID for Random Option Group '%s'.\n", str[0]);
return false;
}
id = static_cast<int>(id_tmp);
if ((columns-2)%3 != 0) {
ShowError("itemdb_read_randomopt_group: Invalid column entries '%d'.\n", columns);
return false;
}
if (!(g = (struct s_random_opt_group *)uidb_get(itemdb_randomopt_group, id))) {
CREATE(g, struct s_random_opt_group, 1);
g->id = id;
g->total = 0;
g->entries = NULL;
uidb_put(itemdb_randomopt_group, g->id, g);
}
RECREATE(g->entries, struct s_random_opt_group_entry, g->total + rate);
for (i = g->total; i < (g->total + rate); i++) {
int j, k;
memset(&g->entries[i].option, 0, sizeof(g->entries[i].option));
for (j = 0, k = 2; k < columns && j < MAX_ITEM_RDM_OPT; k+=3) {
int64 randid_tmp;
int randid = 0;
if (!script_get_constant(str[k], &randid_tmp) || ((randid = static_cast<int>(randid_tmp)) && !itemdb_randomopt_exists(randid))) {
ShowError("itemdb_read_randomopt_group: Invalid random group id '%s' in column %d!\n", str[k], k+1);
continue;
}
g->entries[i].option[j].id = randid;
g->entries[i].option[j].value = (short)strtoul(str[k+1], NULL, 10);
g->entries[i].option[j].param = (char)strtoul(str[k+2], NULL, 10);
j++;
* Return the constant value of the given random option.
* @param name: Random option name
* @param id: Random option ID
* @return True on success or false on failure
*/
bool RandomOptionDatabase::option_get_id(std::string name, uint16 &id) {
for (const auto &opt : random_option_db) {
if (opt.second->name.compare(name) == 0) {
id = opt.first;
return true;
}
}
g->total += rate;
return false;
}
const std::string RandomOptionGroupDatabase::getDefaultLocation() {
return std::string(db_path) + "/item_randomopt_group.yml";
}
bool RandomOptionGroupDatabase::add_option(const YAML::Node &node, std::shared_ptr<s_random_opt_group_entry> &entry) {
uint16 option_id;
if (this->nodeExists(node, "Option")) {
std::string opt_name;
if (!this->asString(node, "Option", opt_name))
return false;
if (!random_option_db.option_get_id(opt_name, option_id)) {
this->invalidWarning(node["Option"], "Invalid Random Option name %s given.\n", opt_name.c_str());
return false;
}
} else {
this->invalidWarning(node, "Missing Option node.\n");
return false;
}
entry = std::make_shared<s_random_opt_group_entry>();
entry->id = option_id;
if (this->nodeExists(node, "MinValue")) {
int16 value;
if (!this->asInt16(node, "MinValue", value))
return false;
entry->min_value = value;
} else {
entry->min_value = 0;
}
if (this->nodeExists(node, "MaxValue")) {
int16 value;
if (!this->asInt16(node, "MaxValue", value))
return false;
entry->max_value = value;
} else {
entry->max_value = 0;
}
if (entry->min_value > entry->max_value) {
this->invalidWarning(node["MaxValue"], "MinValue %d is greater than MaxValue %d, setting MaxValue to MinValue + 1.\n", entry->min_value, entry->max_value);
entry->max_value = entry->min_value + 1;
}
if (this->nodeExists(node, "Param")) {
int16 value;
if (!this->asInt16(node, "Param", value))
return false;
entry->param = static_cast<int8>(value);
} else {
entry->param = 0;
}
if (this->nodeExists(node, "Chance")) {
uint16 chance;
if (!this->asUInt16Rate(node, "Chance", chance))
return false;
entry->chance = chance;
} else {
entry->chance = 0;
}
return true;
}
/**
* Reads and parses an entry from the item_randomopt_group.
* @param node: YAML node containing the entry.
* @return count of successfully parsed rows
*/
uint64 RandomOptionGroupDatabase::parseBodyNode(const YAML::Node &node) {
uint16 id;
if (!this->asUInt16(node, "Id", id))
return 0;
std::shared_ptr<s_random_opt_group> randopt = this->find(id);
bool exists = randopt != nullptr;
if (!exists) {
if (!this->nodesExist(node, { "Group" }))
return 0;
randopt = std::make_shared<s_random_opt_group>();
randopt->id = id;
}
if (this->nodeExists(node, "Group")) {
std::string name;
if (!this->asString(node, "Group", name))
return 0;
if (randopt->name.compare(name) != 0 && random_option_group.option_exists(name)) {
this->invalidWarning(node["Group"], "Found duplicate random option group name for %s, skipping.\n", name.c_str());
return 0;
}
randopt->name = name;
}
for (const YAML::Node &slotNode : node["Slots"]) {
if (randopt->slots.size() >= MAX_ITEM_RDM_OPT) {
this->invalidWarning(slotNode, "Reached maximum of %d Random Option group options. Skipping the remaining slots...\n", MAX_ITEM_RDM_OPT);
break;
}
uint16 slot;
if (!this->asUInt16(slotNode, "Slot", slot))
return 0;
if (slot < 1 || slot > MAX_ITEM_RDM_OPT) {
this->invalidWarning(slotNode["Slot"], "Invalid Random Opton Slot number %hu given, must be between 1~%d, skipping.\n", slot, MAX_ITEM_RDM_OPT);
return 0;
}
std::vector<std::shared_ptr<s_random_opt_group_entry>> entries;
for (const YAML::Node &optionNode : slotNode["Options"]) {
std::shared_ptr<s_random_opt_group_entry> entry;
if (!this->add_option(optionNode, entry))
return 0;
entries.push_back(entry);
}
randopt->slots[slot - 1] = entries;
}
if (this->nodeExists(node, "MaxRandom")) {
uint16 max;
if (!this->asUInt16(node, "MaxRandom", max))
return 0;
if (max > MAX_ITEM_RDM_OPT) {
this->invalidWarning(node["MaxRandom"], "Exceeds the maximum of %d Random Option group options, capping to MAX_ITEM_RDM_OPT.\n", MAX_ITEM_RDM_OPT);
max = MAX_ITEM_RDM_OPT;
}
randopt->max_random = max;
} else {
if (!exists)
randopt->max_random = 0;
}
if (this->nodeExists(node, "Random")) {
randopt->random_options.clear();
for (const YAML::Node &randomNode : node["Random"]) {
std::shared_ptr<s_random_opt_group_entry> entry;
if (!this->add_option(randomNode, entry))
return 0;
randopt->random_options.push_back(entry);
}
}
if (!exists)
this->put(id, randopt);
return 1;
}
RandomOptionGroupDatabase random_option_group;
/**
* Check if the given random option group name exists.
* @param name: Random option name
* @return True on success or false on failure
*/
bool RandomOptionGroupDatabase::option_exists(std::string name) {
for (const auto &opt : random_option_group) {
if (opt.second->name.compare(name) == 0)
return true;
}
return false;
}
/**
* Return the constant value of the given random option group.
* @param name: Random option group name
* @param id: Random option group ID
* @return True on success or false on failure
*/
bool RandomOptionGroupDatabase::option_get_id(std::string name, uint16 &id) {
for (const auto &opt : random_option_group) {
if (opt.second->name.compare(name) == 0) {
id = opt.first;
return true;
}
}
return false;
}
/**
* Read all item-related databases
*/
@ -2507,12 +2621,13 @@ static void itemdb_read(void) {
sv_readdb(dbsubpath2, "item_package.txt", ',', 2, 10, -1, &itemdb_read_group, i > 0);
#endif
itemdb_read_combos(dbsubpath2,i > 0); //TODO change this to sv_read ? id#script ?
itemdb_read_randomopt(dbsubpath2, i > 0);
sv_readdb(dbsubpath2, "item_noequip.txt", ',', 2, 2, -1, &itemdb_read_noequip, i > 0);
sv_readdb(dbsubpath2, "item_randomopt_group.txt", ',', 5, 2+5*MAX_ITEM_RDM_OPT, -1, &itemdb_read_randomopt_group, i > 0);
aFree(dbsubpath1);
aFree(dbsubpath2);
}
random_option_db.load();
random_option_group.load();
}
/*==========================================
@ -2549,17 +2664,6 @@ static inline int itemdb_group_free2(DBKey key, DBData *data) {
return 0;
}
static int itemdb_randomopt_free(DBKey key, DBData *data, va_list ap) {
struct s_random_opt_data *opt = (struct s_random_opt_data *)db_data2ptr(data);
if (!opt)
return 0;
if (opt->script)
script_free_code(opt->script);
opt->script = NULL;
aFree(opt);
return 1;
}
bool item_data::isStackable()
{
switch (this->type) {
@ -2588,8 +2692,8 @@ void itemdb_reload(void) {
item_db.clear();
itemdb_combo.clear();
itemdb_group->clear(itemdb_group, itemdb_group_free);
itemdb_randomopt->clear(itemdb_randomopt, itemdb_randomopt_free);
itemdb_randomopt_group->clear(itemdb_randomopt_group, itemdb_randomopt_group_free);
random_option_db.clear();
random_option_group.clear();
if (battle_config.feature_roulette)
itemdb_roulette_free();
@ -2622,8 +2726,8 @@ void do_final_itemdb(void) {
item_db.clear();
itemdb_combo.clear();
itemdb_group->destroy(itemdb_group, itemdb_group_free);
itemdb_randomopt->destroy(itemdb_randomopt, itemdb_randomopt_free);
itemdb_randomopt_group->destroy(itemdb_randomopt_group, itemdb_randomopt_group_free);
random_option_db.clear();
random_option_group.clear();
if (battle_config.feature_roulette)
itemdb_roulette_free();
}
@ -2633,8 +2737,6 @@ void do_final_itemdb(void) {
*/
void do_init_itemdb(void) {
itemdb_group = uidb_alloc(DB_OPT_BASE);
itemdb_randomopt = uidb_alloc(DB_OPT_BASE);
itemdb_randomopt_group = uidb_alloc(DB_OPT_BASE);
itemdb_create_dummy();
itemdb_read();

View File

@ -4,6 +4,7 @@
#ifndef ITEMDB_HPP
#define ITEMDB_HPP
#include <map>
#include <vector>
#include "../common/database.hpp"
@ -919,28 +920,66 @@ struct item_data
// Struct for item random option [Secret]
struct s_random_opt_data
{
unsigned short id;
struct script_code *script;
};
uint16 id;
std::string name;
script_code *script;
/// Enum for Random Option Groups
enum Random_Option_Group {
RDMOPTG_None = 0,
RDMOPTG_Crimson_Weapon,
~s_random_opt_data() {
if (script)
script_free_code(script);
}
};
/// Struct for random option group entry
struct s_random_opt_group_entry {
struct s_item_randomoption option[MAX_ITEM_RDM_OPT];
uint16 id;
int16 min_value, max_value;
int8 param;
uint16 chance;
};
/// Struct for Random Option Group
struct s_random_opt_group {
uint8 id;
struct s_random_opt_group_entry *entries;
uint16 total;
uint16 id;
std::string name;
std::map<uint16, std::vector<std::shared_ptr<s_random_opt_group_entry>>> slots;
uint16 max_random;
std::vector<std::shared_ptr<s_random_opt_group_entry>> random_options;
};
class RandomOptionDatabase : public TypesafeYamlDatabase<uint16, s_random_opt_data> {
public:
RandomOptionDatabase() : TypesafeYamlDatabase("RANDOM_OPTION_DB", 1) {
}
const std::string getDefaultLocation();
uint64 parseBodyNode(const YAML::Node &node);
// Additional
bool option_exists(std::string name);
bool option_get_id(std::string name, uint16 &id);
};
extern RandomOptionDatabase random_option_db;
class RandomOptionGroupDatabase : public TypesafeYamlDatabase<uint16, s_random_opt_group> {
public:
RandomOptionGroupDatabase() : TypesafeYamlDatabase("RANDOM_OPTION_GROUP", 1) {
}
const std::string getDefaultLocation();
uint64 parseBodyNode(const YAML::Node &node);
// Additional
bool add_option(const YAML::Node &node, std::shared_ptr<s_random_opt_group_entry> &entry);
bool option_exists(std::string name);
bool option_get_id(std::string name, uint16 &id);
};
extern RandomOptionGroupDatabase random_option_group;
class ItemDatabase : public TypesafeCachedYamlDatabase<t_itemid, item_data> {
public:
ItemDatabase() : TypesafeCachedYamlDatabase("ITEM_DB", 1) {
@ -1024,9 +1063,6 @@ char itemdb_pc_get_itemgroup(uint16 group_id, bool identify, struct map_session_
bool itemdb_parse_roulette_db(void);
struct s_random_opt_data *itemdb_randomopt_exists(short id);
struct s_random_opt_group *itemdb_randomopt_group_exists(int id);
void itemdb_reload(void);
void do_final_itemdb(void);

View File

@ -321,8 +321,8 @@
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_misc.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_misc.txt')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_noequip.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_noequip.txt')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_package.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_package.txt')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_randomopt_db.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_randomopt_db.txt')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_randomopt_group.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_randomopt_group.txt')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_randomopt_db.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_randomopt_db.yml')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_randomopt_group.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_randomopt_group.yml')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_violetbox.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_violetbox.txt')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\job_basehpsp_db.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\job_basehpsp_db.txt')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\job_db1.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\job_db1.txt')" />

View File

@ -30,6 +30,7 @@
#include "guild.hpp"
#include "homunculus.hpp"
#include "intif.hpp"
#include "itemdb.hpp"
#include "log.hpp"
#include "map.hpp"
#include "mercenary.hpp"
@ -2096,21 +2097,63 @@ static TIMER_FUNC(mob_ai_hard){
return 0;
}
/**
* Assign random option values to an item
* @param item_option: Random option on the item
* @param option: Options to assign
*/
void mob_setitem_option(s_item_randomoption &item_option, const std::shared_ptr<s_random_opt_group_entry> &option) {
item_option.id = option->id;
item_option.value = rnd_value(option->min_value, option->max_value);
item_option.param = option->param;
}
/**
* Set random option for item when dropped from monster
* @param itm Item data
* @param mobdrop Drop data
* @param item: Item data
* @param mobdrop: Drop data
* @author [Cydh]
**/
void mob_setdropitem_option(struct item *itm, struct s_mob_drop *mobdrop) {
struct s_random_opt_group *g = NULL;
if (!itm || !mobdrop || mobdrop->randomopt_group == RDMOPTG_None)
void mob_setdropitem_option(item *item, s_mob_drop *mobdrop) {
if (!item || !mobdrop)
return;
if ((g = itemdb_randomopt_group_exists(mobdrop->randomopt_group)) && g->total) {
int r = rnd()%g->total;
if (&g->entries[r]) {
memcpy(&itm->option, &g->entries[r], sizeof(itm->option));
return;
std::shared_ptr<s_random_opt_group> group = random_option_group.find(mobdrop->randomopt_group);
if (group != nullptr) {
// Apply Must options
for (size_t i = 0; i < group->slots.size(); i++) {
// Try to apply an entry
for (size_t j = 0, max = group->slots[static_cast<uint16>(i)].size() * 3; j < max; j++) {
std::shared_ptr<s_random_opt_group_entry> option = util::vector_random(group->slots[static_cast<uint16>(i)]);
if (rnd() % 10000 < option->chance) {
mob_setitem_option(item->option[i], option);
break;
}
}
// If no entry was applied, assign one
if (item->option[i].id == 0) {
std::shared_ptr<s_random_opt_group_entry> option = util::vector_random(group->slots[static_cast<uint16>(i)]);
// Apply an entry without checking the chance
mob_setitem_option(item->option[i], option);
}
}
// Apply Random options (if available)
if (group->max_random > 0) {
for (size_t i = 0; i < min(group->max_random, MAX_ITEM_RDM_OPT); i++) {
// If item already has an option in this slot, skip it
if (item->option[i].id > 0)
continue;
std::shared_ptr<s_random_opt_group_entry> option = util::vector_random(group->random_options);
if (rnd() % 10000 < option->chance)
mob_setitem_option(item->option[i], option);
}
}
}
}
@ -2723,7 +2766,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
continue;
if ( !(it = itemdb_exists(md->db->dropitem[i].nameid)) )
continue;
drop_rate = md->db->dropitem[i].p;
drop_rate = md->db->dropitem[i].rate;
if (drop_rate <= 0) {
if (battle_config.drop_rate0item)
continue;
@ -2800,7 +2843,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
}
// Announce first, or else ditem will be freed. [Lance]
// By popular demand, use base drop rate for autoloot code. [Skotlex]
mob_item_drop(md, dlist, ditem, 0, battle_config.autoloot_adjust ? drop_rate : md->db->dropitem[i].p, homkillonly);
mob_item_drop(md, dlist, ditem, 0, battle_config.autoloot_adjust ? drop_rate : md->db->dropitem[i].rate, homkillonly);
}
// Ore Discovery [Celest]
@ -2931,7 +2974,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
if(mdrop[i].nameid == 0 || !(i_data = itemdb_exists(mdrop[i].nameid)))
continue;
temp = mdrop[i].p;
temp = mdrop[i].rate;
if (temp != 10000) {
if(temp <= 0 && !battle_config.drop_rate0item)
temp = 1;
@ -4274,7 +4317,7 @@ static bool mob_parse_dbrow(char** str)
if( entry.mvpitem[i].nameid ){
if( itemdb_search(entry.mvpitem[i].nameid) ){
entry.mvpitem[i].p = atoi(str[32+i*2]);
entry.mvpitem[i].rate = atoi(str[32+i*2]);
continue;
}else{
ShowWarning( "Monster \"%s\"(id: %d) is dropping an unknown item \"%s\"(MVP-Drop %d)\n", entry.name, mob_id, str[31+i*2], ( i / 2 ) + 1 );
@ -4283,7 +4326,7 @@ static bool mob_parse_dbrow(char** str)
// Delete the item
entry.mvpitem[i].nameid = 0;
entry.mvpitem[i].p = 0;
entry.mvpitem[i].rate = 0;
}
for(i = 0; i < MAX_MOB_DROP; i++) {
@ -4293,7 +4336,7 @@ static bool mob_parse_dbrow(char** str)
if( entry.dropitem[i].nameid ){
if( itemdb_search( entry.dropitem[i].nameid ) ){
entry.dropitem[i].p = atoi(str[k+1]);
entry.dropitem[i].rate = atoi(str[k+1]);
continue;
}else{
ShowWarning( "Monster \"%s\"(id: %d) is dropping an unknown item \"%s\"(Drop %d)\n", entry.name, mob_id, str[k], ( i / 2 ) + 1 );
@ -4302,7 +4345,7 @@ static bool mob_parse_dbrow(char** str)
// Delete the item
entry.dropitem[i].nameid = 0;
entry.dropitem[i].p = 0;
entry.dropitem[i].rate = 0;
}
db = mob_db(mob_id);
@ -5239,25 +5282,18 @@ static bool mob_readdb_drop(char* str[], int columns, int current) {
}
drop[i].nameid = nameid;
drop[i].p = rate;
drop[i].steal_protected = (flag) ? 1 : 0;
drop[i].rate = rate;
drop[i].steal_protected = (flag) ? true : false;
drop[i].randomopt_group = 0;
if (columns > 3) {
int64 randomopt_group_tmp = -1;
int randomopt_group = -1;
uint16 randomopt_group;
if (!script_get_constant(trim(str[3]), &randomopt_group_tmp)) {
if (!random_option_group.option_get_id(trim(str[3]), randomopt_group)) {
ShowError("mob_readdb_drop: Invalid 'randopt_groupid' '%s' for monster '%hu'.\n", str[3], mobid);
return false;
}
randomopt_group = static_cast<int>(randomopt_group_tmp);
if (randomopt_group == RDMOPTG_None)
return true;
if (!itemdb_randomopt_group_exists(randomopt_group)) {
ShowError("mob_readdb_drop: 'randopt_groupid' '%s' cannot be found in DB for monster '%hu'.\n", str[3], mobid);
return false;
}
drop[i].randomopt_group = randomopt_group;
}
}
@ -5293,7 +5329,7 @@ static void mob_drop_ratio_adjust(void){
for( j = 0; j < MAX_MVP_DROP_TOTAL; j++ ){
nameid = mob->mvpitem[j].nameid;
rate = mob->mvpitem[j].p;
rate = mob->mvpitem[j].rate;
if( nameid == 0 || rate == 0 ){
continue;
@ -5313,9 +5349,9 @@ static void mob_drop_ratio_adjust(void){
// Item is not known anymore(should never happen)
if( !id ){
ShowWarning( "Monster \"%s\"(id:%hu) is dropping an unknown item(id: %u)\n", mob->name, mob_id, nameid );
ShowWarning( "Monster \"%s\"(id:%u) is dropping an unknown item(id: %u)\n", mob->name, mob_id, nameid );
mob->mvpitem[j].nameid = 0;
mob->mvpitem[j].p = 0;
mob->mvpitem[j].rate = 0;
continue;
}
@ -5325,7 +5361,7 @@ static void mob_drop_ratio_adjust(void){
}
}
mob->mvpitem[j].p = rate;
mob->mvpitem[j].rate = rate;
}
for( j = 0; j < MAX_MOB_DROP_TOTAL; j++ ){
@ -5333,7 +5369,7 @@ static void mob_drop_ratio_adjust(void){
bool is_treasurechest;
nameid = mob->dropitem[j].nameid;
rate = mob->dropitem[j].p;
rate = mob->dropitem[j].rate;
if( nameid == 0 || rate == 0 ){
continue;
@ -5345,7 +5381,7 @@ static void mob_drop_ratio_adjust(void){
if( !id ){
ShowWarning( "Monster \"%s\"(id:%hu) is dropping an unknown item(id: %u)\n", mob->name, mob_id, nameid );
mob->dropitem[j].nameid = 0;
mob->dropitem[j].p = 0;
mob->dropitem[j].rate = 0;
continue;
}
@ -5427,7 +5463,7 @@ static void mob_drop_ratio_adjust(void){
}
}
mob->dropitem[j].p = rate;
mob->dropitem[j].rate = rate;
}
}
@ -5639,7 +5675,7 @@ void mob_reload_itemmob_data(void) {
id = itemdb_search(pair.second.dropitem[d].nameid);
for (k = 0; k < MAX_SEARCH; k++) {
if (id->mob[k].chance <= pair.second.dropitem[d].p)
if (id->mob[k].chance <= pair.second.dropitem[d].rate)
break;
}
@ -5648,7 +5684,7 @@ void mob_reload_itemmob_data(void) {
if (id->mob[k].id != pair.first)
memmove(&id->mob[k+1], &id->mob[k], (MAX_SEARCH-k-1)*sizeof(id->mob[0]));
id->mob[k].chance = pair.second.dropitem[d].p;
id->mob[k].chance = pair.second.dropitem[d].rate;
id->mob[k].id = pair.first;
}
}

View File

@ -162,9 +162,9 @@ struct s_mob_lootitem {
/// Struct for monster's drop item
struct s_mob_drop {
t_itemid nameid;
int p;
uint8 randomopt_group;
unsigned steal_protected : 1;
uint32 rate;
uint16 randomopt_group;
bool steal_protected;
};
struct mob_db {

View File

@ -5835,7 +5835,7 @@ bool pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 ski
// Try dropping one item, in the order from first to last possible slot.
// Droprate is affected by the skill success rate.
for( i = 0; i < MAX_STEAL_DROP; i++ )
if( md->db->dropitem[i].nameid > 0 && !md->db->dropitem[i].steal_protected && itemdb_exists(md->db->dropitem[i].nameid) && rnd() % 10000 < md->db->dropitem[i].p
if( md->db->dropitem[i].nameid > 0 && !md->db->dropitem[i].steal_protected && itemdb_exists(md->db->dropitem[i].nameid) && rnd() % 10000 < md->db->dropitem[i].rate
#ifndef RENEWAL
* rate/100.
#endif
@ -5867,11 +5867,11 @@ bool pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 ski
log_pick_mob(md, LOG_TYPE_STEAL, -1, &tmp_item);
//A Rare Steal Global Announce by Lupus
if(md->db->dropitem[i].p<=battle_config.rare_drop_announce) {
if(md->db->dropitem[i].rate <= battle_config.rare_drop_announce) {
struct item_data *i_data;
char message[128];
i_data = itemdb_search(itemid);
sprintf (message, msg_txt(sd,542), (sd->status.name[0])?sd->status.name :"GM", md->db->jname, i_data->ename.c_str(), (float)md->db->dropitem[i].p/100);
sprintf (message, msg_txt(sd,542), (sd->status.name[0])?sd->status.name :"GM", md->db->jname, i_data->ename.c_str(), (float)md->db->dropitem[i].rate / 100);
//MSG: "'%s' stole %s's %s (chance: %0.02f%%)"
intif_broadcast(message, strlen(message) + 1, BC_DEFAULT);
}

View File

@ -10621,7 +10621,7 @@ BUILDIN_FUNC(getmobdrops)
continue;
mapreg_setreg(reference_uid(add_str("$@MobDrop_item"), j), mob->dropitem[i].nameid);
mapreg_setreg(reference_uid(add_str("$@MobDrop_rate"), j), mob->dropitem[i].p);
mapreg_setreg(reference_uid(add_str("$@MobDrop_rate"), j), mob->dropitem[i].rate);
j++;
}
@ -17424,7 +17424,7 @@ BUILDIN_FUNC(addmonsterdrop)
}
if(c) { //Fill in the slot with the item and rate
mob->dropitem[c].nameid = item_id;
mob->dropitem[c].p = (rate > 10000)?10000:rate;
mob->dropitem[c].rate = (rate > 10000)?10000:rate;
mob_reload_itemmob_data(); // Reload the mob search data stored in the item_data
script_pushint(st,1);
} else //No place to put the new drop
@ -17466,7 +17466,7 @@ BUILDIN_FUNC(delmonsterdrop)
for(i = 0; i < MAX_MOB_DROP_TOTAL; i++) {
if(mob->dropitem[i].nameid == item_id) {
mob->dropitem[i].nameid = 0;
mob->dropitem[i].p = 0;
mob->dropitem[i].rate = 0;
mob_reload_itemmob_data(); // Reload the mob search data stored in the item_data
script_pushint(st,1);
return SCRIPT_CMD_SUCCESS;
@ -23368,7 +23368,6 @@ BUILDIN_FUNC(getequiprandomoption) {
*/
BUILDIN_FUNC(setrandomoption) {
struct map_session_data *sd;
struct s_random_opt_data *opt;
int pos, index, id, value, param, ep;
int i = -1;
if (!script_charid2sd(7, sd))
@ -23379,7 +23378,9 @@ BUILDIN_FUNC(setrandomoption) {
value = script_getnum(st, 5);
param = script_getnum(st, 6);
if ((opt = itemdb_randomopt_exists((short)id)) == NULL) {
std::shared_ptr<s_random_opt_data> opt = random_option_db.find(static_cast<uint16>(id));
if (opt == nullptr) {
ShowError("buildin_setrandomoption: Random option ID %d does not exists.\n", id);
script_pushint(st, 0);
return SCRIPT_CMD_FAILURE;

View File

@ -4564,10 +4564,6 @@
export_constant(MOBG_ClassChange);
export_constant(MOBG_Taekwon_Mission);
/* Item Random Option Group */
export_constant(RDMOPTG_None);
export_constant(RDMOPTG_Crimson_Weapon);
/* random option attributes */
export_constant(ROA_ID);
export_constant(ROA_VALUE);

View File

@ -4127,15 +4127,15 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
continue;
if (sd->inventory_data[index]) {
int j;
struct s_random_opt_data *data;
for (j = 0; j < MAX_ITEM_RDM_OPT; j++) {
for (uint8 j = 0; j < MAX_ITEM_RDM_OPT; j++) {
short opt_id = sd->inventory.u.items_inventory[index].option[j].id;
if (!opt_id)
continue;
current_equip_opt_index = j;
data = itemdb_randomopt_exists(opt_id);
std::shared_ptr<s_random_opt_data> data = random_option_db.find(opt_id);
if (!data || !data->script)
continue;
if (!pc_has_permission(sd, PC_PERM_USE_ALL_EQUIPMENT) && itemdb_isNoEquip(sd->inventory_data[index], sd->bl.m))

View File

@ -120,6 +120,13 @@ std::unordered_map<t_itemid, s_item_stack_csv2yaml> item_stack;
std::unordered_map<t_itemid, s_item_nouse_csv2yaml> item_nouse;
std::unordered_map<t_itemid, s_item_trade_csv2yaml> item_trade;
struct s_random_opt_group_csv : s_random_opt_group {
std::vector<uint16> rate;
};
std::unordered_map<uint16, std::string> rand_opt_db;
std::unordered_map<uint16, s_random_opt_group_csv> rand_opt_group;
static std::map<std::string, int> um_mapid2jobname {
{ "Novice", JOB_NOVICE }, // Novice and Super Novice share the same value
{ "SuperNovice", JOB_NOVICE },
@ -205,6 +212,9 @@ static bool itemdb_read_stack(char* fields[], int columns, int current);
static bool itemdb_read_nouse(char* fields[], int columns, int current);
static bool itemdb_read_itemtrade(char* fields[], int columns, int current);
static bool itemdb_read_db(const char *file);
static bool itemdb_read_randomopt(const char* file);
static bool itemdb_read_randomopt_group(char *str[], int columns, int current);
static bool itemdb_randomopt_group_yaml(void);
// Constants for conversion
std::unordered_map<t_itemid, std::string> aegis_itemnames;
@ -218,6 +228,7 @@ static bool parse_item_constants_txt( const char* path );
static bool parse_mob_constants( char* split[], int columns, int current );
static bool parse_skill_constants_txt( char* split[], int columns, int current );
static bool parse_skill_constants_yml(std::string path, std::string filename);
static void init_random_option_constants();
bool fileExists( const std::string& path );
bool askConfirmation( const char* fmt, ... );
@ -427,6 +438,7 @@ int do_init( int argc, char** argv ){
// Load constants
#define export_constant_npc(a) export_constant(a)
init_random_option_constants();
#include "../map/script_constants.hpp"
std::vector<std::string> root_paths = {
@ -511,6 +523,20 @@ int do_init( int argc, char** argv ){
return 0;
}
rand_opt_db.clear();
if (!process("RANDOM_OPTION_DB", 1, root_paths, "item_randomopt_db", [](const std::string& path, const std::string& name_ext) -> bool {
return itemdb_read_randomopt((path + name_ext).c_str());
})) {
return 0;
}
rand_opt_group.clear();
if (!process("RANDOM_OPTION_GROUP", 1, root_paths, "item_randomopt_group", [](const std::string& path, const std::string& name_ext) -> bool {
return sv_readdb(path.c_str(), name_ext.c_str(), ',', 5, 2 + 5 * MAX_ITEM_RDM_OPT, -1, &itemdb_read_randomopt_group, false) && itemdb_randomopt_group_yaml();
})) {
return 0;
}
// TODO: add implementations ;-)
return 0;
@ -3286,3 +3312,405 @@ static bool itemdb_read_db(const char* file) {
return true;
}
// Copied and adjusted from itemdb.cpp
static bool itemdb_read_randomopt(const char* file) {
FILE* fp = fopen( file, "r" );
if( fp == nullptr ){
ShowError( "Can't read %s\n", file );
return 0;
}
uint32 lines = 0, count = 0;
char line[1024];
char path[256];
while (fgets(line, sizeof(line), fp)) {
char *str[2], *p;
lines++;
if (line[0] == '/' && line[1] == '/') // Ignore comments
continue;
memset(str, 0, sizeof(str));
p = trim(line);
if (*p == '\0')
continue;// empty line
if (!strchr(p, ','))
{
ShowError("itemdb_read_randomopt: Insufficient columns in line %d of \"%s\", skipping.\n", lines, path);
continue;
}
str[0] = p;
p = strchr(p, ',');
*p = '\0';
p++;
str[1] = p;
if (str[1][0] != '{') {
ShowError("itemdb_read_randomopt(#1): Invalid format (Script column) in line %d of \"%s\", skipping.\n", lines, path);
continue;
}
/* no ending key anywhere (missing \}\) */
if (str[1][strlen(str[1]) - 1] != '}') {
ShowError("itemdb_read_randomopt(#2): Invalid format (Script column) in line %d of \"%s\", skipping.\n", lines, path);
continue;
} else {
str[0] = trim(str[0]);
int64 id = constant_lookup_int(str[0]);
if (id == -100) {
ShowError("itemdb_read_randomopt: Unknown random option '%s' constant, skipping.\n", str[0]);
continue;
}
body << YAML::BeginMap;
body << YAML::Key << "Id" << YAML::Value << id;
body << YAML::Key << "Option" << YAML::Value << str[0] + 7;
body << YAML::Key << "Script" << YAML::Literal << str[1];
body << YAML::EndMap;
rand_opt_db.insert({ count, str[0] + 7 });
}
count++;
}
fclose(fp);
ShowStatus("Done reading '" CL_WHITE "%d" CL_RESET "' entries in '" CL_WHITE "%s" CL_RESET "'.\n", count, file);
return true;
}
// Copied and adjusted from itemdb.cpp
static bool itemdb_read_randomopt_group(char* str[], int columns, int current) {
if ((columns - 2) % 3 != 0) {
ShowError("itemdb_read_randomopt_group: Invalid column entries '%d'.\n", columns);
return false;
}
uint16 id = static_cast<uint16>(rand_opt_group.size() + 1);
s_random_opt_group_csv *group = util::umap_find(rand_opt_group, id);
s_random_opt_group_csv group_entry;
if (group == nullptr)
group_entry.rate.push_back((uint16)strtoul(str[1], nullptr, 10));
for (int j = 0, k = 2; k < columns && j < MAX_ITEM_RDM_OPT; k += 3) {
int32 randid_tmp = -1;
for (const auto &opt : rand_opt_db) {
if (opt.second.compare(str[k]) == 0) {
randid_tmp = opt.first;
break;
}
}
if (randid_tmp < 0) {
ShowError("itemdb_read_randomopt_group: Invalid random group id '%s' in column %d!\n", str[k], k + 1);
continue;
}
std::vector<std::shared_ptr<s_random_opt_group_entry>> entries = {};
if (group != nullptr)
entries = group->slots[j];
std::shared_ptr<s_random_opt_group_entry> entry;
entry->id = static_cast<uint16>(randid_tmp);
entry->min_value = (int16)strtoul(str[k + 1], nullptr, 10);
entry->max_value = 0;
entry->param = (int8)strtoul(str[k + 2], nullptr, 10);
entry->chance = 0;
entries.push_back(entry);
if (group == nullptr)
group_entry.slots[j] = entries;
else
group->slots[j] = entries;
j++;
}
if (group == nullptr)
rand_opt_group.insert({ id, group_entry });
return true;
}
static bool itemdb_randomopt_group_yaml(void) {
for (const auto &it : rand_opt_group) {
body << YAML::BeginMap;
body << YAML::Key << "Id" << YAML::Value << it.first;
body << YAML::Key << "Group" << YAML::Value << it.second.name;
body << YAML::Key << "Slots";
body << YAML::BeginSeq;
for (size_t i = 0; i < it.second.rate.size(); i++) {
body << YAML::BeginMap;
body << YAML::Key << "Slot" << YAML::Value << i + 1;
body << YAML::Key << "Options";
body << YAML::BeginSeq;
for (size_t j = 0; j < it.second.slots.size(); j++) {
std::vector<std::shared_ptr<s_random_opt_group_entry>> options = it.second.slots.at(static_cast<uint16>(j));
for (const auto &opt_it : options) {
body << YAML::BeginMap;
for (const auto &opt : rand_opt_db) {
if (opt.first == opt_it->id) {
body << YAML::Key << "Option" << YAML::Value << opt.second;
break;
}
}
if (opt_it->min_value != 0)
body << YAML::Key << "MinValue" << YAML::Value << opt_it->min_value;
if (opt_it->param != 0)
body << YAML::Key << "Param" << YAML::Value << opt_it->param;
body << YAML::Key << "Chance" << YAML::Value << it.second.rate[i];
body << YAML::EndMap;
}
}
body << YAML::EndSeq;
body << YAML::EndMap;
}
body << YAML::EndSeq;
body << YAML::EndMap;
}
return true;
}
// Initialize Random Option constants
void init_random_option_constants() {
#define export_constant2(a, b) script_set_constant_(a, b, a, false, false)
export_constant2("RDMOPT_VAR_MAXHPAMOUNT", 1);
export_constant2("RDMOPT_VAR_MAXSPAMOUNT", 2);
export_constant2("RDMOPT_VAR_STRAMOUNT", 3);
export_constant2("RDMOPT_VAR_AGIAMOUNT", 4);
export_constant2("RDMOPT_VAR_VITAMOUNT", 5);
export_constant2("RDMOPT_VAR_INTAMOUNT", 6);
export_constant2("RDMOPT_VAR_DEXAMOUNT", 7);
export_constant2("RDMOPT_VAR_LUKAMOUNT", 8);
export_constant2("RDMOPT_VAR_MAXHPPERCENT", 9);
export_constant2("RDMOPT_VAR_MAXSPPERCENT", 10);
export_constant2("RDMOPT_VAR_HPACCELERATION", 11);
export_constant2("RDMOPT_VAR_SPACCELERATION", 12);
export_constant2("RDMOPT_VAR_ATKPERCENT", 13);
export_constant2("RDMOPT_VAR_MAGICATKPERCENT", 14);
export_constant2("RDMOPT_VAR_PLUSASPD", 15);
export_constant2("RDMOPT_VAR_PLUSASPDPERCENT", 16);
export_constant2("RDMOPT_VAR_ATTPOWER", 17);
export_constant2("RDMOPT_VAR_HITSUCCESSVALUE", 18);
export_constant2("RDMOPT_VAR_ATTMPOWER", 19);
export_constant2("RDMOPT_VAR_ITEMDEFPOWER", 20);
export_constant2("RDMOPT_VAR_MDEFPOWER", 21);
export_constant2("RDMOPT_VAR_AVOIDSUCCESSVALUE", 22);
export_constant2("RDMOPT_VAR_PLUSAVOIDSUCCESSVALUE", 23);
export_constant2("RDMOPT_VAR_CRITICALSUCCESSVALUE", 24);
export_constant2("RDMOPT_ATTR_TOLERACE_NOTHING", 25);
export_constant2("RDMOPT_ATTR_TOLERACE_WATER", 26);
export_constant2("RDMOPT_ATTR_TOLERACE_GROUND", 27);
export_constant2("RDMOPT_ATTR_TOLERACE_FIRE", 28);
export_constant2("RDMOPT_ATTR_TOLERACE_WIND", 29);
export_constant2("RDMOPT_ATTR_TOLERACE_POISON", 30);
export_constant2("RDMOPT_ATTR_TOLERACE_SAINT", 31);
export_constant2("RDMOPT_ATTR_TOLERACE_DARKNESS", 32);
export_constant2("RDMOPT_ATTR_TOLERACE_TELEKINESIS", 33);
export_constant2("RDMOPT_ATTR_TOLERACE_UNDEAD", 34);
export_constant2("RDMOPT_ATTR_TOLERACE_ALLBUTNOTHING", 35);
export_constant2("RDMOPT_DAMAGE_PROPERTY_NOTHING_USER", 36);
export_constant2("RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET", 37);
export_constant2("RDMOPT_DAMAGE_PROPERTY_WATER_USER", 38);
export_constant2("RDMOPT_DAMAGE_PROPERTY_WATER_TARGET", 39);
export_constant2("RDMOPT_DAMAGE_PROPERTY_GROUND_USER", 40);
export_constant2("RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET", 41);
export_constant2("RDMOPT_DAMAGE_PROPERTY_FIRE_USER", 42);
export_constant2("RDMOPT_DAMAGE_PROPERTY_FIRE_TARGET", 43);
export_constant2("RDMOPT_DAMAGE_PROPERTY_WIND_USER", 44);
export_constant2("RDMOPT_DAMAGE_PROPERTY_WIND_TARGET", 45);
export_constant2("RDMOPT_DAMAGE_PROPERTY_POISON_USER", 46);
export_constant2("RDMOPT_DAMAGE_PROPERTY_POISON_TARGET", 47);
export_constant2("RDMOPT_DAMAGE_PROPERTY_SAINT_USER", 48);
export_constant2("RDMOPT_DAMAGE_PROPERTY_SAINT_TARGET", 49);
export_constant2("RDMOPT_DAMAGE_PROPERTY_DARKNESS_USER", 50);
export_constant2("RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET", 51);
export_constant2("RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_USER", 52);
export_constant2("RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET", 53);
export_constant2("RDMOPT_DAMAGE_PROPERTY_UNDEAD_USER", 54);
export_constant2("RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET", 55);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_NOTHING_USER", 56);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_NOTHING_TARGET", 57);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_WATER_USER", 58);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_WATER_TARGET", 59);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_GROUND_USER", 60);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_GROUND_TARGET", 61);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_FIRE_USER", 62);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_FIRE_TARGET", 63);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_WIND_USER", 64);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_WIND_TARGET", 65);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_POISON_USER", 66);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_POISON_TARGET", 67);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_SAINT_USER", 68);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_SAINT_TARGET", 69);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_DARKNESS_USER", 70);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_DARKNESS_TARGET", 71);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_TELEKINESIS_USER", 72);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_TELEKINESIS_TARGET", 73);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_UNDEAD_USER", 74);
export_constant2("RDMOPT_MDAMAGE_PROPERTY_UNDEAD_TARGET", 75);
export_constant2("RDMOPT_BODY_ATTR_NOTHING", 76);
export_constant2("RDMOPT_BODY_ATTR_WATER", 77);
export_constant2("RDMOPT_BODY_ATTR_GROUND", 78);
export_constant2("RDMOPT_BODY_ATTR_FIRE", 79);
export_constant2("RDMOPT_BODY_ATTR_WIND", 80);
export_constant2("RDMOPT_BODY_ATTR_POISON", 81);
export_constant2("RDMOPT_BODY_ATTR_SAINT", 82);
export_constant2("RDMOPT_BODY_ATTR_DARKNESS", 83);
export_constant2("RDMOPT_BODY_ATTR_TELEKINESIS", 84);
export_constant2("RDMOPT_BODY_ATTR_UNDEAD", 85);
export_constant2("RDMOPT_RACE_TOLERACE_NOTHING", 87);
export_constant2("RDMOPT_RACE_TOLERACE_UNDEAD", 88);
export_constant2("RDMOPT_RACE_TOLERACE_ANIMAL", 89);
export_constant2("RDMOPT_RACE_TOLERACE_PLANT", 90);
export_constant2("RDMOPT_RACE_TOLERACE_INSECT", 91);
export_constant2("RDMOPT_RACE_TOLERACE_FISHS", 92);
export_constant2("RDMOPT_RACE_TOLERACE_DEVIL", 93);
export_constant2("RDMOPT_RACE_TOLERACE_HUMAN", 94);
export_constant2("RDMOPT_RACE_TOLERACE_ANGEL", 95);
export_constant2("RDMOPT_RACE_TOLERACE_DRAGON", 96);
export_constant2("RDMOPT_RACE_DAMAGE_NOTHING", 97);
export_constant2("RDMOPT_RACE_DAMAGE_UNDEAD", 98);
export_constant2("RDMOPT_RACE_DAMAGE_ANIMAL", 99);
export_constant2("RDMOPT_RACE_DAMAGE_PLANT", 100);
export_constant2("RDMOPT_RACE_DAMAGE_INSECT", 101);
export_constant2("RDMOPT_RACE_DAMAGE_FISHS", 102);
export_constant2("RDMOPT_RACE_DAMAGE_DEVIL", 103);
export_constant2("RDMOPT_RACE_DAMAGE_HUMAN", 104);
export_constant2("RDMOPT_RACE_DAMAGE_ANGEL", 105);
export_constant2("RDMOPT_RACE_DAMAGE_DRAGON", 106);
export_constant2("RDMOPT_RACE_MDAMAGE_NOTHING", 107);
export_constant2("RDMOPT_RACE_MDAMAGE_UNDEAD", 108);
export_constant2("RDMOPT_RACE_MDAMAGE_ANIMAL", 109);
export_constant2("RDMOPT_RACE_MDAMAGE_PLANT", 110);
export_constant2("RDMOPT_RACE_MDAMAGE_INSECT", 111);
export_constant2("RDMOPT_RACE_MDAMAGE_FISHS", 112);
export_constant2("RDMOPT_RACE_MDAMAGE_DEVIL", 113);
export_constant2("RDMOPT_RACE_MDAMAGE_HUMAN", 114);
export_constant2("RDMOPT_RACE_MDAMAGE_ANGEL", 115);
export_constant2("RDMOPT_RACE_MDAMAGE_DRAGON", 116);
export_constant2("RDMOPT_RACE_CRI_PERCENT_NOTHING", 117);
export_constant2("RDMOPT_RACE_CRI_PERCENT_UNDEAD", 118);
export_constant2("RDMOPT_RACE_CRI_PERCENT_ANIMAL", 119);
export_constant2("RDMOPT_RACE_CRI_PERCENT_PLANT", 120);
export_constant2("RDMOPT_RACE_CRI_PERCENT_INSECT", 121);
export_constant2("RDMOPT_RACE_CRI_PERCENT_FISHS", 122);
export_constant2("RDMOPT_RACE_CRI_PERCENT_DEVIL", 123);
export_constant2("RDMOPT_RACE_CRI_PERCENT_HUMAN", 124);
export_constant2("RDMOPT_RACE_CRI_PERCENT_ANGEL", 125);
export_constant2("RDMOPT_RACE_CRI_PERCENT_DRAGON", 126);
export_constant2("RDMOPT_RACE_IGNORE_DEF_PERCENT_NOTHING", 127);
export_constant2("RDMOPT_RACE_IGNORE_DEF_PERCENT_UNDEAD", 128);
export_constant2("RDMOPT_RACE_IGNORE_DEF_PERCENT_ANIMAL", 129);
export_constant2("RDMOPT_RACE_IGNORE_DEF_PERCENT_PLANT", 130);
export_constant2("RDMOPT_RACE_IGNORE_DEF_PERCENT_INSECT", 131);
export_constant2("RDMOPT_RACE_IGNORE_DEF_PERCENT_FISHS", 132);
export_constant2("RDMOPT_RACE_IGNORE_DEF_PERCENT_DEVIL", 133);
export_constant2("RDMOPT_RACE_IGNORE_DEF_PERCENT_HUMAN", 134);
export_constant2("RDMOPT_RACE_IGNORE_DEF_PERCENT_ANGEL", 135);
export_constant2("RDMOPT_RACE_IGNORE_DEF_PERCENT_DRAGON", 136);
export_constant2("RDMOPT_RACE_IGNORE_MDEF_PERCENT_NOTHING", 137);
export_constant2("RDMOPT_RACE_IGNORE_MDEF_PERCENT_UNDEAD", 138);
export_constant2("RDMOPT_RACE_IGNORE_MDEF_PERCENT_ANIMAL", 139);
export_constant2("RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLANT", 140);
export_constant2("RDMOPT_RACE_IGNORE_MDEF_PERCENT_INSECT", 141);
export_constant2("RDMOPT_RACE_IGNORE_MDEF_PERCENT_FISHS", 142);
export_constant2("RDMOPT_RACE_IGNORE_MDEF_PERCENT_DEVIL", 143);
export_constant2("RDMOPT_RACE_IGNORE_MDEF_PERCENT_HUMAN", 144);
export_constant2("RDMOPT_RACE_IGNORE_MDEF_PERCENT_ANGEL", 145);
export_constant2("RDMOPT_RACE_IGNORE_MDEF_PERCENT_DRAGON", 146);
export_constant2("RDMOPT_CLASS_DAMAGE_NORMAL_TARGET", 147);
export_constant2("RDMOPT_CLASS_DAMAGE_BOSS_TARGET", 148);
export_constant2("RDMOPT_CLASS_DAMAGE_NORMAL_USER", 149);
export_constant2("RDMOPT_CLASS_DAMAGE_BOSS_USER", 150);
export_constant2("RDMOPT_CLASS_MDAMAGE_NORMAL", 151);
export_constant2("RDMOPT_CLASS_MDAMAGE_BOSS", 152);
export_constant2("RDMOPT_CLASS_IGNORE_DEF_PERCENT_NORMAL", 153);
export_constant2("RDMOPT_CLASS_IGNORE_DEF_PERCENT_BOSS", 154);
export_constant2("RDMOPT_CLASS_IGNORE_MDEF_PERCENT_NORMAL", 155);
export_constant2("RDMOPT_CLASS_IGNORE_MDEF_PERCENT_BOSS", 156);
export_constant2("RDMOPT_DAMAGE_SIZE_SMALL_TARGET", 157);
export_constant2("RDMOPT_DAMAGE_SIZE_MIDIUM_TARGET", 158);
export_constant2("RDMOPT_DAMAGE_SIZE_LARGE_TARGET", 159);
export_constant2("RDMOPT_DAMAGE_SIZE_SMALL_USER", 160);
export_constant2("RDMOPT_DAMAGE_SIZE_MIDIUM_USER", 161);
export_constant2("RDMOPT_DAMAGE_SIZE_LARGE_USER", 162);
export_constant2("RDMOPT_DAMAGE_SIZE_PERFECT", 163);
export_constant2("RDMOPT_DAMAGE_CRI_TARGET", 164);
export_constant2("RDMOPT_DAMAGE_CRI_USER", 165);
export_constant2("RDMOPT_RANGE_ATTACK_DAMAGE_TARGET", 166);
export_constant2("RDMOPT_RANGE_ATTACK_DAMAGE_USER", 167);
export_constant2("RDMOPT_HEAL_VALUE", 168);
export_constant2("RDMOPT_HEAL_MODIFY_PERCENT", 169);
export_constant2("RDMOPT_DEC_SPELL_CAST_TIME", 170);
export_constant2("RDMOPT_DEC_SPELL_DELAY_TIME", 171);
export_constant2("RDMOPT_DEC_SP_CONSUMPTION", 172);
export_constant2("RDMOPT_WEAPON_ATTR_NOTHING", 175);
export_constant2("RDMOPT_WEAPON_ATTR_WATER", 176);
export_constant2("RDMOPT_WEAPON_ATTR_GROUND", 177);
export_constant2("RDMOPT_WEAPON_ATTR_FIRE", 178);
export_constant2("RDMOPT_WEAPON_ATTR_WIND", 179);
export_constant2("RDMOPT_WEAPON_ATTR_POISON", 180);
export_constant2("RDMOPT_WEAPON_ATTR_SAINT", 181);
export_constant2("RDMOPT_WEAPON_ATTR_DARKNESS", 182);
export_constant2("RDMOPT_WEAPON_ATTR_TELEKINESIS", 183);
export_constant2("RDMOPT_WEAPON_ATTR_UNDEAD", 184);
export_constant2("RDMOPT_WEAPON_INDESTRUCTIBLE", 185);
export_constant2("RDMOPT_BODY_INDESTRUCTIBLE", 186);
export_constant2("RDMOPT_MDAMAGE_SIZE_SMALL_TARGET", 187);
export_constant2("RDMOPT_MDAMAGE_SIZE_MIDIUM_TARGET", 188);
export_constant2("RDMOPT_MDAMAGE_SIZE_LARGE_TARGET", 189);
export_constant2("RDMOPT_MDAMAGE_SIZE_SMALL_USER", 190);
export_constant2("RDMOPT_MDAMAGE_SIZE_MIDIUM_USER", 191);
export_constant2("RDMOPT_MDAMAGE_SIZE_LARGE_USER", 192);
export_constant2("RDMOPT_ATTR_TOLERACE_ALL", 193);
export_constant2("RDMOPT_RACE_WEAPON_TOLERACE_NOTHING", 194);
export_constant2("RDMOPT_RACE_WEAPON_TOLERACE_UNDEAD", 195);
export_constant2("RDMOPT_RACE_WEAPON_TOLERACE_ANIMAL", 196);
export_constant2("RDMOPT_RACE_WEAPON_TOLERACE_PLANT", 197);
export_constant2("RDMOPT_RACE_WEAPON_TOLERACE_INSECT", 198);
export_constant2("RDMOPT_RACE_WEAPON_TOLERACE_FISHS", 199);
export_constant2("RDMOPT_RACE_WEAPON_TOLERACE_DEVIL", 200);
export_constant2("RDMOPT_RACE_WEAPON_TOLERACE_HUMAN", 201);
export_constant2("RDMOPT_RACE_WEAPON_TOLERACE_ANGEL", 202);
export_constant2("RDMOPT_RACE_WEAPON_TOLERACE_DRAGON", 203);
export_constant2("RDMOPT_RACE_TOLERACE_PLAYER_HUMAN", 206);
export_constant2("RDMOPT_RACE_TOLERACE_PLAYER_DORAM", 207);
export_constant2("RDMOPT_RACE_DAMAGE_PLAYER_HUMAN", 208);
export_constant2("RDMOPT_RACE_DAMAGE_PLAYER_DORAM", 209);
export_constant2("RDMOPT_RACE_MDAMAGE_PLAYER_HUMAN", 210);
export_constant2("RDMOPT_RACE_MDAMAGE_PLAYER_DORAM", 211);
export_constant2("RDMOPT_RACE_CRI_PERCENT_PLAYER_HUMAN", 212);
export_constant2("RDMOPT_RACE_CRI_PERCENT_PLAYER_DORAM", 213);
export_constant2("RDMOPT_RACE_IGNORE_DEF_PERCENT_PLAYER_HUMAN", 214);
export_constant2("RDMOPT_RACE_IGNORE_DEF_PERCENT_PLAYER_DORAM", 215);
export_constant2("RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLAYER_HUMAN", 216);
export_constant2("RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLAYER_DORAM", 217);
export_constant2("RDMOPT_MELEE_ATTACK_DAMAGE_TARGET", 219);
export_constant2("RDMOPT_MELEE_ATTACK_DAMAGE_USER", 220);
#undef export_constant2
}