Browse Source

Fixed bugreport:6038 WM_REVERBERATION behavior should now work properly.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@16312 54d463be-8e91-2dee-dedb-b68131a5f0ec
rud0lp20 13 years ago
parent
commit
21507c7b77
4 changed files with 30 additions and 13 deletions
  1. 3 3
      db/pre-re/skill_db.txt
  2. 3 3
      db/re/skill_db.txt
  3. 9 0
      src/map/battle.c
  4. 15 7
      src/map/skill.c

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

@@ -920,9 +920,9 @@
 // WM Wanderer/Minstrel
 // WM Wanderer/Minstrel
 2412,0,0,0,0,0,0,10,0,no,0,0,0,none,0,		WM_LESSON,Lesson
 2412,0,0,0,0,0,0,10,0,no,0,0,0,none,0,		WM_LESSON,Lesson
 2413,9,8,1,-1,0,0,5,-2:-2:-3:-3:-4,yes,0,0,0,magic,0,	WM_METALICSOUND,Metallic Sound
 2413,9,8,1,-1,0,0,5,-2:-2:-3:-3:-4,yes,0,0,0,magic,0,	WM_METALICSOUND,Metallic Sound
-2414,9,6,2,-1,0x3,1,5,1,yes,0,0x80,3,none,0,	WM_REVERBERATION,Reverberation //CHECK May need to recode. Testing needed.
-2415,0,6,1,-1,0x2,1,5,1,no,0,0,0,weapon,0,	WM_REVERBERATION_MELEE,Reverberation Melee
-2416,0,6,1,-1,0x2,1,5,1,no,0,0,0,magic,0,	WM_REVERBERATION_MAGIC,Reverberation Magic
+2414,9,6,2,-1,0x3,1,5,1,yes,0,0x80,3,none,0,	WM_REVERBERATION,Reverberation 
+2415,0,6,1,-1,0x6,1,5,1,no,0,0,0,weapon,0,	WM_REVERBERATION_MELEE,Reverberation Melee
+2416,0,6,1,0,0x6,1,5,1,no,0,0,0,magic,0,	WM_REVERBERATION_MAGIC,Reverberation Magic
 2417,11,6,2,0,0x3,5,1,1,no,0,0,0,none,0,	WM_DOMINION_IMPULSE,Dominion Impulse
 2417,11,6,2,0,0x3,5,1,1,no,0,0,0,none,0,	WM_DOMINION_IMPULSE,Dominion Impulse
 2418,9,6,2,-1,0x1,0,5,1,yes,0,0,0,none,0,	WM_SEVERE_RAINSTORM,Severe Rainstorm
 2418,9,6,2,-1,0x1,0,5,1,yes,0,0,0,none,0,	WM_SEVERE_RAINSTORM,Severe Rainstorm
 2419,9,6,2,0,0x3,1,5,1,yes,0,0x80,5,none,0,	WM_POEMOFNETHERWORLD,Poem of The Netherworld //CHECK May need to recode too.
 2419,9,6,2,0,0x3,1,5,1,yes,0,0x80,5,none,0,	WM_POEMOFNETHERWORLD,Poem of The Netherworld //CHECK May need to recode too.

+ 3 - 3
db/re/skill_db.txt

@@ -921,9 +921,9 @@
 // WM Wanderer/Minstrel
 // WM Wanderer/Minstrel
 2412,0,0,0,0,0,0,10,0,no,0,0,0,none,0,		WM_LESSON,Lesson
 2412,0,0,0,0,0,0,10,0,no,0,0,0,none,0,		WM_LESSON,Lesson
 2413,9,8,1,-1,0,0,5,-2:-2:-3:-3:-4,yes,0,0,0,magic,0,	WM_METALICSOUND,Metallic Sound
 2413,9,8,1,-1,0,0,5,-2:-2:-3:-3:-4,yes,0,0,0,magic,0,	WM_METALICSOUND,Metallic Sound
-2414,9,6,2,-1,0x3,1,5,1,yes,0,0x80,3,none,0,	WM_REVERBERATION,Reverberation //CHECK May need to recode. Testing needed.
-2415,0,6,1,-1,0x2,1,5,1,no,0,0,0,weapon,0,	WM_REVERBERATION_MELEE,Reverberation Melee
-2416,0,6,1,-1,0x2,1,5,1,no,0,0,0,magic,0,	WM_REVERBERATION_MAGIC,Reverberation Magic
+2414,9,6,2,-1,0x3,1,5,1,yes,0,0x80,3,none,0,	WM_REVERBERATION,Reverberation
+2415,0,6,1,-1,0x6,1,5,1,no,0,0,0,weapon,0,	WM_REVERBERATION_MELEE,Reverberation Melee
+2416,0,6,1,0,0x6,1,5,1,no,0,0,0,magic,0,	WM_REVERBERATION_MAGIC,Reverberation Magic
 2417,11,6,2,0,0x3,5,1,1,no,0,0,0,none,0,	WM_DOMINION_IMPULSE,Dominion Impulse
 2417,11,6,2,0,0x3,5,1,1,no,0,0,0,none,0,	WM_DOMINION_IMPULSE,Dominion Impulse
 2418,9,6,2,-1,0x1,0,5,1,yes,0,0,0,none,0,	WM_SEVERE_RAINSTORM,Severe Rainstorm
 2418,9,6,2,-1,0x1,0,5,1,yes,0,0,0,none,0,	WM_SEVERE_RAINSTORM,Severe Rainstorm
 2419,9,6,2,0,0x3,1,5,1,yes,0,0x80,5,none,0,	WM_POEMOFNETHERWORLD,Poem of The Netherworld //CHECK May need to recode too.
 2419,9,6,2,0,0x3,1,5,1,yes,0,0x80,5,none,0,	WM_POEMOFNETHERWORLD,Poem of The Netherworld //CHECK May need to recode too.

