Ver código fonte

* Fixed TaTaMiGaEShi(Improvised Defense) not working.
* Implemented new cooking success formula. Now cooking experience starts at 0.(bugreport:2439)

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

Inkfish 16 anos atrás
pai
commit
a936c021c7
5 arquivos alterados com 36 adições e 31 exclusões
  1. 3 0
      Changelog-Trunk.txt
  2. 1 0
      sql-files/upgrade_svn13881.sql
  3. 4 4
      src/map/pc.c
  4. 1 1
      src/map/pc.h
  5. 27 26
      src/map/skill.c

+ 3 - 0
Changelog-Trunk.txt

@@ -3,6 +3,9 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+09/06/11
+	* Fixed TaTaMiGaEShi(Improvised Defense) not working. [Inkfish]
+	* Implemented new cooking success formula. Now cooking experience starts at 0.(bugreport:2439) [Inkfish]
 09/06/09
 	* Fixed applying autocasts with negative rate before the positive one made it fail to remove the autocast. [Inkfish]
 09/06/08

+ 1 - 0
sql-files/upgrade_svn13881.sql

@@ -0,0 +1 @@
+DELETE FROM `global_reg_value` WHERE `str`='COOKING_ATTEMPT';

+ 4 - 4
src/map/pc.c

@@ -972,7 +972,7 @@ int pc_reg_received(struct map_session_data *sd)
 	sd->kafraPoints = pc_readaccountreg(sd,"#KAFRAPOINTS");
 
 	// Cooking Exp
-	sd->cooking_attempt = pc_readglobalreg(sd,"COOKING_ATTEMPT");
+	sd->cook_mastery = pc_readglobalreg(sd,"COOK_MASTERY");
 
 	if( (sd->class_&MAPID_BASEMASK) == MAPID_TAEKWON )
 	{ // Better check for class rather than skill to prevent "skill resets" from unsetting this
@@ -6445,10 +6445,10 @@ int pc_setregistry(struct map_session_data *sd,const char *reg,int val,int type)
 			if( i )
 				status_calc_pc(sd,0); // Lost the bonus.
 		}
-		else if( !strcmp(reg,"COOKING_ATTEMPT") && sd->cooking_attempt != val )
+		else if( !strcmp(reg,"COOK_MASTERY") && sd->cook_mastery != val )
 		{
-			val = cap_value(val, 0, 400);
-			sd->cooking_attempt = val;
+			val = cap_value(val, 0, 1999);
+			sd->cook_mastery = val;
 		}
 		sd_reg = sd->save_reg.global;
 		max = &sd->save_reg.global_num;

+ 1 - 1
src/map/pc.h

@@ -177,7 +177,7 @@ struct map_session_data {
 	short skillitem,skillitemlv;
 	short skillid_old,skilllv_old;
 	short skillid_dance,skilllv_dance;
-	short cooking_attempt; // max: 400 [Inkfish]
+	short cook_mastery; // range: [0,1999] [Inkfish]
 	unsigned char blockskill[MAX_SKILL];
 	int cloneskill_id;
 	int menuskill_id, menuskill_val;

+ 27 - 26
src/map/skill.c

@@ -6333,7 +6333,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
 		}
 		break;
 	case NJ_SHADOWJUMP:
-	{
 		if( !map_flag_gvg(src->m) && !map[src->m].flag.battleground )
 		{	//You don't move on GVG grounds.
 			unit_movepos(src, x, y, 1, 0);
@@ -6341,7 +6340,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
 		}
 		if (sc && sc->data[SC_HIDING])
 			status_change_end(src, SC_HIDING, -1);
-	}
 		break;
 	case AM_SPHEREMINE:
 	case AM_CANNIBALIZE:
@@ -10425,17 +10423,6 @@ static int skill_unit_timer_sub (DBKey key, void* data, va_list ap)
 					}
 				}
 				break;
-			case UNT_TATAMIGAESHI:
-				if( unit->range >= 0 )
-				{	//Disable processed cell.
-					unit->range = -1;
-					if (--group->val1 <= 0) // number of live cells
-	  				{	//All tiles were processed, disable skill.
-						group->target_flag=BCT_NOONE;
-						group->bl_flag= BL_NUL;
-					}
-				}
-				break;
 		}
 	}
 
@@ -10455,10 +10442,14 @@ static int skill_unit_timer_sub (DBKey key, void* data, va_list ap)
 		if(unit->range == -1) //Unit disabled, but it should not be deleted yet.
 			group->unit_id = UNT_USED_TRAPS;
 
