diff options
author | Haru <haru@dotalux.com> | 2015-12-20 02:24:07 +0100 |
---|---|---|
committer | Haru <haru@dotalux.com> | 2016-01-29 10:58:57 +0100 |
commit | 8121e1d12dca0c85892ad45f0bb765e7eba770aa (patch) | |
tree | e2a322db5989a8c657dbd3fd9b697c14eb48d291 /src/map/vending.c | |
parent | b7c5b53cccac17765fd7445b390853f5a0eb1a4d (diff) | |
download | hercules-8121e1d12dca0c85892ad45f0bb765e7eba770aa.tar.gz hercules-8121e1d12dca0c85892ad45f0bb765e7eba770aa.tar.bz2 hercules-8121e1d12dca0c85892ad45f0bb765e7eba770aa.tar.xz hercules-8121e1d12dca0c85892ad45f0bb765e7eba770aa.zip |
Replaced several floating-point operations with integer operations
This fixes several rounding errors happening in various places (i.e.
the base exp for HORONG being calculated as 819 instead of 820 when the
server rates are set to 1x)
Signed-off-by: Haru <haru@dotalux.com>
Diffstat (limited to 'src/map/vending.c')
-rw-r--r-- | src/map/vending.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/map/vending.c b/src/map/vending.c index 810e6b07a..6e74e6c3e 100644 --- a/src/map/vending.c +++ b/src/map/vending.c @@ -89,7 +89,7 @@ void vending_vendinglistreq(struct map_session_data* sd, unsigned int id) { *------------------------------------------*/ void vending_purchasereq(struct map_session_data* sd, int aid, unsigned int uid, const uint8* data, int count) { int i, j, cursor, w, new_ = 0, blank, vend_list[MAX_VENDING]; - double z; + int64 z; struct s_vending vend[MAX_VENDING]; // against duplicate packets struct map_session_data* vsd = map->id2sd(aid); @@ -116,7 +116,7 @@ void vending_purchasereq(struct map_session_data* sd, int aid, unsigned int uid, memcpy(&vend, &vsd->vending, sizeof(vsd->vending)); // copy vending list // some checks - z = 0.; // zeny counter + z = 0; // zeny counter w = 0; // weight counter for( i = 0; i < count; i++ ) { short amount = *(uint16*)(data + 4*i + 0); @@ -136,12 +136,12 @@ void vending_purchasereq(struct map_session_data* sd, int aid, unsigned int uid, else vend_list[i] = j; - z += ((double)vsd->vending[j].value * (double)amount); - if( z > (double)sd->status.zeny || z < 0. || z > (double)MAX_ZENY ) { + z += (int64)vsd->vending[j].value * amount; + if (z > sd->status.zeny || z < 0 || z > MAX_ZENY) { clif->buyvending(sd, idx, amount, 1); // you don't have enough zeny return; } - if( z + (double)vsd->status.zeny > (double)MAX_ZENY && !battle_config.vending_over_max ) { + if (z > MAX_ZENY - vsd->status.zeny && !battle_config.vending_over_max) { clif->buyvending(sd, idx, vsd->vending[j].amount, 4); // too much zeny = overflow return; @@ -181,7 +181,7 @@ void vending_purchasereq(struct map_session_data* sd, int aid, unsigned int uid, pc->payzeny(sd, (int)z, LOG_TYPE_VENDING, vsd); if( battle_config.vending_tax ) - z -= z * (battle_config.vending_tax/10000.); + z -= apply_percentrate64(z, battle_config.vending_tax, 10000); pc->getzeny(vsd, (int)z, LOG_TYPE_VENDING, sd); for( i = 0; i < count; i++ ) { |