diff options
Diffstat (limited to 'src/map/mob.cpp')
-rw-r--r-- | src/map/mob.cpp | 435 |
1 files changed, 186 insertions, 249 deletions
diff --git a/src/map/mob.cpp b/src/map/mob.cpp index d1f431f..cb7ef89 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -1,29 +1,26 @@ -// $Id: mob.c,v 1.7 2004/09/25 05:32:18 MouseJstr Exp $ -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> +#include "mob.hpp" + +#include <cmath> +#include <stdarg.h> // requires justification for <cstdarg> +#include <cstdio> +#include <cstdlib> +#include <cstring> -#include "../common/timer.hpp" -#include "../common/socket.hpp" #include "../common/db.hpp" -#include "../common/nullpo.hpp" #include "../common/mt_rand.hpp" -#include "map.hpp" +#include "../common/nullpo.hpp" +#include "../common/socket.hpp" +#include "../common/timer.hpp" + +#include "battle.hpp" #include "clif.hpp" #include "intif.hpp" -#include "pc.hpp" -#include "mob.hpp" #include "itemdb.hpp" -#include "skill.hpp" -#include "battle.hpp" -#include "party.hpp" +#include "map.hpp" #include "npc.hpp" - -#ifdef MEMWATCH -#include "memwatch.hpp" -#endif +#include "party.hpp" +#include "pc.hpp" +#include "skill.hpp" #ifndef max #define max( a, b ) (((a) > (b)) ? (a) : (b) ) @@ -47,8 +44,6 @@ int mob_makedummymobdb(int); static void mob_timer(timer_id, tick_t, custom_id_t, custom_data_t); static -int mobskill_deltimer(struct mob_data *md); -static int mob_skillid2skillidx(int mob_class, SkillID skillid); static int mobskill_use_id(struct mob_data *md, struct block_list *target, @@ -89,7 +84,8 @@ int mobdb_checkid(const int id) return id; } -static void mob_init(struct mob_data *md); +static +void mob_init(struct mob_data *md); /*========================================== * The minimum data set for MOB spawning @@ -126,7 +122,8 @@ int mob_spawn_dataset(struct mob_data *md, const char *mobname, int mob_class) // Mutation values indicate how `valuable' a change to each stat is, XP wise. // For one 256th of change, we give out that many 1024th fractions of XP change // (i.e., 1024 means a 100% XP increase for a single point of adjustment, 4 means 100% XP bonus for doubling the value) -static int mutation_value[MOB_XP_BONUS] = { +static +int mutation_value[MOB_XP_BONUS] = { 2, // MOB_LV 3, // MOB_MAX_HP 1, // MOB_STR @@ -145,7 +142,8 @@ static int mutation_value[MOB_XP_BONUS] = { // The mutation scale indicates how far `up' we can go, with 256 indicating 100% Note that this may stack with multiple // calls to `mutate'. -static int mutation_scale[MOB_XP_BONUS] = { +static +int mutation_scale[MOB_XP_BONUS] = { 16, // MOB_LV 256, // MOB_MAX_HP 32, // MOB_STR @@ -169,7 +167,8 @@ static int mutation_scale[MOB_XP_BONUS] = { // (2) second, determine the absolute stat change // (3) third, compute the percentage stat change relative to mutation_base (p1) // (4) fourth, compute the XP mofication based on the smaller of (p0, p1). -static int mutation_base[MOB_XP_BONUS] = { +static +int mutation_base[MOB_XP_BONUS] = { 30, // MOB_LV -1, // MOB_MAX_HP 20, // MOB_STR @@ -190,7 +189,8 @@ static int mutation_base[MOB_XP_BONUS] = { * Mutates a MOB. For large `direction' values, calling this multiple times will give bigger XP boni. *---------------------------------------- */ -static void mob_mutate(struct mob_data *md, int stat, int intensity) // intensity: positive: strengthen, negative: weaken. 256 = 100%. +static +void mob_mutate(struct mob_data *md, int stat, int intensity) // intensity: positive: strengthen, negative: weaken. 256 = 100%. { int old_stat; int new_stat; @@ -296,7 +296,8 @@ int mob_gen_exp(struct mob_db *mob) return xp; } -static void mob_init(struct mob_data *md) +static +void mob_init(struct mob_data *md) { int i; const int mob_class = md->mob_class; @@ -492,13 +493,10 @@ int mob_once_spawn_area(struct map_session_data *sd, const char *mapname, */ int mob_spawn_guardian(struct map_session_data *sd, const char *mapname, int x, int y, const char *mobname, int mob_class, - int amount, const char *event, int guardian) + int amount, const char *event, int) { struct mob_data *md = NULL; - int m, count = 1, lv = 255; - - if (sd) - lv = sd->status.base_level; + int m, count = 1; if (sd && strcmp(mapname, "this") == 0) m = sd->bl.m; @@ -634,7 +632,8 @@ int mob_can_move(struct mob_data *md) * Time calculation concerning one step next to mob *------------------------------------------ */ -static int calc_next_walk_step(struct mob_data *md) +static +int calc_next_walk_step(struct mob_data *md) { nullpo_retr(0, md); @@ -645,13 +644,15 @@ static int calc_next_walk_step(struct mob_data *md) return battle_get_speed(&md->bl); } -static int mob_walktoxy_sub(struct mob_data *md); +static +int mob_walktoxy_sub(struct mob_data *md); /*========================================== * Mob Walk processing *------------------------------------------ */ -static int mob_walk(struct mob_data *md, unsigned int tick, int data) +static +int mob_walk(struct mob_data *md, unsigned int tick, int data) { int moveblock; int i, ctype; @@ -704,9 +705,10 @@ static int mob_walk(struct mob_data *md, unsigned int tick, int data) || y / BLOCK_SIZE != (y + dy) / BLOCK_SIZE); md->state.state = MS_WALK; - map_foreachinmovearea(clif_moboutsight, md->bl.m, x - AREA_SIZE, - y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE, - dx, dy, BL_PC, md); + map_foreachinmovearea(std::bind(clif_moboutsight, ph::_1, md), + md->bl.m, x - AREA_SIZE, y - AREA_SIZE, + x + AREA_SIZE, y + AREA_SIZE, + dx, dy, BL_PC); x += dx; y += dy; @@ -720,9 +722,10 @@ static int mob_walk(struct mob_data *md, unsigned int tick, int data) if (moveblock) map_addblock(&md->bl); - map_foreachinmovearea(clif_mobinsight, md->bl.m, x - AREA_SIZE, - y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE, - -dx, -dy, BL_PC, md); + map_foreachinmovearea(std::bind(clif_mobinsight, ph::_1, md), + md->bl.m, x - AREA_SIZE, y - AREA_SIZE, + x + AREA_SIZE, y + AREA_SIZE, + -dx, -dy, BL_PC); md->state.state = MS_IDLE; if (md->option & 4) @@ -749,7 +752,8 @@ static int mob_walk(struct mob_data *md, unsigned int tick, int data) * Check if mob should be attempting to attack *------------------------------------------ */ -static int mob_check_attack(struct mob_data *md) +static +int mob_check_attack(struct mob_data *md) { struct block_list *tbl = NULL; struct map_session_data *tsd = NULL; @@ -843,11 +847,9 @@ static int mob_check_attack(struct mob_data *md) } static -void mob_ancillary_attack(struct block_list *bl, va_list ap) +void mob_ancillary_attack(struct block_list *bl, + struct block_list *mdbl, struct block_list *tbl, unsigned int tick) { - struct block_list *mdbl = va_arg(ap, struct block_list *); - struct block_list *tbl = va_arg(ap, struct block_list *); - unsigned int tick = va_arg(ap, unsigned int); if (bl != tbl) battle_weapon_attack(mdbl, bl, tick, 0); } @@ -856,7 +858,8 @@ void mob_ancillary_attack(struct block_list *bl, va_list ap) * Attack processing of mob *------------------------------------------ */ -static int mob_attack(struct mob_data *md, unsigned int tick, int data) +static +int mob_attack(struct mob_data *md, unsigned int tick, int) { struct block_list *tbl = NULL; @@ -882,10 +885,9 @@ static int mob_attack(struct mob_data *md, unsigned int tick, int data) // it is highly platform-specific that this even works at all. int radius = battle_config.mob_splash_radius; if (radius >= 0 && tbl->type == BL_PC && !map[tbl->m].flag.town) - map_foreachinarea(mob_ancillary_attack, - tbl->m, tbl->x - radius, tbl->y - radius, tbl->x + radius, tbl->y + radius, - BL_PC, - &md->bl, tbl, tick); + map_foreachinarea(std::bind(mob_ancillary_attack, ph::_1, &md->bl, tbl, tick), + tbl->m, tbl->x - radius, tbl->y - radius, + tbl->x + radius, tbl->y + radius, BL_PC); if (!(battle_config.monster_cloak_check_type & 2) && md->sc_data[SC_CLOAKING].timer != -1) @@ -905,17 +907,12 @@ static int mob_attack(struct mob_data *md, unsigned int tick, int data) *------------------------------------------ */ static -int mob_stopattacked(struct map_session_data *sd, va_list ap) +void mob_stopattacked(struct map_session_data *sd, int id) { - int id; + nullpo_retv(sd); - nullpo_retr(0, sd); - nullpo_retr(0, ap); - - id = va_arg(ap, int); if (sd->attacktarget == id) pc_stopattack(sd); - return 0; } /*========================================== @@ -975,7 +972,7 @@ int mob_changestate(struct mob_data *md, int state, int type) md->state.skillstate = MSS_DEAD; md->last_deadtime = gettick(); // Since it died, all aggressors' attack to this mob is stopped. - clif_foreachclient(mob_stopattacked, md->bl.id); + clif_foreachclient(std::bind(mob_stopattacked, ph::_1, md->bl.id)); skill_unit_out_all(&md->bl, gettick(), 1); skill_status_change_clear(&md->bl, 2); // The abnormalities in status are canceled. skill_clear_unitgroup(&md->bl); // All skill unit groups are deleted. @@ -996,7 +993,8 @@ int mob_changestate(struct mob_data *md, int state, int type) * It branches to a walk and an attack. *------------------------------------------ */ -static void mob_timer(timer_id tid, tick_t tick, custom_id_t id, custom_data_t data) +static +void mob_timer(timer_id tid, tick_t tick, custom_id_t id, custom_data_t data) { struct mob_data *md; struct block_list *bl; @@ -1050,7 +1048,8 @@ static void mob_timer(timer_id tid, tick_t tick, custom_id_t id, custom_data_t d * *------------------------------------------ */ -static int mob_walktoxy_sub(struct mob_data *md) +static +int mob_walktoxy_sub(struct mob_data *md) { struct walkpath_data wpd; @@ -1101,7 +1100,8 @@ int mob_walktoxy(struct mob_data *md, int x, int y, int easy) * mob spawn with delay (timer function) *------------------------------------------ */ -static void mob_delayspawn(timer_id tid, tick_t tick, custom_id_t m, custom_data_t n) +static +void mob_delayspawn(timer_id, tick_t, custom_id_t m, custom_data_t) { mob_spawn(m); } @@ -1168,7 +1168,7 @@ int mob_setdelayspawn(int id) */ int mob_spawn(int id) { - int x = 0, y = 0, i = 0, c; + int x = 0, y = 0, c; unsigned int tick = gettick(); struct mob_data *md; struct block_list *bl; @@ -1194,28 +1194,31 @@ int mob_spawn(int id) md->mob_class = md->base_class; md->bl.m = md->m; - do { - if (md->x0 == 0 && md->y0 == 0) + int i = 0; + do { - x = MPRAND(1, (map[md->bl.m].xs - 2)); - y = MPRAND(1, (map[md->bl.m].ys - 2)); + if (md->x0 == 0 && md->y0 == 0) + { + x = MPRAND(1, (map[md->bl.m].xs - 2)); + y = MPRAND(1, (map[md->bl.m].ys - 2)); + } + else + { + x = MPRAND(md->x0, (md->xs + 1)) - md->xs / 2; + y = MPRAND(md->y0, (md->ys + 1)) - md->ys / 2; + } + i++; } - else + while (((c = map_getcell(md->bl.m, x, y)) == 1 || c == 5) && i < 50); + + if (i >= 50) { - x = MPRAND(md->x0, (md->xs + 1)) - md->xs / 2; - y = MPRAND(md->y0, (md->ys + 1)) - md->ys / 2; + // if(battle_config.error_log==1) + // printf("MOB spawn error %d @ %s\n",id,map[md->bl.m].name); + add_timer(tick + 5000, mob_delayspawn, id, 0); + return 1; } - i++; - } - while (((c = map_getcell(md->bl.m, x, y)) == 1 || c == 5) && i < 50); - - if (i >= 50) - { -// if(battle_config.error_log==1) -// printf("MOB spawn error %d @ %s\n",id,map[md->bl.m].name); - add_timer(tick + 5000, mob_delayspawn, id, 0); - return 1; } md->to_x = md->bl.x = x; @@ -1248,8 +1251,8 @@ int mob_spawn(int id) md->deletetimer = -1; md->skilltimer = -1; - for (i = 0, c = tick - 1000 * 3600 * 10; i < MAX_MOBSKILL; i++) - md->skilldelay[i] = c; + for (int i = 0; i < MAX_MOBSKILL; i++) + md->skilldelay[i] = tick - 1000 * 3600 * 10; md->skillid = SkillID(); md->skilllv = 0; @@ -1258,7 +1261,7 @@ int mob_spawn(int id) memset(md->lootitem, 0, sizeof(*md->lootitem)); md->lootitem_count = 0; - for (i = 0; i < MAX_MOBSKILLTIMERSKILL; i++) + for (int i = 0; i < MAX_MOBSKILLTIMERSKILL; i++) md->skilltimerskill[i].timer = -1; for (StatusChange i : erange(StatusChange(), MAX_STATUSCHANGE)) @@ -1289,7 +1292,8 @@ int mob_spawn(int id) * Distance calculation between two points *------------------------------------------ */ -static int distance(int x0, int y0, int x1, int y1) +static +int distance(int x0, int y0, int x1, int y1) { int dx, dy; @@ -1483,16 +1487,16 @@ int mob_target(struct mob_data *md, struct block_list *bl, int dist) *------------------------------------------ */ static -void mob_ai_sub_hard_activesearch(struct block_list *bl, va_list ap) +void mob_ai_sub_hard_activesearch(struct block_list *bl, + struct mob_data *smd, int *pcc) { struct map_session_data *tsd = NULL; - struct mob_data *smd, *tmd = NULL; - int mode, race, dist, *pcc; + struct mob_data *tmd = NULL; + int mode, race, dist; nullpo_retv(bl); - nullpo_retv(ap); - nullpo_retv(smd = va_arg(ap, struct mob_data *)); - nullpo_retv(pcc = va_arg(ap, int *)); + nullpo_retv(smd); + nullpo_retv(pcc); if (bl->type == BL_PC) tsd = (struct map_session_data *) bl; @@ -1559,15 +1563,11 @@ void mob_ai_sub_hard_activesearch(struct block_list *bl, va_list ap) *------------------------------------------ */ static -void mob_ai_sub_hard_lootsearch(struct block_list *bl, va_list ap) +void mob_ai_sub_hard_lootsearch(struct block_list *bl, struct mob_data *md, int *itc) { - struct mob_data *md; - int mode, dist, *itc; + int mode, dist; nullpo_retv(bl); - nullpo_retv(ap); - nullpo_retv(md = va_arg(ap, struct mob_data *)); - nullpo_retv(itc = va_arg(ap, int *)); if (!md->mode) { @@ -1603,17 +1603,14 @@ void mob_ai_sub_hard_lootsearch(struct block_list *bl, va_list ap) *------------------------------------------ */ static -void mob_ai_sub_hard_linksearch(struct block_list *bl, va_list ap) +void mob_ai_sub_hard_linksearch(struct block_list *bl, struct mob_data *md, struct block_list *target) { struct mob_data *tmd; - struct mob_data *md; - struct block_list *target; nullpo_retv(bl); - nullpo_retv(ap); - nullpo_retv(tmd = (struct mob_data *) bl); - nullpo_retv(md = va_arg(ap, struct mob_data *)); - nullpo_retv(target = va_arg(ap, struct block_list *)); + tmd = (struct mob_data *) bl; + nullpo_retv(md); + nullpo_retv(target); // same family free in a range at a link monster -- it will be made to lock if MOB is /* if ((md->target_id > 0 && md->state.targettype == ATTACKABLE) && mob_db[md->mob_class].mode&0x08){ @@ -1644,7 +1641,8 @@ void mob_ai_sub_hard_linksearch(struct block_list *bl, va_list ap) * Processing of slave monsters *------------------------------------------ */ -static int mob_ai_sub_hard_slavemob(struct mob_data *md, unsigned int tick) +static +int mob_ai_sub_hard_slavemob(struct mob_data *md, unsigned int tick) { struct mob_data *mmd = NULL; struct block_list *bl; @@ -1790,7 +1788,8 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md, unsigned int tick) * A lock of target is stopped and mob moves to a standby state. *------------------------------------------ */ -static int mob_unlocktarget(struct mob_data *md, int tick) +static +int mob_unlocktarget(struct mob_data *md, int tick) { nullpo_retr(0, md); @@ -1805,7 +1804,8 @@ static int mob_unlocktarget(struct mob_data *md, int tick) * Random walk *------------------------------------------ */ -static int mob_randomwalk(struct mob_data *md, int tick) +static +int mob_randomwalk(struct mob_data *md, int tick) { const int retrycount = 20; int speed; @@ -1861,22 +1861,18 @@ static int mob_randomwalk(struct mob_data *md, int tick) *------------------------------------------ */ static -void mob_ai_sub_hard(struct block_list *bl, va_list ap) +void mob_ai_sub_hard(struct block_list *bl, unsigned int tick) { struct mob_data *md, *tmd = NULL; struct map_session_data *tsd = NULL; struct block_list *tbl = NULL; struct flooritem_data *fitem; - unsigned int tick; int i, dx, dy, ret, dist; int attack_type = 0; int mode, race; nullpo_retv(bl); - nullpo_retv(ap); - nullpo_retv(md = (struct mob_data *) bl); - - tick = va_arg(ap, unsigned int); + md = (struct mob_data *) bl; if (DIFF_TICK(tick, md->last_thinktime) < MIN_MOBTHINKTIME) return; @@ -1911,10 +1907,9 @@ void mob_ai_sub_hard(struct block_list *bl, va_list ap) { if (asd->invincible_timer == -1 && !pc_isinvisible(asd)) { - map_foreachinarea(mob_ai_sub_hard_linksearch, md->bl.m, - md->bl.x - 13, md->bl.y - 13, - md->bl.x + 13, md->bl.y + 13, - BL_MOB, md, &asd->bl); + map_foreachinarea(std::bind(mob_ai_sub_hard_linksearch, ph::_1, md, &asd->bl), + md->bl.m, md->bl.x - 13, md->bl.y - 13, + md->bl.x + 13, md->bl.y + 13, BL_MOB); } } } @@ -1962,19 +1957,15 @@ void mob_ai_sub_hard(struct block_list *bl, va_list ap) i = 0; if (md->state.special_mob_ai) { - map_foreachinarea(mob_ai_sub_hard_activesearch, md->bl.m, - md->bl.x - AREA_SIZE * 2, - md->bl.y - AREA_SIZE * 2, - md->bl.x + AREA_SIZE * 2, - md->bl.y + AREA_SIZE * 2, 0, md, &i); + map_foreachinarea(std::bind(mob_ai_sub_hard_activesearch, ph::_1, md, &i), + md->bl.m, md->bl.x - AREA_SIZE * 2, md->bl.y - AREA_SIZE * 2, + md->bl.x + AREA_SIZE * 2, md->bl.y + AREA_SIZE * 2, 0); } else { - map_foreachinarea(mob_ai_sub_hard_activesearch, md->bl.m, - md->bl.x - AREA_SIZE * 2, - md->bl.y - AREA_SIZE * 2, - md->bl.x + AREA_SIZE * 2, - md->bl.y + AREA_SIZE * 2, BL_PC, md, &i); + map_foreachinarea(std::bind(mob_ai_sub_hard_activesearch, ph::_1, md, &i), + md->bl.m, md->bl.x - AREA_SIZE * 2, md->bl.y - AREA_SIZE * 2, + md->bl.x + AREA_SIZE * 2, md->bl.y + AREA_SIZE * 2, BL_PC); } } @@ -1982,10 +1973,9 @@ void mob_ai_sub_hard(struct block_list *bl, va_list ap) if (!md->target_id && mode & 0x02 && !md->state.master_check) { i = 0; - map_foreachinarea(mob_ai_sub_hard_lootsearch, md->bl.m, - md->bl.x - AREA_SIZE * 2, md->bl.y - AREA_SIZE * 2, - md->bl.x + AREA_SIZE * 2, md->bl.y + AREA_SIZE * 2, - BL_ITEM, md, &i); + map_foreachinarea(std::bind(mob_ai_sub_hard_lootsearch, ph::_1, md, &i), + md->bl.m, md->bl.x - AREA_SIZE * 2, md->bl.y - AREA_SIZE * 2, + md->bl.x + AREA_SIZE * 2, md->bl.y + AREA_SIZE * 2, BL_ITEM); } // It will attack, if the candidate for an attack is. @@ -2215,43 +2205,36 @@ void mob_ai_sub_hard(struct block_list *bl, va_list ap) * Serious processing for mob in PC field of view (foreachclient) *------------------------------------------ */ -static int mob_ai_sub_foreachclient(struct map_session_data *sd, va_list ap) +static +void mob_ai_sub_foreachclient(struct map_session_data *sd, unsigned int tick) { - unsigned int tick; - nullpo_retr(0, sd); - nullpo_retr(0, ap); - - tick = va_arg(ap, unsigned int); - map_foreachinarea(mob_ai_sub_hard, sd->bl.m, - sd->bl.x - AREA_SIZE * 2, sd->bl.y - AREA_SIZE * 2, - sd->bl.x + AREA_SIZE * 2, sd->bl.y + AREA_SIZE * 2, - BL_MOB, tick); + nullpo_retv(sd); - return 0; + map_foreachinarea(std::bind(mob_ai_sub_hard, ph::_1, tick), + sd->bl.m, sd->bl.x - AREA_SIZE * 2, sd->bl.y - AREA_SIZE * 2, + sd->bl.x + AREA_SIZE * 2, sd->bl.y + AREA_SIZE * 2, BL_MOB); } /*========================================== * Serious processing for mob in PC field of view (interval timer function) *------------------------------------------ */ -static void mob_ai_hard(timer_id tid, tick_t tick, custom_id_t id, custom_data_t data) +static +void mob_ai_hard(timer_id, tick_t tick, custom_id_t, custom_data_t) { - clif_foreachclient(mob_ai_sub_foreachclient, tick); + clif_foreachclient(std::bind(mob_ai_sub_foreachclient, ph::_1, tick)); } /*========================================== * Negligent mode MOB AI (PC is not in near) *------------------------------------------ */ -static void mob_ai_sub_lazy(db_key_t key, db_val_t data, va_list app) +static +void mob_ai_sub_lazy(db_key_t, db_val_t data, unsigned int tick) { struct mob_data *md = (struct mob_data *)data; - unsigned int tick; - va_list ap; nullpo_retv(md); - nullpo_retv(app); - nullpo_retv(ap = va_arg(app, va_list)); if (md == NULL) return; @@ -2259,8 +2242,6 @@ static void mob_ai_sub_lazy(db_key_t key, db_val_t data, va_list app) if (!md->bl.type || md->bl.type != BL_MOB) return; - tick = va_arg(ap, unsigned int); - if (DIFF_TICK(tick, md->last_thinktime) < MIN_MOBTHINKTIME * 10) return; md->last_thinktime = tick; @@ -2310,9 +2291,10 @@ static void mob_ai_sub_lazy(db_key_t key, db_val_t data, va_list app) * Negligent processing for mob outside PC field of view (interval timer function) *------------------------------------------ */ -static void mob_ai_lazy(timer_id tid, tick_t tick, custom_id_t id, custom_data_t data) +static +void mob_ai_lazy(timer_id, tick_t tick, custom_id_t, custom_data_t) { - map_foreachiddb(mob_ai_sub_lazy, tick); + map_foreachiddb(std::bind(mob_ai_sub_lazy, ph::_1, ph::_2, tick)); } /*========================================== @@ -2339,7 +2321,8 @@ struct delay_item_drop2 * item drop with delay (timer function) *------------------------------------------ */ -static void mob_delay_item_drop(timer_id tid, tick_t tick, custom_id_t id, custom_data_t data) +static +void mob_delay_item_drop(timer_id, tick_t, custom_id_t id, custom_data_t) { struct delay_item_drop *ditem; struct item temp_item; @@ -2377,7 +2360,8 @@ static void mob_delay_item_drop(timer_id tid, tick_t tick, custom_id_t id, custo * item drop (timer function)-lootitem with delay *------------------------------------------ */ -static void mob_delay_item_drop2(timer_id tid, tick_t tick, custom_id_t id, custom_data_t data) +static +void mob_delay_item_drop2(timer_id, tick_t, custom_id_t id, custom_data_t) { struct delay_item_drop2 *ditem; int flag; @@ -2440,7 +2424,7 @@ int mob_catch_delete(struct mob_data *md, int type) return 0; } -void mob_timer_delete(timer_id tid, tick_t tick, custom_id_t id, custom_data_t data) +void mob_timer_delete(timer_id, tick_t, custom_id_t id, custom_data_t) { struct block_list *bl = map_id2bl(id); struct mob_data *md; @@ -2456,16 +2440,13 @@ void mob_timer_delete(timer_id tid, tick_t tick, custom_id_t id, custom_data_t d *------------------------------------------ */ static -void mob_deleteslave_sub(struct block_list *bl, va_list ap) +void mob_deleteslave_sub(struct block_list *bl, int id) { struct mob_data *md; - int id; nullpo_retv(bl); - nullpo_retv(ap); - nullpo_retv(md = (struct mob_data *) bl); + md = (struct mob_data *) bl; - id = va_arg(ap, int); if (md->master_id > 0 && md->master_id == id) mob_damage(NULL, md, md->hp, 1); } @@ -2478,9 +2459,9 @@ int mob_deleteslave(struct mob_data *md) { nullpo_retr(0, md); - map_foreachinarea(mob_deleteslave_sub, md->bl.m, - 0, 0, map[md->bl.m].xs, map[md->bl.m].ys, - BL_MOB, md->bl.id); + map_foreachinarea(std::bind(mob_deleteslave_sub, ph::_1, md->bl.id), + md->bl.m, 0, 0, + map[md->bl.m].xs, map[md->bl.m].ys, BL_MOB); return 0; } @@ -2508,7 +2489,7 @@ int mob_damage(struct block_list *src, struct mob_data *md, int damage, unsigned int tick = gettick(); struct map_session_data *mvp_sd = NULL, *second_sd = NULL, *third_sd = NULL; - double dmg_rate, tdmg, temp; + double tdmg, temp; struct item item; int ret; int skill, sp; @@ -2729,12 +2710,6 @@ int mob_damage(struct block_list *src, struct mob_data *md, int damage, // [MouseJstr] if ((map[md->bl.m].flag.pvp == 0) || (battle_config.pvp_exp == 1)) { - - if ((double) max_hp < tdmg) - dmg_rate = ((double) max_hp) / tdmg; - else - dmg_rate = 1; - // 経験値の分配 for (int i = 0; i < DAMAGELOG_SIZE; i++) { @@ -3107,13 +3082,10 @@ int mob_heal(struct mob_data *md, int heal) *------------------------------------------ */ static -void mob_warpslave_sub(struct block_list *bl, va_list ap) +void mob_warpslave_sub(struct block_list *bl, int id, int x, int y) { struct mob_data *md = (struct mob_data *) bl; - int id, x, y; - id = va_arg(ap, int); - x = va_arg(ap, int); - y = va_arg(ap, int); + if (md->master_id == id) { mob_warp(md, -1, x, y, 2); @@ -3128,10 +3100,9 @@ static int mob_warpslave(struct mob_data *md, int x, int y) { //printf("warp slave\n"); - map_foreachinarea(mob_warpslave_sub, md->bl.m, - x - AREA_SIZE, y - AREA_SIZE, - x + AREA_SIZE, y + AREA_SIZE, BL_MOB, - md->bl.id, md->bl.x, md->bl.y); + map_foreachinarea(std::bind(mob_warpslave_sub, ph::_1, md->bl.id, md->bl.x, md->bl.y), + md->bl.m, x - AREA_SIZE, y - AREA_SIZE, + x + AREA_SIZE, y + AREA_SIZE, BL_MOB); return 0; } @@ -3221,17 +3192,12 @@ int mob_warp(struct mob_data *md, int m, int x, int y, int type) *------------------------------------------ */ static -void mob_countslave_sub(struct block_list *bl, va_list ap) +void mob_countslave_sub(struct block_list *bl, int id, int *c) { - int id, *c; struct mob_data *md; - id = va_arg(ap, int); - nullpo_retv(bl); - nullpo_retv(ap); - nullpo_retv(c = va_arg(ap, int *)); - nullpo_retv(md = (struct mob_data *) bl); + md = (struct mob_data *) bl; if (md->master_id == id) (*c)++; @@ -3248,9 +3214,9 @@ int mob_countslave(struct mob_data *md) nullpo_retr(0, md); - map_foreachinarea(mob_countslave_sub, md->bl.m, - 0, 0, map[md->bl.m].xs - 1, map[md->bl.m].ys - 1, - BL_MOB, md->bl.id, &c); + map_foreachinarea(std::bind(mob_countslave_sub, ph::_1, md->bl.id, &c), + md->bl.m, 0, 0, + map[md->bl.m].xs - 1, map[md->bl.m].ys - 1, BL_MOB); return c; } @@ -3341,18 +3307,11 @@ int mob_summonslave(struct mob_data *md2, int *value, int amount, int flag) *------------------------------------------ */ static -void mob_counttargeted_sub(struct block_list *bl, va_list ap) +void mob_counttargeted_sub(struct block_list *bl, int id, int *c, struct block_list *src, int target_lv) { - int id, *c, target_lv; - struct block_list *src; - - id = va_arg(ap, int); nullpo_retv(bl); - nullpo_retv(ap); - nullpo_retv(c = va_arg(ap, int *)); + nullpo_retv(c); - src = va_arg(ap, struct block_list *); - target_lv = va_arg(ap, int); if (id == bl->id || (src && id == src->id)) return; if (bl->type == BL_PC) @@ -3382,10 +3341,9 @@ int mob_counttargeted(struct mob_data *md, struct block_list *src, nullpo_retr(0, md); - map_foreachinarea(mob_counttargeted_sub, md->bl.m, - md->bl.x - AREA_SIZE, md->bl.y - AREA_SIZE, - md->bl.x + AREA_SIZE, md->bl.y + AREA_SIZE, 0, - md->bl.id, &c, src, target_lv); + map_foreachinarea(std::bind(mob_counttargeted_sub, ph::_1, md->bl.id, &c, src, target_lv), + md->bl.m, md->bl.x - AREA_SIZE, md->bl.y - AREA_SIZE, + md->bl.x + AREA_SIZE, md->bl.y + AREA_SIZE, 0); return c; } @@ -3418,7 +3376,7 @@ int mob_skillid2skillidx(int mob_class, SkillID skillid) * スキル使用(詠唱完了、ID指定) *------------------------------------------ */ -void mobskill_castend_id(timer_id tid, tick_t tick, custom_id_t id, custom_data_t data) +void mobskill_castend_id(timer_id tid, tick_t tick, custom_id_t id, custom_data_t) { struct mob_data *md = NULL; struct block_list *bl; @@ -3522,7 +3480,7 @@ void mobskill_castend_id(timer_id tid, tick_t tick, custom_id_t id, custom_data_ * スキル使用(詠唱完了、場所指定) *------------------------------------------ */ -void mobskill_castend_pos(timer_id tid, tick_t tick, custom_id_t id, custom_data_t data) +void mobskill_castend_pos(timer_id tid, tick_t tick, custom_id_t id, custom_data_t) { struct mob_data *md = NULL; struct block_list *bl; @@ -3870,21 +3828,18 @@ int mobskill_use_pos(struct mob_data *md, *------------------------------------------ */ static -void mob_getfriendhpltmaxrate_sub(struct block_list *bl, va_list ap) +void mob_getfriendhpltmaxrate_sub(struct block_list *bl, struct mob_data *mmd, int rate, struct mob_data **fr) { - int rate; - struct mob_data **fr, *md, *mmd; + struct mob_data *md; nullpo_retv(bl); - nullpo_retv(ap); - nullpo_retv(mmd = va_arg(ap, struct mob_data *)); + nullpo_retv(mmd); md = (struct mob_data *) bl; if (mmd->bl.id == bl->id) return; - rate = va_arg(ap, int); - fr = va_arg(ap, struct mob_data **); + if (md->hp < mob_db[md->mob_class].max_hp * rate / 100) (*fr) = md; } @@ -3897,9 +3852,9 @@ struct mob_data *mob_getfriendhpltmaxrate(struct mob_data *md, int rate) nullpo_retr(NULL, md); - map_foreachinarea(mob_getfriendhpltmaxrate_sub, md->bl.m, - md->bl.x - r, md->bl.y - r, md->bl.x + r, md->bl.y + r, - BL_MOB, md, rate, &fr); + map_foreachinarea(std::bind(mob_getfriendhpltmaxrate_sub, ph::_1, md, rate, &fr), + md->bl.m, md->bl.x - r, md->bl.y - r, + md->bl.x + r, md->bl.y + r, BL_MOB); return fr; } @@ -3908,21 +3863,17 @@ struct mob_data *mob_getfriendhpltmaxrate(struct mob_data *md, int rate) *------------------------------------------ */ static -void mob_getfriendstatus_sub(struct block_list *bl, va_list ap) +void mob_getfriendstatus_sub(struct block_list *bl, struct mob_data *mmd, MSC cond1, StatusChange cond2, struct mob_data **fr) { - struct mob_data **fr, *md, *mmd; + struct mob_data *md; int flag = 0; nullpo_retv(bl); - nullpo_retv(ap); - nullpo_retv(md = (struct mob_data *) bl); - nullpo_retv(mmd = va_arg(ap, struct mob_data *)); + md = (struct mob_data *) bl; if (mmd->bl.id == bl->id) return; - MSC cond1 = va_arg(ap, MSC); - StatusChange cond2 = va_arg(ap, StatusChange); - fr = va_arg(ap, struct mob_data **); + if (cond2 == StatusChange::ANY_BAD) { for (StatusChange j : MAJOR_STATUS_EFFECTS) @@ -3947,9 +3898,9 @@ struct mob_data *mob_getfriendstatus(struct mob_data *md, nullpo_retr(0, md); - map_foreachinarea(mob_getfriendstatus_sub, md->bl.m, - md->bl.x - r, md->bl.y - r, md->bl.x + r, md->bl.y + r, - BL_MOB, md, cond1, cond2, &fr); + map_foreachinarea(std::bind(mob_getfriendstatus_sub, ph::_1, md, cond1, cond2, &fr), + md->bl.m, md->bl.x - r, md->bl.y - r, + md->bl.x + r, md->bl.y + r, BL_MOB); return fr; } @@ -4187,25 +4138,6 @@ int mobskill_event(struct mob_data *md, int flag) return 0; } -/*========================================== - * スキル用タイマー削除 - *------------------------------------------ - */ -int mobskill_deltimer(struct mob_data *md) -{ - nullpo_retr(0, md); - - if (md->skilltimer != -1) - { - if (skill_get_inf(md->skillid) & 2) - delete_timer(md->skilltimer, mobskill_castend_pos); - else - delete_timer(md->skilltimer, mobskill_castend_id); - md->skilltimer = -1; - } - return 0; -} - // // 初期化 // @@ -4213,7 +4145,8 @@ int mobskill_deltimer(struct mob_data *md) * Since un-setting [ mob ] up was used, it is an initial provisional value setup. *------------------------------------------ */ -static int mob_makedummymobdb(int mob_class) +static +int mob_makedummymobdb(int mob_class) { int i; @@ -4269,7 +4202,8 @@ static int mob_makedummymobdb(int mob_class) * db/mob_db.txt reading *------------------------------------------ */ -static int mob_readdb(void) +static +int mob_readdb(void) { FILE *fp; char line[1024]; @@ -4449,7 +4383,8 @@ static int mob_readdb(void) * MOB display graphic change data reading *------------------------------------------ */ -static int mob_readdb_mobavail(void) +static +int mob_readdb_mobavail(void) { FILE *fp; char line[1024]; @@ -4521,7 +4456,8 @@ static int mob_readdb_mobavail(void) * Reading of random monster data *------------------------------------------ */ -static int mob_read_randommonster(void) +static +int mob_read_randommonster(void) { FILE *fp; char line[1024]; @@ -4575,7 +4511,8 @@ static int mob_read_randommonster(void) * db/mob_skill_db.txt reading *------------------------------------------ */ -static int mob_readskilldb(void) +static +int mob_readskilldb(void) { FILE *fp; char line[1024]; |