- Updated Poison React

- Added Soul Change, Soul Burn
- Added a somewhat crude timer for Venom splasher
- Added a fix for Guild Skills causing crashes

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@431 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
celest 2004-12-01 16:00:51 +00:00
parent 7d993ce5bb
commit 5e8f67eb9d
9 changed files with 107 additions and 21 deletions

View File

@ -1,6 +1,11 @@
Date Added Date Added
12/1 12/1
- Changed #define MAX_PET_DB to 300, it's easier for people adding new pets like this. [Nas] - Changed #define MAX_PET_DB to 300, it's easier for people adding new pets like this. [Nas]
* Skill Updates [celest]
- Updated Poison React
- Added Soul Change, Soul Burn
- Added a somewhat crude timer for Venom splasher
- Added a fix for Guild Skills causing crashes by Sara, thanks!
11/30 11/30
* Fixed client crash when disguised characters die [celest] * Fixed client crash when disguised characters die [celest]

View File

@ -5,6 +5,8 @@
Ayathoya items == Added but no effect ( all are "ect" itens) Ayathoya items == Added but no effect ( all are "ect" itens)
Skill databases == celest working on them i believe. Skill databases == celest working on them i believe.
12/1 * Updated Poison React, Soul Change, Soul Burn [celest]
11/30 * Corrected bUnbreakable value in const.txt [celest] 11/30 * Corrected bUnbreakable value in const.txt [celest]
* updated skill_cast_db for Meltdown and Tiger Knuckle Fist [celest] * updated skill_cast_db for Meltdown and Tiger Knuckle Fist [celest]

View File

@ -239,7 +239,7 @@
372,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0 //CH_CHAINCRUSH#連柱崩撃# 372,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0 //CH_CHAINCRUSH#連柱崩撃#
373,0,2000:2500:3000:3500:4000,0,0 //PF_HPCONVERSION#ライフ置き換え# 373,0,2000:2500:3000:3500:4000,0,0 //PF_HPCONVERSION#ライフ置き換え#
374,3000,5000,0,0 //PF_SOULCHANGE#ソウルチェンジ# 374,3000,5000,0,0 //PF_SOULCHANGE#ソウルチェンジ#
375,0,10000:10000:10000:10000:15000,0,0 //PF_SOULBURN#ソウルバーン# //375,0,10000:10000:10000:10000:15000,0,0 //PF_SOULBURN#ソウルバーン#
378,0,2000,20000:30000:40000:50000:60000,20000:30000:40000:50000:60000 //ASC_EDP#エンチャントデッドリーポイズン# 378,0,2000,20000:30000:40000:50000:60000,20000:30000:40000:50000:60000 //ASC_EDP#エンチャントデッドリーポイズン#
379,0,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0 //ASC_BREAKER 379,0,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0 //ASC_BREAKER

View File

