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))