diff -rNu athena-dev-2.1.1-mod0642/Readme0628 athena-dev-2.1.1-mod0643/Readme0628 --- athena-dev-2.1.1-mod0642/Readme0628 Thu Dec 25 17:38:06 2003 +++ athena-dev-2.1.1-mod0643/Readme0628 Fri Dec 26 02:08:26 2003 @@ -1,4 +1,50 @@ -------------- +//0643 by 死神 + +・色々と修正。 +・bMVPaddAtkRate削除。bAddRaceで処理するように変更。 +・bIgnoreDefEleとbIgnoreDefRace追加。 +bonus bIgnoreDefEle,n; n属性の敵の防御無視 +bonus bIgnoreDefRace,n; n種族の敵の防御無視 +・bMatkRate追加。魔法攻撃力を+n%上げます。よってbattle.cで計算していたロッドによる魔法攻撃力増幅の計算はなくしました。ステータス画面に上がった数値は表示されません。ダメージ計算の時に適用しています。 +・bCriticalDefに-を入れるとクリティカルを喰らう確率が上がるように変更。 +・NPC番号111は透明NPCですが落とし穴等のことを考えて表示を一切せずに +内部で処理だけするように変更。(flagを使うと何とかなりそうですがその +処理が全然わからなかったので透明NPCにクリックや名前の表示もできないように変更しました。) +・ショップの値段に-を入れるとitem_db.txtもしくはitem_value_db.txtの物を使うように変更。 +・スキルルアフのエフェクトがサイトと同じだったので修正。ついでにルアフの +ダメージも修正。 +・みすとれ巣によるとモンスター情報で表示される防御と魔法防御は乗算ではなく減算みたいなので修正。 +・他力本願ですがitem_db.txtの修正をお願いします。(全てのロッドにbonus bMatkRate,15; を入れる必要があります。その他の修正も必要です。) +・テストしていない物もかなりありますので問題があったら報告してください。 + (map/) + map.h 修正。 + map.c + map_quit() 修正。 + pc.h 修正。 + pc.c + pc_walk()、pc_stop_walking()、pc_setpos()、pc_authok() 修正。 + pc_calcstatus()、pc_bonus()、pc_natural_heal_sub() 修正。 + npc.h 修正。 + npc.c + npc_touch_areanpc()、npc_parse_shop() 修正。 + clif.c + clif_quitsave()、clif_getareachar_npc()、clif_spawnnpc() 修正。 + clif_skill_estimation() 修正。 + battle.c + battle_calc_magic_attack()、battle_calc_pc_weapon_attack() 修正。 + battle_calc_mob_weapon_attack() 修正。 + mob.c + mobskill_use() 修正。 + skill.c + skill_status_change_end()、skill_status_change_timer() 修正。 + skill_status_change_start() 修正。 + (db/) + const.txt 修正。 + (doc/) + item_bonus.txt 修正。 + +-------------- //0642 by 死神 ・装備バグ修正。(それだけ) diff -rNu athena-dev-2.1.1-mod0642/db/const.txt athena-dev-2.1.1-mod0643/db/const.txt --- athena-dev-2.1.1-mod0642/db/const.txt Tue Dec 23 22:31:38 2003 +++ athena-dev-2.1.1-mod0643/db/const.txt Fri Dec 26 00:19:02 2003 @@ -80,12 +80,14 @@ bSPrecovRate 73 bSpeedRate 74 bCriticalDef 75 -bMVPaddAtkRate 76 -bNearAtkDef 77 -bLongAtkDef 78 -bDoubleRate 79 -bDoubleAddRate 80 -bMatk 81 +bNearAtkDef 76 +bLongAtkDef 77 +bDoubleRate 78 +bDoubleAddRate 79 +bMatk 80 +bMatkRate 81 +bIgnoreDefEle 82 +bIgnoreDefRace 83 Eff_Stone 0 Eff_Freeze 1 diff -rNu athena-dev-2.1.1-mod0642/doc/item_bonus.txt athena-dev-2.1.1-mod0643/doc/item_bonus.txt --- athena-dev-2.1.1-mod0642/doc/item_bonus.txt Wed Dec 24 01:09:48 2003 +++ athena-dev-2.1.1-mod0643/doc/item_bonus.txt Fri Dec 26 02:05:26 2003 @@ -24,22 +24,28 @@ bonus bFlee2,n; 完全回避+n bonus bCastrate,n; 詠唱時間+n% bonus bUseSPrate,n; SP消費+n% -bonus bAtkEle,n; 武器にnの属性付与 1,水 2,土 3,火 4,風 5,毒 6,聖 7,闇 8,念 9,不死 -bonus bDefEle,n; 防具にnの属性付与 1,水 2,土 3,火 4,風 5,毒 6,聖 7,闇 8,念 9,不死 +bonus bAtkEle,n; 武器にnの属性付与 +0,無 1,水 2,土 3,火 4,風 5,毒 6,聖 7,闇 8,念 9,不死 +bonus bDefEle,n; 防具にnの属性付与 +0,無 1,水 2,土 3,火 4,風 5,毒 6,聖 7,闇 8,念 9,不死 bonus bBaseAtk,n; 基本攻撃力+n bonus bSpeed,n; 移動速度+n bonus bAspd,n; 攻撃速度+n bonus bSpeedRate,n; 移動速度+n% bonus bAspdRate,n; 攻撃速度+n% -bonus bHPrecovRate,n; HP自動回復率+n% -bonus bSPrecovRate,n; SP自動回復率+n% +bonus bHPrecovRate,n; HP自動回復率+n%(スキルによる回復は除く) +bonus bSPrecovRate,n; SP自動回復率+n%(スキルによる回復は除く) bonus bCriticalDef,n; クリティカルを喰らわない確率+n% -bonus bMVPaddAtkRate,n; MVPモンスターにn%のダメージ追加 bonus bNearAtkDef,n; 近距離攻撃のダメージをn%軽減(魔法とトラップ、鷹を除く) bonus bLongAtkDef,n; 遠距離攻撃のダメージをn%軽減(魔法とトラップ、鷹を除く) bonus bDoubleRate,n; ダブルアタック確率n%(武器無視で高い物だけ適用) bonus bDoubleAddRate,n; ダブルアタック確率+n%(武器無視) +bonus bMatkRate,n; 魔法攻撃力+n% +bonus bIgnoreDefEle,n; n属性の敵の防御無視 +0,無 1,水 2,土 3,火 4,風 5,毒 6,聖 7,闇 8,念 9,不死 +bonus bIgnoreDefRace,n n種族の敵の防御無視 +0,無形 1,不死 2,動物 3,植物 4,昆虫 5,魚貝 6,悪魔 7,人間 8,天使 9,竜族 10:ボスモンスター 11:ボスモンスター以外(普通のモンスター) bonus2 bAddEff,Eff_Blind,n; n%の確立で暗黒付与 bonus2 bAddEff,Eff_Sleep,n; n%の確立で睡眠付与 @@ -61,8 +67,15 @@ bonus2 bResEff,Eff_Confusion,n; 混乱耐性+n% bonus2 bResEff,Eff_Stone,n; 石化耐性+n% -bonus2 bAddSize,n,x; nサイズにx%のダメージ追加 0,小型 1,中型 2,大型 -bonus2 bAddRace,n,x; n種族にx%のダメージ追加 0,無形 1,不死 2,動物 3,植物 4,昆虫 5,魚貝 6,悪魔 7,人間 8,天使 9,竜族 -bonus2 bSubRace,n,x; n種族からのダメージx%軽減 0,無形 1,不死 2,動物 3,植物 4,昆虫 5,魚貝 6,悪魔 7,人間 8,天使 9,竜族 -bonus2 bAddEle,n,x; n属性にx%のダメージ追加 0,無 1,水 2,土 3,火 4,風 5,毒 6,聖 7,闇 8,念 9,不死 -bonus2 bSubEle,n,x; n属性からのダメージx%軽減 0,無 1,水 2,土 3,火 4,風 5,毒 6,聖 7,闇 8,念 9,不死 +bonus2 bAddSize,n,x; nサイズにx%のダメージ追加 +0,小型 1,中型 2,大型 +bonus2 bAddRace,n,x; n種族にx%のダメージ追加 +0,無形 1,不死 2,動物 3,植物 4,昆虫 5,魚貝 6,悪魔 7,人間 8,天使 9,竜族 + 10:ボスモンスター 11:ボスモンスター以外(普通のモンスター) +bonus2 bSubRace,n,x; n種族からのダメージx%軽減 +0,無形 1,不死 2,動物 3,植物 4,昆虫 5,魚貝 6,悪魔 7,人間 8,天使 9,竜族 + 10:ボスモンスター 11:ボスモンスター以外(普通のモンスター) +bonus2 bAddEle,n,x; n属性にx%のダメージ追加 +0,無 1,水 2,土 3,火 4,風 5,毒 6,聖 7,闇 8,念 9,不死 +bonus2 bSubEle,n,x; n属性からのダメージx%軽減 +0,無 1,水 2,土 3,火 4,風 5,毒 6,聖 7,闇 8,念 9,不死 diff -rNu athena-dev-2.1.1-mod0642/map/battle.c athena-dev-2.1.1-mod0643/map/battle.c --- athena-dev-2.1.1-mod0642/map/battle.c Wed Dec 24 01:15:40 2003 +++ athena-dev-2.1.1-mod0643/map/battle.c Fri Dec 26 01:14:02 2003 @@ -940,6 +940,9 @@ if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 ) // 睡眠中はクリティカルが倍に cri <<=1; + if(tsd && tsd->critical_def < 0) + cri -= tsd->critical_def; + if((rand() % 1000) < cri && skill_num==0 && // 判定(スキルの場合は無視) battle_config.enemy_critical && // 敵の判定 (tsd == NULL || (tsd && rand()%100 >= tsd->critical_def) ) ) @@ -1138,6 +1141,10 @@ cardfix=cardfix*(100-tsd->long_attack_def_rate)/100; if(flag&BF_SHORT) cardfix=cardfix*(100-tsd->near_attack_def_rate)/100; + if(mob_db[md->class].mexp > 0) + cardfix=cardfix*(100-tsd->subrace[10])/100; + else + cardfix=cardfix*(100-tsd->subrace[11])/100; damage=damage*cardfix/100; } // 属 性の適用 @@ -1226,6 +1233,7 @@ tsd=(struct map_session_data *)target; else tmd=(struct mob_data *)target; + t_ele=battle_get_elem_type(target); t_race=battle_get_race( target ); t_size=battle_get_size( target ); t_mode=battle_get_mode( target ); @@ -1328,6 +1336,9 @@ cri <<=1; } + if(tsd && tsd->critical_def < 0) + cri -= tsd->critical_def; + if(da == 0 && //ダブルアタックが発動していない (rand() % 1000) < cri && skill_num==0 && // 判定(スキルの場合は無視) (tsd == NULL || (tsd && rand()%100 >= tsd->critical_def) ) ) @@ -1531,12 +1542,23 @@ // 対 象の防御力によるダメージの減少 // ディバインプロテクション(ここでいいのかな?) if ( !(skill_num == MO_INVESTIGATE || skill_num == MO_EXTREMITYFIST)) { //DEF, VIT無視 + int mflag = 0; + if(tmd) { + if(tmd && mob_db[tmd->class].mexp > 0) + mflag = 2; + else + mflag = 1; + } t_vit = def2; vitbonusmax = (t_vit/20)*(t_vit/20)-1; - damage = damage * (100 - def1) /100 - - t_vit - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) ); - damage2 = damage2 * (100 - def1) /100 - - t_vit - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) ); + if( !(sd->ignore_def_ele & (1<ignore_def_race & (1<ignore_def_race & (1<<10)) ) || (mflag == 1 && !(sd->ignore_def_race & (1<<11)) ) ) ) + damage = damage * (100 - def1) /100 + - t_vit - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) ); + if( !(sd->ignore_def_ele_ & (1<ignore_def_race_ & (1<ignore_def_race_ & (1<<10)) ) || (mflag == 1 && !(sd->ignore_def_race_ & (1<<11)) ) ) ) + damage2 = damage2 * (100 - def1) /100 + - t_vit - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) ); } } } @@ -1577,19 +1599,26 @@ } // カード・ダメージUP修正 両手持ちの場合左手のカードも右手に適用,左手はカードによる補正はなし cardfix=100; - t_ele=battle_get_elem_type(target); cardfix=cardfix*(100+sd->addrace[t_race])/100; // 種族によるダメージ修正 cardfix=cardfix*(100+sd->addele[t_ele])/100; // 属 性によるダメージ修正 cardfix=cardfix*(100+sd->addsize[t_size])/100; // サイズによるダメージ修正 - if(tmd && mob_db[tmd->class].mexp > 0) - cardfix=cardfix*(100+sd->mvp_add_attack_rate)/100; + if(tmd) { + if(mob_db[tmd->class].mexp > 0) + cardfix=cardfix*(100+sd->addrace[10])/100; + else + cardfix=cardfix*(100+sd->addrace[11])/100; + } damage=damage*cardfix/100; cardfix=100; cardfix=cardfix*(100+sd->addrace_[t_race])/100; // 種族によるダメージ修正 cardfix=cardfix*(100+sd->addele_[t_ele])/100; // 属 性によるダメージ修正 cardfix=cardfix*(100+sd->addsize_[t_size])/100; // サイズによるダメージ修正 - if(tmd && mob_db[tmd->class].mexp > 0) - cardfix=cardfix*(100+sd->mvp_add_attack_rate_)/100; + if(tmd) { + if(mob_db[tmd->class].mexp > 0) + cardfix=cardfix*(100+sd->addrace_[10])/100; + else + cardfix=cardfix*(100+sd->addrace_[11])/100; + } damage2=damage2*cardfix/100; if( target->type==BL_PC ){ @@ -1738,7 +1767,7 @@ * 魔法ダメージ計算 *------------------------------------------ */ -struct Damage battle_calc_magic_attack( +struct Damage battle_calc_magic_attack( struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag) { int mdef1=battle_get_mdef(target); @@ -1756,9 +1785,8 @@ if( bl->type==BL_PC ){ sd=(struct map_session_data *)bl; - if( sd->weapontype1 == 0x0a) - // 杖によるMATK15%アップ - MATK_FIX(115,100); + if(sd->matk_rate != 100) + MATK_FIX(sd->matk_rate,100); } aflag=BF_MAGIC|BF_LONG|BF_SKILL; @@ -1849,7 +1877,9 @@ case AL_HOLYLIGHT: // ホーリーライト MATK_FIX( 125,100 ); break; - + case AL_RUWACH: + MATK_FIX( 145,100 ); + break; } if(normalmagic_flag){ // 一般魔法ダメージ計算 diff -rNu athena-dev-2.1.1-mod0642/map/clif.c athena-dev-2.1.1-mod0643/map/clif.c --- athena-dev-2.1.1-mod0642/map/clif.c Wed Dec 24 00:17:20 2003 +++ athena-dev-2.1.1-mod0643/map/clif.c Fri Dec 26 01:11:22 2003 @@ -820,6 +820,9 @@ unsigned char buf[64]; int len; + if(nd->class == INVISIBLE_NPC) + return 0; + len = clif_npc0078(nd,buf); clif_send(buf,len,&nd->bl,AREA); @@ -926,18 +929,6 @@ */ void clif_quitsave(int fd,struct map_session_data *sd) { - if(sd->status.pet_id && sd->pet_npcdata) { - pet_remove_map(sd); - if(sd->pet.intimate <= 0) { - intif_delete_petdata(sd->status.pet_id); - sd->status.pet_id = 0; - sd->pet_npcdata = NULL; - sd->petDB = NULL; - } - else - intif_save_petdata(sd->status.account_id,&sd->pet); - } - chrif_save(sd); map_quit(sd); } @@ -2265,22 +2256,14 @@ */ void clif_getareachar_npc(struct map_session_data* sd,struct npc_data* nd) { - int fd=sd->fd; + int len; - if(nd->class<0 || nd->state.flag&1 ) + if(nd->class<0 || nd->state.flag&1 || nd->class == INVISIBLE_NPC) return; - memset(WFIFOP(fd,0),0,packet_len_table[0x78]); - WFIFOW(fd,0)=0x78; - WFIFOL(fd,2)=nd->bl.id; - WFIFOW(fd,6)=nd->speed; - WFIFOW(fd,14)=nd->class; - WFIFOPOS(fd,46,nd->bl.x,nd->bl.y); - WFIFOB(fd,48)|=nd->dir&0x0f; - WFIFOB(fd,49)=5; - WFIFOB(fd,50)=5; - WFIFOSET(fd,packet_len_table[0x78]); - + len = clif_npc0078(nd,WFIFOP(sd->fd,0)); + WFIFOSET(sd->fd,len); + if(nd->chat_id){ clif_dispchat((struct chat_data*)map_id2bl(nd->chat_id),sd->fd); } @@ -2982,9 +2965,9 @@ WBUFW(buf, 4)=mob_db[md->class].lv; WBUFW(buf, 6)=mob_db[md->class].size; WBUFL(buf, 8)=md->hp; - WBUFW(buf,12)=(mob_db[md->class].def < 10000)? mob_db[md->class].def:100; + WBUFW(buf,12)=mob_db[md->class].vit; WBUFW(buf,14)=mob_db[md->class].race; - WBUFW(buf,16)=(mob_db[md->class].mdef < 10000)? mob_db[md->class].mdef:99; + WBUFW(buf,16)=mob_db[md->class].int_; WBUFW(buf,18)=mob_db[md->class].element%10; for(i=0;i<9;i++) WBUFB(buf,20+i)= battle_attr_fix(100,i+1,mob_db[md->class].element); diff -rNu athena-dev-2.1.1-mod0642/map/map.c athena-dev-2.1.1-mod0643/map/map.c --- athena-dev-2.1.1-mod0642/map/map.c Sun Dec 14 23:44:40 2003 +++ athena-dev-2.1.1-mod0643/map/map.c Thu Dec 25 22:50:30 2003 @@ -737,13 +737,26 @@ skill_status_change_clear(&sd->bl); // ステータス異常を解除する skill_clear_unitgroup(&sd->bl); // スキルユニットグループの削除 skill_cleartimerskill(&sd->bl); + pc_stop_walking(sd,0); pc_stopattack(sd); pc_delghosttimer(sd); pc_delspiritball(sd,sd->spiritball,1); + chrif_save(sd); storage_storage_quitsave(sd); // 倉庫を開いてるなら保存する clif_clearchar_area(&sd->bl,2); + if(sd->status.pet_id && sd->pet_npcdata) { + pet_remove_map(sd); + if(sd->pet.intimate <= 0) { + intif_delete_petdata(sd->status.pet_id); + sd->status.pet_id = 0; + sd->pet_npcdata = NULL; + sd->petDB = NULL; + } + else + intif_save_petdata(sd->status.account_id,&sd->pet); + } map_delblock(&sd->bl); numdb_erase(id_db,sd->bl.id); diff -rNu athena-dev-2.1.1-mod0642/map/map.h athena-dev-2.1.1-mod0643/map/map.h --- athena-dev-2.1.1-mod0642/map/map.h Tue Dec 23 22:48:08 2003 +++ athena-dev-2.1.1-mod0643/map/map.h Fri Dec 26 02:14:22 2003 @@ -167,14 +167,15 @@ int atk_ele,def_ele,star,overrefine; int wcard[8],dcard[16],wcard_count,dcard_count; int castrate,hprate,sprate,dsprate; - int addele[10],addrace[10],addsize[3],subele[10],subrace[10]; + int addele[10],addrace[12],addsize[3],subele[10],subrace[12]; int addeff[10],reseff[10]; - int watk_,watk_2,atkmods_[3],addele_[10],addrace_[10],addsize_[3]; //二刀流のために追加 + int watk_,watk_2,atkmods_[3],addele_[10],addrace_[12],addsize_[3]; //二刀流のために追加 int atk_ele_,star_,overrefine_; //二刀流のために追加 int base_atk,arrow_atk,arrow_ele; int nhealhp,nhealsp,nshealhp,nshealsp,nsshealhp,nsshealsp; int aspd_rate,speed_rate,hprecov_rate,sprecov_rate,critical_def,double_rate; - int mvp_add_attack_rate,mvp_add_attack_rate_,near_attack_def_rate,long_attack_def_rate; + int near_attack_def_rate,long_attack_def_rate; + int matk_rate,ignore_def_ele,ignore_def_race,ignore_def_ele_,ignore_def_race_; short spiritball, spiritball_old; int spirit_timer[10]; unsigned short combo_flag, skill_old; @@ -360,8 +361,9 @@ SP_ADDELE, SP_ADDRACE, SP_ADDSIZE, SP_SUBELE, SP_SUBRACE, // 63-67 SP_ADDEFF, SP_RESEFF, // 68-69 SP_BASE_ATK,SP_ASPD_RATE,SP_HP_RECOV_RATE,SP_SP_RECOV_RATE,SP_SPEED_RATE, //70-74 - SP_CRITICAL_DEF,SP_MVP_ADD_ATK_RATE,SP_NEAR_ATK_DEF,SP_LONG_ATK_DEF, //75-78 - SP_DOUBLE_RATE, SP_DOUBLE_ADD_RATE, SP_MATK, //79-81 + SP_CRITICAL_DEF,SP_NEAR_ATK_DEF,SP_LONG_ATK_DEF, //75-77 + SP_DOUBLE_RATE, SP_DOUBLE_ADD_RATE, SP_MATK, SP_MATK_RATE, //78-81 + SP_IGNORE_DEF_ELE,SP_IGNORE_DEF_RACE, //82-83 SP_CARTINFO=99, // 99 }; diff -rNu athena-dev-2.1.1-mod0642/map/mob.c athena-dev-2.1.1-mod0643/map/mob.c --- athena-dev-2.1.1-mod0642/map/mob.c Mon Dec 15 23:35:58 2003 +++ athena-dev-2.1.1-mod0643/map/mob.c Fri Dec 26 00:47:18 2003 @@ -2129,9 +2129,9 @@ // struct block_list *target=NULL; int i; - if(battle_config.mob_skill_use == 0) + if(battle_config.mob_skill_use == 0 || md->skilltimer != -1) return 0; - + for(i=0;iclass].maxskill;i++){ int c2=ms[i].cond2,flag=0; diff -rNu athena-dev-2.1.1-mod0642/map/npc.c athena-dev-2.1.1-mod0643/map/npc.c --- athena-dev-2.1.1-mod0642/map/npc.c Tue Dec 2 18:24:06 2003 +++ athena-dev-2.1.1-mod0643/map/npc.c Thu Dec 25 23:44:34 2003 @@ -242,15 +242,24 @@ printf("npc_touch_areanpc : some bug \n"); return 1; } + f=0; switch(map[m].npc[i]->bl.subtype){ case WARP: + f=1; pc_setpos(sd,map[m].npc[i]->u.warp.name,map[m].npc[i]->u.warp.x,map[m].npc[i]->u.warp.y,0); break; case SCRIPT: + f=1; npc_click(sd,map[m].npc[i]->bl.id); break; } - return 0; + if(f) { + sd->to_x = sd->bl.x; + sd->to_y = sd->bl.y; + clif_walkok(sd); + } + + return f; } /*========================================== @@ -513,8 +522,6 @@ *------------------------------------------ */ // warp行読み込み -#define WARP_CLASS 45 -#define WARP_DEBUG_CLASS 722 static int npc_parse_warp(char *w1,char *w2,char *w3,char *w4) { int x,y,xs,ys,to_x,to_y,m; @@ -617,7 +624,12 @@ if(sscanf(p,"%d:%d",&nameid,&value)!=2) break; nd->u.shop_item[pos].nameid=nameid; - nd->u.shop_item[pos].value=value; + if(value < 0) { + struct item_data *id = itemdb_search(nameid); + nd->u.shop_item[pos].value=id->value; + } + else + nd->u.shop_item[pos].value=value; pos++; p=strchr(p,','); } @@ -809,7 +821,6 @@ // イベント用ラベルデータのエクスポート label_db=script_get_label_db(); strdb_foreach(label_db,npc_event_export,nd); - return 0; } diff -rNu athena-dev-2.1.1-mod0642/map/npc.h athena-dev-2.1.1-mod0643/map/npc.h --- athena-dev-2.1.1-mod0642/map/npc.h Thu Oct 23 12:12:54 2003 +++ athena-dev-2.1.1-mod0643/map/npc.h Thu Dec 25 23:34:48 2003 @@ -3,6 +3,10 @@ #define START_NPC_NUM 110000000 +#define WARP_CLASS 45 +#define WARP_DEBUG_CLASS 722 +#define INVISIBLE_NPC 111 + int npc_event_dequeue(struct map_session_data *sd); int npc_event_timer(int tid,unsigned int tick,int id,int data); int npc_event(struct map_session_data *sd,const char *npcname); diff -rNu athena-dev-2.1.1-mod0642/map/pc.c athena-dev-2.1.1-mod0643/map/pc.c --- athena-dev-2.1.1-mod0642/map/pc.c Thu Dec 25 12:58:32 2003 +++ athena-dev-2.1.1-mod0643/map/pc.c Fri Dec 26 02:14:30 2003 @@ -513,7 +513,7 @@ for(i=0;isc_data[i].timer=-1; sd->sc_count=0; - sd->status.option&=0xfff8; + sd->status.option&=OPTION_MASK; // スキルユニット関係の初期化 memset(sd->skillunit,0,sizeof(sd->skillunit)); @@ -792,8 +792,10 @@ sd->sprecov_rate = 100; sd->critical_def = 0; sd->double_rate = 0; - sd->mvp_add_attack_rate = sd->mvp_add_attack_rate_ = 0; sd->near_attack_def_rate = sd->long_attack_def_rate = 0; + sd->matk_rate = 100; + sd->ignore_def_ele = sd->ignore_def_race = 0; + sd->ignore_def_ele_ = sd->ignore_def_race_ = 0; // 装備品によるステータス変化はここで実行 for(i=0;i<10;i++) { @@ -1377,12 +1379,6 @@ case SP_CRITICAL_DEF: sd->critical_def += val; break; - case SP_MVP_ADD_ATK_RATE: - if(!sd->state.lr_flag) - sd->mvp_add_attack_rate += val; - else if(sd->state.lr_flag == 1) - sd->mvp_add_attack_rate_ += val; - break; case SP_NEAR_ATK_DEF: sd->near_attack_def_rate += val; break; @@ -1397,6 +1393,21 @@ if(sd->state.lr_flag == 0) sd->double_rate += val; break; + case SP_MATK_RATE: + sd->matk_rate += val; + break; + case SP_IGNORE_DEF_ELE: + if(!sd->state.lr_flag) + sd->ignore_def_ele |= 1<state.lr_flag == 1) + sd->ignore_def_ele_ |= 1<state.lr_flag) + sd->ignore_def_race |= 1<state.lr_flag == 1) + sd->ignore_def_race_ |= 1<guild_alliance>0) // ギルド同盟勧誘を拒否する guild_reply_reqalliance(sd,sd->guild_alliance_account,0); + skill_castcancel(&sd->bl); + pc_stop_walking(sd,0); + pc_stopattack(sd); + if(sd->status.pet_id && sd->pet_npcdata && sd->pet.intimate > 0) + pet_changestate(sd->pet_npcdata,MS_IDLE); + memcpy(mapname,mapname_org,16); mapname[16]=0; if(strstr(mapname,".gat")==NULL && strlen(mapname)<11){ @@ -2118,18 +2135,11 @@ sd->bl.x = x; sd->bl.y = y; - sd->walkpath.path_half=0; - sd->walkpath.path_len=0; - sd->walkpath.path_pos=0; - if(sd->status.pet_id && sd->pet_npcdata && sd->pet.intimate > 0) { sd->pet_npcdata->bl.m = m; sd->pet_npcdata->bl.x = sd->pet_npcdata->to_x = x; sd->pet_npcdata->bl.y = sd->pet_npcdata->to_y = y; sd->pet_npcdata->dir = sd->dir; - sd->pet_npcdata->walkpath.path_half=0; - sd->pet_npcdata->walkpath.path_len=0; - sd->pet_npcdata->walkpath.path_pos=0; } // map_addblock(&sd->bl); /// ブロック登録とspawnは @@ -2243,7 +2253,7 @@ static int pc_walk(int tid,unsigned int tick,int id,int data) { struct map_session_data *sd; - int i,ctype; + int i,ctype,flag=0; int moveblock; int x,y,dx,dy; @@ -2317,9 +2327,9 @@ skill_unit_move(&sd->bl,tick,1); // スキルユニットの検査 if(map_getcell(sd->bl.m,x,y)&0x80) - npc_touch_areanpc(sd,sd->bl.m,x,y); + flag = npc_touch_areanpc(sd,sd->bl.m,x,y); } - if((i=calc_next_walk_step(sd))>0) { + if((i=calc_next_walk_step(sd))>0 && !flag) { i = i>>1; if(i <= 0) i = 1; @@ -2400,11 +2410,11 @@ delete_timer(sd->walktimer,pc_walk); sd->walktimer=-1; sd->walkpath.path_len=0; - if(type&0x01) - clif_fixpos(&sd->bl); if(sd->status.pet_id && sd->pet_npcdata) { pet_stop_walking(sd,sd->dir); } + if(type&0x01) + clif_fixpos(&sd->bl); } if(type&0x02 && battle_config.pc_damage_delay) sd->canmove_tick = gettick() + sd->dmotion; @@ -4173,7 +4183,8 @@ static int pc_natural_heal_sub(struct map_session_data *sd,va_list ap) { int skill; - if(sd->weight*100/sd->max_weight < battle_config.natural_heal_weight_rate && !pc_isdead(sd) && !pc_ishiding(sd) ) { + if( (battle_config.natural_heal_weight_rate > 100 || sd->weight*100/sd->max_weight < battle_config.natural_heal_weight_rate) && + !pc_isdead(sd) && !pc_ishiding(sd) ) { pc_natural_heal_hp(sd); pc_natural_heal_sp(sd); } diff -rNu athena-dev-2.1.1-mod0642/map/pc.h athena-dev-2.1.1-mod0643/map/pc.h --- athena-dev-2.1.1-mod0642/map/pc.h Fri Dec 19 00:11:26 2003 +++ athena-dev-2.1.1-mod0643/map/pc.h Thu Dec 25 23:38:52 2003 @@ -5,6 +5,9 @@ #include "map.h" +#define OPTION_MASK 0xd7f8 +#define CART_MASK 0x788 + #define pc_setdead(sd) ((sd)->state.dead_sit = 1) #define pc_setsit(sd) ((sd)->state.dead_sit = 2) #define pc_setstand(sd) ((sd)->state.dead_sit = 0) @@ -13,7 +16,7 @@ #define pc_setdir(sd,b,h) ((sd)->dir = (b) ,(sd)->head_dir = (h) ) #define pc_setchatid(sd,n) ((sd)->chatID = n) #define pc_ishiding(sd) ((sd)->status.option&0x0006) -#define pc_iscarton(sd) (((sd)->status.option&0x0008)||(0x0080<=(sd)->status.option&&(sd)->status.option<0x0800)) +#define pc_iscarton(sd) ((sd)->status.option&CART_MASK) #define pc_isfalcon(sd) ((sd)->status.option&0x0010) #define pc_isriding(sd) ((sd)->status.option&0x0020) #define pc_isinvisible(sd) ((sd)->status.option&0x0040) diff -rNu athena-dev-2.1.1-mod0642/map/skill.c athena-dev-2.1.1-mod0643/map/skill.c --- athena-dev-2.1.1-mod0642/map/skill.c Fri Dec 12 16:58:34 2003 +++ athena-dev-2.1.1-mod0643/map/skill.c Fri Dec 26 01:08:50 2003 @@ -3474,7 +3474,7 @@ skill_status_change_end( bl, SC_HIDDING, -1); skill_status_change_end( bl, SC_CLOAKING, -1); if( type==SC_RUWACH && battle_check_target( src,bl, BCT_ENEMY ) > 0) - skill_attack(BF_MAGIC,src,src,bl,(type==SC_SIGHT)?10:24,1,tick,0); + skill_attack(BF_MAGIC,src,src,bl,type,1,tick,0); } break; @@ -3552,12 +3552,15 @@ break; case SC_SIGHT: - case SC_RUWACH: *option&=~1; opt_flag=1; break; + case SC_RUWACH: + *option&=~8192; + opt_flag=1; + break; } - + if(opt_flag) /* optionの変更を伝える */ clif_changeoption(bl); @@ -3622,7 +3625,7 @@ case SC_SIGHT: /* サイト */ case SC_RUWACH: /* ルアフ */ { - const int range=AREA_SIZE; + const int range=AREA_SIZE-5; map_foreachinarea( skill_status_change_timer_sub, bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,0, bl,type,tick); @@ -4055,8 +4058,12 @@ *option|= ((type==SC_HIDDING)?2:4); opt_flag =1 ; break; - case SC_SIGHT: case SC_RUWACH: + case SC_SIGHT: *option|=1; + opt_flag=1; + break; + case SC_RUWACH: + *option|=8192; opt_flag=1; break; }