Browse Source

- Restructured CG_MOONLIT so that it is a ground effect like the other Encores.
- Modified SC_DANCING so that val1 can contain both skill id and skill lv, removed SC_MOONLIT


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@8526 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex 18 years ago
parent
commit
7107181297
11 changed files with 42 additions and 106 deletions
  1. 3 0
      Changelog-Trunk.txt
  2. 1 1
      db/skill_db.txt
  3. 1 0
      db/skill_unit_db.txt
  4. 4 17
      src/map/map.c
  5. 0 4
      src/map/map.h
  6. 1 2
      src/map/pc.c
  7. 14 61
      src/map/skill.c
  8. 1 1
      src/map/skill.h
  9. 12 15
      src/map/status.c
  10. 1 1
      src/map/status.h
  11. 4 4
      src/map/unit.c

+ 3 - 0
Changelog-Trunk.txt

@@ -4,6 +4,9 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 
 2006/08/28
 2006/08/28
+	* Modified the dancing code and Moonlit Petals in particular, so that it is
+	  treated as an ensemble like any other, it will just knockback people when
+	  they step into it. [Skotlex]
 	* The memory leak reports will now print out in the logs also the revision
 	* The memory leak reports will now print out in the logs also the revision
 	  they belong to. [Skotlex]
 	  they belong to. [Skotlex]
 	* Cleaned up the scriptable npc-shop code, it should be crash-proof now.
 	* Cleaned up the scriptable npc-shop code, it should be crash-proof now.

+ 1 - 1
db/skill_db.txt

@@ -418,7 +418,7 @@
 392,0,0,4,0,1,0,1,1,yes,0,0,0,none,0	//CR_ALCHEMY#Alchemy#
 392,0,0,4,0,1,0,1,1,yes,0,0,0,none,0	//CR_ALCHEMY#Alchemy#
 393,0,0,4,0,1,0,1,1,yes,0,0,0,none,0	//CR_SYNTHESISPOTION#Potion Synthesis#
 393,0,0,4,0,1,0,1,1,yes,0,0,0,none,0	//CR_SYNTHESISPOTION#Potion Synthesis#
 394,9,8,1,-1,0,0,10,-9,yes,0,0,0,weapon,0	//CG_ARROWVULCAN#Vulcan Arrow#
 394,9,8,1,-1,0,0,10,-9,yes,0,0,0,weapon,0	//CG_ARROWVULCAN#Vulcan Arrow#
-395,0,0,4,0,1,3,1,1,yes,0,64,0,misc,0	//CG_MOONLIT#Sheltering Bliss#
+395,0,0,4,0,1,3,1,1,yes,0,64,0,misc,2	//CG_MOONLIT#Sheltering Bliss#
 396,-1,6,16,0,1,0,1,1,yes,0,1536,0,none,0	//CG_MARIONETTE#Marionette Control#
 396,-1,6,16,0,1,0,1,1,yes,0,1536,0,none,0	//CG_MARIONETTE#Marionette Control#
 397,5,8,1,-1,0,0,5,5,no,0,0,0,weapon,0	//LK_SPIRALPIERCE#Spiral Pierce#
 397,5,8,1,-1,0,0,5,5,no,0,0,0,weapon,0	//LK_SPIRALPIERCE#Spiral Pierce#
 398,4,6,1,-1,0,0,5,1,no,0,0,0,weapon,0	//LK_HEADCRUSH#Traumatic Blow#
 398,4,6,1,-1,0,0,5,1,no,0,0,0,weapon,0	//LK_HEADCRUSH#Traumatic Blow#

+ 1 - 0
db/skill_unit_db.txt

@@ -78,6 +78,7 @@
 339,0x86,    , -1, 0, 400,enemy, 0x000	//NPC_DARKGRANDCROSS
 339,0x86,    , -1, 0, 400,enemy, 0x000	//NPC_DARKGRANDCROSS
 362,0xb4,    ,  0, 3,  -1,all,   0x000	//HP_BASILICA
 362,0xb4,    ,  0, 3,  -1,all,   0x000	//HP_BASILICA
 369,0xb3,    , -1, 0,10000,all,  0x008	//PA_GOSPEL
 369,0xb3,    , -1, 0,10000,all,  0x008	//PA_GOSPEL