+ 9 - 0
src/map/battle.c

@@ -1274,6 +1274,11 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 	flag.rh=1;
 	flag.rh=1;
 	flag.weapon=1;
 	flag.weapon=1;
 	flag.infdef=(tstatus->mode&MD_PLANT&&skill_num!=RA_CLUSTERBOMB?1:0);
 	flag.infdef=(tstatus->mode&MD_PLANT&&skill_num!=RA_CLUSTERBOMB?1:0);
+	if( target->type == BL_SKILL){
+		TBL_SKILL *su = (TBL_SKILL*)target;
+		if( su->group && su->group->skill_id == WM_REVERBERATION)
+			flag.infdef = 1;
+	}
 
 
 	//Initial Values
 	//Initial Values
 	wd.type=0; //Normal attack
 	wd.type=0; //Normal attack
@@ -2326,7 +2331,9 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 					skillratio += 200 * skill_lv -100;
 					skillratio += 200 * skill_lv -100;
 					break;
 					break;
 				case WM_REVERBERATION_MELEE:
 				case WM_REVERBERATION_MELEE:
+					// ATK [{(Skill Level x 100) + 300} x Caster’s Base Level / 100]
 					skillratio += 200 + 100 * pc_checkskill(sd, WM_REVERBERATION);
 					skillratio += 200 + 100 * pc_checkskill(sd, WM_REVERBERATION);
+					RE_LVL_DMOD(100);
 					break;
 					break;
 				case WM_SEVERE_RAINSTORM_MELEE:
 				case WM_SEVERE_RAINSTORM_MELEE:
 					skillratio = 50 + 50 * skill_lv;
 					skillratio = 50 + 50 * skill_lv;
@@ -3570,7 +3577,9 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 						skillratio += 50 * skill_lv;
 						skillratio += 50 * skill_lv;
 						break;
 						break;
 					case WM_REVERBERATION_MAGIC:
 					case WM_REVERBERATION_MAGIC:
+						// MATK [{(Skill Level x 100) + 100} x Caster’s Base Level / 100] %
 						skillratio += 100 * (sd ? pc_checkskill(sd, WM_REVERBERATION) : 1);
 						skillratio += 100 * (sd ? pc_checkskill(sd, WM_REVERBERATION) : 1);
