summaryrefslogtreecommitdiff
path: root/src/map/skill.c
diff options
context:
space:
mode:
authormalufett <malufett.eat.my.binaries@gmail.com>2013-07-04 23:22:12 +0800
committermalufett <malufett.eat.my.binaries@gmail.com>2013-07-04 23:22:12 +0800
commit83e3b8d22acc73aeaafbf2a95e1fb9e6b228a63a (patch)
tree08c8dc134b36176461531e29c4a5f247937f38e5 /src/map/skill.c
parent38ad0593dd7d6c3357c2a2219fe59122969c84b9 (diff)
downloadhercules-83e3b8d22acc73aeaafbf2a95e1fb9e6b228a63a.tar.gz
hercules-83e3b8d22acc73aeaafbf2a95e1fb9e6b228a63a.tar.bz2
hercules-83e3b8d22acc73aeaafbf2a95e1fb9e6b228a63a.tar.xz
hercules-83e3b8d22acc73aeaafbf2a95e1fb9e6b228a63a.zip
Fixed Bug#7459
-where 'working in progress' state is not cancel in change map/teleport. Fixed Bug#7265 -where casting AL_INCAGI into chars force them to stand where it now suppose to be. Fixed Bug#7337 -fixed some skills that deals 'work in progress' state. Fixed Bug#7467 -fixed compiling warning message. Renewal Updates -Temporary fix for skills final damage reduction. -Updated NJ_KUNAI to its renewal formula. -Updated/Fixed some interface messages. -Implemented additional new 3rd job skills(GN_ILLUSIONDOPING,RK_LUXANIMA,SO_ELEMENTAL_SHIELD,SC_ESCAPE) Signed-off-by: malufett <malufett.eat.my.binaries@gmail.com>
Diffstat (limited to 'src/map/skill.c')
-rw-r--r--src/map/skill.c124
1 files changed, 109 insertions, 15 deletions
diff --git a/src/map/skill.c b/src/map/skill.c
index d3dc98f14..9823fec0a 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -1056,7 +1056,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
case LK_SPIRALPIERCE:
case ML_SPIRALPIERCE:
- sc_start(bl,SC_STOP,(15+skill_lv*5),0,skill->get_time2(skill_id,skill_lv));
+ sc_start(bl,SC_ANKLESNARE,100,0,skill->get_time2(skill_id,skill_lv));
break;
case ST_REJECTSWORD:
@@ -1387,6 +1387,10 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
case MH_NEEDLE_OF_PARALYZE:
sc_start(bl, SC_NEEDLE_OF_PARALYZE, 40 + (5*skill_lv), skill_lv, skill->get_time(skill_id, skill_lv));
break;
+ case GN_ILLUSIONDOPING:
+ if( sc_start(bl, SC_ILLUSIONDOPING, 10 * skill_lv, skill_lv, skill->get_time(skill_id, skill_lv)) ) //custom rate.
+ sc_start(bl, SC_ILLUSION, 100, skill_lv, skill->get_time(skill_id, skill_lv));
+ break;
}
if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai)
@@ -3238,6 +3242,13 @@ int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data) {
}
}
break;
+ case SC_ESCAPE:
+ if( skl->type < 4+skl->skill_lv ){
+ clif->skill_damage(src,src,tick,0,0,-30000,1,skl->skill_id,skl->skill_lv,5);
+ skill->blown(src,src,1,unit_getdir(src),0);
+ skill->addtimerskill(src,tick+80,src->id,0,0,skl->skill_id,skl->skill_lv,skl->type+1,0);
+ }
+ break;
case CH_PALMSTRIKE:
{
struct status_change* tsc = status_get_sc(target);
@@ -3745,6 +3756,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case KO_HUUMARANKA:
case KO_MUCHANAGE:
case KO_BAKURETSU:
+ case GN_ILLUSIONDOPING:
if( flag&1 ) {//Recursive invocation
// skill_area_temp[0] holds number of targets in area
// skill_area_temp[1] holds the id of the original target
@@ -5658,6 +5670,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break;
case MC_CHANGECART:
+ if( sd )
+ sd->state.workinprogress = 3;
clif->skill_nodamage(src,bl,skill_id,skill_lv,1);
break;
@@ -6778,9 +6792,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break;
case SA_AUTOSPELL:
clif->skill_nodamage(src,bl,skill_id,skill_lv,1);
- if(sd)
+ if(sd){
+ sd->state.workinprogress = 3;
clif->autospell(sd,skill_lv);
- else {
+ }else {
int maxlv=1,spellid=0;
static const int spellarray[3] = { MG_COLDBOLT,MG_FIREBOLT,MG_LIGHTNINGBOLT };
if(skill_lv >= 10) {
@@ -7799,6 +7814,67 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
}
clif->skill_nodamage(src,bl,skill_id,1,1);
break;
+
+ case RK_LUXANIMA:
+ if( sd == NULL || sd->status.party_id == 0 || flag&1 ){
+ if( src == bl )
+ break;
+ while( skill_area_temp[5] >= 0x10 ){
+ type = SC_NONE;
+ i = 0;
+ if( skill_area_temp[5]&0x10 ){
+ if( dstsd ){
+ i = (rnd()%100<50) ? 4 : ((rnd()%100<80) ? 3 : 2);
+ clif->millenniumshield(dstsd,i);
+ skill_area_temp[5] &= ~0x10;
+ type = SC_MILLENNIUMSHIELD;
+ }
+ }else if( skill_area_temp[5]&0x20 ){
+ i = status_get_max_hp(bl) * 25 / 100;
+ status_change_clear_buffs(bl,4);
+ skill_area_temp[5] &= ~0x20;
+ status_heal(bl,i,0,1);
+ type = SC_REFRESH;
+ }else if( skill_area_temp[5]&0x40 ){
+ skill_area_temp[5] &= ~0x40;
+ type = SC_GIANTGROWTH;
+ }else if( skill_area_temp[5]&0x80 ){
+ if( dstsd ){
+ i = sstatus->hp / 4;
+ if( status_charge(bl,i,0) )
+ type = SC_STONEHARDSKIN;
+ skill_area_temp[5] &= ~0x80;
+ }
+ }else if( skill_area_temp[5]&0x100 ){
+ skill_area_temp[5] &= ~0x100;
+ type = SC_VITALITYACTIVATION;
+ }else if( skill_area_temp[5]&0x200 ){
+ skill_area_temp[5] &= ~0x200;
+ type = SC_ABUNDANCE;
+ }
+ if( type > SC_NONE )
+ clif->skill_nodamage(bl, bl, skill_id, skill_lv,
+ sc_start4(bl, type, 100, skill_lv, i, 0, 1, skill->get_time(skill_id, skill_lv)));
+ }
+ }else if( sd ){
+ if( tsc && tsc->count ){
+ if(tsc->data[SC_MILLENNIUMSHIELD])
+ skill_area_temp[5] |= 0x10;
+ if(tsc->data[SC_REFRESH])
+ skill_area_temp[5] |= 0x20;
+ if(tsc->data[SC_GIANTGROWTH])
+ skill_area_temp[5] |= 0x40;
+ if(tsc->data[SC_STONEHARDSKIN])
+ skill_area_temp[5] |= 0x80;
+ if(tsc->data[SC_VITALITYACTIVATION])
+ skill_area_temp[5] |= 0x100;
+ if(tsc->data[SC_ABUNDANCE])
+ skill_area_temp[5] |= 0x200;
+ }
+ clif->skill_nodamage(src, bl, skill_id, skill_lv, 1);
+ party_foreachsamemap(skill->area_sub, sd, skill->get_splash(skill_id, skill_lv), src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill->castend_nodamage_id);
+ }
+ break;
/**
* Guilotine Cross
**/
@@ -7891,15 +7967,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case AB_CLEMENTIA:
case AB_CANTO:
- {
- int bless_lv = sd ? ( pc->checkskill(sd,AL_BLESSING) + (sd->status.job_level / 10) ) : 10;
- int agi_lv = sd ? ( pc->checkskill(sd,AL_INCAGI) + (sd->status.job_level / 10) ) : 10;
- if( sd == NULL || sd->status.party_id == 0 || flag&1 )
- clif->skill_nodamage(bl, bl, skill_id, skill_lv, sc_start(bl,type,100,
- (skill_id == AB_CLEMENTIA)? bless_lv : (skill_id == AB_CANTO)? agi_lv : skill_lv, skill->get_time(skill_id,skill_lv)));
- else if( sd )
+ if( sd )
+ i = skill_id == AB_CLEMENTIA ? pc->checkskill(sd,AL_BLESSING) : pc->checkskill(sd,AL_INCAGI);
+ if( sd == NULL || sd->status.party_id == 0 || flag&1 )
+ clif->skill_nodamage(bl, bl, skill_id, skill_lv, sc_start(bl, type, 100, i + (sd?(sd->status.job_level / 10):0), skill->get_time(skill_id,skill_lv)));
+ else if( sd )
+ if( !i )
+ clif->skill_fail(sd,skill_id,USESKILL_FAIL,0);
+ else
party_foreachsamemap(skill->area_sub, sd, skill->get_splash(skill_id, skill_lv), src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill->castend_nodamage_id);
- }
break;
case AB_PRAEFATIO:
@@ -8853,7 +8929,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case SO_EL_ACTION:
if( sd ) {
- int duration = 3000;
+ int duration = 3000;
if( !sd->ed ) break;
sd->skill_id_old = skill_id;
elemental_action(sd->ed, bl, tick);
@@ -8890,6 +8966,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
}
break;
+ case SO_ELEMENTAL_SHIELD:
+ if( !sd->ed ) break;
+ elemental_delete(sd->ed, 0);
+ if( sd == NULL || sd->status.party_id == 0 || flag&1 )
+ skill->unitsetting(src,MG_SAFETYWALL,skill_lv,bl->x,bl->y,0);
+ else if( sd )
+ party_foreachsamemap(skill->area_sub, sd, skill->get_splash(skill_id, skill_lv), src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill->castend_nodamage_id);
+ break;
+
case GN_CHANGEMATERIAL:
case SO_EL_ANALYSIS:
if( sd ) {
@@ -9528,7 +9613,6 @@ int skill_castend_map (struct map_session_data *sd, uint16 skill_id, const char
unsigned short mapindex;
mapindex = mapindex_name2id((char*)map);
- sd->state.workinprogress = 0;
if(!mapindex) { //Given map not found?
clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
skill_failed(sd);
@@ -9626,6 +9710,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
case CR_CULTIVATION:
case HW_GANBANTEIN:
case LG_EARTHDRIVE:
+ case SC_ESCAPE:
break; //Effect is displayed on respective switch case.
default:
if(skill->get_inf(skill_id)&INF_SELF_SKILL)
@@ -10161,6 +10246,12 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
skill->castend_nodamage_id(src,src,TF_HIDING,1,tick,0x2);
break;
+ case SC_ESCAPE:
+ clif->skill_nodamage(src,src,skill_id,-1,1);
+ skill->unitsetting(src,HT_ANKLESNARE,skill_lv,x,y,2);
+ skill->addtimerskill(src,tick,src->id,0,0,skill_id,skill_lv,0,0);
+ break;
+
case LG_OVERBRAND:
{
int width;//according to data from irowiki it actually is a square
@@ -10498,6 +10589,9 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill
&& (src->type&battle_config.vs_traps_bctall))
target = BCT_ALL;
break;
+ case HT_ANKLESNARE:
+ if( flag&2 )
+ val3 = SC_ESCAPE;
case HT_SHOCKWAVE:
val1=skill_lv*15+10;
case HT_SANDMAN:
@@ -10507,7 +10601,6 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill
case MA_SKIDTRAP:
case HT_LANDMINE:
case MA_LANDMINE:
- case HT_ANKLESNARE:
case HT_FLASHER:
case HT_FREEZINGTRAP:
case MA_FREEZINGTRAP:
@@ -15450,7 +15543,7 @@ int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap) {
case UNT_ANKLESNARE:
case UNT_ELECTRICSHOCKER:
- if( group->val2 > 0 ) {
+ if( group->val2 > 0 || group->val3 == SC_ESCAPE ) {
// Used Trap don't returns back to item
skill->delunit(unit);
break;
@@ -16127,6 +16220,7 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid,
case ITEMID_URUZ:
D -= 500; //Rank A
case ITEMID_BERKANA:
+ case ITEMID_LUX_ANIMA:
D -= 500; //Rank S
}
make_per = A + B + C - D;