diff options
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/battle.c | 18 | ||||
-rw-r--r-- | src/map/itemdb.c | 1 | ||||
-rw-r--r-- | src/map/map.h | 8 | ||||
-rw-r--r-- | src/map/mob.c | 9 | ||||
-rw-r--r-- | src/map/pc.c | 49 | ||||
-rw-r--r-- | src/map/skill.c | 5 | ||||
-rw-r--r-- | src/map/skill.h | 3 | ||||
-rw-r--r-- | src/map/status.c | 14 |
8 files changed, 93 insertions, 14 deletions
diff --git a/src/map/battle.c b/src/map/battle.c index 6b46a357e..707362f7f 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -1058,7 +1058,7 @@ static struct Damage battle_calc_mob_weapon_attack( struct Damage wd; int damage,damage2=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv); int flag,skill,ac_flag = 0,dmg_lv = 0; - int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0; + int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0,s_size=0; struct status_change *sc_data,*t_sc_data; short *sc_count; short *option, *opt1, *opt2; @@ -1074,6 +1074,7 @@ static struct Damage battle_calc_mob_weapon_attack( s_race = status_get_race(src); s_ele = status_get_attack_element(src); + s_size = status_get_size(src); sc_data = status_get_sc_data(src); sc_count = status_get_sc_count(src); option = status_get_option(src); @@ -1498,6 +1499,7 @@ static struct Damage battle_calc_mob_weapon_attack( int cardfix=100,i; cardfix=cardfix*(100-tsd->subele[s_ele])/100; // 属 性によるダメージ耐性 cardfix=cardfix*(100-tsd->subrace[s_race])/100; // 種族によるダメージ耐性 + cardfix=cardfix*(100-tsd->subsize[s_size])/100; if(mob_db[md->class_].mode & 0x20) cardfix=cardfix*(100-tsd->subrace[10])/100; else @@ -1616,7 +1618,7 @@ static struct Damage battle_calc_pc_weapon_attack( struct Damage wd; int damage,damage2,damage3=0,damage4=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv); int flag,skill,dmg_lv = 0; - int t_mode=0,t_race=0,t_size=1,s_race=7,s_ele=0; + int t_mode=0,t_race=0,t_size=1,s_race=7,s_ele=0,s_size=1; int t_race2=0; struct status_change *sc_data,*t_sc_data; short *sc_count; @@ -1640,6 +1642,7 @@ static struct Damage battle_calc_pc_weapon_attack( s_race=status_get_race(src); //種族 s_ele=status_get_attack_element(src); //属性 s_ele_=status_get_attack_element2(src); //左手属性 + s_size=status_get_size(src); sc_data=status_get_sc_data(src); //ステータス異常 sc_count=status_get_sc_count(src); //ステータス異常の数 option=status_get_option(src); //鷹とかペコとかカートとか @@ -2602,6 +2605,7 @@ static struct Damage battle_calc_pc_weapon_attack( cardfix=100; cardfix=cardfix*(100-tsd->subrace[s_race])/100; // 種族によるダメージ耐性 cardfix=cardfix*(100-tsd->subele[s_ele])/100; // 属性によるダメージ耐性 + cardfix=cardfix*(100-tsd->subsize[s_size])/100; if(status_get_mode(src) & 0x20) cardfix=cardfix*(100-tsd->subrace[10])/100; //ボスからの攻撃はダメージ減少 else @@ -2904,7 +2908,7 @@ struct Damage battle_calc_magic_attack( int aflag; int normalmagic_flag=1; int matk_flag = 1; - int ele=0,race=7,t_ele=0,t_race=7,t_mode = 0,cardfix,t_class,i; + int ele=0,race=7,size=1,t_ele=0,t_race=7,t_mode = 0,cardfix,t_class,i; struct map_session_data *sd=NULL,*tsd=NULL; struct mob_data *tmd = NULL; @@ -2925,6 +2929,7 @@ struct Damage battle_calc_magic_attack( matk2=status_get_matk2(bl); ele = skill_get_pl(skill_num); race = status_get_race(bl); + size = status_get_size(bl); t_ele = status_get_elem_type(target); t_race = status_get_race(target); t_mode = status_get_mode(target); @@ -3131,6 +3136,7 @@ struct Damage battle_calc_magic_attack( cardfix=100; cardfix=cardfix*(100-tsd->subele[ele])/100; // 属 性によるダメージ耐性 cardfix=cardfix*(100-tsd->subrace[race])/100; // 種族によるダメージ耐性 + cardfix=cardfix*(100-tsd->subsize[size])/100; cardfix=cardfix*(100-tsd->magic_subrace[race])/100; if(status_get_mode(bl) & 0x20) cardfix=cardfix*(100-tsd->magic_subrace[10])/100; @@ -3207,7 +3213,7 @@ struct Damage battle_calc_misc_attack( int int_=status_get_int(bl); // int luk=status_get_luk(bl); int dex=status_get_dex(bl); - int skill,ele,race,cardfix; + int skill,ele,race,size,cardfix; struct map_session_data *sd=NULL,*tsd=NULL; int damage=0,div_=1,blewcount=skill_get_blewcount(skill_num,skill_lv); struct Damage md; @@ -3311,6 +3317,7 @@ struct Damage battle_calc_misc_attack( ele = skill_get_pl(skill_num); race = status_get_race(bl); + size = status_get_size(bl); if(damagefix){ if(damage<1 && skill_num != NPC_DARKBREATH) @@ -3320,6 +3327,7 @@ struct Damage battle_calc_misc_attack( cardfix=100; cardfix=cardfix*(100-tsd->subele[ele])/100; // 属性によるダメージ耐性 cardfix=cardfix*(100-tsd->subrace[race])/100; // 種族によるダメージ耐性 + cardfix=cardfix*(100-tsd->subsize[size])/100; cardfix=cardfix*(100-tsd->misc_def_rate)/100; damage=damage*cardfix/100; } @@ -3605,6 +3613,8 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target, } if (hp || sp) pc_heal(sd, hp, sp); + if (sd->sp_drain_type && target->type == BL_PC) + battle_heal(NULL,target,0,-sp,0); } } if (target->type == BL_PC) { diff --git a/src/map/itemdb.c b/src/map/itemdb.c index 5e19b1aca..41e2e2a75 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -381,6 +381,7 @@ static int itemdb_readdb(void) fclose(fp); sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,filename[i]); ShowStatus(tmp_output); + ln=0; // reset to 0 } return 0; } diff --git a/src/map/map.h b/src/map/map.h index b8fe82539..99bceb884 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -285,11 +285,14 @@ struct map_session_data { unsigned short unstripable_equip; short add_damage_classid2[10],add_damage_class_count2; int add_damage_classrate2[10]; - short sp_gain_value; + short sp_gain_value, hp_gain_value; + short sp_drain_type; short ignore_def_mob, ignore_def_mob_; int hp_loss_tick, hp_loss_rate; short hp_loss_value, hp_loss_type; int addrace2[6],addrace2_[6]; + int subsize[3]; + short unequip_damage; short spiritball, spiritball_old; int spirit_timer[MAX_SKILL_LEVEL]; @@ -631,7 +634,8 @@ enum { SP_CRIT_ATK_RATE, SP_CRITICAL_ADDRACE, SP_NO_REGEN, SP_ADDEFF_WHENHIT, SP_AUTOSPELL_WHENHIT, // 2013-2017 SP_SKILL_ATK, SP_UNSTRIPABLE, SP_ADD_DAMAGE_BY_CLASS, // 2018-2020 - SP_SP_GAIN_VALUE, SP_IGNORE_DEF_MOB, SP_HP_LOSS_RATE, SP_ADDRACE2 // 2021-2023 + SP_SP_GAIN_VALUE, SP_IGNORE_DEF_MOB, SP_HP_LOSS_RATE, SP_ADDRACE2, SP_HP_GAIN_VALUE, // 2021-2025 + SP_SUBSIZE, SP_DAMAGE_WHEN_UNEQUIP // 2026 }; enum { diff --git a/src/map/mob.c b/src/map/mob.c index 14a9b564b..6b2e4e37a 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -2384,18 +2384,25 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type) if(sd) { - int sp = 0; + int sp = 0, hp = 0; if (sd->state.attack_type == BF_MAGIC && (i=pc_checkskill(sd,HW_SOULDRAIN))>0){ /* ソウルドレイン */ clif_skill_nodamage(src,&md->bl,HW_SOULDRAIN,i,1); sp += (status_get_lv(&md->bl))*(65+15*i)/100; } sp += sd->sp_gain_value; + hp += sd->hp_gain_value; if (sp > 0) { if(sd->status.sp + sp > sd->status.max_sp) sp = sd->status.max_sp - sd->status.sp; sd->status.sp += sp; clif_heal(sd->fd,SP_SP,sp); } + if (hp > 0) { + if(sd->status.hp + hp > sd->status.max_hp) + hp = sd->status.max_hp - sd->status.hp; + sd->status.hp += hp; + clif_heal(sd->fd,SP_HP,hp); + } } // map外に消えた人は計算から除くので diff --git a/src/map/pc.c b/src/map/pc.c index eac66bb97..4b2131f57 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -980,6 +980,8 @@ int pc_calc_skilltree(struct map_session_data *sd) if(battle_config.enable_upper_class){ //confで無?でなければ?み?む for(i=355;i<411;i++) sd->status.skill[i].id=i; + for(i=475;i<480;i++) + sd->status.skill[i].id=i; } }else{ do { @@ -1585,6 +1587,14 @@ int pc_bonus(struct map_session_data *sd,int type,int val) else if(sd->state.lr_flag == 1) sd->ignore_def_mob_ |= 1<<val; break; + case SP_HP_GAIN_VALUE: + if(!sd->state.lr_flag) + sd->hp_gain_value += val; + break; + case SP_DAMAGE_WHEN_UNEQUIP: + if(!sd->state.lr_flag) + sd->unequip_damage += val; + break; default: if(battle_config.error_log) printf("pc_bonus: unknown type %d %d !\n",type,val); @@ -1764,8 +1774,9 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) } else if(sd->state.lr_flag == 1) { sd->sp_drain_rate_ += type2; - sd->sp_drain_per_ += val; + sd->sp_drain_per_ += val; } + sd->sp_drain_type = 0; break; case SP_SP_DRAIN_VALUE: if(!sd->state.lr_flag) { @@ -1776,7 +1787,7 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) sd->sp_drain_rate_ += type2; sd->sp_drain_value_ += val; } - + sd->sp_drain_type = 0; break; case SP_WEAPON_COMA_ELE: if(sd->state.lr_flag != 2) @@ -1847,6 +1858,10 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) else sd->addrace2_[type2] += val; break; + case SP_SUBSIZE: + if(sd->state.lr_flag != 2) + sd->subsize[type2]+=val; + break; default: if(battle_config.error_log) @@ -1900,6 +1915,27 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val) sd->hp_loss_type = val; } break; + case SP_SP_DRAIN_RATE: + if(!sd->state.lr_flag) { + sd->sp_drain_rate += type2; + sd->sp_drain_per += type3; + } + else if(sd->state.lr_flag == 1) { + sd->sp_drain_rate_ += type2; + sd->sp_drain_per_ += type3; + } + sd->sp_drain_type = val; + break; + case SP_SP_DRAIN_VALUE: + if(!sd->state.lr_flag) { + sd->sp_drain_rate += type2; + sd->sp_drain_value += type3; + } + else if(sd->state.lr_flag == 1) { + sd->sp_drain_rate_ += type2; + sd->sp_drain_value_ += type3; + } + sd->sp_drain_type = val; default: if(battle_config.error_log) printf("pc_bonus3: unknown type %d %d %d %d!\n",type,type2,type3,val); @@ -4306,6 +4342,8 @@ int pc_allskillup(struct map_session_data *sd) if(battle_config.enable_upper_class){ //confで無?でなければ?み?む for(i=355;i<411;i++) sd->status.skill[i].id=i; + for(i=475;i<480;i++) + sd->status.skill[i].id=i; } } else { @@ -6067,6 +6105,13 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag) } else { clif_unequipitemack(sd,n,0,0); } + if (sd->unequip_damage > 0) { + short dmg = sd->unequip_damage; + if (dmg > sd->status.hp) + dmg = sd->status.hp; + pc_heal(sd,-dmg,0); + } + if(flag&1) { status_calc_pc(sd,0); if(sd->sc_count && sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele)) diff --git a/src/map/skill.c b/src/map/skill.c index 4bdf4ae2a..03704839f 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1588,7 +1588,10 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds if(sd->sp_drain_rate_ > 0 && sp < 1) sp = 1; else if(sd->sp_drain_rate_ < 0 && sp > -1) sp = -1; } - if(hp || sp) pc_heal(sd,hp,sp); + if(hp || sp) + pc_heal(sd,hp,sp); + if (sd->sp_drain_type && bl->type == BL_PC) + battle_heal(NULL,bl,0,-sp,0); } if((skillid || flag) && rdamage > 0) diff --git a/src/map/skill.h b/src/map/skill.h index c06ab270f..dc789aa4a 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -611,7 +611,8 @@ enum { WE_BABY, WE_CALLPARENT, WE_CALLBABY, - TK_RUN, + + TK_RUN = 411, TK_READYSTORM, TK_STORMKICK, TK_READYDOWN, diff --git a/src/map/status.c b/src/map/status.c index 74a7bd320..05c6c8baa 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -512,6 +512,9 @@ int status_calc_pc(struct map_session_data* sd,int first) sd->hp_loss_rate = sd->hp_loss_value = sd->hp_loss_type = 0; memset(sd->addrace2,0,sizeof(sd->addrace2)); memset(sd->addrace2_,0,sizeof(sd->addrace2_)); + sd->hp_gain_value = sd->sp_drain_type = 0; + memset(sd->subsize,0,sizeof(sd->subsize)); + sd->unequip_damage = 0; if(!sd->disguiseflag && sd->disguise) { sd->disguise=0; @@ -2786,11 +2789,16 @@ int status_get_size(struct block_list *bl) nullpo_retr(1, bl); if(bl->type==BL_MOB && (struct mob_data *)bl) return mob_db[((struct mob_data *)bl)->class_].size; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return 1; else if(bl->type==BL_PET && (struct pet_data *)bl) return mob_db[((struct pet_data *)bl)->class_].size; - else + else if(bl->type==BL_PC) { + struct map_session_data *sd = (struct map_session_data *)bl; + //if (pc_isriding(sd)) // fact or rumour? + // return 2; + if (pc_calc_upper(sd->status.class_) == 2) + return 0; + return 1; + } else return 1; } int status_get_mode(struct block_list *bl) |