Forráskód Böngészése

Fixed Berserk

git-svn-id: https://svn.code.sf.net/p/rathena/svn/athena@232 54d463be-8e91-2dee-dedb-b68131a5f0ec
celest 20 éve
szülő
commit
e668edb2a8
5 módosított fájl, 26 hozzáadás és 19 törlés
  1. 1 0
      Changelog.txt
  2. 1 1
      src/map/battle.c
  3. 10 6
      src/map/pc.c
  4. 8 8
      src/map/skill.c
  5. 6 4
      src/map/skill.h

+ 1 - 0
Changelog.txt

@@ -4,6 +4,7 @@ Date	Added
         * Skill updates: [celest]
           - Removed annoying skill fail messages from rogue's Snatcher
           - Add sc_data check for firewall and fogwall
+          - Fixed Berserk (99% hopefully? ^_^)
 
 11/16
 	* Fix for compiling against gcc 2.95 [MouseJstr]

+ 1 - 1
src/map/battle.c

@@ -1068,7 +1068,7 @@ int battle_get_dmotion(struct block_list *bl)
 	else
 		return 2000;
 
-	if((sc_data && sc_data[SC_ENDURE].timer!=-1) ||
+	if((sc_data && (sc_data[SC_ENDURE].timer!=-1 || sc_data[SC_BERSERK].timer!=-1)) ||
 		(bl->type == BL_PC && ((struct map_session_data *)bl)->special_state.infinite_endure))
 		ret=0;
 

+ 10 - 6
src/map/pc.c

@@ -1626,9 +1626,9 @@ int pc_calcstatus(struct map_session_data* sd,int first)
 		sd->status.max_hp = sd->status.max_hp * 3;
 		// sd->status.hp = sd->status.hp * 3;
 		if(sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris
-		sd->status.max_hp = battle_config.max_hp;
+			sd->status.max_hp = battle_config.max_hp;
 		if(sd->status.hp > battle_config.max_hp) // removed negative max hp bug by Valaris
-		sd->status.hp = battle_config.max_hp;
+			sd->status.hp = battle_config.max_hp;
 	}
 	if(s_class.job == 23 && sd->status.base_level >= 99){
 		sd->status.max_hp = sd->status.max_hp + 2000;
@@ -1923,7 +1923,9 @@ int pc_calcstatus(struct map_session_data* sd,int first)
 		if(sd->sc_data[SC_BERSERK].timer!=-1) {	//All Def/MDef reduced to 0 while in Berserk [DracoRPG]
 			sd->def = sd->def2 = 0;
 			sd->mdef = sd->mdef2 = 0;
-			 sd->flee -= sd->flee*50/100;
+			sd->flee -= sd->flee*50/100;
+			aspd_rate -= 30;
+			sd->base_atk *= 3;
 		}
 		if(sd->sc_data[SC_KEEPING].timer!=-1)
 			sd->def = 100;
@@ -4976,7 +4978,7 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
 	}
 
 	// 歩 いていたら足を止める
-	if(sd->sc_data[SC_ENDURE].timer == -1 && !sd->special_state.infinite_endure)
+	if(sd->sc_data[SC_ENDURE].timer == -1 && sd->sc_data[SC_BERSERK].timer && !sd->special_state.infinite_endure)
 		pc_stop_walking(sd,3);
 	else if(sd->sc_data[SC_ENDURE].timer != -1 && src->type==BL_MOB)   // [Celest]
 		if((--sd->sc_data[SC_ENDURE].val2) <= 0)
@@ -6845,7 +6847,8 @@ static int pc_natural_heal_sp(struct map_session_data *sd)
 
 	nullpo_retr(0, sd);
 
-	if (sd->sc_data[SC_TRICKDEAD].timer != -1)		// Modified by RoVeRT
+	if (sd->sc_data[SC_TRICKDEAD].timer != -1 ||	// Modified by RoVeRT
+		sd->sc_data[SC_BERSERK].timer != -1)
 		return 0;
 
 	if(pc_checkoversp(sd)) {
@@ -7010,7 +7013,8 @@ static int pc_natural_heal_sub(struct map_session_data *sd,va_list ap) {
 		sd->hp_sub = sd->inchealhptick = 0;
 		sd->sp_sub = sd->inchealsptick = 0;
 	}
-	if((skill = pc_checkskill(sd,MO_SPIRITSRECOVERY)) > 0 && !pc_ishiding(sd) && sd->sc_data[SC_POISON].timer == -1 && sd->sc_data[SC_BERSERK].timer == -1){
+	if((skill = pc_checkskill(sd,MO_SPIRITSRECOVERY)) > 0 && !pc_ishiding(sd) &&
+		sd->sc_data[SC_POISON].timer == -1 && sd->sc_data[SC_BERSERK].timer == -1){
 		pc_spirit_heal_hp(sd,skill);
 		pc_spirit_heal_sp(sd,skill);
 	}

+ 8 - 8
src/map/skill.c

@@ -3061,7 +3061,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 	case LK_BERSERK:		/* バ?サ?ク */
 		clif_skill_nodamage(src,bl,skillid,skilllv,1);
 		skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
-		sd->status.hp = sd->status.max_hp * 3;
+		//sd->status.hp = sd->status.max_hp * 3;
 		break;
 	case MC_CHANGECART:
 		clif_skill_nodamage(src,bl,skillid,skilllv,1);
@@ -7852,7 +7852,6 @@ int skill_status_change_end(struct block_list* bl, int type, int tid)
 			case SC_BERSERK:			/* バ?サ?ク */
 				calc_flag = 1;
 				clif_status_change(bl,SC_INCREASEAGI,0);	/* アイコン消去 */
-				skill_status_change_end(bl,SC_ENDURE,-1);
 				break;
 			case SC_DEVOTION:		/* ディボ?ション */
 				{
@@ -8353,8 +8352,8 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data)
 		break;
 	case SC_BERSERK:		/* バ?サ?ク */
 		if(sd){		/* HPが100以上なら?? */
-			if( (sd->status.hp - sd->status.hp/100) > 100 ){	// 5% every 10 seconds [DracoRPG]
-				sd->status.hp -= sd->status.hp*5/100;
+			if( (sd->status.hp - sd->status.max_hp*5/100) > 100 ){	// 5% every 10 seconds [DracoRPG]
+				sd->status.hp -= sd->status.max_hp*5/100;	// changed to max hp [celest]
 				clif_updatestatus(sd,SP_HP);
 				sc_data[type].timer = add_timer(	/* タイマ?再設定 */
 					10000+tick, skill_status_change_timer,
@@ -9076,13 +9075,14 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
 			break;
 		case SC_BERSERK:		/* バ?サ?ク */
 			if(sd){
-				sd->status.sp = 0;
+				sd->status.hp = sd->status.max_hp * 3;
+				sd->status.sp = 0;				
+				clif_updatestatus(sd,SP_HP);
 				clif_updatestatus(sd,SP_SP);
-				clif_status_change(bl,SC_INCREASEAGI,1);	/* アイコン表示 */
-				skill_status_change_start(bl,SC_ENDURE,10,0,0,0,tick,0 );	// celest
+				clif_status_change(bl,SC_INCREASEAGI,1);	/* アイコン表示 */				
 			}
 			*opt3 |= 128;
-			tick = 1000;
+			tick = 10000;
 			calc_flag = 1;
 			break;
 		case SC_ASSUMPTIO:		/* アスムプティオ */

+ 6 - 4
src/map/skill.h

@@ -332,10 +332,12 @@ enum {	// struct map_session_data 
 	SC_MINDBREAKER		=191,
 	SC_SPELLBREAKER		=192,
 
-	SC_EDP				= 114, // [Celest]
-	SC_MARIONETTE2      = 122, // marionette target
-	SC_BLEEDING         = 124, // temporarily same id as headcrush
-	SC_POISON2			= 193, // for EDP
+// [Celest]
+	SC_EDP				= 114, // 
+	SC_MARIONETTE2      = 122, // Marionette target
+	SC_BLEEDING         = 124, // Temporarily same id as headcrush
+	SC_POISON2			= 193, // for EDP -- notes: Not implemented since damage unknown yet
+	SC_GRIMTOOTH        = 194, // for grimtooth's slowdown
 
 // -- testing various SC effects
 //	SC_AURABLADE			=81,