* Updated most of map-server to 1082

* Removed my own additions for skill delays using aspd
* Adapted skill_range_leniency to jA's code
* Fixed drop rates only limited to multiples of 100's
* Added missing code for castle_defense_rate
* Removed pc_undead_nofreeze
* Updated unrefineable items table
* Added 3 new script commands
* Added SC_SpeedUp0
* Merged itemdb_read for SQL and TXT
* Removed itemdb_read_cardillustnametable limited to TXT only
* Added reading itemslotcounttable.txt from the GRF to auto set number of slots per item
* Added a display message when reading itemslottable from the GRF
* Added options in battle_athena.conf to enable/disable reading the GRF

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@699 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
celest 2004-12-21 12:27:02 +00:00
parent ac63baa5da
commit fa6ecf8890
20 changed files with 867 additions and 343 deletions

View File

@ -1,5 +1,30 @@
Date Added Date Added
12/21 12/21
* Finished updating most of the map-server to 1082... i'll leave the more
technical ones for the other devs ^^; [celest]
* Added other new battle_athena options from jA 1082 ... descriptions not
translated yet [celest]
* Removed my own additions for skill delays using aspd and added jA's code [celest]
* Adapted skill_range_leniency to jA's code - should be more stable [celest]
* Fixed drop rates only limited to multiples of 100's - thanks to jathena
for pointing it out [celest]
* Added missing code for castle_defense_rate [celest]
* Removed pc_undead_nofreeze - no code for it [celest]
* Updated unrefineable items table - thanks to jathena [celest]
* Added 3 new script commands: [celest]
- skilleffect : shows a skill effect on the player
- doskill/skilluseid (originally by Qamera) : casts a skill on the player
- skillusepos : casts a skill on a position
* Added SC_SpeedUp0 [celest]
* Merged itemdb_read for SQL and TXT [celest]
* Moved itemdb_read_itemslottable in itemdb.c for better readability [celest]
* Removed itemdb_read_cardillustnametable limited to TXT only [celest]
* Added reading itemslotcounttable.txt from the GRF to auto set number of slots
per item [celest]
* Added a display message when reading itemslottable from the GRF [celest]
* Added options in battle_athena.conf to enable/disable reading the GRF for
indoorrswtable.txt, leveluseskillspamount.txt, num2cardillustnametable.txt,
itemslottable.txt & itemslotcounttable.txt [celest]
* Removed conf/npcs_list.txt, and placed it in npc/npcs_athena.conf * Removed conf/npcs_list.txt, and placed it in npc/npcs_athena.conf
12/20 12/20

View File

@ -349,8 +349,27 @@ natural_heal_skill_interval: 10000
// The maximum weight for a character to carry when the character stops healing naturally. (in %) // The maximum weight for a character to carry when the character stops healing naturally. (in %)
natural_heal_weight_rate: 50 natural_heal_weight_rate: 50
// You can turn the following 5 settings off if you don't need them,
// or if you're experiencing problems with GRF loading
//
// Override item names from GRF file? (Note 1) // Override item names from GRF file? (Note 1)
item_name_override_grffile: yes item_name_override_grffile: yes
//
// Override item equip positions from GRF file? (Note 1)
item_equip_override_grffile: yes
//
// Override item slots from GRF file? (Note 1)
item_slots_override_grffile: yes
//
// Override 'indoors' mapflags from GRF file? (Note 1)
indoors_override_grffile: yes
//
// Override SP used per level from GRF file? (Note 1)
// Turn this off if you have a customised skill_require_db.txt
skill_sp_override_grffile: yes
//
// Read card illustrations from GRF file? (Note 1)
cardillust_read_grffile: yes
// Are arrows are consumed when used on a bow? (Note 1) // Are arrows are consumed when used on a bow? (Note 1)
arrow_decrement: yes arrow_decrement: yes
@ -470,6 +489,9 @@ player_cloak_check_type: yes
// When a monster is cloaking, Whether the wall is checked or not. (Note 1) // When a monster is cloaking, Whether the wall is checked or not. (Note 1)
monster_cloak_check_type: no monster_cloak_check_type: no
// Damage adjustments for WOE battles against defending Guild monsters (Note 2)
castle_defense_rate: 100
// Melee damage adjustments for WoE battles (Guild Vs Guild) (Note 2) // Melee damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
gvg_short_attack_damage_rate: 100 gvg_short_attack_damage_rate: 100
@ -755,5 +777,43 @@ skill_range_leniency: 1
// Set this to 1 if your clients have langtype problems and can't display motd properly // Set this to 1 if your clients have langtype problems and can't display motd properly
motd_type: 0 motd_type: 0
// キャラのHP?率を設定。(100で正規の値)
hp_rate: 100
// キャラのSP?率を設定。(100で正規の値)
sp_rate: 100
//GMの行動制限 アイテ?ドロップ・倉庫出し入れ・ItemZeny交換
gm_can_drop_lv: 0
//全キャラがGMにHPメ???を常に送信するか
disp_hpmeter: no
//PC?亡時に、ドクロをドロップするか
//0:しない 1:PvP?ップのみ 2:いつでも
bone_drop: 0
//敵のアイテ?ドロップ率をレ?トごとに個別?率をかけるかどうか
//details = 0:個別設定なし(デフォルト) 1:それぞれ?率指定(百分率) ?detailsが0以外の場合、以前のドロップ?率は無視されます
// 2:それぞれ?率指定(百分率)、ドロップ率上限と下限を設定?ドロップ設定0は無視します
//例 details = 3 rate_1 = 1000 min = 20 ドロップ率1/10000?9/10000の物を10?に指定 10?しても20/10000未満の物は 20/10000に固定
item_rate_details: 0
//ドロップ設定1?9
item_rate_1: 100
item_rate_1_min: 1
item_rate_1_max: 9
//ドロップ設定10?99
item_rate_10: 100
item_rate_10_min: 10
item_rate_10_max: 99
//ドロップ設定100?999
item_rate_100: 100
item_rate_100_min: 100
item_rate_100_max: 999
//ドロップ設定1000?10000
item_rate_1000: 100
item_rate_1000_min: 1000
item_rate_1000_max: 10000
import: conf/import/battle_conf.txt import: conf/import/battle_conf.txt

View File

@ -5,6 +5,8 @@
Ayathoya items == Added but no effect ( all are "ect" itens) Ayathoya items == Added but no effect ( all are "ect" itens)
Skill databases == celest working on them i believe. Skill databases == celest working on them i believe.
12/21
* Added the new Quivers, updated Horse Crest [celest]
12/20 12/20
* removed extra {},,,,,,, from each tailing [Lupus] * removed extra {},,,,,,, from each tailing [Lupus]
* Corrected job requirements for some garments [celest] * Corrected job requirements for some garments [celest]

View File

@ -253,6 +253,7 @@ SC_SpeedPot0 37
SC_SpeedPot1 38 SC_SpeedPot1 38
SC_SpeedPot2 39 SC_SpeedPot2 39
SC_SpeedPot3 40 SC_SpeedPot3 40
SC_SpeedUp0 41
SC_ATKPot 185 SC_ATKPot 185
SC_MATKPot 186 SC_MATKPot 186
SC_EncPoison 6 SC_EncPoison 6

View File

@ -5,9 +5,9 @@
609,1761,40 609,1761,40
713,1770,2 713,1770,2
714,1757,600,1769,600,1765,600 714,1757,600,1769,600,1765,600
715,1756,10,1768,1 715,1756,100,1768,1
716,1762,10,1763,1,1761,1 716,1762,10,1763,1,1761,1
717,1754,10,1759,1 717,1754,100,1759,1
724,1761,50,1768,10 724,1761,50,1768,10
733,1764,50 733,1764,50
756,1765,50 756,1765,50
@ -34,14 +34,14 @@
969,1760,50,1765,50 969,1760,50,1765,50
984,1765,250 984,1765,250
985,1753,1000,1758,50 985,1753,1000,1758,50
990,1752,200 990,1752,2000
991,1754,50 991,1754,500
992,1755,50 992,1755,500
993,1756,50 993,1756,500
994,1752,600,1769,5 994,1752,6000,1769,5
995,1754,150,1759,5 995,1754,1500,1759,5
996,1755,150,1768,5 996,1755,1500,1768,5
997,1756,150,1760,5 997,1756,1500,1760,5
998,1770,100 998,1770,100
999,1753,100 999,1753,100
1000,1760,30 1000,1760,30
@ -78,8 +78,8 @@
2332,1751,700 2332,1751,700
2333,1751,1000,1757,10 2333,1751,1000,1757,10
2408,1770,700,1753,50 2408,1770,700,1753,50
2618,1755,50,1753,100,1764,10 2618,1755,500,1753,100,1764,10
5014,1754,200,1753,200 5014,1754,2000,1753,200
7002,1753,30,1762,5 7002,1753,30,1762,5
7008,1758,2 7008,1758,2
7010,1753,250,1763,1 7010,1753,250,1763,1
@ -93,7 +93,7 @@
7025,1758,800,1769,400,1768,800 7025,1758,800,1769,400,1768,800
7026,1765,50 7026,1765,50
7027,1767,100 7027,1767,100
7035,1752,1000 7035,1752,10000
7036,1754,100 7036,1754,1000
7053,1751,40 7053,1751,40

View File

@ -134,7 +134,7 @@
661,Sky_Apron,Soft Apron,2,20,0,50,,,,,10477567,2,,,,,{ pet 1275; },{} 661,Sky_Apron,Soft Apron,2,20,0,50,,,,,10477567,2,,,,,{ pet 1275; },{}
// Newer Items // Newer Items
662,Horse_Crest,Crest of the Horse,2,0,0,30,0,0,0,0,10477567,2,0,0,0,0,{ itemskill 29,5,"Increase Agility Level 5"; },{} 662,Horse_Crest,Crest of the Horse,2,0,0,30,0,0,0,0,10477567,2,0,0,0,0,{ skilleffect 29,5; sc_start SC_SpeedUp0,240000,0; },{}
664,Gift_Box_,Gift Box,2,20,0,200,,,,,10477567,2,,,,,{ getitem -4,1; },{}, 664,Gift_Box_,Gift Box,2,20,0,200,,,,,10477567,2,,,,,{ getitem -4,1; },{},
665,Gift_Box__,Gift Box,2,20,0,200,,,,,10477567,2,,,,,{ getitem -4,1; },{}, 665,Gift_Box__,Gift Box,2,20,0,200,,,,,10477567,2,,,,,{ getitem -4,1; },{},
666,Gift_Box___,Gift Box,2,20,0,200,,,,,10477567,2,,,,,{ getitem -4,1; },{}, 666,Gift_Box___,Gift Box,2,20,0,200,,,,,10477567,2,,,,,{ getitem -4,1; },{},
@ -1721,3 +1721,17 @@
12001,Heal_3,Heal Level 3,2,0,0,10,0,0,0,0,10477567,2,0,0,0,0,{ itemskill 28,3,"Heal Level 3"; },{} 12001,Heal_3,Heal Level 3,2,0,0,10,0,0,0,0,10477567,2,0,0,0,0,{ itemskill 28,3,"Heal Level 3"; },{}
12002,Heal_5,Heal Level 5,2,0,0,10,0,0,0,0,10477567,2,0,0,0,0,{ itemskill 28,5,"Heal Level 5"; },{} 12002,Heal_5,Heal Level 5,2,0,0,10,0,0,0,0,10477567,2,0,0,0,0,{ itemskill 28,5,"Heal Level 5"; },{}
12003,Teleport_1,Teleport Level 1,2,0,0,10,0,0,0,0,10477567,2,0,0,0,0,{ itemskill 26,1,"Teleport Level 1"; },{} 12003,Teleport_1,Teleport Level 1,2,0,0,10,0,0,0,0,10477567,2,0,0,0,0,{ itemskill 26,1,"Teleport Level 1"; },{}
// Arrow Quivers
12004,Arrow_Quiver,Arrow Quiver,2,,,250,,,,,10477567,2,,,,,{ getitem 1750,500; },{}
12005,Iron_Arrow_Quiver,Iron Arrow Quiver,2,,,250,,,,,10477567,2,,,,,{ getitem 1770,500; },{}
12006,Steel_Arrow_Quiver,Steel Arrow Quiver,2,,,250,,,,,10477567,2,,,,,{ getitem 1753,500; },{}
12007,Oridecon_Arrow_Quiver,Oridecon Arrow Quiver,2,,,250,,,,,10477567,2,,,,,{ getitem 1765,500; },{}
12008,Fire_Arrow_Quiver,Fire Arrow Quiver,2,,,250,,,,,10477567,2,,,,,{ getitem 1752,500; },{}
12009,Silver_Arrow_Quiver,Silver Arrow Quiver,2,,,250,,,,,10477567,2,,,,,{ getitem 1751,500; },{}
12010,Arrow_of_Wind_Quiver,Arrow of Wind Quiver,2,,,250,,,,,10477567,2,,,,,{ getitem 1755,500; },{}
12011,Stone_Arrow_Quiver,Stone Arrow Quiver,2,,,250,,,,,10477567,2,,,,,{ getitem 1756,500; },{}
12012,Crystal_Arrow_Quiver,Crystal Arrow Quiver,2,,,250,,,,,10477567,2,,,,,{ getitem 1754,500; },{}
12013,Shadow_Arrow_Quiver,Shadow Arrow Quiver,2,,,250,,,,,10477567,2,,,,,{ getitem 1767,500; },{}
12014,Immaterial_Arrow_Quiver,Immaterial Arrow Quiver,2,,,250,,,,,10477567,2,,,,,{ getitem 1757,500; },{}
12015,Rusty_Arrow_Quiver,Rusty Arrow Quiver,2,,,250,,,,,10477567,2,,,,,{ getitem 1762,500; },{}

View File

