Przeglądaj źródła

- Mercenary Database Reading.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@13109 54d463be-8e91-2dee-dedb-b68131a5f0ec
zephyrus 17 lat temu
rodzic
commit
bc00263633
3 zmienionych plików z 184 dodań i 30 usunięć
  1. 0 30
      db/mercenary_skill_db.txt
  2. 165 0
      src/map/mercenary.c
  3. 19 0
      src/map/mercenary.h

+ 0 - 30
db/mercenary_skill_db.txt

@@ -1,143 +1,113 @@
 //MercenryID,SkillID,SkillLevel
-
 // Archer Mercenaries Level 1-10.
 // MER_ARCHER01
 6017,8207,2	//MA_DOUBLE
 6017,8233,1	//MER_AUTOBERSERK
-
 // MER_ARCHER02
 6018,8208,2	//MA_SHOWER
 6018,8224,1	//MER_SIGHT
-
 // MER_ARCHER03
 6019,8214,1	//MA_CHARGEARROW
 6019,8223,1	//MER_QUICKEN
-
 // MER_ARCHER04
 6020,8237,1	//MER_ESTIMATION
 6020,8222,1	//MER_MAGNIFICAT
 6020,8227,1	//MER_TENDER
-
 // MER_ARCHER05
 6021,8207,5	//MA_DOUBLE
 6021,8232,1	//MER_PROVOKE
 6021,8213,1	//MA_REMOVETRAP
-
 // MER_ARCHER06
 6022,8207,7	//MA_DOUBLE
 6022,8209,3	//MA_LANDMINE
 6022,8234,1	//MER_DECAGI
-
 // MER_ARCHER07
 6023,8208,10	//MA_SHOWER
 6023,8230,1	//MER_MENTALCURE
 6023,8212,2	//MA_FREEZINGTRAP
-
 // MER_ARCHER08
 6024,8223,2	//MER_QUICKEN
 6024,8232,3	//MER_PROVOKE
 6024,8211,3	//MA_SANDMAN
-
 // MER_ARCHER09
 6025,8207,10	//MA_DOUBLE
 6025,8214,1	//MA_CHARGEARROW
 6025,8210,5	//MA_LANDMINE
-
 // MER_ARCHER10
 6026,8214,1	//MA_CHARGEARROW
 6026,8215,5	//MA_SHARPSHOOTING
 6026,8223,5	//MER_QUICKEN
 6026,8233,1	//MER_AUTOBERSERK
-
 // Lancer Mercenaries Level 1-10.
 // MER_LANCER01
 6027,8216,1	//ML_PIERCE
 6027,8226,1	//MER_REGAIN
-
 // MER_LANCER02
 6028,8217,2	//ML_BRANDISH
 6028,8236,1	//MER_LEXDIVINA
-
 // MER_LANCER03
 6029,8216,2	//ML_PIERCE
 6029,8221,1	//ML_DEVOTION
 6029,8229,1	//MER_RECUPERATE
-
 // MER_LANCER04
 6030,8219,1	//ML_DEFENDER
 6030,8225,4	//MER_CRASH
-
 // MER_LANCER05
 6031,8216,5	//ML_PIERCE
 6031,8220,3	//ML_AUTOGUARD
-
 // MER_LANCER06
 6032,8223,2	//MER_QUICKEN
 6032,8217,5	//ML_BRANDISH
-
 // MER_LANCER07
 6033,8221,1	//ML_DEVOTION
 6033,8233,1	//MER_AUTOBERSERK
-
 // MER_LANCER08
 6034,8235,1	//MER_SCAPEGOAT
 6034,8216,10	//ML_PIERCE
 6034,8232,5	//MER_PROVOKE
-
 // MER_LANCER09
 6035,8217,10	//ML_BRANDISH
 6035,8220,7	//ML_AUTOGUARD
 6035,8219,3	//ML_DEFENDER
-
 // MER_LANCER10
 6036,8223,5	//MER_QUICKEN
 6036,8220,10	//ML_AUTOGUARD
 6036,8221,3	//ML_DEVOTION
 6036,8218,5	//ML_SPIRALPIERCE
-
 // Swordman Mercenaries Level 1-10.
 // MER_SWORDMAN01
 6037,8201,1	//MS_BASH
 6037,8234,1	//MER_DECAGI
-
 // MER_SWORDMAN02
 6038,8232,5	//MER_PROVOKE
 6038,8202,3	//MS_MAGNUM
-
 // MER_SWORDMAN03
 6039,8223,1	//MER_QUICKEN
 6039,8228,1	//MER_BENEDICTION