+						RE_LVL_DMOD(100);
 						break;
 						break;
 					case SO_FIREWALK: {
 					case SO_FIREWALK: {
 						struct status_change * sc = status_get_sc(src);
 						struct status_change * sc = status_get_sc(src);

+ 15 - 7
src/map/skill.c

@@ -3123,7 +3123,7 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
 					break;
 					break;
 				case WM_REVERBERATION_MELEE:
 				case WM_REVERBERATION_MELEE:
 				case WM_REVERBERATION_MAGIC:
 				case WM_REVERBERATION_MAGIC:
-					skill_attack(skill_get_type(skl->skill_id),src, src, target, skl->skill_id, skl->skill_lv, 0, SD_LEVEL);
+					skill_castend_damage_id(src, target, skl->skill_id, skl->skill_lv, tick, skl->flag|SD_LEVEL); // damage should split among targets
 					break;
 					break;
 				case SC_FATALMENACE:
 				case SC_FATALMENACE:
 					if( src == target ) // Casters Part
 					if( src == target ) // Casters Part
@@ -3245,6 +3245,7 @@ static int skill_ative_reverberation( struct block_list *bl, va_list ap) {
 		return 0;
 		return 0;
 	if( su->alive && (sg = su->group) && sg->skill_id == WM_REVERBERATION ) {
 	if( su->alive && (sg = su->group) && sg->skill_id == WM_REVERBERATION ) {
 		clif_changetraplook(bl, UNT_USED_TRAPS);
 		clif_changetraplook(bl, UNT_USED_TRAPS);
+		map_foreachinrange(skill_trap_splash, bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, bl, gettick());
 		su->limit=DIFF_TICK(gettick(),sg->tick)+1500;
 		su->limit=DIFF_TICK(gettick(),sg->tick)+1500;
 		sg->unit_id = UNT_USED_TRAPS;
 		sg->unit_id = UNT_USED_TRAPS;
 	}
 	}
@@ -3640,8 +3641,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 	case SR_RAMPAGEBLASTER:
 	case SR_RAMPAGEBLASTER:
 	case SR_WINDMILL:
 	case SR_WINDMILL:
 	case SR_RIDEINLIGHTNING:
 	case SR_RIDEINLIGHTNING:
-	case WM_REVERBERATION:
 	case WM_SOUND_OF_DESTRUCTION:
 	case WM_SOUND_OF_DESTRUCTION:
+	case WM_REVERBERATION_MELEE:
+	case WM_REVERBERATION_MAGIC:
 	case SO_VARETYR_SPEAR:
 	case SO_VARETYR_SPEAR:
 	case GN_CART_TORNADO:
 	case GN_CART_TORNADO:
 	case GN_CARTCANNON:			
 	case GN_CARTCANNON:			
@@ -10416,7 +10418,7 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, short skilli
 			val2 = 0;
 			val2 = 0;
 			break;
 			break;
 		case WM_REVERBERATION:
 		case WM_REVERBERATION:
-			val1 = 1;
+			val1 = 1 + skilllv;
 			break;
 			break;
 		case GN_WALLOFTHORN:
 		case GN_WALLOFTHORN:
 			val1 = 1000 * skilllv;	// Need official value. [LimitLine]
 			val1 = 1000 * skilllv;	// Need official value. [LimitLine]
@@ -11183,6 +11185,7 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 			clif_changetraplook(&src->bl,UNT_USED_TRAPS);
 			clif_changetraplook(&src->bl,UNT_USED_TRAPS);
 			map_foreachinrange(skill_trap_splash,&src->bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &src->bl,tick);
 			map_foreachinrange(skill_trap_splash,&src->bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &src->bl,tick);
 			sg->limit = DIFF_TICK(tick,sg->tick) + 1500;
 			sg->limit = DIFF_TICK(tick,sg->tick) + 1500;
+			sg->unit_id = UNT_USED_TRAPS;
 			break;
 			break;
 
 
 		case UNT_SEVERE_RAINSTORM:
 		case UNT_SEVERE_RAINSTORM:
@@ -13997,8 +14000,8 @@ static int skill_trap_splash (struct block_list *bl, va_list ap)
 				clif_skill_damage(src,bl,tick,0,0,-30000,1,sg->skill_id,sg->skill_lv,5);
 				clif_skill_damage(src,bl,tick,0,0,-30000,1,sg->skill_id,sg->skill_lv,5);
 			break;
 			break;
 		case UNT_REVERBERATION:
 		case UNT_REVERBERATION:
-			skill_attack(BF_WEAPON,ss,src,bl,WM_REVERBERATION_MELEE,sg->skill_lv,tick,0);
-			skill_addtimerskill(ss,tick+200,bl->id,0,0,WM_REVERBERATION_MAGIC,sg->skill_lv,BF_MAGIC,SD_LEVEL);
+			skill_addtimerskill(ss,tick+50,bl->id,0,0,WM_REVERBERATION_MELEE,sg->skill_lv,BF_WEAPON,SD_LEVEL); // for proper skill delay animation when use with Dominion Impulse
+			skill_addtimerskill(ss,tick+250,bl->id,0,0,WM_REVERBERATION_MAGIC,sg->skill_lv,BF_MAGIC,SD_LEVEL);
 			break;
 			break;
 		case UNT_SEVERE_RAINSTORM:
 		case UNT_SEVERE_RAINSTORM:
 			skill_attack(BF_WEAPON,ss,ss,bl,WM_SEVERE_RAINSTORM_MELEE,sg->skill_lv,tick,0);
 			skill_attack(BF_WEAPON,ss,ss,bl,WM_SEVERE_RAINSTORM_MELEE,sg->skill_lv,tick,0);
@@ -14710,8 +14713,13 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
 				}
 				}
 				break;
 				break;
 			case UNT_REVERBERATION:
 			case UNT_REVERBERATION:
-				if( unit->val1 <= 0 )
-					unit->limit = DIFF_TICK(tick + 700,group->tick);
+				if( unit->val1 <= 0 ){
+					clif_changetraplook(bl,UNT_USED_TRAPS);
+					map_foreachinrange(skill_trap_splash, bl, skill_get_splash(group->skill_id, group->skill_lv), group->bl_flag, bl, tick);
+					group->limit = DIFF_TICK(tick,group->tick) + 1500;
+					unit->limit = DIFF_TICK(tick,group->tick) + 1500;
+					group->unit_id = UNT_USED_TRAPS;
+				}
 				break;
 				break;
 			case UNT_WALLOFTHORN:
 			case UNT_WALLOFTHORN:
 				if( unit->val1 <= 0 ) {
 				if( unit->val1 <= 0 ) {