@ -544,9 +544,10 @@ int battle_get_baseatk(struct block_list *bl)
nullpo_retr(1, bl); nullpo_retr(1, bl);
sc_data=battle_get_sc_data(bl); sc_data=battle_get_sc_data(bl);
if(bl->type==BL_PC && (struct map_session_data *)bl) if(bl->type==BL_PC && (struct map_session_data *)bl) {
batk = ((struct map_session_data *)bl)->base_atk; //設定されているbase_atk batk = ((struct map_session_data *)bl)->base_atk; //設定されているbase_atk
else { //それ以外なら batk += ((struct map_session_data *)bl)->weapon_atk[((struct map_session_data *)bl)->status.weapon];
} else { //それ以外なら
int str,dstr; int str,dstr;
str = battle_get_str(bl); //STR str = battle_get_str(bl); //STR
dstr = str/10; dstr = str/10;
@ -935,6 +936,8 @@ int battle_get_speed(struct block_list *bl)
speed -= (speed*(sc_data[SC_WINDWALK].val1*2))/100; speed -= (speed*(sc_data[SC_WINDWALK].val1*2))/100;
if(sc_data[SC_SLOWDOWN].timer!=-1) if(sc_data[SC_SLOWDOWN].timer!=-1)
speed = speed*150/100; speed = speed*150/100;
if(sc_data[SC_SPEEDUP0].timer!=-1)
speed -= speed*25/100;
} }
if(speed < 1) speed = 1; if(speed < 1) speed = 1;
return speed; return speed;
@ -1653,6 +1656,10 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
} }
if(map[bl->m].flag.gvg && damage > 0) { //GvG if(map[bl->m].flag.gvg && damage > 0) { //GvG
if(bl->type == BL_MOB){ //defenseがあればダメージが減るらしい
struct guild_castle *gc=guild_mapname2gc(map[bl->m].name);
if (gc) damage -= damage*(gc->defense/100)*(battle_config.castle_defense_rate/100);
}
if(flag&BF_WEAPON) { if(flag&BF_WEAPON) {
if(flag&BF_SHORT) if(flag&BF_SHORT)
damage=damage*battle_config.gvg_short_damage_rate/100; damage=damage*battle_config.gvg_short_damage_rate/100;
@ -1681,6 +1688,33 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
return damage; return damage;
} }
/*==========================================
* HP/SP吸収の計算
*------------------------------------------
*/
int battle_calc_drain(int damage, int rate, int per, int val)
{
int diff = 0;
if (damage <= 0 || rate <= 0)
return 0;
if (per && rand()%100 < rate) {
diff = (damage * per) / 100;
if (diff == 0) {
if (per > 0)
diff = 1;
else
diff = -1;
}
}
if (val && rand()%100 < rate) {
diff += val;
}
return diff;
}
/*========================================== /*==========================================
* *
*------------------------------------------ *------------------------------------------
@ -1925,7 +1959,7 @@ static struct Damage battle_calc_pet_weapon_attack(
hitrate = (hitrate*(100+5*skill_lv))/100; hitrate = (hitrate*(100+5*skill_lv))/100;
break; break;
case SM_MAGNUM: // マグナムブレイク case SM_MAGNUM: // マグナムブレイク
damage = damage*(5*skill_lv +(wflag)?65:115 )/100; damage = damage*(5*skill_lv + (wflag?65:115))/100;
break; break;
case MC_MAMMONITE: // メマーナイト case MC_MAMMONITE: // メマーナイト
damage = damage*(100+ 50*skill_lv)/100; damage = damage*(100+ 50*skill_lv)/100;
@ -2045,6 +2079,7 @@ static struct Damage battle_calc_pet_weapon_attack(
hitrate= 1000000; hitrate= 1000000;
break; break;
case AM_DEMONSTRATION: // デモンストレーション case AM_DEMONSTRATION: // デモンストレーション
hitrate= 1000000;
damage = damage*(100+ 20*skill_lv)/100; damage = damage*(100+ 20*skill_lv)/100;
damage2 = damage2*(100+ 20*skill_lv)/100; damage2 = damage2*(100+ 20*skill_lv)/100;
break; break;
@ -2127,7 +2162,7 @@ static struct Damage battle_calc_pet_weapon_attack(
if( skill_num!=NPC_CRITICALSLASH ){ if( skill_num!=NPC_CRITICALSLASH ){
// 対 象の防御力によるダメージの減少 // 対 象の防御力によるダメージの減少
// ディバインプロテクション(ここでいいのかな?) // ディバインプロテクション(ここでいいのかな?)
if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000 ) { //DEF, VIT無視 if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && skill_num != AM_ACIDTERROR && def1 < 1000000 ) { //DEF, VIT無視
int t_def; int t_def;
target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penalty_count_lv); target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penalty_count_lv);
if(battle_config.vit_penalty_type > 0) { if(battle_config.vit_penalty_type > 0) {
@ -2413,7 +2448,7 @@ static struct Damage battle_calc_mob_weapon_attack(
hitrate = (hitrate*(100+5*skill_lv))/100; hitrate = (hitrate*(100+5*skill_lv))/100;
break; break;
case SM_MAGNUM: // マグナムブレイク case SM_MAGNUM: // マグナムブレイク
damage = damage*(5*skill_lv +(wflag)?65:115 )/100; damage = damage*(5*skill_lv +(wflag?65:115))/100;
break; break;
case MC_MAMMONITE: // メマーナイト case MC_MAMMONITE: // メマーナイト
damage = damage*(100+ 50*skill_lv)/100; damage = damage*(100+ 50*skill_lv)/100;
@ -2540,6 +2575,7 @@ static struct Damage battle_calc_mob_weapon_attack(
hitrate= 1000000; hitrate= 1000000;
break; break;
case AM_DEMONSTRATION: // デモンストレーション case AM_DEMONSTRATION: // デモンストレーション
hitrate = 1000000;
damage = damage*(100+ 20*skill_lv)/100; damage = damage*(100+ 20*skill_lv)/100;
damage2 = damage2*(100+ 20*skill_lv)/100; damage2 = damage2*(100+ 20*skill_lv)/100;
break; break;
@ -2622,7 +2658,7 @@ static struct Damage battle_calc_mob_weapon_attack(
if( skill_num!=NPC_CRITICALSLASH ){ if( skill_num!=NPC_CRITICALSLASH ){
// 対 象の防御力によるダメージの減少 // 対 象の防御力によるダメージの減少
// ディバインプロテクション(ここでいいのかな?) // ディバインプロテクション(ここでいいのかな?)
if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000) { //DEF, VIT無視 if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && skill_num != KN_AUTOCOUNTER && def1 < 1000000) { //DEF, VIT無視
int t_def; int t_def;
target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penalty_count_lv); target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penalty_count_lv);
if(battle_config.vit_penalty_type > 0) { if(battle_config.vit_penalty_type > 0) {
@ -2988,9 +3024,9 @@ static struct Damage battle_calc_pc_weapon_attack(
{ {
damage += atkmax; damage += atkmax;
damage2 += atkmax_; damage2 += atkmax_;
if(sd->atk_rate != 100) { if(sd->atk_rate != 100 || sd->weapon_atk_rate != 0) {
damage = (damage * sd->atk_rate)/100; damage = (damage * (sd->atk_rate + sd->weapon_atk_rate[sd->status.weapon]))/100;
damage2 = (damage2 * sd->atk_rate)/100; damage2 = (damage2 * (sd->atk_rate + sd->weapon_atk_rate[sd->status.weapon]))/100;
} }
if(sd->state.arrow_atk) if(sd->state.arrow_atk)
damage += sd->arrow_atk; damage += sd->arrow_atk;
@ -3038,9 +3074,9 @@ static struct Damage battle_calc_pc_weapon_attack(
damage2 += atkmin_ + rand() % (atkmax_-atkmin_ + 1); damage2 += atkmin_ + rand() % (atkmax_-atkmin_ + 1);
else else
damage2 += atkmin_ ; damage2 += atkmin_ ;
if(sd->atk_rate != 100) { if(sd->atk_rate != 100 || sd->weapon_atk_rate != 0) {
damage = (damage * sd->atk_rate)/100; damage = (damage * (sd->atk_rate + sd->weapon_atk_rate[sd->status.weapon]))/100;
damage2 = (damage2 * sd->atk_rate)/100; damage2 = (damage2 * (sd->atk_rate + sd->weapon_atk_rate[sd->status.weapon]))/100;
} }
if(sd->state.arrow_atk) { if(sd->state.arrow_atk) {
@ -3119,8 +3155,8 @@ static struct Damage battle_calc_pc_weapon_attack(
hitrate = (hitrate*(100+5*skill_lv))/100; hitrate = (hitrate*(100+5*skill_lv))/100;
break; break;
case SM_MAGNUM: // マグナムブレイク case SM_MAGNUM: // マグナムブレイク
damage = damage*(5*skill_lv +(wflag)?65:115 )/100; damage = damage*(5*skill_lv +(wflag?65:115) )/100;
damage2 = damage2*(5*skill_lv +(wflag)?65:115 )/100; damage2 = damage2*(5*skill_lv +(wflag?65:115) )/100;
break; break;
case MC_MAMMONITE: // メマーナイト case MC_MAMMONITE: // メマーナイト
damage = damage*(100+ 50*skill_lv)/100; damage = damage*(100+ 50*skill_lv)/100;
@ -3327,11 +3363,15 @@ static struct Damage battle_calc_pc_weapon_attack(
case AM_DEMONSTRATION: // デモンストレーション case AM_DEMONSTRATION: // デモンストレーション
damage = damage*(100+ 20*skill_lv)/100; damage = damage*(100+ 20*skill_lv)/100;
damage2 = damage2*(100+ 20*skill_lv)/100; damage2 = damage2*(100+ 20*skill_lv)/100;
no_cardfix = 1;
break; break;
case AM_ACIDTERROR: // アシッドテラー case AM_ACIDTERROR: // アシッドテラー
hitrate = 1000000; hitrate = 1000000;
damage = damage*(100+ 40*skill_lv)/100; damage = damage*(100+ 40*skill_lv)/100;
damage2 = damage2*(100+ 40*skill_lv)/100; damage2 = damage2*(100+ 40*skill_lv)/100;
s_ele = 0;
s_ele_ = 0;
no_cardfix = 1;
break; break;
case MO_FINGEROFFENSIVE: //指弾 case MO_FINGEROFFENSIVE: //指弾
if(battle_config.finger_offensive_type == 0) { if(battle_config.finger_offensive_type == 0) {
@ -3374,11 +3414,6 @@ static struct Damage battle_calc_pc_weapon_attack(
damage2 = damage2*(240+ 60*skill_lv)/100; damage2 = damage2*(240+ 60*skill_lv)/100;
break; break;
case BA_MUSICALSTRIKE: // ミュージカルストライク case BA_MUSICALSTRIKE: // ミュージカルストライク
if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
int arr = rand()%(sd->arrow_atk+1);
damage += arr;
damage2 += arr;
}
damage = damage*(60+ 40 * skill_lv)/100; damage = damage*(60+ 40 * skill_lv)/100;
damage2 = damage2*(60+ 40 * skill_lv)/100; damage2 = damage2*(60+ 40 * skill_lv)/100;
if(sd->arrow_ele > 0) { if(sd->arrow_ele > 0) {
@ -3386,7 +3421,6 @@ static struct Damage battle_calc_pc_weapon_attack(
s_ele_ = sd->arrow_ele; s_ele_ = sd->arrow_ele;
} }
flag=(flag&~BF_RANGEMASK)|BF_LONG; flag=(flag&~BF_RANGEMASK)|BF_LONG;
sd->state.arrow_atk = 1;
break; break;
case DC_THROWARROW: // 矢撃ち case DC_THROWARROW: // 矢撃ち
if(!sd->state.arrow_atk && sd->arrow_atk > 0) { if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
@ -3443,11 +3477,6 @@ static struct Damage battle_calc_pc_weapon_attack(
damage2 += damage2*(30*skill_lv)/100; damage2 += damage2*(30*skill_lv)/100;
break; break;
case CG_ARROWVULCAN: /* アローバルカン */ case CG_ARROWVULCAN: /* アローバルカン */
if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
int arr = rand()%(sd->arrow_atk+1);
damage += arr;
damage2 += arr;
}
damage = damage*(200+100*skill_lv)/100; damage = damage*(200+100*skill_lv)/100;
damage2 = damage2*(200+100*skill_lv)/100; damage2 = damage2*(200+100*skill_lv)/100;
div_=9; div_=9;
@ -3456,7 +3485,6 @@ static struct Damage battle_calc_pc_weapon_attack(
s_ele_ = sd->arrow_ele; s_ele_ = sd->arrow_ele;
} }
flag=(flag&~BF_RANGEMASK)|BF_LONG; flag=(flag&~BF_RANGEMASK)|BF_LONG;
sd->state.arrow_atk = 1;
break; break;
case AS_SPLASHER: /* ベナムスプラッシャー */ case AS_SPLASHER: /* ベナムスプラッシャー */
damage = damage*(200+20*skill_lv+20*pc_checkskill(sd,AS_POISONREACT))/100; damage = damage*(200+20*skill_lv+20*pc_checkskill(sd,AS_POISONREACT))/100;
@ -3520,7 +3548,7 @@ static struct Damage battle_calc_pc_weapon_attack(
if( skill_num!=NPC_CRITICALSLASH ){ if( skill_num!=NPC_CRITICALSLASH ){
// 対 象の防御力によるダメージの減少 // 対 象の防御力によるダメージの減少
// ディバインプロテクション(ここでいいのかな?) // ディバインプロテクション(ここでいいのかな?)
if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000) { //DEF, VIT無視 if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && skill_num != AM_ACIDTERROR && def1 < 1000000) { //DEF, VIT無視
int t_def; int t_def;
target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penalty_count_lv); target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penalty_count_lv);
if(battle_config.vit_penalty_type > 0) { if(battle_config.vit_penalty_type > 0) {
@ -3582,11 +3610,23 @@ static struct Damage battle_calc_pc_weapon_attack(
// 状態異常中のダメージ追加でクリティカルにも有効なスキル // 状態異常中のダメージ追加でクリティカルにも有効なスキル
if (sc_data) { if (sc_data) {
// エンチャントデッドリーポイズン // エンチャントデッドリーポイズン
if(sc_data[SC_EDP].timer != -1 && skill_num != ASC_BREAKER && skill_num != ASC_METEORASSAULT) { if(!no_cardfix && sc_data[SC_EDP].timer != -1 && skill_num != ASC_BREAKER && skill_num != ASC_METEORASSAULT) {
damage += damage * (150 + sc_data[SC_EDP].val1 * 50) / 100; damage += damage * (150 + sc_data[SC_EDP].val1 * 50) / 100;
damage2 += damage2 * (150 + sc_data[SC_EDP].val1 * 50) / 100;
no_cardfix = 1; no_cardfix = 1;
} }
if (!skill_num && !(t_mode&0x20) && sc_data[SC_SACRIFICE].timer != -1) {
int mhp = battle_get_max_hp(src);
int dmg = mhp * (5 + sc_data[SC_SACRIFICE].val1 * 5) / 1000;
pc_heal(sd, -dmg, 0);
damage = dmg * (90 + sc_data[SC_SACRIFICE].val1 * 15) / 100;
damage2 = 0;
hitrate = 1000000;
s_ele = 0;
s_ele_ = 0;
sc_data[SC_SACRIFICE].val2 --;
if (sc_data[SC_SACRIFICE].val2 == 0)
skill_status_change_end(src, SC_SACRIFICE,-1);
}
} }
// 精錬ダメージの追加 // 精錬ダメージの追加
@ -4178,7 +4218,7 @@ struct Damage battle_calc_magic_attack(
break; break;
case WZ_STORMGUST: // ストームガスト case WZ_STORMGUST: // ストームガスト
MATK_FIX( skill_lv*40+100 ,100 ); MATK_FIX( skill_lv*40+100 ,100 );
blewcount|=0x10000; // blewcount|=0x10000;
break; break;
case AL_HOLYLIGHT: // ホーリーライト case AL_HOLYLIGHT: // ホーリーライト
MATK_FIX( 125,100 ); MATK_FIX( 125,100 );
@ -4387,6 +4427,8 @@ struct Damage battle_calc_misc_attack(
damage=(dex/10+int_/2+skill*3+40)*2; damage=(dex/10+int_/2+skill*3+40)*2;
if(flag > 1) if(flag > 1)
damage /= flag; damage /= flag;
if(battle_get_mode(target) & 0x40)
damage = 1;
break; break;
case TF_THROWSTONE: // 石投げ case TF_THROWSTONE: // 石投げ
@ -4424,12 +4466,17 @@ struct Damage battle_calc_misc_attack(
break; break;
case SN_FALCONASSAULT: /* ファルコンアサルト */ case SN_FALCONASSAULT: /* ファルコンアサルト */
#ifdef TWILIGHT #ifdef TWILIGHT
skill = pc_checkskill(sd,HT_BLITZBEAT); if( sd==NULL || (skill = pc_checkskill(sd,HT_BLITZBEAT)) <= 0)
damage=(100+50*skill_lv+(dex/10+int_/2+skill*3+40)*2) * 2; skill=0;
#else #else
skill = pc_checkskill(sd,HT_STEELCROW); // Celest if( sd==NULL || (skill = pc_checkskill(sd,HT_STEELCROW)) <= 0)
damage=((150+50*skill_lv)*(dex/10+int_/2+skill*3+40)*2)/100; skill=0;
damage=((150+50*skill_lv)*(dex/10+int_/2+skill*3+40)*2)/100; // [Celest]
#endif #endif
if(flag > 1)
damage /= flag;
if(battle_get_mode(target) & 0x40)
damage = 1;
break; break;
} }
@ -4708,26 +4755,22 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
} }
if (wd.flag&BF_WEAPON && src != target && (wd.damage > 0 || wd.damage2 > 0)) { if (wd.flag&BF_WEAPON && src != target && (wd.damage > 0 || wd.damage2 > 0)) {
int hp = 0,sp = 0; int hp = 0,sp = 0;
if(sd->hp_drain_rate && sd->hp_drain_per > 0 && wd.damage > 0 && rand()%100 < sd->hp_drain_rate) { if (!battle_config.left_cardfix_to_right) { // 二刀流左手カードの吸収系効果を右手に追加しない場合
hp += (wd.damage * sd->hp_drain_per)/100; hp += battle_calc_drain(wd.damage, sd->hp_drain_rate, sd->hp_drain_per, sd->hp_drain_value);
if(sd->hp_drain_rate > 0 && hp < 1) hp = 1; hp += battle_calc_drain(wd.damage2, sd->hp_drain_rate_, sd->hp_drain_per_, sd->hp_drain_value_);
else if(sd->hp_drain_rate < 0 && hp > -1) hp = -1; sp += battle_calc_drain(wd.damage, sd->sp_drain_rate, sd->sp_drain_per, sd->sp_drain_value);
} sp += battle_calc_drain(wd.damage2, sd->sp_drain_rate_, sd->sp_drain_per_, sd->sp_drain_value_);
if(sd->hp_drain_rate_ && sd->hp_drain_per_ > 0 && wd.damage2 > 0 && rand()%100 < sd->hp_drain_rate_) { } else { // 二刀流左手カードの吸収系効果を右手に追加する場合
hp += (wd.damage2 * sd->hp_drain_per_)/100; int hp_drain_rate = sd->hp_drain_rate + sd->hp_drain_rate_;
if(sd->hp_drain_rate_ > 0 && hp < 1) hp = 1; int hp_drain_per = sd->hp_drain_per + sd->hp_drain_per_;
else if(sd->hp_drain_rate_ < 0 && hp > -1) hp = -1; int hp_drain_value = sd->hp_drain_value + sd->hp_drain_value_;
} int sp_drain_rate = sd->sp_drain_rate + sd->sp_drain_rate_;
if(sd->sp_drain_rate && sd->sp_drain_per > 0 && wd.damage > 0 && rand()%100 < sd->sp_drain_rate) { int sp_drain_per = sd->sp_drain_per + sd->sp_drain_per_;
sp += (wd.damage * sd->sp_drain_per)/100; int sp_drain_value = sd->sp_drain_value + sd->sp_drain_value_;
if(sd->sp_drain_rate > 0 && sp < 1) sp = 1; hp += battle_calc_drain(wd.damage, hp_drain_rate, hp_drain_per, hp_drain_value);
else if(sd->sp_drain_rate < 0 && sp > -1) sp = -1; sp += battle_calc_drain(wd.damage, sp_drain_rate, sp_drain_per, sp_drain_value);
}
if(sd->sp_drain_rate_ && sd->sp_drain_per_ > 0 && wd.damage2 > 0 && rand()%100 < sd->sp_drain_rate_) {
sp += (wd.damage2 * sd->sp_drain_per_)/100;
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);
} }
} }
@ -4753,14 +4796,13 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
skill_status_change_end(target,SC_POISONREACT,-1); skill_status_change_end(target,SC_POISONREACT,-1);
} }
} }
if(t_sc_data && t_sc_data[SC_BLADESTOP_WAIT].timer != -1){ if (t_sc_data && t_sc_data[SC_BLADESTOP_WAIT].timer != -1 &&
if (!(src->type == BL_MOB && mob_db[((struct mob_data *)src)->class].mode&0x20)) { !(battle_get_mode(src)&0x20)) { // ボスには無効
int lv = t_sc_data[SC_BLADESTOP_WAIT].val1; int lv = t_sc_data[SC_BLADESTOP_WAIT].val1;
skill_status_change_end(target,SC_BLADESTOP_WAIT,-1); skill_status_change_end(target,SC_BLADESTOP_WAIT,-1);
skill_status_change_start(src,SC_BLADESTOP,lv,1,(int)src,(int)target,skill_get_time2(MO_BLADESTOP,lv),0); skill_status_change_start(src,SC_BLADESTOP,lv,1,(int)src,(int)target,skill_get_time2(MO_BLADESTOP,lv),0);
skill_status_change_start(target,SC_BLADESTOP,lv,2,(int)target,(int)src,skill_get_time2(MO_BLADESTOP,lv),0); skill_status_change_start(target,SC_BLADESTOP,lv,2,(int)target,(int)src,skill_get_time2(MO_BLADESTOP,lv),0);
} }
}
if(t_sc_data && t_sc_data[SC_SPLASHER].timer!=-1) //殴ったので対象のベナムスプラッシャー状態を解除 if(t_sc_data && t_sc_data[SC_SPLASHER].timer!=-1) //殴ったので対象のベナムスプラッシャー状態を解除
skill_status_change_end(target,SC_SPLASHER,-1); skill_status_change_end(target,SC_SPLASHER,-1);
@ -4989,17 +5031,8 @@ int battle_check_range(struct block_list *src,struct block_list *bl,int range)
if(src->m != bl->m) // 違うマップ if(src->m != bl->m) // 違うマップ
return 0; return 0;
if( range>0 && range < arange ) {// 遠すぎる if( range>0 && range < arange ) // 遠すぎる
// be lenient if the skill was cast before we have moved to the correct position [Celest]
/* Celest: Hmm, bl isn't necessarily BL_PC... i think i'll test this more first >.< */
/*if (src->type == BL_PC && bl->type == BL_PC) {
struct map_session_data *sd;
nullpo_retr(0, (sd=(struct map_session_data *)bl));
if (sd->walktimer != -1 && !((arange-=battle_config.skill_range_leniency)<=range))
return 0; return 0;
}
else*/ return 0;
}
if( arange<2 ) // 同じマスか隣接 if( arange<2 ) // 同じマスか隣接
return 1; return 1;
@ -5128,6 +5161,11 @@ static const struct {
{ "natural_heal_skill_interval", &battle_config.natural_heal_skill_interval}, { "natural_heal_skill_interval", &battle_config.natural_heal_skill_interval},
{ "natural_heal_weight_rate", &battle_config.natural_heal_weight_rate }, { "natural_heal_weight_rate", &battle_config.natural_heal_weight_rate },
{ "item_name_override_grffile", &battle_config.item_name_override_grffile}, { "item_name_override_grffile", &battle_config.item_name_override_grffile},
{ "item_equip_override_grffile", &battle_config.item_equip_override_grffile}, // [Celest]
{ "item_slots_override_grffile", &battle_config.item_slots_override_grffile}, // [Celest]
{ "indoors_override_grffile", &battle_config.indoors_override_grffile}, // [Celest]
{ "skill_sp_override_grffile", &battle_config.skill_sp_override_grffile}, // [Celest]
{ "cardillust_read_grffile", &battle_config.cardillust_read_grffile}, // [Celest]
{ "arrow_decrement", &battle_config.arrow_decrement }, { "arrow_decrement", &battle_config.arrow_decrement },
{ "max_aspd", &battle_config.max_aspd }, { "max_aspd", &battle_config.max_aspd },
{ "max_hp", &battle_config.max_hp }, { "max_hp", &battle_config.max_hp },
@ -5204,6 +5242,24 @@ static const struct {
{ "disp_experience", &battle_config.disp_experience }, { "disp_experience", &battle_config.disp_experience },
{ "castle_defense_rate", &battle_config.castle_defense_rate }, { "castle_defense_rate", &battle_config.castle_defense_rate },
{ "riding_weight", &battle_config.riding_weight }, { "riding_weight", &battle_config.riding_weight },
{ "hp_rate", &battle_config.hp_rate },
{ "sp_rate", &battle_config.sp_rate },
{ "gm_can_drop_lv", &battle_config.gm_can_drop_lv },
{ "disp_hpmeter", &battle_config.disp_hpmeter },
{ "bone_drop", &battle_config.bone_drop },
{ "item_rate_details", &battle_config.item_rate_details },
{ "item_rate_1", &battle_config.item_rate_1 },
{ "item_rate_10", &battle_config.item_rate_10 },
{ "item_rate_100", &battle_config.item_rate_100 },
{ "item_rate_1000", &battle_config.item_rate_1000 },
{ "item_rate_1_min", &battle_config.item_rate_1_min },
{ "item_rate_1_max", &battle_config.item_rate_1_max },
{ "item_rate_10_min", &battle_config.item_rate_10_min },
{ "item_rate_10_max", &battle_config.item_rate_10_max },
{ "item_rate_100_min", &battle_config.item_rate_100_min },
{ "item_rate_100_max", &battle_config.item_rate_100_max },
{ "item_rate_1000_min", &battle_config.item_rate_1000_min },
{ "item_rate_1000_max", &battle_config.item_rate_1000_max },
{ "item_rate_common", &battle_config.item_rate_common }, // Added by RoVeRT { "item_rate_common", &battle_config.item_rate_common }, // Added by RoVeRT
{ "item_rate_equip", &battle_config.item_rate_equip }, { "item_rate_equip", &battle_config.item_rate_equip },
{ "item_rate_card", &battle_config.item_rate_card }, // End Addition { "item_rate_card", &battle_config.item_rate_card }, // End Addition
@ -5362,6 +5418,11 @@ void battle_set_defaults() {
battle_config.natural_heal_skill_interval=10000; battle_config.natural_heal_skill_interval=10000;
battle_config.natural_heal_weight_rate=50; battle_config.natural_heal_weight_rate=50;
battle_config.item_name_override_grffile=1; battle_config.item_name_override_grffile=1;
battle_config.item_equip_override_grffile=1; // [Celest]
battle_config.item_slots_override_grffile=1; // [Celest]
battle_config.indoors_override_grffile=1; // [Celest]
battle_config.skill_sp_override_grffile=1; // [Celest]
battle_config.cardillust_read_grffile=1; // [Celest]
battle_config.arrow_decrement=1; battle_config.arrow_decrement=1;
battle_config.max_aspd = 199; battle_config.max_aspd = 199;
battle_config.max_hp = 32500; battle_config.max_hp = 32500;
@ -5405,7 +5466,6 @@ void battle_set_defaults() {
battle_config.mob_changetarget_byskill = 0; battle_config.mob_changetarget_byskill = 0;
battle_config.pc_attack_direction_change = 1; battle_config.pc_attack_direction_change = 1;
battle_config.monster_attack_direction_change = 1; battle_config.monster_attack_direction_change = 1;
battle_config.pc_undead_nofreeze = 0;
battle_config.pc_land_skill_limit = 1; battle_config.pc_land_skill_limit = 1;
battle_config.monster_land_skill_limit = 1; battle_config.monster_land_skill_limit = 1;
battle_config.party_skill_penalty = 1; battle_config.party_skill_penalty = 1;
@ -5437,6 +5497,26 @@ void battle_set_defaults() {
battle_config.invite_request_check = 1; battle_config.invite_request_check = 1;
battle_config.skill_removetrap_type = 0; battle_config.skill_removetrap_type = 0;
battle_config.disp_experience = 0; battle_config.disp_experience = 0;
battle_config.castle_defense_rate = 100;
battle_config.riding_weight = 0;
battle_config.hp_rate = 100;
battle_config.sp_rate = 100;
battle_config.gm_can_drop_lv = 0;
battle_config.disp_hpmeter = 0;
battle_config.bone_drop = 0;
battle_config.item_rate_details = 0;
battle_config.item_rate_1 = 100;
battle_config.item_rate_10 = 100;
battle_config.item_rate_100 = 100;
battle_config.item_rate_1000 = 100;
battle_config.item_rate_1_min = 1;
battle_config.item_rate_1_max = 9;
battle_config.item_rate_10_min = 10;
battle_config.item_rate_10_max = 99;
battle_config.item_rate_100_min = 100;
battle_config.item_rate_100_max = 999;
battle_config.item_rate_1000_min = 1000;
battle_config.item_rate_1000_max = 10000;
battle_config.item_rate_common = 100; battle_config.item_rate_common = 100;
battle_config.item_rate_equip = 100; battle_config.item_rate_equip = 100;
battle_config.item_rate_card = 100; battle_config.item_rate_card = 100;
@ -5530,6 +5610,10 @@ void battle_validate_conf() {
battle_config.max_aspd = 10; battle_config.max_aspd = 10;
if(battle_config.max_aspd > 1000) if(battle_config.max_aspd > 1000)
battle_config.max_aspd = 1000; battle_config.max_aspd = 1000;
if(battle_config.hp_rate < 0)
battle_config.hp_rate = 1;
if(battle_config.sp_rate < 0)
battle_config.sp_rate = 1;
if(battle_config.max_hp > 1000000) if(battle_config.max_hp > 1000000)
battle_config.max_hp = 1000000; battle_config.max_hp = 1000000;
if(battle_config.max_hp < 100) if(battle_config.max_hp < 100)

View File

@ -212,6 +212,11 @@ extern struct Battle_Config {
int natural_heal_skill_interval; int natural_heal_skill_interval;
int natural_heal_weight_rate; int natural_heal_weight_rate;
int item_name_override_grffile; int item_name_override_grffile;
int indoors_override_grffile; // [Celest]
int skill_sp_override_grffile; // [Celest]
int cardillust_read_grffile;
int item_equip_override_grffile;
int item_slots_override_grffile;
int arrow_decrement; int arrow_decrement;
int max_aspd; int max_aspd;
int max_hp; int max_hp;
@ -253,7 +258,6 @@ extern struct Battle_Config {
int mob_changetarget_byskill; int mob_changetarget_byskill;
int pc_attack_direction_change; int pc_attack_direction_change;
int monster_attack_direction_change; int monster_attack_direction_change;
int pc_undead_nofreeze;
int pc_land_skill_limit; int pc_land_skill_limit;
int monster_land_skill_limit; int monster_land_skill_limit;
int party_skill_penalty; int party_skill_penalty;
@ -314,6 +318,14 @@ extern struct Battle_Config {
int castle_defense_rate; int castle_defense_rate;
int riding_weight; int riding_weight;
int backstab_bow_penalty; int backstab_bow_penalty;
int hp_rate;
int sp_rate;
int gm_can_drop_lv;
int disp_hpmeter;
int bone_drop;
int item_rate_details,item_rate_1,item_rate_10,item_rate_100,item_rate_1000; //ドロップレート詳細
int item_rate_1_min,item_rate_10_min,item_rate_100_min,item_rate_1000_min; //ドロップレート詳細min
int item_rate_1_max,item_rate_10_max,item_rate_100_max,item_rate_1000_max; //ドロップレート詳細max
int night_at_start; // added by [Yor] int night_at_start; // added by [Yor]
int day_duration; // added by [Yor] int day_duration; // added by [Yor]

View File

@ -2387,6 +2387,8 @@ int clif_updatestatus(struct map_session_data *sd,int type)
break; break;
case SP_HP: case SP_HP:
WFIFOL(fd,4)=sd->status.hp; WFIFOL(fd,4)=sd->status.hp;
if(battle_config.disp_hpmeter)
clif_hpmeter(sd);
break; break;
case SP_SP: case SP_SP:
WFIFOL(fd,4)=sd->status.sp; WFIFOL(fd,4)=sd->status.sp;
@ -5773,6 +5775,46 @@ int clif_party_hp(struct party *p,struct map_session_data *sd)
// printf("clif_party_hp %d\n",sd->status.account_id); // printf("clif_party_hp %d\n",sd->status.account_id);
return 0; return 0;
} }
/*==========================================
* GMÖ<EFBFBD>ê<EFBFBD>ŠÆHPÊm
*------------------------------------------
*/
int clif_hpmeter(struct map_session_data *sd)
{
struct map_session_data *md;
unsigned char buf[16];
unsigned char buf2[16];
int i;
nullpo_retr(0, sd);
WBUFW(buf,0)=0x107;
WBUFL(buf,2)=sd->bl.id;
WBUFW(buf,6)=sd->bl.x;
WBUFW(buf,8)=sd->bl.y;
for(i=0;i<fd_max;i++){
if(session[i] && (md=session[i]->session_data) && md->state.auth &&
md->bl.m == sd->bl.m && pc_isGM(md) && sd != md){
memcpy(WFIFOP(i,0),buf,packet_len_table[0x107]);
WFIFOSET(i,packet_len_table[0x107]);
}
}
WBUFW(buf2,0)=0x106;
WBUFL(buf2,2)=sd->status.account_id;
WBUFW(buf2,6)=(sd->status.hp > 0x7fff)? 0x7fff:sd->status.hp;
WBUFW(buf2,8)=(sd->status.max_hp > 0x7fff)? 0x7fff:sd->status.max_hp;
for(i=0;i<fd_max;i++){
if(session[i] && (md=session[i]->session_data) && md->state.auth &&
md->bl.m == md->bl.m && pc_isGM(md) && sd != md){
memcpy(WFIFOP(i,0),buf2,packet_len_table[0x106]);
WFIFOSET(i,packet_len_table[0x106]);
}
}
return 0;
}
/*========================================== /*==========================================
* 使 * 使
*------------------------------------------ *------------------------------------------

View File

@ -218,6 +218,7 @@ int clif_party_message(struct party *p,int account_id,char *mes,int len);
int clif_party_move(struct party *p,struct map_session_data *sd,int online); int clif_party_move(struct party *p,struct map_session_data *sd,int online);
int clif_party_xy(struct party *p,struct map_session_data *sd); int clif_party_xy(struct party *p,struct map_session_data *sd);
int clif_party_hp(struct party *p,struct map_session_data *sd); int clif_party_hp(struct party *p,struct map_session_data *sd);
int clif_hpmeter(struct map_session_data *sd);
// guild // guild
int clif_guild_created(struct map_session_data *sd,int flag); int clif_guild_created(struct map_session_data *sd,int flag);

View File

@ -1191,11 +1191,18 @@ int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id
int flag,const char *name1,const char *name2) int flag,const char *name1,const char *name2)
{ {
struct guild *g[2]; struct guild *g[2];
int guild_id[2]={guild_id1,guild_id2}; int guild_id[2];
const char *guild_name[2]={name1,name2}; const char *guild_name[2];
struct map_session_data *sd[2]={map_id2sd(account_id1),map_id2sd(account_id2)}; struct map_session_data *sd[2];
int j,i; int j,i;
guild_id[0] = guild_id1;
guild_id[1] = guild_id2;
guild_name[0] = name1;
guild_name[1] = name2;
sd[0] = map_id2sd(account_id1);
sd[1] = map_id2sd(account_id2);
g[0]=guild_search(guild_id1); g[0]=guild_search(guild_id1);
g[1]=guild_search(guild_id2); g[1]=guild_search(guild_id2);

View File

@ -40,6 +40,9 @@ static int itemdb_read_sqldb(void);
static int itemdb_read_randomitem(); static int itemdb_read_randomitem();
static int itemdb_read_itemavail(void); static int itemdb_read_itemavail(void);
static int itemdb_read_itemnametable(void); static int itemdb_read_itemnametable(void);
static int itemdb_read_itemslottable(void);
static int itemdb_read_itemslotcounttable(void);
static int itemdb_read_cardillustnametable(void);
static int itemdb_read_noequip(void); static int itemdb_read_noequip(void);
static int itemdb_read_norefine(void); static int itemdb_read_norefine(void);
void itemdb_reload(void); void itemdb_reload(void);
@ -99,14 +102,15 @@ int itemdb_searchrandomid(int flags)
struct { struct {
int nameid,count; int nameid,count;
struct random_item_data *list; struct random_item_data *list;
} data[] ={ } data[6];
{ 0,0,NULL },
{ blue_box_default ,blue_box_count ,blue_box }, // for BCC32 compile error
{ violet_box_default,violet_box_count ,violet_box }, data[0].nameid = 0; data[0].count = 0; data[0].list = NULL;
{ card_album_default,card_album_count ,card_album }, data[1].nameid = blue_box_default; data[1].count = blue_box_count; data[1].list = blue_box;
{ gift_box_default ,gift_box_count ,gift_box }, data[2].nameid = violet_box_default; data[2].count = violet_box_count; data[2].list = violet_box;
{ scroll_default ,scroll_count ,scroll }, data[3].nameid = card_album_default; data[3].count = card_album_count; data[3].list = card_album;
}; data[4].nameid = gift_box_default; data[4].count = gift_box_count; data[4].list = gift_box;
data[5].nameid = scroll_default; data[5].count = scroll_count; data[5].list = scroll;
if(flags>=1 && flags<=5){ if(flags>=1 && flags<=5){
nameid=data[flags].nameid; nameid=data[flags].nameid;
@ -239,48 +243,13 @@ int itemdb_isdropable(int nameid)
return 1; return 1;
} }
//
// <20>‰Šú‰»
//
/*==========================================
*
*------------------------------------------
*/
static int itemdb_read_itemslottable(void)
{
char *buf,*p;
int s;
buf=grfio_read("data\\itemslottable.txt");
if(buf==NULL)
return -1;
s=grfio_size("data\\itemslottable.txt");
buf[s]=0;
for(p=buf;p-buf<s;){
int nameid,equip;
sscanf(p,"%d#%d#",&nameid,&equip);
itemdb_search(nameid)->equip=equip;
p=strchr(p,10);
if(!p) break;
p++;
p=strchr(p,10);
if(!p) break;
p++;
}
free(buf);
return 0;
}
#ifndef TXT_ONLY
/*==================================== /*====================================
* Removed item_value_db, don't re-add * Removed item_value_db, don't re-add
*------------------------------------ *------------------------------------
*/ */
static void itemdb_read(void) static void itemdb_read(void)
{ {
itemdb_read_itemslottable(); #ifndef TXT_ONLY
if (db_use_sqldbs) if (db_use_sqldbs)
{ {
itemdb_read_sqldb(); itemdb_read_sqldb();
@ -289,17 +258,25 @@ static void itemdb_read(void)
{ {
itemdb_readdb(); itemdb_readdb();
} }
/* not TXT_ONLY */
#else
itemdb_readdb();
#endif /* TXT_ONLY */
itemdb_read_randomitem(); itemdb_read_randomitem();
itemdb_read_itemavail(); itemdb_read_itemavail();
itemdb_read_noequip(); itemdb_read_noequip();
itemdb_read_norefine(); itemdb_read_norefine();
if (battle_config.cardillust_read_grffile)
if (!battle_config.item_name_override_grffile) itemdb_read_cardillustnametable();
if (battle_config.item_equip_override_grffile)
itemdb_read_itemslottable();
if (battle_config.item_slots_override_grffile)
itemdb_read_itemslotcounttable();
if (battle_config.item_name_override_grffile)
itemdb_read_itemnametable(); itemdb_read_itemnametable();
} }
#endif /* not TXT_ONLY */
/*========================================== /*==========================================
* *
*------------------------------------------ *------------------------------------------
@ -559,7 +536,7 @@ static int itemdb_read_itemnametable(void)
return 0; return 0;
} }
#ifdef TXT_ONLY
/*========================================== /*==========================================
* *
*------------------------------------------ *------------------------------------------
@ -595,7 +572,74 @@ static int itemdb_read_cardillustnametable(void)
return 0; return 0;
} }
#endif /* TXT_ONLY */
//
// <20>‰Šú‰»
//
/*==========================================
*
*------------------------------------------
*/
static int itemdb_read_itemslottable(void)
{
char *buf,*p;
int s;
buf=grfio_read("data\\itemslottable.txt");
if(buf==NULL)
return -1;
s=grfio_size("data\\itemslottable.txt");
buf[s]=0;
for(p=buf;p-buf<s;){
int nameid,equip;
sscanf(p,"%d#%d#",&nameid,&equip);
itemdb_search(nameid)->equip=equip;
p=strchr(p,10);
if(!p) break;
p++;
p=strchr(p,10);
if(!p) break;
p++;
}
free(buf);
sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\itemslottable.txt");
ShowStatus(tmp_output);
return 0;
}
/*==========================================
*
*------------------------------------------
*/
static int itemdb_read_itemslotcounttable(void)
{
char *buf,*p;
int s;
buf=grfio_read("data\\itemslotcounttable.txt");
if(buf==NULL)
return -1;
s=grfio_size("data\\itemslotcounttable.txt");
buf[s]=0;
for(p=buf;p-buf<s;){
int nameid,slot;
sscanf(p,"%d#%d#",&nameid,&slot);
itemdb_search(nameid)->slot=slot;
p=strchr(p,10);
if(!p) break;
p++;
p=strchr(p,10);
if(!p) break;
p++;
}
free(buf);
sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\itemslotcounttable.txt");
ShowStatus(tmp_output);
return 0;
}
/*========================================== /*==========================================
* *
*------------------------------------------ *------------------------------------------
@ -650,8 +694,18 @@ static int itemdb_read_norefine(void)
struct item_data *id; struct item_data *id;
// To-do: let it read from a text file later // To-do: let it read from a text file later
int cant_refine[] = { int cant_refine[] = {
0, 1243, 1530, 2110, 2112, 2264, 2298, 2352, 2410, 2413, 1243, 1530, 2110, 2112, 2201, 2202, 2203, 2204, 2205, 2210,
2414, 2509, 2510, 5008, 5046, 5049, 5050, 5053, 5055, 5098 2212, 2218, 2219, 2237, 2238, 2239, 2240, 2241, 2242, 2243,
2250, 2253, 2260, 2262, 2263, 2264, 2265, 2266, 2267, 2268,
2269, 2270, 2271, 2276, 2278, 2279, 2281, 2282, 2286, 2288,
2289, 2290, 2291, 2292, 2293, 2295, 2296, 2297, 2298, 2352,
2410, 2413, 2414, 2509, 2510, 2601, 2602, 2603, 2604, 2605,
2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616,
2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626,
2627, 2628, 2629, 2630, 2631, 2634, 2635, 2636, 2637, 2638,
2639, 2640, 5004, 5005, 5006, 5008, 5014, 5015, 5037, 5039,
5040, 5043, 5046, 5049, 5050, 5051, 5053, 5054, 5055, 5058,
5068, 5074, 5085, 5086, 5087, 5088, 5089, 5090, 5096, 5098, 0
}; };
for (i=0; i < (int)(sizeof(cant_refine) / sizeof(cant_refine[0])); i++) { for (i=0; i < (int)(sizeof(cant_refine) / sizeof(cant_refine[0])); i++) {
@ -885,24 +939,6 @@ void itemdebugtxt()
fclose(dfp); fclose(dfp);
} }
*/ */
#ifdef TXT_ONLY
/*====================================
* Removed item_value_db, don't re-add
*------------------------------------
*/
static void itemdb_read(void)
{
itemdb_read_itemslottable();
itemdb_readdb();
itemdb_read_randomitem();
itemdb_read_itemavail();
itemdb_read_noequip();
itemdb_read_norefine();
itemdb_read_cardillustnametable();
if (!battle_config.item_name_override_grffile)
itemdb_read_itemnametable();
}
#endif /* TXT_ONLY */
/*========================================== /*==========================================
* *
*------------------------------------------ *------------------------------------------

View File

@ -163,6 +163,7 @@ struct map_session_data {
struct mmo_charstatus status; struct mmo_charstatus status;
struct item_data *inventory_data[MAX_INVENTORY]; struct item_data *inventory_data[MAX_INVENTORY];
short equip_index[11]; short equip_index[11];
unsigned short unbreakable_equip;
int weight,max_weight; int weight,max_weight;
int cart_weight,cart_max_weight,cart_num,cart_max_num; int cart_weight,cart_max_weight,cart_num,cart_max_num;
char mapname[24]; char mapname[24];
@ -237,6 +238,7 @@ struct map_session_data {
int watk_,watk_2,atkmods_[3],addele_[10],addrace_[12],addsize_[3]; //二刀流のために追加 int watk_,watk_2,atkmods_[3],addele_[10],addrace_[12],addsize_[3]; //二刀流のために追加
int atk_ele_,star_,overrefine_; //二刀流のために追加 int atk_ele_,star_,overrefine_; //二刀流のために追加
int base_atk,atk_rate; int base_atk,atk_rate;
int weapon_atk[16],weapon_atk_rate[16];
int arrow_atk,arrow_ele,arrow_cri,arrow_hit,arrow_range; int arrow_atk,arrow_ele,arrow_cri,arrow_hit,arrow_range;
int arrow_addele[10],arrow_addrace[12],arrow_addsize[3],arrow_addeff[10],arrow_addeff2[10]; int arrow_addele[10],arrow_addrace[12],arrow_addsize[3],arrow_addeff[10],arrow_addeff2[10];
int nhealhp,nhealsp,nshealhp,nshealsp,nsshealhp,nsshealsp; int nhealhp,nhealsp,nshealhp,nshealsp,nsshealhp,nsshealsp;
@ -487,6 +489,14 @@ enum { NONE_ATTACKABLE,ATTACKABLE };
enum { ATK_LUCKY=1,ATK_FLEE,ATK_DEF}; // 囲まれペナルティ計算用 enum { ATK_LUCKY=1,ATK_FLEE,ATK_DEF}; // 囲まれペナルティ計算用
// 装備コード
enum {
EQP_WEAPON = 0x0002, // 右手
EQP_ARMOR = 0x0010, // 体
EQP_SHIELD = 0x0020, // 左手
EQP_HELM = 0x0100, // 頭上段
};
struct map_data { struct map_data {
char name[24]; char name[24];
unsigned char *gat; // NULLなら下のmap_data_other_serverとして扱う unsigned char *gat; // NULLなら下のmap_data_other_serverとして扱う
@ -592,10 +602,12 @@ enum {
SP_MAGIC_DAMAGE_RETURN,SP_RANDOM_ATTACK_INCREASE,SP_ALL_STATS,SP_AGI_VIT,SP_AGI_DEX_STR,SP_PERFECT_HIDE, // 1071-1076 SP_MAGIC_DAMAGE_RETURN,SP_RANDOM_ATTACK_INCREASE,SP_ALL_STATS,SP_AGI_VIT,SP_AGI_DEX_STR,SP_PERFECT_HIDE, // 1071-1076
SP_DISGUISE,SP_CLASSCHANGE, // 1077-1078 SP_DISGUISE,SP_CLASSCHANGE, // 1077-1078
SP_HP_DRAIN_VALUE,SP_SP_DRAIN_VALUE, // 1079-1080 SP_HP_DRAIN_VALUE,SP_SP_DRAIN_VALUE, // 1079-1080
SP_WEAPON_ATK,SP_WEAPON_ATK_RATE, // 1081-1082
SP_RESTART_FULL_RECORVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005 SP_RESTART_FULL_RECORVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005
SP_NO_CASTCANCEL2,SP_INFINITE_ENDURE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR, SP_UNBREAKABLE_HELM, // 2006-2010 SP_NO_CASTCANCEL2,SP_INFINITE_ENDURE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR, SP_UNBREAKABLE_HELM,
SP_LONG_ATK_RATE // 2011 - celest SP_UNBREAKABLE_SHIELD, // 2006-2011
SP_LONG_ATK_RATE // 2012 - celest
}; };
enum { enum {

View File

@ -37,6 +37,8 @@
struct mob_db mob_db[2001]; struct mob_db mob_db[2001];
#define CLASSCHANGE_BOSS_NUM 21
/*========================================== /*==========================================
* Local prototype declaration (only required thing) * Local prototype declaration (only required thing)
*------------------------------------------ *------------------------------------------
@ -2093,7 +2095,7 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type)
int mvp_damage,max_hp; int mvp_damage,max_hp;
unsigned int tick = gettick(); unsigned int tick = gettick();
struct map_session_data *mvp_sd = NULL, *second_sd = NULL,*third_sd = NULL; struct map_session_data *mvp_sd = NULL, *second_sd = NULL,*third_sd = NULL;
double dmg_rate,tdmg,temp; double tdmg,temp;
struct item item; struct item item;
int ret; int ret;
int drop_rate; int drop_rate;
@ -2351,9 +2353,9 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type)
// [MouseJstr] // [MouseJstr]
if((map[md->bl.m].flag.pvp == 0) || (battle_config.pvp_exp == 1)) { if((map[md->bl.m].flag.pvp == 0) || (battle_config.pvp_exp == 1)) {
if((double)max_hp < tdmg) /* if((double)max_hp < tdmg)
dmg_rate = ((double)max_hp) / tdmg; dmg_rate = ((double)max_hp) / tdmg;
else dmg_rate = 1; else dmg_rate = 1;*/
// 経験値の分配 // 経験値の分配
for(i=0;i<DAMAGELOG_SIZE;i++){ for(i=0;i<DAMAGELOG_SIZE;i++){
@ -2363,7 +2365,8 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type)
if(tmpsd[i]==NULL || tmpsd[i]->bl.m != md->bl.m) if(tmpsd[i]==NULL || tmpsd[i]->bl.m != md->bl.m)
continue; continue;
/* jAthena's exp formula /* jAthena's exp formula
per = ((double)md->dmglog[i].dmg)*(9.+(double)((count > 6)? 6:count))/10./((double)max_hp) * dmg_rate; // per = ((double)md->dmglog[i].dmg)*(9.+(double)((count > 6)? 6:count))/10./((double)max_hp) * dmg_rate;
per = ((double)md->dmglog[i].dmg)*(9.+(double)((count > 6)? 6:count))/10./tdmg;
temp = ((double)mob_db[md->class].base_exp * (double)battle_config.base_exp_rate / 100. * per); temp = ((double)mob_db[md->class].base_exp * (double)battle_config.base_exp_rate / 100. * per);
base_exp = (temp > 2147483647.)? 0x7fffffff:(int)temp; base_exp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
if(mob_db[md->class].base_exp > 0 && base_exp < 1) base_exp = 1; if(mob_db[md->class].base_exp > 0 && base_exp < 1) base_exp = 1;
@ -2891,7 +2894,7 @@ int mob_summonslave(struct mob_data *md2,int *value,int amount,int flag)
if(value[0]<=1000 || value[0]>MAX_MOB_DB) // 値が異常なら召喚を止める if(value[0]<=1000 || value[0]>MAX_MOB_DB) // 値が異常なら召喚を止める
return 0; return 0;
while(count < 5 && value[count] > 1000 && value[count] <= 2000) count++; while(count < 21 && value[count] > 1000 && value[count] <= 2000) count++;
if(count < 1) return 0; if(count < 1) return 0;
for(k=0;k<count;k++) { for(k=0;k<count;k++) {
@ -3884,7 +3887,46 @@ static int mob_readdb(void)
ratemin = battle_config.item_drop_common_min; ratemin = battle_config.item_drop_common_min;
ratemax = battle_config.item_drop_common_max; ratemax = battle_config.item_drop_common_max;
} }
rate = (rate / 100) * atoi(str[30+i*2]); if (battle_config.item_rate_details == 1) { //ドロップレート詳細項目が1の時 レート=x/100倍
if (rate < 10)
rate = rate * battle_config.item_rate_1/100;
else if (rate >= 10 && rate < 100)
rate = rate * battle_config.item_rate_10/100;
else if (rate >= 100 && rate < 1000)
rate = rate * battle_config.item_rate_100/100;
else rate = rate * battle_config.item_rate_1000/100;
}
else if (battle_config.item_rate_details == 2) { //ドロップレート詳細項目が2の時 レート=x/100倍 min max 指定
if (rate >= 1 && rate < 10) {
if (rate * battle_config.item_rate_1/100 < battle_config.item_rate_1_min)
rate = battle_config.item_rate_1_min;
else if (rate * battle_config.item_rate_1/100 > battle_config.item_rate_1_max)
rate = battle_config.item_rate_1_max;
else rate = rate * battle_config.item_rate_1/100;
}
else if (rate >= 10 && rate < 100) {
if (rate * battle_config.item_rate_10/100 < battle_config.item_rate_10_min)
rate = battle_config.item_rate_10_min;
else if (rate * battle_config.item_rate_10/100 > battle_config.item_rate_10_max)
rate = battle_config.item_rate_10_max;
else rate = rate * battle_config.item_rate_10/100;
}
else if (rate >= 100 && rate < 1000) {
if (rate * battle_config.item_rate_100/100 < battle_config.item_rate_100_min)
rate = battle_config.item_rate_100_min;
else if (rate * battle_config.item_rate_100/100 > battle_config.item_rate_100_max)
rate = battle_config.item_rate_100_max;
else rate = rate * battle_config.item_rate_100/100;
}
else if (rate >= 1000) {
if (rate * battle_config.item_rate_1000/100 < battle_config.item_rate_1000_min)
rate = battle_config.item_rate_1000_min;
else if (rate * battle_config.item_rate_1000/100 > battle_config.item_rate_1000_max)
rate = battle_config.item_rate_1000_max;
else rate = rate * battle_config.item_rate_1000/100;
}
}
rate = rate * atoi(str[30+i*2])/100;
rate = (rate < ratemin)? ratemin: (rate > ratemax)? ratemax: rate; rate = (rate < ratemin)? ratemin: (rate > ratemax)? ratemax: rate;
mob_db[class].dropitem[i].p = rate; mob_db[class].dropitem[i].p = rate;
} }

View File

@ -2303,6 +2303,7 @@ int do_init_npc(void)
char c = '-'; char c = '-';
// indoorrswtable.txt and etcinfo.txt [Celest] // indoorrswtable.txt and etcinfo.txt [Celest]
if (battle_config.indoors_override_grffile)
npc_read_indoors(); npc_read_indoors();
//npc_read_weather(); //npc_read_weather();

View File

@ -588,6 +588,52 @@ int pc_isequip(struct map_session_data *sd,int n)
return 1; return 1;
} }
//装備破壊
int pc_break_equip(struct map_session_data *sd, unsigned short where)
{
struct item_data* item;
int i;
int sc;
char output[255];
if(sd == NULL)
return -1;
if(sd->unbreakable_equip & where)
return 0;
switch (where) {
case EQP_WEAPON:
sc = SC_CP_WEAPON;
break;
case EQP_ARMOR:
sc = SC_CP_ARMOR;
break;
case EQP_SHIELD:
sc = SC_CP_SHIELD;
break;
case EQP_HELM:
sc = SC_CP_HELM;
break;
default:
return 0;
}
if( sd->sc_data && sd->sc_data[sc].timer != -1 )
return 0;
for (i=0;i<MAX_INVENTORY;i++) {
if (sd->status.inventory[i].equip & where) {
item=sd->inventory_data[i];
sd->status.inventory[i].attribute = 1;
pc_unequipitem(sd,i,0);
break;
}
}
sprintf(output, "%s has broken.",item->jname);
clif_emotion(&sd->bl,23);
clif_displaymessage(sd->fd, output);
clif_equiplist(sd);
return 0;
}
/*========================================== /*==========================================
* Weapon Breaking [Valaris] * Weapon Breaking [Valaris]
*------------------------------------------ *------------------------------------------
@ -1230,8 +1276,8 @@ int pc_calcstatus(struct map_session_data* sd,int first)
sd->matk1 =0; sd->matk1 =0;
sd->matk2 =0; sd->matk2 =0;
sd->speed = DEFAULT_WALK_SPEED ; sd->speed = DEFAULT_WALK_SPEED ;
sd->hprate=100; sd->hprate=battle_config.hp_rate;
sd->sprate=100; sd->sprate=battle_config.sp_rate;
sd->castrate=100; sd->castrate=100;
sd->dsprate=100; sd->dsprate=100;
sd->base_atk=0; sd->base_atk=0;
@ -1254,6 +1300,8 @@ int pc_calcstatus(struct map_session_data* sd,int first)
memset(&sd->special_state,0,sizeof(sd->special_state)); memset(&sd->special_state,0,sizeof(sd->special_state));
memset(sd->weapon_coma_ele,0,sizeof(sd->weapon_coma_ele)); memset(sd->weapon_coma_ele,0,sizeof(sd->weapon_coma_ele));
memset(sd->weapon_coma_race,0,sizeof(sd->weapon_coma_race)); memset(sd->weapon_coma_race,0,sizeof(sd->weapon_coma_race));
memset(sd->weapon_atk,0,sizeof(sd->weapon_atk));
memset(sd->weapon_atk_rate,0,sizeof(sd->weapon_atk_rate));
sd->watk_ = 0; //二刀流用(?) sd->watk_ = 0; //二刀流用(?)
sd->watk_2 = 0; sd->watk_2 = 0;
@ -1307,6 +1355,9 @@ int pc_calcstatus(struct map_session_data* sd,int first)
sd->short_weapon_damage_return = sd->long_weapon_damage_return = 0; sd->short_weapon_damage_return = sd->long_weapon_damage_return = 0;
sd->magic_damage_return = 0; //AppleGirl Was Here sd->magic_damage_return = 0; //AppleGirl Was Here
sd->random_attack_increase_add = sd->random_attack_increase_per = 0; sd->random_attack_increase_add = sd->random_attack_increase_per = 0;
sd->hp_drain_value = sd->hp_drain_value_ = sd->sp_drain_value = sd->sp_drain_value_ = 0;
sd->unbreakable_equip = 0;
if(!sd->disguiseflag && sd->disguise) { if(!sd->disguiseflag && sd->disguise) {
sd->disguise=0; sd->disguise=0;
@ -1549,6 +1600,10 @@ int pc_calcstatus(struct map_session_data* sd,int first)
if(sd->sc_data[SC_CHASEWALK].val4) if(sd->sc_data[SC_CHASEWALK].val4)
sd->paramb[0] += (1<<(sd->sc_data[SC_CHASEWALK].val1-1)); // increases strength after 10 seconds sd->paramb[0] += (1<<(sd->sc_data[SC_CHASEWALK].val1-1)); // increases strength after 10 seconds
} }
if(sd->sc_data[SC_SLOWDOWN].timer!=-1)
sd->speed = sd->speed*150/100;
if(sd->sc_data[SC_SPEEDUP0].timer!=-1)
sd->speed -= sd->speed*25/100;
if(sd->sc_data[SC_BLESSING].timer!=-1){ // ブレッシング if(sd->sc_data[SC_BLESSING].timer!=-1){ // ブレッシング
sd->paramb[0]+= sd->sc_data[SC_BLESSING].val1; sd->paramb[0]+= sd->sc_data[SC_BLESSING].val1;
sd->paramb[3]+= sd->sc_data[SC_BLESSING].val1; sd->paramb[3]+= sd->sc_data[SC_BLESSING].val1;
@ -2210,6 +2265,10 @@ int pc_calcspeed (struct map_session_data *sd)
} }
if(sd->sc_data[SC_CURSE].timer!=-1) if(sd->sc_data[SC_CURSE].timer!=-1)
sd->speed += 450; sd->speed += 450;
if(sd->sc_data[SC_SLOWDOWN].timer!=-1)
sd->speed = sd->speed*150/100;
if(sd->sc_data[SC_SPEEDUP0].timer!=-1)
sd->speed -= sd->speed*25/100;
} }
if(sd->status.option&2 && (skill = pc_checkskill(sd,RG_TUNNELDRIVE))>0 ) if(sd->status.option&2 && (skill = pc_checkskill(sd,RG_TUNNELDRIVE))>0 )
@ -2546,6 +2605,22 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
if(sd->state.lr_flag != 2) if(sd->state.lr_flag != 2)
sd->special_state.infinite_endure = 1; sd->special_state.infinite_endure = 1;
break; break;
case SP_UNBREAKABLE_WEAPON:
if(sd->state.lr_flag != 2)
sd->unbreakable_equip |= EQP_WEAPON;
break;
case SP_UNBREAKABLE_ARMOR:
if(sd->state.lr_flag != 2)
sd->unbreakable_equip |= EQP_ARMOR;
break;
case SP_UNBREAKABLE_HELM:
if(sd->state.lr_flag != 2)
sd->unbreakable_equip |= EQP_HELM;
break;
case SP_UNBREAKABLE_SHIELD:
if(sd->state.lr_flag != 2)
sd->unbreakable_equip |= EQP_SHIELD;
break;
case SP_SPLASH_RANGE: case SP_SPLASH_RANGE:
if(sd->state.lr_flag != 2 && sd->splash_range < val) if(sd->state.lr_flag != 2 && sd->splash_range < val)
sd->splash_range = val; sd->splash_range = val;
@ -2837,6 +2912,14 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
sd->random_attack_increase_per += val; sd->random_attack_increase_per += val;
} }
break; break;
case SP_WEAPON_ATK:
if(sd->state.lr_flag != 2)
sd->weapon_atk[type2]+=val;
break;
case SP_WEAPON_ATK_RATE:
if(sd->state.lr_flag != 2)
sd->weapon_atk_rate[type2]+=val;
break;
default: default:
if(battle_config.error_log) if(battle_config.error_log)
printf("pc_bonus2: unknown type %d %d %d!\n",type,type2,val); printf("pc_bonus2: unknown type %d %d %d!\n",type,type2,val);
@ -3203,7 +3286,8 @@ int pc_dropitem(struct map_session_data *sd,int n,int amount)
sd->status.inventory[n].amount < amount || sd->status.inventory[n].amount < amount ||
sd->trade_partner != 0 || sd->vender_id != 0 || sd->trade_partner != 0 || sd->vender_id != 0 ||
sd->status.inventory[n].amount <= 0 || sd->status.inventory[n].amount <= 0 ||
itemdb_isdropable(sd->status.inventory[n].nameid) == 0) // Celest itemdb_isdropable(sd->status.inventory[n].nameid) == 0 || // Celest
pc_candrop(sd,sd->status.inventory[n].nameid))
return 1; return 1;
map_addflooritem(&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, sd->bl.y, NULL, NULL, NULL, 0); map_addflooritem(&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, sd->bl.y, NULL, NULL, NULL, 0);
pc_delitem(sd, n, amount, 0); pc_delitem(sd, n, amount, 0);
@ -3279,6 +3363,8 @@ int pc_isUseitem(struct map_session_data *sd,int n)
if(item == NULL) if(item == NULL)
return 0; return 0;
if(item->type != 0 && item->type != 2)
return 0;
if((nameid == 605) && map[sd->bl.m].flag.gvg) if((nameid == 605) && map[sd->bl.m].flag.gvg)
return 0; return 0;
if(nameid == 601 && (map[sd->bl.m].flag.noteleport || map[sd->bl.m].flag.gvg)) { if(nameid == 601 && (map[sd->bl.m].flag.noteleport || map[sd->bl.m].flag.gvg)) {
@ -3432,6 +3518,10 @@ int pc_putitemtocart(struct map_session_data *sd,int idx,int amount) {
nullpo_retr(0, sd); nullpo_retr(0, sd);
nullpo_retr(0, item_data = &sd->status.inventory[idx]); nullpo_retr(0, item_data = &sd->status.inventory[idx]);
if(itemdb_isdropable(sd->status.inventory[idx].nameid) == 0)
return 1;
if(pc_candrop(sd,sd->status.inventory[idx].nameid)==1)
return 1;
if (item_data->nameid==0 || item_data->amount<amount || sd->vender_id) if (item_data->nameid==0 || item_data->amount<amount || sd->vender_id)
return 1; return 1;
if (pc_cart_additem(sd,item_data,amount) == 0) if (pc_cart_additem(sd,item_data,amount) == 0)
@ -3836,6 +3926,7 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
intif_save_petdata(sd->status.account_id,&sd->pet); intif_save_petdata(sd->status.account_id,&sd->pet);
chrif_save(sd); chrif_save(sd);
storage_storage_save(sd); storage_storage_save(sd);
storage_delete(sd->status.account_id);
chrif_changemapserver(sd, mapname, x, y, ip, port); chrif_changemapserver(sd, mapname, x, y, ip, port);
return 0; return 0;
} }
@ -4174,6 +4265,8 @@ static int pc_walk(int tid,unsigned int tick,int id,int data)
i = 1; i = 1;
sd->walktimer=add_timer(tick+i,pc_walk,id,sd->walkpath.path_pos); sd->walktimer=add_timer(tick+i,pc_walk,id,sd->walkpath.path_pos);
} }
if(battle_config.disp_hpmeter)
clif_hpmeter(sd);
return 0; return 0;
} }
@ -5498,6 +5591,18 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
clif_updatestatus(sd,SP_HP); clif_updatestatus(sd,SP_HP);
pc_calcstatus(sd,0); pc_calcstatus(sd,0);
if(battle_config.bone_drop==2
|| (battle_config.bone_drop==1 && map[sd->bl.m].flag.pvp)){ // ドクロドロップ
struct item item_tmp;
memset(&item_tmp,0,sizeof(item_tmp));
item_tmp.nameid=7005;
item_tmp.identify=1;
item_tmp.card[0]=0x00fe;
item_tmp.card[1]=0;
*((unsigned long *)(&item_tmp.card[2]))=sd->char_id; /* キャラID */
map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
}
// activate Steel body if a super novice dies at 99+% exp [celest] // activate Steel body if a super novice dies at 99+% exp [celest]
if (s_class.job == 23) { if (s_class.job == 23) {
if ((i=pc_nextbaseexp(sd))<=0) if ((i=pc_nextbaseexp(sd))<=0)
@ -6286,6 +6391,18 @@ int pc_setriding(struct map_session_data *sd)
return 0; return 0;
} }
/*==========================================
*
*------------------------------------------
*/
int pc_candrop(struct map_session_data *sd,int item_id)
{
int level;
if((level=pc_isGM(sd))>0 && level < battle_config.gm_can_drop_lv) // search only once [Celest]
return 1;
return 0;
}
/*========================================== /*==========================================
* script用??? * script用???
*------------------------------------------ *------------------------------------------

View File

@ -162,7 +162,8 @@ int pc_divorce(struct map_session_data *sd);
struct map_session_data *pc_get_partner(struct map_session_data *sd); struct map_session_data *pc_get_partner(struct map_session_data *sd);
int pc_set_gm_level(int account_id, int level); int pc_set_gm_level(int account_id, int level);
void pc_setstand(struct map_session_data *sd); void pc_setstand(struct map_session_data *sd);
int pc_break_equip(struct map_session_data *sd, unsigned short where);
int pc_candrop(struct map_session_data *sd,int item_id);
struct pc_base_job{ struct pc_base_job{
int job; //職業、ただし転生職や養子職の場合は元の職業を返す(廃プリ→プリ) int job; //職業、ただし転生職や養子職の場合は元の職業を返す(廃プリ→プリ)

View File

@ -274,6 +274,7 @@ int buildin_petloot(struct script_state *st); // pet looting [Valaris]
int buildin_petheal(struct script_state *st); // pet healing [Valaris] int buildin_petheal(struct script_state *st); // pet healing [Valaris]
int buildin_petmag(struct script_state *st); // pet magnificat [Valaris] int buildin_petmag(struct script_state *st); // pet magnificat [Valaris]
int buildin_petskillattack(struct script_state *st); // pet skill attacks [Valaris] int buildin_petskillattack(struct script_state *st); // pet skill attacks [Valaris]
int buildin_skilleffect(struct script_state *st); // skill effects [Celest]
int buildin_npcskilleffect(struct script_state *st); // skill effects for npcs [Valaris] int buildin_npcskilleffect(struct script_state *st); // skill effects for npcs [Valaris]
int buildin_specialeffect(struct script_state *st); // special effect script [Valaris] int buildin_specialeffect(struct script_state *st); // special effect script [Valaris]
int buildin_specialeffect2(struct script_state *st); // special effect script [Valaris] int buildin_specialeffect2(struct script_state *st); // special effect script [Valaris]
@ -292,6 +293,8 @@ int buildin_getmapxy(struct script_state *st); //get map position for player/np
int buildin_checkoption1(struct script_state *st); // [celest] int buildin_checkoption1(struct script_state *st); // [celest]
int buildin_checkoption2(struct script_state *st); // [celest] int buildin_checkoption2(struct script_state *st); // [celest]
int buildin_guildgetexp(struct script_state *st); // [celest] int buildin_guildgetexp(struct script_state *st); // [celest]
int buildin_skilluseid(struct script_state *st); // originally by Qamera [celest]
int buildin_skillusepos(struct script_state *st); // originally by Qamera [celest]
void push_val(struct script_stack *stack,int type,int val); void push_val(struct script_stack *stack,int type,int val);
int run_func(struct script_state *st); int run_func(struct script_state *st);
@ -481,6 +484,7 @@ struct {
{buildin_petheal,"petheal","iii"}, // [Valaris] {buildin_petheal,"petheal","iii"}, // [Valaris]
{buildin_petmag,"petmag","iiii"}, // [Valaris] {buildin_petmag,"petmag","iiii"}, // [Valaris]
{buildin_petskillattack,"petskillattack","iiii"}, // [Valaris] {buildin_petskillattack,"petskillattack","iiii"}, // [Valaris]
{buildin_skilleffect,"skilleffect","ii"}, // skill effect [Celest]
{buildin_npcskilleffect,"npcskilleffect","iiii"}, // npc skill effect [Valaris] {buildin_npcskilleffect,"npcskilleffect","iiii"}, // npc skill effect [Valaris]
{buildin_specialeffect,"specialeffect","i"}, // npc skill effect [Valaris] {buildin_specialeffect,"specialeffect","i"}, // npc skill effect [Valaris]
{buildin_specialeffect2,"specialeffect2","i"}, // skill effect on players[Valaris] {buildin_specialeffect2,"specialeffect2","i"}, // skill effect on players[Valaris]
@ -504,6 +508,9 @@ struct {
{buildin_checkoption1,"checkoption1","i"}, {buildin_checkoption1,"checkoption1","i"},
{buildin_checkoption2,"checkoption2","i"}, {buildin_checkoption2,"checkoption2","i"},
{buildin_guildgetexp,"guildgetexp","i"}, {buildin_guildgetexp,"guildgetexp","i"},
{buildin_skilluseid,"skilluseid","ii"}, // originally by Qamera [Celest]
{buildin_skilluseid,"doskill","ii"}, // since a lot of scripts would already use 'doskill'...
{buildin_skillusepos,"skillusepos","iiii"}, // [Celest]
{NULL,NULL,NULL}, {NULL,NULL,NULL},
}; };
int buildin_message(struct script_state *st); // [MouseJstr] int buildin_message(struct script_state *st); // [MouseJstr]
@ -2323,6 +2330,7 @@ int buildin_getitem(struct script_state *st)
return 0; return 0;
if((flag = pc_additem(sd,&item_tmp,amount))) { if((flag = pc_additem(sd,&item_tmp,amount))) {
clif_additem(sd,0,0,flag); clif_additem(sd,0,0,flag);
if(!pc_candrop(sd,nameid))
map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
} }
} }
@ -5827,6 +5835,24 @@ int buildin_petskillattack(struct script_state *st)
return 0; return 0;
} }
/*==========================================
* Scripted skill effects [Celest]
*------------------------------------------
*/
int buildin_skilleffect(struct script_state *st)
{
struct map_session_data *sd;
int skillid=conv_num(st,& (st->stack->stack_data[st->start+2]));
int skilllv=conv_num(st,& (st->stack->stack_data[st->start+3]));
sd=script_rid2sd(st);
clif_skill_nodamage(&sd->bl,&sd->bl,skillid,skilllv,1);
return 0;
}
/*========================================== /*==========================================
* NPC skill effects [Valaris] * NPC skill effects [Valaris]
*------------------------------------------ *------------------------------------------
@ -6284,6 +6310,42 @@ int buildin_getmapxy(struct script_state *st){
return 0; return 0;
} }
/*=====================================================
* Allows players to use a skill - by Qamera
*-----------------------------------------------------
*/
int buildin_skilluseid (struct script_state *st)
{
int skid,sklv;
struct map_session_data *sd;
skid=conv_num(st,& (st->stack->stack_data[st->start+2]));
sklv=conv_num(st,& (st->stack->stack_data[st->start+3]));
sd=script_rid2sd(st);
skill_use_id(sd,sd->status.account_id,skid,sklv);
return 0;
}
/*=====================================================
* Allows players to use a skill on a position [Celest]
*-----------------------------------------------------
*/
int buildin_skillusepos(struct script_state *st)
{
int skid,sklv,x,y;
struct map_session_data *sd;
skid=conv_num(st,& (st->stack->stack_data[st->start+2]));
sklv=conv_num(st,& (st->stack->stack_data[st->start+3]));
x=conv_num(st,& (st->stack->stack_data[st->start+4]));
y=conv_num(st,& (st->stack->stack_data[st->start+5]));
sd=script_rid2sd(st);
skill_use_pos(sd,x,y,skid,sklv);
return 0;
}
// //
// ŽÀ<C5BD>s•”main // ŽÀ<C5BD>s•”main

View File

@ -231,7 +231,8 @@ int SkillStatusChangeTable[]={ /* skill.h
SC_BASILICA, SC_BASILICA,
-1,-1,-1, -1,-1,-1,
SC_MAGICPOWER, SC_MAGICPOWER,
-1,-1, -1,
SC_SACRIFICE,
SC_GOSPEL, SC_GOSPEL,
/* 370- */ /* 370- */
-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
@ -2335,7 +2336,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
case LK_HEADCRUSH: /* ヘッドクラッシュ */ case LK_HEADCRUSH: /* ヘッドクラッシュ */
case LK_JOINTBEAT: /* ジョイントビ?ト */ case LK_JOINTBEAT: /* ジョイントビ?ト */
case PA_PRESSURE: /* プレッシャ? */ case PA_PRESSURE: /* プレッシャ? */
case PA_SACRIFICE: /* サクリファイス */ // case PA_SACRIFICE: /* サクリファイス */
case SN_SHARPSHOOTING: /* シャ?プシュ?ティング */ case SN_SHARPSHOOTING: /* シャ?プシュ?ティング */
case CG_ARROWVULCAN: /* アロ?バルカン */ case CG_ARROWVULCAN: /* アロ?バルカン */
case ASC_BREAKER: /* ソウルブレ?カ? */ case ASC_BREAKER: /* ソウルブレ?カ? */
@ -2538,12 +2539,11 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
/* 個別にダメ?ジを?える */ /* 個別にダメ?ジを?える */
if(bl->id!=skill_area_temp[1]) if(bl->id!=skill_area_temp[1])
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500); skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500);
} } else {
else { /* int damage;
int damage;
map_freeblock_lock(); map_freeblock_lock();
damage = skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0); damage = skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0);
if(damage > 0) { if(damage > 0) {*/
int i,c; /* 他人から聞いた動きなので間違ってる可能性大&?率が?いっす>< */ int i,c; /* 他人から聞いた動きなので間違ってる可能性大&?率が?いっす>< */
c = skill_get_blewcount(skillid,skilllv); c = skill_get_blewcount(skillid,skilllv);
if(map[bl->m].flag.gvg) c = 0; if(map[bl->m].flag.gvg) c = 0;
@ -2565,16 +2565,18 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
skill_area_temp[1]=bl->id; skill_area_temp[1]=bl->id;
skill_area_temp[2]=bl->x; skill_area_temp[2]=bl->x;
skill_area_temp[3]=bl->y; skill_area_temp[3]=bl->y;
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0);
/* その後タ?ゲット以外の範??の敵全?に?理を行う */ /* その後タ?ゲット以外の範??の敵全?に?理を行う */
map_foreachinarea(skill_area_sub, map_foreachinarea(skill_area_sub,
bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0, bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
src,skillid,skilllv,tick, flag|BCT_ENEMY|1, src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
skill_castend_damage_id); skill_castend_damage_id);
battle_damage(src,bl,damage,1); /* battle_damage(src,bl,damage,1);
if(rdamage > 0) if(rdamage > 0)
battle_damage(bl,src,rdamage,0); battle_damage(bl,src,rdamage,0);
} }
map_freeblock_unlock(); map_freeblock_unlock();*/
} }
break; break;
@ -2597,7 +2599,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
case WZ_EARTHSPIKE: /* アーススパイク */ case WZ_EARTHSPIKE: /* アーススパイク */
case AL_HEAL: /* ヒール */ case AL_HEAL: /* ヒール */
case AL_HOLYLIGHT: /* ホーリーライト */ case AL_HOLYLIGHT: /* ホーリーライト */
case MG_FROSTDIVER: /* フロストダイバー */ // case MG_FROSTDIVER: /* フロストダイバー */
case WZ_JUPITEL: /* ユピテルサンダー */ case WZ_JUPITEL: /* ユピテルサンダー */
case NPC_DARKJUPITEL: /*闇ユピテル*/ case NPC_DARKJUPITEL: /*闇ユピテル*/
case NPC_MAGICALATTACK: /* MOB:魔法打?攻? */ case NPC_MAGICALATTACK: /* MOB:魔法打?攻? */
@ -2606,6 +2608,28 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
break; break;
case MG_FROSTDIVER: /* フロストダイバー */
{
struct status_change *sc_data = battle_get_sc_data(bl);
int sc_def_mdef, rate, damage;
sc_def_mdef = 100 - (3 + battle_get_mdef(bl) + battle_get_luk(bl)/3);
rate = (skilllv*3+35)*sc_def_mdef/100-(battle_get_int(bl)+battle_get_luk(bl))/15;
rate = rate<=5?5:rate;
if (sc_data && sc_data[SC_FREEZE].timer != -1) {
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
} else if (sd) {
clif_skill_fail(sd,skillid,0,0);
break;
}
damage = skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
if (battle_get_hp(bl) > 0 && damage > 0 && rand()%100 < rate) {
skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
} else if (sd) {
clif_skill_fail(sd,skillid,0,0);
}
break;
}
case WZ_WATERBALL: /* ウォ?タ?ボ?ル */ case WZ_WATERBALL: /* ウォ?タ?ボ?ル */
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
if(skilllv>1) if(skilllv>1)
@ -2849,7 +2873,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
struct mob_data *md=NULL; struct mob_data *md=NULL;
struct mob_data *dstmd=NULL; struct mob_data *dstmd=NULL;
int i,abra_skillid=0,abra_skilllv; int i,abra_skillid=0,abra_skilllv;
int sc_def_vit,sc_def_mdef,strip_fix,strip_time,strip_per; int sc_def_vit,sc_def_mdef,strip_time,strip_per;
int sc_dex,sc_luk; int sc_dex,sc_luk;
//クラスチェンジ用ボスモンスタ?ID //クラスチェンジ用ボスモンスタ?ID
int changeclass[]={1038,1039,1046,1059,1086,1087,1112,1115 int changeclass[]={1038,1039,1046,1059,1086,1087,1112,1115
@ -2872,7 +2896,6 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
sc_def_vit = 100 - (3 + battle_get_vit(bl) + battle_get_luk(bl)/3); sc_def_vit = 100 - (3 + battle_get_vit(bl) + battle_get_luk(bl)/3);
//sc_def_vit = 100 - (3 + battle_get_vit(bl) + battle_get_luk(bl)/3); //sc_def_vit = 100 - (3 + battle_get_vit(bl) + battle_get_luk(bl)/3);
sc_def_mdef = 100 - (3 + battle_get_mdef(bl) + battle_get_luk(bl)/3); sc_def_mdef = 100 - (3 + battle_get_mdef(bl) + battle_get_luk(bl)/3);
strip_fix = battle_get_dex(src) - battle_get_dex(bl);
if(bl->type==BL_PC){ if(bl->type==BL_PC){
nullpo_retr(1, dstsd=(struct map_session_data *)bl); nullpo_retr(1, dstsd=(struct map_session_data *)bl);
@ -2887,8 +2910,6 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
sc_def_vit=0; sc_def_vit=0;
if(sc_def_mdef < 0) if(sc_def_mdef < 0)
sc_def_mdef=0; sc_def_mdef=0;
if(strip_fix < 0)
strip_fix=0;
if(bl == NULL || bl->prev == NULL) if(bl == NULL || bl->prev == NULL)
return 1; return 1;
@ -3231,6 +3252,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case ST_REJECTSWORD: /* リジェクトソ?ド */ case ST_REJECTSWORD: /* リジェクトソ?ド */
case HW_MAGICPOWER: /* 魔法力?幅 */ case HW_MAGICPOWER: /* 魔法力?幅 */
case PF_MEMORIZE: /* メモライズ */ case PF_MEMORIZE: /* メモライズ */
case PA_SACRIFICE:
case ASC_EDP: // [Celest] case ASC_EDP: // [Celest]
clif_skill_nodamage(src,bl,skillid,skilllv,1); clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
@ -3713,6 +3735,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case MG_STONECURSE: /* スト?ンカ?ス */ case MG_STONECURSE: /* スト?ンカ?ス */
{ {
struct status_change *sc_data = battle_get_sc_data(bl);
// Level 6-10 doesn't consume a red gem if it fails [celest] // Level 6-10 doesn't consume a red gem if it fails [celest]
int i, gem_flag = 1; int i, gem_flag = 1;
if (bl->type==BL_MOB && battle_get_mode(bl)&0x20) { if (bl->type==BL_MOB && battle_get_mode(bl)&0x20) {
@ -3722,7 +3745,12 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
clif_skill_nodamage(src,bl,skillid,skilllv,1); clif_skill_nodamage(src,bl,skillid,skilllv,1);
if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
break; break;
if( rand()%100 < skilllv*4+20 && !battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) if (sc_data && sc_data[SC_STONE].timer != -1) {
skill_status_change_end(bl,SC_STONE,-1);
if (sd)
clif_skill_fail(sd,skillid,0,0);
}
else if( rand()%100 < skilllv*4+20 && !battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)))
skill_status_change_start(bl,SC_STONE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); skill_status_change_start(bl,SC_STONE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
else if(sd) { else if(sd) {
if (skilllv > 5) gem_flag = 0; if (skilllv > 5) gem_flag = 0;
@ -3876,105 +3904,67 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
break; break;
case RG_STRIPWEAPON: /* ストリップウェポン */ case RG_STRIPWEAPON: /* ストリップウェポン */
{ case RG_STRIPSHIELD: /* ストリップシールド */
struct status_change *tsc_data = battle_get_sc_data(bl); case RG_STRIPARMOR: /* ストリップアーマー */
if(tsc_data && tsc_data[SC_CP_WEAPON].timer != -1 )
break;
strip_per = 5+2*skilllv+strip_fix/5;
strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
if(rand()%100 < strip_per){
clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
if(dstsd){
for(i=0;i<MAX_INVENTORY;i++){
if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0002){
pc_unequipitem(dstsd,i,3);
break;
}
}
}
}
}
break;
case RG_STRIPSHIELD: /* ストリップシ?ルド */
{
struct status_change *tsc_data = battle_get_sc_data(bl);
if(tsc_data && tsc_data[SC_CP_SHIELD].timer != -1 )
break;
strip_per = 5+2*skilllv+strip_fix/5;
strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
if(rand()%100 < strip_per){
clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
if(dstsd){
for(i=0;i<MAX_INVENTORY;i++){
if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0020){
pc_unequipitem(dstsd,i,3);
break;
}
}
}
}
}
break;
case RG_STRIPARMOR: /* ストリップア?マ? */
{
struct status_change *tsc_data = battle_get_sc_data(bl);
if(tsc_data && tsc_data[SC_CP_ARMOR].timer != -1 )
break;
strip_per = 5+2*skilllv+strip_fix/5;
strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
if(rand()%100 < strip_per){
clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
if(dstsd){
for(i=0;i<MAX_INVENTORY;i++){
if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0010){
pc_unequipitem(dstsd,i,3);
break;
}
}
}
}
}
break;
case RG_STRIPHELM: /* ストリップヘルム */ case RG_STRIPHELM: /* ストリップヘルム */
{ {
struct status_change *tsc_data = battle_get_sc_data(bl); struct status_change *tsc_data = battle_get_sc_data(bl);
int scid, equip, strip_fix;
if(tsc_data && tsc_data[SC_CP_HELM].timer != -1 ) scid = SkillStatusChangeTable[skillid];
switch (skillid) {
case RG_STRIPWEAPON:
equip = EQP_WEAPON;
break; break;
case RG_STRIPSHIELD:
equip = EQP_SHIELD;
break;
case RG_STRIPARMOR:
equip = EQP_ARMOR;
break;
case RG_STRIPHELM:
equip = EQP_HELM;
break;
default:
return 1;
}
if (tsc_data && tsc_data[scid].timer != -1)
break;
strip_fix = battle_get_dex(src) - battle_get_dex(bl);
if(strip_fix < 0)
strip_fix=0;
strip_per = 5+2*skilllv+strip_fix/5; strip_per = 5+2*skilllv+strip_fix/5;
strip_time = skill_get_time(skillid,skilllv)+strip_fix/2; if (rand()%100 >= strip_per)
if(rand()%100 < strip_per){ break;
clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
if (dstsd) { if (dstsd) {
for (i=0;i<MAX_INVENTORY;i++) { for (i=0;i<MAX_INVENTORY;i++) {
if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0100){ if (dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & equip){
pc_unequipitem(dstsd,i,3); pc_unequipitem(dstsd,i,0);
break; break;
} }
} }
} if (i == MAX_INVENTORY)
}
}
break; break;
}
clif_skill_nodamage(src,bl,skillid,skilllv,1);
strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
skill_status_change_start(bl,scid,skilllv,0,0,0,strip_time,0 );
break;
}
// Full Strip [Celest] // Full Strip [Celest]
case ST_FULLSTRIP: case ST_FULLSTRIP:
{ {
struct status_change *tsc_data = battle_get_sc_data(bl); struct status_change *tsc_data = battle_get_sc_data(bl);
int c=0, i, j; int c=0, i, j, strip_fix;
int striplist[2][4] = { { 0, 0, 0, 0 }, int striplist[2][4] = { { 0, 0, 0, 0 },
{ 0x0002, 0x0020, 0x0010, 0x0100 } }; { 0x0002, 0x0020, 0x0010, 0x0100 } };
strip_fix = battle_get_dex(src) - battle_get_dex(bl);
if(strip_fix < 0)
strip_fix=0;
strip_per = 5+2*skilllv+strip_fix/5; strip_per = 5+2*skilllv+strip_fix/5;
strip_time = skill_get_time(skillid,skilllv)+strip_fix/2; strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
for (i=0; i<4; i++) { for (i=0; i<4; i++) {
@ -5170,13 +5160,14 @@ int skill_castend_map( struct map_session_data *sd,int skill_num, const char *ma
case AL_WARP: /* ワ?プポ?タル */ case AL_WARP: /* ワ?プポ?タル */
{ {
const struct point *p[]={ const struct point *p[4];
&sd->status.save_point,&sd->status.memo_point[0],
&sd->status.memo_point[1],&sd->status.memo_point[2],
};
struct skill_unit_group *group; struct skill_unit_group *group;
int i; int i;
int maxcount=0; int maxcount=0;
p[0] = &sd->status.save_point;
p[1] = &sd->status.memo_point[0];
p[2] = &sd->status.memo_point[1];
p[3] = &sd->status.memo_point[2];
if((maxcount = skill_get_maxcount(sd->skillid)) > 0) { if((maxcount = skill_get_maxcount(sd->skillid)) > 0) {
int c; int c;
@ -7390,6 +7381,11 @@ int skill_castfix( struct block_list *bl, int time )
castnodex=skill_get_castnodex(skill, lv); castnodex=skill_get_castnodex(skill, lv);
/* サフラギウム */
if(sc_data && sc_data[SC_SUFFRAGIUM].timer!=-1 )
time=time*(100-sc_data[SC_SUFFRAGIUM].val1*15)/100;
skill_status_change_end( bl, SC_SUFFRAGIUM, -1);
if(time==0) if(time==0)
return 0; return 0;
if(castnodex > 0 && bl->type==BL_PC) if(castnodex > 0 && bl->type==BL_PC)
@ -7400,17 +7396,10 @@ int skill_castfix( struct block_list *bl, int time )
time=time*battle_config.cast_rate/100; time=time*battle_config.cast_rate/100;
} }
/* サフラギウム */
if(sc_data) {
if ( sc_data[SC_SUFFRAGIUM].timer!=-1 ){
time=time*(100-sc_data[SC_SUFFRAGIUM].val1*15)/100;
skill_status_change_end( bl, SC_SUFFRAGIUM, -1);
}
/* ブラギの詩 */ /* ブラギの詩 */
if( sc_data[SC_POEMBRAGI].timer!=-1 ) if(sc_data && sc_data[SC_POEMBRAGI].timer!=-1)
time=time*(100-(sc_data[SC_POEMBRAGI].val1*3+sc_data[SC_POEMBRAGI].val2 time=time*(100-(sc_data[SC_POEMBRAGI].val1*3+sc_data[SC_POEMBRAGI].val2
+(sc_data[SC_POEMBRAGI].val3>>16)))/100; +(sc_data[SC_POEMBRAGI].val3>>16)))/100;
}
return (time>0)?time:0; return (time>0)?time:0;
} }
@ -7426,7 +7415,8 @@ int skill_delayfix( struct block_list *bl, int time )
sc_data = battle_get_sc_data(bl); sc_data = battle_get_sc_data(bl);
if(time<=0) if(time<=0)
return 0; return ( battle_get_adelay(bl) / 2 );
if(bl->type == BL_PC) { if(bl->type == BL_PC) {
if( battle_config.delay_dependon_dex ) /* dexの影響を計算する */ if( battle_config.delay_dependon_dex ) /* dexの影響を計算する */
@ -7629,7 +7619,7 @@ int skill_use_id( struct map_session_data *sd, int target_id,
range = skill_get_range(skill_num,skill_lv); range = skill_get_range(skill_num,skill_lv);
if(range < 0) if(range < 0)
range = battle_get_range(&sd->bl) - (range + 1); range = battle_get_range(&sd->bl) - (range + 1);
if(!battle_check_range(&sd->bl,bl,range) ) if(!battle_check_range(&sd->bl,bl,range + 1) )
return 0; return 0;
if(bl->type==BL_PC) { if(bl->type==BL_PC) {
@ -7721,6 +7711,9 @@ int skill_use_id( struct map_session_data *sd, int target_id,
case PF_MEMORIZE: /* メモライズ */ case PF_MEMORIZE: /* メモライズ */
casttime = 12000; casttime = 12000;
break; break;
case HW_MAGICPOWER:
casttime = 700;
break;
case GD_BATTLEORDER: case GD_BATTLEORDER:
case GD_REGENERATION: case GD_REGENERATION:
case GD_RESTORE: case GD_RESTORE:
@ -7736,11 +7729,6 @@ int skill_use_id( struct map_session_data *sd, int target_id,
skill_status_change_end(&sd->bl, SC_MEMORIZE, -1); skill_status_change_end(&sd->bl, SC_MEMORIZE, -1);
} }
// instant cast attack skills depend on aspd as delay [celest]
if (casttime == 0 && delay == 0 && skill_db[skill_num].skill_type == BF_WEAPON) {
delay = battle_get_adelay (&sd->bl) * battle_config.delay_rate / 100;
}
if(battle_config.pc_skill_log) if(battle_config.pc_skill_log)
printf("PC %d skill use target_id=%d skill=%d lv=%d cast=%d\n",sd->bl.id,target_id,skill_num,skill_lv,casttime); printf("PC %d skill use target_id=%d skill=%d lv=%d cast=%d\n",sd->bl.id,target_id,skill_num,skill_lv,casttime);
@ -7787,10 +7775,6 @@ int skill_use_id( struct map_session_data *sd, int target_id,
skill_castend_id(sd->skilltimer,tick,sd->bl.id,0); skill_castend_id(sd->skilltimer,tick,sd->bl.id,0);
} }
//マジックパワ?の?果終了
//if(sc_data && sc_data[SC_MAGICPOWER].timer != -1 && skill_num != HW_MAGICPOWER)
// skill_status_change_end(&sd->bl,SC_MAGICPOWER,-1); // moved
return 0; return 0;
} }
@ -7877,6 +7861,9 @@ int skill_use_pos( struct map_session_data *sd,
range = skill_get_range(skill_num,skill_lv); range = skill_get_range(skill_num,skill_lv);
if(range < 0) if(range < 0)
range = battle_get_range(&sd->bl) - (range + 1); range = battle_get_range(&sd->bl) - (range + 1);
// be lenient if the skill was cast before we have moved to the correct position [Celest]
if (sd->walktimer != -1)
range += battle_config.skill_range_leniency;
if(!battle_check_range(&sd->bl,&bl,range) ) if(!battle_check_range(&sd->bl,&bl,range) )
return 0; return 0;
@ -8693,6 +8680,7 @@ int skill_status_change_end(struct block_list* bl, int type, int tid)
case SC_MARIONETTE: case SC_MARIONETTE:
case SC_MARIONETTE2: case SC_MARIONETTE2:
case SC_SLOWDOWN: case SC_SLOWDOWN:
case SC_SPEEDUP0:
/* case SC_LEADERSHIP: /* case SC_LEADERSHIP:
case SC_GLORYWOUNDS: case SC_GLORYWOUNDS:
case SC_SOULCOLD: case SC_SOULCOLD:
@ -8980,23 +8968,10 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data)
break; break;
case SC_SIGHT: /* サイト */ case SC_SIGHT: /* サイト */
{
const int range=7;
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);
if( (--sc_data[type].val2)>0 ){
sc_data[type].timer=add_timer( /* タイマ?再設定 */
250+tick, skill_status_change_timer,
bl->id, data);
return 0;
}
}
break;
case SC_RUWACH: /* ルアフ */ case SC_RUWACH: /* ルアフ */
{ {
const int range=5; int range = 5;
if ( type == SC_SIGHT ) range = 7;
map_foreachinarea( skill_status_change_timer_sub, map_foreachinarea( skill_status_change_timer_sub,
bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,0, bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,0,
bl,type,tick); bl,type,tick);
@ -9215,6 +9190,7 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data)
case SC_MEMORIZE: /* メモライズ */ case SC_MEMORIZE: /* メモライズ */
case SC_BROKNWEAPON: case SC_BROKNWEAPON:
case SC_BROKNARMOR: case SC_BROKNARMOR:
case SC_SACRIFICE:
// if(sc_data[type].timer==tid) // if(sc_data[type].timer==tid)
sc_data[type].timer=add_timer( 1000*600+tick,skill_status_change_timer, bl->id, data ); sc_data[type].timer=add_timer( 1000*600+tick,skill_status_change_timer, bl->id, data );
return 0; return 0;
@ -9679,6 +9655,13 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
if(sc_data[SC_CARTBOOST].timer!=-1 ) /* カ?トブ?スト */ if(sc_data[SC_CARTBOOST].timer!=-1 ) /* カ?トブ?スト */
skill_status_change_end(bl,SC_CARTBOOST,-1); skill_status_change_end(bl,SC_CARTBOOST,-1);
break; break;
case SC_MAGICPOWER:
calc_flag = 1;
val2 = 1;
break;
case SC_SACRIFICE:
val2 = 5;
break;
case SC_FLAMELAUNCHER: /* フレ?ムランチャ? */ case SC_FLAMELAUNCHER: /* フレ?ムランチャ? */
skill_encchant_eremental_end(bl,SC_FLAMELAUNCHER); skill_encchant_eremental_end(bl,SC_FLAMELAUNCHER);
break; break;
@ -9920,8 +9903,28 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
break; break;
/* option2 */ /* option2 */
case SC_POISON: /* 毒 */
case SC_DPOISON: /* 猛毒 */ case SC_DPOISON: /* 猛毒 */
{
int mhp = battle_get_max_hp(bl);
int hp = battle_get_hp(bl);
// MHP?1/4????????
if (hp > mhp>>2) {
if(bl->type == BL_PC) {
int diff = mhp*10/100;
if (hp - diff < mhp>>2)
hp = hp - (mhp>>2);
pc_heal((struct map_session_data *)bl, -hp, 0);
} else if(bl->type == BL_MOB) {
struct mob_data *md = (struct mob_data *)bl;
hp -= mhp*15/100;
if (hp > mhp>>2)
md->hp = hp;
else
md->hp = mhp>>2;
}
}
} // fall through
case SC_POISON: /* 毒 */
calc_flag = 1; calc_flag = 1;
if(!(flag&2)) { if(!(flag&2)) {
int sc_def = 100 - (battle_get_vit(bl) + battle_get_luk(bl)/5); int sc_def = 100 - (battle_get_vit(bl) + battle_get_luk(bl)/5);
@ -10127,7 +10130,6 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
case SC_CARTBOOST: /* カ?トブ?スト */ case SC_CARTBOOST: /* カ?トブ?スト */
case SC_TRUESIGHT: /* トゥル?サイト */ case SC_TRUESIGHT: /* トゥル?サイト */
case SC_SPIDERWEB: /* スパイダ?ウェッブ */ case SC_SPIDERWEB: /* スパイダ?ウェッブ */
case SC_MAGICPOWER: /* 魔法力?幅 */
calc_flag = 1; calc_flag = 1;
break; break;
@ -10161,6 +10163,7 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
break; break;
case SC_SLOWDOWN: case SC_SLOWDOWN:
case SC_SPEEDUP0:
calc_flag = 1; calc_flag = 1;
break; break;
@ -12049,6 +12052,7 @@ void skill_reload(void)
int do_init_skill(void) int do_init_skill(void)
{ {
skill_readdb(); skill_readdb();
if (battle_config.skill_sp_override_grffile)
skill_read_skillspamount(); skill_read_skillspamount();
add_timer_func_list(skill_unit_timer,"skill_unit_timer"); add_timer_func_list(skill_unit_timer,"skill_unit_timer");

View File

@ -313,10 +313,9 @@ enum { // struct map_session_data
SC_SPIDERWEB =180, /* スパイダ?ウェッブ */ SC_SPIDERWEB =180, /* スパイダ?ウェッブ */
SC_MEMORIZE =181, /* メモライズ */ SC_MEMORIZE =181, /* メモライズ */
// SC_DPOISON =182, /* 猛毒 */ SC_DPOISON =182, /* 猛毒 */
SC_EDP =183, /* エフェクトが判明したら移動 */
// SC_EDP =183, /* エフェクトが判明したら移動 */ SC_SACRIFICE =184, /* サクリファイス */
SC_WEDDING =187, //結婚用(結婚衣裳になって?くのが?いとか) SC_WEDDING =187, //結婚用(結婚衣裳になって?くのが?いとか)
SC_NOCHAT =188, //赤エモ?態 SC_NOCHAT =188, //赤エモ?態
SC_SPLASHER =189, /* ベナムスプラッシャ? */ SC_SPLASHER =189, /* ベナムスプラッシャ? */
@ -326,25 +325,27 @@ enum { // struct map_session_data
// Used by English Team // Used by English Team
SC_BROKNARMOR =32, SC_BROKNARMOR =32,
SC_BROKNWEAPON =33, SC_BROKNWEAPON =33,
SC_SPEEDUP0 =41, // for skill speedup
SC_SPEEDUP1 =42, // for skill speedup
SC_SLOWDOWN =45, // for skill slowdown SC_SLOWDOWN =45, // for skill slowdown
SC_AUTOBERSERK =46, SC_AUTOBERSERK =46,
SC_SIGHTTRASHER =73, SC_SIGHTTRASHER =73,
// SC_BASILICA =125, // 125 is the same id as joint break // SC_BASILICA =125, // 125 is the same id as joint break
SC_BASILICA =102, // temporarily use this before an actual id is found [celest] SC_BASILICA =102, // temporarily use this before an actual id is found [celest]
SC_EDP =114, // // SC_EDP =114, //
SC_MARIONETTE2 =122, // Marionette target SC_MARIONETTE2 =122, // Marionette target
SC_ENSEMBLE =159, SC_ENSEMBLE =159,
SC_FOGWALL =178, SC_FOGWALL =178,
SC_GOSPEL =179, SC_GOSPEL =179,
SC_LANDPROTECTOR =182,
SC_ADAPTATION =183,
SC_CHASEWALK =184,
SC_ATKPOT =185, // [Valaris] SC_ATKPOT =185, // [Valaris]
SC_MATKPOT =186, // [Valaris] SC_MATKPOT =186, // [Valaris]
SC_MINDBREAKER =191, SC_MINDBREAKER =191,
SC_SPELLBREAKER =192, SC_SPELLBREAKER =192,
SC_DPOISON =193, /* 猛毒 */ SC_LANDPROTECTOR =193,
// SC_DPOISON =193, /* 猛毒 */
SC_BLOCKSKILL =194, // for disallowing the use of a skill for a time period SC_BLOCKSKILL =194, // for disallowing the use of a skill for a time period
SC_ADAPTATION =195,
SC_CHASEWALK =196,
/* SC_LEADERSHIP =196, // temporarily disabled - they're too buggy =/ /* SC_LEADERSHIP =196, // temporarily disabled - they're too buggy =/
SC_GLORYWOUNDS =197, SC_GLORYWOUNDS =197,
SC_SOULCOLD =198, SC_SOULCOLD =198,