aboutsummaryrefslogtreecommitdiff
path: root/hack/hack.do_name.c
diff options
context:
space:
mode:
authorB. Watson <yalhcru@gmail.com>2015-05-07 16:32:32 -0400
committerB. Watson <yalhcru@gmail.com>2015-05-07 16:32:32 -0400
commit013ac7742311556022304e8b30ca170d48b3a016 (patch)
tree53faa33e75991363f1a6dcc7edc83a66b70e6995 /hack/hack.do_name.c
downloadbsd-games-extra-013ac7742311556022304e8b30ca170d48b3a016.tar.gz
initial commit
Diffstat (limited to 'hack/hack.do_name.c')
-rw-r--r--hack/hack.do_name.c316
1 files changed, 316 insertions, 0 deletions
diff --git a/hack/hack.do_name.c b/hack/hack.do_name.c
new file mode 100644
index 0000000..38ef837
--- /dev/null
+++ b/hack/hack.do_name.c
@@ -0,0 +1,316 @@
+/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
+/* hack.do_name.c - version 1.0.3 */
+/* $FreeBSD: src/games/hack/hack.do_name.c,v 1.5 1999/11/16 10:26:36 marcel Exp $ */
+/* $DragonFly: src/games/hack/hack.do_name.c,v 1.4 2006/08/21 19:45:32 pavalos Exp $ */
+
+#include "hack.h"
+
+static void do_oname(struct obj *);
+static char *xmonnam(struct monst *, int);
+static char *lmonnam(struct monst *);
+static char *visctrl(char);
+
+coord
+getpos(int force, const char *goal)
+{
+ int cx, cy, i, c;
+ coord cc;
+
+ pline("(For instructions type a ?)");
+ cx = u.ux;
+ cy = u.uy;
+ curs(cx, cy + 2);
+ while ((c = readchar()) != '.') {
+ for (i = 0; i < 8; i++)
+ if (sdir[i] == c) {
+ if (1 <= cx + xdir[i] && cx + xdir[i] <= COLNO)
+ cx += xdir[i];
+ if (0 <= cy + ydir[i] && cy + ydir[i] <= ROWNO - 1)
+ cy += ydir[i];
+ goto nxtc;
+ }
+ if (c == '?') {
+ pline("Use [hjkl] to move the cursor to %s.", goal);
+ pline("Type a . when you are at the right place.");
+ } else {
+ pline("Unknown direction: '%s' (%s).",
+ visctrl(c),
+ force ? "use hjkl or ." : "aborted");
+ if (force)
+ goto nxtc;
+ cc.x = -1;
+ cc.y = 0;
+ return (cc);
+ }
+nxtc:
+ curs(cx, cy + 2);
+ }
+ cc.x = cx;
+ cc.y = cy;
+ return (cc);
+}
+
+int
+do_mname(void)
+{
+ char buf[BUFSZ];
+ coord cc;
+ int cx, cy, lth, i;
+ struct monst *mtmp, *mtmp2;
+
+ cc = getpos(0, "the monster you want to name");
+ cx = cc.x;
+ cy = cc.y;
+ if (cx < 0)
+ return (0);
+ mtmp = m_at(cx, cy);
+ if (!mtmp) {
+ if (cx == u.ux && cy == u.uy)
+ pline("This ugly monster is called %s and cannot be renamed.",
+ plname);
+ else
+ pline("There is no monster there.");
+ return (1);
+ }
+ if (mtmp->mimic) {
+ pline("I see no monster there.");
+ return (1);
+ }
+ if (!cansee(cx, cy)) {
+ pline("I cannot see a monster there.");
+ return (1);
+ }
+ pline("What do you want to call %s? ", lmonnam(mtmp));
+ getlin(buf);
+ clrlin();
+ if (!*buf || *buf == '\033')
+ return (1);
+ lth = strlen(buf) + 1;
+ if (lth > 63) {
+ buf[62] = 0;
+ lth = 63;
+ }
+ mtmp2 = newmonst(mtmp->mxlth + lth);
+ *mtmp2 = *mtmp;
+ for (i = 0; (unsigned)i < mtmp->mxlth; i++)
+ ((char *)mtmp2->mextra)[i] = ((char *)mtmp->mextra)[i];
+ mtmp2->mnamelth = lth;
+ strcpy(NAME(mtmp2), buf);
+ replmon(mtmp, mtmp2);
+ return (1);
+}
+
+/*
+ * This routine changes the address of obj . Be careful not to call it
+ * when there might be pointers around in unknown places. For now: only
+ * when obj is in the inventory.
+ */
+static void
+do_oname(struct obj *obj)
+{
+ struct obj *otmp, *otmp2;
+ int lth;
+ char buf[BUFSZ];
+
+ pline("What do you want to name %s? ", doname(obj));
+ getlin(buf);
+ clrlin();
+ if (!*buf || *buf == '\033')
+ return;
+ lth = strlen(buf) + 1;
+ if (lth > 63) {
+ buf[62] = 0;
+ lth = 63;
+ }
+ otmp2 = newobj(lth);
+ *otmp2 = *obj;
+ otmp2->onamelth = lth;
+ strcpy(ONAME(otmp2), buf);
+
+ setworn(NULL, obj->owornmask);
+ setworn(otmp2, otmp2->owornmask);
+
+ /*
+ * do freeinv(obj); etc. by hand in order to preserve the position of
+ * this object in the inventory
+ */
+ if (obj == invent)
+ invent = otmp2;
+ else
+ for (otmp = invent;; otmp = otmp->nobj) {
+ if (!otmp)
+ panic("Do_oname: cannot find obj.");
+ if (otmp->nobj == obj) {
+ otmp->nobj = otmp2;
+ break;
+ }
+ }
+ /*obfree(obj, otmp2);*/ /* now unnecessary: no pointers on bill */
+ free(obj); /* let us hope nobody else saved a pointer */
+}
+
+int
+ddocall(void)
+{
+ struct obj *obj;
+
+ pline("Do you want to name an individual object? [ny] ");
+ switch (readchar()) {
+ case '\033':
+ break;
+ case 'y':
+ obj = getobj("#", "name");
+ if (obj)
+ do_oname(obj);
+ break;
+ default:
+ obj = getobj("?!=/", "call");
+ if (obj)
+ docall(obj);
+ }
+ return (0);
+}
+
+void
+docall(struct obj *obj)
+{
+ char buf[BUFSZ];
+ struct obj otemp;
+ char **str1;
+ char *str;
+
+ otemp = *obj;
+ otemp.quan = 1;
+ otemp.onamelth = 0;
+ str = xname(&otemp);
+ pline("Call %s %s: ", strchr(vowels, *str) ? "an" : "a", str);
+ getlin(buf);
+ clrlin();
+ if (!*buf || *buf == '\033')
+ return;
+ str = newstring(strlen(buf) + 1);
+ strcpy(str, buf);
+ str1 = &(objects[obj->otyp].oc_uname);
+ if (*str1)
+ free(*str1);
+ *str1 = str;
+}
+
+/* these names should have length < PL_NSIZ */
+const char *ghostnames[] = {
+ "adri", "andries", "andreas", "bert", "david", "dirk", "emile",
+ "frans", "fred", "greg", "hether", "jay", "john", "jon", "kay",
+ "kenny", "maud", "michiel", "mike", "peter", "robert", "ron",
+ "tom", "wilmar"
+};
+
+static char *
+xmonnam(struct monst *mtmp, int vb)
+{
+ static char buf[BUFSZ]; /* %% */
+
+ if (mtmp->mnamelth && !vb) {
+ strcpy(buf, NAME(mtmp));
+ return (buf);
+ }
+ switch (mtmp->data->mlet) {
+ case ' ':
+ {
+ const char *gn = (const char *)mtmp->mextra;
+ if (!*gn) { /* might also look in scorefile */
+ gn = ghostnames[rn2(SIZE(ghostnames))];
+ if (!rn2(2))
+ strcpy((char *)mtmp->mextra,
+ !rn2(5) ? plname : gn);
+ }
+ sprintf(buf, "%s's ghost", gn);
+ }
+ break;
+ case '@':
+ if (mtmp->isshk) {
+ strcpy(buf, shkname(mtmp));
+ break;
+ }
+ /* fall into next case */
+ default:
+ sprintf(buf, "the %s%s",
+ mtmp->minvis ? "invisible " : "",
+ mtmp->data->mname);
+ }
+ if (vb && mtmp->mnamelth) {
+ strcat(buf, " called ");
+ strcat(buf, NAME(mtmp));
+ }
+ return (buf);
+}
+
+static char *
+lmonnam(struct monst *mtmp)
+{
+ return (xmonnam(mtmp, 1));
+}
+
+char *
+monnam(struct monst *mtmp)
+{
+ return (xmonnam(mtmp, 0));
+}
+
+char *
+Monnam(struct monst *mtmp)
+{
+ char *bp = monnam(mtmp);
+
+ if ('a' <= *bp && *bp <= 'z')
+ *bp += ('A' - 'a');
+ return (bp);
+}
+
+char *
+amonnam(struct monst *mtmp, const char *adj)
+{
+ char *bp = monnam(mtmp);
+ static char buf[BUFSZ]; /* %% */
+
+ if (!strncmp(bp, "the ", 4))
+ bp += 4;
+ sprintf(buf, "the %s %s", adj, bp);
+ return (buf);
+}
+
+char *
+Amonnam(struct monst *mtmp, const char *adj)
+{
+ char *bp = amonnam(mtmp, adj);
+
+ *bp = 'T';
+ return (bp);
+}
+
+char *
+Xmonnam(struct monst *mtmp)
+{
+ char *bp = Monnam(mtmp);
+
+ if (!strncmp(bp, "The ", 4)) {
+ bp += 2;
+ *bp = 'A';
+ }
+ return (bp);
+}
+
+static char *
+visctrl(char c)
+{
+ static char ccc[3];
+
+ if (c < 040) {
+ ccc[0] = '^';
+ ccc[1] = c + 0100;
+ ccc[2] = 0;
+ } else {
+ ccc[0] = c;
+ ccc[1] = 0;
+ }
+ return (ccc);
+}