From 67bf4970c20f18a55cab7adde58ef346f3d2ad1e Mon Sep 17 00:00:00 2001 From: HoraK-FDF Date: Fri, 16 Dec 2022 11:21:49 +0100 Subject: mobs critical_def + 10 drops + storage 500 --- src/map/atcommand.cpp | 4 +-- src/map/battle.cpp | 2 ++ src/map/mob.cpp | 9 +++++ src/map/mob.hpp | 4 +-- src/map/script-fun.cpp | 29 +++++++++++++++ src/map/script-fun.t.hpp | 93 ++++++++++++++++++++++++++---------------------- src/mmo/consts.hpp | 6 ++-- 7 files changed, 98 insertions(+), 49 deletions(-) (limited to 'src') diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index f5ca72d..d7d47c9 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -1852,7 +1852,7 @@ ATCE atcommand_mobinfo(Session *s, dumb_ptr sd, clif_displaymessage(s, STRPRINTF("Monster ID: %i, English Name: %s, Japanese Name: %s"_fmt, mob_id, get_mob_db(mob_id).name, get_mob_db(mob_id).jname)); clif_displaymessage(s, STRPRINTF("Level: %i, HP: %i, SP: %i, Base EXP: %i, JEXP: %i"_fmt, get_mob_db(mob_id).lv, get_mob_db(mob_id).max_hp, get_mob_db(mob_id).max_sp, get_mob_db(mob_id).base_exp, get_mob_db(mob_id).job_exp)); - clif_displaymessage(s, STRPRINTF("Range1: %i, ATK1: %i, ATK2: %i, DEF: %i, MDEF: %i"_fmt, get_mob_db(mob_id).range, get_mob_db(mob_id).atk1, get_mob_db(mob_id).atk2, get_mob_db(mob_id).def, get_mob_db(mob_id).mdef)); + clif_displaymessage(s, STRPRINTF("Range1: %i, ATK1: %i, ATK2: %i, DEF: %i, MDEF: %i, CRITICAL_DEF: %i"_fmt, get_mob_db(mob_id).range, get_mob_db(mob_id).atk1, get_mob_db(mob_id).atk2, get_mob_db(mob_id).def, get_mob_db(mob_id).mdef, get_mob_db(mob_id).critical_def)); clif_displaymessage(s, STRPRINTF("Stats: STR: %i, AGI: %i, VIT: %i, INT: %i, DEX:, %i LUK:, %i"_fmt, get_mob_db(mob_id).attrs[ATTR::STR], get_mob_db(mob_id).attrs[ATTR::AGI], get_mob_db(mob_id).attrs[ATTR::VIT], get_mob_db(mob_id).attrs[ATTR::INT], get_mob_db(mob_id).attrs[ATTR::DEX], get_mob_db(mob_id).attrs[ATTR::LUK])); clif_displaymessage(s, STRPRINTF("Range2: %i, Range3: %i, Scale: %i, Race: %i, Element: %i, Element Level: %i, Mode: %i"_fmt, get_mob_db(mob_id).range2, get_mob_db(mob_id).range3, get_mob_db(mob_id).size, get_mob_db(mob_id).race, get_mob_db(mob_id).element.element, get_mob_db(mob_id).element.level, get_mob_db(mob_id).mode)); clif_displaymessage(s, STRPRINTF("Speed: %i, Adelay: %i, Amotion: %i, Dmotion: %i"_fmt, get_mob_db(mob_id).speed.count(), get_mob_db(mob_id).adelay.count(), get_mob_db(mob_id).amotion.count(), get_mob_db(mob_id).dmotion.count())); @@ -1922,7 +1922,7 @@ ATCE atcommand_mobinfo(Session *s, dumb_ptr sd, str[strpos] = '\0'; int drop_rate2 = 10000/drop_rate; - clif_displaymessage(s, STRPRINTF("Drop ID %i: %i, Item Name: %s, Drop Chance: %s%% (1:%i)"_fmt,i+1, get_mob_db(mob_id).dropitem[i].nameid, item_name, str, drop_rate2)); + clif_displaymessage(s, STRPRINTF("Drop ID %i: %i, Item Name: %s, Drop Chance: %s%% (1:%i)"_fmt,i, get_mob_db(mob_id).dropitem[i].nameid, item_name, str, drop_rate2)); } else break; diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 52be591..3b7c6b2 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1592,6 +1592,8 @@ struct Damage battle_calc_pc_weapon_attack(dumb_ptr src, if (tsd && tsd->critical_def) cri = cri * (100 - tsd->critical_def) / 100; + else if (tmd && tmd->stats[mob_stat::CRITICAL_DEF]) + cri = cri * (100 - tmd->stats[mob_stat::CRITICAL_DEF]) / 100; // ダブルアタックが発動していない | Double Attack is not activated // 判定(スキルの場合は無視) | Judgment (ignored for skills) diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 0f273a8..715a9cb 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -173,6 +173,7 @@ earray mutation_value //= 2, // mob_stat::DEF 2, // mob_stat::MDEF 2, // mob_stat::SPEED + 2, // mob_stat::CRITICAL_DEF }}; // The mutation scale indicates how far `up' we can go, with 256 indicating 100% Note that this may stack with multiple @@ -194,6 +195,7 @@ earray mutation_scale //= 48, // mob_stat::DEF 48, // mob_stat::MDEF 80, // mob_stat::SPEED + 128, // mob_stat::CRITICAL_DEF }}; // The table below indicates the `average' value for each of the statistics, or -1 if there is none. @@ -220,6 +222,7 @@ earray mutation_base //= -1, // mob_stat::DEF 20, // mob_stat::MDEF -1, // mob_stat::SPEED + -1, // mob_stat::CRITICAL_DEF }}; /*======================================== @@ -361,6 +364,7 @@ void mob_init(dumb_ptr md) md->stats[mob_stat::ADELAY] = get_mob_db(mob_class).adelay.count(); md->stats[mob_stat::DEF] = get_mob_db(mob_class).def; md->stats[mob_stat::MDEF] = get_mob_db(mob_class).mdef; + md->stats[mob_stat::CRITICAL_DEF] = get_mob_db(mob_class).critical_def; md->stats[mob_stat::SPEED] = get_mob_db(mob_class).speed.count(); md->stats[mob_stat::XP_BONUS] = MOB_XP_BONUS_BASE; @@ -3495,6 +3499,7 @@ bool mob_readdb(ZString filename) lstripping(&mdbv.atk2), lstripping(&mdbv.def), lstripping(&mdbv.mdef), + lstripping(&mdbv.critical_def), lstripping(&mdbv.attrs[ATTR::STR]), lstripping(&mdbv.attrs[ATTR::AGI]), lstripping(&mdbv.attrs[ATTR::VIT]), @@ -3527,6 +3532,10 @@ bool mob_readdb(ZString filename) lstripping(&mdbv.dropitem[6].p.num), lstripping(&mdbv.dropitem[7].nameid), lstripping(&mdbv.dropitem[7].p.num), + lstripping(&mdbv.dropitem[8].nameid), + lstripping(&mdbv.dropitem[8].p.num), + lstripping(&mdbv.dropitem[9].nameid), + lstripping(&mdbv.dropitem[9].p.num), &ignore, &ignore, &ignore, diff --git a/src/map/mob.hpp b/src/map/mob.hpp index 47da095..3aa7fc5 100644 --- a/src/map/mob.hpp +++ b/src/map/mob.hpp @@ -43,7 +43,7 @@ namespace map #define JAPANESE_NAME stringish("--ja--"_s) #define MOB_THIS_MAP stringish("this"_s) -#define MaxDrops 8 +#define MaxDrops 10 #define MinMobID 1001 #define MaxMobID 2000 @@ -69,7 +69,7 @@ struct mob_db_ int max_hp, max_sp; int base_exp, job_exp; int atk1, atk2; - int def, mdef; + int def, mdef, critical_def; earray attrs; int range, range2, range3; // always 1 diff --git a/src/map/script-fun.cpp b/src/map/script-fun.cpp index e42dcd2..9ee76a2 100644 --- a/src/map/script-fun.cpp +++ b/src/map/script-fun.cpp @@ -2700,6 +2700,9 @@ void builtin_mobinfo(ScriptState *st) case MobInfo::MDEF: info = get_mob_db(mob_id).mdef; break; + case MobInfo::CRITICAL_DEF: + info = get_mob_db(mob_id).critical_def; + break; case MobInfo::STR: info = get_mob_db(mob_id).attrs[ATTR::STR]; break; @@ -2757,6 +2760,19 @@ void builtin_mobinfo(ScriptState *st) case MobInfo::MUTATION_POWER: info = get_mob_db(mob_id).mutation_power; break; + case MobInfo::DROPID0: + info = unwrap(get_mob_db(mob_id).dropitem[0].nameid); + break; + case MobInfo::DROPNAME0: + { + Option> i_data = Some(itemdb_search(get_mob_db(mob_id).dropitem[0].nameid)); + info_str = i_data.pmd_pget(&item_data::name).copy_or(stringish(""_s)); + mode = 1; + } + break; + case MobInfo::DROPPERCENT0: + info = get_mob_db(mob_id).dropitem[0].p.num; + break; case MobInfo::DROPID1: info = unwrap(get_mob_db(mob_id).dropitem[0].nameid); break; @@ -2861,6 +2877,19 @@ void builtin_mobinfo(ScriptState *st) case MobInfo::DROPPERCENT8: info = get_mob_db(mob_id).dropitem[7].p.num; break; + case MobInfo::DROPID9: + info = unwrap(get_mob_db(mob_id).dropitem[7].nameid); + break; + case MobInfo::DROPNAME9: + { + Option> i_data = Some(itemdb_search(get_mob_db(mob_id).dropitem[7].nameid)); + info_str = i_data.pmd_pget(&item_data::name).copy_or(stringish(""_s)); + mode = 1; + } + break; + case MobInfo::DROPPERCENT9: + info = get_mob_db(mob_id).dropitem[7].p.num; + break; default: PRINTF("builtin_mobinfo: unknown request\n"_fmt); push_int(st->stack, -1); diff --git a/src/map/script-fun.t.hpp b/src/map/script-fun.t.hpp index d0c753b..6cc2683 100644 --- a/src/map/script-fun.t.hpp +++ b/src/map/script-fun.t.hpp @@ -41,49 +41,56 @@ enum class MobInfo : uint8_t ATK2 = 10, DEF = 11, MDEF = 12, - STR = 13, - AGI = 14, - VIT = 15, - INT = 16, - DEX = 17, - LUK = 18, - RANGE2 = 19, - RANGE3 = 20, - SCALE = 21, - RACE = 22, - ELEMENT = 23, - ELEMENT_LVL = 24, - MODE = 25, - SPEED = 26, - ADELAY = 27, - AMOTION = 28, - DMOTION = 29, - MUTATION_NUM = 30, - MUTATION_POWER = 31, - DROPID1 = 32, - DROPNAME1 = 33, - DROPPERCENT1 = 34, - DROPID2 = 35, - DROPNAME2 = 36, - DROPPERCENT2 = 37, - DROPID3 = 38, - DROPNAME3 = 39, - DROPPERCENT3 = 40, - DROPID4 = 41, - DROPNAME4 = 42, - DROPPERCENT4 = 43, - DROPID5 = 44, - DROPNAME5 = 45, - DROPPERCENT5 = 46, - DROPID6 = 47, - DROPNAME6 = 48, - DROPPERCENT6 = 49, - DROPID7 = 50, - DROPNAME7 = 51, - DROPPERCENT7 = 52, - DROPID8 = 53, - DROPNAME8 = 54, - DROPPERCENT8 = 55, + CRITICAL_DEF = 13, + STR = 14, + AGI = 15, + VIT = 16, + INT = 17, + DEX = 18, + LUK = 19, + RANGE2 = 20, + RANGE3 = 21, + SCALE = 22, + RACE = 23, + ELEMENT = 24, + ELEMENT_LVL = 25, + MODE = 26, + SPEED = 27, + ADELAY = 28, + AMOTION = 29, + DMOTION = 30, + MUTATION_NUM = 31, + MUTATION_POWER = 32, + DROPID0 = 33, + DROPNAME0 = 34, + DROPPERCENT0 = 35, + DROPID1 = 36, + DROPNAME1 = 37, + DROPPERCENT1 = 38, + DROPID2 = 39, + DROPNAME2 = 40, + DROPPERCENT2 = 41, + DROPID3 = 42, + DROPNAME3 = 43, + DROPPERCENT3 = 44, + DROPID4 = 45, + DROPNAME4 = 46, + DROPPERCENT4 = 47, + DROPID5 = 48, + DROPNAME5 = 49, + DROPPERCENT5 = 50, + DROPID6 = 51, + DROPNAME6 = 52, + DROPPERCENT6 = 53, + DROPID7 = 54, + DROPNAME7 = 55, + DROPPERCENT7 = 56, + DROPID8 = 57, + DROPNAME8 = 58, + DROPPERCENT8 = 59, + DROPID9 = 60, + DROPNAME9 = 61, + DROPPERCENT9 = 62, }; enum class MobInfo_DropArrays : uint8_t diff --git a/src/mmo/consts.hpp b/src/mmo/consts.hpp index 5445186..d56facd 100644 --- a/src/mmo/consts.hpp +++ b/src/mmo/consts.hpp @@ -36,7 +36,9 @@ constexpr int MAX_MAP_PER_SERVER = 512; constexpr int MAX_INVENTORY = 100; constexpr int MAX_AMOUNT = 30000; constexpr int MAX_ZENY = 1000000000; // 1G zeny -constexpr int TRADE_MAX = 10; +constexpr int TRADE_MAX = 12; +// M+ 1.9.3.23 only supports 12 items in trade window it will make the trade with more but brings error messages for every item above 12. +// So I let it 12 for now until ManaVerse (with cuocos fix) is the only client. constexpr int GLOBAL_REG_NUM = 96; constexpr size_t ACCOUNT_REG_NUM = 16; @@ -44,7 +46,7 @@ constexpr size_t ACCOUNT_REG2_NUM = 16; constexpr interval_t DEFAULT_WALK_SPEED = 150_ms; constexpr interval_t MIN_WALK_SPEED = interval_t::zero(); constexpr interval_t MAX_WALK_SPEED = 1_s; -constexpr int MAX_STORAGE = 300; +constexpr int MAX_STORAGE = 500; constexpr int MAX_PARTY = 120; #define MIN_HAIR_STYLE battle_config.min_hair_style -- cgit v1.2.3-60-g2f50