Преглед изворни кода

* Added bAddRace2
* Added mob_race2_db.txt
* Updated description for backup_txt in char_athena.conf a bit
* Added some suggestions by Poki#3
* Use the event names from script_athena.conf to check whenever a player event trigger is being read/set
* Removed an unused save/bank.txt

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

celest пре 20 година
родитељ
комит
25d104d8c4

+ 11 - 0
Changelog-SVN.txt

@@ -1,7 +1,18 @@
 Date	Added
 
 02/18
+        * Added bAddRace2 -- check item_bonus.txt [celest]
+        * Added mob_race2_db.txt -- contains 'main races' of certain monsters [celest]
+        * Updated description for backup_txt in char_athena.conf a bit [celest]
+        * Set read_map_from_cache to 2 (enable compression), and map_cache_file back to
+          saving in /db instead of /save, as suggested by Poki#3 [celest]
+        * Updated description for auto_counter_type, and set plaer_auto_counter_type
+          to 0 by default, as suggested by Poki#3 [celest]
+        * Use the event names from script_athena.conf to check whenever a player event
+          trigger is being read/set [celest]
+        * Removed an unused save/bank.txt [celest]
 	* Added some new cards effects. (check DB\changelog.txt) [Lupus]
+
 02/17
 	* Now all mobs have 10 drops slots. the last one is used for Cards Drops [Lupus]
 	  Don't forget to update your SQL files (Drop Log: logs.sql and db_tables.sql

+ 2 - 2
conf-tmpl/battle_athena.conf

@@ -466,12 +466,12 @@ save_clothcolor: yes
 // 2 = both
 undead_detect_type: 2
 
-// Operational mode of automatic counter.
+// Counter Attack Skill Type
 // 0 = 100% critical
 // 1 = disregard DEF and HIT+20, CRI*2
 // 2 = Same as 0, but can counter skills (?)
 // Players
-player_auto_counter_type: 1
+player_auto_counter_type: 0
 // Monsters
 monster_auto_counter_type: 0
 

+ 1 - 1
conf-tmpl/char_athena.conf

@@ -84,7 +84,7 @@ char_txt: save/athena.txt
 // default is 'no', because backup file take time for nothing. Actually, there is no problem on characters file creation and save.
 backup_txt_flag: no
 
-// Character server flatfile database (backup)
+// Character server flatfile database (backup, TXT only)
 backup_txt: save/athena_backup.txt
 
 // Friends list flatfile database

+ 2 - 2
conf-tmpl/map_athena.conf

@@ -57,10 +57,10 @@ map_port: 5121
 // It is possible to reduce the map cache to 1MB for 400+ maps with compression
 // enabled. If all maps are already loaded in the cache, Athena can boot without
 // reading the grf files.
-read_map_from_cache: 1
+read_map_from_cache: 2
 //
 //Where is the bitmap file stored?
-map_cache_file: save/mapinfo.txt
+map_cache_file: db/mapinfo.txt
 
 // Console Commands
 // Allow for console commands to be used on/off

+ 2 - 0
db/Changelog.txt

@@ -6,6 +6,8 @@
 	Skill databases == celest working on them i believe.
 
 02/18
+        * Changed Goblin Leader Card to using bAddRace2 -- each player can only save
+          10 AddDamageClass, so this would save some space for other cards ^^ [celest]
 	* Started adding new cards effects. Also big thanks to Landarma [Lupus]
 
 02/17

+ 1 - 0
db/const.txt

@@ -245,6 +245,7 @@ bAddDamageByClass	2020
 bSPGainValue	2021
 bIgnoreDefMob	2022
 bHPLossRate	2023
+bAddRace2	2024
 
 
 Eff_Stone	0

+ 1 - 1
db/item_db.txt

