Skip to content

Commit

Permalink
Standardized access to mode fields
Browse files Browse the repository at this point in the history
Additionally cleaned RC2 access too.
  • Loading branch information
Lemongrass3110 committed Apr 3, 2016
1 parent 3e2210c commit b6abe3f
Show file tree
Hide file tree
Showing 10 changed files with 119 additions and 112 deletions.
2 changes: 1 addition & 1 deletion src/map/atcommand.c
Expand Up @@ -7195,7 +7195,7 @@ ACMD_FUNC(showmobs)
return 0;
}

if(mob_db(mob_id)->status.mode&MD_BOSS && !pc_has_permission(sd, PC_PERM_SHOW_BOSS)){ // If player group does not have access to boss mobs.
if(status_has_mode(&mob_db(mob_id)->status,MD_BOSS) && !pc_has_permission(sd, PC_PERM_SHOW_BOSS)){ // If player group does not have access to boss mobs.
clif_displaymessage(fd, msg_txt(sd,1251)); // Can't show boss mobs!
return 0;
}
Expand Down
23 changes: 12 additions & 11 deletions src/map/battle.c
Expand Up @@ -569,7 +569,7 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
s_class = (enum e_classAE)status_get_class(src);
sstatus = status_get_status_data(src);
tstatus = status_get_status_data(target);
s_race2 = (enum e_race2)status_get_race2(src);
s_race2 = status_get_race2(src);
s_defele = (tsd) ? (enum e_element)status_get_element(src) : ELE_NONE;

//Official servers apply the cardfix value on a base of 1000 and round down the reduction/increase
Expand Down Expand Up @@ -643,7 +643,7 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
break;

case BF_WEAPON:
t_race2 = (enum e_race2)status_get_race2(target);
t_race2 = status_get_race2(target);
// Affected by attacker ATK bonuses
if( sd && !(nk&NK_NO_CARDFIX_ATK) && (left&2) ) {
short cardfix_ = 1000;
Expand Down Expand Up @@ -1035,7 +1035,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
return damage; //These skills bypass everything else.

if( sc && sc->count ) { // SC_* that reduce damage to 0.
if( sc->data[SC_BASILICA] && !(status_get_mode(src)&MD_BOSS) ) {
if( sc->data[SC_BASILICA] && !status_bl_has_mode(src,MD_BOSS) ) {
d->dmg_lv = ATK_BLOCK;
return 0;
}
Expand Down Expand Up @@ -2221,16 +2221,17 @@ bool is_infinite_defense(struct block_list *target, int flag)
return true;
}

if(tstatus->mode&MD_IGNOREMELEE && (flag&(BF_WEAPON|BF_SHORT)) == (BF_WEAPON|BF_SHORT) )
if(status_has_mode(tstatus,MD_IGNOREMELEE) && (flag&(BF_WEAPON|BF_SHORT)) == (BF_WEAPON|BF_SHORT) )
return true;
if(tstatus->mode&MD_IGNOREMAGIC && flag&(BF_MAGIC) )
if(status_has_mode(tstatus,MD_IGNOREMAGIC) && flag&(BF_MAGIC) )
return true;
if(tstatus->mode&MD_IGNORERANGED && (flag&(BF_WEAPON|BF_LONG)) == (BF_WEAPON|BF_LONG) )
if(status_has_mode(tstatus,MD_IGNORERANGED) && (flag&(BF_WEAPON|BF_LONG)) == (BF_WEAPON|BF_LONG) )
return true;
if(tstatus->mode&MD_IGNOREMISC && flag&(BF_MISC) )
if(status_has_mode(tstatus,MD_IGNOREMISC) && flag&(BF_MISC) )
return true;

return (tstatus->mode&MD_PLANT);
if(status_has_mode(tstatus,MD_PLANT) )
return true;
return false;
}

/*========================
Expand Down Expand Up @@ -3634,7 +3635,7 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
break;
case GS_BULLSEYE:
//Only works well against brute/demihumans non bosses.
if((tstatus->race == RC_BRUTE || tstatus->race == RC_DEMIHUMAN || tstatus->race == RC_PLAYER) && !(tstatus->mode&MD_BOSS))
if((tstatus->race == RC_BRUTE || tstatus->race == RC_DEMIHUMAN || tstatus->race == RC_PLAYER) && !status_has_mode(tstatus,MD_BOSS))
skillratio += 400;
break;
case GS_TRACKING:
Expand Down Expand Up @@ -5659,7 +5660,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
#endif
if(i > 700)
i = 700;
if(rnd()%1000 < i && !(tstatus->mode&MD_BOSS))
if(rnd()%1000 < i && !status_has_mode(tstatus,MD_BOSS))
ad.damage = tstatus->hp;
else {
#ifdef RENEWAL
Expand Down
55 changes: 28 additions & 27 deletions src/map/mob.c
Expand Up @@ -304,7 +304,7 @@ struct mob_data* mob_spawn_dataset(struct spawn_data *data)
md->special_state.size = data->state.size;
if (data->eventname[0] && strlen(data->eventname) >= 4)
memcpy(md->npc_event, data->eventname, 50);
if(md->db->status.mode&MD_LOOTER)
if(status_has_mode(&md->db->status,MD_LOOTER))
md->lootitems = (struct s_mob_lootitem *)aCalloc(LOOTITEM_SIZE,sizeof(struct s_mob_lootitem));
md->spawn_timer = INVALID_TIMER;
md->deletetimer = INVALID_TIMER;
Expand Down Expand Up @@ -360,9 +360,9 @@ int mob_get_random_id(int type, int flag, int lv)
mob_is_clone(mob_id) ||
(flag&0x01 && (entry->rate < 1000000 && entry->rate <= rnd() % 1000000)) ||
(flag&0x02 && lv < mob->lv) ||
(flag&0x04 && mob->status.mode&MD_BOSS) ||
(flag&0x04 && status_has_mode(&mob->status,MD_BOSS) ) ||
(flag&0x08 && mob->spawn[0].qty < 1) ||
(flag&0x10 && mob->status.mode&MD_PLANT)
(flag&0x10 && status_has_mode(&mob->status,MD_PLANT) )
) && (i++) < MAX_MOB_DB && msummon->count > 1);

if (i >= MAX_MOB_DB && &msummon->list[0]) // no suitable monster found, use fallback for given list
Expand Down Expand Up @@ -996,7 +996,7 @@ int mob_spawn (struct mob_data *md)
// md->master_id = 0;
md->master_dist = 0;

md->state.aggressive = md->status.mode&MD_ANGRY?1:0;
md->state.aggressive = status_has_mode(&md->status,MD_ANGRY)?1:0;
md->state.skillstate = MSS_IDLE;
md->next_walktime = tick+rnd()%1000+MIN_RANDOMWALKTIME;
md->last_linktime = tick;
Expand Down Expand Up @@ -1121,7 +1121,7 @@ static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap)
{
case BL_PC:
if (((TBL_PC*)bl)->state.gangsterparadise &&
!(status_get_mode(&md->bl)&MD_BOSS))
!status_has_mode(&md->status,MD_BOSS))
return 0; //Gangster paradise protection.
default:
if (battle_config.hom_setting&HOMSET_FIRST_TARGET &&
Expand Down Expand Up @@ -1270,7 +1270,7 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick)
if (bl->prev == NULL)
return 0; //Master not on a map? Could be warping, do not process.

if(status_get_mode(&md->bl)&MD_CANMOVE)
if(status_has_mode(&md->status,MD_CANMOVE))
{ //If the mob can move, follow around. [Check by Skotlex]
int old_dist;

Expand Down Expand Up @@ -1365,7 +1365,7 @@ int mob_unlocktarget(struct mob_data *md, unsigned int tick)
default:
mob_stop_attack(md);
mob_stop_walking(md,1); //Stop chasing.
if (md->status.mode&MD_ANGRY && !md->state.aggressive)
if (status_has_mode(&md->status,MD_ANGRY) && !md->state.aggressive)
md->state.aggressive = 1; //Restore angry state when switching to idle
md->state.skillstate = MSS_IDLE;
if(battle_config.mob_ai&0x8) //Walk instantly after dropping target
Expand Down Expand Up @@ -1398,9 +1398,9 @@ int mob_randomwalk(struct mob_data *md,unsigned int tick)
nullpo_ret(md);

if(DIFF_TICK(md->next_walktime,tick)>0 ||
(status_get_mode(&md->bl)&MD_NORANDOM_WALK) ||
status_has_mode(&md->status,MD_NORANDOM_WALK) ||
!unit_can_move(&md->bl) ||
!(status_get_mode(&md->bl)&MD_CANMOVE))
!status_has_mode(&md->status,MD_CANMOVE))
return 0;

r=rnd();
Expand Down Expand Up @@ -1847,7 +1847,7 @@ static int mob_ai_sub_lazy(struct mob_data *md, va_list args)

if(battle_config.mob_active_time &&
md->last_pcneartime &&
!(md->status.mode&MD_BOSS) &&
!status_has_mode(&md->status,MD_BOSS) &&
DIFF_TICK(tick,md->last_thinktime) > MIN_MOBTHINKTIME)
{
if (DIFF_TICK(tick,md->last_pcneartime) < battle_config.mob_active_time)
Expand All @@ -1857,7 +1857,7 @@ static int mob_ai_sub_lazy(struct mob_data *md, va_list args)

if(battle_config.boss_active_time &&
md->last_pcneartime &&
(md->status.mode&MD_BOSS) &&
status_has_mode(&md->status,MD_BOSS) &&
DIFF_TICK(tick,md->last_thinktime) > MIN_MOBTHINKTIME)
{
if (DIFF_TICK(tick,md->last_pcneartime) < battle_config.boss_active_time)
Expand All @@ -1875,7 +1875,7 @@ static int mob_ai_sub_lazy(struct mob_data *md, va_list args)
return 0;
}

if( DIFF_TICK(md->next_walktime,tick) < 0 && (status_get_mode(&md->bl)&MD_CANMOVE) && unit_can_move(&md->bl) )
if( DIFF_TICK(md->next_walktime,tick) < 0 && status_has_mode(&md->status,MD_CANMOVE) && unit_can_move(&md->bl) )
{
if( rnd()%1000 < MOB_LAZYMOVEPERC(md) )
mob_randomwalk(md, tick);
Expand Down Expand Up @@ -2990,7 +2990,7 @@ int mob_class_change (struct mob_data *md, int mob_id)
for(i=0,c=tick-MOB_MAX_DELAY;i<MAX_MOBSKILL;i++)
md->skilldelay[i] = c;

if (md->lootitems == NULL && md->db->status.mode&MD_LOOTER)
if (md->lootitems == NULL && status_has_mode(&md->db->status,MD_LOOTER))
md->lootitems = (struct s_mob_lootitem *)aCalloc(LOOTITEM_SIZE,sizeof(struct s_mob_lootitem));

//Targets should be cleared no morph
Expand Down Expand Up @@ -3152,15 +3152,15 @@ int mob_summonslave(struct mob_data *md2,int *value,int amount,uint16 skill_id)
{
switch (battle_config.slaves_inherit_mode) {
case 1: //Always aggressive
if (!(md->status.mode&MD_AGGRESSIVE))
if (!status_has_mode(&md->status,MD_AGGRESSIVE))
sc_start4(NULL,&md->bl, SC_MODECHANGE, 100,1,0, MD_AGGRESSIVE, 0, 0);
break;
case 2: //Always passive
if (md->status.mode&MD_AGGRESSIVE)
if (status_has_mode(&md->status,MD_AGGRESSIVE))
sc_start4(NULL,&md->bl, SC_MODECHANGE, 100,1,0, 0, MD_AGGRESSIVE, 0);
break;
default: //Copy master.
if (md2->status.mode&MD_AGGRESSIVE)
if (status_has_mode(&md2->status,MD_AGGRESSIVE))
sc_start4(NULL,&md->bl, SC_MODECHANGE, 100,1,0, MD_AGGRESSIVE, 0, 0);
else
sc_start4(NULL,&md->bl, SC_MODECHANGE, 100,1,0, 0, MD_AGGRESSIVE, 0);
Expand Down Expand Up @@ -3308,7 +3308,7 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
nullpo_ret(md);
nullpo_ret(ms = md->db->skill);

if (!battle_config.mob_skill_rate || md->ud.skilltimer != INVALID_TIMER || !md->db->maxskill || (status_get_mode(&md->bl)&MD_NOCAST_SKILL))
if (!battle_config.mob_skill_rate || md->ud.skilltimer != INVALID_TIMER || !md->db->maxskill || status_has_mode(&md->status,MD_NOCAST_SKILL))
return 0;

if (event == -1 && DIFF_TICK(md->ud.canact_tick, tick) > 0)
Expand Down Expand Up @@ -3403,7 +3403,7 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
continue; //Skill requisite failed to be fulfilled.

//Execute skill
skill_target = (md->db->status.mode&MD_RANDOMTARGET) ? MST_RANDOM : ms[i].target;
skill_target = status_has_mode(&md->db->status,MD_RANDOMTARGET) ? MST_RANDOM : ms[i].target;
if (skill_get_casttype(ms[i].skill_id) == CAST_GROUND)
{ //Ground skill.
short x, y;
Expand Down Expand Up @@ -3959,7 +3959,7 @@ static bool mob_parse_dbrow(char** str)
if (!battle_config.monster_active_enable)
status->mode &= ~MD_AGGRESSIVE;

if( status->mode&MD_BOSS )
if( status_has_mode(status,MD_BOSS) )
status->class_ = CLASS_BOSS;
else if( mob_is_guardian(mob_id) )
status->class_ = CLASS_GUARDIAN;
Expand Down Expand Up @@ -4655,7 +4655,7 @@ static bool mob_readdb_race2(char* fields[], int columns, int current)
ShowWarning("mob_readdb_race2: Unknown mob id %d for race2 %d.\n", mobid, race);
continue;
}
mob_db_data[mobid]->race2 = race;
mob_db_data[mobid]->race2 = (enum e_race2)race;
}
return true;
}
Expand Down Expand Up @@ -4798,35 +4798,36 @@ static void mob_drop_ratio_adjust(void){
ratemin = battle_config.item_drop_treasure_min;
ratemax = battle_config.item_drop_treasure_max;
}else{
bool is_boss = status_has_mode(&mob->status,MD_BOSS);
is_treasurechest = false;

// Added suport to restrict normal drops of MVP's [Reddozen]
switch( id->type ){
case IT_HEALING:
rate_adjust = (mob->status.mode&MD_BOSS) ? battle_config.item_rate_heal_boss : battle_config.item_rate_heal;
rate_adjust = is_boss ? battle_config.item_rate_heal_boss : battle_config.item_rate_heal;
ratemin = battle_config.item_drop_heal_min;
ratemax = battle_config.item_drop_heal_max;
break;
case IT_USABLE:
case IT_CASH:
rate_adjust = (mob->status.mode&MD_BOSS) ? battle_config.item_rate_use_boss : battle_config.item_rate_use;
rate_adjust = is_boss ? battle_config.item_rate_use_boss : battle_config.item_rate_use;
ratemin = battle_config.item_drop_use_min;
ratemax = battle_config.item_drop_use_max;
break;
case IT_WEAPON:
case IT_ARMOR:
case IT_PETARMOR:
rate_adjust = (mob->status.mode&MD_BOSS) ? battle_config.item_rate_equip_boss : battle_config.item_rate_equip;
rate_adjust = is_boss ? battle_config.item_rate_equip_boss : battle_config.item_rate_equip;
ratemin = battle_config.item_drop_equip_min;
ratemax = battle_config.item_drop_equip_max;
break;
case IT_CARD:
rate_adjust = (mob->status.mode&MD_BOSS) ? battle_config.item_rate_card_boss : battle_config.item_rate_card;
rate_adjust = is_boss ? battle_config.item_rate_card_boss : battle_config.item_rate_card;
ratemin = battle_config.item_drop_card_min;
ratemax = battle_config.item_drop_card_max;
break;
default:
rate_adjust = (mob->status.mode&MD_BOSS) ? battle_config.item_rate_common_boss : battle_config.item_rate_common;
rate_adjust = is_boss ? battle_config.item_rate_common_boss : battle_config.item_rate_common;
ratemin = battle_config.item_drop_common_min;
ratemax = battle_config.item_drop_common_max;
break;
Expand Down Expand Up @@ -4912,8 +4913,8 @@ static void mob_skill_db_set_single(struct s_mob_skill *skill) {
mob = mob_db(i);
if (mob == mob_dummy)
continue;
if ( (!(id&1) && mob->status.mode&MD_BOSS) // Bosses
|| (!(id&2) && !(mob->status.mode&MD_BOSS)) // Normal monsters
if ( (!(id&1) && status_has_mode(&mob->status,MD_BOSS)) // Bosses
|| (!(id&2) && !status_has_mode(&mob->status,MD_BOSS)) // Normal monsters
)
continue;
mob_skill_db_set_single_sub(mob, skill);
Expand Down
2 changes: 1 addition & 1 deletion src/map/mob.h
Expand Up @@ -114,7 +114,7 @@ struct mob_db {
unsigned int base_exp,job_exp;
unsigned int mexp;
short range2,range3;
short race2; // celest
enum e_race2 race2; // celest
unsigned short lv;
struct {
unsigned short nameid;
Expand Down
4 changes: 2 additions & 2 deletions src/map/pc.c
Expand Up @@ -5096,7 +5096,7 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 skil
sd_status= status_get_status_data(&sd->bl);
md_status= status_get_status_data(bl);

if( md->master_id || md_status->mode&MD_BOSS || mob_is_treasure(md) ||
if( md->master_id || status_has_mode(md_status,MD_BOSS) || mob_is_treasure(md) ||
map[bl->m].flag.nomobloot || // check noloot map flag [Lorky]
(battle_config.skill_steal_max_tries && //Reached limit of steal attempts. [Lupus]
md->state.steal_flag++ >= battle_config.skill_steal_max_tries)
Expand Down Expand Up @@ -5167,7 +5167,7 @@ int pc_steal_coin(struct map_session_data *sd,struct block_list *target)
return 0;

md = (TBL_MOB*)target;
if( md->state.steal_coin_flag || md->sc.data[SC_STONE] || md->sc.data[SC_FREEZE] || md->status.mode&MD_BOSS )
if( md->state.steal_coin_flag || md->sc.data[SC_STONE] || md->sc.data[SC_FREEZE] || status_has_mode(&md->status,MD_BOSS) )
return 0;

if( mob_is_treasure(md) )
Expand Down
2 changes: 1 addition & 1 deletion src/map/pet.c
Expand Up @@ -652,7 +652,7 @@ int pet_catch_process2(struct map_session_data* sd, int target_id)
i = search_petDB_index(md->mob_id,PET_CLASS);

//catch_target_class == 0 is used for universal lures (except bosses for now). [Skotlex]
if (sd->catch_target_class == 0 && !(md->status.mode&MD_BOSS))
if (sd->catch_target_class == 0 && !status_has_mode(&md->status,MD_BOSS))
sd->catch_target_class = md->mob_id;

if(i < 0 || sd->catch_target_class != md->mob_id) {
Expand Down

0 comments on commit b6abe3f

Please sign in to comment.