Jelajahi Sumber

Fixed bugreport:6839 where SC_CAMOUFLAGE is not ending properly.
Fixed bugreport:6710 where SR_EARTHSHAKER ATK bonus is not applied properly.
Implemented KO_MAKIBISHI and updated some Kagerou/Oboro skills.

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

rud0lp20 12 tahun lalu
induk
melakukan
9bde36efae

+ 1 - 1
db/pre-re/skill_db.txt

@@ -1036,7 +1036,7 @@
 3007,0,6,4,-1,0x42,4:4:4:4:5,5,0,no,0,0,0,misc,0,	KO_HAPPOKUNAI,Happo Kunai
 3008,9,8,2,0,0x52,2,10,-10,no,0,0,0,misc,0,	KO_MUCHANAGE,Mucha Nage
 3009,9:10:11:12:13,8,2,-1,0x2,3,5,2,no,0,0,0,weapon,0,	KO_HUUMARANKA,Huuma Shuriken Ranka 
-//3010,3,6,2,0,0x43,0,5,1,no,0,0x80,0,misc,0,	KO_MAKIBISHI,Makibishi
+3010,3,6,4,0,0x43,0,5,1,no,0,0x80,0,misc,0,	KO_MAKIBISHI,Makibishi
 3011,0,6,4,0,0x1,0,5,0,yes,0,0,0,none,0,	KO_MEIKYOUSISUI,Meikyo Shisui
 3012,0,6,4,0,0x1,0,5,0,no,0,0,1,none,7,		KO_ZANZOU,Zanzou
 3013,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,		KO_KYOUGAKU,Kyougaku

+ 1 - 0
db/pre-re/skill_nocast_db.txt

@@ -86,6 +86,7 @@
 
 //mixed
 488,3	//CG_HERMODE
+3013,3	//KO_KYOUGAKU
 
 //Clone Forbidden/pointless skills
 77,16	//PR_TURNUNDEAD

+ 1 - 1
db/pre-re/skill_unit_db.txt

@@ -155,7 +155,7 @@
 3008,0x86,    ,  0, 2, 100,enemy, 0x018	//KO_MUCHANAGE
 3009,0x86,    ,  0, 3, 500,enemy, 0x018	//KO_HUUMARANKA
 3020,0xf8,    ,  0, 3, 100,all, 0x018	//KO_ZENKAI
-//3010,0xfc,    ,  0, 2,1000,enemy, 0x022	//KO_MAKIBISHI
+3010,0xfc,    ,  0, 1,1000,enemy, 0x020	//KO_MAKIBISHI
 
 8208,0x86,    ,  0, 2,1000,enemy, 0x080	//MA_SHOWER
 8209,0x90,    ,  0, 1,1000,enemy, 0x006	//MA_SKIDTRAP

+ 1 - 1
db/re/skill_db.txt

@@ -1037,7 +1037,7 @@
 3007,0,6,4,-1,0x42,4:4:4:4:5,5,0,no,0,0,0,misc,0,	KO_HAPPOKUNAI,Happo Kunai
 3008,9,8,2,0,0x52,2,10,-10,no,0,0,0,misc,0,	KO_MUCHANAGE,Mucha Nage
 3009,9:10:11:12:13,8,2,-1,0x2,3,5,2,no,0,0,0,weapon,0,	KO_HUUMARANKA,Huuma Shuriken Ranka 
-//3010,3,6,2,0,0x43,0,5,1,no,0,0x80,0,misc,0,	KO_MAKIBISHI,Makibishi
+3010,3,6,4,0,0x43,0,5,1,no,0,0x80,0,misc,0,	KO_MAKIBISHI,Makibishi
 3011,0,6,4,0,0x1,0,5,0,yes,0,0,0,none,0,	KO_MEIKYOUSISUI,Meikyo Shisui
 3012,0,6,4,0,0x1,0,5,0,no,0,0,1,none,7,		KO_ZANZOU,Zanzou
 3013,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,		KO_KYOUGAKU,Kyougaku

+ 1 - 0
db/re/skill_nocast_db.txt

@@ -86,6 +86,7 @@
 
 //mixed
 488,3	//CG_HERMODE
+3013,3	//KO_KYOUGAKU
 
 //Clone Forbidden/pointless skills
 77,16	//PR_TURNUNDEAD

+ 1 - 1
db/re/skill_unit_db.txt

@@ -158,7 +158,7 @@
 3008,0x86,    ,  0, 2, 100,enemy, 0x018	//KO_MUCHANAGE
 3009,0x86,    ,  0, 3, 500,enemy, 0x018	//KO_HUUMARANKA
 3020,0xf8,    ,  0, 3, 100,all, 0x018	//KO_ZENKAI
-//3010,0xfc,    ,  0, 2,1000,enemy, 0x022	//KO_MAKIBISHI
+3010,0xfc,    ,  0, 1,1000,enemy, 0x020	//KO_MAKIBISHI
 
 8020,0xf5,    ,  0, 3,2300:2100:1900:1700:1500,enemy,   0x018	//MH_POISON_MIST
 8033,0x7e,    ,  0, 0,  -1,all,   0x003	//MH_STEINWAND 

