Selaa lähdekoodia

* Added nullpo_retb
* Replaced some parts in skill.c with nullpo checks
* Updated most of 12/14's skills patch

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@560 54d463be-8e91-2dee-dedb-b68131a5f0ec

celest 20 vuotta sitten
vanhempi
commit
fa5bc90101
10 muutettua tiedostoa jossa 267 lisäystä ja 208 poistoa
  1. 7 1
      Changelog.txt
  2. 17 17
      conf-tmpl/battle_athena.conf
  3. 16 16
      db/skill_cast_db.txt
  4. 1 1
      db/skill_db.txt
  5. 8 9
      db/skill_require_db.txt
  6. 11 0
      src/common/nullpo.h
  7. 102 93
      src/map/battle.c
  8. 9 9
      src/map/battle.h
  9. 29 24
      src/map/pc.c
  10. 67 38
      src/map/skill.c

+ 7 - 1
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]

+ 17 - 17
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)

+ 16 - 16
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#カートブースト#

+ 1 - 1
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#ケ?カルシ?ルド?ャ?ジ#

+ 8 - 9
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##

+ 11 - 0
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 */

+ 102 - 93
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;

+ 9 - 9
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;

+ 29 - 24
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;

+ 67 - 38
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:			/* 不協和音 */