-
 // MER_SWORDMAN04
 6040,8225,1	//MER_CRASH
 6040,8202,5	//MS_MAGNUM
-
 // MER_SWORDMAN05
 6041,8201,5	//MS_BASH
 6041,8225,4	//MER_CRASH
 6041,8228,1	//MER_BENEDICTION
-
 // MER_SWORDMAN06
 6042,8223,5	//MER_QUICKEN
 6042,8237,1	//MER_ESTIMATION
 6042,8234,3	//MER_DECAGI
-
 // MER_SWORDMAN07
 6043,8201,10	//MS_BASH
 6043,8233,1	//MER_AUTOBERSERK
 6043,8235,1	//MER_SCAPEGOAT
-
 // MER_SWORDMAN08
 6044,8223,10	//MER_QUICKEN
 6044,8203,5	//MS_BOWLINGABASH
 6044,8231,1	//MER_COMPRESS
 6044,8204,4	//MS_PARRYING
-
 // MER_SWORDMAN09
 6045,8203,8	//MS_BOWLINGABASH
 6045,8225,3	//MER_CRASH
 6045,8205,5	//MS_REFLECTSHIELD
-
 // MER_SWORDMAN10
 6046,8223,10	//MER_QUICKEN
 6046,8203,10	//MS_BOWLINGABASH

+ 165 - 0
src/map/mercenary.c

@@ -41,6 +41,8 @@
 //Better equiprobability than rand()% [orn]
 #define rand(a, b) (a+(int) ((float)(b-a+1)*rand()/(RAND_MAX+1.0)))
 
+struct s_mercenary_db mercenary_db[MAX_MERCENARY_CLASS]; // Mercenary Database
+
 struct s_homunculus_db homunculus_db[MAX_HOMUNCULUS_CLASS];	//[orn]
 struct skill_tree_entry hskill_tree[MAX_HOMUNCULUS_CLASS][MAX_SKILL_TREE];
 
@@ -879,6 +881,165 @@ int merc_hom_shuffle(struct homun_data *hd)
 	return 1;
 }
 
