# 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,