@ -138,7 +138,7 @@
136,-1,8,1,0,0,10,8,no,0,0,0,weapon,0 //AS_SONICBLOW#?ニックブロ?# 136,-1,8,1,0,0,10,8,no,0,0,0,weapon,0 //AS_SONICBLOW#?ニックブロ?#
137,3:4:5:6:7,6,1,0,0,5,1,no,0,0,0,weapon,0 //AS_GRIMTOOTH#グリ?トゥ?ス# 137,3:4:5:6:7,6,1,0,0,5,1,no,0,0,0,weapon,0 //AS_GRIMTOOTH#グリ?トゥ?ス#
138,8,6,16,5,1,10,1,no,0,1024,0,weapon,0 //AS_ENCHANTPOISON#エン?ャント?イズン# 138,8,6,16,5,1,10,1,no,0,1024,0,weapon,0 //AS_ENCHANTPOISON#エン?ャント?イズン#
139,0,6,16,5,1,10,1,no,0,0,0,weapon,0 //AS_POISONREACT#?イズンリアクト# 139,0,6,4,5,1,10,1,no,0,0,0,weapon,0 //AS_POISONREACT#?イズンリアクト#
140,2,6,2,5,1,10,1,no,0,0,0,weapon,0 //AS_VENOMDUST#ベナ??スト# 140,2,6,2,5,1,10,1,no,0,0,0,weapon,0 //AS_VENOMDUST#ベナ??スト#
141,2,6,1,0,1,10,1,yes,0,0,0,weapon,0 //AS_SPLASHER#ベナ?スプラッシャ?# 141,2,6,1,0,1,10,1,yes,0,0,0,weapon,0 //AS_SPLASHER#ベナ?スプラッシャ?#
142,0,6,4,0,1,1,1,no,0,1,0,none,0 //NV_FIRSTAID#応?手当# 142,0,6,4,0,1,1,1,no,0,1,0,none,0 //NV_FIRSTAID#応?手当#
@ -408,8 +408,8 @@
371,-2,8,4,0,0,5,1,no,0,0,0,weapon,0 //CH_TIGERFIST#伏虎拳# 371,-2,8,4,0,0,5,1,no,0,0,0,weapon,0 //CH_TIGERFIST#伏虎拳#
372,-2,8,4,0,0,10,1:1:2:2:3:3:4:4:5:5,no,0,0,0,weapon,0 //CH_CHAINCRUSH#連柱崩撃# 372,-2,8,4,0,0,10,1:1:2:2:3:3:4:4:5:5,no,0,0,0,weapon,0 //CH_CHAINCRUSH#連柱崩撃#
373,0,6,4,0,1,5,1,no,0,0,0,magic,0 //PF_HPCONVERSION#ライフ置き換え# 373,0,6,4,0,1,5,1,no,0,0,0,magic,0 //PF_HPCONVERSION#ライフ置き換え#
374,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //PF_SOULCHANGE#?ウル?ェンジ# 374,4,6,16,0,1,1,1,yes,0,0,0,magic,0 //PF_SOULCHANGE#?ウル?ェンジ#
375,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //PF_SOULBURN#?ウルバ?ン# 375,4,6,1,0,0,5,1,yes,0,0,0,magic,0 //PF_SOULBURN#?ウルバ?ン#
376,0,0,0,0,1,5,1,no,0,0,0,weapon,0 //ASC_KATAR#アドバンスドカ??ル研究# 376,0,0,0,0,1,5,1,no,0,0,0,weapon,0 //ASC_KATAR#アドバンスドカ??ル研究#
377,0,0,4,0,1,10,1,no,0,0,0,misc,0 //ASC_HALLUCINATION#ハルシネ?ションウォ?ク# 377,0,0,4,0,1,10,1,no,0,0,0,misc,0 //ASC_HALLUCINATION#ハルシネ?ションウォ?ク#
378,0,6,4,5,1,10,1,no,0,1024,0,weapon,0 //ASC_EDP#エン?ャントデッドリ??イズン# 378,0,6,4,5,1,10,1,no,0,1024,0,weapon,0 //ASC_EDP#エン?ャントデッドリ??イズン#

View File

@ -260,7 +260,7 @@
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#連柱崩?# 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#連柱崩?#
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#???????# 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#ソウルチェンジ# 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_HPCONVERSION#ライフ置き換え# 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#?ウルバ?ン#
378,0,0,60:70:80:90:100,0,0,0,99,none,0,678,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_EDP#エンチャントデッドリ?ポイズン# 378,0,0,60:70:80:90:100,0,0,0,99,none,0,678,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_EDP#エンチャントデッドリ?ポイズン#
379,0,0,20:20:20:20:20:30:30:30:30:30,0,0,0,99,weapon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_BREAKER#ソウルブレ?カ?# 379,0,0,20:20:20:20:20:30:30:30:30:30,0,0,0,99,weapon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_BREAKER#ソウルブレ?カ?#

View File