@@ -1185,7 +1185,7 @@
 4152,Galapago_Card,Galapago Card,6,20,0,10,,,,,,,,,,,{},{}
 4153,Crab_Card,Crab Card,6,20,0,10,,,,,,,2,,,,{},{ bonus bAtk,5; bonus2 bAddDamageClass,1266,30; bonus2 bAddEle,4,30; if(isequipped(4247,4273)) bonus3 bAddMonsterDropItem,544,5,3000; }
 4154,Dumpling_Child_Card,Dumpling Child Card,6,20,0,10,,,,,,,,,,,{},{}
-4155,Goblin_Leader_Card,Goblin Leader Card,6,20,0,10,,,,,,,2,,,,{},{ bonus2 bAddDamageClass,1122,30; bonus2 bAddDamageClass,1123,30; bonus2 bAddDamageClass,1124,30; bonus2 bAddDamageClass,1125,30; bonus2 bAddDamageClass,1126,30; bAddDamageClass,1245,30; bAddDamageClass,1258,30; bAddDamageClass,1280,30; bAddDamageClass,1299,30; bAddDamageClass,1308,30; }
+4155,Goblin_Leader_Card,Goblin Leader Card,6,20,0,10,,,,,,,2,,,,{},{ bonus2 bAddRace2,1,30; }
 4156,Goblin_Steamrider_Card,Goblin Steamrider Card,6,20,0,10,,,,,,,2,,,,{},{}
 4157,Goblin_Archer_Card,Goblin Archer Card,6,20,0,10,,,,,,,2,,,,{},{}
 4158,Sky_Deleter_Card,Sky Deleter Card,6,20,0,10,,,,,,,16,,,,{},{}

+ 6 - 0
db/mob_race2_db.txt

@@ -0,0 +1,6 @@
+// RACE,Mob ID1,Mob ID2,Mob ID3,...,Mob ID9
+1,1122,1123,1124,1125,1126,1245,1258,1280,1308	// Goblins
+2,1133,1134,1135,1136,1137,1226,1282,1455	// Kobolds
+3,1023,1152,1153,1177,1189,1213,1273		// Orcs
+4,1040,1278,1366,1497				// Golems
+5,1285,1286,1287				// Guardians

+ 2 - 0
doc/item_bonus.txt

@@ -157,6 +157,8 @@ bonus2 bAddEffWhenHit,n,x;		n% chance to cause x state to the enemy when
 bonus2 bSkillAtk,n,x;			Increase damage of skill n by x%
 bonus2 bAddDamageByClass,n,x;		When being hit by monster of class n increase
                                         damage taken by x%
+bonus2 bAddRace2,n,x;			Increase damage by x% vs. enemies of race n
+                                        (Check db/mob_race2_db.txt)
 
 bonus3 bHPLossRate,n,x,y;		Lose n amount of hp every x amount of time
                                         y:0=Don't show damage 1=Show damage

+ 0 - 0
save-tmpl/bank.txt


+ 13 - 7
src/map/battle.c

