From ed51e2ee8c47dbb4c8041637e215fab3dac5bc06 Mon Sep 17 00:00:00 2001 From: jsm Date: Sat, 23 Sep 2000 19:23:57 +0000 Subject: Use a lookup table to identify whether objects are plural or singular, instead of testing the final character against 's' in each place. Avoids oddities about "pot of jewels" and "compass". --- battlestar/com2.c | 10 ++++------ battlestar/com3.c | 9 ++++----- battlestar/com4.c | 26 ++++++++++++++------------ battlestar/extern.h | 7 ++++++- battlestar/globals.c | 15 +++++++++++++-- 5 files changed, 41 insertions(+), 26 deletions(-) (limited to 'battlestar') diff --git a/battlestar/com2.c b/battlestar/com2.c index ec0e4592..07634da4 100644 --- a/battlestar/com2.c +++ b/battlestar/com2.c @@ -1,4 +1,4 @@ -/* $NetBSD: com2.c,v 1.14 2000/09/22 08:19:21 jsm Exp $ */ +/* $NetBSD: com2.c,v 1.15 2000/09/23 19:23:57 jsm Exp $ */ /* * Copyright (c) 1983, 1993 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)com2.c 8.2 (Berkeley) 4/28/95"; #else -__RCSID("$NetBSD: com2.c,v 1.14 2000/09/22 08:19:21 jsm Exp $"); +__RCSID("$NetBSD: com2.c,v 1.15 2000/09/23 19:23:57 jsm Exp $"); #endif #endif /* not lint */ @@ -47,7 +47,6 @@ __RCSID("$NetBSD: com2.c,v 1.14 2000/09/22 08:19:21 jsm Exp $"); int wearit() { /* synonyms = {sheathe, sheath} */ - int n; int firstnumber, value; firstnumber = wordnumber; @@ -57,7 +56,6 @@ wearit() value = wordvalue[wordnumber]; if (objsht[value] == NULL) break; - for (n = 0; objsht[value][n]; n++); switch (value) { case -1: @@ -65,7 +63,7 @@ wearit() return (firstnumber); default: - printf("You can't wear%s%s!\n", (objsht[value][n - 1] == 's' ? " " : " a "), objsht[value]); + printf("You can't wear%s%s!\n", (is_plural_object(value) ? " " : " a "), objsht[value]); return (firstnumber); case KNIFE: @@ -94,7 +92,7 @@ wearit() encumber -= objcumber[value]; ourtime++; printf("You are now wearing %s %s.\n", - (objsht[value][n - 1] == 's' ? "the" + (is_plural_object(value) ? "the" : "a"), objsht[value]); } else if (testbit(wear, value)) diff --git a/battlestar/com3.c b/battlestar/com3.c index 86b2e9c1..ea6d122b 100644 --- a/battlestar/com3.c +++ b/battlestar/com3.c @@ -1,4 +1,4 @@ -/* $NetBSD: com3.c,v 1.9 2000/09/22 08:19:21 jsm Exp $ */ +/* $NetBSD: com3.c,v 1.10 2000/09/23 19:23:58 jsm Exp $ */ /* * Copyright (c) 1983, 1993 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)com3.c 8.2 (Berkeley) 4/28/95"; #else -__RCSID("$NetBSD: com3.c,v 1.9 2000/09/22 08:19:21 jsm Exp $"); +__RCSID("$NetBSD: com3.c,v 1.10 2000/09/23 19:23:58 jsm Exp $"); #endif #endif /* not lint */ @@ -194,7 +194,6 @@ int shoot() { int firstnumber, value; - int n; firstnumber = wordnumber; if (!testbit(inven, LASER)) @@ -204,11 +203,11 @@ shoot() while (wordnumber <= wordcount && wordtype[wordnumber] == OBJECT) { value = wordvalue[wordnumber]; printf("%s:\n", objsht[value]); - for (n = 0; objsht[value][n]; n++); if (testbit(location[position].objects, value)) { clearbit(location[position].objects, value); ourtime++; - printf("The %s explode%s\n", objsht[value], (objsht[value][n - 1] == 's' ? (objsht[value][n - 2] == 's' ? "s." : ".") : "s.")); + printf("The %s explode%s\n", objsht[value], + (is_plural_object(value) ? "." : "s.")); if (value == BOMB) die(); } else diff --git a/battlestar/com4.c b/battlestar/com4.c index a29cb4df..72442cb4 100644 --- a/battlestar/com4.c +++ b/battlestar/com4.c @@ -1,4 +1,4 @@ -/* $NetBSD: com4.c,v 1.13 2000/09/22 12:38:10 jsm Exp $ */ +/* $NetBSD: com4.c,v 1.14 2000/09/23 19:23:58 jsm Exp $ */ /* * Copyright (c) 1983, 1993 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)com4.c 8.2 (Berkeley) 4/28/95"; #else -__RCSID("$NetBSD: com4.c,v 1.13 2000/09/22 12:38:10 jsm Exp $"); +__RCSID("$NetBSD: com4.c,v 1.14 2000/09/23 19:23:58 jsm Exp $"); #endif #endif /* not lint */ @@ -49,7 +49,6 @@ take(from) unsigned int from[]; { int firstnumber, heavy, bulky, value; - int n; firstnumber = wordnumber; if (wordnumber < wordcount && wordvalue[wordnumber + 1] == OFF) { @@ -61,7 +60,6 @@ take(from) while (wordnumber <= wordcount && wordtype[wordnumber] == OBJECT) { value = wordvalue[wordnumber]; printf("%s:\n", objsht[value]); - for (n = 0; objsht[value][n]; n++); heavy = (carrying + objwt[value]) <= WEIGHT; bulky = (encumber + objcumber[value]) <= CUMBER; if ((testbit(from, value) || wiz || tempwiz) && heavy && bulky && !testbit(inven, value)) { @@ -77,13 +75,18 @@ take(from) if (value == MEDALION) win--; } else if (testbit(inven, value)) - printf("You're already holding%s%s.\n", (objsht[value][n - 1] == 's' ? " " : " a "), objsht[value]); + printf("You're already holding%s%s.\n", + (is_plural_object(value) ? " " : " a "), + objsht[value]); else if (!testbit(from, value)) printf("I dont see any %s around here.\n", objsht[value]); else if (!heavy) - printf("The %s %s too heavy.\n", objsht[value], (objsht[value][n - 1] == 's' ? "are" : "is")); + printf("The %s %s too heavy.\n", objsht[value], + (is_plural_object(value) ? "are" : "is")); else - printf("The %s %s too cumbersome to hold.\n", objsht[value], (objsht[value][n - 1] == 's' ? "are" : "is")); + printf("The %s %s too cumbersome to hold.\n", + objsht[value], + (is_plural_object(value) ? "are" : "is")); if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND) wordnumber++; else @@ -343,6 +346,8 @@ eat() wordnumber++; while (wordnumber <= wordcount) { value = wordvalue[wordnumber]; + if (wordtype[wordnumber] != OBJECT) + value = -1; switch (value) { case -1: @@ -351,11 +356,8 @@ eat() default: printf("You can't eat%s%s!\n", - wordtype[wordnumber] == OBJECT && - objsht[value] - [strlen(objsht[value]) - 1] == 's' ? - " " : " a ", - words[wordnumber]); + is_plural_object(value) ? " " : " a ", + objsht[value]); return (firstnumber); case PAPAYAS: diff --git a/battlestar/extern.h b/battlestar/extern.h index 81ffa9c3..3257bfd7 100644 --- a/battlestar/extern.h +++ b/battlestar/extern.h @@ -1,4 +1,4 @@ -/* $NetBSD: extern.h,v 1.21 2000/09/21 17:44:34 jsm Exp $ */ +/* $NetBSD: extern.h,v 1.22 2000/09/23 19:23:58 jsm Exp $ */ /* * Copyright (c) 1983, 1993 @@ -227,6 +227,9 @@ #define MAXWEIGHT 60 #define MAXCUMBER 10 +/* Flags for objects. */ +#define OBJ_PLURAL 1 + struct room { const char *name; int link[8]; @@ -251,6 +254,8 @@ extern const char *const objsht[NUMOFOBJECTS]; extern const char *const ouch[NUMOFINJURIES]; extern const int objwt[NUMOFOBJECTS]; extern const int objcumber[NUMOFOBJECTS]; +extern const int objflags[NUMOFOBJECTS]; +#define is_plural_object(n) (objflags[(n)] & OBJ_PLURAL) /* current input line */ #define WORDLEN 15 diff --git a/battlestar/globals.c b/battlestar/globals.c index 5805cf96..379cd70a 100644 --- a/battlestar/globals.c +++ b/battlestar/globals.c @@ -1,4 +1,4 @@ -/* $NetBSD: globals.c,v 1.13 2000/09/21 17:44:34 jsm Exp $ */ +/* $NetBSD: globals.c,v 1.14 2000/09/23 19:23:58 jsm Exp $ */ /* * Copyright (c) 1983, 1993 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)globals.c 8.2 (Berkeley) 4/28/95"; #else -__RCSID("$NetBSD: globals.c,v 1.13 2000/09/21 17:44:34 jsm Exp $"); +__RCSID("$NetBSD: globals.c,v 1.14 2000/09/23 19:23:58 jsm Exp $"); #endif #endif /* not lint */ @@ -220,6 +220,17 @@ const int objcumber[NUMOFOBJECTS] = { 10, 8, 8, 10, 10, 3, 1, 2 }; +const int objflags[NUMOFOBJECTS] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, OBJ_PLURAL, 0, OBJ_PLURAL, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, OBJ_PLURAL, 0, 0, 0, + 0, 0, 0, 0, OBJ_PLURAL, 0, 0, OBJ_PLURAL, + 0, 0, OBJ_PLURAL, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + int win = 1; int matchcount = 20; int followgod = -1; -- cgit v1.2.3-56-ge451