summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/map/mob.c6
-rw-r--r--src/map/pc.c9
-rw-r--r--src/map/skill.c86
-rw-r--r--src/map/skill.h14
4 files changed, 84 insertions, 31 deletions
diff --git a/src/map/mob.c b/src/map/mob.c
index e8cef9730..40bf4d1b0 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -500,7 +500,11 @@ static int mob_walk(struct mob_data *md,unsigned int tick,int data)
mob_walktoxy_sub(md);
return 0;
}
-
+ if (skill_check_basilica (&md->bl,x+dx,y+dy) ||
+ skill_check_moonlit (&md->bl,x+dx,y+dy)) {
+ mob_walktoxy_sub(md);
+ return 0;
+ }
moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
md->state.state=MS_WALK;
diff --git a/src/map/pc.c b/src/map/pc.c
index fda290532..376efb313 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -4175,7 +4175,10 @@ static int pc_walk(int tid,unsigned int tick,int id,int data)
pc_walktoxy_sub(sd);
return 0;
}
-
+ if (skill_check_moonlit (&sd->bl,x+dx,y+dy)) {
+ pc_stop_walking(sd,1);
+ return 0;
+ }
moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
sd->walktimer = 1;
@@ -4317,22 +4320,18 @@ int pc_walktoxy(struct map_session_data *sd,int x,int y)
if (sd->sc_data && sd->status.guild_id > 0) {
struct skill_unit *su;
struct skill_unit_group *sg;
- //if (sd->sc_data[SC_LEADERSHIP].val4 && (su=(struct skill_unit *)sd->sc_data[SC_LEADERSHIP].val4)) {
if (sd->state.leadership_flag && (su=(struct skill_unit *)sd->state.leadership_flag) &&
(sg=su->group) && sg->src_id == sd->bl.id) {
skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y));
}
- //if (sd->sc_data[SC_GLORYWOUNDS].val4 && (su=(struct skill_unit *)sd->sc_data[SC_GLORYWOUNDS].val4)) {
if (sd->state.glorywounds_flag && (su=(struct skill_unit *)sd->state.glorywounds_flag) &&
(sg=su->group) && sg->src_id == sd->bl.id) {
skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y));
}
- //if (sd->sc_data[SC_SOULCOLD].val4 && (su=(struct skill_unit *)sd->sc_data[SC_SOULCOLD].val4)) {
if (sd->state.soulcold_flag && (su=(struct skill_unit *)sd->state.soulcold_flag) &&
(sg=su->group) && sg->src_id == sd->bl.id) {
skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y));
}
- //if (sd->sc_data[SC_HAWKEYES].val4 && (su=(struct skill_unit *)sd->sc_data[SC_HAWKEYES].val4)) {
if (sd->state.hawkeyes_flag && (su=(struct skill_unit *)sd->state.hawkeyes_flag) &&
(sg=su->group) && sg->src_id == sd->bl.id) {
skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y));
diff --git a/src/map/skill.c b/src/map/skill.c
index e32561cef..3ede9313d 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -249,7 +249,8 @@ int SkillStatusChangeTable[]={ /* skill.hのenumのSC_***とあわせること */
SC_CHASEWALK,
/* 390- */
SC_REJECTSWORD,
- -1,-1,-1,-1,-1,
+ -1,-1,-1,-1,
+ SC_MOONLIT,
SC_MARIONETTE,
-1,
SC_HEADCRUSH,
@@ -964,7 +965,7 @@ int skill_get_unit_id(int id,int flag)
case WE_CALLPARTNER: return 0xb2; /* あなたに逢いたい */
case PA_GOSPEL: return 0xb3; /* ゴスペル */
case HP_BASILICA: return 0xb4; /* バジリカ */
- case CG_MOONLIT: return 0xb5;
+// case CG_MOONLIT: return 0xb5;
case PF_FOGWALL: return 0xb6; /* フォグウォ?ル */
case PF_SPIDERWEB: return 0xb7; /* スパイダ?ウェッブ */
// temporary unit ID's [Celest]
@@ -3265,6 +3266,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case PF_MEMORIZE: /* メモライズ */
case PA_SACRIFICE:
case ASC_EDP: // [Celest]
+ case CG_MOONLIT: /* 月明りの泉に落ちる花びら */
clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
break;
@@ -3670,7 +3672,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case DC_DONTFORGETME: /* 私を忘れないで… */
case DC_FORTUNEKISS: /* 幸運のキス */
case DC_SERVICEFORYOU: /* サ?ビスフォ?ユ? */
- case CG_MOONLIT: /* 月明りの泉に落ちる花びら */
+// case CG_MOONLIT: /* 月明りの泉に落ちる花びら */
clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
break;
@@ -5553,11 +5555,11 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,
limit=skill_get_time(skillid,skilllv);
break;
- case CG_MOONLIT:
+/* case CG_MOONLIT:
range=1;
target=BCT_ALL;
limit=skill_get_time(skillid,skilllv);
- break;
+ break;*/
case PF_FOGWALL: /* フォグウォ?ル */
count=15;
@@ -5782,7 +5784,7 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,
case DC_DONTFORGETME: /* 私を忘れないで… */
case DC_FORTUNEKISS: /* 幸運のキス */
case DC_SERVICEFORYOU: /* サ?ビスフォ?ユ? */
- case CG_MOONLIT:
+// case CG_MOONLIT:
ux+=(i%7-3);
uy+=(i/7-3);
if(i==40)
@@ -6359,7 +6361,7 @@ int skill_unit_onout(struct skill_unit *src,struct block_list *bl,unsigned int t
}
}
break;
- case 0xb5:
+// case 0xb5:
case 0xb8:
{
struct block_list *target=map_id2bl(sg->val2);
@@ -8363,6 +8365,64 @@ int skill_frostjoke_scream(struct block_list *bl,va_list ap)
return 0;
}
+/*==========================================
+ * Basilica creates a 'safe zone' [celest]
+ *------------------------------------------
+ */
+static int skill_basilica_count(struct block_list *bl,va_list ap)
+{
+ int *c;
+ struct skill_unit *unit;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, (unit=(struct skill_unit *)bl));
+ nullpo_retr(0, unit->group);
+
+ c=va_arg(ap,int *);
+
+ if(unit && unit->group->unit_id == 0xb4 && c)
+ (*c)++;
+ return 0;
+}
+
+int skill_check_basilica (struct block_list *bl, int dx, int dy)
+{
+ int c=0;
+ nullpo_retr(0, bl);
+ map_foreachinarea(skill_basilica_count,bl->m,
+ dx-1,dy-1,dx+1,dy+1,BL_SKILL,&c);
+ return (c>0);
+}
+/*==========================================
+ * Moonlit creates a 'safe zone' [celest]
+ *------------------------------------------
+ */
+static int skill_moonlit_count(struct block_list *bl,va_list ap)
+{
+ int *c, id;
+ struct map_session_data *sd;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, (sd=(struct map_session_data *)bl));
+
+ id=va_arg(ap,int);
+ c=va_arg(ap,int *);
+
+ if (sd->bl.id != id && sd->sc_count && sd->sc_data[SC_MOONLIT].timer != -1 && c)
+ (*c)++;
+ return 0;
+}
+
+int skill_check_moonlit (struct block_list *bl, int dx, int dy)
+{
+ int c=0;
+ nullpo_retr(0, bl);
+ map_foreachinarea(skill_moonlit_count,bl->m,
+ dx-1,dy-1,dx+1,dy+1,BL_PC,bl->id,&c);
+ return (c>0);
+}
/*==========================================
*アブラカダブラの使用スキル決定(決定スキルがダメなら0を返す)
@@ -9827,6 +9887,9 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
case SC_SERVICE4U: /* サ?ビスフォ?ユ? */
calc_flag = 1;
break;
+ case SC_MOONLIT:
+ val2 = bl->id;
+ break;
case SC_DANCING: /* ダンス/演奏中 */
calc_flag = 1;
val3= tick / 1000;
@@ -10190,15 +10253,6 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
calc_flag = 1;
break;
-/* case SC_LEADERSHIP:
- case SC_GLORYWOUNDS:
- case SC_SOULCOLD:
- case SC_HAWKEYES:
- tick = 1000;
- calc_flag = 1;
- //val4 = 1;
- break;*/
-
case SC_REGENERATION:
val1 = 2;
case SC_BATTLEORDERS:
diff --git a/src/map/skill.h b/src/map/skill.h
index f98893120..87a56345c 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -134,6 +134,8 @@ void skill_stop_dancing(struct block_list *src, int flag);
int skill_castcancel(struct block_list *bl,int type);
int skill_gangsterparadise(struct map_session_data *sd ,int type);
+int skill_check_basilica (struct block_list *bl, int dx, int dy);
+int skill_check_moonlit (struct block_list *bl, int dx, int dy);
void skill_brandishspear_first(struct square *tc,int dir,int x,int y);
void skill_brandishspear_dir(struct square *tc,int dir,int are);
int skill_autospell(struct map_session_data *md,int skillid);
@@ -323,7 +325,7 @@ enum { // struct map_session_data の status_changeの番?テ?ブル
SC_SPIDERWEB =180, /* スパイダ?ウェッブ */
SC_MEMORIZE =181, /* メモライズ */
SC_DPOISON =182, /* 猛毒 */
-// SC_EDP =183, // moved
+// SC_EDP // moved
SC_SACRIFICE =184, /* サクリファイス */
SC_WEDDING =187, //結婚用(結婚衣裳になって?くのが?いとか)
SC_NOCHAT =188, //赤エモ?態
@@ -339,33 +341,27 @@ enum { // struct map_session_data の status_changeの番?テ?ブル
SC_SLOWDOWN =45, // for skill slowdown
SC_AUTOBERSERK =46,
SC_SIGHTTRASHER =73,
-// SC_BASILICA =125, // 125 is the same id as joint break
SC_BASILICA =102, // temporarily use this before an actual id is found [celest]
SC_EDP =114, /* エフェクトが判明したら移動 */
SC_MARIONETTE2 =122, // Marionette target
SC_ENSEMBLE =159,
SC_FOGWALL =178,
SC_GOSPEL =179,
+ SC_MOONLIT =183,
SC_ATKPOT =185, // [Valaris]
SC_MATKPOT =186, // [Valaris]
SC_MINDBREAKER =191,
SC_SPELLBREAKER =192,
SC_LANDPROTECTOR =193,
-// SC_DPOISON =193, /* 猛毒 */
SC_BLOCKSKILL =194, // for disallowing the use of a skill for a time period
SC_ADAPTATION =195,
SC_CHASEWALK =196,
-/* SC_LEADERSHIP =196, // temporarily disabled - they're too buggy =/
- SC_GLORYWOUNDS =197,
- SC_SOULCOLD =198,
- SC_HAWKEYES =199,*/
SC_BATTLEORDERS =200,
SC_REGENERATION =201,
SC_PRESERVE =202,
// [Celest]
- SC_BLEEDING = 124, // Temporarily same id as headcrush
- SC_MOONLIT =195,
+ SC_BLEEDING = 124, // Temporarily same id as headcrush
// -- testing various SC effects
// SC_AURABLADE =81,