+ 1 - 0
src/map/battle.c

@@ -3320,6 +3320,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 				ATK_ADD( ( sc->data[SC_ENCHANTBLADE]->val1*20+100 ) * status_get_lv(src) / 150 + status_get_int(src) );
 			}
 		}
+		status_change_end(src,SC_CAMOUFLAGE, INVALID_TIMER);
 	}
 	if( skill_num == LG_RAYOFGENESIS ) {
 		struct Damage md = battle_calc_magic_attack(src, target, skill_num, skill_lv, wflag);

+ 22 - 7
src/map/skill.c

@@ -819,8 +819,6 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 			if((sce=sc->data[SC_EDP]))
 				sc_start4(bl,SC_DPOISON,sce->val2, sce->val1,src->id,0,0,
 					skill_get_time2(ASC_EDP,sce->val1));
-			// Cancels on normal attack but benefits with the bonuses
-			status_change_end(src,SC_CAMOUFLAGE, INVALID_TIMER);
 		}
 	}
 	break;
@@ -4422,9 +4420,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 
 	case SR_EARTHSHAKER:
 		if( flag&1 ) { //by default cloaking skills are remove by aoe skills so no more checking/removing except hiding and cloaking exceed.
+			skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick, flag);
 			status_change_end(bl, SC_HIDING, INVALID_TIMER);
 			status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
-			skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick, flag);
 		} else{
 			map_foreachinrange(skill_area_sub, bl, skill_get_splash(skillid, skilllv), splash_target(src), src, skillid, skilllv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
 			clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skillid, skilllv, 6);
@@ -4543,7 +4541,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 					skill_castend_damage_id);
 				flag|=1; //Set flag to 1 so ammo is not double-consumed. [Skotlex]
 			}
-			status_change_end(src,SC_CAMOUFLAGE, INVALID_TIMER);
 		}
 		break;
 
@@ -8747,7 +8744,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 		break;
 
 	case KO_JYUSATSU:
