On Sun, 30 Mar 2003, Mark Wedel wrote: > > Would it be sufficient to just have a command that unapplies all your rings? > That is much easier to do - don't need to store any extra information in the > ring object itself, and as said, something like that could probably be done in > the client. > A command to unapply all rings is not sufficient. It would not save the problem of applying two rings of ice. "apply ring of ice; apply ring of ice" would still first equip one ring, then unequip this ring, while "apply -a ring of ice; apply -a ring of ice" would try to apply the same ring twice, whichever that is. But, i think i have found a quick solution that will solve most problems; without further blowing up object structure. I have changed the behavior of the "apply -a" and the "apply -u" commands. Now "apply -u" will only match to applied objects, while "apply -a" will only match unapplied ones. (see attached patchfile) Thus, "apply -u ring; apply -u ring; apply -a ring of ice; apply -a ring of ice" will now unequip any two rings you have equipped, then equip both rings of ice. Even fireborns will be able to juggle their 4 rings and 2 amulets with bound commands. However, i agree : this kind of stuff should be done in the client. Bernd Edler -------------- next part -------------- *** orig/server/c_object.c Tue Apr 1 06:39:25 2003 --- server/c_object.c Tue Apr 1 06:42:29 2003 *************** *** 72,77 **** --- 72,97 ---- } return best; } + /* Simlilar to find_best_object_match , but accepts an + * additional parameter for apply -u , and apply -a to + * only unapply applied , or apply unapplied objects + */ + object *find_best_apply_object_match(object *pl, char *params, enum apply_flag aflag) + { + object *tmp, *best=NULL; + int match_val=0,tmpmatch; + + for (tmp=pl->inv; tmp; tmp=tmp->below) { + if (tmp->invisible) continue; + if ((tmpmatch=item_matched_string(pl, tmp, params))>=match_val) { + if ((aflag==AP_APPLY) && (QUERY_FLAG(tmp,FLAG_APPLIED))) continue; + if ((aflag==AP_UNAPPLY) && (!QUERY_FLAG(tmp,FLAG_APPLIED))) continue; + match_val=tmpmatch; + best=tmp; + } + } + return best; + } /* * Notes about item creation: *************** *** 426,432 **** } while (*params==' ') params++; ! inv=find_best_object_match(op, params); if (inv) { player_apply(op,inv,aflag,0); } else --- 446,452 ---- } while (*params==' ') params++; ! inv=find_best_apply_object_match(op, params, aflag); if (inv) { player_apply(op,inv,aflag,0); } else