-		if( !unit->alive )
+		if( group->unit_id == UNT_TATAMIGAESHI )
 		{
-			if( dissonance ) skill_dance_switch(unit, 1);
-			return 0;
+			unit->range = -1; //Disable processed cell.
+			if (--group->val1 <= 0) // number of live cells
+	  		{	//All tiles were processed, disable skill.
+				group->target_flag=BCT_NOONE;
+				group->bl_flag= BL_NUL;
+			}
 		}
 	}
 
@@ -10774,6 +10765,7 @@ int skill_produce_mix (struct map_session_data *sd, int skill_id, int nameid, in
 {
 	int slot[3];
 	int i,sc,ele,idx,equip,wlv,make_per,flag;
+	int num = -1; // exclude the recipe
 	struct status_data *status;
 
 	nullpo_retr(0, sd);
@@ -10815,6 +10807,7 @@ int skill_produce_mix (struct map_session_data *sd, int skill_id, int nameid, in
 		int j,id,x;
 		if( (id=skill_produce_db[idx].mat_id[i]) <= 0 )
 			continue;
+		num++;
 		x=qty*skill_produce_db[idx].mat_amount[i];
 		do{
 			int y=0;
@@ -10917,12 +10910,14 @@ int skill_produce_mix (struct map_session_data *sd, int skill_id, int nameid, in
 					if (sd->menuskill_val >= 15) //Legendary Cooking Set.
 						make_per = 10000; //100% Success
 					else
-						make_per = 1200*(sd->menuskill_val-10) //12% chance per set level.
-							+ 1000 - 500*(skill_produce_db[idx].itemlv-10) //10% - 5% per dish level
-							+ 20*status->dex + 10*status->luk //0.2% per DEX, 0.1% per LUK
-							+ 5*sd->cooking_attempt; //+0.05% per try
-					if( sd->cooking_attempt < 400 )
-						pc_setglobalreg(sd, "COOKING_ATTEMPT", sd->cooking_attempt+1);
+						make_per = 1200 * (sd->menuskill_val - 10)
+							+ 20  * (sd->status.base_level + 1)
+							+ 20  * (status->dex + 1)
+							+ 100 * (rand()%(30+5*(sd->cook_mastery/400) - (6+sd->cook_mastery/80)) + (6+sd->cook_mastery/80))
+							- 400 * (skill_produce_db[idx].itemlv - 11 + 1)
+							- 10  * (100 - status->luk + 1)
+							- 500 * (num - 1)
+							- 100 * (rand()%4 + 1);
 					break;
 				}
 				make_per = 5000;
@@ -11056,9 +11051,12 @@ int skill_produce_mix (struct map_session_data *sd, int skill_id, int nameid, in
 					clif_misceffect(&sd->bl,3);
 					break;
 				default: //Those that don't require a skill?
-					if (skill_produce_db[idx].itemlv>10 &&
-						skill_produce_db[idx].itemlv<= 20) //Cooking items.
+					if( skill_produce_db[idx].itemlv > 10 && skill_produce_db[idx].itemlv <= 20)
+					{ //Cooking items.
 						clif_specialeffect(&sd->bl, 608, AREA);
+						if( sd->cook_mastery < 1999 )
+							pc_setglobalreg(sd, "COOK_MASTERY",sd->cook_mastery + ( 1 << ( (skill_produce_db[idx].itemlv - 11) / 2 ) ) * 5);
+					}
 					break;
 			}
 		}
@@ -11097,9 +11095,12 @@ int skill_produce_mix (struct map_session_data *sd, int skill_id, int nameid, in
 				clif_misceffect(&sd->bl,2);
 				break;
 			default:
-				if (skill_produce_db[idx].itemlv>10 &&
-					skill_produce_db[idx].itemlv<= 20) //Cooking items.
+				if( skill_produce_db[idx].itemlv > 10 && skill_produce_db[idx].itemlv <= 20 )
+				{ //Cooking items.
 					clif_specialeffect(&sd->bl, 609, AREA);
+					if( sd->cook_mastery > 0 )
+						pc_setglobalreg(sd, "COOK_MASTERY", sd->cook_mastery - ( 1 << ((skill_produce_db[idx].itemlv - 11) / 2) ) - ( ( ( 1 << ((skill_produce_db[idx].itemlv - 11) / 2) ) >> 1 ) * 3 ));
+				}
 		}
 	}
 	return 0;