Browse Source

Update NJ_ISSEN to its official RE behavior.(bugreport:6114, bugreport:5426)
Fixed bugreport:6688 MO_EXTRIMITYFIST skill effect.
Updated all non 3rd job skills to there official RE cast time delays.
Updated WL_WHITEIMPRISON where cooldown should trigger whether success or not.
Added missing status icon for SC_MATKPOTION and SC_ATKPOTION.


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

rud0lp20 12 năm trước cách đây
mục cha
commit
0e6fbcb0ce
6 tập tin đã thay đổi với 367 bổ sung369 xóa
  1. 291 301
      db/re/skill_cast_db.txt
  2. 1 1
      db/re/skill_db.txt
  3. 28 5
      src/map/battle.c
  4. 43 60
      src/map/skill.c
  5. 2 0
      src/map/status.c
  6. 2 2
      src/map/status.h

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 291 - 301
db/re/skill_cast_db.txt


+ 1 - 1
db/re/skill_db.txt

@@ -587,7 +587,7 @@
 541,9,6,2,4,0x2,2:2:3:3:4,5,1,yes,0,0,0,magic,0,	NJ_RAIGEKISAI,Lightning Strike of Destruction
 542,9,8,1,4,0,3,5,1,yes,0,0,5:6:7:8:9,magic,0,	NJ_KAMAITACHI,Kamaitachi
 543,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,		NJ_NEN,Soul
-544,-5,6,1,0,0x40,0,10,1,no,0,0,0,weapon,0,	NJ_ISSEN,Final Strike
+544,-5,8,1,0,0x40,0,10,1,no,0,0,0,weapon,0,	NJ_ISSEN,Final Strike
 
 // Additional NPC Skills (Episode 11.3)
 653,0,8,4,0,0x6,5:7:9:11:13:5:7:9:11:13,10,1,no,0,0x2,0,magic,0,	NPC_EARTHQUAKE,Earthquake

+ 28 - 5
src/map/battle.c

