From: Pasi Kallinen <paxed@alt.org>
Date: Fri, 27 Mar 2015 21:29:30 +0000 (+0200)
Subject: Remember position of monster you hit with polearm
X-Git-Tag: NetHack-3.6.0_RC01~540
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5bb4a02ffe0502a4e5f850f51457c6c281400172;p=nethack

Remember position of monster you hit with polearm

If you hit a monster with a polearm, following polearm applications
will try to automatically suggest the monster's position
---

diff --git a/doc/fixes35.0 b/doc/fixes35.0
index 6b59f340f..601be2ee0 100644
--- a/doc/fixes35.0
+++ b/doc/fixes35.0
@@ -886,6 +886,7 @@ after object loss through polyshudder don't get left hiding under nothing
 show object symbols in menu headings in menus where those object symbols
 	act as menu accelerators, toggleable via "menu_objsyms" option
 show t-shirt text at end of game inventory disclose
+hitting with a polearm remembers the position of the last monster you hit
 
 
 Platform- and/or Interface-Specific Fixes
diff --git a/include/context.h b/include/context.h
index ebfe1ada7..7a73344af 100644
--- a/include/context.h
+++ b/include/context.h
@@ -73,6 +73,11 @@ struct warntype_info {
 	short speciesidx;	/* index of above in mons[] (for save/restore) */
 };
 
+struct polearm_info {
+	struct monst *hitmon;	/* the monster we tried to hit last */
+	unsigned m_id;		/* monster id of hitmon, in save file */
+};
+
 struct context_info {
 	unsigned ident;		/* social security number for each monster */
 	unsigned no_of_wizards; /* 0, 1 or 2 (wizard and his shadow) */
@@ -103,6 +108,7 @@ struct context_info {
 	struct book_info spbook;
 	struct takeoff_info takeoff;
 	struct warntype_info warntype;
+	struct polearm_info polearm;
 };
 
 extern NEARDATA struct context_info context;
diff --git a/include/patchlevel.h b/include/patchlevel.h
index eab90e89f..1b0ebf241 100644
--- a/include/patchlevel.h
+++ b/include/patchlevel.h
@@ -14,7 +14,7 @@
  * Incrementing EDITLEVEL can be used to force invalidation of old bones
  * and save files.
  */
-#define EDITLEVEL	58
+#define EDITLEVEL	59
 
 #define COPYRIGHT_BANNER_A \
 "NetHack, Copyright 1985-2015"
diff --git a/src/apply.c b/src/apply.c
index fd3193fb3..185ca80ad 100644
--- a/src/apply.c
+++ b/src/apply.c
@@ -2539,6 +2539,7 @@ use_pole(obj)
 	int res = 0, typ, max_range, min_range, glyph;
 	coord cc;
 	struct monst *mtmp;
+	struct monst *hitm = context.polearm.hitmon;
 
 	/* Are you allowed to use the pole? */
 	if (u.uswallow) {
@@ -2553,8 +2554,13 @@ use_pole(obj)
 
 	/* Prompt for a location */
 	pline(where_to_hit);
-	cc.x = u.ux;
-	cc.y = u.uy;
+	if (hitm && !DEADMONSTER(hitm) && cansee(hitm->mx, hitm->my)) {
+	    cc.x = hitm->mx;
+	    cc.y = hitm->my;
+	} else {
+	    cc.x = u.ux;
+	    cc.y = u.uy;
+	}
 	if (getpos(&cc, TRUE, "the spot to hit") < 0)
 	    return res;	/* ESC; uses turn iff polearm became wielded */
 
@@ -2596,11 +2602,13 @@ use_pole(obj)
 	    return res;
 	}
 
+	context.polearm.hitmon = NULL;
 	/* Attack the monster there */
 	bhitpos = cc;
 	if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != (struct monst *)0) {
 	    if (attack_checks(mtmp, uwep)) return res;
 	    if (overexertion()) return 1; /* burn nutrition; maybe pass out */
+	    context.polearm.hitmon = mtmp;
 	    check_caitiff(mtmp);
 	    notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
 	    (void) thitmonst(mtmp, uwep);
diff --git a/src/do.c b/src/do.c
index b387752d6..c690ad4fa 100644
--- a/src/do.c
+++ b/src/do.c
@@ -1402,6 +1402,7 @@ boolean at_stairs, falling, portal;
 	/* assume this will always return TRUE when changing level */
 	(void) in_out_region(u.ux, u.uy);
 	(void) pickup(1);
+	context.polearm.hitmon = NULL;
 }
 
 STATIC_OVL void
diff --git a/src/mon.c b/src/mon.c
index d9bc63d6d..607845e7a 100644
--- a/src/mon.c
+++ b/src/mon.c
@@ -1237,6 +1237,8 @@ dmonsfree()
     for (mtmp = &fmon; *mtmp;) {
 	freetmp = *mtmp;
 	if (freetmp->mhp <= 0 && !freetmp->isgd) {
+	    if (freetmp == context.polearm.hitmon)
+		context.polearm.hitmon = NULL;
 	    *mtmp = freetmp->nmon;
 	    dealloc_monst(freetmp);
 	    count++;
diff --git a/src/restore.c b/src/restore.c
index 4e4502b53..be1126be8 100644
--- a/src/restore.c
+++ b/src/restore.c
@@ -446,6 +446,10 @@ boolean ghostly;
 		if (mtmp->isshk) restshk(mtmp, ghostly);
 		if (mtmp->ispriest) restpriest(mtmp, ghostly);
 
+		if (!ghostly) {
+		    if (mtmp->m_id == context.polearm.m_id)
+			context.polearm.hitmon = mtmp;
+		}
 		mtmp2 = mtmp;
 	}
 	if(first && mtmp2->nmon){
diff --git a/src/save.c b/src/save.c
index f94b1857c..4a4363e9e 100644
--- a/src/save.c
+++ b/src/save.c
@@ -1124,8 +1124,13 @@ register struct monst *mtmp;
 	    }
 	    if (mtmp->minvent)
 		saveobjchn(fd,mtmp->minvent,mode);
-	    if (release_data(mode))
+	    if (release_data(mode)) {
+		if (mtmp == context.polearm.hitmon) {
+		    context.polearm.m_id = mtmp->m_id;
+		    context.polearm.hitmon = NULL;
+		}
 		dealloc_monst(mtmp);
+	    }
 	    mtmp = mtmp2;
 	}
 	if (perform_bwrite(mode))