summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt1
-rw-r--r--src/map/status.c32
2 files changed, 17 insertions, 16 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 8c3390011..25030ceae 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,7 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2006/05/29
+ * Corrected aspd calculation code to avoid negative overflows. [Skotlex]
* Fixed battle_check_target check on BCT_ALL to check versus BL_CHAR
instead of BL_PC and BL_MOB [Skotlex]
* [Fixed]:
diff --git a/src/map/status.c b/src/map/status.c
index 1af6228b1..3d574d314 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -51,6 +51,9 @@ int current_equip_card_id; //To prevent card-stacking (from jA) [Skotlex]
//we need it for new cards 15 Feb 2005, to check if the combo cards are insrerted into the CURRENT weapon only
//to avoid cards exploits
+//Caps values to min/max
+#define cap_value(a, min, max) (a>max?max:a<min?min:a)
+
//Initializes the StatusIconChangeTable variable. May seem somewhat slower than directly defining the array,
//but it is much less prone to errors. [Skotlex]
void initChangeTables(void) {
@@ -1737,15 +1740,17 @@ int status_calc_pc(struct map_session_data* sd,int first)
// Basic ASPD value
if (sd->status.weapon < MAX_WEAPON_TYPE)
- status->amotion = aspd_base[sd->status.class_][sd->status.weapon]-(status->agi*4+status->dex)*aspd_base[sd->status.class_][sd->status.weapon]/1000;
+ i = aspd_base[sd->status.class_][sd->status.weapon]-(status->agi*4+status->dex)*aspd_base[sd->status.class_][sd->status.weapon]/1000;
else
- status->amotion = (
+ i = (
(aspd_base[sd->status.class_][sd->weapontype1]
-(status->agi*4+status->dex)*aspd_base[sd->status.class_][sd->weapontype1]/1000) +
(aspd_base[sd->status.class_][sd->weapontype2]
-(status->agi*4+status->dex)*aspd_base[sd->status.class_][sd->weapontype2]/1000)
) *2/3; //From what I read in rodatazone, 2/3 should be more accurate than 0.7 -> 140 / 200; [Skotlex]
+ status->amotion = cap_value(i,battle_config.max_aspd,2000);
+
// Relative modifiers from passive skills
if((skill=pc_checkskill(sd,SA_ADVANCEDBOOK))>0 && sd->status.weapon == W_BOOK)
status->aspd_rate -= (skill/2);
@@ -2168,9 +2173,9 @@ void status_calc_bl_sub_pc(struct map_session_data *sd, unsigned long flag)
if(flag&(SCB_ASPD|SCB_AGI|SCB_DEX)) {
if (sd->status.weapon < MAX_WEAPON_TYPE)
- status->amotion = aspd_base[sd->status.class_][sd->status.weapon]-(status->agi*4+status->dex)*aspd_base[sd->status.class_][sd->status.weapon]/1000;
+ skill = aspd_base[sd->status.class_][sd->status.weapon]-(status->agi*4+status->dex)*aspd_base[sd->status.class_][sd->status.weapon]/1000;
else
- status->amotion = (
+ skill = (
(aspd_base[sd->status.class_][sd->weapontype1]
-(status->agi*4+status->dex)*aspd_base[sd->status.class_][sd->weapontype1]/1000) +
(aspd_base[sd->status.class_][sd->weapontype2]
@@ -2181,10 +2186,9 @@ void status_calc_bl_sub_pc(struct map_session_data *sd, unsigned long flag)
// Apply all relative modifiers
if(status->aspd_rate != 100)
- status->amotion = status->amotion*status->aspd_rate/100;
+ skill = skill *status->aspd_rate/100;
- if(status->amotion < battle_config.max_aspd)
- status->amotion = battle_config.max_aspd;
+ status->amotion = cap_value(skill,battle_config.max_aspd,2000);
status->adelay = 2*status->amotion;
if ((skill=pc_checkskill(sd,SA_FREECAST))>0) {
@@ -2464,20 +2468,16 @@ void status_calc_bl(struct block_list *bl, unsigned long flag)
if(flag&SCB_ASPD) {
status->aspd_rate = status_calc_aspd_rate(bl, sc , b_status->aspd_rate);
- status->amotion = status->aspd_rate*b_status->amotion/100;
- status->adelay = status->aspd_rate*b_status->adelay/100;
-
- if(status->adelay < battle_config.monster_max_aspd<<1)
- status->adelay = battle_config.monster_max_aspd<<1;
- if(status->amotion < battle_config.monster_max_aspd)
- status->amotion = battle_config.monster_max_aspd;
+ temp = status->aspd_rate*b_status->amotion/100;
+ status->amotion = cap_value(temp, battle_config.monster_max_aspd, 2000);
+
+ temp = status->aspd_rate*b_status->adelay/100;
+ status->adelay = cap_value(temp, battle_config.monster_max_aspd<<1, 4000);
}
if(flag&SCB_DSPD)
status->dmotion = status_calc_dmotion(bl, sc, b_status->dmotion);
}
-//Caps values to min/max
-#define cap_value(a, min, max) (a>max?max:a<min?min:a)
/*==========================================
* Apply shared stat mods from status changes [DracoRPG]
*------------------------------------------