+395,0xb5,    ,  4, 0,  -1,all,   0x200	//CG_MOONLIT
 404,0xb6,    , -1, 0,  -1,all,   0x000	//PF_FOGWALL
 404,0xb6,    , -1, 0,  -1,all,   0x000	//PF_FOGWALL
 405,0xb7,    ,  0, 1,1000,enemy, 0x000	//PF_SPIDERWEB
 405,0xb7,    ,  0, 1,1000,enemy, 0x000	//PF_SPIDERWEB
 409,0xb2,    ,  0,-1,  -1,noone, 0x000	//WE_CALLBABY
 409,0xb2,    ,  0,-1,  -1,noone, 0x000	//WE_CALLBABY

+ 4 - 17
src/map/map.c

@@ -520,13 +520,8 @@ int map_moveblock(struct block_list *bl, int x1, int y1, unsigned int tick) {
 			if (sc->count) {
 			if (sc->count) {
 				if (sc->data[SC_CLOAKING].timer != -1)
 				if (sc->data[SC_CLOAKING].timer != -1)
 					skill_check_cloaking(bl, sc);
 					skill_check_cloaking(bl, sc);
-				if (sc->data[SC_DANCING].timer != -1) {
-					//Cancel Moonlight Petals if moved from casting position. [Skotlex]
-					if (sc->data[SC_DANCING].val1 == CG_MOONLIT)
-						skill_stop_dancing(bl);
-					else
-						skill_unit_move_unit_group((struct skill_unit_group *)sc->data[SC_DANCING].val2, bl->m, x1-x0, y1-y0);
-				}
+				if (sc->data[SC_DANCING].timer != -1)
+					skill_unit_move_unit_group((struct skill_unit_group *)sc->data[SC_DANCING].val2, bl->m, x1-x0, y1-y0);
 				if (sc->data[SC_WARM].timer != -1)
 				if (sc->data[SC_WARM].timer != -1)
 					skill_unit_move_unit_group((struct skill_unit_group *)sc->data[SC_WARM].val4, bl->m, x1-x0, y1-y0);
 					skill_unit_move_unit_group((struct skill_unit_group *)sc->data[SC_WARM].val4, bl->m, x1-x0, y1-y0);
 			}
 			}
@@ -2221,13 +2216,13 @@ int map_getcellp(struct map_data* m,int x,int y,cell_t cellchk)
 			if (type3 >= battle_config.cell_stack_limit) return 0;
 			if (type3 >= battle_config.cell_stack_limit) return 0;
 #endif
 #endif
 		case CELL_CHKREACH:
 		case CELL_CHKREACH:
-			return (type!=1 && type!=5 && !(type2&(CELL_MOONLIT|CELL_ICEWALL)));
+			return (type!=1 && type!=5 && !(type2&CELL_ICEWALL));
 		case CELL_CHKNOPASS:
 		case CELL_CHKNOPASS:
 #ifdef CELL_NOSTACK
 #ifdef CELL_NOSTACK
 			if (type3 >= battle_config.cell_stack_limit) return 1;
 			if (type3 >= battle_config.cell_stack_limit) return 1;
 #endif
 #endif
 		case CELL_CHKNOREACH:
 		case CELL_CHKNOREACH:
-			return (type==1 || type==5 || type2&(CELL_MOONLIT|CELL_ICEWALL));
+			return (type==1 || type==5 || type2&CELL_ICEWALL);
 		case CELL_CHKSTACK:
 		case CELL_CHKSTACK:
 #ifdef CELL_NOSTACK
 #ifdef CELL_NOSTACK
 			return (type3 >= battle_config.cell_stack_limit);
 			return (type3 >= battle_config.cell_stack_limit);
@@ -2254,8 +2249,6 @@ int map_getcellp(struct map_data* m,int x,int y,cell_t cellchk)
 			return (type2&CELL_BASILICA);
 			return (type2&CELL_BASILICA);
 		case CELL_CHKLANDPROTECTOR:
 		case CELL_CHKLANDPROTECTOR:
 			return (type2&CELL_LANDPROTECTOR);
 			return (type2&CELL_LANDPROTECTOR);
-		case CELL_CHKMOONLIT:
-			return (type2&CELL_MOONLIT);
 		case CELL_CHKREGEN:
 		case CELL_CHKREGEN:
 			return (type2&CELL_REGEN);
 			return (type2&CELL_REGEN);
 		case CELL_CHKICEWALL:
 		case CELL_CHKICEWALL:
@@ -2307,12 +2300,6 @@ void map_setcell(int m,int x,int y,int cell)
 		case CELL_CLRSAFETYWALL:
 		case CELL_CLRSAFETYWALL:
 			map[m].cell[j] &= ~CELL_SAFETYWALL;
 			map[m].cell[j] &= ~CELL_SAFETYWALL;
 			break;
 			break;
-		case CELL_SETMOONLIT:
-			map[m].cell[j] |= CELL_MOONLIT;
-			break;
-		case CELL_CLRMOONLIT:
-			map[m].cell[j] &= ~CELL_MOONLIT;
-			break;
 		case CELL_SETLANDPROTECTOR:
 		case CELL_SETLANDPROTECTOR:
 			map[m].cell[j] |= CELL_LANDPROTECTOR;
 			map[m].cell[j] |= CELL_LANDPROTECTOR;
 			break;
 			break;

+ 0 - 4
src/map/map.h

@@ -1215,7 +1215,6 @@ enum {
 #define CELL_SAFETYWALL	0x8
 #define CELL_SAFETYWALL	0x8
 #define CELL_LANDPROTECTOR	0x10
 #define CELL_LANDPROTECTOR	0x10
 #define CELL_BASILICA	0x20
 #define CELL_BASILICA	0x20
-#define CELL_MOONLIT	0x40
 #define CELL_ICEWALL	0x80
 #define CELL_ICEWALL	0x80
 /*
 /*
  * map_getcell()で使用されるフラグ
  * map_getcell()で使用されるフラグ
@@ -1236,7 +1235,6 @@ typedef enum {
 	CELL_CHKSAFETYWALL,
 	CELL_CHKSAFETYWALL,
 	CELL_CHKBASILICA,	// バジリカ(セルタイプ0x40フラグ)
 	CELL_CHKBASILICA,	// バジリカ(セルタイプ0x40フラグ)
 	CELL_CHKLANDPROTECTOR,
 	CELL_CHKLANDPROTECTOR,
-	CELL_CHKMOONLIT,
 	CELL_CHKICEWALL,
 	CELL_CHKICEWALL,
 	CELL_CHKSTACK,
 	CELL_CHKSTACK,
 } cell_t;
 } cell_t;
@@ -1253,8 +1251,6 @@ enum {
 	CELL_CLRPNEUMA,
 	CELL_CLRPNEUMA,
 	CELL_SETSAFETYWALL,
 	CELL_SETSAFETYWALL,
 	CELL_CLRSAFETYWALL,
 	CELL_CLRSAFETYWALL,
-	CELL_SETMOONLIT,
-	CELL_CLRMOONLIT,
 	CELL_SETICEWALL,
 	CELL_SETICEWALL,
 	CELL_CLRICEWALL,
 	CELL_CLRICEWALL,
 };
 };

+ 1 - 2
src/map/pc.c

@@ -3323,11 +3323,10 @@ int pc_setpos(struct map_session_data *sd,unsigned short mapindex,int x,int y,in
 		x=y=0;
 		x=y=0;
 	if((x==0 && y==0) ||
 	if((x==0 && y==0) ||
 		(map_getcell(m, x, y, CELL_CHKNOPASS) &&
 		(map_getcell(m, x, y, CELL_CHKNOPASS) &&
-		!map_getcell(m, x, y, CELL_CHKICEWALL) &&
 #ifdef CELL_NOSTACK
 #ifdef CELL_NOSTACK
 		!map_getcell(m, x, y, CELL_CHKSTACK) &&
 		!map_getcell(m, x, y, CELL_CHKSTACK) &&
 #endif
 #endif
-		!map_getcell(m, x, y, CELL_CHKMOONLIT))
+		!map_getcell(m, x, y, CELL_CHKICEWALL))
 	){ //It is allowed on top of Moonlight/icewall tiles to prevent force-warping 'cheats' [Skotlex]
 	){ //It is allowed on top of Moonlight/icewall tiles to prevent force-warping 'cheats' [Skotlex]
 		if(x||y) {
 		if(x||y) {
 			if(battle_config.error_log)
 			if(battle_config.error_log)

+ 14 - 61
src/map/skill.c

@@ -726,7 +726,6 @@ struct skill_unit_group_tickset *skill_unitgrouptickset_search(struct block_list
 static int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int tick);
 static int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int tick);
 static int skill_unit_onleft(int skill_id, struct block_list *bl,unsigned int tick);
 static int skill_unit_onleft(int skill_id, struct block_list *bl,unsigned int tick);
 int skill_unit_effect(struct block_list *bl,va_list ap);
 int skill_unit_effect(struct block_list *bl,va_list ap);
-static void skill_moonlit(struct block_list* src, struct block_list* partner, int skilllv);
 
 
 int enchant_eff[5] = { 10, 14, 17, 19, 20 };
 int enchant_eff[5] = { 10, 14, 17, 19, 20 };
 int deluge_eff[5] = { 5, 9, 12, 14, 15 };
 int deluge_eff[5] = { 5, 9, 12, 14, 15 };
@@ -3749,15 +3748,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 		if (tsc && tsc->data[SC_NEN].timer != -1)
 		if (tsc && tsc->data[SC_NEN].timer != -1)
 			status_change_end(bl,SC_NEN,-1);
 			status_change_end(bl,SC_NEN,-1);
 		break;
 		break;
-	case CG_MOONLIT:
-		clif_skill_nodamage(src,bl,skillid,skilllv,1);
-		if (sd && battle_config.player_skill_partner_check &&
-			(!battle_config.gm_skilluncond || pc_isGM(sd) < battle_config.gm_skilluncond)) {
-			skill_check_pc_partner(sd, skillid, &skilllv, 1, 1);
-		} else
-			skill_moonlit(bl, NULL, skilllv); //The knockback must be invoked before starting the effect which places down the map cells. [Skotlex]
-		
-		break;
 /* Was modified to only affect targetted char.	[Skotlex]
 /* Was modified to only affect targetted char.	[Skotlex]
 	case HP_ASSUMPTIO:
 	case HP_ASSUMPTIO:
 		if (flag&1)
 		if (flag&1)
@@ -4662,7 +4652,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 					|| i==SC_STRIPWEAPON || i==SC_STRIPSHIELD || i==SC_STRIPARMOR || i==SC_STRIPHELM
 					|| i==SC_STRIPWEAPON || i==SC_STRIPSHIELD || i==SC_STRIPARMOR || i==SC_STRIPHELM
 					|| i==SC_CP_WEAPON || i==SC_CP_SHIELD || i==SC_CP_ARMOR || i==SC_CP_HELM
 					|| i==SC_CP_WEAPON || i==SC_CP_SHIELD || i==SC_CP_ARMOR || i==SC_CP_HELM
 					|| i==SC_COMBO || i==SC_DANCING || i==SC_GUILDAURA || i==SC_EDP
 					|| i==SC_COMBO || i==SC_DANCING || i==SC_GUILDAURA || i==SC_EDP
-					|| i==SC_AUTOBERSERK  || i==SC_CARTBOOST || i==SC_MELTDOWN || i==SC_MOONLIT
+					|| i==SC_AUTOBERSERK  || i==SC_CARTBOOST || i==SC_MELTDOWN
 					|| i==SC_SAFETYWALL || i==SC_SMA || i==SC_SPEEDUP0
 					|| i==SC_SAFETYWALL || i==SC_SMA || i==SC_SPEEDUP0
 					)
 					)
 					continue;
 					continue;
@@ -5211,7 +5201,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 	case CG_LONGINGFREEDOM:
 	case CG_LONGINGFREEDOM:
 		{
 		{
 			if (tsc && tsc->data[SC_LONGING].timer == -1 && tsc->data[SC_DANCING].timer != -1 && tsc->data[SC_DANCING].val4
 			if (tsc && tsc->data[SC_LONGING].timer == -1 && tsc->data[SC_DANCING].timer != -1 && tsc->data[SC_DANCING].val4
-				&& tsc->data[SC_DANCING].val1 != CG_MOONLIT) //Can't use Longing for Freedom while under Moonlight Petals. [Skotlex]
+				&& (tsc->data[SC_DANCING].val1&0xFFFF) != CG_MOONLIT) //Can't use Longing for Freedom while under Moonlight Petals. [Skotlex]
 			{
 			{
 				clif_skill_nodamage(src,bl,skillid,skilllv,
 				clif_skill_nodamage(src,bl,skillid,skilllv,
 					sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));
 					sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));
@@ -6040,6 +6030,7 @@ int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid, int s
 	case DC_DONTFORGETME:
 	case DC_DONTFORGETME:
 	case DC_FORTUNEKISS:
 	case DC_FORTUNEKISS:
 	case DC_SERVICEFORYOU:
 	case DC_SERVICEFORYOU:
+	case CG_MOONLIT:
 	case GS_DESPERADO:
 	case GS_DESPERADO:
 	case NJ_KAENSIN:
 	case NJ_KAENSIN:
 	case NJ_BAKUENRYU:
 	case NJ_BAKUENRYU:
@@ -6066,7 +6057,7 @@ int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid, int s
 		skill_clear_unitgroup(src);
 		skill_clear_unitgroup(src);
 		sg = skill_unitsetting(src,skillid,skilllv,x,y,0);
 		sg = skill_unitsetting(src,skillid,skilllv,x,y,0);
 		sc_start4(src,SC_DANCING,100,
 		sc_start4(src,SC_DANCING,100,
-			skillid,0,0,sg->group_id,skill_get_time(skillid,skilllv));
+			skillid,0,skilllv,sg->group_id,skill_get_time(skillid,skilllv));
 		flag|=1;
 		flag|=1;
 		break;
 		break;
 	case RG_CLEANER: // [Valaris]
 	case RG_CLEANER: // [Valaris]
@@ -6927,7 +6918,12 @@ int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, unsigned
 		if(src->limit + sg->tick > tick + 700)
 		if(src->limit + sg->tick > tick + 700)
 			src->limit = DIFF_TICK(tick+700,sg->tick);
 			src->limit = DIFF_TICK(tick+700,sg->tick);
 		break;
 		break;
-	}	
+	case UNT_MOONLIT:
+	//Knockback out of area if affected char isn't in Moonlit effect
+		if (!sc || sc->data[SC_DANCING].timer==-1 || (sc->data[SC_DANCING].val1&0xFFFF) != CG_MOONLIT)
+			skill_blown(ss, bl, skill_get_blewcount(sg->skill_id,sg->skill_lv));
+		break;
+	}
 	return skillid;
 	return skillid;
 }
 }
 
 
@@ -7393,7 +7389,8 @@ static int skill_unit_onleft (int skill_id, struct block_list *bl, unsigned int
 		case BD_ROKISWEIL:
 		case BD_ROKISWEIL:
 		case BD_INTOABYSS:
 		case BD_INTOABYSS:
 		case BD_SIEGFRIED:
 		case BD_SIEGFRIED:
-			if(sc && sc->data[SC_DANCING].timer != -1 && sc->data[SC_DANCING].val1 == skill_id)
+			if(sc && sc->data[SC_DANCING].timer != -1 &&
+				(sc->data[SC_DANCING].val1&0xFFFF) == skill_id)
 			{	//Check if you just stepped out of your ensemble skill to cancel dancing. [Skotlex]
 			{	//Check if you just stepped out of your ensemble skill to cancel dancing. [Skotlex]
 				//We don't check for SC_LONGING because someone could always have knocked you back and out of the song/dance.
 				//We don't check for SC_LONGING because someone could always have knocked you back and out of the song/dance.
 				//FIXME: This code is not perfect, it doesn't checks for the real ensemble's owner,
 				//FIXME: This code is not perfect, it doesn't checks for the real ensemble's owner,
@@ -7595,41 +7592,6 @@ int skill_unit_ondamaged (struct skill_unit *src, struct block_list *bl, int dam
 	return damage;
 	return damage;
 }
 }
 
 
-static int skill_moonlit_sub(struct block_list *bl, va_list ap) {
-	struct block_list *src = va_arg(ap, struct block_list*);
-	struct block_list *partner = va_arg(ap, struct block_list*);
-	int blowcount = va_arg(ap, int);
-	if (bl == src || bl == partner)
-		return 0;
-	skill_blown(src, bl, blowcount);
-	return 1;
-}
-
-/*==========================================
- * Starts the moonlit effect by first knocking back all other characters in the vecinity.
- * partner may be null, but src cannot be.
- *------------------------------------------
- */
-static void skill_moonlit (struct block_list* src, struct block_list* partner, int skilllv)
-{
-	int range = skill_get_splash(CG_MOONLIT, skilllv);
-	int blowcount = range+1, time = skill_get_time(CG_MOONLIT,skilllv);
-	
-	map_foreachinrange(skill_moonlit_sub,src,
-		range, BL_CHAR,src,partner,blowcount);
-	if(partner)
-		map_foreachinrange(skill_moonlit_sub,partner,
-			range, BL_CHAR,src,partner,blowcount);
-		
-	sc_start4(src,SC_DANCING,100,CG_MOONLIT,0,0,partner?partner->id:BCT_SELF,time+1000);
-	sc_start4(src,SkillStatusChangeTable(CG_MOONLIT),100,skilllv,0,0,0,time);
-	
-	if (partner) {
-		sc_start4(partner,SC_DANCING,100,CG_MOONLIT,0,0,src->id,time+1000);
-		sc_start4(partner,SkillStatusChangeTable(CG_MOONLIT),100,skilllv,0,0,0,time);
-	}
-	
-}
 /*==========================================
 /*==========================================
  *
  *
  *------------------------------------------
  *------------------------------------------
@@ -7721,20 +7683,11 @@ int skill_check_pc_partner (struct map_session_data *sd, int skill_id, int* skil
 						status_charge(&tsd->bl, 0, 10);
 						status_charge(&tsd->bl, 0, 10);
 				}
 				}
 				return c;
 				return c;
-			case CG_MOONLIT:
-				if (c > 0 && (tsd = map_id2sd(p_sd[0])) != NULL)
-				{
-					clif_skill_nodamage(&tsd->bl, &sd->bl, skill_id, *skill_lv, 1);
-					skill_moonlit(&sd->bl, &tsd->bl, *skill_lv);
-					tsd->skillid_dance = skill_id;
-					tsd->skilllv_dance = *skill_lv;
-				}
-				return c;
 			default: //Warning: Assuming Ensemble skills here (for speed)
 			default: //Warning: Assuming Ensemble skills here (for speed)
 				if (c > 0 && (tsd = map_id2sd(p_sd[0])) != NULL)
 				if (c > 0 && (tsd = map_id2sd(p_sd[0])) != NULL)
 				{
 				{
 					sd->sc.data[SC_DANCING].val4= tsd->bl.id;
 					sd->sc.data[SC_DANCING].val4= tsd->bl.id;
-					sc_start4(&tsd->bl,SC_DANCING,100,skill_id,sd->sc.data[SC_DANCING].val2,0,sd->bl.id,skill_get_time(skill_id,*skill_lv)+1000);
+					sc_start4(&tsd->bl,SC_DANCING,100,skill_id,sd->sc.data[SC_DANCING].val2,*skill_lv,sd->bl.id,skill_get_time(skill_id,*skill_lv)+1000);
 					clif_skill_nodamage(&tsd->bl, &sd->bl, skill_id, *skill_lv, 1);
 					clif_skill_nodamage(&tsd->bl, &sd->bl, skill_id, *skill_lv, 1);
 					tsd->skillid_dance = skill_id;
 					tsd->skillid_dance = skill_id;
 					tsd->skilllv_dance = *skill_lv;
 					tsd->skilllv_dance = *skill_lv;
@@ -9743,7 +9696,7 @@ struct skill_unit_group *skill_initunitgroup (struct block_list *src, int count,
 			sd->skillid_dance=skillid;
 			sd->skillid_dance=skillid;
 			sd->skilllv_dance=skilllv;
 			sd->skilllv_dance=skilllv;
 		}
 		}
-		sc_start4(src,SC_DANCING,100,skillid,(int)group,0,(i&UF_ENSEMBLE?BCT_SELF:0),skill_get_time(skillid,skilllv)+1000);
+		sc_start4(src,SC_DANCING,100,skillid,(int)group,skilllv,(i&UF_ENSEMBLE?BCT_SELF:0),skill_get_time(skillid,skilllv)+1000);
 		if (sd && i&UF_ENSEMBLE &&
 		if (sd && i&UF_ENSEMBLE &&
 			battle_config.player_skill_partner_check &&
 			battle_config.player_skill_partner_check &&
 			(!battle_config.gm_skilluncond || pc_isGM(sd) < battle_config.gm_skilluncond)
 			(!battle_config.gm_skilluncond || pc_isGM(sd) < battle_config.gm_skilluncond)

+ 1 - 1
src/map/skill.h

@@ -938,7 +938,7 @@ enum {
 	UNT_CALLFAMILY,
 	UNT_CALLFAMILY,
 	UNT_GOSPEL,
 	UNT_GOSPEL,
 	UNT_BASILICA,
 	UNT_BASILICA,
-	//0xb5
+	UNT_MOONLIT,//0xb5 //I HOPE this one doesn't shows any effects
 	UNT_FOGWALL = 0xb6,
 	UNT_FOGWALL = 0xb6,
 	UNT_SPIDERWEB,
 	UNT_SPIDERWEB,
 	UNT_GRAVITATION,
 	UNT_GRAVITATION,

+ 12 - 15
src/map/status.c

@@ -302,7 +302,7 @@ void initChangeTables(void) {
 	set_sc(ST_CHASEWALK, SC_CHASEWALK, SI_BLANK, SCB_SPEED);
 	set_sc(ST_CHASEWALK, SC_CHASEWALK, SI_BLANK, SCB_SPEED);
 	set_sc(ST_REJECTSWORD, SC_REJECTSWORD, SI_REJECTSWORD, SCB_NONE);
 	set_sc(ST_REJECTSWORD, SC_REJECTSWORD, SI_REJECTSWORD, SCB_NONE);
 	add_sc(ST_REJECTSWORD, SC_AUTOCOUNTER);
 	add_sc(ST_REJECTSWORD, SC_AUTOCOUNTER);
-	set_sc(CG_MOONLIT, SC_MOONLIT, SI_MOONLIT, SCB_NONE);
+//	set_sc(CG_MOONLIT, SC_MOONLIT, SI_MOONLIT, SCB_NONE);
 	set_sc(CG_MARIONETTE, SC_MARIONETTE, SI_MARIONETTE, SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK);
 	set_sc(CG_MARIONETTE, SC_MARIONETTE, SI_MARIONETTE, SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK);
 	set_sc(CG_MARIONETTE, SC_MARIONETTE2, SI_MARIONETTE2, SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK);
 	set_sc(CG_MARIONETTE, SC_MARIONETTE2, SI_MARIONETTE2, SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK);
 	add_sc(LK_SPIRALPIERCE, SC_STOP);
 	add_sc(LK_SPIRALPIERCE, SC_STOP);
@@ -1007,7 +1007,7 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int
 			if (skill_num != BD_ADAPTATION && skill_num != CG_LONGINGFREEDOM
 			if (skill_num != BD_ADAPTATION && skill_num != CG_LONGINGFREEDOM
 				&& skill_num != BA_MUSICALSTRIKE && skill_num != DC_THROWARROW)
 				&& skill_num != BA_MUSICALSTRIKE && skill_num != DC_THROWARROW)
 				return 0;
 				return 0;
-			if (sc->data[SC_DANCING].val1 == CG_HERMODE && skill_num == BD_ADAPTATION)
+			if ((sc->data[SC_DANCING].val1&0xFFFF) == CG_HERMODE && skill_num == BD_ADAPTATION)
 				return 0;	//Can't amp out of Wand of Hermode :/ [Skotlex]
 				return 0;	//Can't amp out of Wand of Hermode :/ [Skotlex]
 		}
 		}
 
 
@@ -4943,14 +4943,14 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 		case SC_SPEARQUICKEN:
 		case SC_SPEARQUICKEN:
 			val2 = 200+10*val1;
 			val2 = 200+10*val1;
 			break;
 			break;
-		case SC_MOONLIT:
-			val2 = bl->id;
-			skill_setmapcell(bl,CG_MOONLIT, val1, CELL_SETMOONLIT);
-			break;
 		case SC_DANCING:
 		case SC_DANCING:
-			//val1 : Skill which is being danced.
+			//val1 : Skill ID + LV
 			//val2 : Skill Group of the Dance.
 			//val2 : Skill Group of the Dance.
+			//val3 : Brings the skilllv (merged into val1 here)
 			//val4 : Partner
 			//val4 : Partner
+			if (val1 == CG_MOONLIT)
+				clif_status_change(bl,SI_MOONLIT,1);
+			val1|= (val3<<16);
 			val3 = 0; //Tick duration/Speed penalty.
 			val3 = 0; //Tick duration/Speed penalty.
 			if (sd) { //Store walk speed change in lower part of val3
 			if (sd) { //Store walk speed change in lower part of val3
 				val3 = 500-40*pc_checkskill(sd,(sd->status.sex?BA_MUSICALLESSON:DC_DANCINGLESSON));
 				val3 = 500-40*pc_checkskill(sd,(sd->status.sex?BA_MUSICALLESSON:DC_DANCINGLESSON));
@@ -6005,9 +6005,8 @@ int status_change_end( struct block_list* bl , int type,int tid )
 					}
 					}
 				}
 				}
 			}
 			}
-			//Only dance that doesn't has ground tiles... [Skotlex]
-			if(sc->data[type].val1 == CG_MOONLIT)
-				status_change_end(bl, SC_MOONLIT, -1);
+			if ((sc->data[type].val1&0xFFFF) == CG_MOONLIT)
+				clif_status_change(bl,SI_MOONLIT,0);
 
 
 			if (sc->data[SC_LONGING].timer!=-1)
 			if (sc->data[SC_LONGING].timer!=-1)
 				status_change_end(bl,SC_LONGING,-1);				
 				status_change_end(bl,SC_LONGING,-1);				
@@ -6105,9 +6104,6 @@ int status_change_end( struct block_list* bl , int type,int tid )
 		case SC_BASILICA: //Clear the skill area. [Skotlex]
 		case SC_BASILICA: //Clear the skill area. [Skotlex]
 				skill_clear_unitgroup(bl);
 				skill_clear_unitgroup(bl);
 				break;
 				break;
-		case SC_MOONLIT: //Clear the unit effect. [Skotlex]
-			skill_setmapcell(bl,CG_MOONLIT, sc->data[SC_MOONLIT].val1, CELL_CLRMOONLIT);
-			break;
 		case SC_TRICKDEAD:
 		case SC_TRICKDEAD:
 			if (vd) vd->dead_sit = 0;
 			if (vd) vd->dead_sit = 0;
 			break;
 			break;
@@ -6529,7 +6525,7 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
 				break;
 				break;
 			sc->data[type].val3&= 0xFFFF; //Remove counter
 			sc->data[type].val3&= 0xFFFF; //Remove counter
 			sc->data[type].val3|=(counter<<16);//Reset it.
 			sc->data[type].val3|=(counter<<16);//Reset it.
-			switch(sc->data[type].val1){
+			switch(sc->data[type].val1&0xFFFF){
 				case BD_RICHMANKIM:
 				case BD_RICHMANKIM:
 				case BD_DRUMBATTLEFIELD:
 				case BD_DRUMBATTLEFIELD:
 				case BD_RINGNIBELUNGEN:
 				case BD_RINGNIBELUNGEN:
@@ -6557,7 +6553,8 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
 					s=6;
 					s=6;
 					break;
 					break;
 				case CG_MOONLIT:
 				case CG_MOONLIT:
-					sp= 4*sc->data[SC_MOONLIT].val1; //Moonlit's cost is 4sp*skill_lv [Skotlex]
+					//Moonlit's cost is 4sp*skill_lv [Skotlex]
+					sp= 4*(sc->data[type].val1>>16);
 					//Upkeep is also every 10 secs.
 					//Upkeep is also every 10 secs.
 				case DC_DONTFORGETME:
 				case DC_DONTFORGETME:
 					s=10;
 					s=10;

+ 1 - 1
src/map/status.h

@@ -136,7 +136,7 @@ enum {
 	SC_REJECTSWORD,
 	SC_REJECTSWORD,
 	SC_MARIONETTE,
 	SC_MARIONETTE,
 	SC_MARIONETTE2,
 	SC_MARIONETTE2,
-	SC_MOONLIT,
+	SC_UNUSED,	//Unused (was SC_MOONLIT)
 	SC_JOINTBEAT,
 	SC_JOINTBEAT,
 	SC_MINDBREAKER, //130
 	SC_MINDBREAKER, //130
 	SC_MEMORIZE,
 	SC_MEMORIZE,

+ 4 - 4
src/map/unit.c

@@ -668,11 +668,11 @@ int unit_can_move(struct block_list *bl)
 			|| sc->data[SC_BLADESTOP].timer !=-1
 			|| sc->data[SC_BLADESTOP].timer !=-1
 			|| sc->data[SC_BLADESTOP_WAIT].timer !=-1
 			|| sc->data[SC_BLADESTOP_WAIT].timer !=-1
 			|| sc->data[SC_SPIDERWEB].timer !=-1
 			|| sc->data[SC_SPIDERWEB].timer !=-1
-			|| (sc->data[SC_DANCING].timer !=-1 && (
-				(sc->data[SC_DANCING].val4 && sc->data[SC_LONGING].timer == -1) ||
-				sc->data[SC_DANCING].val1 == CG_HERMODE	//cannot move while Hermod is active.
+			|| (sc->data[SC_DANCING].timer !=-1 && sc->data[SC_DANCING].val4 && (
+				sc->data[SC_LONGING].timer == -1 ||
+				(sc->data[SC_DANCING].val1&0xFFFF) == CG_MOONLIT ||
+				(sc->data[SC_DANCING].val1&0xFFFF) == CG_HERMODE
 			))
 			))
-			|| sc->data[SC_MOONLIT].timer != -1
 			|| (sc->data[SC_GOSPEL].timer !=-1 && sc->data[SC_GOSPEL].val4 == BCT_SELF)	// cannot move while gospel is in effect
 			|| (sc->data[SC_GOSPEL].timer !=-1 && sc->data[SC_GOSPEL].val4 == BCT_SELF)	// cannot move while gospel is in effect
 			|| sc->data[SC_STOP].timer != -1
 			|| sc->data[SC_STOP].timer != -1
 			|| sc->data[SC_CLOSECONFINE].timer != -1
 			|| sc->data[SC_CLOSECONFINE].timer != -1