⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 item.cpp

📁 idbot08源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	switch(code_id)
	{
	case 7758186: //jav
	case 6384185: //9ja
	case 6384183: //7ja

	case 7889268: //tax
	case 6386745: //9ta
	case 6386743: //7ta

	case 6712180: //tkf
	case 7042105: //9tk
	case 7042103: //7tk

	case 3501409: //am5
	case 6384993: //ama
	case 6712673: //amf

	case 7104880: //pil
	case 6910009: //9pi
	case 6910007: //7pi

	case 6712162: //bkf
	case 7037497: //9bk
	case 7037495: //7bk

	case 7102818: //bal
	case 3695161: //9b8
	case 3695159: //7b8

	case 7760999: //glv
	case 7104313: //9gl
	case 7104311: //7gl

	case 7369588: //tsp
	case 7566393: //9ts
	case 7566391: //7ts

		return TRUE;
	default: 
		return FALSE;
	}
}

char * CD2Item::GetColorCode()
{
	static char *cr_tb[10]={"","Inferior ","","Superior ","$$3","$$:","$$9","$$4","$$8","$$4Rune Word $$5"};
	static char *cr_tb_shocket[4]={"","$$5Inferior ","$$5","$$5Superior "};
	if(this->isRuneWord)
		return cr_tb[9];

	if(ItemQuality<4 && this->hasSockets)
		return cr_tb_shocket[ItemQuality];

	return cr_tb[ItemQuality];
}

int CD2Item::OperatorPriority(char op)
{
	switch(op)
	{
	case '*': return 5;
	case '/': return 5;
	case '+': return 4;
	case '-': return 4;
	case '=': return 3;
	case '#': return 3;
	case ']': return 3;
	case '[': return 3;
	case '>': return 3;
	case '<': return 3;
	case ',': return 2;
	case '|': return 1;
	case '(': return 0;
	case ')': return 0;
	default: return -1;
	}
}

int CD2Item::OpFunction(int l, int r, char op)
{
	int res;
	switch(op)
	{
	case '*': res= l*r;break;
	case '/':
		if(r)
		{
			res= l/r;
		}
		else
		{
			if(_debug)D2Print("$$1Error: Divided by zero.");
			res= 0;
		}
		break;
	case '+': res= l+r;break;
	case '-': res= l-r;break;
	case ']':
		res= (l>=r);
		if(_debug)D2Print("%d>=%d$$5=$$0%d",l,r,res);
		return res;
	case '[': 
		res= (l<=r);
		if(_debug)D2Print("%d<=%d$$5=$$0%d",l,r,res);
		return res;
	case '=': res= (l==r);break;
	case '>': res= (l>r);break;
	case '<': res= (l<r);break;
	case '#':
		res= (l!=r);
		if(_debug)D2Print("%d!=%d$$5=$$0%d",l,r,res);
		return res;
	case ',': res= l&&r;break;
	case '|': res= l||r;break;
	default: res= 0;break;
	}

	if(_debug)D2Print("%d%c%d$$5=$$0%d",l,op,r,res);
	return res;
}

BOOL CD2Item::LoadIdConfig()
{
	#include "itemsize.h"
	ITEM_SIZE *pp = ITEM_SIZE_TB;
	while(pp->code)
	{
		SIZE sz;
		sz.cx=pp->x;
		sz.cy=pp->y;
		_item_size[Code2Number(pp->code)]=sz;
		pp++;
	}

	char filename[MAX_PATH];
	if(!server->GetIniFileName("Identify",filename,MAX_PATH))
		return FALSE;

	LoadIdConfig_ModDef(filename);

	LoadIdConfig_Filter("Unique",ITEM_LEVEL_UNIQUE,filename);
	LoadIdConfig_Filter("Set",ITEM_LEVEL_SET,filename);
	LoadIdConfig_Filter("Rare",ITEM_LEVEL_RARE,filename);
	LoadIdConfig_Filter("Magic",ITEM_LEVEL_MAGIC,filename);
	LoadIdConfig_Filter("Normal",ITEM_LEVEL_NORMAL,filename);

	return TRUE;
}

