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