@@ -2059,16 +2059,16 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 
 		switch (skill_id)
 		{	//Calc base damage according to skill
-			case NJ_ISSEN:
-				wd.damage = 40*sstatus->str +skill_lv*(sstatus->hp/10 + 35);
-				wd.damage2 = 0;
-				status_set_hp(src, 1, 0);
-				break;
 			case PA_SACRIFICE:
 				wd.damage = (int64)sstatus->max_hp* 9/100;
 				wd.damage2 = 0;
 				break;
 #ifndef RENEWAL
+			case NJ_ISSEN:
+				wd.damage = 40*sstatus->str +skill_lv*(sstatus->hp/10 + 35);
+				wd.damage2 = 0;
+				status_set_hp(src, 1, 0);
+				break;
 			case LK_SPIRALPIERCE:
 			case ML_SPIRALPIERCE:
 				if (sd) {
@@ -2478,6 +2478,11 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 					skillratio += 20*(skill_lv-1);
 				#endif
 					break;
+#ifdef RENEWAL
+				case NJ_ISSEN:
+					skillratio += 100 * (skill_lv-1);
+					break;
+#endif
 				case NJ_HUUMA:
 					skillratio += 50 + 150*skill_lv;
 					break;
@@ -2960,6 +2965,18 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 				case NJ_SYURIKEN:
 					ATK_ADD(4*skill_lv);
 					break;
+#ifdef RENEWAL
+				case NJ_ISSEN:
+					// Damage = (current HP + atk * skill_lv) - (sdef+edef)
+					ATK_ADD(sstatus->hp);
+					wd.damage2 = 0;// needs more info if this really 0 for dual weilding KG/OB. [malufett]
+					status_set_hp(src, max(sstatus->hp/100, 1), 0);
+					if( sc && sc->data[SC_BUNSINJYUTSU] && (i=sc->data[SC_BUNSINJYUTSU]->val2) > 0){
+						wd.div_ = -( i + 2 ); // mirror image number of hits + 2
+						ATK_ADDRATE(20 + i*20); // (20 + 20 * mirror image) %
+					}
+					break;
+#endif
 				case HT_FREEZINGTRAP:
 					if(sd)
 						ATK_ADD( 40 * pc_checkskill(sd, RA_RESEARCHTRAP) );
@@ -3187,6 +3204,12 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 				if( src->type == BL_MOB && (skill=pc_checkskill(tsd,RA_RANGERMAIN))>0 &&
 					(sstatus->race == RC_BRUTE || sstatus->race == RC_FISH || sstatus->race == RC_PLANT) )
 					vit_def += skill*5;
+#ifdef RENEWAL
+				if( skill == NJ_ISSEN ){//TODO: do better implementation if other skills(same func) are found [malufett]
+					vit_def += def1;
+					def1 = 0;
+				}
+#endif
 			}
 			else { //Mob-Pet vit-eq
 #ifndef RENEWAL

+ 43 - 60
src/map/skill.c

@@ -3699,49 +3699,35 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 		status_change_end(src, SC_HIDING, INVALID_TIMER);
 		// fall through
 	case MO_EXTREMITYFIST:
-		if( skill_id == MO_EXTREMITYFIST )
 		{
-			status_change_end(src, SC_EXPLOSIONSPIRITS, INVALID_TIMER);
-			status_change_end(src, SC_BLADESTOP, INVALID_TIMER);
+			short x, y, i = 2; // Move 2 cells for Issen(from target)
+			struct block_list *mbl = bl;
+			short dir = 0;
+
+			if( skill_id == MO_EXTREMITYFIST )
+			{
+				mbl = src;
+				i = 3; // for Asura(from caster)
+				status_change_end(src, SC_EXPLOSIONSPIRITS, INVALID_TIMER);
+				status_change_end(src, SC_BLADESTOP, INVALID_TIMER);
 #ifdef RENEWAL
-			sc_start(src,SC_EXTREMITYFIST2,100,skill_lv,skill_get_time(skill_id,skill_lv));
+				sc_start(src,SC_EXTREMITYFIST2,100,skill_lv,skill_get_time(skill_id,skill_lv));
 #endif
-		}
-		//Client expects you to move to target regardless of distance
-		{
-			struct unit_data *ud = unit_bl2ud(src);
-			short dx,dy;
-			int i,speed;
-			i = skill_id == MO_EXTREMITYFIST?1:2; //Move 2 cells for Issen, 1 for Asura
-			dx = bl->x - src->x;
-			dy = bl->y - src->y;
-			if (dx < 0) dx-=i;
-			else if (dx > 0) dx+=i;
-			if (dy < 0) dy-=i;
-			else if (dy > 0) dy+=i;
-			if (!dx && !dy) dy++;
-			if (map_getcell(src->m, src->x+dx, src->y+dy, CELL_CHKNOPASS))
-			{
-				dx = bl->x;
-				dy = bl->y;
-			} else {
-				dx = src->x + dx;
-				dy = src->y + dy;
 			}
-
 			skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
 
-			if(unit_walktoxy(src, dx, dy, 2) && ud) {
-				//Increase can't walk delay to not alter your walk path
-				ud->canmove_tick = tick;
-				speed = status_get_speed(src);
-				for (i = 0; i < ud->walkpath.path_len; i ++)
-				{
-					if(ud->walkpath.path[i]&1)
-						ud->canmove_tick+=7*speed/5;
-					else
-						ud->canmove_tick+=speed;
-				}
+			dir = map_calc_dir(src,bl->x,bl->y);
+			if( dir > 0 && dir < 4) x = -i;
+			else if( dir > 4 ) x = i;
+			else x = 0;
+			if( dir > 2 && dir < 6 ) y = -i;
+			else if( dir == 7 || dir < 2 ) y = i;
+			else y = 0;
+			if( (mbl == src || !map_flag_gvg(src->m) && !map[src->m].flag.battleground) && // only NJ_ISSEN don't have slide effect in GVG
+				unit_movepos(src, mbl->x+x, mbl->y+y, 1, 1) ) { 
+				clif_slide(src, src->x, src->y);
+				//uncomment this if you want to remove MO_EXTREMITYFIST glitchy walking effect. [malufett]
+				//clif_fixpos(src); 
 			}
 		}
 		break;
@@ -4140,11 +4126,11 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 			short x, y;
 			short dir = map_calc_dir(src,bl->x,bl->y);
 
-			if( dir > 4 ) x = -1;
-			else if( dir > 0 && dir < 4 ) x = 1;
+			if( dir > 0 && dir < 4) x = 2;
+			else if( dir > 4 ) x = -2;
 			else x = 0;
-			if( dir < 3 || dir > 5 ) y = -1;
-			else if( dir > 3 && dir < 5 ) y = 1;
+			if( dir > 2 && dir < 6 ) y = 2;
+			else if( dir == 7 || dir < 2 ) y = -2;
 			else y = 0;
 
 			if( unit_movepos(src, bl->x+x, bl->y+y, 1, 1) )
@@ -6915,7 +6901,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		}
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,
 			sc_start4(bl,type,100,skill_lv,skill_id,src->id,skill_get_time(skill_id,skill_lv),1000));
+#ifndef RENEWAL
 		if (sd) skill_blockpc_start (sd, skill_id, skill_get_time(skill_id, skill_lv)+3000);
+#endif
 		break;
 
 	case PF_MINDBREAKER:
@@ -7832,20 +7820,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		{
 			int rate = ( sd? sd->status.job_level : 50 ) / 4;
 
-			if(src == bl ) rate = 100; // Success Chance: On self, 100%
+			if( src == bl ) rate = 100; // Success Chance: On self, 100%
 			else if(bl->type == BL_PC) rate += 20 + 10 * skill_lv; // On Players, (20 + 10 * Skill Level) %
 			else rate += 40 + 10 * skill_lv; // On Monsters, (40 + 10 * Skill Level) %
+			
+			if( sd )
+				skill_blockpc_start(sd,skill_id,4000);
 
 			if( !(tsc && tsc->data[type]) ){
-				i = sc_start2(bl,type,rate,skill_lv,src->id,(src == bl)?5000:(bl->type == BL_PC)?skill_get_time(skill_id,skill_lv):skill_get_time2(skill_id, skill_lv));
-				clif_skill_nodamage(src,bl,skill_id,skill_lv,i);
+				if( i )
+					break;
 			}
-
-			if( sd && i )
-				skill_blockpc_start(sd,skill_id,4000); // Reuse Delay only activated on success
-			else if(sd)
-				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
-		}else if( sd )
+		}
+		if( sd )
 			clif_skill_fail(sd,skill_id,USESKILL_FAIL_TOTARGET,0);
 		break;
 
@@ -9368,16 +9355,8 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
 #endif
 		}
 		if (target && target->m == src->m)
