From 606fb6292db080bcbd84958c6e54df8eba190999 Mon Sep 17 00:00:00 2001 From: skotlex Date: Mon, 4 Dec 2006 19:07:18 +0000 Subject: - Fixed HVAN_INSTRUCT int bonuses. - Renamed mob_db's "adelay" column to ThinkTime and made the mob.c code use it instead of MIN_MOBTHINKTIME. The adelay of mobs will also be equal to their thinktime unless their thinktime is less than their attack motion. - Cleaned the mob_db reading code a bit. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@9406 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 5 ++ db/mob_db.txt | 2 +- db/mob_db2.txt | 2 +- db/mob_db_a.txt | 2 +- src/map/mob.c | 212 ++++++++++++++++++++++++++-------------------------- src/map/mob.h | 1 + src/map/skill.c | 7 +- src/map/status.c | 4 +- 8 files changed, 123 insertions(+), 112 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index f1a34025c..359d29cac 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,11 @@ 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/12/04 + * Fixed HVAN_INSTRUCT int bonuses. [Skotlex] + * Renamed mob_db's "adelay" column to ThinkTime and made the mob.c code use + it instead of MIN_MOBTHINKTIME. The adelay of mobs will also be equal to + their thinktime unless their thinktime is less than their attack motion. + [Skotlex] * Added a static +100 Hp to ninjas and gunslingers since it's required for the best approximated hp growth algorythm. [Skotlex] * Knockback will again use the fixpos packet instead of the slide packet diff --git a/db/mob_db.txt b/db/mob_db.txt index a77ada0d7..570decca4 100644 --- a/db/mob_db.txt +++ b/db/mob_db.txt @@ -1,7 +1,7 @@ // Monster Database // // Structure of Database : -// ID,Sprite_Name,kROName,iROName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ADelay,aMotion,dMotion,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper +// ID,Sprite_Name,kROName,iROName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ThinkTime,aMotion,dMotion,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper // Note: Keep the Sprite_Name field as it is (in the game client). You may change Name,JName field tough 1001,SCORPION,Scorpion,Scorpion,24,1109,0,287,176,1,80,135,30,0,1,24,24,5,52,5,10,12,0,4,23,149,200,1564,864,576,0,0,0,0,0,0,0,0,990,70,904,5500,757,57,943,210,7041,100,508,200,625,20,0,0,0,0,4068,1 diff --git a/db/mob_db2.txt b/db/mob_db2.txt index 3baf02364..37f64cc10 100644 --- a/db/mob_db2.txt +++ b/db/mob_db2.txt @@ -1,7 +1,7 @@ // Monsters Additional Database // // Structure of Database : -// ID,Sprite_Name,kROName,iROName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ADelay,aMotion,dMotion,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper +// ID,Sprite_Name,kROName,iROName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ThinkTime,aMotion,dMotion,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper // Crusader quest monsters with poring stats (No drops) 1910,C_GHOUL,Ghoul,Ghoul,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/db/mob_db_a.txt b/db/mob_db_a.txt index 824ace104..c91dfc4e9 100644 --- a/db/mob_db_a.txt +++ b/db/mob_db_a.txt @@ -1,7 +1,7 @@ // Monster Database // // Structure of Database : -// ID,Sprite_Name,kROName,iROName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ADelay,aMotion,dMotion,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper +// ID,Sprite_Name,kROName,iROName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ThinkTime,aMotion,dMotion,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper // Note: Keep the Sprite_Name field as it is (in the game client). You may change Name,JName field tough 1001,SCORPION,Scorpion,Scorpion,24,1109,0,287,176,1,80,135,30,0,1,24,24,5,52,5,10,12,0,4,23,149,200,1564,864,576,0,0,0,0,0,0,0,0,990,70,904,5500,757,57,943,210,7041,100,508,200,625,20,0,0,0,0,4068,1 diff --git a/src/map/mob.c b/src/map/mob.c index d42e28fc1..0c21335b8 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -641,8 +641,7 @@ int mob_spawn (struct mob_data *md) int i=0; unsigned int c =0, tick = gettick(); - md->last_spawntime = tick; - md->last_thinktime = tick -MIN_MOBTHINKTIME; + md->last_spawntime = md->last_thinktime = tick; if (md->bl.prev != NULL) unit_remove_map(&md->bl,2); else @@ -1066,7 +1065,7 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap) if(md->bl.prev == NULL || md->status.hp <= 0) return 1; - if (DIFF_TICK(tick, md->last_thinktime) < MIN_MOBTHINKTIME) + if (DIFF_TICK(tick, md->last_thinktime) < md->db->min_thinktime) return 0; md->last_thinktime = tick; @@ -1351,7 +1350,7 @@ static int mob_ai_sub_lazy(DBKey key,void * data,va_list ap) tick=va_arg(ap,unsigned int); - if(DIFF_TICK(tick,md->last_thinktime)last_thinktime)< 10*md->db->min_thinktime) return 0; md->last_thinktime=tick; @@ -3186,6 +3185,7 @@ static int mob_readdb(void) char line[1024]; char *filename[]={ "mob_db.txt","mob_db2.txt" }; struct status_data *status; + struct mob_db *db; int class_, i, fi, k; struct mob_data data; memset(&data, 0, sizeof(struct mob_data)); @@ -3232,35 +3232,36 @@ static int mob_readdb(void) } if (mob_db_data[class_] == NULL) mob_db_data[class_] = aCalloc(1, sizeof (struct mob_data)); + db = mob_db_data[class_]; - mob_db_data[class_]->vd.class_ = class_; - memcpy(mob_db_data[class_]->sprite, str[1], NAME_LENGTH-1); - memcpy(mob_db_data[class_]->jname, str[2], NAME_LENGTH-1); - memcpy(mob_db_data[class_]->name, str[3], NAME_LENGTH-1); - mob_db_data[class_]->lv = atoi(str[4]); - if (mob_db_data[class_]->lv < 1) - mob_db_data[class_]->lv = 1; + db->vd.class_ = class_; + memcpy(db->sprite, str[1], NAME_LENGTH-1); + memcpy(db->jname, str[2], NAME_LENGTH-1); + memcpy(db->name, str[3], NAME_LENGTH-1); + db->lv = atoi(str[4]); + if (db->lv < 1) + db->lv = 1; - status = &mob_db_data[class_]->status; + status = &db->status; status->max_hp = atoi(str[5]); status->max_sp = atoi(str[6]); exp = (double)atoi(str[7]) * (double)battle_config.base_exp_rate / 100.; if (exp < 0) - mob_db_data[class_]->base_exp = 0; + db->base_exp = 0; if (exp > UINT_MAX) - mob_db_data[class_]->base_exp = UINT_MAX; + db->base_exp = UINT_MAX; else - mob_db_data[class_]->base_exp = (unsigned int)exp; + db->base_exp = (unsigned int)exp; exp = (double)atoi(str[8]) * (double)battle_config.job_exp_rate / 100.; if (exp < 0) - mob_db_data[class_]->job_exp = 0; + db->job_exp = 0; else if (exp > UINT_MAX) - mob_db_data[class_]->job_exp = UINT_MAX; + db->job_exp = UINT_MAX; else - mob_db_data[class_]->job_exp = (unsigned int)exp; + db->job_exp = (unsigned int)exp; status->rhw.range=atoi(str[9]); status->rhw.atk=atoi(str[10]); @@ -3281,23 +3282,23 @@ static int mob_readdb(void) if (status->dex < 1) status->dex = 1; if (status->luk < 1) status->luk = 1; - mob_db_data[class_]->range2=atoi(str[20]); - mob_db_data[class_]->range3=atoi(str[21]); + db->range2=atoi(str[20]); + db->range3=atoi(str[21]); if (battle_config.view_range_rate!=100) { - mob_db_data[class_]->range2= - mob_db_data[class_]->range2 + db->range2= + db->range2 *battle_config.view_range_rate/100; - if (mob_db_data[class_]->range2<1) - mob_db_data[class_]->range2=1; + if (db->range2<1) + db->range2=1; } if (battle_config.chase_range_rate!=100) { - mob_db_data[class_]->range3= - mob_db_data[class_]->range3 + db->range3= + db->range3 *battle_config.chase_range_rate/100; - if (mob_db_data[class_]->range3range2) - mob_db_data[class_]->range3=mob_db_data[class_]->range2; + if (db->range3range2) + db->range3=db->range2; } status->size=atoi(str[22]); status->race=atoi(str[23]); @@ -3317,25 +3318,26 @@ static int mob_readdb(void) status->mode=atoi(str[25]); status->speed=atoi(str[26]); status->aspd_rate = 1000; - status->adelay=atoi(str[27]); - status->amotion=atoi(str[28]); + db->min_thinktime=atoi(str[27]); + status->adelay = status->amotion=atoi(str[28]); + if (db->min_thinktime > status->adelay) + status->adelay = db->min_thinktime; + if (db->min_thinktime < MIN_MOBTHINKTIME) + db->min_thinktime = MIN_MOBTHINKTIME; status->dmotion=atoi(str[29]); - //If the attack animation is longer than the delay, the client crops the attack animation! - if (status->adelay < status->amotion) - status->adelay = status->amotion; if(battle_config.monster_damage_delay_rate != 100) status->dmotion = status->dmotion*battle_config.monster_damage_delay_rate/100; - data.level = mob_db_data[class_]->lv; + data.level = db->lv; memcpy(&data.status, status, sizeof(struct status_data)); - status_calc_misc(&data.bl, status, mob_db_data[class_]->lv); + status_calc_misc(&data.bl, status, db->lv); // MVP EXP Bonus, Chance: MEXP,ExpPer - mob_db_data[class_]->mexp=atoi(str[30])*battle_config.mvp_exp_rate/100; - mob_db_data[class_]->mexpper=atoi(str[31]); + db->mexp=atoi(str[30])*battle_config.mvp_exp_rate/100; + db->mexpper=atoi(str[31]); //Now that we know if it is an mvp or not, //apply battle_config modifiers [Skotlex] maxhp = (double)status->max_hp; - if (mob_db_data[class_]->mexp > 0) + if (db->mexp > 0) { //Mvp if (battle_config.mvp_hp_rate != 100) maxhp = maxhp * (double)battle_config.mvp_hp_rate /100.; @@ -3352,21 +3354,21 @@ static int mob_readdb(void) // MVP Drops: MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per for(i=0;i<3;i++){ struct item_data *id; - mob_db_data[class_]->mvpitem[i].nameid=atoi(str[32+i*2]); - if (!mob_db_data[class_]->mvpitem[i].nameid) { + db->mvpitem[i].nameid=atoi(str[32+i*2]); + if (!db->mvpitem[i].nameid) { //No item.... - mob_db_data[class_]->mvpitem[i].p = 0; + db->mvpitem[i].p = 0; continue; } - mob_db_data[class_]->mvpitem[i].p= mob_drop_adjust(atoi(str[33+i*2]), battle_config.item_rate_mvp, + db->mvpitem[i].p= mob_drop_adjust(atoi(str[33+i*2]), battle_config.item_rate_mvp, battle_config.item_drop_mvp_min, battle_config.item_drop_mvp_max); //calculate and store Max available drop chance of the MVP item - if (mob_db_data[class_]->mvpitem[i].p) { - id = itemdb_search(mob_db_data[class_]->mvpitem[i].nameid); - if (id->maxchance==10000 || (id->maxchance < mob_db_data[class_]->mvpitem[i].p/10+1) ) { + if (db->mvpitem[i].p) { + id = itemdb_search(db->mvpitem[i].nameid); + if (id->maxchance==10000 || (id->maxchance < db->mvpitem[i].p/10+1) ) { //item has bigger drop chance or sold in shops - id->maxchance = mob_db_data[class_]->mvpitem[i].p/10+1; //reduce MVP drop info to not spoil common drop rate + id->maxchance = db->mvpitem[i].p/10+1; //reduce MVP drop info to not spoil common drop rate } } } @@ -3376,13 +3378,13 @@ static int mob_readdb(void) unsigned short ratemin,ratemax; struct item_data *id; k=38+i*2; - mob_db_data[class_]->dropitem[i].nameid=atoi(str[k]); - if (!mob_db_data[class_]->dropitem[i].nameid) { + db->dropitem[i].nameid=atoi(str[k]); + if (!db->dropitem[i].nameid) { //No drop. - mob_db_data[class_]->dropitem[i].p = 0; + db->dropitem[i].p = 0; continue; } - type = itemdb_type(mob_db_data[class_]->dropitem[i].nameid); + type = itemdb_type(db->dropitem[i].nameid); rate = atoi(str[k+1]); if (class_ >= 1324 && class_ <= 1363) { //Treasure box drop rates [Skotlex] @@ -3436,19 +3438,19 @@ static int mob_readdb(void) ratemax = battle_config.item_drop_common_max; break; } - mob_db_data[class_]->dropitem[i].p = mob_drop_adjust(rate, rate_adjust, ratemin, ratemax); + db->dropitem[i].p = mob_drop_adjust(rate, rate_adjust, ratemin, ratemax); //calculate and store Max available drop chance of the item - if (mob_db_data[class_]->dropitem[i].p && + if (db->dropitem[i].p && (class_ < 1324 || class_ > 1363) //Skip treasure chests. ) { - id = itemdb_search(mob_db_data[class_]->dropitem[i].nameid); - if (id->maxchance==10000 || (id->maxchance < mob_db_data[class_]->dropitem[i].p) ) { + id = itemdb_search(db->dropitem[i].nameid); + if (id->maxchance==10000 || (id->maxchance < db->dropitem[i].p) ) { //item has bigger drop chance or sold in shops - id->maxchance = mob_db_data[class_]->dropitem[i].p; + id->maxchance = db->dropitem[i].p; } for (k = 0; k< MAX_SEARCH; k++) { - if (id->mob[k].chance < mob_db_data[class_]->dropitem[i].p && id->mob[k].id != class_) + if (id->mob[k].chance < db->dropitem[i].p && id->mob[k].id != class_) break; } if (k == MAX_SEARCH) @@ -3456,7 +3458,7 @@ static int mob_readdb(void) if (id->mob[k].id != class_) memmove(&id->mob[k+1], &id->mob[k], (MAX_SEARCH-k-1)*sizeof(id->mob[0])); - id->mob[k].chance = mob_db_data[class_]->dropitem[i].p; + id->mob[k].chance = db->dropitem[i].p; id->mob[k].id = class_; } } @@ -3900,6 +3902,7 @@ static int mob_read_sqldb(void) double exp, maxhp; long unsigned int ln = 0; struct status_data *status; + struct mob_db *db; char *mob_db_name[] = { mob_db_db, mob_db2_db }; struct mob_data data; memset(&data, 0, sizeof(struct mob_data)); @@ -3930,37 +3933,37 @@ static int mob_read_sqldb(void) continue; } if (mob_db_data[class_] == NULL) - mob_db_data[class_] = aCalloc(1, sizeof (struct mob_data)); - + db_data[class_] = aCalloc(1, sizeof (struct mob_data)); + db = mob_db_data[class_]; ln++; - mob_db_data[class_]->vd.class_ = class_; - memcpy(mob_db_data[class_]->sprite, TO_STR(1), NAME_LENGTH-1); - memcpy(mob_db_data[class_]->jname, TO_STR(2), NAME_LENGTH-1); - memcpy(mob_db_data[class_]->name, TO_STR(3), NAME_LENGTH-1); - mob_db_data[class_]->lv = TO_INT(4); - if (mob_db_data[class_]->lv < 1) - mob_db_data[class_]->lv = 1; + db->vd.class_ = class_; + memcpy(db->sprite, TO_STR(1), NAME_LENGTH-1); + memcpy(db->jname, TO_STR(2), NAME_LENGTH-1); + memcpy(db->name, TO_STR(3), NAME_LENGTH-1); + db->lv = TO_INT(4); + if (db->lv < 1) + db->lv = 1; - status = &mob_db_data[class_]->status; + status = &db->status; status->max_hp = TO_INT(5); status->max_sp = TO_INT(6); exp = (double)TO_INT(7) * (double)battle_config.base_exp_rate / 100.; if (exp < 0) - mob_db_data[class_]->base_exp = 0; + db->base_exp = 0; else if (exp > UINT_MAX) - mob_db_data[class_]->base_exp = UINT_MAX; + db->base_exp = UINT_MAX; else - mob_db_data[class_]->base_exp = (unsigned int)exp; + db->base_exp = (unsigned int)exp; exp = (double)TO_INT(8) * (double)battle_config.job_exp_rate / 100.; if (exp < 0) - mob_db_data[class_]->job_exp = 0; + db->job_exp = 0; else if (exp > UINT_MAX) - mob_db_data[class_]->job_exp = UINT_MAX; + db->job_exp = UINT_MAX; else - mob_db_data[class_]->job_exp = (unsigned int)exp; + db->job_exp = (unsigned int)exp; status->rhw.range = TO_INT(9); status->rhw.atk = TO_INT(10); @@ -3981,8 +3984,8 @@ static int mob_read_sqldb(void) if (status->dex < 1) status->dex = 1; if (status->luk < 1) status->luk = 1; - mob_db_data[class_]->range2 = TO_INT(20); - mob_db_data[class_]->range3 = TO_INT(21); + db->range2 = TO_INT(20); + db->range3 = TO_INT(21); status->size = TO_INT(22); status->race = TO_INT(23); i = TO_INT(24); //Element @@ -4001,26 +4004,27 @@ static int mob_read_sqldb(void) status->mode = TO_INT(25); status->speed = TO_INT(26); status->aspd_rate = 1000; - status->adelay = TO_INT(27); - status->amotion = TO_INT(28); + db->min_thinktime = TO_INT(27); + status->adelay = status->amotion = TO_INT(28); + if (db->min_thinktime > status->adelay) + status->adelay = db->min_thinktime; + if (db->min_thinktime < MIN_MOBTHINKTIME) + db->min_thinktime = MIN_MOBTHINKTIME; status->dmotion = TO_INT(29); - //If the attack animation is longer than the delay, the client crops the attack animation! - if (status->adelay < status->amotion) - status->adelay = status->amotion; if(battle_config.monster_damage_delay_rate != 100) status->dmotion = status->dmotion*battle_config.monster_damage_delay_rate/100; - data.level = mob_db_data[class_]->lv; + data.level = db->lv; memcpy(&data.status, status, sizeof(struct status_data)); - status_calc_misc(&data.bl, status, mob_db_data[class_]->lv); + status_calc_misc(&data.bl, status, db->lv); // MVP EXP Bonus, Chance: MEXP,ExpPer - mob_db_data[class_]->mexp = TO_INT(30) * battle_config.mvp_exp_rate / 100; - mob_db_data[class_]->mexpper = TO_INT(31); + db->mexp = TO_INT(30) * battle_config.mvp_exp_rate / 100; + db->mexpper = TO_INT(31); //Now that we know if it is an mvp or not, //apply battle_config modifiers [Skotlex] maxhp = (double)status->max_hp; - if (mob_db_data[class_]->mexp > 0) + if (db->mexp > 0) { //Mvp if (battle_config.mvp_hp_rate != 100) maxhp = maxhp * (double)battle_config.mvp_hp_rate /100.; @@ -4038,21 +4042,21 @@ static int mob_read_sqldb(void) // MVP Drops: MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per for (i=0; i<3; i++) { struct item_data *id; - mob_db_data[class_]->mvpitem[i].nameid = TO_INT(32+i*2); - if (!mob_db_data[class_]->mvpitem[i].nameid) { + db->mvpitem[i].nameid = TO_INT(32+i*2); + if (!db->mvpitem[i].nameid) { //No item.... - mob_db_data[class_]->mvpitem[i].p = 0; + db->mvpitem[i].p = 0; continue; } - mob_db_data[class_]->mvpitem[i].p = mob_drop_adjust(TO_INT(33+i*2), + db->mvpitem[i].p = mob_drop_adjust(TO_INT(33+i*2), battle_config.item_rate_mvp, battle_config.item_drop_mvp_min, battle_config.item_drop_mvp_max); //calculate and store Max available drop chance of the MVP item - id = itemdb_search(mob_db_data[class_]->mvpitem[i].nameid); - if (mob_db_data[class_]->mvpitem[i].p) { - if (id->maxchance==10000 || (id->maxchance < mob_db_data[class_]->mvpitem[i].p/10+1) ) { + id = itemdb_search(db->mvpitem[i].nameid); + if (db->mvpitem[i].p) { + if (id->maxchance==10000 || (id->maxchance < db->mvpitem[i].p/10+1) ) { //item has bigger drop chance or sold in shops - id->maxchance = mob_db_data[class_]->mvpitem[i].p/10+1; //reduce MVP drop info to not spoil common drop rate + id->maxchance = db->mvpitem[i].p/10+1; //reduce MVP drop info to not spoil common drop rate } } } @@ -4062,13 +4066,13 @@ static int mob_read_sqldb(void) unsigned short ratemin, ratemax; struct item_data *id; k=38+i*2; - mob_db_data[class_]->dropitem[i].nameid=TO_INT(k); - if (!mob_db_data[class_]->dropitem[i].nameid) { + db->dropitem[i].nameid=TO_INT(k); + if (!db->dropitem[i].nameid) { //No drop. - mob_db_data[class_]->dropitem[i].p = 0; + db->dropitem[i].p = 0; continue; } - type = itemdb_type(mob_db_data[class_]->dropitem[i].nameid); + type = itemdb_type(db->dropitem[i].nameid); rate = TO_INT(k+1); if (class_ >= 1324 && class_ <= 1363) { //Treasure box drop rates [Skotlex] @@ -4121,24 +4125,24 @@ static int mob_read_sqldb(void) ratemax = battle_config.item_drop_common_max; break; } - mob_db_data[class_]->dropitem[i].p = mob_drop_adjust(rate, rate_adjust, ratemin, ratemax); + db->dropitem[i].p = mob_drop_adjust(rate, rate_adjust, ratemin, ratemax); //calculate and store Max available drop chance of the item - if (mob_db_data[class_]->dropitem[i].p) { - id = itemdb_search(mob_db_data[class_]->dropitem[i].nameid); - if (id->maxchance==10000 || (id->maxchance < mob_db_data[class_]->dropitem[i].p) ) { + if (db->dropitem[i].p) { + id = itemdb_search(db->dropitem[i].nameid); + if (id->maxchance==10000 || (id->maxchance < db->dropitem[i].p) ) { //item has bigger drop chance or sold in shops - id->maxchance = mob_db_data[class_]->dropitem[i].p; + id->maxchance = db->dropitem[i].p; } for (k = 0; k< MAX_SEARCH; k++) { - if (id->mob[k].chance < mob_db_data[class_]->dropitem[i].p && id->mob[k].id != class_) + if (id->mob[k].chance < db->dropitem[i].p && id->mob[k].id != class_) break; } if (k == MAX_SEARCH) continue; if (id->mob[k].id != class_) memmove(&id->mob[k+1], &id->mob[k], (MAX_SEARCH-k-1)*sizeof(id->mob[0])); - id->mob[k].chance = mob_db_data[class_]->dropitem[i].p; + id->mob[k].chance = db->dropitem[i].p; id->mob[k].id = class_; } } diff --git a/src/map/mob.h b/src/map/mob.h index 3156ecf5d..7dedf948b 100644 --- a/src/map/mob.h +++ b/src/map/mob.h @@ -58,6 +58,7 @@ struct mob_db { char sprite[NAME_LENGTH],name[NAME_LENGTH],jname[NAME_LENGTH]; unsigned int base_exp,job_exp; unsigned int mexp,mexpper; + unsigned int min_thinktime; //Min think time, Recharge Time as aegis calls it. int range2,range3; short race2; // celest unsigned short lv; diff --git a/src/map/skill.c b/src/map/skill.c index cd4786022..f987e69d0 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -5675,8 +5675,8 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data) break; if(md) { - if(ud->skillid != NPC_EMOTION)//Set afterskill delay. - md->last_thinktime=tick + (tid==-1?md->status.adelay:md->status.amotion); + if(tid != -1) //Set afterskill delay. + md->last_thinktime=tick + md->status.amotion; if(battle_config.mob_ai&0x200) { //pass on delay to same skill. int i; for (i = 0; i < md->db->maxskill; i++) @@ -5866,7 +5866,8 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data) break; if(md) { - md->last_thinktime=tick + (tid==-1?md->status.adelay:md->status.amotion); + if (tid != -1) + md->last_thinktime=tick +md->status.amotion; if(battle_config.mob_ai&0x200) { //pass on delay to same skill. int i; for (i = 0; i < md->db->maxskill; i++) diff --git a/src/map/status.c b/src/map/status.c index bb95e6405..6a2ef578f 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -2398,8 +2398,8 @@ int status_calc_homunculus(struct homun_data *hd, int first) if((skill = merc_hom_checkskill(hd,HVAN_INSTRUCT)) > 0) { - status->int_ += 1 +skill/2 -skill/4 +skill/5; - status->str += 1 +2*(skill/3) +skill/4; + status->int_ += 1 +skill/2 +skill/4 +skill/5; + status->str += 1 +skill/3 +skill/3 +skill/4; } if((skill=merc_hom_checkskill(hd,HAMI_SKIN)) > 0) -- cgit v1.2.3-60-g2f50