BOOL CD2Item::LoadIdConfig_ModDef(char *filename)
{
	char kbuf[32000];
	int klen=GetPrivateProfileSection("MODDEF",kbuf,sizeof(kbuf),filename);
	char *p1=kbuf;
	while(p1-kbuf<klen && *p1)
	{
		char *p2=p1;

		while(*p2!='=') p2++;
		*p2=0;
		p2++;

		if(strlen(p2)==0 || *p2==';')
		{
			D2Print("$$1Warning: $$0empty mod: $$9%s",p1);
		}
		_mod_def[p1]=atoi(p2)+1;
		
		p1=p2;
		while(p1-kbuf<klen && *p1)p1++;
		p1++;
	}

	return TRUE;
}

void CD2Item::RemoveBlanks(char *str)
{
	char *p1,buf[1000];
	strcpy(buf,str);

	p1=buf;

	while(*p1 && p1-buf<sizeof(buf))
	{
		if(*p1==' '||*p1=='\t') 
		{
			p1++;
			continue;
		}
		
		*str=*p1;
		p1++;
		str++;
	}
	*str=0;
}

void CD2Item::LoadIdConfig_Filter(char *app,int Level,char *filename)
{
	char filter[10000];

	char kbuf[32000];
	int klen=GetPrivateProfileSection(app,kbuf,sizeof(kbuf),filename);
	char *p1=kbuf;
	while(p1-kbuf<klen && *p1)
	{
		char *p2=p1;
		while(*p2!='=') p2++;
		*p2=0;
		p2++;

		DWORD spec_code;
		if(Level==ITEM_LEVEL_SET||Level==ITEM_LEVEL_UNIQUE)
			spec_code=atoi(p1);
		else 
			spec_code=Code2Number(p1);
		
		sprintf(filter,"%d#%d#%s",Level,spec_code,p2);
		RemoveBlanks(filter);
		int fillen=strlen(filter);

		for(char *p3=filter;p3-filter<fillen;p3++)
		{
			if(*p3==';')
			{
				*p3=0;
				break;
			}
		}


		if(strlen(p2)==0 || *p2==';')
		{
			D2Print("$$1Warning: $$0empty filter: $$9%s",filter);
		}
		else _filter.push_back(filter);

		p1=p2;
		while(p1-kbuf<klen && *p1)p1++;
		p1++;
	}

}

#define FILTER_UNFIT -1
#define FILTER_FAILED 0
#define FILTER_SUCCEEDED 1

