|
@@ -105,6 +105,11 @@ int firewall_unit_pos;
|
|
int icewall_unit_pos;
|
|
int icewall_unit_pos;
|
|
int earthstrain_unit_pos;
|
|
int earthstrain_unit_pos;
|
|
int firerain_unit_pos;
|
|
int firerain_unit_pos;
|
|
|
|
+
|
|
|
|
+struct s_skill_nounit_layout skill_nounit_layout[MAX_SKILL_UNIT_LAYOUT];
|
|
|
|
+int overbrand_nounit_pos;
|
|
|
|
+int overbrand_brandish_nounit_pos;
|
|
|
|
+
|
|
//early declaration
|
|
//early declaration
|
|
int skill_block_check(struct block_list *bl, enum sc_type type, uint16 skill_id);
|
|
int skill_block_check(struct block_list *bl, enum sc_type type, uint16 skill_id);
|
|
static int skill_check_unit_range (struct block_list *bl, int x, int y, uint16 skill_id, uint16 skill_lv);
|
|
static int skill_check_unit_range (struct block_list *bl, int x, int y, uint16 skill_id, uint16 skill_lv);
|
|
@@ -801,6 +806,17 @@ struct s_skill_unit_layout* skill_get_unit_layout (uint16 skill_id, uint16 skill
|
|
return &skill_unit_layout[0]; // default 1x1 layout
|
|
return &skill_unit_layout[0]; // default 1x1 layout
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+struct s_skill_nounit_layout* skill_get_nounit_layout(uint16 skill_id, uint16 skill_lv, struct block_list* src, int x, int y, int dir)
|
|
|
|
+{
|
|
|
|
+ if( skill_id == LG_OVERBRAND )
|
|
|
|
+ return &skill_nounit_layout[overbrand_nounit_pos + dir];
|
|
|
|
+ else if( skill_id == LG_OVERBRAND_BRANDISH )
|
|
|
|
+ return &skill_nounit_layout[overbrand_brandish_nounit_pos + dir];
|
|
|
|
+
|
|
|
|
+ ShowError("skill_get_nounit_layout: unknown no-unit layout for skill %d (level %d)\n", skill_id, skill_lv);
|
|
|
|
+ return &skill_nounit_layout[0];
|
|
|
|
+}
|
|
|
|
+
|
|
/*==========================================
|
|
/*==========================================
|
|
* Add effect to skill when hit succesfully target
|
|
* Add effect to skill when hit succesfully target
|
|
*------------------------------------------*/
|
|
*------------------------------------------*/
|
|
@@ -1373,17 +1389,22 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
|
|
sc_start(src,bl, SC_STUN, 30 + 8 * skill_lv + (status_get_dex(src) / 10) + (status_get_lv(src) / 4), skill_lv, skill_get_time(skill_id,skill_lv));
|
|
sc_start(src,bl, SC_STUN, 30 + 8 * skill_lv + (status_get_dex(src) / 10) + (status_get_lv(src) / 4), skill_lv, skill_get_time(skill_id,skill_lv));
|
|
break;
|
|
break;
|
|
case LG_PINPOINTATTACK:
|
|
case LG_PINPOINTATTACK:
|
|
- rate = 30 + (((5 * ((sd) ? pc_checkskill(sd,LG_PINPOINTATTACK) : skill_lv)) + (status_get_agi(src) + status_get_lv(src))) / 10);
|
|
|
|
|
|
+ rate = 30 + 5 * ((sd) ? pc_checkskill(sd,LG_PINPOINTATTACK) : skill_lv) + (status_get_agi(src) + status_get_lv(src)) / 10;
|
|
switch( skill_lv ) {
|
|
switch( skill_lv ) {
|
|
case 1:
|
|
case 1:
|
|
sc_start2(src,bl,SC_BLEEDING,rate,skill_lv,src->id,skill_get_time(skill_id,skill_lv));
|
|
sc_start2(src,bl,SC_BLEEDING,rate,skill_lv,src->id,skill_get_time(skill_id,skill_lv));
|
|
break;
|
|
break;
|
|
case 2:
|
|
case 2:
|
|
- if( dstsd && dstsd->spiritball && rnd()%100 < rate )
|
|
|
|
- pc_delspiritball(dstsd, dstsd->spiritball, 0);
|
|
|
|
|
|
+ skill_break_equip(src, bl, EQP_HELM, rate * 100, BCT_ENEMY);
|
|
break;
|
|
break;
|
|
- default:
|
|
|
|
- skill_break_equip(src,bl,(skill_lv == 3) ? EQP_SHIELD : (skill_lv == 4) ? EQP_ARMOR : EQP_WEAPON,rate * 100,BCT_ENEMY);
|
|
|
|
|
|
+ case 3:
|
|
|
|
+ skill_break_equip(src, bl, EQP_SHIELD, rate * 100, BCT_ENEMY);
|
|
|
|
+ break;
|
|
|
|
+ case 4:
|
|
|
|
+ skill_break_equip(src, bl, EQP_ARMOR, rate * 100, BCT_ENEMY);
|
|
|
|
+ break;
|
|
|
|
+ case 5:
|
|
|
|
+ skill_break_equip(src, bl, EQP_WEAPON, rate * 100, BCT_ENEMY);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
@@ -3042,7 +3063,10 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
case WL_CRIMSONROCK:
|
|
case WL_CRIMSONROCK:
|
|
dir = map_calc_dir(bl,skill_area_temp[4],skill_area_temp[5]);
|
|
dir = map_calc_dir(bl,skill_area_temp[4],skill_area_temp[5]);
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+ case MC_CARTREVOLUTION:
|
|
|
|
+ if (battle_config.cart_revo_knockback)
|
|
|
|
+ dir = 2; // Official servers push target to the West
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
//blown-specific handling
|
|
//blown-specific handling
|
|
switch( skill_id ) {
|
|
switch( skill_id ) {
|
|
@@ -3753,14 +3777,12 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
|
|
skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,(skl->type<<16)|skl->flag);
|
|
skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,(skl->type<<16)|skl->flag);
|
|
break;
|
|
break;
|
|
case LG_OVERBRAND_BRANDISH: {
|
|
case LG_OVERBRAND_BRANDISH: {
|
|
- short x2 = src->x, y2 = src->y, x = x2, y = y2;
|
|
|
|
- switch(skl->type) {
|
|
|
|
- case 0: case 1: case 7: x2 += 4; x -= 4; y2 += 4; break;
|
|
|
|
- case 3: case 4: case 5: x2 += 4; x -= 4; y -= 4; break;
|
|
|
|
- case 2: y2 += 4; y -= 4; x -= 4; break;
|
|
|
|
- case 6: y2 += 4; y -= 4; x2 += 4; break;
|
|
|
|
- }
|
|
|
|
- map_foreachinarea(skill_area_sub, src->m, x, y, x2, y2, BL_CHAR, src, skl->skill_id, skl->skill_lv, tick, skl->flag|BCT_ENEMY|SD_ANIMATION|1, skill_castend_damage_id);
|
|
|
|
|
|
+ int x = src->x, y = src->y;
|
|
|
|
+ int i, dir = map_calc_dir(src,x,y);
|
|
|
|
+ struct s_skill_nounit_layout *layout = skill_get_nounit_layout(skl->skill_id,skl->skill_lv,src,x,y,dir);
|
|
|
|
+
|
|
|
|
+ for( i = 0; i < layout->count; i++ )
|
|
|
|
+ map_foreachincell(skill_area_sub,src->m,x+layout->dx[i],y+layout->dy[i],BL_CHAR,src,skl->skill_id,skl->skill_lv,tick,skl->flag|BCT_ENEMY|SD_ANIMATION|1,skill_castend_damage_id);
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
case RL_FIRE_RAIN: {
|
|
case RL_FIRE_RAIN: {
|
|
@@ -5090,6 +5112,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
status_change_end(bl, SC_RUSHWINDMILL, INVALID_TIMER);
|
|
status_change_end(bl, SC_RUSHWINDMILL, INVALID_TIMER);
|
|
status_change_end(bl, SC_ECHOSONG, INVALID_TIMER);
|
|
status_change_end(bl, SC_ECHOSONG, INVALID_TIMER);
|
|
status_change_end(bl, SC_HARMONIZE, INVALID_TIMER);
|
|
status_change_end(bl, SC_HARMONIZE, INVALID_TIMER);
|
|
|
|
+ status_change_end(bl, SC_NETHERWORLD, INVALID_TIMER);
|
|
status_change_end(bl, SC_VOICEOFSIREN, INVALID_TIMER);
|
|
status_change_end(bl, SC_VOICEOFSIREN, INVALID_TIMER);
|
|
status_change_end(bl, SC_DEEPSLEEP, INVALID_TIMER);
|
|
status_change_end(bl, SC_DEEPSLEEP, INVALID_TIMER);
|
|
status_change_end(bl, SC_SIRCLEOFNATURE, INVALID_TIMER);
|
|
status_change_end(bl, SC_SIRCLEOFNATURE, INVALID_TIMER);
|
|
@@ -6460,12 +6483,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,i);
|
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,i);
|
|
break;
|
|
break;
|
|
case TF_HIDING:
|
|
case TF_HIDING:
|
|
- case ST_CHASEWALK: {
|
|
|
|
- struct status_change* sc = status_get_sc(src);
|
|
|
|
-
|
|
|
|
- if( sc && sc->data[SC__FEINTBOMB] )
|
|
|
|
- status_change_end(bl, SC__FEINTBOMB, INVALID_TIMER);
|
|
|
|
- }
|
|
|
|
|
|
+ case ST_CHASEWALK:
|
|
case KO_YAMIKUMO:
|
|
case KO_YAMIKUMO:
|
|
if (tsce)
|
|
if (tsce)
|
|
{
|
|
{
|
|
@@ -6646,6 +6664,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
status_change_end(bl, SC_SLEEP, INVALID_TIMER);
|
|
status_change_end(bl, SC_SLEEP, INVALID_TIMER);
|
|
status_change_end(bl, SC_STUN, INVALID_TIMER);
|
|
status_change_end(bl, SC_STUN, INVALID_TIMER);
|
|
status_change_end(bl, SC_WHITEIMPRISON, INVALID_TIMER);
|
|
status_change_end(bl, SC_WHITEIMPRISON, INVALID_TIMER);
|
|
|
|
+ status_change_end(bl, SC_NETHERWORLD, INVALID_TIMER);
|
|
}
|
|
}
|
|
//Is this equation really right? It looks so... special.
|
|
//Is this equation really right? It looks so... special.
|
|
if(battle_check_undead(tstatus->race,tstatus->def_ele))
|
|
if(battle_check_undead(tstatus->race,tstatus->def_ele))
|
|
@@ -7016,6 +7035,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
case AM_CP_HELM:
|
|
case AM_CP_HELM:
|
|
{
|
|
{
|
|
unsigned int equip[] = {EQP_WEAPON, EQP_SHIELD, EQP_ARMOR, EQP_HEAD_TOP};
|
|
unsigned int equip[] = {EQP_WEAPON, EQP_SHIELD, EQP_ARMOR, EQP_HEAD_TOP};
|
|
|
|
+ enum sc_type scid = (sc_type)(SC_STRIPWEAPON + (skill_id - AM_CP_WEAPON));
|
|
|
|
|
|
if( sd && ( bl->type != BL_PC || ( dstsd && pc_checkequip(dstsd,equip[skill_id - AM_CP_WEAPON]) < 0 ) ) ){
|
|
if( sd && ( bl->type != BL_PC || ( dstsd && pc_checkequip(dstsd,equip[skill_id - AM_CP_WEAPON]) < 0 ) ) ){
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
@@ -7023,6 +7043,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ status_change_end(bl, scid, INVALID_TIMER);
|
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
|
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
|
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
|
}
|
|
}
|
|
@@ -7767,9 +7788,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
unsigned int equip[] = {EQP_WEAPON, EQP_SHIELD, EQP_ARMOR, EQP_HEAD_TOP};
|
|
unsigned int equip[] = {EQP_WEAPON, EQP_SHIELD, EQP_ARMOR, EQP_HEAD_TOP};
|
|
int i, s = 0, skilltime = skill_get_time(skill_id,skill_lv);
|
|
int i, s = 0, skilltime = skill_get_time(skill_id,skill_lv);
|
|
|
|
|
|
- for (i=0 ; i<4; i++) {
|
|
|
|
|
|
+ for (i = 0; i < 4; i++) {
|
|
if( bl->type != BL_PC || ( dstsd && pc_checkequip(dstsd,equip[i]) < 0 ) )
|
|
if( bl->type != BL_PC || ( dstsd && pc_checkequip(dstsd,equip[i]) < 0 ) )
|
|
continue;
|
|
continue;
|
|
|
|
+ status_change_end(bl, (sc_type)(SC_STRIPWEAPON + i), INVALID_TIMER);
|
|
sc_start(src,bl,(sc_type)(SC_CP_WEAPON + i),100,skill_lv,skilltime);
|
|
sc_start(src,bl,(sc_type)(SC_CP_WEAPON + i),100,skill_lv,skilltime);
|
|
s++;
|
|
s++;
|
|
}
|
|
}
|
|
@@ -8524,7 +8546,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
break;
|
|
break;
|
|
|
|
|
|
case AB_LAUDAAGNUS:
|
|
case AB_LAUDAAGNUS:
|
|
- if( flag&1 || sd == NULL ) {
|
|
|
|
|
|
+ if( flag&1 || sd == NULL || !sd->status.party_id ) {
|
|
if( tsc && (tsc->data[SC_FREEZE] || tsc->data[SC_STONE] || tsc->data[SC_BLIND] ||
|
|
if( tsc && (tsc->data[SC_FREEZE] || tsc->data[SC_STONE] || tsc->data[SC_BLIND] ||
|
|
tsc->data[SC_BURNING] || tsc->data[SC_FREEZING] || tsc->data[SC_CRYSTALIZE])) {
|
|
tsc->data[SC_BURNING] || tsc->data[SC_FREEZING] || tsc->data[SC_CRYSTALIZE])) {
|
|
// Success Chance: (40 + 10 * Skill Level) %
|
|
// Success Chance: (40 + 10 * Skill Level) %
|
|
@@ -8544,7 +8566,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
break;
|
|
break;
|
|
|
|
|
|
case AB_LAUDARAMUS:
|
|
case AB_LAUDARAMUS:
|
|
- if( flag&1 || sd == NULL ) {
|
|
|
|
|
|
+ if( flag&1 || sd == NULL || !sd->status.party_id ) {
|
|
if( tsc && (tsc->data[SC_SLEEP] || tsc->data[SC_STUN] || tsc->data[SC_MANDRAGORA] || tsc->data[SC_SILENCE] || tsc->data[SC_DEEPSLEEP]) ){
|
|
if( tsc && (tsc->data[SC_SLEEP] || tsc->data[SC_STUN] || tsc->data[SC_MANDRAGORA] || tsc->data[SC_SILENCE] || tsc->data[SC_DEEPSLEEP]) ){
|
|
// Success Chance: (40 + 10 * Skill Level) %
|
|
// Success Chance: (40 + 10 * Skill Level) %
|
|
if( rnd()%100 > 40+10*skill_lv ) break;
|
|
if( rnd()%100 > 40+10*skill_lv ) break;
|
|
@@ -11182,16 +11204,12 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|
break;
|
|
break;
|
|
|
|
|
|
case LG_OVERBRAND: {
|
|
case LG_OVERBRAND: {
|
|
- uint8 dir = map_calc_dir(src, x, y);
|
|
|
|
- uint8 x2 = x = src->x, y2 = y = src->y;
|
|
|
|
- switch(dir) {
|
|
|
|
- case 0: case 1: case 7: x2++; x--; y2 += 7; break;
|
|
|
|
- case 3: case 4: case 5: x2++; x--; y -= 7; break;
|
|
|
|
- case 2: y2++; y--; x -= 7; break;
|
|
|
|
- case 6: y2++; y--; x2 += 7; break;
|
|
|
|
- }
|
|
|
|
- map_foreachinarea(skill_area_sub, src->m, x, y, x2, y2, BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_ANIMATION|1, skill_castend_damage_id);
|
|
|
|
- skill_addtimerskill(src, gettick() + status_get_amotion(src), 0, 0, 0, LG_OVERBRAND_BRANDISH, skill_lv, dir, flag);
|
|
|
|
|
|
+ int dir = map_calc_dir(src,x,y);
|
|
|
|
+ struct s_skill_nounit_layout *layout = skill_get_nounit_layout(skill_id,skill_lv,src,x,y,dir);
|
|
|
|
+
|
|
|
|
+ for( i = 0; i < layout->count; i++ )
|
|
|
|
+ map_foreachincell(skill_area_sub,src->m,x+layout->dx[i],y+layout->dy[i],BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|SD_ANIMATION|1,skill_castend_damage_id);
|
|
|
|
+ skill_addtimerskill(src,gettick() + status_get_amotion(src),0,0,0,LG_OVERBRAND_BRANDISH,skill_lv,dir,flag);
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -11919,6 +11937,8 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill
|
|
interval = limit;
|
|
interval = limit;
|
|
val2 = 1;
|
|
val2 = 1;
|
|
case WM_POEMOFNETHERWORLD: // Can't be placed on top of Land Protector.
|
|
case WM_POEMOFNETHERWORLD: // Can't be placed on top of Land Protector.
|
|
|
|
+ if( skill_id == WM_POEMOFNETHERWORLD && map_flag_gvg2(src->m) )
|
|
|
|
+ target = BCT_ALL;
|
|
case WM_SEVERE_RAINSTORM:
|
|
case WM_SEVERE_RAINSTORM:
|
|
case SO_WATER_INSIGNIA:
|
|
case SO_WATER_INSIGNIA:
|
|
case SO_FIRE_INSIGNIA:
|
|
case SO_FIRE_INSIGNIA:
|
|
@@ -12804,22 +12824,23 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
|
|
break;
|
|
break;
|
|
|
|
|
|
case UNT_EPICLESIS:
|
|
case UNT_EPICLESIS:
|
|
- if( bl->type == BL_PC && !battle_check_undead(tstatus->race, tstatus->def_ele) && tstatus->race != RC_DEMON )
|
|
|
|
- {
|
|
|
|
- if( ++sg->val2 % 3 == 0 ) {
|
|
|
|
- int hp, sp;
|
|
|
|
- switch( sg->skill_lv ) {
|
|
|
|
- case 1: case 2: hp = 3; sp = 2; break;
|
|
|
|
- case 3: case 4: hp = 4; sp = 3; break;
|
|
|
|
- case 5: default: hp = 5; sp = 4; break;
|
|
|
|
- }
|
|
|
|
- hp = tstatus->max_hp * hp / 100;
|
|
|
|
- sp = tstatus->max_sp * sp / 100;
|
|
|
|
- status_heal(bl, hp, sp, 3);
|
|
|
|
- sc_start(ss, bl, type, 100, sg->skill_lv, (sg->interval * 3) + 100);
|
|
|
|
|
|
+ if( bl->type == BL_PC && !battle_check_undead(tstatus->race, tstatus->def_ele) && tstatus->race != RC_DEMON ) {
|
|
|
|
+ int hp, sp;
|
|
|
|
+ switch( sg->skill_lv ) {
|
|
|
|
+ case 1: case 2: hp = 3; sp = 2; break;
|
|
|
|
+ case 3: case 4: hp = 4; sp = 3; break;
|
|
|
|
+ case 5: default: hp = 5; sp = 4; break;
|
|
}
|
|
}
|
|
|
|
+ hp = tstatus->max_hp * hp / 100;
|
|
|
|
+ sp = tstatus->max_sp * sp / 100;
|
|
|
|
+ if (tsc && tsc->data[SC_AKAITSUKI] && hp)
|
|
|
|
+ hp = ~hp + 1;
|
|
|
|
+ status_heal(bl, hp, sp, 3);
|
|
|
|
+ sc_start(ss, bl, type, 100, sg->skill_lv, sg->interval + 100);
|
|
|
|
+ sg->val2++;
|
|
// Reveal hidden players every 5 seconds.
|
|
// Reveal hidden players every 5 seconds.
|
|
- if( sg->val2 % 5 == 0 ) {
|
|
|
|
|
|
+ if( sg->val2 >= 5 ) {
|
|
|
|
+ sg->val2 = 0;
|
|
// Doesn't remove Invisibility or Chase Walk.
|
|
// Doesn't remove Invisibility or Chase Walk.
|
|
status_change_end(bl,SC_HIDING,INVALID_TIMER);
|
|
status_change_end(bl,SC_HIDING,INVALID_TIMER);
|
|
status_change_end(bl,SC_CLOAKING,INVALID_TIMER);
|
|
status_change_end(bl,SC_CLOAKING,INVALID_TIMER);
|
|
@@ -12857,7 +12878,7 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
|
|
skill_attack(BF_WEAPON,ss,&src->bl,bl,WM_SEVERE_RAINSTORM_MELEE,sg->skill_lv,tick,0);
|
|
skill_attack(BF_WEAPON,ss,&src->bl,bl,WM_SEVERE_RAINSTORM_MELEE,sg->skill_lv,tick,0);
|
|
break;
|
|
break;
|
|
case UNT_NETHERWORLD:
|
|
case UNT_NETHERWORLD:
|
|
- if( !(status_get_mode(bl)&MD_BOSS) ) {
|
|
|
|
|
|
+ if( !(status_get_mode(bl)&MD_BOSS) || (!map_flag_gvg2(ss->m) && battle_check_target(&src->bl,bl,BCT_PARTY) < 0) ) {
|
|
if( !(tsc && tsc->data[type]) )
|
|
if( !(tsc && tsc->data[type]) )
|
|
sc_start(ss, bl, type, 100, sg->skill_lv, skill_get_time2(sg->skill_id,sg->skill_lv));
|
|
sc_start(ss, bl, type, 100, sg->skill_lv, skill_get_time2(sg->skill_id,sg->skill_lv));
|
|
}
|
|
}
|
|
@@ -12980,27 +13001,46 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
|
|
case UNT_ZENKAI_LAND:
|
|
case UNT_ZENKAI_LAND:
|
|
case UNT_ZENKAI_FIRE:
|
|
case UNT_ZENKAI_FIRE:
|
|
case UNT_ZENKAI_WIND:
|
|
case UNT_ZENKAI_WIND:
|
|
- if( battle_check_target(&src->bl,bl,BCT_ENEMY) > 0 ){
|
|
|
|
- switch( sg->unit_id ){
|
|
|
|
|
|
+ if( battle_check_target(&src->bl,bl,BCT_ENEMY) > 0 ) {
|
|
|
|
+ switch( sg->unit_id ) {
|
|
case UNT_ZENKAI_WATER:
|
|
case UNT_ZENKAI_WATER:
|
|
- sc_start(ss, bl, SC_CRYSTALIZE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
- sc_start(ss, bl, SC_FREEZE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
- sc_start(ss, bl, SC_FREEZING, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
|
|
+ switch (rnd()%2 + 1) {
|
|
|
|
+ case 1:
|
|
|
|
+ sc_start(ss, bl, SC_FREEZE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
+ break;
|
|
|
|
+ case 2:
|
|
|
|
+ sc_start(ss, bl, SC_FREEZING, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
case UNT_ZENKAI_LAND:
|
|
case UNT_ZENKAI_LAND:
|
|
- sc_start(ss, bl, SC_STONE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
- sc_start(ss, bl, SC_POISON, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
|
|
+ switch (rnd()%2 + 1) {
|
|
|
|
+ case 1:
|
|
|
|
+ sc_start(ss, bl, SC_STONE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
+ break;
|
|
|
|
+ case 2:
|
|
|
|
+ sc_start(ss, bl, SC_POISON, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
case UNT_ZENKAI_FIRE:
|
|
case UNT_ZENKAI_FIRE:
|
|
sc_start(ss, bl, SC_BURNING, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
sc_start(ss, bl, SC_BURNING, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
break;
|
|
break;
|
|
case UNT_ZENKAI_WIND:
|
|
case UNT_ZENKAI_WIND:
|
|
- sc_start(ss, bl, SC_SILENCE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
- sc_start(ss,bl, SC_SLEEP, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
- sc_start(ss, bl, SC_DEEPSLEEP, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
|
|
+ switch (rnd()%3 + 1) {
|
|
|
|
+ case 1:
|
|
|
|
+ sc_start(ss, bl, SC_SLEEP, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
+ break;
|
|
|
|
+ case 2:
|
|
|
|
+ sc_start(ss, bl, SC_SILENCE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
+ break;
|
|
|
|
+ case 3:
|
|
|
|
+ sc_start(ss, bl, SC_DEEPSLEEP, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- }else
|
|
|
|
|
|
+ } else
|
|
sc_start2(ss, bl,type,100,sg->val1,sg->val2,skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
sc_start2(ss, bl,type,100,sg->val1,sg->val2,skill_get_time2(sg->skill_id, sg->skill_lv));
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -16927,7 +16967,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
struct status_change *sc;
|
|
struct status_change *sc;
|
|
if (src && (sc = status_get_sc(src)) != NULL && sc->data[SC__FEINTBOMB]) { // Copycat explodes if caster is still hidden.
|
|
if (src && (sc = status_get_sc(src)) != NULL && sc->data[SC__FEINTBOMB]) { // Copycat explodes if caster is still hidden.
|
|
map_foreachinrange(skill_area_sub, &group->unit->bl, unit->range, splash_target(src), src, SC_FEINTBOMB, group->skill_lv, tick, BCT_ENEMY|SD_ANIMATION|1, skill_castend_damage_id);
|
|
map_foreachinrange(skill_area_sub, &group->unit->bl, unit->range, splash_target(src), src, SC_FEINTBOMB, group->skill_lv, tick, BCT_ENEMY|SD_ANIMATION|1, skill_castend_damage_id);
|
|
- status_change_end(src, SC__FEINTBOMB, INVALID_TIMER);
|
|
|
|
|
|
+ status_change_end(bl, SC__FEINTBOMB, INVALID_TIMER);
|
|
}
|
|
}
|
|
skill_delunit(unit);
|
|
skill_delunit(unit);
|
|
}
|
|
}
|
|
@@ -18808,6 +18848,172 @@ void skill_init_unit_layout (void) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void skill_init_nounit_layout (void) {
|
|
|
|
+ int i, pos = 0;
|
|
|
|
+
|
|
|
|
+ memset(skill_nounit_layout,0,sizeof(skill_nounit_layout));
|
|
|
|
+
|
|
|
|
+ overbrand_nounit_pos = pos;
|
|
|
|
+ for( i = 0; i < 8; i++ ) {
|
|
|
|
+ if( i&1 ) {
|
|
|
|
+ skill_nounit_layout[pos].count = 33;
|
|
|
|
+ if( i&2 ) {
|
|
|
|
+ if( i&4 ) { // 7
|
|
|
|
+ int dx[] = { 5, 6, 7, 5, 6, 4, 5, 6, 4, 5, 3, 4, 5, 3, 4, 2, 3, 4, 2, 3, 1, 2, 3, 1, 2, 0, 1, 2, 0, 1,-1, 0, 1};
|
|
|
|
+ int dy[] = { 7, 6, 5, 6, 5, 6, 5, 4, 5, 4, 5, 4, 3, 4, 3, 4, 3, 2, 3, 2, 3, 2, 1, 2, 1, 2, 1, 0, 1, 0, 1, 0,-1};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ } else { // 3
|
|
|
|
+ int dx[] = {-5,-6,-7,-5,-6,-4,-5,-6,-4,-5,-3,-4,-5,-3,-4,-2,-3,-4,-2,-3,-1,-2,-3,-1,-2, 0,-1,-2, 0,-1, 1, 0,-1};
|
|
|
|
+ int dy[] = {-7,-6,-5,-6,-5,-6,-5,-4,-5,-4,-5,-4,-3,-4,-3,-4,-3,-2,-3,-2,-3,-2,-1,-2,-1,-2,-1, 0,-1, 0,-1, 0, 1};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if( i&4 ) { // 5
|
|
|
|
+ int dx[] = { 7, 6, 5, 6, 5, 6, 5, 4, 5, 4, 5, 4, 3, 4, 3, 4, 3, 2, 3, 2, 3, 2, 1, 2, 1, 2, 1, 0, 1, 0, 1, 0,-1};
|
|
|
|
+ int dy[] = {-5,-6,-7,-5,-6,-4,-5,-6,-4,-5,-3,-4,-5,-3,-4,-2,-3,-4,-2,-3,-1,-2,-3,-1,-2, 0,-1,-2, 0,-1, 1, 0,-1};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ } else { // 1
|
|
|
|
+ int dx[] = {-7,-6,-5,-6,-5,-6,-5,-4,-5,-4,-5,-4,-3,-4,-3,-4,-3,-2,-3,-2,-3,-2,-1,-2,-1,-2,-1, 0,-1, 0,-1, 0, 1};
|
|
|
|
+ int dy[] = { 5, 6, 7, 5, 6, 4, 5, 6, 4, 5, 3, 4, 5, 3, 4, 2, 3, 4, 2, 3, 1, 2, 3, 1, 2, 0, 1, 2, 0, 1,-1, 0, 1};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ skill_nounit_layout[pos].count = 21;
|
|
|
|
+ if( i&2 ) {
|
|
|
|
+ if( i&4 ) { // 6
|
|
|
|
+ int dx[] = { 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6};
|
|
|
|
+ int dy[] = { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ } else { // 2
|
|
|
|
+ int dx[] = {-6,-5,-4,-3,-2,-1, 0,-6,-5,-4,-3,-2,-1, 0,-6,-5,-4,-3,-2,-1, 0};
|
|
|
|
+ int dy[] = { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if( i&4 ) { // 4
|
|
|
|
+ int dx[] = {-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1};
|
|
|
|
+ int dy[] = { 0, 0, 0,-1,-1,-1,-2,-2,-2,-3,-3,-3,-4,-4,-4,-5,-5,-5,-6,-6,-6};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ } else { // 0
|
|
|
|
+ int dx[] = {-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1};
|
|
|
|
+ int dy[] = { 6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ pos++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ overbrand_brandish_nounit_pos = pos;
|
|
|
|
+ for( i = 0; i < 8; i++ ) {
|
|
|
|
+ if( i&1 ) {
|
|
|
|
+ skill_nounit_layout[pos].count = 74;
|
|
|
|
+ if( i&2 ) {
|
|
|
|
+ if( i&4 ) { // 7
|
|
|
|
+ int dx[] = {-2,-1, 0, 1, 2, 3, 4, 5, 6, 7, 8,-2,-1, 0, 1, 2, 3, 4, 5, 6, 7,
|
|
|
|
+ -3,-2,-1, 0, 1, 2, 3, 4, 5, 6, 7,-3,-2,-1,-0, 1, 2, 3, 4, 5, 6,
|
|
|
|
+ -4,-3,-2,-1, 0, 1, 2, 3, 4, 5, 6,-4,-3,-2,-1,-0, 1, 2, 3, 4, 5,
|
|
|
|
+ -5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5};
|
|
|
|
+ int dy[] = { 8, 7, 6, 5, 4, 3, 2, 1, 0,-1,-2, 7, 6, 5, 4, 3, 2, 1, 0,-1,-2,
|
|
|
|
+ 7, 6, 5, 4, 3, 2, 1, 0,-1,-2,-3, 6, 5, 4, 3, 2, 1, 0,-1,-2,-3,
|
|
|
|
+ 6, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,
|
|
|
|
+ 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ } else { // 3
|
|
|
|
+ int dx[] = { 2, 1, 0,-1,-2,-3,-4,-5,-6,-7,-8, 2, 1, 0,-1,-2,-3,-4,-5,-6,-7,
|
|
|
|
+ 3, 2, 1, 0,-1,-2,-3,-4,-5,-6,-7, 3, 2, 1, 0,-1,-2,-3,-4,-5,-6,
|
|
|
|
+ 4, 3, 2, 1, 0,-1,-2,-3,-4,-5,-6, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5,
|
|
|
|
+ 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5};
|
|
|
|
+ int dy[] = {-8,-7,-6,-5,-4,-3,-2,-1, 0, 1, 2,-7,-6,-5,-4,-3,-2,-1, 0, 1, 2,
|
|
|
|
+ -7,-6,-5,-4,-3,-2,-1, 0, 1, 2, 3,-6,-5,-4,-3,-2,-1, 0, 1, 2, 3,
|
|
|
|
+ -6,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4,
|
|
|
|
+ -5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if( i&4 ) { // 5
|
|
|
|
+ int dx[] = { 8, 7, 6, 5, 4, 3, 2, 1, 0,-1,-2, 7, 6, 5, 4, 3, 2, 1, 0,-1,-2,
|
|
|
|
+ 7, 6, 5, 4, 3, 2, 1, 0,-1,-2,-3, 6, 5, 4, 3, 2, 1, 0,-1,-2,-3,
|
|
|
|
+ 6, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,
|
|
|
|
+ 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5};
|
|
|
|
+ int dy[] = { 2, 1, 0,-1,-2,-3,-4,-5,-6,-7,-8, 2, 1, 0,-1,-2,-3,-4,-5,-6,-7,
|
|
|
|
+ 3, 2, 1, 0,-1,-2,-3,-4,-5,-6,-7, 3, 2, 1, 0,-1,-2,-3,-4,-5,-6,
|
|
|
|
+ 4, 3, 2, 1, 0,-1,-2,-3,-4,-5,-6, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5,
|
|
|
|
+ 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ } else { // 1
|
|
|
|
+ int dx[] = {-8,-7,-6,-5,-4,-3,-2,-1, 0, 1, 2,-7,-6,-5,-4,-3,-2,-1, 0, 1, 2,
|
|
|
|
+ -7,-6,-5,-4,-3,-2,-1, 0, 1, 2, 3,-6,-5,-4,-3,-2,-1, 0, 1, 2, 3,
|
|
|
|
+ -6,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4,
|
|
|
|
+ -5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5};
|
|
|
|
+ int dy[] = {-2,-1, 0, 1, 2, 3, 4, 5, 6, 7, 8,-2,-1, 0, 1, 2, 3, 4, 5, 6, 7,
|
|
|
|
+ -3,-2,-1, 0, 1, 2, 3, 4, 5, 6, 7,-3,-2,-1, 0, 1, 2, 3, 4, 5, 6,
|
|
|
|
+ -4,-3,-2,-1, 0, 1, 2, 3, 4, 5, 6,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5,
|
|
|
|
+ -5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ skill_nounit_layout[pos].count = 44;
|
|
|
|
+ if( i&2 ) {
|
|
|
|
+ if( i&4 ) { // 6
|
|
|
|
+ int dx[] = { 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3};
|
|
|
|
+ int dy[] = { 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0,-1,-1,-1,-1,-2,-2,-2,-2,-3,-3,-3,-3,-4,-4,-4,-4,-5,-5,-5,-5};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ } else { // 2
|
|
|
|
+ int dx[] = {-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0};
|
|
|
|
+ int dy[] = { 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0,-1,-1,-1,-1,-2,-2,-2,-2,-3,-3,-3,-3,-4,-4,-4,-4,-5,-5,-5,-5};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if( i&4 ) { // 4
|
|
|
|
+ int dx[] = { 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5};
|
|
|
|
+ int dy[] = {-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ } else { // 0
|
|
|
|
+ int dx[] = {-5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5};
|
|
|
|
+ int dy[] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
|
|
|
+
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
|
|
|
+ memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ pos++;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
int skill_block_check(struct block_list *bl, sc_type type , uint16 skill_id) {
|
|
int skill_block_check(struct block_list *bl, sc_type type , uint16 skill_id) {
|
|
int inf = 0;
|
|
int inf = 0;
|
|
int inf3 = 0;
|
|
int inf3 = 0;
|
|
@@ -19508,6 +19714,7 @@ static void skill_readdb(void) {
|
|
}
|
|
}
|
|
|
|
|
|
skill_init_unit_layout();
|
|
skill_init_unit_layout();
|
|
|
|
+ skill_init_nounit_layout();
|
|
}
|
|
}
|
|
|
|
|
|
void skill_reload (void) {
|
|
void skill_reload (void) {
|