+int read_mercenarydb(void)
+{
+	FILE *fp;
+	char line[1024], *p;
+	char *str[26];
+	int i, j = 0, k = 0, ele;
+	struct s_mercenary_db *db;
+	struct status_data *status;
+
+	sprintf(line, "%s/%s", db_path, "mercenary_db.txt");
+	memset(mercenary_db,0,sizeof(mercenary_db));
+
+	fp = fopen(line, "r");
+	if( !fp )
+	{
+		ShowError("read_mercenarydb : can't read mercenary_db.txt\n");
+		return -1;
+	}
+
+	while( fgets(line, sizeof(line), fp) && j < MAX_MERCENARY_CLASS )
+	{
+		k++;
+		if( line[0] == '/' && line[1] == '/' )
+			continue;
+
+		i = 0;
+		p = strtok(line, ",");
+		while( p != NULL && i < 26 )
+		{
+			str[i++] = p;
+			p = strtok(NULL, ",");
+		}
+		if( i < 26 )
+		{
+			ShowError("read_mercenarydb : Incorrect number of columns at mercenary_db.txt line %d.\n", k);
+			continue;
+		}
+
+		db = &mercenary_db[j];
+		db->class_ = atoi(str[0]);
+		strncpy(db->sprite, str[1], NAME_LENGTH);
+		strncpy(db->name, str[2], NAME_LENGTH);
+		db->lv = atoi(str[3]);
+
+		status = &db->status;
+		status->max_hp = atoi(str[4]);
+		status->max_sp = atoi(str[5]);
+		status->rhw.range = atoi(str[6]);
+		status->rhw.atk = atoi(str[7]);
+		status->rhw.atk2 = atoi(str[8]);
+		status->def = atoi(str[9]);
+		status->mdef = atoi(str[10]);
+		status->str = atoi(str[11]);
+		status->agi = atoi(str[12]);
+		status->vit = atoi(str[13]);
+		status->int_ = atoi(str[14]);
+		status->dex = atoi(str[15]);
+		status->luk = atoi(str[16]);
+		db->range2 = atoi(str[17]);
+		db->range3 = atoi(str[18]);
+		status->size = atoi(str[19]);
+		status->race = atoi(str[20]);
+	
+		ele = atoi(str[21]);
+		status->def_ele = ele%10;
+		status->ele_lv = ele/20;
+		if( status->def_ele >= ELE_MAX )
+		{
+			ShowWarning("Mercenary %d has invalid element type %d (max element is %d)\n", db->class_, status->def_ele, ELE_MAX - 1);
+			status->def_ele = ELE_NEUTRAL;
+		}
+		if( status->ele_lv < 1 || status->ele_lv > 4 )
+		{
+			ShowWarning("Mercenary %d has invalid element level %d (max is 4)\n", db->class_, status->ele_lv);
+			status->ele_lv = 1;
+		}
+
+		status->speed = atoi(str[22]);
+		status->adelay = atoi(str[23]);
+		status->amotion = atoi(str[24]);
+		status->dmotion = atoi(str[25]);
+
+		j++;
+	}
+
+	fclose(fp);
+	ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' mercenaries in '"CL_WHITE"db/mercenary_db.txt"CL_RESET"'.\n",j);
+
+	return 0;
+}
+
+int read_mercenary_skilldb(void)
+{
+	FILE *fp;
+	char line[1024], *p;
+	char *str[3];
+	struct s_mercenary_db *db;
+	int i, j = 0, k = 0, class_;
+	int skillid, skilllv;
+
+	sprintf(line, "%s/%s", db_path, "mercenary_skill_db.txt");
+	fp = fopen(line, "r");
+	if( !fp )
+	{
+		ShowError("read_mercenary_skilldb : can't read mercenary_skill_db.txt\n");
+		return -1;
+	}
+
+	while( fgets(line, sizeof(line), fp) )
+	{
+		k++;
+		if( line[0] == '/' && line[1] == '/' )
+			continue;
+
+		i = 0;
+		p = strtok(line, ",");
+		while( p != NULL && i < 3 )
+		{
+			str[i++] = p;
+			p = strtok(NULL, ",");
+		}
+		if( i < 3 )
+		{
+			ShowError("read_mercenary_skilldb : Incorrect number of columns at mercenary_skill_db.txt line %d.\n", k);
+			continue;
+		}
+
+		class_ = atoi(str[0]);
+		ARR_FIND(0, MAX_MERCENARY_CLASS, i, class_ == mercenary_db[i].class_);
+		if( i == MAX_MERCENARY_CLASS )
+		{
+			ShowError("read_mercenary_skilldb : Class not found in mercenary_db for skill entry, line %d.\n", k);
+			continue;
+		}
+
+		db = &mercenary_db[i];
+		skillid = atoi(str[1]);
+		skilllv = atoi(str[2]);
+
+		ARR_FIND(0, MAX_MERCENARY_SKILL, i, db->skill[i].id == 0 || db->skill[i].id == skillid);
+		if( i == MAX_MERCENARY_SKILL )
+		{
+			ShowError("read_mercenary_skilldb : No more free skill slots for Class %d, line %d.\n", class_, k);
+			continue;
+		}
+		if( db->skill[i].id == skillid )
+			ShowError("read_mercenary_skilldb : Duplicate Skill for Class %d, line %d. Overwriting...\n", class_, k);
+
+		db->skill[i].id = skillid;
+		db->skill[i].lv = skilllv;
+		j++;
+	}
+
+	fclose(fp);
+	ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"db/mercenary_skill_db.txt"CL_RESET"'.\n",j);
+	return 0;
+}
+
+
 int read_homunculusdb(void)
 {
 	FILE *fp;
@@ -1155,6 +1316,10 @@ int do_init_merc(void)
 	read_homunculusdb();
 	read_homunculus_expdb();
 	read_homunculus_skilldb();
+
+	read_mercenarydb();
+	read_mercenary_skilldb();
+	
 	// Add homunc timer function to timer func list [Toms]
 	add_timer_func_list(merc_hom_hungry, "merc_hom_hungry");
 

+ 19 - 0
src/map/mercenary.h

@@ -7,6 +7,25 @@
 #include "status.h" // struct status_data, struct status_change
 #include "unit.h" // struct unit_data
 
+// Mercenary DB Structures
+// ===================================
+
+struct s_mercenary_db {
+	int class_;
+	char sprite[NAME_LENGTH], name[NAME_LENGTH];
+	unsigned short lv;
+	short range2, range3;
+	struct status_data status;
+	struct {
+		unsigned short id, lv;
+	} skill[MAX_MERCENARY_SKILL];
+};
+
+extern struct s_mercenary_db mercenary_db[MAX_MERCENARY_CLASS];
+
+// Homunculus DB Structures
+// ===================================
+
 struct h_stats {
 	unsigned int HP, SP;
 	unsigned short str, agi, vit, int_, dex, luk;