# This patch file was generated by NetBeans IDE # Following Index: paths are relative to: /home/lighta/Documents/Myscript/RO/Servs/ramerge # This patch can be applied using context Tools: Patch action on respective folder. # It uses platform neutral UTF-8 encoding and \n newlines. # Above lines and this line are ignored by the patching process. Index: db/re/skill_unit_db.txt --- db/re/skill_unit_db.txt Base (BASE) +++ db/re/skill_unit_db.txt Locally Modified (Based On LOCAL) Index: src/map/battle.c --- src/map/battle.c Base (BASE) +++ src/map/battle.c Locally Modified (Based On LOCAL) @@ -2971,8 +2971,17 @@ skillratio += 400 + 100 * skill_lv; break; case MH_LAVA_SLIDE: - skillratio = 70 * skill_lv; + skillratio += -100 + 70 * skill_lv; break; + case MH_SONIC_CRAW: + skillratio += -100 + 40 * skill_lv; + break; + case MH_SILVERVEIN_RUSH: + skillratio += -100 + 150 * skill_lv; + break; + case MH_MIDNIGHT_FRENZY: + skillratio += -100 + 300 * skill_lv; + break; case MH_TINDER_BREAKER: case MH_MAGMA_FLOW: skillratio += -100 + 100 * skill_lv; Index: src/map/pc.c --- src/map/pc.c Base (BASE) +++ src/map/pc.c Locally Modified (Based On LOCAL) Index: src/map/skill.c --- src/map/skill.c Base (BASE) +++ src/map/skill.c Locally Modified (Based On LOCAL) @@ -1406,6 +1406,12 @@ case MH_NEEDLE_OF_PARALYZE: sc_start(bl, SC_PARALYSIS, 40 + (5*skill_lv), skill_lv, skill_get_time(skill_id, skill_lv)); break; + case MH_SILVERVEIN_RUSH: + sc_start4(bl,SC_STUN,20 + (5*skill_lv),skill_lv,src->id,0,0,skill_get_time(skill_id,skill_lv)); + break; + case MH_MIDNIGHT_FRENZY: + sc_start4(bl,SC_FEAR,20 + (4*skill_lv),skill_lv,src->id,0,0,skill_get_time(skill_id,skill_lv)); + break; } if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai) @@ -4627,6 +4633,57 @@ case MH_NEEDLE_OF_PARALYZE: skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); break; + case MH_SONIC_CRAW: + case MH_TINDER_BREAKER: { //eleanor combo shit + TBL_HOM *hd = BL_CAST(BL_HOM,src); + int8 k=0; + if(skill_id==MH_TINDER_BREAKER){ + } + else { //Sonic_craw + } + if(hd && hd->sc.count && hd->sc.data[SC_STYLE_CHANGE]){ + struct status_change_entry *sce = hd->sc.data[SC_STYLE_CHANGE]; + sce->val2 = bl->id; //memo target + sce->val3 = skill_id; + sce->val4 = gettick(); + } + break; + } + case MH_MIDNIGHT_FRENZY: + case MH_SILVERVEIN_RUSH: + case MH_CBC: + case MH_EQC: { + TBL_HOM *hd = BL_CAST(BL_HOM,src); + int8 k=0; + struct status_change_entry *sce; + struct block_list *tbl = NULL; //target + + if(!hd){ + clif_colormes(sd,COLOR_RED,"Only homon are support this skill atm, can't used it by other"); + map_freeblock_unlock(); + return 1; + } + if(hd->sc.count && (sce=hd->sc.data[SC_STYLE_CHANGE])){ + //val1 = mode + if(!sce->val2) sce->val2 = bl->id; //memo target (only sonic slaw and tinder should) + tbl = map_id2bl(sce->val2); + sce->val3 = skill_id; + sce->val4 = gettick(); + } + switch(skill_id){ + case MH_SONIC_CRAW: { + int nb_sphere = hd->homunculus.spiritball; + for(k=0; k<=nb_sphere; k++){ //attack for each sphere active + skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); + } + // hom_delspiritball(hd, nb_sphere, 0); //remove them all if we remove can't coninue combo + break; + } + case MH_SILVERVEIN_RUSH: + case MH_MIDNIGHT_FRENZY: + hom_delspiritball(hd,skill_id==MH_SILVERVEIN_RUSH?1:2,0); + skill_attack(skill_get_type(skill_id),src,src,tbl,skill_id,skill_lv,tick,flag); + break; case MH_TINDER_BREAKER: if (unit_movepos(src, bl->x, bl->y, 1, 1)) { #if PACKETVER >= 20111005 @@ -4635,11 +4692,16 @@ clif_skill_poseffect(src,skill_id,skill_lv,bl->x,bl->y,tick); #endif } - clif_skill_nodamage(src,bl,skill_id,skill_lv, - sc_start4(bl,SC_CLOSECONFINE2,100,skill_lv,src->id,0,0,skill_get_time(skill_id,skill_lv))); - skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); + case MH_CBC: + case MH_EQC: + hom_delspiritball(hd,skill_id==MH_EQC?2:1,0); //only EQC consume 2 in grp 2 + sc_start2(bl,status_skill2sc(skill_id),100,hd->battle_status.str,status_get_str(bl),2000); + skill_attack(skill_get_type(skill_id),src,src,tbl,skill_id,skill_lv,tick,flag); + //TODO add bonus for dmg SP ? on battle break; - + } + break; + } case 0:/* no skill - basic/normal attack */ if(sd) { if (flag & 3){ @@ -9051,9 +9113,10 @@ if (hd) skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv)); break; + case MH_SUMMON_LEGION: { - int summons[5] = {1004, 1303, 1303, 1994, 1994}; + int summons[5] = {2158, 2159, 2159, 2160, 2160}; int qty[5] = {3 , 3 , 4 , 4 , 5}; struct mob_data *md; int i; @@ -10951,7 +11014,7 @@ if( !group->state.song_dance && !map_getcell(src->m,ux,uy,CELL_CHKREACH) ) continue; // don't place skill units on walls (except for songs/dances/encores) - if( battle_config.skill_wall_check && skill_get_unit_flag(skill_id)&UF_PATHCHECK && !path_search_long(NULL,src->m,ux,uy,x,y,CELL_CHKWALL) ) + if( battle_config.skill_wall_check && unit_flag&UF_PATHCHECK && !path_search_long(NULL,src->m,ux,uy,x,y,CELL_CHKWALL) ) continue; // no path between cell and center of casting. switch( skill_id ) @@ -11014,7 +11077,7 @@ val2 = unit_flag&(UF_DANCE|UF_SONG); //Store whether this is a song/dance break; } - if (skill_get_unit_flag(skill_id) & UF_RANGEDSINGLEUNIT && i == (layout->count / 2)) + if (unit_flag&UF_RANGEDSINGLEUNIT && i == (layout->count / 2)) val2 |= UF_RANGEDSINGLEUNIT; // center. if( range <= 0 ) @@ -11216,12 +11279,12 @@ if (!sc) return 0; if (!sce) - sc_start4(bl,type,100,sg->skill_lv,sg->val1,sg->val2,0,sg->limit); + sc_start4(bl,type,100,sg->skill_lv,sg->val1,sg->val2,0,skill_get_time2(sg->skill_id,sg->skill_lv)); else if (sce->val4 == 1) { //Readjust timers since the effect will not last long. sce->val4 = 0; delete_timer(sce->timer, status_change_timer); - sce->timer = add_timer(tick+sg->limit, status_change_timer, bl->id, type); + sce->timer = add_timer(tick+skill_get_time2(sg->skill_id,sg->skill_lv), status_change_timer, bl->id, type); } break; @@ -13222,12 +13285,12 @@ } break; case ST_MH_FIGHTING: - if (!(sc && sc->data[SC_STYLE_CHANGE] && sc->data[SC_STYLE_CHANGE]->val2 == MH_MD_FIGHTING)){ + if (!(sc && sc->data[SC_STYLE_CHANGE] && sc->data[SC_STYLE_CHANGE]->val1 == MH_MD_FIGHTING)){ clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return 0; } case ST_MH_GRAPPLING: - if (!(sc && sc->data[SC_STYLE_CHANGE] && sc->data[SC_STYLE_CHANGE]->val2 == MH_MD_GRAPPLING)){ + if (!(sc && sc->data[SC_STYLE_CHANGE] && sc->data[SC_STYLE_CHANGE]->val1 == MH_MD_GRAPPLING)){ clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return 0; } @@ -13371,8 +13434,49 @@ } } break; + case MH_TINDER_BREAKER: + case MH_CBC: + case MH_EQC: + case MH_SONIC_CRAW: + case MH_SILVERVEIN_RUSH: + case MH_MIDNIGHT_FRENZY: + //nb check was separated to insert different error msg, not the case atm + if(!sd->hd){ //you need an homon + clif_skill_fail(sd , skill_id, USESKILL_FAIL_LEVEL, 0); + return 0; + } else { + struct status_change_entry *sce = sd->hd->sc.data[SC_STYLE_CHANGE]; + if(!sce || !sce->val3){ //homon doesn't have status or it's not a combo + if(skill_id != MH_SONIC_CRAW && skill_id != MH_TINDER_BREAKER){ + clif_skill_fail(sd , skill_id, USESKILL_FAIL_LEVEL, 0); + return 0; } + } + if(!sd->hd->homunculus.spiritball) {//need spheres + clif_skill_fail(sd , skill_id, USESKILL_FAIL_LEVEL, 0); + return 0; + } + //now let really be specific + switch(skill_id){ + case MH_TINDER_BREAKER: + if(sce->val3 == MH_EQC && (gettick() - sce->val4 <= 2000)) break; + else break; //im not a combo what should I do ?? + case MH_CBC: if(sce->val3 == MH_TINDER_BREAKER && (gettick() - sce->val4 <= 2000)) break; + case MH_EQC: if(sce->val3 == MH_CBC && (gettick() - sce->val4 <= 2000)) break; + case MH_SONIC_CRAW: + if(sce->val3 == MH_MIDNIGHT_FRENZY && (gettick() - sce->val4 <= 2000)) break; + else break; //im not a combo what should I do ?? + case MH_SILVERVEIN_RUSH: if(sce->val3 == MH_SONIC_CRAW && (gettick() - sce->val4 <= 2000)) break; + case MH_MIDNIGHT_FRENZY: if(sce->val3 == MH_SILVERVEIN_RUSH && (gettick() - sce->val4 <= 2000)) break; + default: + clif_skill_fail(sd , skill_id, USESKILL_FAIL_LEVEL, 0); + return 0; + } + + } + } + status = &sd->battle_status; require = skill_get_requirement(sd,skill_id,skill_lv); Index: src/map/status.c --- src/map/status.c Base (BASE) +++ src/map/status.c Locally Modified (Based On LOCAL) @@ -338,7 +338,7 @@ add_sc( BA_FROSTJOKER , SC_FREEZE ); set_sc( BA_WHISTLE , SC_WHISTLE , SI_BLANK , SCB_FLEE|SCB_FLEE2 ); set_sc( BA_ASSASSINCROSS , SC_ASSNCROS , SI_BLANK , SCB_ASPD ); - add_sc( BA_POEMBRAGI , SC_POEMBRAGI ); + set_sc( BA_POEMBRAGI , SC_POEMBRAGI , SI_FIREWEAPON, SCB_NONE); set_sc( BA_APPLEIDUN , SC_APPLEIDUN , SI_BLANK , SCB_MAXHP ); add_sc( DC_SCREAM , SC_STUN ); set_sc( DC_HUMMING , SC_HUMMING , SI_BLANK , SCB_HIT ); @@ -509,10 +509,10 @@ set_sc(MH_PAIN_KILLER, SC_PAIN_KILLER, SI_PAIN_KILLER, SCB_ASPD); add_sc(MH_STYLE_CHANGE, SC_STYLE_CHANGE); - set_sc( MH_TINDER_BREAKER , SC_CLOSECONFINE2 , SI_CLOSECONFINE2 , SCB_NONE ); - set_sc( MH_TINDER_BREAKER , SC_CLOSECONFINE , SI_CLOSECONFINE , SCB_FLEE ); + set_sc(MH_TINDER_BREAKER, SC_TINDER_BREAKER, SI_TINDER_BREAKER, SCB_FLEE); + set_sc(MH_CBC, SC_CBC, SI_CBC, SCB_FLEE); + set_sc(MH_EQC, SC_EQC, SI_EQC, SCB_FLEE); - add_sc( MER_CRASH , SC_STUN ); set_sc( MER_PROVOKE , SC_PROVOKE , SI_PROVOKE , SCB_DEF|SCB_DEF2|SCB_BATK|SCB_WATK ); add_sc( MS_MAGNUM , SC_WATK_ELEMENT ); @@ -8643,9 +8643,16 @@ break; case SC_STYLE_CHANGE: //[Lighta] need real info tick = -1; - if(val2 == MH_MD_FIGHTING) val2 = MH_MD_GRAPPLING; - else val2 = MH_MD_FIGHTING; + if(val1 == MH_MD_FIGHTING) val1 = MH_MD_GRAPPLING; + else val1 = MH_MD_FIGHTING; break; + case SC_TINDER_BREAKER: + case SC_CBC: + case SC_EQC: + //val1 = sklvl + tick = val2 - val3; //val2 = ele str, val3 = target str + tick = max(tick,2000); //min 2s (test) + break; default: if( calc_flag == SCB_NONE && StatusSkillChangeTable[type] == 0 && StatusIconChangeTable[type] == 0 ) { //Status change with no calc, no icon, and no skill associated...? Index: src/map/status.h --- src/map/status.h Base (BASE) +++ src/map/status.h Locally Modified (Based On LOCAL) @@ -634,6 +634,9 @@ //homon S SC_STYLE_CHANGE, + SC_TINDER_BREAKER, + SC_CBC, + SC_EQC, SC_GOLDENE_FERSE, SC_ANGRIFFS_MODUS, SC_ERASER_CUTTER,