Sfoglia il codice sorgente

Added @skilltree

git-svn-id: https://svn.code.sf.net/p/rathena/svn/athena@365 54d463be-8e91-2dee-dedb-b68131a5f0ec
amber 20 anni fa
parent
commit
7c07adbd28
8 ha cambiato i file con 147 aggiunte e 49 eliminazioni
  1. 1 0
      Changelog.txt
  2. 3 0
      conf-tmpl/atcommand_athena.conf
  3. 86 0
      src/map/atcommand.c
  4. 1 0
      src/map/atcommand.h
  5. 51 46
      src/map/pc.c
  6. 3 1
      src/map/pc.h
  7. 1 1
      src/map/skill.c
  8. 1 1
      src/map/skill.h

+ 1 - 0
Changelog.txt

@@ -1,5 +1,6 @@
 Date	Added
 11/25
+	* Added @skilltree to help GM's answer skill tree questions [MouseJstr]
 	* Update Spider Web; I believe you cannot use it on yourself now. [Codemaster]
         * Added Ore Discovery, and base code for Slim Pitcher and Preservation [celest]
 

+ 3 - 0
conf-tmpl/atcommand_athena.conf

@@ -284,6 +284,9 @@ skillid: 40
 // use a skill by id
 useskill: 40
 
+// What skills are required to get this skill
+skilltree: 40
+
 // make another player killable
 charkillable: 40
 

+ 86 - 0
src/map/atcommand.c

@@ -230,6 +230,8 @@ ATCOMMAND_FUNC(sound); // [Valaris]
 ATCOMMAND_FUNC(refreshonline); // [Valaris]
 #endif /* TXT_ONLY */
 
+ATCOMMAND_FUNC(skilltree); // by MouseJstr
+
 /*==========================================
  *AtCommandInfo atcommand_info[]�\‘¢‘̂̒è‹`
  *------------------------------------------
@@ -480,6 +482,7 @@ static AtCommandInfo atcommand_info[] = {
 	{ AtCommand_RefreshOnline,		"@refreshonline",	99, atcommand_refreshonline }, // [Valaris]
 
 #endif /* TXT_ONLY */
+	{ AtCommand_SkillTree,		"@skilltree",	40, atcommand_skilltree }, // [MouseJstr]
 
 // add new commands before this line
 	{ AtCommand_Unknown,             NULL,                1, NULL }
@@ -7142,6 +7145,7 @@ atcommand_skillid(const int fd, struct map_session_data* sd,
         }
         return 0;
 }