@@ -1617,6 +1617,7 @@ static struct Damage battle_calc_pc_weapon_attack(
 	int damage,damage2,damage3=0,damage4=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
 	int flag,skill,dmg_lv = 0;
 	int t_mode=0,t_race=0,t_size=1,s_race=7,s_ele=0;
+	int t_race2=0;
 	struct status_change *sc_data,*t_sc_data;
 	short *sc_count;
 	short *option, *opt1, *opt2;
@@ -1644,6 +1645,7 @@ static struct Damage battle_calc_pc_weapon_attack(
 	option=status_get_option(src); //鷹とかペコとかカートとか
 	opt1=status_get_opt1(src); //石化、凍結、スタン、睡眠、暗闇
 	opt2=status_get_opt2(src); //毒、呪い、沈黙、暗闇?
+	t_race2=status_get_race2(target);
 
 	if(skill_num != CR_GRANDCROSS) //グランドクロスでないなら
 		sd->state.attack_type = BF_WEAPON; //攻撃タイプは武器攻撃
@@ -2517,17 +2519,20 @@ static struct Damage battle_calc_pc_weapon_attack(
 			cardfix=cardfix*(100+sd->addrace[t_race])/100;	// 種族によるダメージ修正
 			cardfix=cardfix*(100+sd->addele[t_ele])/100;	// 属性によるダメージ修正
 			cardfix=cardfix*(100+sd->addsize[t_size])/100;	// サイズによるダメージ修正
+			cardfix=cardfix*(100+sd->addrace2[t_race2])/100;
 		}
 		else {
 			cardfix=cardfix*(100+sd->addrace[t_race]+sd->addrace_[t_race])/100;	// 種族によるダメージ修正(左手による追加あり)
 			cardfix=cardfix*(100+sd->addele[t_ele]+sd->addele_[t_ele])/100;	// 属性によるダメージ修正(左手による追加あり)
 			cardfix=cardfix*(100+sd->addsize[t_size]+sd->addsize_[t_size])/100;	// サイズによるダメージ修正(左手による追加あり)
+			cardfix=cardfix*(100+sd->addrace2[t_race2]+sd->addrace2_[t_race2])/100;
 		}
 	}
 	else { //弓矢
 		cardfix=cardfix*(100+sd->addrace[t_race]+sd->arrow_addrace[t_race])/100;	// 種族によるダメージ修正(弓矢による追加あり)
 		cardfix=cardfix*(100+sd->addele[t_ele]+sd->arrow_addele[t_ele])/100;	// 属性によるダメージ修正(弓矢による追加あり)
 		cardfix=cardfix*(100+sd->addsize[t_size]+sd->arrow_addsize[t_size])/100;	// サイズによるダメージ修正(弓矢による追加あり)
+		cardfix=cardfix*(100+sd->addrace2[t_race2])/100;
 	}
 	if(t_mode & 0x20) { //ボス
 		if(!sd->state.arrow_atk) { //弓矢攻撃以外なら
@@ -2567,6 +2572,7 @@ static struct Damage battle_calc_pc_weapon_attack(
 		cardfix=cardfix*(100+sd->addrace_[t_race])/100;	// 種族によるダメージ修正左手
 		cardfix=cardfix*(100+sd->addele_[t_ele])/100;	// 属 性によるダメージ修正左手
 		cardfix=cardfix*(100+sd->addsize_[t_size])/100;	// サイズによるダメージ修正左手
+		cardfix=cardfix*(100+sd->addrace2_[t_race2])/100;
 		if(t_mode & 0x20) //ボス
 			cardfix=cardfix*(100+sd->addrace_[10])/100; //ボスモンスターに追加ダメージ左手
 		else
@@ -2580,8 +2586,8 @@ static struct Damage battle_calc_pc_weapon_attack(
 		}
 	}
 	if(!no_cardfix)
-
 		damage2=damage2*cardfix/100;
+
 //カード補正による左手ダメージ増加
 //カードによるダメージ増加処理(左手)ここまで
 
@@ -2629,14 +2635,14 @@ static struct Damage battle_calc_pc_weapon_attack(
 		}
 		if(t_sc_data[SC_ASSUMPTIO].timer != -1){ //アスムプティオ
 			if(!map[target->m].flag.pvp){
-			damage=damage/3;
-			damage2=damage2/3;
-		}else{
-			damage=damage/2;
-			damage2=damage2/2;
+				damage=damage/3;
+				damage2=damage2/3;
+			}else{
+				damage=damage/2;
+				damage2=damage2/2;
+			}
 		}
 	}
-	}
 //対象にステータス異常がある場合のダメージ減算処理ここまで
 
 	if(damage < 0) damage = 0;

+ 2 - 1
src/map/map.h

@@ -289,6 +289,7 @@ struct map_session_data {
 	short ignore_def_mob, ignore_def_mob_;
 	int hp_loss_tick, hp_loss_rate;
 	short hp_loss_value, hp_loss_type;
+	int addrace2[6],addrace2_[6];
 
 	short spiritball, spiritball_old;
 	int spirit_timer[MAX_SKILL_LEVEL];
@@ -630,7 +631,7 @@ enum {
 
 	SP_CRIT_ATK_RATE, SP_CRITICAL_ADDRACE, SP_NO_REGEN, SP_ADDEFF_WHENHIT, SP_AUTOSPELL_WHENHIT, // 2013-2017
 	SP_SKILL_ATK, SP_UNSTRIPABLE, SP_ADD_DAMAGE_BY_CLASS, // 2018-2020
-	SP_SP_GAIN_VALUE, SP_IGNORE_DEF_MOB, SP_HP_LOSS_RATE // 2021-2023
+	SP_SP_GAIN_VALUE, SP_IGNORE_DEF_MOB, SP_HP_LOSS_RATE, SP_ADDRACE2 // 2021-2023
 };
 
 enum {

+ 52 - 1
src/map/mob.c

@@ -35,7 +35,6 @@
 #define MAX_MOB_DB 2000		/* Change this to increase the table size in your mob_db to accomodate
 								numbers more than 2000 for mobs if you want to (and know what you're doing).
 								Be sure to note that 4001 to 4047 are for advanced classes. */
-
 struct mob_db mob_db[2001];
 
 #define CLASSCHANGE_BOSS_NUM 21
@@ -4318,6 +4317,57 @@ static int mob_readskilldb(void)
 	}
 	return 0;
 }
+/*==========================================
+ * db/mob_race_db.txt reading
+ *------------------------------------------
+ */
+static int mob_readdb_race(void)
+{
+	FILE *fp;
+	char line[1024];
+	int race,j,k;
+	char *str[20],*p,*np;
+
+	if( (fp=fopen("db/mob_race2_db.txt","r"))==NULL ){
+		printf("can't read db/mob_race2_db.txt\n");
+		return -1;
+	}
+	
+	while(fgets(line,1020,fp)){
+		if(line[0]=='/' && line[1]=='/')
+			continue;
+		memset(str,0,sizeof(str));
+
+		for(j=0,p=line;j<12;j++){
+			if((np=strchr(p,','))!=NULL){
+				str[j]=p;
+				*np=0;
+				p=np+1;
+			} else
+				str[j]=p;
+		}
+		if(str[0]==NULL)
+			continue;
+
+		race=atoi(str[0]);
+		if (race < 0 || race >= MAX_MOB_RACE_DB)
+			continue;
+
+		for (j=1; j<20; j++) {
+			if (!str[j])
+				break;
+			k=atoi(str[j]);
+			if (k < 1000 || k > MAX_MOB_DB)
+				continue;
+			mob_db[k].race2 = race;
+			//mob_race_db[race][j] = k;
+		}
+	}
+	fclose(fp);
+	sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/mob_race2_db.txt");
+	ShowStatus(tmp_output);
+	return 0;
+}
 
 void mob_reload(void)
 {
@@ -4495,6 +4545,7 @@ int do_init_mob(void)
 	mob_readdb_mobavail();
 	mob_read_randommonster();
 	mob_readskilldb();
+	mob_readdb_race();
 
 	add_timer_func_list(mob_timer,"mob_timer");
 	add_timer_func_list(mob_delayspawn,"mob_delayspawn");

+ 2 - 0
src/map/mob.h

@@ -3,6 +3,7 @@
 #define _MOB_H_
 
 #define MAX_RANDOMMONSTER 3
+#define MAX_MOB_RACE_DB 6
 
 struct mob_skill {
 	short state;
@@ -26,6 +27,7 @@ struct mob_db {
 	int str,agi,vit,int_,dex,luk;
 	int range,range2,range3;
 	int size,race,element,mode;
+	short race2;	// celest
 	int speed,adelay,amotion,dmotion;
 	int mexp,mexpper;
 	struct { int nameid,p; } dropitem[10]; //8 -> 10 Lupus

+ 14 - 6
src/map/pc.c

@@ -809,9 +809,9 @@ int pc_authok(int id, int login_id2, time_t connect_until_time, struct mmo_chars
 
 	// Automated script events
 	if (script_config.event_requires_trigger) {
-		sd->state.event_death = pc_readglobalreg(sd,"PCDieEvent");
-		sd->state.event_kill = pc_readglobalreg(sd,"PCKillEvent");
-		sd->state.event_disconnect = pc_readglobalreg(sd,"PCLogoffEvent");
+		sd->state.event_death = pc_readglobalreg(sd, script_config.die_event_name);
+		sd->state.event_kill = pc_readglobalreg(sd, script_config.kill_event_name);
+		sd->state.event_disconnect = pc_readglobalreg(sd, script_config.logout_event_name);
 	// if script triggers are not required
 	} else {
 		sd->state.event_death = 1;
@@ -1839,6 +1839,14 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
 			sd->hp_loss_rate = val;
 		}
 		break;
+	case SP_ADDRACE2:
+		if (type2 > 0 && type2 < MAX_MOB_RACE_DB)
+			break;
+		if(sd->state.lr_flag != 2)
+			sd->addrace2[type2] += val;
+		else
+			sd->addrace2_[type2] += val;
+		break;
 
 	default:
 		if(battle_config.error_log)
@@ -5560,11 +5568,11 @@ int pc_setglobalreg(struct map_session_data *sd,char *reg,int val)
 	if(strcmp(reg,"PC_DIE_COUNTER") == 0 && sd->die_counter != val){
 		sd->die_counter = val;
 		status_calc_pc(sd,0);
-	} else if(strcmp(reg,"PCDieEvent") == 0){
+	} else if(strcmp(reg,script_config.die_event_name) == 0){
 		sd->state.event_death = val;
-	} else if(strcmp(reg,"PCKillEvent") == 0){
+	} else if(strcmp(reg,script_config.kill_event_name) == 0){
 		sd->state.event_kill = val;
-	} else if(strcmp(reg,"PCLogoutEvent") == 0){
+	} else if(strcmp(reg,script_config.logout_event_name) == 0){
 		sd->state.event_disconnect = val;
 	}
 

+ 12 - 0
src/map/status.c

@@ -510,6 +510,8 @@ int status_calc_pc(struct map_session_data* sd,int first)
 	sd->sp_gain_value = 0;
 	sd->ignore_def_mob = sd->ignore_def_mob_ = 0;
 	sd->hp_loss_rate = sd->hp_loss_value = sd->hp_loss_type = 0;
+	memset(sd->addrace2,0,sizeof(sd->addrace2));
+	memset(sd->addrace2_,0,sizeof(sd->addrace2_));
 
 	if(!sd->disguiseflag && sd->disguise) {
 		sd->disguise=0;
@@ -2812,6 +2814,16 @@ int status_get_mexp(struct block_list *bl)
 	else
 		return 0;
 }
+int status_get_race2(struct block_list *bl)
+{
+	nullpo_retr(0, bl);
+	if(bl->type == BL_MOB && (struct mob_data *)bl)
+		return mob_db[((struct mob_data *)bl)->class_].race2;
+	else if(bl->type==BL_PET && (struct pet_data *)bl)
+		return mob_db[((struct pet_data *)bl)->class_].race2;
+	else
+		return 0;
+}
 
 // StatusChangeŒn‚Ì�Š“¾
 struct status_change *status_get_sc_data(struct block_list *bl)

+ 1 - 0
src/map/status.h

@@ -240,6 +240,7 @@ int status_get_race(struct block_list *bl);
 int status_get_size(struct block_list *bl);
 int status_get_mode(struct block_list *bl);
 int status_get_mexp(struct block_list *bl);
+int status_get_race2(struct block_list *bl);
 
 struct status_change *status_get_sc_data(struct block_list *bl);
 short *status_get_sc_count(struct block_list *bl);