www.pudn.com > gamedata.rar > game.c


#include "stdafx.h" 
 
extern struct OBJECT_INFO object_info[MAX_NUM_OBJ]; 
 
extern struct COMMAND_INFO Command_info[MAX_NUM_COMMAND]; 
extern signed long citizen_code[11][10]; 
extern struct NOVELITY_MAP_INFO map[MAX_NUM_MAP]; 
extern struct optiondata option; 
extern long spell_code[MAX_NUM_SPELL][6]; 
 
// 公告牌 
void advertisementgame(SOCKET s, LPBYTE lpTarget) 
{ 
	; 
} 
 
signed long getcost(int index, signed long cost, int taxation, BOOL team) 
{ 
	float f; 
 
	signed long money; 
 
	if (team) 
	{ 
		f = (float)(citizen_code[object_info[index].citizenlevel][4] / 100.0); 
		money = (signed long)(cost - cost * f); 
		f =	(float)(citizen_code[object_info[index].citizenlevel][5] / 100.0); 
		money += (signed long)(cost * f); 
		f = (float)(taxation / 100.0); 
		money += (signed long)(cost * f); 
	} 
	else 
	{ 
		f = (float)(citizen_code[object_info[index].citizenlevel][4] / 100.0); 
		money = (signed long)(cost - cost * f); 
		f =	(float)(citizen_code[object_info[index].citizenlevel][5] / 100.0); 
		money += (signed long)(cost * f); 
	} 
 
	return money; 
} 
 
// 得到买的物品的价格 
signed long getnovelitycost(int index, int command, BYTE code1, BYTE code2) 
{ 
	int i, j, z; 
 
	for (i=0;i= 1)  
		{ 
			a = (float)((money1 * 0.8) / (float)status1); 
			b = a * (float)status2; 
 
			return (signed long)((money1 * 0.8) - b); 
		} 
	} 
	else 
	{ 
		if (status1 >= 1) 
		{ 
			a = (float)((money1 * 0.8) / (float)status1); 
			b = a * (float)status2; 
			 
			return (signed long)(b * 0.5 + money1 * 0.2); 
		} 
		else 
		{ 
			return (signed long)(money1 * 0.5); 
		} 
	} 
 
	return -1; 
} 
 