+
 /*==========================================
  * @useskill by [MouseJstr]
  *
@@ -7177,6 +7181,88 @@ atcommand_useskill(const int fd, struct map_session_data* sd,
 
 	return 0;
 }
+
+/*==========================================
+ * @skilltree by [MouseJstr]
+ *
+ * prints the skill tree for a player required to get to a skill
+ *------------------------------------------
+ */
+int
+atcommand_skilltree(const int fd, struct map_session_data* sd,
+	const char* command, const char* message)
+{
+  struct map_session_data *pl_sd = NULL;
+  int skillnum, skillidx = -1;
+  int meets = 1, j, c=0, s=0;
+  struct pc_base_job s_class;
+  char target[255], *tbl;
+  char output[255];
+
+  if (!message || !*message)
+    return -1;
+
+  if(sscanf(message, "%d %[^\r\n]", &skillnum, target) != 2) {
+    clif_displaymessage(fd, "Usage: @skilltree <skillnum> <target>");
+    return -1;
+  }
+  if((pl_sd=map_nick2sd(target)) == NULL) 
+    return -1;
+
+  s_class = pc_calc_base_job(pl_sd->status.class);
+  c = s_class.job;
+  s = s_class.upper;
+
+  c = pc_calc_skilltree_normalize_job(c, pl_sd);
+
+  tbl = job_name(c);
+
+  sprintf(output, "Player is using %s %s skill tree (%d basic points)",  
+	  s_class.upper ? "upper" : "lower", 
+	  tbl, pc_checkskill(pl_sd, 1));
+  clif_displaymessage(fd, output);
+
+  for (j = 0; j < MAX_SKILL; j++) {
+    if (skill_tree[s][c][j].id == skillnum) {
+      skillidx = j;
+      break;
+    }
+  }
+ 
+  if (skillidx == -1) {
+    sprintf(output, "I do not believe the player can use that skill");
+    clif_displaymessage(fd, output);
+    return 0;
+  }
+
+  struct skill_tree_entry *ent = &skill_tree[s][c][skillidx];
+
+  for(j=0;j<5;j++) 
+    if( ent->need[j].id &&
+	pc_checkskill(sd,ent->need[j].id) < ent->need[j].lv) 
+      {
+	int idx = 0;
+	char *desc;
+        while (skill_names[idx].id != 0 && skill_names[idx].id != ent->need[j].id) 
+		idx++;
+	if (skill_names[idx].id == 0)
+		desc = "Unknown skill";
+	else
+		desc = skill_names[idx].desc;
+	sprintf(output, "player requires level %d of skill %s",  
+		ent->need[j].lv,  desc);
+	clif_displaymessage(fd, output);
+	meets = 0;
+      }
+
+  if (meets == 1) {
+    sprintf(output, "I believe the player meets all the requirements for that skill");
+    clif_displaymessage(fd, output);
+  }
+            
+  return 0;
+}
+
 /*==========================================
  * It is made to rain.
  *------------------------------------------

+ 1 - 0
src/map/atcommand.h

@@ -214,6 +214,7 @@ enum AtCommandType {
 	AtCommand_RefreshOnline, // [Valaris]
 	// SQL-only commands end
 #endif
+	AtCommand_SkillTree, // by MouseJstr
 	
 	// end
 	AtCommand_Unknown,

+ 51 - 46
src/map/pc.c

@@ -913,6 +913,56 @@ int pc_calc_skilltree(struct map_session_data *sd)
 	//s = (s_class.upper==1) ? 1 : 0 ; //?生以外は通常のスキル?
 	s = s_class.upper;
 
+	c = pc_calc_skilltree_normalize_job(c, sd);
+
+	for(i=0;i<MAX_SKILL;i++){
+		if (sd->status.skill[i].flag != 13) sd->status.skill[i].id=0;
+		if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){	// cardスキルなら、
+			sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2;	// 本?のlvに
+			sd->status.skill[i].flag=0;	// flagは0にしておく
+		}
+	}
+
+	if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){
+		// 全てのスキル
+		for(i=1;i<158;i++)
+			sd->status.skill[i].id=i;
+		for(i=210;i<291;i++)
+			sd->status.skill[i].id=i;
+		for(i=304;i<337;i++){
+			if(i==331) continue;
+			sd->status.skill[i].id=i;
+		}
+		if(battle_config.enable_upper_class){ //confで無?でなければ?み?む
+		for(i=355;i<MAX_SKILL;i++)
+			sd->status.skill[i].id=i;
+		}
+	}else{
+		// 通常の計算
+		do{
+			flag=0;
+			for(i=0;(id=skill_tree[s][c][i].id)>0;i++){
+				int j,f=1;
+				if(!battle_config.skillfree) {
+					for(j=0;j<5;j++) {
+						if( skill_tree[s][c][i].need[j].id &&
+							pc_checkskill(sd,skill_tree[s][c][i].need[j].id) < skill_tree[s][c][i].need[j].lv)
+							f=0;
+					}
+				}
+				if(f && sd->status.skill[id].id==0 ){
+					sd->status.skill[id].id=id;
+					flag=1;
+				}
+			}
+		}while(flag);
+	}
+//	if(battle_config.etc_log)
+//		printf("calc skill_tree\n");
+	return 0;
+}
+
+int pc_calc_skilltree_normalize_job(int c, struct map_session_data *sd) {
 	//if((battle_config.skillup_limit) && ((c >= 0 && c < 23) || (c >= 4001 && c < 4023) || (c >= 4023 && c < 4045))) {
 	if (battle_config.skillup_limit && c >= 0 && c < 23) {
 		int skill_point = pc_calc_skillpoint(sd);
@@ -1000,52 +1050,7 @@ int pc_calc_skilltree(struct map_session_data *sd)
 			}
 		}
 	}
-
-	for(i=0;i<MAX_SKILL;i++){
-		if (sd->status.skill[i].flag != 13) sd->status.skill[i].id=0;
-		if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){	// cardスキルなら、
-			sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2;	// 本?のlvに
-			sd->status.skill[i].flag=0;	// flagは0にしておく
-		}
-	}
-
-	if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){
-		// 全てのスキル
-		for(i=1;i<158;i++)
-			sd->status.skill[i].id=i;
-		for(i=210;i<291;i++)
-			sd->status.skill[i].id=i;
-		for(i=304;i<337;i++){
-			if(i==331) continue;
-			sd->status.skill[i].id=i;
-		}
-		if(battle_config.enable_upper_class){ //confで無?でなければ?み?む
-		for(i=355;i<MAX_SKILL;i++)
-			sd->status.skill[i].id=i;
-		}
-	}else{
-		// 通常の計算
-		do{
-			flag=0;
-			for(i=0;(id=skill_tree[s][c][i].id)>0;i++){
-				int j,f=1;
-				if(!battle_config.skillfree) {
-					for(j=0;j<5;j++) {
-						if( skill_tree[s][c][i].need[j].id &&
-							pc_checkskill(sd,skill_tree[s][c][i].need[j].id) < skill_tree[s][c][i].need[j].lv)
-							f=0;
-					}
-				}
-				if(f && sd->status.skill[id].id==0 ){
-					sd->status.skill[id].id=id;
-					flag=1;
-				}
-			}
-		}while(flag);
-	}
-//	if(battle_config.etc_log)
-//		printf("calc skill_tree\n");
-	return 0;
+	return c;
 }
 
 /*==========================================

+ 3 - 1
src/map/pc.h

@@ -44,6 +44,8 @@ int pc_checkskill(struct map_session_data *sd,int skill_id);
 int pc_checkallowskill(struct map_session_data *sd);
 int pc_checkequip(struct map_session_data *sd,int pos);
 
+int pc_calc_skilltree_normalize_job(int c, struct map_session_data *sd);
+
 int pc_checkoverhp(struct map_session_data*);
 int pc_checkoversp(struct map_session_data*);
 
@@ -170,7 +172,7 @@ struct pc_base_job pc_calc_base_job(int b_class);//
 int pc_calc_base_job2(int b_class);	// Celest
 int pc_calc_upper(int b_class);
 
-struct {
+struct skill_tree_entry {
 	int id;
 	int max;
 	struct {

+ 1 - 1
src/map/skill.c

@@ -264,7 +264,7 @@ int SkillStatusChangeTable[]={	/* skill.h
 	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
 };
 
-struct skill_name_db skill_names[] = {
+const struct skill_name_db skill_names[] = {
  { AC_CHARGEARROW, "CHARGEARROW", "Charge_Arrow" } ,
  { AC_CONCENTRATION, "CONCENTRATION", "Improve_Concentration" } ,
  { AC_DOUBLE, "DOUBLE", "Double_Strafe" } ,

+ 1 - 1
src/map/skill.h

@@ -31,7 +31,7 @@ struct skill_name_db {
         char *name; // search strings
         char *desc; // description that shows up for search's
 };
-extern struct skill_name_db skill_names[];
+extern const struct skill_name_db skill_names[];
 
 // ƒAƒCƒeƒ€�ì�¬ƒf?ƒ^ƒx?ƒX
 struct skill_produce_db {