diff options
-rw-r--r-- | Changelog.txt | 8 | ||||
-rw-r--r-- | conf-tmpl/battle_athena.conf | 34 | ||||
-rw-r--r-- | db/skill_cast_db.txt | 32 | ||||
-rw-r--r-- | db/skill_db.txt | 2 | ||||
-rw-r--r-- | db/skill_require_db.txt | 17 | ||||
-rw-r--r-- | src/common/nullpo.h | 11 | ||||
-rw-r--r-- | src/map/battle.c | 195 | ||||
-rw-r--r-- | src/map/battle.h | 18 | ||||
-rw-r--r-- | src/map/pc.c | 53 | ||||
-rw-r--r-- | src/map/skill.c | 105 |
10 files changed, 267 insertions, 208 deletions
diff --git a/Changelog.txt b/Changelog.txt index c95124ed2..6f9f872ed 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,15 +1,21 @@ Date Added 12/14 + * Added nullpo_retb to nullpo.c - does a break; if null [celest] + * Replaced some parts in skill.c with nullpo checks [celest] + * Corrected some typos - penaly -> penalty [celest] + * Skill Updates [celest] + - Most of 12/14's Sakray patch * The SKILL_MAX_DB (yes, a different #define from the one below) was not large enough for current skills causing memory corruptions and crashes [MouseJstr] * Fixed how socket handles EAGIN errors (retry instead of disconnecting) [MouseJstr] + 12/13 * Skill Updates [celest] - Added the new 'Throw Tomahawk' skill (Requires Sakexe1129 or newer) - Added some new monster skills - but still not complete. - - Adjusted Palm Strike, Tiger Fist and Chain Crush based on 11/14's patch + - Adjusted Palm Strike, Tiger Fist and Chain Crush based on 12/14's patch * Removed redundant 'sg_count' for map_session_data and mob_data [celest] * Save both persons' data after trading in case a crash causes them to rollback - fix by Freya [celest] diff --git a/conf-tmpl/battle_athena.conf b/conf-tmpl/battle_athena.conf index bab565357..3cd2fce32 100644 --- a/conf-tmpl/battle_athena.conf +++ b/conf-tmpl/battle_athena.conf @@ -410,29 +410,29 @@ player_auto_counter_type: 0 // Monsters monster_auto_counter_type: 0 -// Type of penalty that is applied to FLEE when more than agi_penaly_count monsters are targetting player +// Type of penalty that is applied to FLEE when more than agi_penalty_count monsters are targetting player // 0 = no penalty is applied -// 1 = agi_penaly_num is reduced from FLEE as a % -// 2 = agi_penaly_num is reduced from FLEE as an exact amount -agi_penaly_type: 1 +// 1 = agi_penalty_num is reduced from FLEE as a % +// 2 = agi_penalty_num is reduced from FLEE as an exact amount +agi_penalty_type: 1 // Amount of enemies required to be targetting player before FLEE begins to be penalized -agi_penaly_count: 3 +agi_penalty_count: 3 -// Amount of FLEE penalized per each attacking monster more than agi_penaly_count -agi_penaly_num: 10 +// Amount of FLEE penalized per each attacking monster more than agi_penalty_count +agi_penalty_num: 10 -// Type of penalty that is applied to VIT defense when more than vit_penaly_count monsters are targetting player +// Type of penalty that is applied to VIT defense when more than vit_penalty_count monsters are targetting player // 0 = no penalty is applied -// 1 = vit_penaly_num is reduced from FLEE as a % -// 2 = vit_penaly_num is reduced from FLEE as an exact amount -vit_penaly_type: 1 +// 1 = vit_penalty_num is reduced from FLEE as a % +// 2 = vit_penalty_num is reduced from FLEE as an exact amount +vit_penalty_type: 1 // Amount of enemies required to be targetting player before VIT defense begins to be penalized -vit_penaly_count: 3 +vit_penalty_count: 3 -// Amount of VIT defense penalized per each attacking monster more than vit_penaly_count -vit_penaly_num: 5 +// Amount of VIT defense penalized per each attacking monster more than vit_penalty_count +vit_penalty_num: 5 // When the player attacks an object, the calculation method of DEF. // With 0 this will be ignored specification, at 1 or more def = subtraction of (DEF* value). @@ -505,7 +505,7 @@ player_land_skill_limit: yes monster_land_skill_limit: yes // If a party uses a skill with penalties do they apply? (Note 1) -party_skill_penaly: yes +party_skill_penalty: yes // If monster's class is changed will it fully recover HP and SP and Ailments? (Note 1) monster_class_change_full_recover: no @@ -572,14 +572,14 @@ gtb_pvp_only: no // 2: Full evasion exclusion // 3: Full evasion and evasion exclusion // 4 or more: Except all. -agi_penaly_count_lv: 2 +agi_penalty_count_lv: 2 // How to count the number of the enemies who do a vit penalty // 1 or less: It is a count altogether. // 2: Full evasion exclusion // 3: Full evasion and evasion exclusion // Four or more: Except all. -vit_penaly_count_lv: 3 +vit_penalty_count_lv: 3 // Grandcross Settings (Dont mess with these) // Even if MOB (PC) has overlapped, it HIT(s) compulsion 3. (Default no) diff --git a/db/skill_cast_db.txt b/db/skill_cast_db.txt index d6bfb8606..777d186f6 100644 --- a/db/skill_cast_db.txt +++ b/db/skill_cast_db.txt @@ -69,7 +69,7 @@ 85,15000:14500:14000:13500:13000:12500:12000:11500:11000:10500,5000,0,5500:6000:6500:7000:7500:8000:8500:9000:9500:10000 //WZ_VERMILION#ロードオブヴァーミリオン# 86,1000:2000:3000:4000:5000,0,0,0 //WZ_WATERBALL#ウォーターボール# 87,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0 //WZ_ICEWALL#アイスウォール# -88,5000:4700:4400:4100:3800:3500:3200:2900:2700:2500,1000,0,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000 //WZ_FROSTNOVA#フロストノヴァ# +88,5000:4700:4400:4100:3800:3500:3200:2900:2700:2500,1000,0,3000:3500:4000:4500:5000:5500:6000:6500:7000:7500 //WZ_FROSTNOVA#フロストノヴァ# 89,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000,5000,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //WZ_STORMGUST#ストームガスト# 90,1000:2000:3000:4000:5000,700,0,0 //WZ_EARTHSPIKE#アーススパイク# 91,1000:2000:3000:4000:5000,700,0,0 //WZ_HEAVENDRIVE#ヘヴンズドライブ# @@ -141,14 +141,14 @@ 220,0,0,180000,0 //RG_GRAFFITI#グラフィティ# 229,1000,0,40000:45000:50000:55000:60000,0 //AM_DEMONSTRATION#デモンストレーション# -230,1000,0,3:7:10:12:13,0 //AM_ACIDTERROR#アシッドテラー# +230,1000,0,3:7:10:12:13,60000 //AM_ACIDTERROR#アシッドテラー# 232,2000,500,40000:50000:60000:70000:80000,0 //AM_CANNIBALIZE#バイオプラント# 233,2000,500,30000,0 //AM_SPHEREMINE#スフィアーマイン# -234,2000,0,60000:120000:180000:240000:300000,0 //AM_CP_WEAPON#ケミカルウェポンチャージ# -235,2000,0,60000:120000:180000:240000:300000,0 //AM_CP_SHIELD#ケミカルシールドチャージ# -236,2000,0,60000:120000:180000:240000:300000,0 //AM_CP_ARMOR#ケミカルアーマーチャージ# -237,2000,0,60000:120000:180000:240000:300000,0 //AM_CP_HELM#ケミカルヘルムチャージ# +234,2000,0,120000:240000:360000:480000:600000,0 //AM_CP_WEAPON#ケミカルウェポンチャージ# +235,2000,0,120000:240000:360000:480000:600000,0 //AM_CP_SHIELD#ケミカルシールドチャージ# +236,2000,0,120000:240000:360000:480000:600000,0 //AM_CP_ARMOR#ケミカルアーマーチャージ# +237,2000,0,120000:240000:360000:480000:600000,0 //AM_CP_HELM#ケミカルヘルムチャージ# 249,0,0,300000,0 //CR_AUTOGUARD#オートガード# 250,0,0,0,8000:9000:10000:11000:12000 //CR_SHIELDCHARGE#シールドチャージ# @@ -175,15 +175,15 @@ 277,700,0,0,0 //SA_SPELLBREAKER#スペルブレイカー# 279,3000,0,120000:150000:180000:210000:240000:270000:300000:360000:390000,0 //SA_AUTOSPELL#オートスペル# -280,3000,0,1200000,0 //SA_FLAMELAUNCHER#フレイムランチャー# -281,3000,0,1200000,0 //SA_FROSTWEAPON#フロストウェポン# -282,3000,0,1200000,0 //SA_LIGHTNINGLOADER#ライトニングローダー# -283,3000,0,1200000,0 //SA_SEISMICWEAPON#サイズミックウェポン# - -285,5000,0,180000,180000 //SA_VOLCANO#ボルケーノ# -286,5000,0,180000,180000 //SA_DELUGE#デリュージ# -287,5000,0,180000,180000 //SA_VIOLENTGALE#バイオレントゲイル# -288,5000,0,180000,180000 //SA_LANDPROTECTOR#ランドプロテクター# +280,3000,0,1200000:1200000:1200000:1200000:1800000,0 //SA_FLAMELAUNCHER#フレイムランチャー# +281,3000,0,1200000:1200000:1200000:1200000:1800000,0 //SA_FROSTWEAPON#フロストウェポン# +282,3000,0,1200000:1200000:1200000:1200000:1800000,0 //SA_LIGHTNINGLOADER#ライトニングローダー# +283,3000,0,1200000:1200000:1200000:1200000:1800000,0 //SA_SEISMICWEAPON#サイズミックウェポン# + +285,5000,0,60000:120000:180000:240000:300000,60000:120000:180000:240000:300000 //SA_VOLCANO#ボルケーノ# +286,5000,0,60000:120000:180000:240000:300000,60000:120000:180000:240000:300000 //SA_DELUGE#デリュージ# +287,5000,0,60000:120000:180000:240000:300000,60000:120000:180000:240000:300000 //SA_VIOLENTGALE#バイオレントゲイル# +288,5000,0,60000:120000:180000:240000:300000,60000:120000:180000:240000:300000 //SA_LANDPROTECTOR#ランドプロテクター# 289,2000,0,0,0 //SA_DISPELL#ディスペル# 304,0,0,0,5000 //BD_ADAPTATION#アドリブ# @@ -243,7 +243,7 @@ 380,0,0,30000,0 //SN_SIGHT#トゥルーサイト# 381,1000,1200,0,0,0 //SN_FALCONASSAULT 382,2000,0,0,0 //SN_SHARPSHOOTING -383,2000:2400:2800:3200:3600:4000:4400:4800:5200:5600,0,65000:80000:95000:110000:125000:140000:155000:170000:185000:200000,0 //SN_WINDWALK#ウインドウォーク# +383,2000:2400:2800:3200:3600:4000:4400:4800:5200:5600,0,130000:160000:190000:220000:250000:280000:310000:340000:370000:400000,0 //SN_WINDWALK#ウインドウォーク# 384,5000:5000:6000:6000:7000:7000:8000:8000:9000:10000,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,5000 //WS_MELTDOWN#メルトダウン# 387,0,0,60000,0 //WS_CARTBOOST#カートブースト# diff --git a/db/skill_db.txt b/db/skill_db.txt index 50623f3e3..f9e28f3c2 100644 --- a/db/skill_db.txt +++ b/db/skill_db.txt @@ -282,7 +282,7 @@ 230,8,6,1,0,0,5,0,no,0,0,0,weapon,0 //AM_ACIDTERROR#アシッドテラ?# 231,8,6,16,0,1,5,1,yes,0,0,0,none,0 //AM_POTIONPITCHER#??ションピッ?ャ?# //231,8,6,16,0,1,10,1,yes,0,0,0,magic,0 -232,3,6,2,0,1,5,1,no,0,0,3,none,0 //AM_CANNIBALIZE#バイオプラント# +232,3,6,2,0,1,5,1,no,0,0,5,none,0 //AM_CANNIBALIZE#バイオプラント# 233,3,6,2,0,1,5,1,no,0,128,3,none,0 //AM_SPHEREMINE#スフィア??イン# 234,1,6,16,0,1,5,1,yes,0,0,0,weapon,0 //AM_CP_WEAPON#ケ?カルウェ?ン?ャ?ジ# 235,1,6,16,0,1,5,1,yes,0,0,0,weapon,0 //AM_CP_SHIELD#ケ?カルシ?ルド?ャ?ジ# diff --git a/db/skill_require_db.txt b/db/skill_require_db.txt index 18d7a63c2..5cd9d73b4 100644 --- a/db/skill_require_db.txt +++ b/db/skill_require_db.txt @@ -112,7 +112,7 @@ 138,0,0,20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#エンチャントポイズン# 139,0,0,20:25:30:35:40:45:50:55:60:45,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_POISONREACT#ポイズンリアクト# 140,0,0,20,0,0,0,99,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_VENOMDUST#ベナムダスト# -141,0,0,33:36:39:42:45:48:51:54:57:60,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_SPLASHER#ベナムスプラッシャ?# +141,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_SPLASHER#ベナムスプラッシャ?# 142,0,0,3,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#?急手?# 143,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NV_TRICKDEAD#死んだふり# @@ -167,7 +167,7 @@ 261,0,0,8,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#?功# 262,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#?奪# -264,0,0,10,0,0,0,99,move_enable,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_BODYRELOCATION#?影# +264,0,0,14,0,0,0,99,move_enable,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_BODYRELOCATION#?影# 266,0,0,10:14:17:19:20,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_INVESTIGATE#?勁# 267,0,0,10,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,none,1:2:3:4:5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_FINGEROFFENSIVE#指?# @@ -192,7 +192,7 @@ 286,0,0,48:46:44:42:40,0,0,0,99,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_DELUGE#デリュ?ジ# 287,0,0,48:46:44:42:40,0,0,0,99,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_VIOLENTGALE#バイオレントゲイル# 288,0,0,66:62:58:54:50,0,0,0,99,none,0,717,1,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_LANDPROTECTOR#ランドプロテクタ?# -289,0,0,1,0,0,0,99,none,0,716,1,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_DISPELL#ディスペル# +289,0,0,1,0,0,0,99,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_DISPELL#ディスペル# 290,0,0,50,0,0,0,99,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ABRACADABRA#アブラカタブラ# //reduced 2 to 1 Yellow gemstones, because Abrakadabra has extra hardcoded usage of 1 Yellow gemstone [Lupus] 291,0,0,1,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_MONOCELL#チェンジポリン# @@ -243,7 +243,7 @@ 355,0,0,18:26:34:42:50,0,0,0,1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_AURABLADE#オ?ラブレ?ド# 356,0,0,50,0,0,0,3,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_PARRYING#パリイング# -357,0,0,14:18:22:26:30,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_CONCENTRATION#コンセントレ?ション# +357,0,0,14:18:22:26:30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_CONCENTRATION#コンセントレ?ション# 358,0,0,15,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_TENSIONRELAX#テンションリラックス# 359,0,0,100,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#バ?サ?ク# 360,0,0,50,0,0,0,3,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_FURY#フュ?リ?# @@ -255,9 +255,9 @@ 367,0,0,30:35:40:45:50,0,20:25:30:35:40,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_PRESSURE#プレッシャ?# 368,0,9,100,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_SACRIFICE#サクリファイス# 369,0,0,80:80:80:80:80:100:100:100:100:100,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_GOSPEL#ゴスペル# -370,0,0,12:14:16:18:20,0,0,0,99,explosionspirits,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_PALMSTRIKE#猛虎硬派山# -371,0,0,12:14:16:18:20,0,0,0,99,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_TIGERFIST#伏虎拳# -372,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,none,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_CHAINCRUSH#連柱崩?# +370,0,0,2:4:6:8:10,0,0,0,99,explosionspirits,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_PALMSTRIKE#猛虎硬派山# +371,0,0,4:6:8:10:12,0,0,0,99,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_TIGERFIST#伏虎拳# +372,0,0,4:6:8:10:12:14:16:18:20:22,0,0,0,99,none,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_CHAINCRUSH#連柱崩?# 373,0,0,1:2:3:4:5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_HPCONVERSION#???????# 374,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_SOULCHANGE#ソウルチェンジ# 375,0,0,80:90:100:110:120,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_SOULBURN#?ウルバ?ン# @@ -267,7 +267,7 @@ 380,0,0,20:20:25:25:30:30:35:35:40:40,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_SIGHT#トゥル?サイト# 381,0,0,30:34:38:42:46,0,0,0,99,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_FALCONASSAULT#ファルコンアサルト# 382,0,0,18:21:24:27:30,0,0,0,11,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_SHARPSHOOTING#シャ?プシュ?ティング# -383,0,0,23:26:29:32:35:38:41:44:47:50,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_WINDWALK#ウインドウォ?ク# +383,0,0,46:52:58:64:70:76:82:88:94:100,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_WINDWALK#ウインドウォ?ク# 384,0,0,50:50:60:60:70:70:80:80:90:90,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_MELTDOWN#メルトダウン# 385,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CREATECOIN#クリエイトコイン# 386,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CREATENUGGET#塊製造# @@ -289,7 +289,6 @@ 404,0,0,25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_FOGWALL#フォグウォ?ル# 405,0,0,50,0,0,0,99,none,0,1025,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_SPIDERWEB#スパイダ?ウェッブ# 406,0,0,10:12:14:16:18:20:22:24:26:28,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_METEORASSAULT#メテオアサルト# -//407,0,0,50,0,0,0,99,none,0,937,1,952,1,939,1,7033,1,972,1,657,1,713,1,0,0,0,0,0,0 //ASC_CDP 407,0,0,50,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_CDP#デッドリ?ポイズン作成# 475,0,0,40,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ST_PRESERVE## diff --git a/src/common/nullpo.h b/src/common/nullpo.h index 11283f941..0b9a9f7a5 100644 --- a/src/common/nullpo.h +++ b/src/common/nullpo.h @@ -87,6 +87,8 @@ #define nullpo_retr(ret, t) \ if (nullpo_chk(NLP_MARK, (void *)(t))) {return(ret);} +#define nullpo_retb(t) \ + if (nullpo_chk(NLP_MARK, (void *)(t))) {break;} // 可変引数マクロに関する条件コンパイル #if __STDC_VERSION__ >= 199901L @@ -100,6 +102,9 @@ #define nullpo_retr_f(ret, t, fmt, ...) \ if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(ret);} +#define nullpo_retb_f(t, fmt, ...) \ + if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {break;} + #elif __GNUC__ >= 2 /* GCC用 */ #define nullpo_ret_f(t, fmt, args...) \ @@ -111,6 +116,9 @@ #define nullpo_retr_f(ret, t, fmt, args...) \ if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(ret);} +#define nullpo_retb_f(t, fmt, args...) \ + if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {break;} + #else /* その他の場合・・・ orz */ @@ -127,6 +135,7 @@ #define nullpo_ret(t) if((t)){;} #define nullpo_retv(t) if((t)){;} #define nullpo_retr(ret, t) if((t)){;} +#define nullpo_retb(t) if((t)){;} // 可変引数マクロに関する条件コンパイル #if __STDC_VERSION__ >= 199901L @@ -134,12 +143,14 @@ #define nullpo_ret_f(t, fmt, ...) if((t)){;} #define nullpo_retv_f(t, fmt, ...) if((t)){;} #define nullpo_retr_f(ret, t, fmt, ...) if((t)){;} +#define nullpo_retb_f(t, fmt, ...) if((t)){;} #elif __GNUC__ >= 2 /* GCC用 */ #define nullpo_ret_f(t, fmt, args...) if((t)){;} #define nullpo_retv_f(t, fmt, args...) if((t)){;} #define nullpo_retr_f(ret, t, fmt, args...) if((t)){;} +#define nullpo_retb_f(t, fmt, args...) if((t)){;} #else /* その他の場合・・・ orz */ diff --git a/src/map/battle.c b/src/map/battle.c index 9c6b313cf..8892104b9 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -638,7 +638,7 @@ int battle_get_atk2(struct block_list *bl) if(sc_data[SC_DRUMBATTLE].timer!=-1) atk2 += sc_data[SC_DRUMBATTLE].val2; if(sc_data[SC_NIBELUNGEN].timer!=-1 && (battle_get_element(bl)/10) >= 8 ) - atk2 += sc_data[SC_NIBELUNGEN].val2; + atk2 += sc_data[SC_NIBELUNGEN].val3; if(sc_data[SC_STRIPWEAPON].timer!=-1) atk2 = atk2*sc_data[SC_STRIPWEAPON].val2/100; if(sc_data[SC_CONCENTRATION].timer!=-1) //コンセントレーション @@ -921,11 +921,12 @@ int battle_get_speed(struct block_list *bl) if(sc_data[SC_STEELBODY].timer!=-1) speed = speed*125/100; //ディフェンダー時は加算 - if(sc_data[SC_DEFENDER].timer!=-1) - speed = (speed * (155 - sc_data[SC_DEFENDER].val1*5)) / 100; + // removed as of 12/14's patch [celest] + /*if(sc_data[SC_DEFENDER].timer!=-1) + speed = (speed * (155 - sc_data[SC_DEFENDER].val1*5)) / 100;*/ //踊り状態は4倍遅い if(sc_data[SC_DANCING].timer!=-1 ) - speed*=4; + speed *= 6; //呪い時は450加算 if(sc_data[SC_CURSE].timer!=-1) speed = speed + 450; @@ -967,7 +968,7 @@ int battle_get_adelay(struct block_list *bl) if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // アドレナリンラッシュ //使用者とパーティメンバーで格差が出る設定でなければ3割減算 - if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly) + if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penalty) aspd_rate -= 30; //そうでなければ2.5割減算 else @@ -1020,7 +1021,7 @@ int battle_get_amotion(struct block_list *bl) aspd_rate -= 30; if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // アドレナリンラッシュ - if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly) + if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penalty) aspd_rate -= 30; else aspd_rate -= 25; @@ -1579,10 +1580,18 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i if(rand()%100 < sc_data[SC_AUTOGUARD].val2) { damage = 0; clif_skill_nodamage(bl,bl,CR_AUTOGUARD,sc_data[SC_AUTOGUARD].val1,1); + // different delay depending on skill level [celest] + int delay; + if (sc_data[SC_AUTOGUARD].val1 <= 5) + delay = 300; + else if (sc_data[SC_AUTOGUARD].val1 > 5 && sc_data[SC_AUTOGUARD].val1 <= 9) + delay = 200; + else + delay = 100; if(sd) - sd->canmove_tick = gettick() + 300; + sd->canmove_tick = gettick() + delay; else if(md) - md->canmove_tick = gettick() + 300; + md->canmove_tick = gettick() + delay; } } // -- moonsoul (chance to block attacks with new Lord Knight skill parrying) @@ -1838,14 +1847,14 @@ static struct Damage battle_calc_pet_weapon_attack( // 回避率計算、回避判定は後で flee = battle_get_flee(target); - if(battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0) - target_count += battle_counttargeted(target,src,battle_config.agi_penaly_count_lv); - if(battle_config.agi_penaly_type > 0) { - if(target_count >= battle_config.agi_penaly_count) { - if(battle_config.agi_penaly_type == 1) - flee = (flee * (100 - (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num))/100; - else if(battle_config.agi_penaly_type == 2) - flee -= (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num; + if(battle_config.agi_penalty_type > 0 || battle_config.vit_penalty_type > 0) + target_count += battle_counttargeted(target,src,battle_config.agi_penalty_count_lv); + if(battle_config.agi_penalty_type > 0) { + if(target_count >= battle_config.agi_penalty_count) { + if(battle_config.agi_penalty_type == 1) + flee = (flee * (100 - (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num))/100; + else if(battle_config.agi_penalty_type == 2) + flee -= (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num; if(flee < 1) flee = 1; } } @@ -2065,11 +2074,11 @@ static struct Damage battle_calc_pet_weapon_attack( damage = damage*(240+ 60*skill_lv)/100; break; case DC_THROWARROW: // 矢撃ち - damage = damage*(100+ 50 * skill_lv)/100; + damage = damage*(60+ 40 * skill_lv)/100; flag=(flag&~BF_RANGEMASK)|BF_LONG; break; case BA_MUSICALSTRIKE: // ミュージカルストライク - damage = damage*(100+ 50 * skill_lv)/100; + damage = damage*(60+ 40 * skill_lv)/100; flag=(flag&~BF_RANGEMASK)|BF_LONG; break; case CH_TIGERFIST: // 伏虎拳 @@ -2117,18 +2126,18 @@ static struct Damage battle_calc_pet_weapon_attack( // ディバインプロテクション(ここでいいのかな?) if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000 ) { //DEF, VIT無視 int t_def; - target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penaly_count_lv); - if(battle_config.vit_penaly_type > 0) { - if(target_count >= battle_config.vit_penaly_count) { - if(battle_config.vit_penaly_type == 1) { - def1 = (def1 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; - def2 = (def2 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; - t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; + target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penalty_count_lv); + if(battle_config.vit_penalty_type > 0) { + if(target_count >= battle_config.vit_penalty_count) { + if(battle_config.vit_penalty_type == 1) { + def1 = (def1 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100; + def2 = (def2 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100; + t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100; } - else if(battle_config.vit_penaly_type == 2) { - def1 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; - def2 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; - t_vit -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; + else if(battle_config.vit_penalty_type == 2) { + def1 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num; + def2 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num; + t_vit -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num; } if(def1 < 0) def1 = 0; if(def2 < 1) def2 = 1; @@ -2298,14 +2307,14 @@ static struct Damage battle_calc_mob_weapon_attack( // 回避率計算、回避判定は後で flee = battle_get_flee(target); - if(battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0) - target_count += battle_counttargeted(target,src,battle_config.agi_penaly_count_lv); - if(battle_config.agi_penaly_type > 0) { - if(target_count >= battle_config.agi_penaly_count) { - if(battle_config.agi_penaly_type == 1) - flee = (flee * (100 - (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num))/100; - else if(battle_config.agi_penaly_type == 2) - flee -= (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num; + if(battle_config.agi_penalty_type > 0 || battle_config.vit_penalty_type > 0) + target_count += battle_counttargeted(target,src,battle_config.agi_penalty_count_lv); + if(battle_config.agi_penalty_type > 0) { + if(target_count >= battle_config.agi_penalty_count) { + if(battle_config.agi_penalty_type == 1) + flee = (flee * (100 - (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num))/100; + else if(battle_config.agi_penalty_type == 2) + flee -= (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num; if(flee < 1) flee = 1; } } @@ -2556,11 +2565,11 @@ static struct Damage battle_calc_mob_weapon_attack( div_=4; break; case BA_MUSICALSTRIKE: // ミュージカルストライク - damage = damage*(100+ 50 * skill_lv)/100; + damage = damage*(60+ 40 * skill_lv)/100; flag=(flag&~BF_RANGEMASK)|BF_LONG; break; case DC_THROWARROW: // 矢撃ち - damage = damage*(100+ 50 * skill_lv)/100; + damage = damage*(60+ 40 * skill_lv)/100; flag=(flag&~BF_RANGEMASK)|BF_LONG; break; case MO_COMBOFINISH: // 猛龍拳 @@ -2611,18 +2620,18 @@ static struct Damage battle_calc_mob_weapon_attack( // ディバインプロテクション(ここでいいのかな?) if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000) { //DEF, VIT無視 int t_def; - target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penaly_count_lv); - if(battle_config.vit_penaly_type > 0) { - if(target_count >= battle_config.vit_penaly_count) { - if(battle_config.vit_penaly_type == 1) { - def1 = (def1 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; - def2 = (def2 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; - t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; + target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penalty_count_lv); + if(battle_config.vit_penalty_type > 0) { + if(target_count >= battle_config.vit_penalty_count) { + if(battle_config.vit_penalty_type == 1) { + def1 = (def1 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100; + def2 = (def2 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100; + t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100; } - else if(battle_config.vit_penaly_type == 2) { - def1 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; - def2 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; - t_vit -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; + else if(battle_config.vit_penalty_type == 2) { + def1 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num; + def2 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num; + t_vit -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num; } if(def1 < 0) def1 = 0; if(def2 < 1) def2 = 1; @@ -2856,14 +2865,14 @@ static struct Damage battle_calc_pc_weapon_attack( // 回避率計算、回避判定は後で flee = battle_get_flee(target); - if(battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0) //AGI、VITペナルティ設定が有効 - target_count += battle_counttargeted(target,src,battle_config.agi_penaly_count_lv); //対象の数を算出 - if(battle_config.agi_penaly_type > 0) { - if(target_count >= battle_config.agi_penaly_count) { //ペナルティ設定より対象が多い - if(battle_config.agi_penaly_type == 1) //回避率がagi_penaly_num%ずつ減少 - flee = (flee * (100 - (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num))/100; - else if(battle_config.agi_penaly_type == 2) //回避率がagi_penaly_num分減少 - flee -= (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num; + if(battle_config.agi_penalty_type > 0 || battle_config.vit_penalty_type > 0) //AGI、VITペナルティ設定が有効 + target_count += battle_counttargeted(target,src,battle_config.agi_penalty_count_lv); //対象の数を算出 + if(battle_config.agi_penalty_type > 0) { + if(target_count >= battle_config.agi_penalty_count) { //ペナルティ設定より対象が多い + if(battle_config.agi_penalty_type == 1) //回避率がagi_penalty_num%ずつ減少 + flee = (flee * (100 - (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num))/100; + else if(battle_config.agi_penalty_type == 2) //回避率がagi_penalty_num分減少 + flee -= (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num; if(flee < 1) flee = 1; //回避率は最低でも1 } } @@ -3365,8 +3374,8 @@ static struct Damage battle_calc_pc_weapon_attack( damage += arr; damage2 += arr; } - damage = damage*(100+ 50 * skill_lv)/100; - damage2 = damage2*(100+ 50 * skill_lv)/100; + damage = damage*(60+ 40 * skill_lv)/100; + damage2 = damage2*(60+ 40 * skill_lv)/100; if(sd->arrow_ele > 0) { s_ele = sd->arrow_ele; s_ele_ = sd->arrow_ele; @@ -3508,18 +3517,18 @@ static struct Damage battle_calc_pc_weapon_attack( // ディバインプロテクション(ここでいいのかな?) if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000) { //DEF, VIT無視 int t_def; - target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penaly_count_lv); - if(battle_config.vit_penaly_type > 0) { - if(target_count >= battle_config.vit_penaly_count) { - if(battle_config.vit_penaly_type == 1) { - def1 = (def1 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; - def2 = (def2 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; - t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; + target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penalty_count_lv); + if(battle_config.vit_penalty_type > 0) { + if(target_count >= battle_config.vit_penalty_count) { + if(battle_config.vit_penalty_type == 1) { + def1 = (def1 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100; + def2 = (def2 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100; + t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100; } - else if(battle_config.vit_penaly_type == 2) { - def1 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; - def2 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; - t_vit -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; + else if(battle_config.vit_penalty_type == 2) { + def1 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num; + def2 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num; + t_vit -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num; } if(def1 < 0) def1 = 0; if(def2 < 1) def2 = 1; @@ -5131,14 +5140,14 @@ static const struct { { "undead_detect_type", &battle_config.undead_detect_type }, { "player_auto_counter_type", &battle_config.pc_auto_counter_type }, { "monster_auto_counter_type", &battle_config.monster_auto_counter_type}, - { "agi_penaly_type", &battle_config.agi_penaly_type }, - { "agi_penaly_count", &battle_config.agi_penaly_count }, - { "agi_penaly_num", &battle_config.agi_penaly_num }, - { "agi_penaly_count_lv", &battle_config.agi_penaly_count_lv }, - { "vit_penaly_type", &battle_config.vit_penaly_type }, - { "vit_penaly_count", &battle_config.vit_penaly_count }, - { "vit_penaly_num", &battle_config.vit_penaly_num }, - { "vit_penaly_count_lv", &battle_config.vit_penaly_count_lv }, + { "agi_penalty_type", &battle_config.agi_penalty_type }, + { "agi_penalty_count", &battle_config.agi_penalty_count }, + { "agi_penalty_num", &battle_config.agi_penalty_num }, + { "agi_penalty_count_lv", &battle_config.agi_penalty_count_lv }, + { "vit_penalty_type", &battle_config.vit_penalty_type }, + { "vit_penalty_count", &battle_config.vit_penalty_count }, + { "vit_penalty_num", &battle_config.vit_penalty_num }, + { "vit_penalty_count_lv", &battle_config.vit_penalty_count_lv }, { "player_defense_type", &battle_config.player_defense_type }, { "monster_defense_type", &battle_config.monster_defense_type }, { "pet_defense_type", &battle_config.pet_defense_type }, @@ -5159,7 +5168,7 @@ static const struct { { "monster_attack_direction_change", &battle_config.monster_attack_direction_change }, { "player_land_skill_limit", &battle_config.pc_land_skill_limit }, { "monster_land_skill_limit", &battle_config.monster_land_skill_limit}, - { "party_skill_penaly", &battle_config.party_skill_penaly }, + { "party_skill_penalty", &battle_config.party_skill_penalty }, { "monster_class_change_full_recover", &battle_config.monster_class_change_full_recover }, { "produce_item_name_input", &battle_config.produce_item_name_input }, { "produce_potion_name_input", &battle_config.produce_potion_name_input}, @@ -5365,14 +5374,14 @@ void battle_set_defaults() { battle_config.undead_detect_type = 0; battle_config.pc_auto_counter_type = 1; battle_config.monster_auto_counter_type = 1; - battle_config.agi_penaly_type = 0; - battle_config.agi_penaly_count = 3; - battle_config.agi_penaly_num = 0; - battle_config.agi_penaly_count_lv = ATK_FLEE; - battle_config.vit_penaly_type = 0; - battle_config.vit_penaly_count = 3; - battle_config.vit_penaly_num = 0; - battle_config.vit_penaly_count_lv = ATK_DEF; + battle_config.agi_penalty_type = 0; + battle_config.agi_penalty_count = 3; + battle_config.agi_penalty_num = 0; + battle_config.agi_penalty_count_lv = ATK_FLEE; + battle_config.vit_penalty_type = 0; + battle_config.vit_penalty_count = 3; + battle_config.vit_penalty_num = 0; + battle_config.vit_penalty_count_lv = ATK_DEF; battle_config.player_defense_type = 0; battle_config.monster_defense_type = 0; battle_config.pet_defense_type = 0; @@ -5394,7 +5403,7 @@ void battle_set_defaults() { battle_config.pc_undead_nofreeze = 0; battle_config.pc_land_skill_limit = 1; battle_config.monster_land_skill_limit = 1; - battle_config.party_skill_penaly = 1; + battle_config.party_skill_penalty = 1; battle_config.monster_class_change_full_recover = 0; battle_config.produce_item_name_input = 1; battle_config.produce_potion_name_input = 1; @@ -5534,10 +5543,10 @@ void battle_validate_conf() { battle_config.max_cart_weight = 100; battle_config.max_cart_weight *= 10; - if(battle_config.agi_penaly_count < 2) - battle_config.agi_penaly_count = 2; - if(battle_config.vit_penaly_count < 2) - battle_config.vit_penaly_count = 2; + if(battle_config.agi_penalty_count < 2) + battle_config.agi_penalty_count = 2; + if(battle_config.vit_penalty_count < 2) + battle_config.vit_penalty_count = 2; if(battle_config.guild_exp_limit > 99) battle_config.guild_exp_limit = 99; diff --git a/src/map/battle.h b/src/map/battle.h index 2b901410f..48a543844 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -229,12 +229,12 @@ extern struct Battle_Config { int undead_detect_type; int pc_auto_counter_type; int monster_auto_counter_type; - int agi_penaly_type; - int agi_penaly_count; - int agi_penaly_num; - int vit_penaly_type; - int vit_penaly_count; - int vit_penaly_num; + int agi_penalty_type; + int agi_penalty_count; + int agi_penalty_num; + int vit_penalty_type; + int vit_penalty_count; + int vit_penalty_num; int player_defense_type; int monster_defense_type; int pet_defense_type; @@ -256,7 +256,7 @@ extern struct Battle_Config { int pc_undead_nofreeze; int pc_land_skill_limit; int monster_land_skill_limit; - int party_skill_penaly; + int party_skill_penalty; int monster_class_change_full_recover; int produce_item_name_input; int produce_potion_name_input; @@ -297,8 +297,8 @@ extern struct Battle_Config { int pk_mode; int show_mob_hp; // end additions [Valaris] - int agi_penaly_count_lv; - int vit_penaly_count_lv; + int agi_penalty_count_lv; + int vit_penalty_count_lv; int gx_allhit; int gx_cardfix; diff --git a/src/map/pc.c b/src/map/pc.c index b7c540e1d..3cb78e65a 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -1458,7 +1458,7 @@ int pc_calcstatus(struct map_session_data* sd,int first) } if( (skill=pc_checkskill(sd,MC_INCCARRY))>0 ) // skill can be used with an item now, thanks to orn [Valaris] - sd->max_weight += skill*1000; + sd->max_weight += skill*2000; if( (skill=pc_checkskill(sd,AC_OWL))>0 ) // ふくろうの目 sd->paramb[4] += skill; @@ -1467,6 +1467,9 @@ int pc_calcstatus(struct map_session_data* sd,int first) sd->paramb[0] ++; sd->base_atk += 4; } + if((skill=pc_checkskill(sd,SA_DRAGONOLOGY))>0 ){ // Dragonology increases +1 int every 2 levels + sd->paramb[3] += (skill+1)*0.5; + } // New guild skills - Celest if (sd->status.guild_id > 0) { @@ -1656,7 +1659,7 @@ int pc_calcstatus(struct map_session_data* sd,int first) //攻?速度?加 - if( (skill=pc_checkskill(sd,AC_VULTURE))>0){ // ワシの目 + if((skill=pc_checkskill(sd,AC_VULTURE))>0){ // ワシの目 sd->hit += skill; if(sd->status.weapon == 11) sd->attackrange += skill; @@ -1671,27 +1674,17 @@ int pc_calcstatus(struct map_session_data* sd,int first) else if (pc_isriding(sd)) { // ペコペコ?りによる速度?加 sd->speed -= (0.25 * DEFAULT_WALK_SPEED); sd->max_weight += 10000; - } - if(sd->sc_count){ - if(sd->sc_data[SC_WINDWALK].timer!=-1) //ウィンドウォ?ク時はLv*2%減算 - sd->speed -= sd->speed *(sd->sc_data[SC_WINDWALK].val1*2)/100; - if(sd->sc_data[SC_CARTBOOST].timer!=-1) // カ?トブ?スト - sd->speed -= (DEFAULT_WALK_SPEED * 20)/100; - if(sd->sc_data[SC_BERSERK].timer!=-1) //バ?サ?ク中はIAと同じぐらい速い? - sd->speed -= sd->speed *25/100; - if(sd->sc_data[SC_WEDDING].timer!=-1) //結婚中は?くのが?い - sd->speed = 2*DEFAULT_WALK_SPEED; - } - + } if((skill=pc_checkskill(sd,CR_TRUST))>0) { // フェイス sd->status.max_hp += skill*200; sd->subele[6] += skill*5; } - if((skill=pc_checkskill(sd,BS_SKINTEMPER))>0) - { + if((skill=pc_checkskill(sd,BS_SKINTEMPER))>0) { sd->subele[0] += skill; sd->subele[3] += skill*5; } + if((skill=pc_checkskill(sd,SA_ADVANCEDBOOK))>0 ) + aspd_rate -= skill*0.5; bl=sd->status.base_level; @@ -1831,16 +1824,17 @@ int pc_calcstatus(struct map_session_data* sd,int first) } if(sd->sc_data[SC_NIBELUNGEN].timer!=-1) { // ニ?ベルングの指輪 index = sd->equip_index[9]; - if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 3) + /*if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 3) sd->watk += sd->sc_data[SC_NIBELUNGEN].val3; index = sd->equip_index[8]; if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 3) sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val3; + index = sd->equip_index[9];*/ if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 4) - sd->watk += sd->sc_data[SC_NIBELUNGEN].val2; + sd->watk2 += sd->sc_data[SC_NIBELUNGEN].val3; index = sd->equip_index[8]; if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 4) - sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val2; + sd->watk_2 += sd->sc_data[SC_NIBELUNGEN].val3; } if(sd->sc_data[SC_VOLCANO].timer!=-1 && sd->def_ele==3){ // ボルケ?ノ @@ -1876,7 +1870,7 @@ int pc_calcstatus(struct map_session_data* sd,int first) aspd_rate -= 30; if(sd->sc_data[SC_ADRENALINE].timer != -1 && sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) { // アドレナリンラッシュ - if(sd->sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly) + if(sd->sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penalty) aspd_rate -= 30; else aspd_rate -= 25; @@ -1896,6 +1890,14 @@ int pc_calcstatus(struct map_session_data* sd,int first) sd->sc_data[i=SC_SPEEDPOTION1].timer!=-1 || sd->sc_data[i=SC_SPEEDPOTION0].timer!=-1) // ? 速ポ?ション aspd_rate -= sd->sc_data[i].val2; + if(sd->sc_data[SC_WINDWALK].timer!=-1) //ウィンドウォ?ク時はLv*2%減算 + sd->speed -= sd->speed *(sd->sc_data[SC_WINDWALK].val1*2)/100; + if(sd->sc_data[SC_CARTBOOST].timer!=-1) // カ?トブ?スト + sd->speed -= (DEFAULT_WALK_SPEED * 20)/100; + if(sd->sc_data[SC_BERSERK].timer!=-1) //バ?サ?ク中はIAと同じぐらい速い? + sd->speed -= sd->speed *25/100; + if(sd->sc_data[SC_WEDDING].timer!=-1) //結婚中は?くのが?い + sd->speed = 2*DEFAULT_WALK_SPEED; // HIT/FLEE?化系 if(sd->sc_data[SC_WHISTLE].timer!=-1){ // 口笛 @@ -1980,13 +1982,15 @@ int pc_calcstatus(struct map_session_data* sd,int first) } if(sd->sc_data[SC_DEFENDER].timer != -1) { sd->aspd += (550 - sd->sc_data[SC_DEFENDER].val1*50); - sd->speed = (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1*5)) / 100; + // removed as of 12/14's patch [celest] + //sd->speed = (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1*5)) / 100; } if(sd->sc_data[SC_ENCPOISON].timer != -1) sd->addeff[4] += sd->sc_data[SC_ENCPOISON].val2; if( sd->sc_data[SC_DANCING].timer!=-1 ){ // 演奏/ダンス使用中 - sd->speed*=4; + sd->speed = (double)sd->speed * (6.- 0.4 * pc_checkskill(sd, ((s_class.job == 19) ? BA_MUSICALLESSON : DC_DANCINGLESSON))); + //sd->speed*=4; sd->nhealsp = 0; sd->nshealsp = 0; sd->nsshealsp = 0; @@ -2175,10 +2179,11 @@ int pc_calcspeed (struct map_session_data *sd) sd->speed = (sd->speed * 125) / 100; } if(sd->sc_data[SC_DEFENDER].timer != -1) { - sd->speed = (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1*5)) / 100; + // removed as of 12/14's patch [celest] + //sd->speed = (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1*5)) / 100; } if( sd->sc_data[SC_DANCING].timer!=-1 ){ - sd->speed*=4; + sd->speed = (double)sd->speed * (6.- 0.4 * pc_checkskill(sd, ((s_class.job == 19) ? BA_MUSICALLESSON : DC_DANCINGLESSON))); } if(sd->sc_data[SC_CURSE].timer!=-1) sd->speed += 450; diff --git a/src/map/skill.c b/src/map/skill.c index be23b2234..3cdc4a8f4 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1195,6 +1195,11 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl,int s } break; + case AM_ACIDTERROR: + if( rand()%100 < (skilllv*3)*sc_def_vit/100 ) + skill_status_change_start(bl,SC_BLEEDING,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); + break; + case CR_SHIELDCHARGE: /* シ?ルドチャ?ジ */ if( rand()%100 < (15 + skilllv*5)*sc_def_vit/100 ) skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); @@ -2391,8 +2396,10 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s case AM_ACIDTERROR: /* アシッドテラ? */ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); - if(bl->type == BL_PC && rand()%100 < skill_get_time(skillid,skilllv) && battle_config.equipment_breaking) + if(bl->type == BL_PC && rand()%100 < skill_get_time(skillid,skilllv) && battle_config.equipment_breaking) { pc_breakarmor((struct map_session_data *)bl); + clif_emotion(bl, 23); + } break; case MO_FINGEROFFENSIVE: /* 指? */ { @@ -3170,7 +3177,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int break; } } - if(rand()%100 > (75+skilllv*1) && (skilllv != 5)) { + if(rand()%100 > (60+skilllv*10) && (skilllv != 5)) { clif_skill_fail(sd,skillid,0,0); clif_skill_nodamage(src,bl,skillid,skilllv,0); if(bl->type==BL_PC && battle_config.equipment_breaking) { @@ -5041,15 +5048,19 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil pc_movepos(sd,x,y); }else if( src->type==BL_MOB ) mob_warp((struct mob_data *)src,-1,x,y,0); + skill_status_change_start(src,SC_BLOCKSKILL,skilllv,0,MO_EXTREMITYFIST,0,2000,0 ); break; case AM_CANNIBALIZE: // バイオプラント if(sd){ int mx,my,id=0; + int summons[5] = { 1020, 1068, 1118, 1500, 1368 }; + struct mob_data *md; mx = x;// + (rand()%10 - 5); my = y;// + (rand()%10 - 5); - id=mob_once_spawn(sd,"this",mx,my,"--ja--",1118,1,""); + + id=mob_once_spawn(sd,"this",mx,my,"--ja--", summons[skilllv] ,1,""); if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){ md->master_id=sd->bl.id; md->hp=2210+skilllv*200; @@ -5069,7 +5080,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil id=mob_once_spawn(sd,"this",mx,my,"--ja--",1142,1,""); if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){ md->master_id=sd->bl.id; - md->hp=1000+skilllv*200; + md->hp=2000+skilllv*400; md->state.special_mob_ai=2; md->deletetimer=add_timer(gettick()+skill_get_time(skillid,skilllv),mob_timer_delete,id,0); } @@ -5272,7 +5283,7 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, case PR_SANCTUARY: /* サンクチュアリ */ count=21; limit=skill_get_time(skillid,skilllv); - val1=skilllv+3; + val1=(skilllv+3)*2; val2=(skilllv>6)?777:skilllv*100; target=BCT_ALL; range=1; @@ -5390,7 +5401,8 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, case SA_DELUGE: /* デリュ?ジ */ case SA_VIOLENTGALE: /* バイオレントゲイル */ limit=skill_get_time(skillid,skilllv); - count=skilllv<=2?25:(skilllv<=4?49:81); + //count=skilllv<=2?25:(skilllv<=4?49:81); + count=49; target=BCT_ALL; break; @@ -5408,7 +5420,7 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, count=81; limit=skill_get_time(skillid,skilllv); range=5; - target=BCT_ALL; + target=(skillid==BD_ETERNALCHAOS ? BCT_ENEMY : BCT_ALL); break; case BD_RICHMANKIM: case BD_DRUMBATTLEFIELD: /* ?太鼓の響き */ @@ -5897,8 +5909,11 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int clif_skill_nodamage(&src->bl,bl,AL_HEAL,heal,1); battle_heal(NULL,bl,heal,0,0); } - else + else { + // reduce healing count if this was meant for damaging [celest] + sg->val1 /= 2; skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); + } } break; @@ -7032,6 +7047,10 @@ int skill_check_condition(struct map_session_data *sd,int type) } else sd->spiritball_old = lv; break; + case MO_BODYRELOCATION: + if (sd->sc_count && sd->sc_data[SC_EXPLOSIONSPIRITS].timer!=-1) + spiritball = 0; + break; case MO_CHAINCOMBO: //連打掌 if(sd->sc_data[SC_BLADESTOP].timer==-1){ if(sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_TRIPLEATTACK) @@ -7094,8 +7113,9 @@ int skill_check_condition(struct map_session_data *sd,int type) case AM_SPHEREMINE: /* スフィア?マイン */ if(type&1){ int c=0; - int maxcount=skill_get_maxcount(skill); - int mob_class=(skill==AM_CANNIBALIZE)?1118:1142; + int summons[5] = { 1020, 1068, 1118, 1500, 1368 }; + int maxcount = (skill==AM_CANNIBALIZE)? 6-lv : skill_get_maxcount(skill); + int mob_class = (skill==AM_CANNIBALIZE)? summons[lv] :1142; if(battle_config.pc_land_skill_limit && maxcount>0) { map_foreachinarea(skill_check_condition_mob_master_sub ,sd->bl.m, 0, 0, map[sd->bl.m].xs, map[sd->bl.m].ys, BL_MOB, sd->bl.id, mob_class,&c ); if(c >= maxcount){ @@ -7657,15 +7677,16 @@ int skill_use_id( struct map_session_data *sd, int target_id, return 0; } break; - case AS_SPLASHER: /* ベナムスプラッシャ? */ - { + // removed on 12/14's patch [celest] + //case AS_SPLASHER: /* ベナムスプラッシャ? */ + /* { struct status_change *t_sc_data = battle_get_sc_data(bl); if(t_sc_data && t_sc_data[SC_POISON].timer==-1){ clif_skill_fail(sd,skill_num,0,10); return 0; } } - break; + break;*/ case PF_MEMORIZE: /* メモライズ */ casttime = 12000; break; @@ -8860,12 +8881,11 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) struct status_change *sc_data; //short *sc_count; //使ってない? - if( (bl=map_id2bl(id)) == NULL ) - return 0; //該?IDがすでに消滅しているというのはいかにもありそうなのでスル?してみる + nullpo_retr(0, bl=map_id2bl(id)); nullpo_retr(0, sc_data=battle_get_sc_data(bl)); if(bl->type==BL_PC) - sd=(struct map_session_data *)bl; + nullpo_retr(0, sd=(struct map_session_data *)bl); //sc_count=battle_get_sc_count(bl); //使ってない? @@ -8975,8 +8995,8 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) case SC_WATERBALL: /* ウォ?タ?ボ?ル */ { struct block_list *target=map_id2bl(sc_data[type].val2); - if(target==NULL || target->prev==NULL) - break; + nullpo_retb(target); + nullpo_retb(target->prev); skill_attack(BF_MAGIC,bl,bl,target,WZ_WATERBALL,sc_data[type].val1,tick,0); if((--sc_data[type].val3)>0) { sc_data[type].timer=add_timer( 150+tick,skill_status_change_timer, bl->id, data ); @@ -9003,12 +9023,14 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) struct skill_unit *unit= (struct skill_unit *)sc_data[type].val4; struct block_list *src; - - if(!unit || !unit->group) + /*if(!unit || !unit->group) break; src=map_id2bl(unit->group->src_id); if(!src) - break; + break;*/ + nullpo_retb(unit); + nullpo_retb(unit->group); + nullpo_retr(0, src=map_id2bl(unit->group->src_id)); skill_attack(BF_MISC,src,&unit->bl,bl,unit->group->skill_id,sc_data[type].val1,tick,0); sc_data[type].timer=add_timer(skill_get_time2(unit->group->skill_id,unit->group->skill_lv)+tick, skill_status_change_timer, bl->id, data ); @@ -9020,7 +9042,9 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) if( (--sc_data[type].val2)>0){ struct skill_unit *unit= (struct skill_unit *)sc_data[type].val4; - if(!unit || !unit->group || unit->group->src_id==bl->id) + nullpo_retb(unit); + nullpo_retb(unit->group); + if(unit->group->src_id == bl->id) break; skill_additional_effect(bl,bl,unit->group->skill_id,sc_data[type].val1,BF_LONG|BF_SKILL|BF_MISC,tick); if (unit->group != 0) @@ -9048,8 +9072,8 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) if((++sc_data[type].val4)%5 == 0 && battle_get_hp(bl) > hp>>2) { hp = hp/100; if(hp < 1) hp = 1; - if(bl->type == BL_PC) - pc_heal((struct map_session_data *)bl,-hp,0); + if(sd) + pc_heal(sd,-hp,0); else if(bl->type == BL_MOB){ struct mob_data *md; if((md=((struct mob_data *)bl)) == NULL) @@ -9072,8 +9096,9 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) } else if(bl->type == BL_MOB) { struct mob_data *md; - if((md=((struct mob_data *)bl)) == NULL) - break; + nullpo_retr(0, md=(struct mob_data *)bl); + /*if((md=((struct mob_data *)bl)) == NULL) + break;*/ hp = 3 + hp/200; md->hp -= hp; } @@ -9088,13 +9113,14 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) if (sc_data[SC_SLOWPOISON].timer == -1 && (--sc_data[type].val3) > 0) { int hp = battle_get_max_hp(bl); if (battle_get_hp(bl) > hp>>2) { - if(bl->type == BL_PC) { + if(sd) { hp = 3 + hp/50; - pc_heal((struct map_session_data *)bl, -hp, 0); + pc_heal(sd, -hp, 0); } else if (bl->type == BL_MOB) { struct mob_data *md; - if ((md=((struct mob_data *)bl)) == NULL) - break; + nullpo_retr(0, md=(struct mob_data *)bl); + /*if ((md=((struct mob_data *)bl)) == NULL) + break;*/ hp = 3 + hp/100; md->hp -= hp; } @@ -9124,14 +9150,15 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) // case SC_BLEEDING: if((--sc_data[type].val3) > 0) { int hp = battle_get_max_hp(bl); - if(bl->type == BL_PC) { + if(sd) { hp = 3 + hp*3/200; - pc_heal((struct map_session_data *)bl,-hp,0); + pc_heal(sd,-hp,0); } else if(bl->type == BL_MOB) { struct mob_data *md; - if((md=((struct mob_data *)bl)) == NULL) - break; + nullpo_retr(0, md=(struct mob_data *)bl); + /*if((md=((struct mob_data *)bl)) == NULL) + break;*/ hp = 3 + hp/200; md->hp -= hp; } @@ -9517,11 +9544,13 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val calc_flag = 1; break; case SC_WEAPONPERFECTION: /* ウェポンパ?フェクション */ - if(battle_config.party_skill_penaly && !val2) tick /= 5; + // Lasting time penalties have been removed on sakray as of 12/14 [celest] + //if(battle_config.party_skill_penalty && !val2) tick /= 5; break; case SC_OVERTHRUST: /* オ?バ?スラスト */ *opt3 |= 2; - if(battle_config.party_skill_penaly && !val2) tick /= 10; + // Lasting time penalties have been removed on sakray as of 12/14 [celest] + //if(battle_config.party_skill_penalty && !val2) tick /= 10; break; case SC_MAXIMIZEPOWER: /* マキシマイズパワ?(SPが1減る時間,val2にも) */ if(bl->type == BL_PC) @@ -9682,7 +9711,7 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val break; case SC_NIBELUNGEN: /* ニ?ベルングの指輪 */ calc_flag = 1; - val2 = (val1+2)*50; + //val2 = (val1+2)*50; val3 = (val1+2)*25; break; case SC_ROKISWEIL: /* ロキの叫び */ @@ -9691,7 +9720,7 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val break; case SC_SIEGFRIED: /* 不死身のジ?クフリ?ド */ calc_flag = 1; - val2 = 40 + val1*5; + val2 = 55 + val1*5; val3 = val1*10; break; case SC_DISSONANCE: /* 不協和音 */ |