//  得到卖的物品的价格 
signed long getnovelitysell(int index, int command, BYTE code1, BYTE code2, int status, struct NOVELITY_INFO novelity_info) 
{ 
	int i, j; 
 
	for(i=0;i= number) 
				{ 
					status = (int)object_info[n].Novelity[b][4] + (int)object_info[n].Novelity[b][5] * 256; 
			 
					money1 = getnovelitysell(n, object_info[n].command, object_info[n].Novelity[b][2], object_info[n].Novelity[b][3], status, novelity_info); 
 
					novelity.number = novelity.number - number; 
 
					money += number * money1; 
 
					setuserNovelityinfo(n, b, novelity);	 
					 
					code[m][0] = b; 
 
					for(j=0;j<17;j++) 
						code[m][j+1] = object_info[n].Novelity[b][j]; 
 
					m ++; 
				} 
				else 
				{ 
					sysmessage(s, 0x01, "含有非法数据,警告用户", 0, FALSE); break; 
				} 
 
			} 
		} 
	} 
 
	setnovelityinfo(s, m, code, 0, FALSE); 
 
	object_info[n].money += money; 
 
	setusermoneynumber(s, object_info[n].money); 
 
	return 0; 
} 
// 买东西的判断 
int TFbuy(SOCKET s, LPBYTE lpTarget) 
{ 
	// 00 01 02 03 04 05 06 07 08 09 
	// 55 01 00 00 85 01 00 03 00 1C 00 01 00 1D 00 02 00 1E 00 02 00 买东西 
 
	int i, j, n, a, tmp, number, m, z; 
 
	long money, money1; 
 
	BYTE b, c, d, e; 
	BYTE code[39][18]; 
	BYTE buf[4]; 
 
	struct NOVELITY novelity; 
	struct NOVELITY_INFO novelity_info; 
 
	n = find_obj(s); 
 
	if (n == MAX_NUM_USER) return -1; 
 
	m = 0; 
	a = 0; 
 
	if (object_info[n].money <= 0) return -1; 
	money = 0; 
 
	for(i=0;i<(int)lpTarget[7];i++) 
	{ 
		a ++; 
		b = lpTarget[8 + a]; 
		a ++; 
		c = lpTarget[8 + a]; 
		a ++; 
		d = lpTarget[8 + a]; 
		a ++; 
		e = lpTarget[8 + a]; 
 
		number = d + e * 256; 
 
		novelity_info = getNovelity_info(b, c); 
 
		if (novelity_info.have) 
		{ 
//			if (novelity.have) 
			{ 
		//		if(novelity.number >= number) 
				{ 
				//	novelity.number = novelity.number + number; 
 
			//		money = money + number * novelity_info.money; 
 
					// 寻找现成的物品栏存放着的 
					tmp = getusernovelitysitesame(n, b, c); 
					 
					if ((tmp != 34) && (novelity_info.reside2 == 0)) 
					{ 
						//MessageBoxA(NULL, "1", "", 0); 
						novelity = getuserNovelityinfo(n, tmp); 
 
						novelity.number = novelity.number + number; 
 
						 
 
						if (novelity.number > MAX_ME_NOVELITY) 
						{ 
							sysmessage(s, 0x02, "同类物品超限", 0, FALSE); break; 
						} 
						else 
						{ 
							money1 = getnovelitycost(n, object_info[n].command, b, c); 
 
							if (money1 == -1) { sysmessage(s, 0x02, "购买非法物品", 0, FALSE); break; } 
							else 
							{ 
								if (money + money1 > object_info[n].money) { sysmessage(s, 0x02, "金币不足", 0, FALSE); break; } 
								else 
								{ 
									money += money1 * number; 
								} 
							} 
						} 
 
						setuserNovelityinfo(n, tmp, novelity);	 
						code[m][0] = tmp; 
 
						for(j=0;j<17;j++) 
							code[m][j+1] = object_info[n].Novelity[tmp][j]; 
						m ++; 
					} 
					else 
					{ 
						tmp = getusernovelitysiteblank(n); 
 
						if (tmp != 34)  
						{ 
 
 
							if (novelity_info.reside2 == 0) 
							{ 
								money1 = getnovelitycost(n, object_info[n].command, b, c); 
								 
								if (money1 == -1) { sysmessage(s, 0x02, "购买非法物品", 0, FALSE); break; }	 
								else 
								{ 
									if (money + money1 > object_info[n].money) { sysmessage(s, 0x02, "金币不足", 0, FALSE); break; } 
									else 
									{ 
										money += money1 * number; 
									} 
								} 
 
								//MessageBoxA(NULL, "2", "", 0); 
								Encode2(buf, novelity_info.level);					 
								object_info[n].Novelity[tmp][0] = buf[1];					 
								object_info[n].Novelity[tmp][1] = buf[0];					 
								object_info[n].Novelity[tmp][2] = b;					 
								object_info[n].Novelity[tmp][3] = c;						 
								Encode2(buf, novelity_info.durable);						 
								object_info[n].Novelity[tmp][4] = buf[1];					 
								object_info[n].Novelity[tmp][5] = buf[0];		 
								object_info[n].Novelity[tmp][6] = 0x00;						 
								object_info[n].Novelity[tmp][7] = 0x00;					 
								Encode2(buf, number);					 
								object_info[n].Novelity[tmp][8] = buf[1];			 
								object_info[n].Novelity[tmp][9] = buf[0]; 
								object_info[n].Novelity[tmp][10] = 0x00;						 
								object_info[n].Novelity[tmp][11] = 0x00;	 
								object_info[n].Novelity[tmp][12] = 0x00;						 
								object_info[n].Novelity[tmp][13] = 0x00;	 
								object_info[n].Novelity[tmp][14] = 0x00;						 
								object_info[n].Novelity[tmp][15] = 0x00;	 
								object_info[n].Novelity[tmp][16] = 0x00;						 
 
								code[m][0] = tmp; 
 
								for(j=0;j<17;j++) 
									code[m][j+1] = object_info[n].Novelity[tmp][j]; 
								m ++; 
							} 
							else 
							{	 
								for(j=0;j object_info[n].money) { sysmessage(s, 0x02, "金币不足", 0, FALSE); break; } 
											else							 
											{	 
												money += money1; 
											} 
										} 
										//MessageBoxA(NULL, "3", "", 0); 
										Encode2(buf, novelity_info.level);					 
										object_info[n].Novelity[tmp][0] = buf[1];					 
								     	object_info[n].Novelity[tmp][1] = buf[0];					 
								    	object_info[n].Novelity[tmp][2] = b;					 
								     	object_info[n].Novelity[tmp][3] = c;												 
								     	Encode2(buf, novelity_info.durable);												 
								    	object_info[n].Novelity[tmp][4] = buf[1];											 
								    	object_info[n].Novelity[tmp][5] = buf[0];								 
								    	object_info[n].Novelity[tmp][6] = 0x00;											 
								    	object_info[n].Novelity[tmp][7] = 0x00;									 
								     	object_info[n].Novelity[tmp][8] = 0x01;			 
								    	object_info[n].Novelity[tmp][9] = 0x00; 
								    	object_info[n].Novelity[tmp][10] = 0x00;						 
								    	object_info[n].Novelity[tmp][11] = 0x00;	 
								    	object_info[n].Novelity[tmp][12] = 0x00;												 
								    	object_info[n].Novelity[tmp][13] = 0x00;						 
								    	object_info[n].Novelity[tmp][14] = 0x00;										 
								    	object_info[n].Novelity[tmp][15] = 0x00;				 
								    	object_info[n].Novelity[tmp][16] = 0x00; 
 
										code[m][0] = tmp; 
	 
										for(z=0;z<17;z++)   
											code[m][z+1] = object_info[n].Novelity[tmp][z]; 
							      
										m ++; 
 
	 
 
									} 
									else 
									{ 
										sysmessage(s, 0x02, "物品栏空间已满", 0, FALSE); break; 
									} 
								} 
 
							} 
						} 
						else 
						{ 
							sysmessage(s, 0x02, "物品栏空间已满", 0, FALSE); break; 
						} 
 
					} 
				} 
			//	else 
				{ 
			//		sysmessage(s, 0x01, "含有非法数据,警告用户", 0, FALSE); break; 
				} 
 
			} 
		} 
	} 
 
	setnovelityinfo(s, m, code, 0, FALSE); 
 
	object_info[n].money -= money; 
 
	setusermoneynumber(s, object_info[n].money); 
	 
	return 0; 
} 
// 对修理的判断 
int TFrepair(SOCKET s, LPBYTE lpTarget) 
{ 
	// 00 01 02 03 04 05 06 07 08 09 10 11 12 
	// 3E 02 00 00 8B 00 00 06 00 00 00 01 00 08 00 09 00 0A 00 1A 00 
	int i, j, n, a, m; 
 
	long money; 
 
	BYTE b, c; 
	BYTE code[39][18]; 
 
	struct NOVELITY novelity; 
	struct NOVELITY_INFO novelity_info; 
 
	n = find_obj(s); 
 
	if (n == MAX_NUM_USER) return -1; 
 
	m = 0; 
	a = 0; 
 
	money = 0; 
 
	for(i=0;i<(int)lpTarget[7];i++) 
	{ 
		a ++; 
		b = lpTarget[8 + a]; 
		a ++; 
		c = lpTarget[8 + a]; 
 
		novelity_info = getNovelity_info(object_info[n].Novelity[b][2], object_info[n].Novelity[b][3]); 
 
		if ((novelity_info.have) &&  
			(((novelity_info.reside2 >= 1) && 
					(novelity_info.reside2 <= 8)) || (novelity_info.sell == 1))) 
		{ 
			novelity = getuserNovelityinfo(n, b); 
 
			if (novelity.have) 
			{ 
			//	if(novelity.number >= number) 
				{ 
					if (object_info[n].money < money) { sysmessage(s, 0x02, "金币不足", 0, FALSE); break; } 
 
					money += getrepaircost(n, b, novelity_info, novelity.status); 
 
					novelity.status = novelity_info.durable; 
 
					setuserNovelityinfo(n, b, novelity);	 
					 
					code[m][0] = b; 
 
					for(j=0;j<17;j++) 
						code[m][j+1] = object_info[n].Novelity[b][j]; 
 
					m ++; 
				} 
			} 
		} 
	} 
 
	setnovelityinfo(s, m, code, 0, FALSE); 
 
	object_info[n].money -= money; 
	setusermoneynumber(s, object_info[n].money); 
 
	return 0; 
} 
 
 
void sendlearnspellinfo(SOCKET s, BYTE code[11]) 
{ 
	// 55 06 00 00 8E 01 01 00 00 00 现在的状态 
	BYTE lpSource[128]; 
 
	int i, a, number; 
 
	number = 0; 
 
	for(i=0;i<11;i++) 
		if (code[i] != 0xFF) number++; 
 
	memset(lpSource, 0x00, sizeof(lpSource)); 
 
	lpSource[0]  = 0x00; 
	lpSource[1]  = 0x00;	 
	lpSource[2]  = 0x00; 
	lpSource[3]  = 0x00; 
	lpSource[4]  = 0x8E; 
	lpSource[5]  = 0x01; 
	lpSource[6]  = number; 
	lpSource[7]  = 0x00; 
	 
	a = 0; 
 
	for(i=0;i<11;i++) 
	{ 
		if (code[i] != 0xFF)  
		{ 
			a ++; 
			lpSource[7 + a] = code[i]; 
			a ++; 
			lpSource[7 + a] = 0x00; 
		} 
	} 
 
//53 06 00 00 6A 00 00 00 00 战斗经验没有了! 
 
	add_pack_chain(s, lpSource, 8 + number * 2, 0, FALSE); 
//	 
} 
// 学习魔法 
int TFlearnspell(SOCKET s, LPBYTE lpTarget) 
{ 
	// 00 01 02 03 04 05 06 07 08 09 10 
	// 3E 03 00 00 8D 02 00 01 00 00 00 发送数据  学习体力恢复 
	BYTE code[11]; 
 
	long money, fight_exp; 
 
	int i, j, n, a, index; 
 
	n = find_obj(s); 
 
	if (n == MAX_NUM_USER) return -1; 
 
	if (lpTarget[5] == 0x02) 
	{ 
		money = 0; 
		fight_exp =0; 
 
		index = 9; 
		a = 0; 
 
		for (i=0;i= money) && (object_info[n].fight_exp >= fight_exp)) 
		{ 
			a = 0; 
			for(i=0;i status) && (((novelity_info.reside2 >= 1) && 
					(novelity_info.reside2 <= 8)) || (novelity_info.sell == 1))) 
 
				{ 
					repair_info[count].Now1    = i; 
					repair_info[count].Now2    = 0; 
					repair_info[count].status  = status; 
 
 
					repair_info[count].money   = getrepaircost(n, i, novelity_info, status); 
 
					count++; 
				} 
			} 
 
			 
			sendrepair1(s, count, repair_info); 
		} 
	} 
	else if (Command_info[m].command == 4) // 学习魔法 
	{ 
		if ((object_info[n].menow1 == Code1) && 
			(object_info[n].menow2 == Code2) && 
			(object_info[n].menow1 == Command_info[m].do_[0]) && 
			(object_info[n].menow2 == Command_info[m].do_[1])) 
		{ 
			 
			info = object_info[n]; 
			learnspell(s, info); 
		} 
	} 
	else if (Command_info[m].command == 5) // 私人银行 
	{ 
		if ((object_info[n].menow1 == Code1) && 
			(object_info[n].menow2 == Code2) && 
			(object_info[n].menow1 == Command_info[m].do_[0]) && 
			(object_info[n].menow2 == Command_info[m].do_[1])) 
		{ 
			 
 
			openprivatewarehouse(s); 
		} 
	} 
	else if (Command_info[m].command == 6) // 综合银行 
	{ 
		if ((object_info[n].menow1 == Code1) && 
			(object_info[n].menow2 == Code2) && 
			(object_info[n].menow1 == Command_info[m].do_[0]) && 
			(object_info[n].menow2 == Command_info[m].do_[1])) 
		{ 
			if (object_info[n].level >= Command_info[m].level) 
			{ 
				 
				openpublicwarehouse(s); 
			} 
			else 
			{ 
				sysmessage(s, 0x01, "10级以上才可以使用", 0, FALSE); return -1; 
			} 
		} 
	} 
	else if (Command_info[m].command == 10) 
	{ 
		// 军团仓库 
		if ((object_info[n].menow1 == Code1) && 
			(object_info[n].menow2 == Code2) && 
			(object_info[n].menow1 == Command_info[m].do_[0]) && 
			(object_info[n].menow2 == Command_info[m].do_[1])) 
		{ 
			 
		} 
	} 
	else if (Command_info[m].command == 11) 
	{ 
		// 建立军团 
		if ((object_info[n].menow1 == Code1) && 
			(object_info[n].menow2 == Code2) && 
			(object_info[n].menow1 == Command_info[m].do_[0]) && 
			(object_info[n].menow2 == Command_info[m].do_[1])) 
		{ 
			 
		} 
	} 
	else if (Command_info[m].command == 13) // 商店卖消耗品 
	{ 
		if ((object_info[n].menow1 == Code1) && 
			(object_info[n].menow2 == Code2) && 
			(object_info[n].menow1 == Command_info[m].do_[0]) && 
			(object_info[n].menow2 == Command_info[m].do_[1])) 
		{ 
			count = 0; 
 
			for(i=10;i<34;i++) 
			{ 
				a = object_info[n].Novelity[i][4]; 
				b = object_info[n].Novelity[i][5]; 
 
				status = a + b * 255 + b; 
 
				novelity_info = getNovelity_info(object_info[n].Novelity[i][2], object_info[n].Novelity[i][3]); 
 
				if ((novelity_info.have) && (novelity_info.sell == 2)) 
				{ 
					sell[count].Now1    = i; 
					sell[count].Now2    = 0; 
					sell[count].status  = status; 
 
					sell[count].sell    = getnovelitysell(n, m, object_info[n].Novelity[i][2], object_info[n].Novelity[i][3], status, novelity_info); 
 
					count++; 
				} 
			} 
			 
			sellnovelity(s, count, sell); 
		} 
	} 
	else if (Command_info[m].command == 14) 
	{ 
		// 生命,体力,魔法恢复 
		if ((object_info[n].menow1 == Code1) && 
			(object_info[n].menow2 == Code2) && 
			(object_info[n].menow1 == Command_info[m].do_[0]) && 
			(object_info[n].menow2 == Command_info[m].do_[1])) 
		{ 
			if ((!object_info[n].died) && (object_info[n].status)) 
			{	 
				if ((object_info[n].life_now >= object_info[n].life_max) && 
					(object_info[n].mental_now >= object_info[n].mental_max) && 
					(object_info[n].brawn_now >= object_info[n].brawn_max)) 
				{ 
					sysmessage(s, 0x01, "您非常健康,不需要治疗", 0, FALSE); 
					return 0; 
				} 
 
				if (object_info[n].money >= Command_info[m].money) 
				{ 
					object_info[n].life_now   = object_info[n].life_max; 
					object_info[n].mental_now = object_info[n].mental_max; 
					object_info[n].brawn_now  = object_info[n].brawn_max; 
 
					object_info[n].money = object_info[n].money - Command_info[m].money; 
					info = object_info[n]; 
 
					setusermoneynumber(s, info.money); 
 
					remedyall(s, info); 
					sysmessage(s, 0x01, "治疗完毕", 0, FALSE); 
				} 
				else 
					sysmessage(s, 0x01, "金钱不足", 0, FALSE); 
			} 
		} 
	} 
	else if (Command_info[m].command == 15) 
	{ 
		// 生命,体力,魔法恢复 剑包和枪包恢复 
		if ((object_info[n].menow1 == Code1) && 
			(object_info[n].menow2 == Code2) && 
			(object_info[n].menow1 == Command_info[m].do_[0]) && 
			(object_info[n].menow2 == Command_info[m].do_[1])) 
		{ 
			if (object_info[n].level > Command_info[m].level) 
			{ 
				sysmessage(s, 0x01, "这项服务不提供给高等级的用户", 0, FALSE); 
				return 0; 
			} 
 
			if ((!object_info[n].died) && (object_info[n].status)) 
			{	 
				if ((object_info[n].life_now >= object_info[n].life_max) && 
					(object_info[n].mental_now >= object_info[n].mental_max) && 
					(object_info[n].brawn_now >= object_info[n].brawn_max)) 
				{ 
					sysmessage(s, 0x01, "您非常健康,不需要治疗", 0, FALSE); 
					return 0; 
				} 
 
			//	if (object_info[n].money >= Command_info[m].money) 
				{ 
					object_info[n].life_now   = object_info[n].life_max; 
					object_info[n].mental_now = object_info[n].mental_max; 
					object_info[n].brawn_now  = object_info[n].brawn_max; 
 
					if ((object_info[n].job == 2) || (object_info[n].job == 3)) 
					{ 
 
						if ((object_info[n].Novelity[4][2] != 0xFF) || (object_info[n].Novelity[4][3] != 0xFF)) 
						{				 
							Encode2(buf, 250); 
							 
							object_info[n].Novelity[4][6] = buf[1]; 
							object_info[n].Novelity[4][7] = buf[0]; 
						} 
					} 
					 
					 
			 
					info = object_info[n]; 
 
					remedyall(s, info); 
					if ((object_info[n].job == 2) || (object_info[n].job == 3)) 
						if ((object_info[n].Novelity[4][2] != 0xFF) || (object_info[n].Novelity[4][3] != 0xFF)) 
							setbulletnumber(s, 4, 250); 
 
					sysmessage(s, 0x01, "治疗完毕", 0, FALSE); 
				} 
			} 
		} 
	} 
	else if (Command_info[m].command == 16) 
	{ 
		// 中毒,异常治疗 
		if ((object_info[n].menow1 == Code1) && 
			(object_info[n].menow2 == Code2) && 
			(object_info[n].menow1 == Command_info[m].do_[0]) && 
			(object_info[n].menow2 == Command_info[m].do_[1])) 
		{ 
			 
		} 
	} 
	else if (Command_info[m].command == 17) 
	{ 
 
		// npc 命令移动 
		if ((object_info[n].menow1 == Code1) && 
			(object_info[n].menow2 == Code2) && 
			(object_info[n].menow1 == Command_info[m].do_[0]) && 
			(object_info[n].menow2 == Command_info[m].do_[1])) 
		{ 
 
			if (Command_info[m].have) 
			{ 
				if (object_info[n].money < Command_info[m].money) 
				{ 
					sysmessage(s, 0x01, "金钱不足", 0, FALSE); 
					return 0; 
				} 
 
				for(i=0;i 0) 
		{ 
			number --; 
			setbulletnumber(object_info[n].s, 4, number); 
 
			Encode2(buf, number); 
			object_info[n].Novelity[4][6] = buf[1]; 
			object_info[n].Novelity[4][7] = buf[0]; 
 
			return 0; 
		} 
		else 
		{ 
			return -1; 
		} 
	} 
 
	return 0; 
}