-		if( dstsd && tsc && !tsc->data[type] && rand()%100 < tstatus->int_/2 ){
+		if( dstsd && tsc && !tsc->data[type] &&
+			rand()%100 < ((45+5*skilllv) + skilllv*5 - status_get_int(bl)/2) ){//[(Base chance of success) + (Skill Level x 5) - (int / 2)]%.
 			clif_skill_nodamage(src,bl,skillid,skilllv,
 				status_change_start(bl,type,10000,skilllv,0,0,0,skill_get_time(skillid,skilllv),1));
 			status_zap(bl, tstatus->max_hp*skilllv*5/100 , 0);
@@ -8760,6 +8758,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 	case KO_GENWAKU:
 		if ( !map_flag_gvg(src->m) && ( dstsd || dstmd ) && battle_check_target(src,bl,BCT_ENEMY) > 0 ) {
 			int x = src->x, y = src->y;
+
+			if( sd && rnd()%100 > ((45+5*skilllv) - status_get_int(bl)/10) ){//[(Base chance of success) - (Intelligence Objectives / 10)]%.
+				clif_skill_fail(sd,skillid,USESKILL_FAIL_LEVEL,0);
+				break;
+			}
+
 			if (unit_movepos(src,bl->x,bl->y,0,0)) {
 				clif_skill_nodamage(src,src,skillid,skilllv,1);
 				clif_slide(src,bl->x,bl->y) ;
@@ -9539,7 +9543,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
 	case KO_MUCHANAGE:
 	case KO_BAKURETSU:
 	case KO_ZENKAI:
-	//case KO_MAKIBISHI:
 		flag|=1;//Set flag to 1 to prevent deleting ammo (it will be deleted on group-delete).
 	case GS_GROUNDDRIFT: //Ammo should be deleted right away.
 		skill_unitsetting(src,skillid,skilllv,x,y,0);
@@ -10000,6 +10003,14 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
             flag |= 33;
             skill_unitsetting(src, skillid, skilllv, x, y, 0);
             break;
+
+	case KO_MAKIBISHI:
+		for( i = 0; i < (skilllv+2); i++ ) {
+			x = src->x - 1 + rnd()%3;
+			y = src->y - 1 + rnd()%3;
+			skill_unitsetting(src,skillid,skilllv,x,y,0); 
+		}
+		break;
 	default:
 		if( skillid >= HM_SKILLBASE && skillid <= HM_SKILLBASE + MAX_HOMUNSKILL ) {
 			if( src->type == BL_HOM && ((TBL_HOM*)src)->master->fd )
@@ -11252,7 +11263,6 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 		case UNT_FLASHER:
 		case UNT_FREEZINGTRAP:
 		case UNT_FIREPILLAR_ACTIVE:
-		case UNT_MAKIBISHI:
 			map_foreachinrange(skill_trap_splash,&src->bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &src->bl,tick);
 			if (sg->unit_id != UNT_FIREPILLAR_ACTIVE)
 				clif_changetraplook(&src->bl, sg->unit_id==UNT_LANDMINE?UNT_FIREPILLAR_ACTIVE:UNT_USED_TRAPS);
@@ -11677,6 +11687,11 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 				sc_start2(bl,type,100,sg->val1,sg->val2,skill_get_time2(sg->skill_id, sg->skill_lv));
 			break;
 
+		case UNT_MAKIBISHI:
+			skill_attack(BF_MISC, ss, &src->bl, bl, sg->skill_id, sg->skill_lv, tick, 0);
+			sg->limit = DIFF_TICK(tick, sg->tick);
+			sg->unit_id = UNT_USED_TRAPS;
+			break;
 	}
 
 	if (bl->type == BL_MOB && ss != bl)

+ 25 - 7
src/map/status.c

@@ -714,7 +714,7 @@ void initChangeTables(void) {
 	set_sc( EL_ROCK_CRUSHER_ATK, SC_ROCK_CRUSHER_ATK     , SI_ROCK_CRUSHER_ATK     , SCB_SPEED );
 
 	add_sc( KO_YAMIKUMO			, SC_HIDING		  );
-	set_sc( KO_JYUMONJIKIRI		, SC_JYUMONJIKIRI		 , SI_KO_JYUMONJIKIRI	   , SCB_NONE );
+	set_sc_with_vfx( KO_JYUMONJIKIRI		, SC_JYUMONJIKIRI		 , SI_KO_JYUMONJIKIRI	   , SCB_NONE );
 	add_sc( KO_MAKIBISHI	    , SC_STUN		  );
 	set_sc( KO_MEIKYOUSISUI		, SC_MEIKYOUSISUI		 , SI_MEIKYOUSISUI		   , SCB_NONE );
 	set_sc( KO_KYOUGAKU			, SC_KYOUGAKU			 , SI_KYOUGAKU			   , SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK );
@@ -1004,6 +1004,7 @@ void initChangeTables(void) {
 	StatusChangeStateTable[SC_CAMOUFLAGE]          |= SCS_NOMOVE|SCS_NOMOVECOND;
 	StatusChangeStateTable[SC_MEIKYOUSISUI]		   |= SCS_NOMOVE;
 	StatusChangeStateTable[SC_KAGEHUMI]            |= SCS_NOMOVE;
+	StatusChangeStateTable[SC_KYOUGAKU]			   |= SCS_NOMOVE;
 
 	/* StatusChangeState (SCS_) NOPICKUPITEMS */
 	StatusChangeStateTable[SC_HIDING]              |= SCS_NOPICKITEM;
@@ -8317,7 +8318,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 			break;
 		case SC_KYOUGAKU:
 			val2 = 2*val1 + rand()%val1;
-			clif_status_change(bl,SI_ACTIVE_MONSTER_TRANSFORM,1,0,1002,0,0); // Temporarily shows Poring need official [malufett]
+			clif_status_change(bl,SI_ACTIVE_MONSTER_TRANSFORM,1,0,1002,0,0); 
 			break;
 		case SC_KAGEMUSYA:
 			val3 = val1 * 2;
@@ -8326,13 +8327,29 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 			tick_time = 1000;
 			break;
 		case SC_ZANGETSU:
-			val2 = status_get_lv(bl) / 2 + 50;
+			if( (status_get_hp(bl)+status_get_sp(bl)) % 2 == 0)
+				val2 = status_get_lv(bl) / 2 + 50;
+			else
+				val2 -= 50;
 			break;
 		case SC_GENSOU:
-			if( rand()%100 < 50) // needs more info
-				status_zap(bl, 500, 500);
-			else
-				status_heal(bl, 500, 500, 0);
+			{
+				int hp = status_get_hp(bl), lv = 5;
+				short per = 100 / (status_get_max_hp(bl) / hp);
+
+				if( per <= 15 )
+					lv = 1;
+				else if( per <= 30 )
+					lv = 2;
+				else if( per <= 50 )
+					lv = 3;
+				else if( per <= 75 )
+					lv = 4;
+				if( hp % 2 == 0)
+					status_heal(bl, hp * (6-lv) * 4 / 100, status_get_sp(bl) * (6-lv) * 3 / 100, 1);
+				else
+					status_zap(bl, hp * (lv*4) / 100, status_get_sp(bl) * (lv*3) / 100);
+			}
 			break;
 		default:
 			if( calc_flag == SCB_NONE && StatusSkillChangeTable[type] == 0 && StatusIconChangeTable[type] == 0 )
@@ -8389,6 +8406,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 		case SC_FEAR:
 		case SC_NETHERWORLD:
 		case SC_MEIKYOUSISUI:
+		case SC_KYOUGAKU:
 			unit_stop_walking(bl,1);
 		break;
 		case SC_HIDING: