summaryrefslogtreecommitdiff
path: root/src/map/pc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/pc.cpp')
-rw-r--r--src/map/pc.cpp75
1 files changed, 45 insertions, 30 deletions
diff --git a/src/map/pc.cpp b/src/map/pc.cpp
index 5196f16..63c7614 100644
--- a/src/map/pc.cpp
+++ b/src/map/pc.cpp
@@ -127,23 +127,30 @@ int sp_coefficient_0 = 100;
static //const
earray<interval_t, ItemLook, ItemLook::COUNT> aspd_base_0 //=
{{
-650_ms, // 0 NONE
-700_ms, // 1 BLADE or some other common weapons
-750_ms, // 2
-610_ms, // 3 SETZER_AND_SCYTHE
-2000_ms, // 4
-2000_ms, // 5
-800_ms, // 6 Falchion
-2000_ms, // 7
-700_ms, // 8
-700_ms, // 9
-650_ms, //10 STAFF / Sandcutter
-900_ms, //11 BOW
-2000_ms, //12
-2000_ms, //13
-2000_ms, //14
-2000_ms, //15
-2000_ms, //16
+ 550_ms, // 0 { "Fist", W_FIST },
+ 600_ms, // 1 { "Dagger", W_DAGGER },
+ 650_ms, // 2 { "Sword", W_1HSWORD },
+ 700_ms, // 3 { "TwoHandSword", W_2HSWORD },
+ 650_ms, // 4 { "Spear", W_1HSPEAR },
+ 700_ms, // 5 { "TwoHandSpear", W_2HSPEAR },
+ 700_ms, // 6 { "Axe", W_1HAXE },
+ 750_ms, // 7 { "TwoHandAxe", W_2HAXE },
+ 700_ms, // 8 { "Mace", W_MACE },
+ 750_ms, // 9 { "TwoHandMace", W_2HMACE },
+ 700_ms, // 10 { "Rod", W_STAFF },
+ 800_ms, // 11 { "Bow", W_BOW },
+ 575_ms, // 12 { "Knuckle", W_KNUCKLE },
+ 800_ms, // 13 { "Instrument", W_MUSICAL },
+ 675_ms, // 14 { "Whip", W_WHIP },
+ 700_ms, // 15 { "Book", W_BOOK },
+ 600_ms, // 16 { "Katar", W_KATAR },
+ 600_ms, // 17 { "Revolver", W_REVOLVER },
+ 800_ms, // 18 { "Rifle", W_RIFLE },
+ 500_ms, // 19 { "GatlingGun", W_GATLING },
+ 1000_ms, // 20 { "Shotgun", W_SHOTGUN },
+ 2000_ms, // 21 { "GrenadeLauncher", W_GRENADE },
+ 650_ms, // 22 { "FuumaShuriken", W_HUUMA },
+ 750_ms, // 23 { "TwoHandRod", W_2HSTAFF },
}};
static const
@@ -204,6 +211,7 @@ int exp_table_0[MAX_LEVEL] =
//993241342, 1120376234, 1263784392, 1425548794, 1608019039,
//2147483647, 0
+
// is this *actually* used anywhere?
static const
int exp_table_7[MAX_LEVEL] =
@@ -705,7 +713,7 @@ int pc_setequipindex(dumb_ptr<map_session_data> sd)
}
OMATCH_CASE_NONE ()
{
- sd->weapontype1 = ItemLook::NONE;
+ sd->weapontype1 = ItemLook::W_FIST;
}
}
OMATCH_END ();
@@ -842,7 +850,7 @@ int pc_authok(AccountId id, int login_id2, ClientVersion client_version,
sd->state.connect_new = 1;
sd->bl_prev = sd->bl_next = nullptr;
- sd->weapontype1 = ItemLook::NONE;
+ sd->weapontype1 = ItemLook::W_FIST;
sd->speed = DEFAULT_WALK_SPEED;
sd->state.dead_sit = 0;
sd->dir = DIR::S;
@@ -1130,7 +1138,7 @@ int pc_calcstatus(dumb_ptr<map_session_data> sd, int first)
earray<SkillValue, SkillID, MAX_SKILL> b_skill = sd->status.skill;
b_hit = sd->hit;
b_flee = sd->flee;
- interval_t b_aspd = sd->aspd;
+ interval_t b_aspd = sd->aspd, b_base_weapon_delay_adjust = interval_t::zero();
b_watk = sd->watk;
b_def = sd->def;
b_watk2 = sd->watk2;
@@ -1172,7 +1180,7 @@ int pc_calcstatus(dumb_ptr<map_session_data> sd, int first)
sd->flee = 0;
sd->flee2 = 0;
sd->critical = 0;
- sd->aspd = interval_t::zero();
+ sd->aspd = sd->base_weapon_delay_adjust = interval_t::zero();
sd->watk = 0;
sd->def = 0;
sd->mdef = 0;
@@ -1336,7 +1344,7 @@ int pc_calcstatus(dumb_ptr<map_session_data> sd, int first)
if (sd->attackrange < 1)
sd->attackrange = 1;
- if (sd->status.weapon == ItemLook::BOW)
+ if (sd->status.weapon == ItemLook::W_BOW)
sd->attackrange += sd->arrow_range;
sd->double_rate += sd->double_add_rate;
sd->perfect_hit += sd->perfect_hit_add_rate;
@@ -1354,7 +1362,7 @@ int pc_calcstatus(dumb_ptr<map_session_data> sd, int first)
for (ATTR attr : ATTRs)
sd->paramc[attr] = std::max(0, sd->status.attrs[attr] + sd->paramb[attr] + sd->parame[attr]);
- if (sd->status.weapon == ItemLook::BOW)
+ if (sd->status.weapon == ItemLook::W_BOW)
{
str = sd->paramc[ATTR::DEX];
dex = sd->paramc[ATTR::STR];
@@ -1448,9 +1456,12 @@ int pc_calcstatus(dumb_ptr<map_session_data> sd, int first)
//二刀流 ASPD 修正 | Two-cut ASPD correction
{
- sd->aspd += aspd_base_0[sd->status.weapon]
+ b_base_weapon_delay_adjust = aspd_base_0[sd->status.weapon] + sd->base_weapon_delay_adjust;
+ if (b_base_weapon_delay_adjust.count() < 0)
+ b_base_weapon_delay_adjust = interval_t::zero();
+ sd->aspd += b_base_weapon_delay_adjust
- (sd->paramc[ATTR::AGI] * 4 + sd->paramc[ATTR::DEX])
- * aspd_base_0[sd->status.weapon] / 1000;
+ * b_base_weapon_delay_adjust / 1000;
}
aspd_rate = sd->aspd_rate;
@@ -1877,6 +1888,10 @@ int pc_bonus(dumb_ptr<map_session_data> sd, SP type, int val)
if (!sd->state.lr_flag_is_arrow_2)
sd->deadly_strike_add_rate += val;
break;
+ case SP::BASE_WEAPON_DELAY_ADJUST:
+ if (!sd->state.lr_flag_is_arrow_2)
+ sd->base_weapon_delay_adjust += interval_t(val);
+ break;
default:
if (battle_config.error_log)
PRINTF("pc_bonus: unknown type %d %d !\n"_fmt,
@@ -2897,7 +2912,7 @@ void pc_attack_timer(TimerData *, tick_t tick, BlockId id)
{
dist = distance(sd->bl_x, sd->bl_y, bl->bl_x, bl->bl_y);
range = sd->attackrange;
- if (sd->status.weapon != ItemLook::BOW)
+ if (sd->status.weapon != ItemLook::W_BOW)
range++;
if (dist > range)
{ //届 かないので移動 | Move because it does not arrive
@@ -4829,11 +4844,11 @@ int pc_equipitem(dumb_ptr<map_session_data> sd, IOff0 n, EPOS)
sd->status.inventory[n].equip = pos;
ItemNameId view_i;
- ItemLook view_l = ItemLook::NONE;
+ ItemLook view_l = ItemLook::W_FIST;
// TODO: This is ugly.
OMATCH_BEGIN_SOME (sdidn, sd->inventory_data[n])
{
- bool look_not_weapon = sdidn->look == ItemLook::NONE;
+ bool look_not_weapon = sdidn->look == ItemLook::W_FIST;
bool equip_is_weapon = bool(sd->status.inventory[n].equip & EPOS::WEAPON);
assert (look_not_weapon != equip_is_weapon);
@@ -4922,9 +4937,9 @@ int pc_unequipitem(dumb_ptr<map_session_data> sd, IOff0 n, CalcStatus type)
}
if (bool(sd->status.inventory[n].equip & EPOS::WEAPON))
{
- sd->weapontype1 = ItemLook::NONE;
+ sd->weapontype1 = ItemLook::W_FIST;
// when reading the diff, think twice about this
- sd->status.weapon = ItemLook::NONE;
+ sd->status.weapon = ItemLook::W_FIST;
pc_calcweapontype(sd);
pc_set_weapon_look(sd);
}