Ejemplo n.º 1
0
int equip_item(int cn,int in,int pos)
{
	int n;

	if (ch[cn].citem) return 0;
	
	if (pos<12) {	// item is worn
		if (!ch[cn].item[pos]) return 0;
                if (!swap(cn,pos)) return 0;
		return store_citem(cn);
	}
	// item is in inventory
	for (n=0; n<12; n++)
		if (!ch[cn].item[n] && can_wear(cn,in,n)) break;
	if (n<12) {
		if (!swap(cn,pos)) return 0;
		return swap(cn,n);
	}
	// special case for two-handed weapons. yuck
	if ((it[in].flags&IF_TWOHAND) && ch[cn].item[WN_LHAND]) {
		swap(cn,WN_LHAND);
		store_citem(cn);
	}

	for (n=0; n<12; n++)
		if (can_wear(cn,in,n)) break;
	if (n<12) {
		if (!swap(cn,pos)) return 0;
		if (!swap(cn,n)) return 0;
                return swap(cn,pos);
	}

	return 0;
}
Ejemplo n.º 2
0
// 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]);
	}
}
Ejemplo n.º 3
0
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;
}