Thread View: net.games.hack
1 messages
1 total messages
Started by Peter L DeWolf
Wed, 03 Jul 1985 14:45
Sorting your inventory
Author: Peter L DeWolf
Date: Wed, 03 Jul 1985 14:45
Date: Wed, 03 Jul 1985 14:45
202 lines
6304 bytes
6304 bytes
Someone recently posted a patch to hack that caused your pack to be
kept sorted by object type. I tried this out and decided that I like
having a sorted inventory, but don't like having it done automatically --
I like knowing where certain things are in my pack without having to
use the "i" or "I" command every time I pick something up. There were also
a few bugs in the code as given.
Here is my set of changes which provide:
1) a "#sort" command to sort your inventory
2) an "inventory:<chars>" option to specify the order of item
types in the inventory.
context diffs for hack.cmd.c, hack.invent.c, hack.options.c, and hack.u_init.c
follow.
*** hack.cmd.c.orig Fri Jun 14 13:52:18 1985
--- hack.cmd.c Tue Jun 18 11:54:42 1985
***************
*** 9,15
dosave(),dowield(),ddoinv(),dozap(),ddocall(),dowhatis(),doengrave(),dotele(),
dohelp(),doeat(),doddrop(),do_mname(),doidtrap(),doprwep(),doprarm(),
doprring(),doprgold(),dodiscovered(),dotypeinv(),dolook(),doset(),
! doup(), dodown(), done1(), donull(), dothrow(), doextcmd(), dodip();
#ifdef SHELL
int dosh();
#endif SHELL
--- 9,15 -----
dosave(),dowield(),ddoinv(),dozap(),ddocall(),dowhatis(),doengrave(),dotele(),
dohelp(),doeat(),doddrop(),do_mname(),doidtrap(),doprwep(),doprarm(),
doprring(),doprgold(),dodiscovered(),dotypeinv(),dolook(),doset(),
! doup(), dodown(), done1(), donull(), dothrow(), doextcmd(), dodip(), dosort();
#ifdef SHELL
int dosh();
#endif SHELL
***************
*** 83,88
struct ext_func_tab extcmdlist[] = {
"dip", dodip,
(char *) 0, donull
};
--- 83,89 -----
struct ext_func_tab extcmdlist[] = {
"dip", dodip,
+ "sort", dosort,
(char *) 0, donull
};
*** hack.invent.c.orig Fri Jun 14 13:52:43 1985
--- hack.invent.c Wed Jul 3 10:19:22 1985
***************
*** 30,35
return(obj);
}
useup(obj)
register struct obj *obj;
{
--- 30,82 -----
return(obj);
}
+ static
+ classLess(newLet,establishedLet) {
+ char *nindex, *eindex;
+ extern char sortsequence[];
+
+ if (newLet == establishedLet) return(FALSE); /* if same, not less */
+ nindex = index(sortsequence,newLet); /* find new letter */
+ if (!nindex) return(FALSE); /* if not, not less */
+ eindex = index(sortsequence,establishedLet); /* find old letter */
+ return(eindex ? (nindex < eindex) : TRUE);
+ }
+
+ dosort() {
+ register struct obj *obj;
+ register struct obj *itmp;
+ register struct obj *otmp;
+
+ for (itmp = invent, invent = NULL; itmp;) {
+ obj = itmp;
+ itmp = obj->nobj;
+ if (!invent) {
+ invent = obj;
+ obj->nobj = NULL;
+ continue;
+ }
+ for(otmp = invent; otmp; otmp = otmp->nobj) {
+ /* this may go at head of inventory */
+ if (classLess(obj->olet,otmp->olet)) {
+ obj->nobj = otmp;
+ invent = obj;
+ break;
+ }
+ /* else, may go after current item */
+ if ( !otmp->nobj
+ || ( (obj->olet == otmp->olet)
+ && (obj->olet != otmp->nobj->olet)
+ )
+ || classLess(obj->olet,otmp->nobj->olet)
+ ) {
+ obj->nobj = otmp->nobj;
+ otmp->nobj = obj;
+ break;
+ }
+ }
+ }
+ }
+
useup(obj)
register struct obj *obj;
{
*** hack.options.c.orig Tue Jun 18 12:37:00 1985
--- hack.options.c Wed Jul 3 10:18:36 1985
***************
*** 5,10
#include "hack.h"
extern char *eos();
initoptions()
{
register char *opts;
--- 5,16 -----
#include "hack.h"
extern char *eos();
+ /* Collating sequence for sorting objects in an inventory.
+ Just rearrange the characters in this string to change the sequence.
+ This can be done with the "inventory" option.
+ */
+ char sortsequence[] = ")0[(%!?/=*\"";
+
initoptions()
{
register char *opts;
***************
*** 98,103
return;
}
/* endgame:5t[op] 5a[round] o[wn] */
if(!strncmp(opts,"endgame",3)) {
op = index(opts,':');
--- 104,117 -----
return;
}
+ /* inventory:string */
+ if(!strncmp(opts,"inventory",9)) {
+ op = index(opts,':');
+ if(!op) goto bad;
+ (void) strncpy(sortsequence, op+1, sizeof sortsequence-1);
+ return;
+ }
+
/* endgame:5t[op] 5a[round] o[wn] */
if(!strncmp(opts,"endgame",3)) {
op = index(opts,':');
***************
*** 178,183
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);
--- 192,198 -----
if(flags.notombstone) (void) strcat(buf,"notombstone,");
if(flags.no_rest_on_space)
(void) strcat(buf,"!rest_on_space,");
+ (void) sprintf(eos(buf),"inventory:%s,",sortsequence);
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);
*** hack.u_init.c.orig Fri Jun 14 13:53:15 1985
--- hack.u_init.c Wed Jul 3 10:26:33 1985
***************
*** 244,249
if(wizard) wiz_inv();
#endif WIZARD
/* make sure he can carry all he has - especially for T's */
while(inv_weight() > 0 && u.ustr < 118)
u.ustr++, u.ustrmax++;
--- 244,251 -----
if(wizard) wiz_inv();
#endif WIZARD
+ dosort(); /* put inventory into order */
+
/* make sure he can carry all he has - especially for T's */
while(inv_weight() > 0 && u.ustr < 118)
u.ustr++, u.ustrmax++;
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads