int merc_hom_gainexp(struct homun_data *hd,int exp) { if(hd->homunculus.vaporize) return 1; if( hd->exp_next == 0 ) { hd->homunculus.exp = 0 ; return 0; } hd->homunculus.exp += exp; if(hd->homunculus.exp < hd->exp_next) { clif_hominfo(hd->master,hd,0); return 0; } //levelup do { merc_hom_levelup(hd) ; } while(hd->homunculus.exp > hd->exp_next && hd->exp_next != 0 ); if( hd->exp_next == 0 ) hd->homunculus.exp = 0 ; clif_specialeffect(&hd->bl,568,AREA); status_calc_homunculus(hd,0); status_percent_heal(&hd->bl, 100, 100); return 0; }
int merc_hom_shuffle(struct homun_data *hd) { struct map_session_data *sd; int lv, i, skillpts; unsigned int exp; struct s_skill b_skill[MAX_HOMUNSKILL]; if (!merc_is_hom_active(hd)) return 0; sd = hd->master; lv = hd->homunculus.level; exp = hd->homunculus.exp; memcpy(&b_skill, &hd->homunculus.hskill, sizeof(b_skill)); skillpts = hd->homunculus.skillpts; //Reset values to level 1. merc_reset_stats(hd); //Level it back up for (i = 1; i < lv && hd->exp_next; i++){ hd->homunculus.exp += hd->exp_next; // Should never happen, but who knows if( !merc_hom_levelup(hd) ){ break; } } if(hd->homunculus.class_ == hd->homunculusDB->evo_class) { //Evolved bonuses struct s_homunculus *hom = &hd->homunculus; struct h_stats *max = &hd->homunculusDB->emax, *min = &hd->homunculusDB->emin; hom->max_hp += rnd_value(min->HP, max->HP); hom->max_sp += rnd_value(min->SP, max->SP); hom->str += 10*rnd_value(min->str, max->str); hom->agi += 10*rnd_value(min->agi, max->agi); hom->vit += 10*rnd_value(min->vit, max->vit); hom->int_+= 10*rnd_value(min->int_,max->int_); hom->dex += 10*rnd_value(min->dex, max->dex); hom->luk += 10*rnd_value(min->luk, max->luk); } hd->homunculus.exp = exp; memcpy(&hd->homunculus.hskill, &b_skill, sizeof(b_skill)); hd->homunculus.skillpts = skillpts; clif_homskillinfoblock(sd); status_calc_homunculus(hd,0); status_percent_heal(&hd->bl, 100, 100); clif_specialeffect(&hd->bl,568,AREA); return 1; }
int merc_hom_gainexp(struct homun_data *hd,int exp) { int m_class; if(hd->homunculus.vaporize) return 1; if((m_class = hom_class2mapid(hd->homunculus.class_)) == -1) { ShowError("merc_hom_gainexp: Invalid class %d. \n", hd->homunculus.class_); return 0; } if( hd->exp_next == 0 || ((m_class&HOM_REG) && hd->homunculus.level >= battle_config.hom_max_level) || ((m_class&HOM_S) && hd->homunculus.level >= battle_config.hom_S_max_level) ) { hd->homunculus.exp = 0; return 0; } hd->homunculus.exp += exp; if(hd->homunculus.exp < hd->exp_next) { clif_hominfo(hd->master,hd,0); return 0; } // Do the levelup(s) while( hd->homunculus.exp > hd->exp_next ){ // Max level reached or error if( !merc_hom_levelup(hd) ){ break; } } if( hd->exp_next == 0 ) hd->homunculus.exp = 0 ; clif_specialeffect(&hd->bl,568,AREA); status_calc_homunculus(hd,0); status_percent_heal(&hd->bl, 100, 100); return 0; }
int merc_hom_gainexp(struct homun_data *hd,int exp) { struct map_session_data *sd; struct s_homunculus *hom; hom = &hd->homunculus; sd = hd->master; if(hd->homunculus.vaporize) return 1; if( hd->exp_next == 0 ) { hd->homunculus.exp = 0 ; return 0; } if (sd->sc.data[SC_EXPBOOST]) exp += exp*((sd->sc.data[SC_EXPBOOST]->val1)/100); hd->homunculus.exp += exp; if(hd->homunculus.exp < hd->exp_next) { clif_hominfo(hd->master,hd,0); return 0; } //levelup do { merc_hom_levelup(hd) ; } while(hd->homunculus.exp > hd->exp_next && hd->exp_next != 0 && hom->evomoment == 0 ); if( hd->exp_next == 0 ) hd->homunculus.exp = 0 ; clif_specialeffect(&hd->bl,705,AREA); status_calc_homunculus(hd,0); status_percent_heal(&hd->bl, 100, 100); return 0; }