@ -4008,6 +4008,7 @@ struct Damage battle_calc_magic_attack(
struct Damage md; struct Damage md;
int aflag; int aflag;
int normalmagic_flag=1; int normalmagic_flag=1;
int matk_flag = 1;
int ele=0,race=7,t_ele=0,t_race=7,t_mode = 0,cardfix,t_class,i; int ele=0,race=7,t_ele=0,t_race=7,t_mode = 0,cardfix,t_class,i;
struct map_session_data *sd=NULL,*tsd=NULL; struct map_session_data *sd=NULL,*tsd=NULL;
struct mob_data *tmd = NULL; struct mob_data *tmd = NULL;
@ -4165,15 +4166,26 @@ struct Damage battle_calc_magic_attack(
printf("battle_calc_magic_attack(): napalmvulcan enemy count=0 !\n"); printf("battle_calc_magic_attack(): napalmvulcan enemy count=0 !\n");
} }
break; break;
case PF_SOULBURN: // Celest
if (target->type != BL_PC || skill_lv < 5) {
memset(&md,0,sizeof(md));
return md;
} else if (target->type == BL_PC) {
damage = ((struct map_session_data *)target)->status.sp * 2;
matk_flag = 0; // don't consider matk and matk2
}
break;
} }
} }
if(normalmagic_flag){ // 一般魔法ダメージ計算 if(normalmagic_flag){ // 一般魔法ダメージ計算
int imdef_flag=0; int imdef_flag=0;
if(matk1>matk2) if (matk_flag) {
damage= matk2+rand()%(matk1-matk2+1); if(matk1>matk2)
else damage= matk2+rand()%(matk1-matk2+1);
damage= matk2; else
damage= matk2;
}
if(sd) { if(sd) {
if(sd->ignore_mdef_ele & (1<<t_ele) || sd->ignore_mdef_race & (1<<t_race)) if(sd->ignore_mdef_ele & (1<<t_ele) || sd->ignore_mdef_race & (1<<t_race))
imdef_flag = 1; imdef_flag = 1;

View File

@ -986,7 +986,7 @@ int map_quit(struct map_session_data *sd) {
sd->status.hp = 100; sd->status.hp = 100;
skill_status_change_clear(&sd->bl,1); // ステータス異常を解除する skill_status_change_clear(&sd->bl,1); // ステータス異常を解除する
skill_clear_unitgroup(&sd->bl); // スキルユニットグループの削除 // skill_clear_unitgroup(&sd->bl); // スキルユニットグループの削除
skill_cleartimerskill(&sd->bl); skill_cleartimerskill(&sd->bl);
pc_stop_walking(sd,0); pc_stop_walking(sd,0);
pc_stopattack(sd); pc_stopattack(sd);
@ -995,6 +995,7 @@ int map_quit(struct map_session_data *sd) {
skill_gangsterparadise(sd,0); skill_gangsterparadise(sd,0);
pc_calcstatus(sd,4); pc_calcstatus(sd,4);
skill_clear_unitgroup(&sd->bl); // [Sara-chan]
clif_clearchar_area(&sd->bl,2); clif_clearchar_area(&sd->bl,2);

View File

@ -398,6 +398,7 @@ struct mob_data {
unsigned change_walk_target : 1; unsigned change_walk_target : 1;
unsigned walk_easy : 1; unsigned walk_easy : 1;
unsigned special_mob_ai : 3; unsigned special_mob_ai : 3;
unsigned soul_change_flag : 1; // Celest
} state; } state;
int timer; int timer;
short to_x,to_y; short to_x,to_y;

View File

@ -1,4 +1,4 @@
// $Id: skill.c,v 1.8 2004/11/30 8:26:49 PM Celestia Exp $ // $Id: skill.c,v 1.8 2004/12/1 11:59:43 PM Celestia Exp $
/* スキル?係 */ /* スキル?係 */
#include <stdio.h> #include <stdio.h>
@ -1151,7 +1151,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl,int s
struct status_change *sc_data = battle_get_sc_data(bl); struct status_change *sc_data = battle_get_sc_data(bl);
if(sc_data) { if(sc_data) {
sc_data[SC_FREEZE].val3++; sc_data[SC_FREEZE].val3++;
if(sc_data[SC_FREEZE].val3 >= 3 && rand()%100 < skilllv*sc_def_mdef/100) if(sc_data[SC_FREEZE].val3 >= 3 && rand()%1000 < skilllv*sc_def_mdef/100)
skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
} }
} }
@ -2485,6 +2485,11 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
} }
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick, skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,
0x0500|dist ); 0x0500|dist );
if (bl->type == BL_MOB && skillid == AS_GRIMTOOTH) {
struct status_change *sc_data = battle_get_sc_data(bl);
if (sc_data && sc_data[SC_SLOWDOWN].timer == -1)
skill_status_change_start(bl,SC_SLOWDOWN,0,0,0,0,1000,0);
}
} }
}else{ }else{
int ar=1; int ar=1;
@ -2499,9 +2504,8 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
else if(skillid==NPC_SPLASHATTACK) /* スプラッシュアタックは範?7*7 */ else if(skillid==NPC_SPLASHATTACK) /* スプラッシュアタックは範?7*7 */
ar=3; ar=3;
// meteor assault cast effect (not sure how else to properly add it =p) [Celest]
if (skillid == ASC_METEORASSAULT) if (skillid == ASC_METEORASSAULT)
clif_specialeffect(&sd->bl,409, 1); clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_area_temp[1]=bl->id; skill_area_temp[1]=bl->id;
skill_area_temp[2]=x; skill_area_temp[2]=x;
@ -2516,11 +2520,6 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
if (skillid == SM_MAGNUM) // fire element for 10 seconds if (skillid == SM_MAGNUM) // fire element for 10 seconds
skill_status_change_start(src,SC_FLAMELAUNCHER,0,0,0,0,10000,0); skill_status_change_start(src,SC_FLAMELAUNCHER,0,0,0,0,10000,0);
} }
if (bl->type == BL_MOB && skillid == AS_GRIMTOOTH) {
struct status_change *sc_data = battle_get_sc_data(bl);
if (sc_data && sc_data[SC_SLOWDOWN].timer == -1)
skill_status_change_start(bl,SC_SLOWDOWN,0,0,0,0,1000,0);
}
break; break;
case KN_BOWLINGBASH: /* ボウリングバッシュ */ case KN_BOWLINGBASH: /* ボウリングバッシュ */
@ -2721,6 +2720,27 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,0 ); skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,0 );
break; break;
// Celest
case PF_SOULBURN:
{
int per = skilllv < 5 ? 20+ skilllv*10 : 60;
if (rand()%100 < per) {
clif_skill_nodamage(src,bl,skillid,skilllv,1);
if (skilllv == 5)
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,0 );
if (bl->type == BL_PC)
((struct map_session_data *)bl)->status.sp = 0;
} else {
clif_skill_nodamage(src,src,skillid,skilllv,1);
if (skilllv == 5)
skill_attack(BF_MAGIC,src,src,src,skillid,skilllv,tick,0 );
sd->status.sp = 0;
clif_updatestatus(sd,SP_SP);
}
skill_status_change_start(src,SC_BLOCKSKILL,skilllv,0,skillid,0, (skilllv < 5 ? 10000: 15000),0 );
}
break;
case NPC_SELFDESTRUCTION: /* 自爆 */ case NPC_SELFDESTRUCTION: /* 自爆 */
case NPC_SELFDESTRUCTION2: /* 自爆2 */ case NPC_SELFDESTRUCTION2: /* 自爆2 */
if(flag&1){ if(flag&1){
@ -2783,6 +2803,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
break; break;
default: default:
printf("Unknown skill used:%d\n",skillid);
map_freeblock_unlock(); map_freeblock_unlock();
return 1; return 1;
} }
@ -3538,7 +3559,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
{ {
struct status_change *tsc_data = battle_get_sc_data(bl); struct status_change *tsc_data = battle_get_sc_data(bl);
int sc=SkillStatusChangeTable[skillid]; int sc=SkillStatusChangeTable[skillid];
clif_skill_nodamage(src,bl,skillid,-1,1); clif_skill_nodamage(src,bl,skillid,skilllv,1);
if( tsc_data ){ if( tsc_data ){
if( tsc_data[sc].timer==-1 ) if( tsc_data[sc].timer==-1 )
/* 付加する */ /* 付加する */
@ -4421,7 +4442,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
if((double)battle_get_max_hp(bl)*2/3 < battle_get_hp(bl)) //HPが2/3以上?っていたら失敗 if((double)battle_get_max_hp(bl)*2/3 < battle_get_hp(bl)) //HPが2/3以上?っていたら失敗
return 1; return 1;
clif_skill_nodamage(src,bl,skillid,skilllv,1); clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,skillid,src->id,0,skill_get_time(skillid,skilllv),0 ); skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,skillid,src->id,skill_get_time(skillid,skilllv),1000,0 );
break; break;
case PF_MINDBREAKER: /* プロボック */ case PF_MINDBREAKER: /* プロボック */
@ -4462,6 +4483,35 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
} }
break; break;
case PF_SOULCHANGE:
{
int sp1 = 0, sp2 = 0;
if (sd) {
if (dstsd) {
sp1 = sd->status.sp > dstsd->status.max_sp ? dstsd->status.max_sp : sd->status.sp;
sp2 = dstsd->status.sp > sd->status.max_sp ? sd->status.max_sp : dstsd->status.sp;
sd->status.sp = sp2;
dstsd->status.sp = sp1;
clif_heal(sd->fd,SP_SP,sp2);
clif_heal(dstsd->fd,SP_SP,sp1);
} else if (dstmd) {
if (dstmd->state.soul_change_flag) {
clif_skill_fail(sd,skillid,0,0);
map_freeblock_unlock();
return 0;
}
sp2 = sd->status.max_sp * 3 /100;
if (sd->status.sp + sp2 > sd->status.max_sp)
sp2 = sd->status.max_sp - sd->status.sp;
sd->status.sp += sp2;
clif_heal(sd->fd,SP_SP,sp2);
dstmd->state.soul_change_flag = 1;
}
}
clif_skill_nodamage(src,bl,skillid,skilllv,1);
}
break;
// Weapon Refining [Celest] // Weapon Refining [Celest]
case WS_WEAPONREFINE: case WS_WEAPONREFINE:
if(sd) if(sd)
@ -4617,6 +4667,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
} }
} }
break; break;
default: default:
printf("Unknown skill used:%d\n",skillid); printf("Unknown skill used:%d\n",skillid);
map_freeblock_unlock(); map_freeblock_unlock();
@ -9072,6 +9123,20 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data)
return 0; return 0;
} }
break; break;
case SC_SPLASHER:
if (sc_data[type].val4 % 1000 == 0) {
char timer[2];
sprintf (timer, "%d", sc_data[type].val4/1000);
clif_message(bl, timer);
}
if((sc_data[type].val4 -= 500) > 0) {
sc_data[type].timer = add_timer(
500 + tick, skill_status_change_timer,
bl->id, data);
return 0;
}
break;
case SC_LEADERSHIP: case SC_LEADERSHIP:
case SC_GLORYWOUNDS: case SC_GLORYWOUNDS:
case SC_SOULCOLD: case SC_SOULCOLD: