diff options
author | celest <celest@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2004-12-01 16:00:51 +0000 |
---|---|---|
committer | celest <celest@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2004-12-01 16:00:51 +0000 |
commit | 207277be0ac9c73626adc9cf8a6841a3dffe67ef (patch) | |
tree | ad3f8e167dffc823ff2cd7d7c14489176b78cd88 | |
parent | a37c493390ab0d6b8c834dbff973875aa9fbc607 (diff) | |
download | hercules-207277be0ac9c73626adc9cf8a6841a3dffe67ef.tar.gz hercules-207277be0ac9c73626adc9cf8a6841a3dffe67ef.tar.bz2 hercules-207277be0ac9c73626adc9cf8a6841a3dffe67ef.tar.xz hercules-207277be0ac9c73626adc9cf8a6841a3dffe67ef.zip |
- 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://rathena.svn.sourceforge.net/svnroot/rathena/branches/stable@431 54d463be-8e91-2dee-dedb-b68131a5f0ec
-rw-r--r-- | Changelog.txt | 5 | ||||
-rw-r--r-- | db/Changelog.txt | 2 | ||||
-rw-r--r-- | db/skill_cast_db.txt | 2 | ||||
-rw-r--r-- | db/skill_db.txt | 6 | ||||
-rw-r--r-- | db/skill_require_db.txt | 2 | ||||
-rw-r--r-- | src/map/battle.c | 20 | ||||
-rw-r--r-- | src/map/map.c | 3 | ||||
-rw-r--r-- | src/map/map.h | 1 | ||||
-rw-r--r-- | src/map/skill.c | 87 |
9 files changed, 107 insertions, 21 deletions
diff --git a/Changelog.txt b/Changelog.txt index eb19d499e..f49e7ab99 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,11 @@ Date Added 12/1 - 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 * Fixed client crash when disguised characters die [celest] diff --git a/db/Changelog.txt b/db/Changelog.txt index 9cd5667f4..189351646 100644 --- a/db/Changelog.txt +++ b/db/Changelog.txt @@ -5,6 +5,8 @@ Ayathoya items == Added but no effect ( all are "ect" itens) 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] * updated skill_cast_db for Meltdown and Tiger Knuckle Fist [celest] diff --git a/db/skill_cast_db.txt b/db/skill_cast_db.txt index aec25dcb4..ff8b69227 100644 --- a/db/skill_cast_db.txt +++ b/db/skill_cast_db.txt @@ -239,7 +239,7 @@ 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#ライフ置き換え# 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#エンチャントデッドリーポイズン# 379,0,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0 //ASC_BREAKER diff --git a/db/skill_db.txt b/db/skill_db.txt index 5e24078a6..2913874c0 100644 --- a/db/skill_db.txt +++ b/db/skill_db.txt @@ -138,7 +138,7 @@ 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#グリ?トゥ?ス# 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#ベナ??スト# 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#応?手当# @@ -408,8 +408,8 @@ 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#連柱崩撃# 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#?ウル?ェンジ# -375,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //PF_SOULBURN#?ウルバ?ン# +374,4,6,16,0,1,1,1,yes,0,0,0,magic,0 //PF_SOULCHANGE#?ウル?ェンジ# +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#アドバンスドカ??ル研究# 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#エン?ャントデッドリ??イズン# diff --git a/db/skill_require_db.txt b/db/skill_require_db.txt index 5b95010cb..49eb15602 100644 --- a/db/skill_require_db.txt +++ b/db/skill_require_db.txt @@ -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#連柱崩?# 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_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#エンチャントデッドリ?ポイズン# 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#ソウルブレ?カ?# diff --git a/src/map/battle.c b/src/map/battle.c index 8309bce78..6ff2697b4 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -4008,6 +4008,7 @@ struct Damage battle_calc_magic_attack( struct Damage md; int aflag; 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; struct map_session_data *sd=NULL,*tsd=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"); } 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){ // 一般魔法ダメージ計算 int imdef_flag=0; - if(matk1>matk2) - damage= matk2+rand()%(matk1-matk2+1); - else - damage= matk2; + if (matk_flag) { + if(matk1>matk2) + damage= matk2+rand()%(matk1-matk2+1); + else + damage= matk2; + } if(sd) { if(sd->ignore_mdef_ele & (1<<t_ele) || sd->ignore_mdef_race & (1<<t_race)) imdef_flag = 1; diff --git a/src/map/map.c b/src/map/map.c index 274c9559e..ebdc2a8c5 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -986,7 +986,7 @@ int map_quit(struct map_session_data *sd) { sd->status.hp = 100; skill_status_change_clear(&sd->bl,1); // ステータス異常を解除する - skill_clear_unitgroup(&sd->bl); // スキルユニットグループの削除 +// skill_clear_unitgroup(&sd->bl); // スキルユニットグループの削除 skill_cleartimerskill(&sd->bl); pc_stop_walking(sd,0); pc_stopattack(sd); @@ -995,6 +995,7 @@ int map_quit(struct map_session_data *sd) { skill_gangsterparadise(sd,0); pc_calcstatus(sd,4); + skill_clear_unitgroup(&sd->bl); // [Sara-chan] clif_clearchar_area(&sd->bl,2); diff --git a/src/map/map.h b/src/map/map.h index 870682156..60f4ce9d6 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -398,6 +398,7 @@ struct mob_data { unsigned change_walk_target : 1; unsigned walk_easy : 1; unsigned special_mob_ai : 3; + unsigned soul_change_flag : 1; // Celest } state; int timer; short to_x,to_y; diff --git a/src/map/skill.c b/src/map/skill.c index 80a7170b5..4830ba6c7 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -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> @@ -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); if(sc_data) { 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); } } @@ -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, 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{ 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 */ ar=3; - // meteor assault cast effect (not sure how else to properly add it =p) [Celest] 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[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 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; 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 ); 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_SELFDESTRUCTION2: /* 自爆2 */ if(flag&1){ @@ -2783,6 +2803,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s break; default: + printf("Unknown skill used:%d\n",skillid); map_freeblock_unlock(); 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); 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[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以上?っていたら失敗 return 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; case PF_MINDBREAKER: /* プロボック */ @@ -4462,6 +4483,35 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int } 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] case WS_WEAPONREFINE: if(sd) @@ -4617,6 +4667,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int } } break; + default: printf("Unknown skill used:%d\n",skillid); map_freeblock_unlock(); @@ -9072,6 +9123,20 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) return 0; } 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_GLORYWOUNDS: case SC_SOULCOLD: |