summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/map/atcommand.c74
-rw-r--r--src/map/battle.c4
-rw-r--r--src/map/unit.c82
3 files changed, 113 insertions, 47 deletions
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index ead204fb5..d48dda0db 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -2849,19 +2849,35 @@ ACMD_FUNC(displaystatus)
*------------------------------------------*/
ACMD_FUNC(statuspoint)
{
- int point, new_status_point;
+ int point;
+ unsigned int new_status_point;
if (!message || !*message || (point = atoi(message)) == 0) {
clif_displaymessage(fd, "Please, enter a number (usage: @stpoint <number of points>).");
return -1;
}
- if (point < 0 && sd->status.status_point < -point)
- new_status_point = 0;
+ if(point < 0)
+ {
+ if(sd->status.status_point < (unsigned int)(-point))
+ {
+ new_status_point = 0;
+ }
+ else
+ {
+ new_status_point = sd->status.status_point + point;
+ }
+ }
+ else if(UINT_MAX - sd->status.status_point < (unsigned int)point)
+ {
+ new_status_point = UINT_MAX;
+ }
else
- new_status_point = cap_value((int64)sd->status.status_point + point, 0, INT_MAX);
+ {
+ new_status_point = sd->status.status_point + point;
+ }
- if (new_status_point != (int)sd->status.status_point) {
+ if (new_status_point != sd->status.status_point) {
sd->status.status_point = new_status_point;
clif_updatestatus(sd, SP_STATUSPOINT);
clif_displaymessage(fd, msg_txt(174)); // Number of status points changed.
@@ -2881,7 +2897,8 @@ ACMD_FUNC(statuspoint)
*------------------------------------------*/
ACMD_FUNC(skillpoint)
{
- int point, new_skill_point;
+ int point;
+ unsigned int new_skill_point;
nullpo_retr(-1, sd);
if (!message || !*message || (point = atoi(message)) == 0) {
@@ -2889,12 +2906,27 @@ ACMD_FUNC(skillpoint)
return -1;
}
- if (point < 0 && sd->status.skill_point < -point)
- new_skill_point = 0;
+ if(point < 0)
+ {
+ if(sd->status.skill_point < (unsigned int)(-point))
+ {
+ new_skill_point = 0;
+ }
+ else
+ {
+ new_skill_point = sd->status.skill_point + point;
+ }
+ }
+ else if(UINT_MAX - sd->status.skill_point < (unsigned int)point)
+ {
+ new_skill_point = UINT_MAX;
+ }
else
- new_skill_point = cap_value((int64)sd->status.skill_point + point, 0, INT_MAX);
-
- if (new_skill_point != (int)sd->status.skill_point) {
+ {
+ new_skill_point = sd->status.skill_point + point;
+ }
+
+ if (new_skill_point != sd->status.skill_point) {
sd->status.skill_point = new_skill_point;
clif_updatestatus(sd, SP_SKILLPOINT);
clif_displaymessage(fd, msg_txt(175)); // Number of skill points changed.
@@ -2948,7 +2980,7 @@ ACMD_FUNC(zeny)
*------------------------------------------*/
ACMD_FUNC(param)
{
- int i, value = 0, new_value, max;
+ int i, value = 0, new_value;
const char* param[] = { "str", "agi", "vit", "int", "dex", "luk" };
short* status[6];
//we don't use direct initialization because it isn't part of the c standard.
@@ -2977,10 +3009,20 @@ ACMD_FUNC(param)
status[4] = &sd->status.dex;
status[5] = &sd->status.luk;
- max = SHRT_MAX;
- new_value = cap_value((int64)*status[i] + value, 1, max);
-
- if (new_value != (int)*status[i]) {
+ if(value < 0 && *status[i] < -value)
+ {
+ new_value = 1;
+ }
+ else if(SHRT_MAX - *status[i] < value)
+ {
+ new_value = SHRT_MAX;
+ }
+ else
+ {
+ new_value = *status[i] + value;
+ }
+
+ if (new_value != *status[i]) {
*status[i] = new_value;
clif_updatestatus(sd, SP_STR + i);
clif_updatestatus(sd, SP_USTR + i);
diff --git a/src/map/battle.c b/src/map/battle.c
index acd61b23f..5c6da69e3 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -2770,7 +2770,7 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
break;
case CR_ACIDDEMONSTRATION: // updated the formula based on a Japanese formula found to be exact [Reddozen]
if(tstatus->vit+sstatus->int_) //crash fix
- md.damage = (int64)7*tstatus->vit*sstatus->int_*sstatus->int_ / (10*(tstatus->vit+sstatus->int_));
+ md.damage = (int)((int64)7*tstatus->vit*sstatus->int_*sstatus->int_ / (10*(tstatus->vit+sstatus->int_)));
else
md.damage = 0;
if (tsd) md.damage>>=1;
@@ -2886,7 +2886,7 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
cardfix=cardfix*(100-tsd->long_attack_def_rate)/100;
if (cardfix != 10000)
- md.damage=(int64)md.damage*cardfix/10000;
+ md.damage=(int)((int64)md.damage*cardfix/10000);
}
if (sd && (i = pc_skillatk_bonus(sd, skill_num)))
diff --git a/src/map/unit.c b/src/map/unit.c
index f2dcdc921..05c0bcb16 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -572,46 +572,70 @@ uint8 unit_getdir(struct block_list *bl)
// &1 Do not send position update packets.
int unit_blown(struct block_list* bl, int dx, int dy, int count, int flag)
{
- int nx, ny, ret;
- struct skill_unit* su = BL_CAST(BL_SKILL, bl);
+ int nx, ny, result;
+ struct map_session_data* sd;
+ struct skill_unit* su = NULL;
- ret=path_blownpos(bl->m,bl->x,bl->y,dx,dy,count);
- nx = ret>>16;
- ny = ret&0xffff;
+ if(count)
+ {
+ sd = BL_CAST(BL_PC, bl);
+ su = BL_CAST(BL_SKILL, bl);
- if (!su)
- unit_stop_walking(bl,0);
+ result = path_blownpos(bl->m, bl->x, bl->y, dx, dy, count);
- dx = nx - bl->x;
- dy = ny - bl->y;
+ nx = result>>16;
+ ny = result&0xffff;
- if (!dx && !dy) //Could not knockback.
- return 0;
+ if(!su)
+ {
+ unit_stop_walking(bl, 0);
+ }
- map_foreachinmovearea(clif_outsight, bl, AREA_SIZE, dx, dy, bl->type == BL_PC ? BL_ALL : BL_PC, bl);
+ dx = nx-bl->x;
+ dy = ny-bl->y;
- if(su)
- skill_unit_move_unit_group(su->group,bl->m,dx,dy);
- else
- map_moveblock(bl, nx, ny, gettick());
+ if(dx || dy)
+ {
+ map_foreachinmovearea(clif_outsight, bl, AREA_SIZE, dx, dy, bl->type == BL_PC ? BL_ALL : BL_PC, bl);
- map_foreachinmovearea(clif_insight, bl, AREA_SIZE, -dx, -dy, bl->type == BL_PC ? BL_ALL : BL_PC, bl);
+ if(su)
+ {
+ skill_unit_move_unit_group(su->group, bl->m, dx, dy);
+ }
+ else
+ {
+ map_moveblock(bl, nx, ny, gettick());
+ }
- if(!(flag&0x1))
- clif_blown(bl);
+ map_foreachinmovearea(clif_insight, bl, AREA_SIZE, -dx, -dy, bl->type == BL_PC ? BL_ALL : BL_PC, bl);
- if( bl->type == BL_PC )
- {
- TBL_PC *sd = (TBL_PC*)bl;
- if( sd->touching_id )
- npc_touchnext_areanpc(sd,false);
- if( map_getcell(bl->m,bl->x,bl->y,CELL_CHKNPC) )
- npc_touch_areanpc(sd,bl->m,bl->x,bl->y);
+ if(!(flag&1))
+ {
+ clif_blown(bl);
+ }
+
+ if(sd)
+ {
+ if(sd->touching_id)
+ {
+ npc_touchnext_areanpc(sd, false);
+ }
+ if(map_getcell(bl->m, bl->x, bl->y, CELL_CHKNPC))
+ {
+ npc_touch_areanpc(sd, bl->m, bl->x, bl->y);
+ }
+ else
+ {
+ sd->areanpc_id = 0;
+ }
+ }
+ }
else
- sd->areanpc_id=0;
+ {// could not knockback
+ count = 0;
+ }
}
-
- return count; //Return amount of knocked back cells.
+ return count; // return amount of knocked back cells
}
//Warps a unit/ud to a given map/position.