-		{	//Move character to target anyway.
-			int dx,dy;
-			dx = target->x - src->x;
-			dy = target->y - src->y;
-			if(dx > 0) dx++;
-			else if(dx < 0) dx--;
-			if (dy > 0) dy++;
-			else if(dy < 0) dy--;
-
-			if (unit_movepos(src, src->x+dx, src->y+dy, 1, 1))
+		{	//Move character to target anyway.			
+			if (unit_movepos(src, src->x+3, src->y+3, 1, 1))
 			{	//Display movement + animation.
 				clif_slide(src,src->x,src->y);
 				clif_skill_damage(src,target,tick,sd->battle_status.amotion,0,0,1,ud->skill_id, ud->skill_lv, 5);
@@ -12750,7 +12729,11 @@ int skill_check_condition_castbegin(struct map_session_data* sd, short skill, sh
 			break;
 
 		case NJ_ISSEN:
+#ifdef RENEWAL
+			if (status->hp < (status->hp/100)) {
+#else
 			if (status->hp < 2) {
+#endif
 				clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0);
 				return 0;
 			}

+ 2 - 0
src/map/status.c

@@ -794,6 +794,8 @@ void initChangeTables(void) {
 	StatusIconChangeTable[SC_SPL_DEF] = SI_SPL_DEF;
 	StatusIconChangeTable[SC_MANU_MATK] = SI_MANU_MATK;
 	StatusIconChangeTable[SC_SPL_MATK] = SI_SPL_MATK;
+	StatusIconChangeTable[SC_ATKPOTION] = SI_PLUSATTACKPOWER;
+	StatusIconChangeTable[SC_MATKPOTION] = SI_PLUSMAGICPOWER;
 	//Cash Items
 	StatusIconChangeTable[SC_FOOD_STR_CASH] = SI_FOOD_STR_CASH;
 	StatusIconChangeTable[SC_FOOD_AGI_CASH] = SI_FOOD_AGI_CASH;

+ 2 - 2
src/map/status.h

@@ -807,8 +807,8 @@ enum si_type {
 	SI_ADRENALINE2		= 147,
 	SI_GHOSTWEAPON		= 148,
 	SI_SPIRIT		= 149,
-//	SI_PLUSATTACKPOWER = 150,
-//	SI_PLUSMAGICPOWER = 151,
+	SI_PLUSATTACKPOWER = 150,
+	SI_PLUSMAGICPOWER = 151,
 	SI_DEVIL		= 152,
 	SI_KAITE		= 153,
 //	SI_SWOO = 154,

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác