From de0374e0afa0fe11e5609d619a222754a5e879c5 Mon Sep 17 00:00:00 2001
From: rud0lp20 <rud0lp20@54d463be-8e91-2dee-dedb-b68131a5f0ec>
Date: Thu, 10 Jan 2013 18:17:32 +0000
Subject: Implemented official walk path dealing with obstacle.(bugreport:6159)
 -see 'src/config/core.h' for settings[OFFICIAL_WALKPATH]. Fixed
 bugreport:7057 where HP_ASSUMPTIO should only double eDEF & eMDEF.

git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@17091 54d463be-8e91-2dee-dedb-b68131a5f0ec
---
 src/map/battle.c |  9 ++++++++-
 src/map/status.c | 22 ++--------------------
 src/map/unit.c   | 15 ++++++++++-----
 3 files changed, 20 insertions(+), 26 deletions(-)

(limited to 'src/map')

diff --git a/src/map/battle.c b/src/map/battle.c
index 6f9595108..7b6bf5869 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -3137,7 +3137,10 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 			short vit_def;
 			defType def1 = status_get_def(target); //Don't use tstatus->def1 due to skill timer reductions.
 			short def2 = tstatus->def2;
-
+#ifdef RENEWAL
+			if( tsc && tsc->data[SC_ASSUMPTIO] )
+				def1 <<= 1; // only eDEF is doubled
+#endif
 			if( sd )
 			{
 				i = sd->ignore_def[is_boss(target)?RC_BOSS:RC_NONBOSS];
@@ -4081,6 +4084,10 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 		if(!flag.imdef){
 			defType mdef = tstatus->mdef;
 			int mdef2= tstatus->mdef2;
+#ifdef RENEWAL
+			if(tsc && tsc->data[SC_ASSUMPTIO])
+				mdef <<= 1; // only eMDEF is doubled
+#endif
 			if(sd) {
 				i = sd->ignore_mdef[is_boss(target)?RC_BOSS:RC_NONBOSS];
 				i+= sd->ignore_mdef[tstatus->race];
diff --git a/src/map/status.c b/src/map/status.c
index 357683c95..649cfa1ae 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -359,7 +359,7 @@ void initChangeTables(void) {
 	set_sc( LK_CONCENTRATION     , SC_CONCENTRATION   , SI_CONCENTRATION   , SCB_BATK|SCB_WATK|SCB_HIT|SCB_DEF|SCB_DEF2|SCB_MDEF|SCB_DSPD );
 	set_sc( LK_TENSIONRELAX      , SC_TENSIONRELAX    , SI_TENSIONRELAX    , SCB_REGEN );
 	set_sc( LK_BERSERK           , SC_BERSERK         , SI_BERSERK         , SCB_DEF|SCB_DEF2|SCB_MDEF|SCB_MDEF2|SCB_FLEE|SCB_SPEED|SCB_ASPD|SCB_MAXHP|SCB_REGEN );
-	set_sc( HP_ASSUMPTIO         , SC_ASSUMPTIO       , SI_ASSUMPTIO       , SCB_DEF|SCB_DEF2|SCB_MDEF|SCB_MDEF2 );
+	set_sc( HP_ASSUMPTIO         , SC_ASSUMPTIO       , SI_ASSUMPTIO       , SCB_NONE );
 	add_sc( HP_BASILICA          , SC_BASILICA        );
 	set_sc( HW_MAGICPOWER        , SC_MAGICPOWER      , SI_MAGICPOWER      , SCB_MATK );
 	add_sc( PA_SACRIFICE         , SC_SACRIFICE       );
@@ -468,7 +468,7 @@ void initChangeTables(void) {
 
 	set_sc( CASH_BLESSING        , SC_BLESSING        , SI_BLESSING        , SCB_STR|SCB_INT|SCB_DEX );
 	set_sc( CASH_INCAGI          , SC_INCREASEAGI     , SI_INCREASEAGI     , SCB_AGI|SCB_SPEED );
-	set_sc( CASH_ASSUMPTIO       , SC_ASSUMPTIO       , SI_ASSUMPTIO       , SCB_DEF|SCB_DEF2|SCB_MDEF|SCB_MDEF2 );
+	set_sc( CASH_ASSUMPTIO       , SC_ASSUMPTIO       , SI_ASSUMPTIO       , SCB_NONE );
 
 	set_sc( ALL_PARTYFLEE        , SC_PARTYFLEE       , SI_PARTYFLEE       , SCB_NONE );
 	set_sc( ALL_ODINS_POWER      , SC_ODINS_POWER     , SI_ODINS_POWER     , SCB_MATK|SCB_BATK|SCB_MDEF|SCB_DEF );
@@ -4893,10 +4893,6 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc,
 		def >>=1;
 	if(sc->data[SC_FREEZE])
 		def >>=1;
-#ifdef RENEWAL
-		if(sc->data[SC_ASSUMPTIO])
-		def *= 2;
-#endif
 	if(sc->data[SC_SIGNUMCRUCIS])
 		def -= def * sc->data[SC_SIGNUMCRUCIS]->val2/100;
 	if(sc->data[SC_CONCENTRATION])
@@ -4971,10 +4967,6 @@ static signed short status_calc_def2(struct block_list *bl, struct status_change
 		def2 -= def2 * 50/100;
 	if(sc->data[SC_PROVOKE])
 		def2 -= def2 * sc->data[SC_PROVOKE]->val4/100;
-#ifdef RENEWAL
-		if(sc->data[SC_ASSUMPTIO])
-		def2 *= 2;
-#endif
 	if(sc->data[SC_JOINTBEAT])
 		def2 -= def2 * ( sc->data[SC_JOINTBEAT]->val2&BREAK_SHOULDER ? 50 : 0 ) / 100
 			  + def2 * ( sc->data[SC_JOINTBEAT]->val2&BREAK_WAIST ? 25 : 0 ) / 100;
@@ -5030,12 +5022,6 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc,
 		mdef += sc->data[SC_STONEHARDSKIN]->val1;
 	if(sc->data[SC_WATER_BARRIER])
 		mdef += sc->data[SC_WATER_BARRIER]->val2;
-
-#ifdef RENEWAL
-		if(sc->data[SC_ASSUMPTIO])
-		mdef *= 2;
-#endif
-
 	if(sc->data[SC_STONE] && sc->opt1 == OPT1_STONE)
 		mdef += 25*mdef/100;
 	if(sc->data[SC_FREEZE])
@@ -5068,10 +5054,6 @@ static signed short status_calc_mdef2(struct block_list *bl, struct status_chang
 		return 0;
 	if(sc->data[SC_SKA])
 		return 90;
-#ifdef RENEWAL
-		if(sc->data[SC_ASSUMPTIO])
-		mdef2 *= 2;
-#endif
 	if(sc->data[SC_MINDBREAKER])
 		mdef2 -= mdef2 * sc->data[SC_MINDBREAKER]->val3/100;
 	if(sc->data[SC_ANALYZE])
diff --git a/src/map/unit.c b/src/map/unit.c
index e0dc69d15..0104e9a42 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -315,16 +315,21 @@ int unit_walktoxy( struct block_list *bl, short x, short y, int flag)
 {
 	struct unit_data* ud = NULL;
 	struct status_change* sc = NULL;
-
+#ifdef OFFICIAL_WALKPATH
+	struct walkpath_data wpd;
+#endif
 	nullpo_ret(bl);
 
 	ud = unit_bl2ud(bl);
 
 	if( ud == NULL) return 0;
-// disabled until we find the correct algorithm. [malufett]
-//#ifdef OFFICIAL_WALKPATH
-//	if( !path_search_long(NULL, bl->m, bl->x, bl->y, x, y, CELL_CHKWALL) ) return 0;
-//#endif
+
+#ifdef OFFICIAL_WALKPATH
+	if( path_search(&wpd, bl->m, bl->x, bl->y, x, y, flag&1, CELL_CHKNOPASS) // Check if there is an obstacle between
+		&& wpd.path_len > 14 ) // Official number of walkable cells is 14 if and only if there is an obstacle between. [malufett]
+		return 0;
+#endif
+
 	if (flag&4 && DIFF_TICK(ud->canmove_tick, gettick()) > 0 &&
 		DIFF_TICK(ud->canmove_tick, gettick()) < 2000)
   	{	// Delay walking command. [Skotlex]
-- 
cgit v1.2.3-70-g09d2