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:
parent
b49e7a0dd9
commit
be9babee32
231
db/const.txt
231
db/const.txt
@ -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
|
||||
|
@ -1,4 +0,0 @@
|
||||
// Items Random Option Database
|
||||
//
|
||||
// Structure of Database:
|
||||
// ID,{ Bonus Script }
|
32
db/import-tmpl/item_randomopt_db.yml
Normal file
32
db/import-tmpl/item_randomopt_db.yml
Normal 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
|
@ -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>}
|
46
db/import-tmpl/item_randomopt_group.yml
Normal file
46
db/import-tmpl/item_randomopt_group.yml
Normal 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
38
db/item_randomopt_db.yml
Normal 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
|
52
db/item_randomopt_group.yml
Normal file
52
db/item_randomopt_group.yml
Normal 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
|
@ -1,4 +0,0 @@
|
||||
// Items Random Option Database
|
||||
//
|
||||
// Structure of Database:
|
||||
// ID,{ Bonus Script }
|
@ -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>}
|
@ -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
891
db/re/item_randomopt_db.yml
Normal 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);
|
@ -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
|
7456
db/re/item_randomopt_group.yml
Normal file
7456
db/re/item_randomopt_group.yml
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
11
doc/yaml/db/item_randomopt_db.yml
Normal file
11
doc/yaml/db/item_randomopt_db.yml
Normal 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.
|
||||
###########################################################################
|
25
doc/yaml/db/item_randomopt_group.yml
Normal file
25
doc/yaml/db/item_randomopt_group.yml
Normal 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)
|
||||
###########################################################################
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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')" />
|
||||
|
112
src/map/mob.cpp
112
src/map/mob.cpp
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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))
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user