int CD2Item::Filter(const char *src)
{
	int Level=atoi(src);
	switch(this->ItemQuality)
	{
	case ITEM_LEVEL_INFERIOR:
	case ITEM_LEVEL_NORMAL:
	case ITEM_LEVEL_SUPERIOR:
		if(Level!=ITEM_LEVEL_NORMAL) return FILTER_UNFIT;
		break;
	case ITEM_LEVEL_MAGIC:
		if(Level!=ITEM_LEVEL_MAGIC) return FILTER_UNFIT;
		break;
	case ITEM_LEVEL_SET:
		if(Level!=ITEM_LEVEL_SET) return FILTER_UNFIT;
		break;
	case ITEM_LEVEL_UNIQUE:
		if(Level!=ITEM_LEVEL_UNIQUE) return FILTER_UNFIT;
		break;
	case ITEM_LEVEL_RARE:
	case ITEM_LEVEL_CRAFT:
		if(Level!=ITEM_LEVEL_RARE) return FILTER_UNFIT;
		break;
	}

	while(*src!='#' && *src)src++;
	if(!*src) return FILTER_UNFIT;
	src++;

	if(Level==ITEM_LEVEL_SET||Level==ITEM_LEVEL_UNIQUE)
	{
		if(atoi(src)!=this->UniqueId) return FILTER_UNFIT;
	}
	else 
	{
		if(atoi(src)!=this->code_id) return FILTER_UNFIT;
	}

	while(*src!='#' && *src)src++;
	if(!*src) return FILTER_UNFIT;
	src++;


	stack<char> op_stack;
	stack<int> num_stack;

	SINGLE_TOKEN token;
	const char *p;
	while((p=GetAToken(src,token))!=NULL)
	{
		switch(token.type)
		{
		case TOKEN_TYPE_BAD:
			return TRUE;
		case TOKEN_TYPE_UNSET:
			break;
		case TOKEN_TYPE_OP:
			if(op_stack.empty())
			{
				op_stack.push(token.op);
				src=p;
			}
			else if(token.op=='(' || OperatorPriority(token.op)>OperatorPriority(op_stack.top()))
			{
				op_stack.push(token.op);
				src=p;
			}
			else
			{
				if(op_stack.empty())
				{
					D2Print("$$1Expression error.");
					return TRUE;
				}

				if(op_stack.top()=='(')
				{
					op_stack.pop();
					if(token.op==')') src=p;
					break;
				}

				if(num_stack.empty())
				{
					D2Print("$$1Expression error.");
					return TRUE;
				}
				int r=num_stack.top();
				num_stack.pop();
				if(num_stack.empty())
				{
					D2Print("$$1Expression error.");
					return TRUE;
				}
				int l=num_stack.top();
				num_stack.pop();
				num_stack.push(OpFunction(l,r,op_stack.top()));
				op_stack.pop();
			}
			break;
		case TOKEN_TYPE_NUM:
			num_stack.push(token.num);
			src=p;
			break;
		case TOKEN_TYPE_VAR:
			num_stack.push(VarToNum(token.var));
			if(_debug)
				D2Print("%s$$5=$$3%d",token.var,num_stack.top());
			src=p;
			break;
		}
	}
	while(!op_stack.empty())
	{
		if(op_stack.top()=='(')
		{
			op_stack.pop();
			continue;
		}

		if(num_stack.empty())
		{
			D2Print("$$1Expression error.");
			return TRUE;
		}
		int r=num_stack.top();
		num_stack.pop();
		if(num_stack.empty())
		{
			D2Print("$$1Expression error.");
			return TRUE;
		}
		int l=num_stack.top();
		num_stack.pop();
		num_stack.push(OpFunction(l,r,op_stack.top()));
		op_stack.pop();
	}

	if(num_stack.size()>1)
	{
		D2Print("$$1Expression error.");
		return TRUE;
	}
	if(_debug)D2Print("Result$$5=$$%d%d",!!num_stack.top()+1,!!num_stack.top());
	return num_stack.top();
}


BOOL CD2Item::Identify()
{
	if(!this->isIdentified)return TRUE;
	if(	this->mod_num==0 ) 
	{
		if(ItemQuality==ITEM_LEVEL_MAGIC||ItemQuality==ITEM_LEVEL_SET||ItemQuality==ITEM_LEVEL_UNIQUE)
			return TRUE;

		if(ItemQuality==ITEM_LEVEL_RARE||ItemQuality==ITEM_LEVEL_CRAFT)
		{
			isUselessItem=TRUE;
			return FALSE;
		}
	}

	BOOL filter_defined=FALSE;
	list<string>::iterator i;
	for(i=_filter.begin();i!=_filter.end();i++)
	{
		switch(Filter(i->c_str()))
		{
		case FILTER_SUCCEEDED:
			return TRUE;
		case FILTER_FAILED:
			filter_defined=TRUE;
			continue;
		default:
			continue;
		}
	}

	if(filter_defined)
	{
		isUselessItem=TRUE;
		return FALSE;
	}
	else return TRUE;
}

