barry@adelie.UUCP (Barry A. Burke) (01/14/86)
ough for login name .99 */ boolean in_mklev, restoring; --- 5,11 ----- char nul[40]; /* contains zeros */ char plname[PL_NSIZ]; /* player name */ char lock[PL_NSIZ+4] = "1lock"; /* long enough for login name .99 */ + char sortlist[SOBJLEN+1]; /* sort order for inventory list */ boolean in_mklev, restoring; *** hack.invent.c.old Tue Dec 31 15:48:32 1985 --- hack.invent.c Mon Jan 6 22:54:27 1986 *************** *** 43,48 (i < 26) ? ('a'+i) : ('A'+i-26)); lastinvnr = i; } struct obj * addinv(obj) --- 43,50 ----- (i < 26) ? ('a'+i) : ('A'+i-26)); lastinvnr = i; } + /* Barry A. Burke <barry@adelie.UUCP> modified addinv() Jan 6, 1985 to + sort the inventory list by type. */ struct obj * addinv(obj) *************** *** 49,54 register struct obj *obj; { register struct obj *otmp; /* merge or attach to end of chain */ if(!invent) { --- 51,58 ----- register struct obj *obj; { register struct obj *otmp; + int i; + extern char sortlist[]; /* merge or attach to end of chain */ if(!invent) { *************** *** 65,91 } obj->nobj = 0; ! if(flags.invlet_constant) { ! assigninvlet(obj); ! /* ! * The ordering of the chain is nowhere significant ! * so in case you prefer some other order than the ! * historical one, change the code below. ! */ ! if(otmp) { /* find proper place in chain */ ! otmp->nobj = 0; ! if((invent->invlet ^ 040) > (obj->invlet ^ 040)) { ! obj->nobj = invent; ! invent = obj; ! } else ! for(otmp = invent; ; otmp = otmp->nobj) { ! if(!otmp->nobj || ! (otmp->nobj->invlet ^ 040) > (obj->invlet ^ 040)){ ! obj->nobj = otmp->nobj; ! otmp->nobj = obj; ! break; ! } ! } } } --- 69,95 ----- } obj->nobj = 0; ! if(flags.invlet_constant) ! assigninvlet(obj); /* gotta have a letter assigned! */ ! ! /* Now, let's sort the new object into the list by object type. */ ! i = (int) (index(sortlist, obj->olet) - sortlist); ! if ( i <= 0 ) ! i = 100; ! ! if(otmp) { /* find proper place in chain */ ! otmp->nobj = 0; ! if ( i < (int) (index(sortlist, invent->olet) - sortlist)) { ! obj->nobj = invent; ! invent = obj; ! } else ! for(otmp = invent; ; otmp = otmp->nobj) { ! if(!otmp->nobj || ! (i<(int)(index(sortlist,otmp->nobj->olet)-sortlist))) { ! obj->nobj = otmp->nobj; ! otmp->nobj = obj; ! break; ! } } } *** hack.options.c.orig Mon Dec 23 11:40:24 1985 --- hack.options.c Wed Jan 8 14:23:38 1986 *************** *** 5,10 #include "hack.h" extern char *eos(); initoptions() { register char *opts; --- 5,12 ----- #include "hack.h" extern char *eos(); + extern char sortlist[]; + initoptions() { register char *opts; *************** *** 17,22 flags.end_top = 5; flags.end_around = 4; flags.female = FALSE; /* players are usually male */ if(opts = getenv("HACKOPTIONS")) parseoptions(opts,TRUE); --- 19,26 ----- flags.end_top = 5; flags.end_around = 4; flags.female = FALSE; /* players are usually male */ + (void) strcpy( sortlist, "$" ); /* gotta seed it for `index' */ + (void) strncat( sortlist, SORTOBJ, strlen(SORTOBJ) ); if(opts = getenv("HACKOPTIONS")) parseoptions(opts,TRUE); *************** *** 107,112 return; } /* endgame:5t[op] 5a[round] o[wn] */ if(!strncmp(opts,"endgame",3)) { op = index(opts,':'); --- 111,129 ----- return; } + /* sortobj:string */ + if(!strncmp(opts,"sortobj",4)) { + if(!from_env) { + pline("The inventory sort list can be set only from HACKOPTIONS."); + return; + } + op = index(opts,':'); + if(!op) goto bad; + (void) strcpy(sortlist, "$"); /* Need an offset of 1 */ + (void) strncat(sortlist, op+1, SOBJLEN-1); + return; + } + /* endgame:5t[op] 5a[round] o[wn] */ if(!strncmp(opts,"endgame",3)) { op = index(opts,':'); *************** *** 145,151 if(!strncmp(opts, "help", 4)) { pline("%s%s%s", "To set options use `HACKOPTIONS=\"<options>\"' in your environment, or ", ! "give the command 'o' followed by the line `<options>' while playing. ", "Here <options> is a list of <option>s separated by commas." ); pline("%s%s%s", "Simple (boolean) options are rest_on_space, news, time, ", --- 162,168 ----- if(!strncmp(opts, "help", 4)) { pline("%s%s%s", "To set options use `HACKOPTIONS=\"<options>\"' in your environment, or ", ! "give the command 'O' followed by the line `<options>' while playing. ", "Here <options> is a list of <option>s separated by commas." ); pline("%s%s%s", "Simple (boolean) options are rest_on_space, news, time, ", *************** *** 149,155 "Here <options> is a list of <option>s separated by commas." ); pline("%s%s%s", "Simple (boolean) options are rest_on_space, news, time, ", ! "null, tombstone, (fe)male. ", "These can be negated by prefixing them with '!' or \"no\"." ); pline("%s", "A string option is name, as in HACKOPTIONS=\"name:Merlin-W\"." ); --- 166,172 ----- "Here <options> is a list of <option>s separated by commas." ); pline("%s%s%s", "Simple (boolean) options are rest_on_space, news, time, ", ! "null, tombstone, (fe)male, fixinvlet. ", "These can be negated by prefixing them with '!' or \"no\"." ); pline("%s", "A string option is name, as in HACKOPTIONS=\"name:Merlin-W\"." ); *************** *** 153,158 "These can be negated by prefixing them with '!' or \"no\"." ); pline("%s", "A string option is name, as in HACKOPTIONS=\"name:Merlin-W\"." ); pline("%s%s%s", "A compound option is endgame; it is followed by a description of what ", "parts of the scorelist you want to see. You might for example say: ", --- 170,181 ----- "These can be negated by prefixing them with '!' or \"no\"." ); pline("%s", "A string option is name, as in HACKOPTIONS=\"name:Merlin-W\"." ); + pline("%s%s%s%s%s", + "A string option is sortobj; it is followed by a list of the 11 object ", + "class letters in the order you want inventories sorted. If all 11 ", + "letters are not provided, unspecified items are tacked onto the end; ", + "a null string means do no sorting. The default sort order is \"", + SORTOBJ, "\"." ); pline("%s%s%s", "A compound option is endgame; it is followed by a description of what ", "parts of the scorelist you want to see. You might for example say: ", *************** *** 160,166 return; } pline("Bad option: %s.", opts); ! pline("Type `o help<cr>' for help."); return; } puts("Bad syntax in HACKOPTIONS."); --- 183,189 ----- return; } pline("Bad option: %s.", opts); ! pline("Type `O help<cr>' for help."); return; } puts("Bad syntax in HACKOPTIONS."); *************** *** 187,192 if(flags.notombstone) (void) strcat(buf,"notombstone,"); if(flags.no_rest_on_space) (void) strcat(buf,"!rest_on_space,"); if(flags.end_top != 5 || flags.end_around != 4 || flags.end_own){ (void) sprintf(eos(buf), "endgame: %u topscores/%u around me", flags.end_top, flags.end_around); --- 210,217 ----- if(flags.notombstone) (void) strcat(buf,"notombstone,"); if(flags.no_rest_on_space) (void) strcat(buf,"!rest_on_space,"); + (void) strcat(buf,"sortobj:"); + (void) strcat(buf,sortlist); if(flags.end_top != 5 || flags.end_around != 4 || flags.end_own){ (void) sprintf(eos(buf), "endgame: %u topscores/%u around me", flags.end_top, flags.end_around); *** help.orig Mon Dec 23 11:42:07 1985 --- help Tue Jan 7 13:21:00 1986 *************** *** 109,114 They can be negated by prefixing them with '!' or "no". A string option is name; it supplies the answer to the question "Who are you?"; it may have a suffix. A compound option is endgame; it is followed by a description of what parts of the list of topscorers should be printed when the game is finished. --- 109,117 ----- They can be negated by prefixing them with '!' or "no". A string option is name; it supplies the answer to the question "Who are you?"; it may have a suffix. + A string option is sortobj; this is a list of the object + type letters in the order you would like them shown in + inventories. A compound option is endgame; it is followed by a description of what parts of the list of topscorers should be printed when the game is finished. -- LIVE: Barry A. Burke, (617) 965-8480 x26 USPS: Adelie Corporation, 288 Walnut St., Newtonville, MA 02160 UUCP: ..!{harvard | decvax!linus!axiom}!adelie!barry ARPA: adelie!barry@harvard.HARVARD.EDU, barry%adelie.UUCP@harvard.HARVARD.EDU