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; }
// 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]); } }
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; }