const char* CD2Item::GetAToken(const char *p,SINGLE_TOKEN&token)
{
	token.type=TOKEN_TYPE_OP;

	switch(*p)
	{
	case 0: 
		token.type=TOKEN_TYPE_UNSET;
		return NULL;
	case ':': 
		token.op=']';
		return p+1;
	case '>': 
		if(p[1]=='=')
		{
			token.op=']';
			return p+2;
		}
		token.op='>';
		return p+1;
	case '<':
		if(p[1]=='=')
		{
			token.op='[';
			return p+2;
		}
		token.op='<';
		return p+1;
	case ',':
		token.op=',';
		return p+1;
	case '&': 
		if(p[1]=='&')
		{
			token.op=',';
			return p+2;;
		}
		break;
	case '!':
		if(p[1]=='=')
		{
			token.op='#';
			return p+2;;
		}
		break;
	case '|':
		token.op='|';
		if(p[1]=='|')
		{
			return p+2;;
		}
		return p+1;
	case '=': 
		token.op='=';
		if(p[1]=='=')
		{
			return p+2;;
		}
		return p+1;
	case ')': 
	case '(': 
	case '*': 
	case '/': 
	case '+': 
	case '-': 
		token.op=*p;
		return p+1;
	}

	if(*p>='A'&&*p<='Z' ||*p>='a'&&*p<='z')
	{
		//变量
		token.type=TOKEN_TYPE_VAR;
		char *pdst=token.var;
		while(*p>='A'&&*p<='Z' ||*p>='a'&&*p<='z'||*p>='0'&&*p<='9'||*p=='_'||*p=='%')
		{
			if(pdst-token.var<sizeof(token.var)-1)
			{
				*pdst=*p;
				pdst++;
			}

			p++;
		}
		*pdst=0;
		return p;
	}
	else if(*p>='0'&&*p<='9')
	{
		//变量
		token.type=TOKEN_TYPE_NUM;
		token.num=atoi(p);

		while(*p>='0'&&*p<='9')p++;
		return p;
	}
	else 
	{
		D2Print("$$1Expression error: bad character '%c'",*p);
		token.type=TOKEN_TYPE_BAD;
		return p;
	}
}


int CD2Item::VarToNum(char *var)
{
	if(strcmp("basedef",var)==0)
		return this->nDefense;
	if(strcmp("eth",var)==0)
		return this->isEthereal;
	if(strcmp("socket",var)==0)
		return this->nSocket;
	if(strcmp("ilvl",var)==0)
		return this->Ilvl;
	if(strcmp("durability",var)==0)
		return this->nDur;
	if(strcmp("max_durability",var)==0)
		return this->nMaxDur;
	if(strcmp("quantity",var)==0)
		return this->nQuantity;
	

	//换成属性id
	int modid=_mod_def[var];
	if(!modid) 
	{
		D2Print("$$1Undifined Mod:$$1 %s",var);
		return 0;
	}
	
	modid--;
	int secid=0;

	if(modid>=10000)
	{
		secid=modid%10000;
		modid/=10000;
	}
	
	for(int i=0;i<mod_num;i++)
	{
		ITEM_MOD *p=&mod[i];
		if(p->id==188 && modid==126 && p->value[0]==secid)
		{
			return p->value[1];
		}


		if(modid==126)
		{
			if(p->id>188) break;
		}
		else 
		{
			if(p->id>modid) break;
		}

		if(p->id<modid) continue;

		switch(modid)
		{
		case 97://+skill 
		case 83://+skill_class 
		case 126://+skill_table
		case 107://+skill_spec
		case 204://skill charge
			if(p->value[0]==secid) return p->value[1];
			break;
		case 195://skill attack
		case 196://skill kill
		case 197://skill die
		case 198://skill striking
		case 199://skill level up
		case 201://skill struck
			if(p->value[1]==secid) return p->value[0];
			break;
		case 57:
			return p->value[1];
		default:
			return p->value[0];
		}
	}
	
	return 0;
}


SIZE CD2Item::GetItemSize()
{
	SIZE sz={0,0};
	if(isEar)
	{
		sz.cx=1;
		sz.cy=1;
		return sz;
	}

	if(_item_size.find(code_id)!=_item_size.end())
	{
		sz=_item_size[code_id];
	}

	if(sz.cx==0||sz.cy==0)
	{
		sz.cx=2;
		sz.cy=4;
	}
	return sz;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -