コード例 #1
0
ファイル: look.c プロジェクト: mudchina/es2-utf8
int main(object me, string arg)
{
	object obj;
	int result;

	if( !arg ) result = look_room(me, environment(me));
	else if( (obj = present(arg, me)) || (obj = present(arg, environment(me)))) {
		if( obj->is_character() ) result = look_living(me, obj);
		else result = look_item(me, obj);
	} else result = look_room_item(me, arg);

	return result;
}
コード例 #2
0
ファイル: do.c プロジェクト: AstoniaDev/v3.0-server
int look_inv(int cn,int pos)
{
	int in;

	if (cn<1 || cn>=MAXCHARS) { error=ERR_ILLEGAL_CHARNO; return 0; }
        if (ch[cn].flags&(CF_DEAD)) { error=ERR_DEAD; return 0; }

	if (pos<0 || pos>=INVENTORYSIZE) { error=ERR_ILLEGAL_POS; return 0; }

	in=ch[cn].item[pos];
	if (!in) {
		log_char(cn,LOG_SYSTEM,0,"Empty spaces...");
		return 1;
	}

	look_item(cn,it+in);

	return 1;
}
コード例 #3
0
ファイル: depot.c プロジェクト: ProjectAstonia/server-files
// character (usually a player) cn is using store NR
// flag=1 take/drop, flag=0 look
void player_depot(int cn,int nr,int flag,int fast)
{
        struct depot_ppd *ppd;
	
	ppd=set_data(cn,DRD_DEPOT_PPD,sizeof(struct depot_ppd));
	if (!ppd) return;
	
        if (flag) {
		if (fast && ch[cn].citem) {
			for (nr=0; nr<MAXDEPOT; nr++) {
				if (!(ppd->itm[nr].flags)) break;
			}
			if (nr==MAXDEPOT) return;
			swap_depot(cn,nr);
		} else {
			swap_depot(cn,nr);
			if (fast) store_citem(cn);
		}
	} else {
		if (!ppd->itm[nr].flags) return;
		look_item(cn,&ppd->itm[nr]);
	}
}
コード例 #4
0
ファイル: libload.c プロジェクト: AstoniaDev/v3.0-server
int item_driver(int nr,int in,int cn)
{
	int n,tmp=0;

	if (nr==0) {
		if (cn) look_item(cn,it+in);
		return 1;
	}

	if (nr>=1000) return 1;	// identity tag
	
	if (nr<0 || nr>=MAXDRV) {
		elog("ERROR: Item driver %d out of bounds",nr);
		return 0;
	}

	switch(nr) {
		case IDR_BONEBRIDGE:	if (areaID!=18) {
						if (cn) log_char(cn,LOG_SYSTEM,0,"This does not work outside its area.");						
						return 1;
					}
					break;
		case IDR_BONEHINT:	if (areaID!=18) {
						if (cn) log_char(cn,LOG_SYSTEM,0,"This does not work outside its area.");						
						return 1;
					}
					break;
		case IDR_NOMADDICE:	if (areaID!=19) {
						if (cn) log_char(cn,LOG_SYSTEM,0,"This does not work outside its area.");						
						return 1;
					}
					break;
		case IDR_STAFFER2:	if (areaID!=29) {
						if (cn) log_char(cn,LOG_SYSTEM,0,"This does not work outside its area.");						
						return 1;
					}
					break;
		case IDR_OXYPOTION:	if (areaID!=31) {
						if (cn) log_char(cn,LOG_SYSTEM,0,"This does not work outside its area.");						
						return 1;
					}
					break;
		case IDR_LIZARDFLOWER:	if (areaID!=31) {
						if (cn) log_char(cn,LOG_SYSTEM,0,"This does not work outside its area.");						
						return 1;
					}
					break;
		case IDR_CALIGAR:	if (areaID!=36) {
						if (cn) log_char(cn,LOG_SYSTEM,0,"This does not work outside its area.");						
						return 1;
					}
					break;
		case IDR_ARKHATA:	if (areaID!=37) {
						if (cn) log_char(cn,LOG_SYSTEM,0,"This does not work outside its area.");						
						return 1;
					}
					break;
	}

	if ((n=fast_itdrv[nr]) && libs[n].used && load_lib(libs+n) && (tmp=libs[n].driver(CDT_ITEM,nr,in,cn,0))) return tmp;

	//xlog("Fast lookup failed for item driver %d.",nr);

	for (n=1; n<MAXLIB; n++)
		if (libs[n].used && load_lib(libs+n) && (tmp=libs[n].driver(CDT_ITEM,nr,in,cn,0))) break;
	
	if (n==MAXLIB) {
		elog("ERROR: Could not find item driver %d in any library",nr);
		return 0;
	}

	fast_itdrv[nr]=n;

	return tmp;
}
コード例 #5
0
ファイル: mine.c プロジェクト: Bloodknight/Astonia_Server_3.0
int enhance_item(int in,int cn)
{
	int in2,spr,m,need,price;

        if (!(in2=ch[cn].citem)) return 0;

	if (it[in2].flags&IF_NOENHANCE) return 0;

	if (!(spr=enhance_item_sprite(in2))) return 0;

	if ((spr>=59200 && spr<59299) || spr==59474) {	// silver item
		if (it[in].drdata[0]!=2) {	// needs gold
			log_char(cn,LOG_SYSTEM,0,"This item has already been enhanced once. For further enhancements, you need gold.");
			return 1;
		}
	} else {			// normal item
		if (it[in].drdata[0]!=1) {	// needs silver
			log_char(cn,LOG_SYSTEM,0,"To enhance this item, you need silver.");
			return 1;
		}
	}

	need=enhance_item_price(in2);
	if (need>*(unsigned int*)(it[in].drdata+1)) {
		log_char(cn,LOG_SYSTEM,0,"You do not have enough %s to enhance this item. You need %d units.",it[in].name,need);
		return 1;
	}

	if (enhance_cannot_use(in2,cn) && (*(unsigned int *)(it[in].drdata+8)!=in2 || realtime-*(unsigned int *)(it[in].drdata+12)>15)) {
		log_char(cn,LOG_SYSTEM,0,"Enhancing this item would make it unusable for you. Click again if this is what you want.");
		*(unsigned int *)(it[in].drdata+8)=in2;
		*(unsigned int *)(it[in].drdata+12)=realtime;
		return 1;
	}

	price=it[in].value*need/(*(unsigned int*)(it[in].drdata+1));
	*(unsigned int*)(it[in].drdata+1)-=need;
	if (*(unsigned int*)(it[in].drdata+1)<1) {
		if (ch[cn].flags&CF_PLAYER) dlog(cn,in,"dropped because it was used to enhance item");
		remove_item_char(in);
		destroy_item(in);
	} else {
		it[in].value-=price;	//it[in].value*(*(unsigned int*)(it[in].drdata+1))/(need+(*(unsigned int*)(it[in].drdata+1)));
		sprintf(it[in].description,"%d units of %s.",*(unsigned int*)(it[in].drdata+1),it[in].name);
	}
	
	it[in2].sprite=spr;
	it[in2].value=it[in2].value+price;

	for (m=0; m<MAXMOD; m++) {
		if (it[in2].mod_value[m]) {
			switch(it[in2].mod_index[m]) {
				case -V_ARMORSKILL:	it[in2].mod_value[m]+=10; break;
				case -V_DAGGER:		it[in2].mod_value[m]+=10; break;
				case -V_STAFF:		it[in2].mod_value[m]+=10; break;
				case -V_SWORD:          it[in2].mod_value[m]+=10; break;
				case -V_TWOHAND:	it[in2].mod_value[m]+=10; break;
				case V_ARMOR:		it[in2].mod_value[m]+=armorbonus(in2); break;
				case V_WEAPON:		it[in2].mod_value[m]+=10; break;
				default:		if (it[in2].mod_index[m]>=0 && it[in2].mod_value[m]<20) it[in2].mod_value[m]++;
							break;
			}
		}
	}
	set_item_requirements(in2);
	ch[cn].flags|=CF_ITEMS;

	look_item(cn,it+in2);
	log_char(cn,LOG_SYSTEM,0,"You used %d units to enhance your %s.",need,it[in2].name);

	return 1;
}
コード例 #6
0
ファイル: do.c プロジェクト: AstoniaDev/v3.0-server
int container(int cn,int pos,int flag,int fast)
{
	int in,in2,ct,x,y,noquest=0;

        if (cn<1 || cn>=MAXCHARS) { error=ERR_ILLEGAL_CHARNO; return 0; }

	if (!dx2offset(ch[cn].dir,&x,&y,NULL)) { error=ERR_ILLEGAL_DIR; return 0; }

	if (ch[cn].flags&(CF_DEAD)) { error=ERR_DEAD; return 0; }

	x+=ch[cn].x;
	y+=ch[cn].y;
	if (x<1 || x>MAXMAP-2 || y<1 || y>MAXMAP-2) { error=ERR_ILLEGAL_COORDS; return 0; }

	in=map[x+y*MAXMAP].it;
	if (!in) { error=ERR_NO_ITEM; return 0; }

        if (in<1 || in>=MAXITEM) {
		elog("container(): found illegal item %d on map pos %d,%d, removing.",in,x,y);
		map[x+y*MAXMAP].it=0;
		
		error=ERR_CONFUSED;
		return 0;
	}

	ct=it[in].content;
	if (!ct) { error=ERR_NOT_CONTAINER; return 0; }
	
	if (ct<1 || ct>=MAXCONTAINER) {
		elog("container(): found illegal container %d in item %s (%d), removing.",ct,it[in].name,in);
		it[in].content=0;
		
		error=ERR_CONFUSED;
		return 0;
	}

	if (pos<0 || pos>=INVENTORYSIZE) { error=ERR_ILLEGAL_POS; return 0; }

	if ((con[ct].owner && charID(cn)!=con[ct].owner)) {
		if (charID(cn)==con[ct].killer) {
			if (it[in].flags&IF_PLAYERBODY) noquest=1;			
		} else if (charID(cn)==con[ct].access) {
			noquest=1;
		} else {
			error=ERR_ACCESS_DENIED;
			return 0;
		}
	}
	if (con[ct].owner==charID(cn) && con[ct].owner_not_seyan==1 && (ch[cn].flags&(CF_MAGE|CF_WARRIOR))==(CF_MAGE|CF_WARRIOR)) noquest=1;

	if (flag) {	// swap
		in2=ch[cn].citem;
                if (it[in2].flags&IF_QUEST) { error=ERR_QUESTITEM; return 0; }

		in=con[ct].item[pos];

		if (noquest && in && (it[in].flags&IF_QUEST)) { error=ERR_QUESTITEM; return 0; }

		if (ch[cn].flags&CF_PLAYER) {
			if (in) {
				if (con[ct].in) dlog(cn,in,"took %s from container (item %d/%s/%s)",it[in].name,con[ct].in,it[con[ct].in].name,it[con[ct].in].description);
				else if (con[ct].cn) dlog(cn,in,"took %s from container (char %d/%s/%s)",it[in].name,con[ct].cn,ch[con[ct].cn].name,ch[con[ct].cn].description);
				else dlog(cn,in,"took %s from container (unspec?)",it[in].name);
			}

			if (in2) {
				if (con[ct].in) dlog(cn,in2,"dropped %s into container (item %d/%s/%s)",it[in2].name,con[ct].in,it[con[ct].in].name,it[con[ct].in].description);
				else if (con[ct].cn) dlog(cn,in2,"took %s from container (char %d/%s/%s)",it[in2].name,con[ct].cn,ch[con[ct].cn].name,ch[con[ct].cn].description);
				else dlog(cn,in2,"dropped %s into container (unspec?)",it[in2].name);
			}
		}

                ch[cn].citem=in; it[in].carried=cn; it[in].contained=0;
                con[ct].item[pos]=in2; it[in2].contained=ct; it[in2].carried=0;

		if (fast) store_citem(cn);
	
		ch[cn].flags|=CF_ITEMS;
	} else {
		if ((in=con[ct].item[pos]))
			look_item(cn,it+in);
	}

	return 1;
}