Merge branch 'NetHack-3.6'
This commit is contained in:
+17
-17
@@ -1042,6 +1042,7 @@ OBJECT:('!',"booze"),(10,09)
|
|||||||
OBJECT:('!',"object detection"),(10,09)
|
OBJECT:('!',"object detection"),(10,09)
|
||||||
# Objects
|
# Objects
|
||||||
# The Treasure chamber...
|
# The Treasure chamber...
|
||||||
|
OBJECT:('*',"luckstone"),(70,05)
|
||||||
OBJECT:('*',"diamond"),(69,04)
|
OBJECT:('*',"diamond"),(69,04)
|
||||||
OBJECT:'*',(69,04)
|
OBJECT:'*',(69,04)
|
||||||
OBJECT:('*',"diamond"),(69,04)
|
OBJECT:('*',"diamond"),(69,04)
|
||||||
@@ -1058,7 +1059,6 @@ OBJECT:('*',"ruby"),(70,05)
|
|||||||
OBJECT:('*',"amethyst"),(70,05)
|
OBJECT:('*',"amethyst"),(70,05)
|
||||||
OBJECT:'*',(70,05)
|
OBJECT:'*',(70,05)
|
||||||
OBJECT:('*',"amethyst"),(70,05)
|
OBJECT:('*',"amethyst"),(70,05)
|
||||||
OBJECT:('*',"luckstone"),(70,05)
|
|
||||||
# Scattered gems...
|
# Scattered gems...
|
||||||
OBJECT:'*',random
|
OBJECT:'*',random
|
||||||
OBJECT:'*',random
|
OBJECT:'*',random
|
||||||
@@ -1147,24 +1147,24 @@ STAIR:(42,8),up
|
|||||||
WALLIFY
|
WALLIFY
|
||||||
|
|
||||||
# Objects
|
# Objects
|
||||||
OBJECT:('*',"diamond"),random
|
|
||||||
OBJECT:'*',random
|
|
||||||
OBJECT:('*',"diamond"),random
|
|
||||||
OBJECT:'*',random
|
|
||||||
OBJECT:('*',"emerald"),random
|
|
||||||
OBJECT:'*',random
|
|
||||||
OBJECT:('*',"emerald"),random
|
|
||||||
OBJECT:'*',random
|
|
||||||
OBJECT:('*',"emerald"),random
|
|
||||||
OBJECT:'*',random
|
|
||||||
OBJECT:('*',"ruby"),random
|
|
||||||
OBJECT:'*',random
|
|
||||||
OBJECT:('*',"ruby"),random
|
|
||||||
OBJECT:('*',"amethyst"),random
|
|
||||||
OBJECT:'*',random
|
|
||||||
OBJECT:('*',"amethyst"),random
|
|
||||||
OBJECT:('*',"luckstone"),$place[0]
|
OBJECT:('*',"luckstone"),$place[0]
|
||||||
OBJECT:('*',"flint"),$place[1]
|
OBJECT:('*',"flint"),$place[1]
|
||||||
|
OBJECT:('*',"diamond"),random
|
||||||
|
OBJECT:'*',random
|
||||||
|
OBJECT:('*',"diamond"),random
|
||||||
|
OBJECT:'*',random
|
||||||
|
OBJECT:('*',"emerald"),random
|
||||||
|
OBJECT:'*',random
|
||||||
|
OBJECT:('*',"emerald"),random
|
||||||
|
OBJECT:'*',random
|
||||||
|
OBJECT:('*',"emerald"),random
|
||||||
|
OBJECT:'*',random
|
||||||
|
OBJECT:('*',"ruby"),random
|
||||||
|
OBJECT:'*',random
|
||||||
|
OBJECT:('*',"ruby"),random
|
||||||
|
OBJECT:('*',"amethyst"),random
|
||||||
|
OBJECT:'*',random
|
||||||
|
OBJECT:('*',"amethyst"),random
|
||||||
OBJECT:'?',random
|
OBJECT:'?',random
|
||||||
OBJECT:'?',random
|
OBJECT:'?',random
|
||||||
OBJECT:'?',random
|
OBJECT:'?',random
|
||||||
|
|||||||
+7
-1
@@ -1,4 +1,4 @@
|
|||||||
$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.15 $ $NHDT-Date: 1558686805 2019/05/24 08:33:25 $
|
$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.23 $ $NHDT-Date: 1558856435 2019/05/26 07:40:35 $
|
||||||
|
|
||||||
This fixes36.3 file is here to capture information about updates in the 3.6.x
|
This fixes36.3 file is here to capture information about updates in the 3.6.x
|
||||||
lineage following the release of 3.6.2 in May 2019. Please note, however,
|
lineage following the release of 3.6.2 in May 2019. Please note, however,
|
||||||
@@ -21,6 +21,11 @@ xans fly, but could not reach your feet if you flew
|
|||||||
adjust vortex database entry to be consistent with fire and energy vortices
|
adjust vortex database entry to be consistent with fire and energy vortices
|
||||||
when co-located with a boulder you could sometimes swap places with pets of
|
when co-located with a boulder you could sometimes swap places with pets of
|
||||||
any size
|
any size
|
||||||
|
on rare occasions, multiple mine's end luckstones were being marked as the
|
||||||
|
prize and triggering an impossible() on a public server
|
||||||
|
make sure the correct luckstone is the prize in mine's end
|
||||||
|
free dungeon overview's bones information at end of game
|
||||||
|
free current level's bones information at end of game
|
||||||
|
|
||||||
|
|
||||||
Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository
|
Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository
|
||||||
@@ -47,6 +52,7 @@ curses: when display windows get reconfigured (after setting align_status,
|
|||||||
messages rather than most recent N. [Still room for improvement;
|
messages rather than most recent N. [Still room for improvement;
|
||||||
when feasible it combines short lines, resulting in N messages on
|
when feasible it combines short lines, resulting in N messages on
|
||||||
fewer than N lines and leaving some of the available lines blank.]
|
fewer than N lines and leaving some of the available lines blank.]
|
||||||
|
curses: plug memory leak when getting a line of input is cancelled by ESC
|
||||||
tty: re-do one optimization used when status conditions have all been removed
|
tty: re-do one optimization used when status conditions have all been removed
|
||||||
and remove another that tried to check whether condition text to be
|
and remove another that tried to check whether condition text to be
|
||||||
displayed next was the same as the existing value; sometimes new
|
displayed next was the same as the existing value; sometimes new
|
||||||
|
|||||||
+6
-4
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.6 dungeon.c $NHDT-Date: 1554341477 2019/04/04 01:31:17 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.92 $ */
|
/* NetHack 3.6 dungeon.c $NHDT-Date: 1558853012 2019/05/26 06:43:32 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.94 $ */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/*-Copyright (c) Robert Patrick Rankin, 2012. */
|
/*-Copyright (c) Robert Patrick Rankin, 2012. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -176,6 +176,8 @@ boolean perform_write, free_data;
|
|||||||
next_ms = curr_ms->next;
|
next_ms = curr_ms->next;
|
||||||
if (curr_ms->custom)
|
if (curr_ms->custom)
|
||||||
free((genericptr_t) curr_ms->custom);
|
free((genericptr_t) curr_ms->custom);
|
||||||
|
if (curr_ms->final_resting_place)
|
||||||
|
savecemetery(fd, FREE_SAVE, &curr_ms->final_resting_place);
|
||||||
free((genericptr_t) curr_ms);
|
free((genericptr_t) curr_ms);
|
||||||
}
|
}
|
||||||
g.mapseenchn = 0;
|
g.mapseenchn = 0;
|
||||||
@@ -2150,7 +2152,8 @@ int ledger_num;
|
|||||||
struct cemetery *bp, *bpnext;
|
struct cemetery *bp, *bpnext;
|
||||||
|
|
||||||
for (mptr = g.mapseenchn; mptr; mprev = mptr, mptr = mptr->next)
|
for (mptr = g.mapseenchn; mptr; mprev = mptr, mptr = mptr->next)
|
||||||
if (g.dungeons[mptr->lev.dnum].ledger_start + mptr->lev.dlevel == ledger_num)
|
if (g.dungeons[mptr->lev.dnum].ledger_start + mptr->lev.dlevel
|
||||||
|
== ledger_num)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!mptr)
|
if (!mptr)
|
||||||
@@ -2647,8 +2650,7 @@ recalc_mapseen()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*ARGUSED*/
|
/*ARGUSED*/
|
||||||
/* valley and sanctum levels get automatic annotation once temple is entered
|
/* valley and sanctum levels get automatic annotation once temple is entered */
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
mapseen_temple(priest)
|
mapseen_temple(priest)
|
||||||
struct monst *priest UNUSED; /* currently unused; might be useful someday */
|
struct monst *priest UNUSED; /* currently unused; might be useful someday */
|
||||||
|
|||||||
+2
-2
@@ -1780,7 +1780,7 @@ domove_core()
|
|||||||
if (u.usteed)
|
if (u.usteed)
|
||||||
u.usteed->mx = u.ux, u.usteed->my = u.uy;
|
u.usteed->mx = u.ux, u.usteed->my = u.uy;
|
||||||
You("stop. %s can't move diagonally.", upstart(y_monnam(mtmp)));
|
You("stop. %s can't move diagonally.", upstart(y_monnam(mtmp)));
|
||||||
} else if (u_with_boulder
|
} else if (u_with_boulder
|
||||||
&& !(verysmall(mtmp->data)
|
&& !(verysmall(mtmp->data)
|
||||||
&& (!mtmp->minvent || (curr_mon_load(mtmp) <= 600)))) {
|
&& (!mtmp->minvent || (curr_mon_load(mtmp) <= 600)))) {
|
||||||
/* can't swap places when pet won't fit there with the boulder */
|
/* can't swap places when pet won't fit there with the boulder */
|
||||||
@@ -1789,7 +1789,7 @@ domove_core()
|
|||||||
u.usteed->mx = u.ux, u.usteed->my = u.uy;
|
u.usteed->mx = u.ux, u.usteed->my = u.uy;
|
||||||
You("stop. %s won't fit into the same spot that you're at.",
|
You("stop. %s won't fit into the same spot that you're at.",
|
||||||
upstart(y_monnam(mtmp)));
|
upstart(y_monnam(mtmp)));
|
||||||
} else if (u.ux0 != x && u.uy0 != y && bad_rock(mtmp->data, x, u.uy0)
|
} else if (u.ux0 != x && u.uy0 != y && bad_rock(mtmp->data, x, u.uy0)
|
||||||
&& bad_rock(mtmp->data, u.ux0, y)
|
&& bad_rock(mtmp->data, u.ux0, y)
|
||||||
&& (bigmonst(mtmp->data) || (curr_mon_load(mtmp) > 600))) {
|
&& (bigmonst(mtmp->data) || (curr_mon_load(mtmp) > 600))) {
|
||||||
/* can't swap places when pet won't fit thru the opening */
|
/* can't swap places when pet won't fit thru the opening */
|
||||||
|
|||||||
+75
-125
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.6 save.c $NHDT-Date: 1554591225 2019/04/06 22:53:45 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.117 $ */
|
/* NetHack 3.6 save.c $NHDT-Date: 1558856435 2019/05/26 07:40:35 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.119 $ */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/*-Copyright (c) Michael Allison, 2009. */
|
/*-Copyright (c) Michael Allison, 2009. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -284,15 +284,15 @@ register int fd, mode;
|
|||||||
#endif
|
#endif
|
||||||
uid = (unsigned long) getuid();
|
uid = (unsigned long) getuid();
|
||||||
bwrite(fd, (genericptr_t) &uid, sizeof uid);
|
bwrite(fd, (genericptr_t) &uid, sizeof uid);
|
||||||
bwrite(fd, (genericptr_t) &g.context, sizeof(struct context_info));
|
bwrite(fd, (genericptr_t) &g.context, sizeof g.context);
|
||||||
bwrite(fd, (genericptr_t) &flags, sizeof(struct flag));
|
bwrite(fd, (genericptr_t) &flags, sizeof flags);
|
||||||
#ifdef SYSFLAGS
|
#ifdef SYSFLAGS
|
||||||
bwrite(fd, (genericptr_t) &sysflags, sizeof(struct sysflag));
|
bwrite(fd, (genericptr_t) &sysflags, sysflags);
|
||||||
#endif
|
#endif
|
||||||
urealtime.finish_time = getnow();
|
urealtime.finish_time = getnow();
|
||||||
urealtime.realtime += (long) (urealtime.finish_time
|
urealtime.realtime += (long) (urealtime.finish_time
|
||||||
- urealtime.start_timing);
|
- urealtime.start_timing);
|
||||||
bwrite(fd, (genericptr_t) &u, sizeof(struct you));
|
bwrite(fd, (genericptr_t) &u, sizeof u);
|
||||||
bwrite(fd, yyyymmddhhmmss(ubirthday), 14);
|
bwrite(fd, yyyymmddhhmmss(ubirthday), 14);
|
||||||
bwrite(fd, (genericptr_t) &urealtime.realtime, sizeof urealtime.realtime);
|
bwrite(fd, (genericptr_t) &urealtime.realtime, sizeof urealtime.realtime);
|
||||||
bwrite(fd, yyyymmddhhmmss(urealtime.start_timing), 14); /** Why? **/
|
bwrite(fd, yyyymmddhhmmss(urealtime.start_timing), 14); /** Why? **/
|
||||||
@@ -321,14 +321,14 @@ register int fd, mode;
|
|||||||
g.migrating_objs = 0;
|
g.migrating_objs = 0;
|
||||||
g.migrating_mons = 0;
|
g.migrating_mons = 0;
|
||||||
}
|
}
|
||||||
bwrite(fd, (genericptr_t) g.mvitals, sizeof(g.mvitals));
|
bwrite(fd, (genericptr_t) g.mvitals, sizeof g.mvitals);
|
||||||
|
|
||||||
save_dungeon(fd, (boolean) !!perform_bwrite(mode),
|
save_dungeon(fd, (boolean) !!perform_bwrite(mode),
|
||||||
(boolean) !!release_data(mode));
|
(boolean) !!release_data(mode));
|
||||||
savelevchn(fd, mode);
|
savelevchn(fd, mode);
|
||||||
bwrite(fd, (genericptr_t) &g.moves, sizeof g.moves);
|
bwrite(fd, (genericptr_t) &g.moves, sizeof g.moves);
|
||||||
bwrite(fd, (genericptr_t) &g.monstermoves, sizeof g.monstermoves);
|
bwrite(fd, (genericptr_t) &g.monstermoves, sizeof g.monstermoves);
|
||||||
bwrite(fd, (genericptr_t) &g.quest_status, sizeof(struct q_score));
|
bwrite(fd, (genericptr_t) &g.quest_status, sizeof g.quest_status);
|
||||||
bwrite(fd, (genericptr_t) g.spl_book,
|
bwrite(fd, (genericptr_t) g.spl_book,
|
||||||
sizeof(struct spell) * (MAXSPELL + 1));
|
sizeof(struct spell) * (MAXSPELL + 1));
|
||||||
save_artifacts(fd);
|
save_artifacts(fd);
|
||||||
@@ -390,7 +390,7 @@ savestateinlock()
|
|||||||
if (tricked_fileremoved(fd, whynot))
|
if (tricked_fileremoved(fd, whynot))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
(void) read(fd, (genericptr_t) &hpid, sizeof(hpid));
|
(void) read(fd, (genericptr_t) &hpid, sizeof hpid);
|
||||||
if (g.hackpid != hpid) {
|
if (g.hackpid != hpid) {
|
||||||
Sprintf(whynot, "Level #0 pid (%d) doesn't match ours (%d)!",
|
Sprintf(whynot, "Level #0 pid (%d) doesn't match ours (%d)!",
|
||||||
hpid, g.hackpid);
|
hpid, g.hackpid);
|
||||||
@@ -407,11 +407,11 @@ savestateinlock()
|
|||||||
done(TRICKED);
|
done(TRICKED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
(void) write(fd, (genericptr_t) &g.hackpid, sizeof(g.hackpid));
|
(void) write(fd, (genericptr_t) &g.hackpid, sizeof g.hackpid);
|
||||||
if (flags.ins_chkpt) {
|
if (flags.ins_chkpt) {
|
||||||
int currlev = ledger_no(&u.uz);
|
int currlev = ledger_no(&u.uz);
|
||||||
|
|
||||||
(void) write(fd, (genericptr_t) &currlev, sizeof(currlev));
|
(void) write(fd, (genericptr_t) &currlev, sizeof currlev);
|
||||||
save_savefile_name(fd);
|
save_savefile_name(fd);
|
||||||
store_version(fd);
|
store_version(fd);
|
||||||
store_savefileinfo(fd);
|
store_savefileinfo(fd);
|
||||||
@@ -492,32 +492,31 @@ int mode;
|
|||||||
#endif
|
#endif
|
||||||
if (lev >= 0 && lev <= maxledgerno())
|
if (lev >= 0 && lev <= maxledgerno())
|
||||||
g.level_info[lev].flags |= VISITED;
|
g.level_info[lev].flags |= VISITED;
|
||||||
bwrite(fd, (genericptr_t) &g.hackpid, sizeof(g.hackpid));
|
bwrite(fd, (genericptr_t) &g.hackpid, sizeof g.hackpid);
|
||||||
#ifdef TOS
|
#ifdef TOS
|
||||||
tlev = lev;
|
tlev = lev;
|
||||||
tlev &= 0x00ff;
|
tlev &= 0x00ff;
|
||||||
bwrite(fd, (genericptr_t) &tlev, sizeof(tlev));
|
bwrite(fd, (genericptr_t) &tlev, sizeof tlev);
|
||||||
#else
|
#else
|
||||||
bwrite(fd, (genericptr_t) &lev, sizeof(lev));
|
bwrite(fd, (genericptr_t) &lev, sizeof lev);
|
||||||
#endif
|
#endif
|
||||||
savecemetery(fd, mode, &g.level.bonesinfo);
|
savecemetery(fd, mode, &g.level.bonesinfo);
|
||||||
savelevl(fd,
|
savelevl(fd, (boolean) ((sfsaveinfo.sfi1 & SFI1_RLECOMP) == SFI1_RLECOMP));
|
||||||
(boolean) ((sfsaveinfo.sfi1 & SFI1_RLECOMP) == SFI1_RLECOMP));
|
bwrite(fd, (genericptr_t) g.lastseentyp, sizeof g.lastseentyp);
|
||||||
bwrite(fd, (genericptr_t) g.lastseentyp, sizeof(g.lastseentyp));
|
bwrite(fd, (genericptr_t) &g.monstermoves, sizeof g.monstermoves);
|
||||||
bwrite(fd, (genericptr_t) &g.monstermoves, sizeof(g.monstermoves));
|
bwrite(fd, (genericptr_t) &g.upstair, sizeof (stairway));
|
||||||
bwrite(fd, (genericptr_t) &g.upstair, sizeof(stairway));
|
bwrite(fd, (genericptr_t) &g.dnstair, sizeof (stairway));
|
||||||
bwrite(fd, (genericptr_t) &g.dnstair, sizeof(stairway));
|
bwrite(fd, (genericptr_t) &g.upladder, sizeof (stairway));
|
||||||
bwrite(fd, (genericptr_t) &g.upladder, sizeof(stairway));
|
bwrite(fd, (genericptr_t) &g.dnladder, sizeof (stairway));
|
||||||
bwrite(fd, (genericptr_t) &g.dnladder, sizeof(stairway));
|
bwrite(fd, (genericptr_t) &g.sstairs, sizeof (stairway));
|
||||||
bwrite(fd, (genericptr_t) &g.sstairs, sizeof(stairway));
|
bwrite(fd, (genericptr_t) &g.updest, sizeof (dest_area));
|
||||||
bwrite(fd, (genericptr_t) &g.updest, sizeof(dest_area));
|
bwrite(fd, (genericptr_t) &g.dndest, sizeof (dest_area));
|
||||||
bwrite(fd, (genericptr_t) &g.dndest, sizeof(dest_area));
|
bwrite(fd, (genericptr_t) &g.level.flags, sizeof g.level.flags);
|
||||||
bwrite(fd, (genericptr_t) &g.level.flags, sizeof(g.level.flags));
|
bwrite(fd, (genericptr_t) g.doors, sizeof g.doors);
|
||||||
bwrite(fd, (genericptr_t) g.doors, sizeof(g.doors));
|
|
||||||
save_rooms(fd); /* no dynamic memory to reclaim */
|
save_rooms(fd); /* no dynamic memory to reclaim */
|
||||||
|
|
||||||
/* from here on out, saving also involves allocated memory cleanup */
|
/* from here on out, saving also involves allocated memory cleanup */
|
||||||
skip_lots:
|
skip_lots:
|
||||||
/* this comes before the map, so need cleanup here if we skipped */
|
/* this comes before the map, so need cleanup here if we skipped */
|
||||||
if (mode == FREE_SAVE)
|
if (mode == FREE_SAVE)
|
||||||
savecemetery(fd, mode, &g.level.bonesinfo);
|
savecemetery(fd, mode, &g.level.bonesinfo);
|
||||||
@@ -583,21 +582,20 @@ boolean rlecomp;
|
|||||||
goto writeout;
|
goto writeout;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* the run has been broken,
|
/* run has been broken, write out run-length encoding */
|
||||||
* write out run-length encoding */
|
writeout:
|
||||||
writeout:
|
bwrite(fd, (genericptr_t) &match, sizeof (uchar));
|
||||||
bwrite(fd, (genericptr_t) &match, sizeof(uchar));
|
bwrite(fd, (genericptr_t) rgrm, sizeof (struct rm));
|
||||||
bwrite(fd, (genericptr_t) rgrm, sizeof(struct rm));
|
|
||||||
/* start encoding again. we have at least 1 rm
|
/* start encoding again. we have at least 1 rm
|
||||||
* in the next run, viz. this one. */
|
in the next run, viz. this one. */
|
||||||
match = 1;
|
match = 1;
|
||||||
rgrm = prm;
|
rgrm = prm;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (match > 0) {
|
if (match > 0) {
|
||||||
bwrite(fd, (genericptr_t) &match, sizeof(uchar));
|
bwrite(fd, (genericptr_t) &match, sizeof (uchar));
|
||||||
bwrite(fd, (genericptr_t) rgrm, sizeof(struct rm));
|
bwrite(fd, (genericptr_t) rgrm, sizeof (struct rm));
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -901,12 +899,12 @@ register int fd, mode;
|
|||||||
for (tmplev = g.sp_levchn; tmplev; tmplev = tmplev->next)
|
for (tmplev = g.sp_levchn; tmplev; tmplev = tmplev->next)
|
||||||
cnt++;
|
cnt++;
|
||||||
if (perform_bwrite(mode))
|
if (perform_bwrite(mode))
|
||||||
bwrite(fd, (genericptr_t) &cnt, sizeof(int));
|
bwrite(fd, (genericptr_t) &cnt, sizeof cnt);
|
||||||
|
|
||||||
for (tmplev = g.sp_levchn; tmplev; tmplev = tmplev2) {
|
for (tmplev = g.sp_levchn; tmplev; tmplev = tmplev2) {
|
||||||
tmplev2 = tmplev->next;
|
tmplev2 = tmplev->next;
|
||||||
if (perform_bwrite(mode))
|
if (perform_bwrite(mode))
|
||||||
bwrite(fd, (genericptr_t) tmplev, sizeof(s_level));
|
bwrite(fd, (genericptr_t) tmplev, sizeof *tmplev);
|
||||||
if (release_data(mode))
|
if (release_data(mode))
|
||||||
free((genericptr_t) tmplev);
|
free((genericptr_t) tmplev);
|
||||||
}
|
}
|
||||||
@@ -950,11 +948,11 @@ register int fd, mode;
|
|||||||
for (tmp_dam = damageptr; tmp_dam; tmp_dam = tmp_dam->next)
|
for (tmp_dam = damageptr; tmp_dam; tmp_dam = tmp_dam->next)
|
||||||
xl++;
|
xl++;
|
||||||
if (perform_bwrite(mode))
|
if (perform_bwrite(mode))
|
||||||
bwrite(fd, (genericptr_t) &xl, sizeof(xl));
|
bwrite(fd, (genericptr_t) &xl, sizeof xl);
|
||||||
|
|
||||||
while (xl--) {
|
while (xl--) {
|
||||||
if (perform_bwrite(mode))
|
if (perform_bwrite(mode))
|
||||||
bwrite(fd, (genericptr_t) damageptr, sizeof(*damageptr));
|
bwrite(fd, (genericptr_t) damageptr, sizeof *damageptr);
|
||||||
tmp_dam = damageptr;
|
tmp_dam = damageptr;
|
||||||
damageptr = damageptr->next;
|
damageptr = damageptr->next;
|
||||||
if (release_data(mode))
|
if (release_data(mode))
|
||||||
@@ -971,14 +969,11 @@ struct obj *otmp;
|
|||||||
{
|
{
|
||||||
int buflen, zerobuf = 0;
|
int buflen, zerobuf = 0;
|
||||||
|
|
||||||
buflen = sizeof(struct obj);
|
buflen = (int) sizeof (struct obj);
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof(int));
|
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
||||||
bwrite(fd, (genericptr_t) otmp, buflen);
|
bwrite(fd, (genericptr_t) otmp, buflen);
|
||||||
if (otmp->oextra) {
|
if (otmp->oextra) {
|
||||||
if (ONAME(otmp))
|
buflen = ONAME(otmp) ? (int) strlen(ONAME(otmp)) + 1 : 0;
|
||||||
buflen = strlen(ONAME(otmp)) + 1;
|
|
||||||
else
|
|
||||||
buflen = 0;
|
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
||||||
if (buflen > 0)
|
if (buflen > 0)
|
||||||
bwrite(fd, (genericptr_t) ONAME(otmp), buflen);
|
bwrite(fd, (genericptr_t) ONAME(otmp), buflen);
|
||||||
@@ -989,26 +984,18 @@ struct obj *otmp;
|
|||||||
else
|
else
|
||||||
bwrite(fd, (genericptr_t) &zerobuf, sizeof zerobuf);
|
bwrite(fd, (genericptr_t) &zerobuf, sizeof zerobuf);
|
||||||
|
|
||||||
if (OMID(otmp))
|
buflen = OMID(otmp) ? (int) sizeof (unsigned) : 0;
|
||||||
buflen = sizeof(unsigned);
|
|
||||||
else
|
|
||||||
buflen = 0;
|
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
||||||
if (buflen > 0)
|
if (buflen > 0)
|
||||||
bwrite(fd, (genericptr_t) OMID(otmp), buflen);
|
bwrite(fd, (genericptr_t) OMID(otmp), buflen);
|
||||||
|
|
||||||
if (OLONG(otmp))
|
/* TODO: post 3.6.x, get rid of this */
|
||||||
buflen = sizeof(long);
|
buflen = OLONG(otmp) ? (int) sizeof (long) : 0;
|
||||||
else
|
|
||||||
buflen = 0;
|
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
||||||
if (buflen > 0)
|
if (buflen > 0)
|
||||||
bwrite(fd, (genericptr_t) OLONG(otmp), buflen);
|
bwrite(fd, (genericptr_t) OLONG(otmp), buflen);
|
||||||
|
|
||||||
if (OMAILCMD(otmp))
|
buflen = OMAILCMD(otmp) ? (int) strlen(OMAILCMD(otmp)) + 1 : 0;
|
||||||
buflen = strlen(OMAILCMD(otmp)) + 1;
|
|
||||||
else
|
|
||||||
buflen = 0;
|
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
||||||
if (buflen > 0)
|
if (buflen > 0)
|
||||||
bwrite(fd, (genericptr_t) OMAILCMD(otmp), buflen);
|
bwrite(fd, (genericptr_t) OMAILCMD(otmp), buflen);
|
||||||
@@ -1059,7 +1046,7 @@ register struct obj *otmp;
|
|||||||
otmp = otmp2;
|
otmp = otmp2;
|
||||||
}
|
}
|
||||||
if (perform_bwrite(mode))
|
if (perform_bwrite(mode))
|
||||||
bwrite(fd, (genericptr_t) &minusone, sizeof(int));
|
bwrite(fd, (genericptr_t) &minusone, sizeof (int));
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC_OVL void
|
STATIC_OVL void
|
||||||
@@ -1069,58 +1056,34 @@ struct monst *mtmp;
|
|||||||
{
|
{
|
||||||
int buflen;
|
int buflen;
|
||||||
|
|
||||||
buflen = sizeof(struct monst);
|
buflen = (int) sizeof (struct monst);
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof(int));
|
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
||||||
bwrite(fd, (genericptr_t) mtmp, buflen);
|
bwrite(fd, (genericptr_t) mtmp, buflen);
|
||||||
if (mtmp->mextra) {
|
if (mtmp->mextra) {
|
||||||
if (MNAME(mtmp))
|
buflen = MNAME(mtmp) ? (int) strlen(MNAME(mtmp)) + 1 : 0;
|
||||||
buflen = strlen(MNAME(mtmp)) + 1;
|
|
||||||
else
|
|
||||||
buflen = 0;
|
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
||||||
if (buflen > 0)
|
if (buflen > 0)
|
||||||
bwrite(fd, (genericptr_t) MNAME(mtmp), buflen);
|
bwrite(fd, (genericptr_t) MNAME(mtmp), buflen);
|
||||||
|
buflen = EGD(mtmp) ? (int) sizeof (struct egd) : 0;
|
||||||
if (EGD(mtmp))
|
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
||||||
buflen = sizeof(struct egd);
|
|
||||||
else
|
|
||||||
buflen = 0;
|
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof(int));
|
|
||||||
if (buflen > 0)
|
if (buflen > 0)
|
||||||
bwrite(fd, (genericptr_t) EGD(mtmp), buflen);
|
bwrite(fd, (genericptr_t) EGD(mtmp), buflen);
|
||||||
|
buflen = EPRI(mtmp) ? (int) sizeof (struct epri) : 0;
|
||||||
if (EPRI(mtmp))
|
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
||||||
buflen = sizeof(struct epri);
|
|
||||||
else
|
|
||||||
buflen = 0;
|
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof(int));
|
|
||||||
if (buflen > 0)
|
if (buflen > 0)
|
||||||
bwrite(fd, (genericptr_t) EPRI(mtmp), buflen);
|
bwrite(fd, (genericptr_t) EPRI(mtmp), buflen);
|
||||||
|
buflen = ESHK(mtmp) ? (int) sizeof (struct eshk) : 0;
|
||||||
if (ESHK(mtmp))
|
|
||||||
buflen = sizeof(struct eshk);
|
|
||||||
else
|
|
||||||
buflen = 0;
|
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof(int));
|
bwrite(fd, (genericptr_t) &buflen, sizeof(int));
|
||||||
if (buflen > 0)
|
if (buflen > 0)
|
||||||
bwrite(fd, (genericptr_t) ESHK(mtmp), buflen);
|
bwrite(fd, (genericptr_t) ESHK(mtmp), buflen);
|
||||||
|
buflen = EMIN(mtmp) ? (int) sizeof (struct emin) : 0;
|
||||||
if (EMIN(mtmp))
|
|
||||||
buflen = sizeof(struct emin);
|
|
||||||
else
|
|
||||||
buflen = 0;
|
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof(int));
|
bwrite(fd, (genericptr_t) &buflen, sizeof(int));
|
||||||
if (buflen > 0)
|
if (buflen > 0)
|
||||||
bwrite(fd, (genericptr_t) EMIN(mtmp), buflen);
|
bwrite(fd, (genericptr_t) EMIN(mtmp), buflen);
|
||||||
|
buflen = EDOG(mtmp) ? (int) sizeof (struct edog) : 0;
|
||||||
if (EDOG(mtmp))
|
|
||||||
buflen = sizeof(struct edog);
|
|
||||||
else
|
|
||||||
buflen = 0;
|
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof(int));
|
bwrite(fd, (genericptr_t) &buflen, sizeof(int));
|
||||||
if (buflen > 0)
|
if (buflen > 0)
|
||||||
bwrite(fd, (genericptr_t) EDOG(mtmp), buflen);
|
bwrite(fd, (genericptr_t) EDOG(mtmp), buflen);
|
||||||
|
|
||||||
/* mcorpsenm is inline int rather than pointer to something,
|
/* mcorpsenm is inline int rather than pointer to something,
|
||||||
so doesn't need to be preceded by a length field */
|
so doesn't need to be preceded by a length field */
|
||||||
bwrite(fd, (genericptr_t) &MCORPSENM(mtmp), sizeof MCORPSENM(mtmp));
|
bwrite(fd, (genericptr_t) &MCORPSENM(mtmp), sizeof MCORPSENM(mtmp));
|
||||||
@@ -1156,7 +1119,7 @@ register struct monst *mtmp;
|
|||||||
mtmp = mtmp2;
|
mtmp = mtmp2;
|
||||||
}
|
}
|
||||||
if (perform_bwrite(mode))
|
if (perform_bwrite(mode))
|
||||||
bwrite(fd, (genericptr_t) &minusone, sizeof(int));
|
bwrite(fd, (genericptr_t) &minusone, sizeof (int));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* save traps; g.ftrap is the only trap chain so the 2nd arg is superfluous */
|
/* save traps; g.ftrap is the only trap chain so the 2nd arg is superfluous */
|
||||||
@@ -1172,7 +1135,7 @@ int mode;
|
|||||||
while (trap) {
|
while (trap) {
|
||||||
trap2 = trap->ntrap;
|
trap2 = trap->ntrap;
|
||||||
if (perform_bwrite(mode))
|
if (perform_bwrite(mode))
|
||||||
bwrite(fd, (genericptr_t) trap, sizeof (struct trap));
|
bwrite(fd, (genericptr_t) trap, sizeof *trap);
|
||||||
if (release_data(mode))
|
if (release_data(mode))
|
||||||
dealloc_trap(trap);
|
dealloc_trap(trap);
|
||||||
trap = trap2;
|
trap = trap2;
|
||||||
@@ -1197,7 +1160,7 @@ int fd, mode;
|
|||||||
while (f1) {
|
while (f1) {
|
||||||
f2 = f1->nextf;
|
f2 = f1->nextf;
|
||||||
if (f1->fid >= 0 && perform_bwrite(mode))
|
if (f1->fid >= 0 && perform_bwrite(mode))
|
||||||
bwrite(fd, (genericptr_t) f1, sizeof (struct fruit));
|
bwrite(fd, (genericptr_t) f1, sizeof *f1);
|
||||||
if (release_data(mode))
|
if (release_data(mode))
|
||||||
dealloc_fruit(f1);
|
dealloc_fruit(f1);
|
||||||
f1 = f2;
|
f1 = f2;
|
||||||
@@ -1216,7 +1179,7 @@ int fd;
|
|||||||
|
|
||||||
bufoff(fd);
|
bufoff(fd);
|
||||||
/* bwrite() before bufon() uses plain write() */
|
/* bwrite() before bufon() uses plain write() */
|
||||||
bwrite(fd, (genericptr_t) &plsiztmp, sizeof(plsiztmp));
|
bwrite(fd, (genericptr_t) &plsiztmp, sizeof plsiztmp);
|
||||||
bwrite(fd, (genericptr_t) g.plname, plsiztmp);
|
bwrite(fd, (genericptr_t) g.plname, plsiztmp);
|
||||||
bufon(fd);
|
bufon(fd);
|
||||||
return;
|
return;
|
||||||
@@ -1242,11 +1205,11 @@ int fd, mode;
|
|||||||
no need to modify msg[] since terminator isn't written */
|
no need to modify msg[] since terminator isn't written */
|
||||||
if (msglen > BUFSZ - 1)
|
if (msglen > BUFSZ - 1)
|
||||||
msglen = BUFSZ - 1;
|
msglen = BUFSZ - 1;
|
||||||
bwrite(fd, (genericptr_t) &msglen, sizeof(msglen));
|
bwrite(fd, (genericptr_t) &msglen, sizeof msglen);
|
||||||
bwrite(fd, (genericptr_t) msg, msglen);
|
bwrite(fd, (genericptr_t) msg, msglen);
|
||||||
++msgcount;
|
++msgcount;
|
||||||
}
|
}
|
||||||
bwrite(fd, (genericptr_t) &minusone, sizeof(int));
|
bwrite(fd, (genericptr_t) &minusone, sizeof (int));
|
||||||
}
|
}
|
||||||
debugpline1("Stored %d messages into savefile.", msgcount);
|
debugpline1("Stored %d messages into savefile.", msgcount);
|
||||||
/* note: we don't attempt to handle release_data() here */
|
/* note: we don't attempt to handle release_data() here */
|
||||||
@@ -1262,15 +1225,14 @@ int fd;
|
|||||||
* sfsaveinfo (decl.c) describes the savefile info that actually
|
* sfsaveinfo (decl.c) describes the savefile info that actually
|
||||||
* gets written into the savefile, and is used to determine the
|
* gets written into the savefile, and is used to determine the
|
||||||
* save file being written.
|
* save file being written.
|
||||||
|
*
|
||||||
* sfrestinfo (decl.c) describes the savefile info that is
|
* sfrestinfo (decl.c) describes the savefile info that is
|
||||||
* being used to read the information from an existing savefile.
|
* being used to read the information from an existing savefile.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bufoff(fd);
|
bufoff(fd);
|
||||||
/* bwrite() before bufon() uses plain write() */
|
/* bwrite() before bufon() uses plain write() */
|
||||||
bwrite(fd, (genericptr_t) &sfsaveinfo, (unsigned) (sizeof sfsaveinfo));
|
bwrite(fd, (genericptr_t) &sfsaveinfo, (unsigned) sizeof sfsaveinfo);
|
||||||
bufon(fd);
|
bufon(fd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1335,38 +1297,25 @@ freedynamicdata()
|
|||||||
msgtype_free();
|
msgtype_free();
|
||||||
tmp_at(DISP_FREEMEM, 0); /* temporary display effects */
|
tmp_at(DISP_FREEMEM, 0); /* temporary display effects */
|
||||||
#ifdef FREE_ALL_MEMORY
|
#ifdef FREE_ALL_MEMORY
|
||||||
|
#define free_current_level() savelev(-1, -1, FREE_SAVE)
|
||||||
#define freeobjchn(X) (saveobjchn(0, X, FREE_SAVE), X = 0)
|
#define freeobjchn(X) (saveobjchn(0, X, FREE_SAVE), X = 0)
|
||||||
#define freemonchn(X) (savemonchn(0, X, FREE_SAVE), X = 0)
|
#define freemonchn(X) (savemonchn(0, X, FREE_SAVE), X = 0)
|
||||||
#define freetrapchn(X) (savetrapchn(0, X, FREE_SAVE), X = 0)
|
|
||||||
#define freefruitchn() savefruitchn(0, FREE_SAVE)
|
#define freefruitchn() savefruitchn(0, FREE_SAVE)
|
||||||
#define freenames() savenames(0, FREE_SAVE)
|
#define freenames() savenames(0, FREE_SAVE)
|
||||||
#define free_killers() save_killers(0, FREE_SAVE)
|
#define free_killers() save_killers(0, FREE_SAVE)
|
||||||
#define free_oracles() save_oracles(0, FREE_SAVE)
|
#define free_oracles() save_oracles(0, FREE_SAVE)
|
||||||
#define free_waterlevel() save_waterlevel(0, FREE_SAVE)
|
#define free_waterlevel() save_waterlevel(0, FREE_SAVE)
|
||||||
#define free_worm() save_worm(0, FREE_SAVE)
|
|
||||||
#define free_timers(R) save_timers(0, FREE_SAVE, R)
|
#define free_timers(R) save_timers(0, FREE_SAVE, R)
|
||||||
#define free_light_sources(R) save_light_sources(0, FREE_SAVE, R);
|
#define free_light_sources(R) save_light_sources(0, FREE_SAVE, R)
|
||||||
#define free_engravings() save_engravings(0, FREE_SAVE)
|
|
||||||
#define freedamage() savedamage(0, FREE_SAVE)
|
|
||||||
#define free_animals() mon_animal_list(FALSE)
|
#define free_animals() mon_animal_list(FALSE)
|
||||||
|
|
||||||
/* move-specific data */
|
/* move-specific data */
|
||||||
dmonsfree(); /* release dead monsters */
|
dmonsfree(); /* release dead monsters */
|
||||||
|
|
||||||
/* level-specific data */
|
/* level-specific data */
|
||||||
free_timers(RANGE_LEVEL);
|
free_current_level();
|
||||||
free_light_sources(RANGE_LEVEL);
|
|
||||||
clear_regions();
|
|
||||||
freemonchn(fmon);
|
|
||||||
free_worm(); /* release worm segment information */
|
|
||||||
freetrapchn(g.ftrap);
|
|
||||||
freeobjchn(fobj);
|
|
||||||
freeobjchn(g.level.buriedobjlist);
|
|
||||||
freeobjchn(g.billobjs);
|
|
||||||
free_engravings();
|
|
||||||
freedamage();
|
|
||||||
|
|
||||||
/* game-state data */
|
/* game-state data [ought to reorganize savegamestate() to handle this] */
|
||||||
free_killers();
|
free_killers();
|
||||||
free_timers(RANGE_GLOBAL);
|
free_timers(RANGE_GLOBAL);
|
||||||
free_light_sources(RANGE_GLOBAL);
|
free_light_sources(RANGE_GLOBAL);
|
||||||
@@ -1384,17 +1333,18 @@ freedynamicdata()
|
|||||||
|
|
||||||
/* some pointers in iflags */
|
/* some pointers in iflags */
|
||||||
if (iflags.wc_font_map)
|
if (iflags.wc_font_map)
|
||||||
free(iflags.wc_font_map);
|
free((genericptr_t) iflags.wc_font_map), iflags.wc_font_map = 0;
|
||||||
if (iflags.wc_font_message)
|
if (iflags.wc_font_message)
|
||||||
free(iflags.wc_font_message);
|
free((genericptr_t) iflags.wc_font_message),
|
||||||
|
iflags.wc_font_message = 0;
|
||||||
if (iflags.wc_font_text)
|
if (iflags.wc_font_text)
|
||||||
free(iflags.wc_font_text);
|
free((genericptr_t) iflags.wc_font_text), iflags.wc_font_text = 0;
|
||||||
if (iflags.wc_font_menu)
|
if (iflags.wc_font_menu)
|
||||||
free(iflags.wc_font_menu);
|
free((genericptr_t) iflags.wc_font_menu), iflags.wc_font_menu = 0;
|
||||||
if (iflags.wc_font_status)
|
if (iflags.wc_font_status)
|
||||||
free(iflags.wc_font_status);
|
free((genericptr_t) iflags.wc_font_status), iflags.wc_font_status = 0;
|
||||||
if (iflags.wc_tile_file)
|
if (iflags.wc_tile_file)
|
||||||
free(iflags.wc_tile_file);
|
free((genericptr_t) iflags.wc_tile_file), iflags.wc_tile_file = 0;
|
||||||
free_autopickup_exceptions();
|
free_autopickup_exceptions();
|
||||||
|
|
||||||
/* miscellaneous */
|
/* miscellaneous */
|
||||||
|
|||||||
+7
-5
@@ -2023,11 +2023,13 @@ struct mkroom *croom;
|
|||||||
might be short-circuited if a monster brings object to hero) */
|
might be short-circuited if a monster brings object to hero) */
|
||||||
if (Is_mineend_level(&u.uz)) {
|
if (Is_mineend_level(&u.uz)) {
|
||||||
if (otmp->otyp == iflags.mines_prize_type) {
|
if (otmp->otyp == iflags.mines_prize_type) {
|
||||||
otmp->record_achieve_special = MINES_PRIZE;
|
if (!g.mines_prize_count++) {
|
||||||
/* prevent stacking; cleared when achievement is recorded */
|
/* Note: the first luckstone on lev will become the prize
|
||||||
otmp->nomerge = 1;
|
even if its not the explicit one, but random */
|
||||||
if (++g.mines_prize_count > 1)
|
otmp->record_achieve_special = MINES_PRIZE;
|
||||||
impossible(prize_warning, "mines end");
|
/* prevent stacking; cleared when achievement is recorded */
|
||||||
|
otmp->nomerge = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (Is_sokoend_level(&u.uz)) {
|
} else if (Is_sokoend_level(&u.uz)) {
|
||||||
if (otmp->otyp == iflags.soko_prize_type1) {
|
if (otmp->otyp == iflags.soko_prize_type1) {
|
||||||
|
|||||||
+13
-13
@@ -86,7 +86,7 @@ curses_message_win_puts(const char *message, boolean recursed)
|
|||||||
scroll_window(MESSAGE_WIN);
|
scroll_window(MESSAGE_WIN);
|
||||||
mx = width;
|
mx = width;
|
||||||
my--;
|
my--;
|
||||||
strcpy(g.toplines, message);
|
Strcpy(g.toplines, message);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -466,10 +466,10 @@ curses_message_win_getline(const char *prompt, char *answer, int buffer)
|
|||||||
char *tmpstr; /* for free() */
|
char *tmpstr; /* for free() */
|
||||||
int maxy, maxx; /* linewrap / scroll */
|
int maxy, maxx; /* linewrap / scroll */
|
||||||
int ch;
|
int ch;
|
||||||
WINDOW *win = curses_get_nhwin(MESSAGE_WIN);
|
|
||||||
int border_space = 0;
|
int border_space = 0;
|
||||||
int len; /* of answer string */
|
int len; /* of answer string */
|
||||||
boolean border = curses_window_has_border(MESSAGE_WIN);
|
boolean border = curses_window_has_border(MESSAGE_WIN);
|
||||||
|
WINDOW *win = curses_get_nhwin(MESSAGE_WIN);
|
||||||
|
|
||||||
orig_cursor = curs_set(0);
|
orig_cursor = curs_set(0);
|
||||||
|
|
||||||
@@ -485,6 +485,7 @@ curses_message_win_getline(const char *prompt, char *answer, int buffer)
|
|||||||
maxy = height - 1 + border_space;
|
maxy = height - 1 + border_space;
|
||||||
maxx = width - 1 + border_space;
|
maxx = width - 1 + border_space;
|
||||||
|
|
||||||
|
/* +2? buffer already includes room for terminator; +1: "prompt answer" */
|
||||||
tmpbuf = (char *) alloc((unsigned) ((int) strlen(prompt) + buffer + 2));
|
tmpbuf = (char *) alloc((unsigned) ((int) strlen(prompt) + buffer + 2));
|
||||||
maxlines = buffer / width * 2;
|
maxlines = buffer / width * 2;
|
||||||
Strcpy(tmpbuf, prompt);
|
Strcpy(tmpbuf, prompt);
|
||||||
@@ -585,7 +586,7 @@ curses_message_win_getline(const char *prompt, char *answer, int buffer)
|
|||||||
/* if there isn't any input yet, return ESC */
|
/* if there isn't any input yet, return ESC */
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
Strcpy(answer, "\033");
|
Strcpy(answer, "\033");
|
||||||
return;
|
goto alldone;
|
||||||
}
|
}
|
||||||
/* otherwise, discard current input and start over;
|
/* otherwise, discard current input and start over;
|
||||||
first need to blank it from the screen */
|
first need to blank it from the screen */
|
||||||
@@ -609,27 +610,19 @@ curses_message_win_getline(const char *prompt, char *answer, int buffer)
|
|||||||
break;
|
break;
|
||||||
case ERR: /* should not happen */
|
case ERR: /* should not happen */
|
||||||
*answer = '\0';
|
*answer = '\0';
|
||||||
free(tmpbuf);
|
goto alldone;
|
||||||
free(linestarts);
|
|
||||||
curs_set(orig_cursor);
|
|
||||||
curses_toggle_color_attr(win, NONE, A_BOLD, OFF);
|
|
||||||
return;
|
|
||||||
case '\r':
|
case '\r':
|
||||||
case '\n':
|
case '\n':
|
||||||
free(linestarts);
|
|
||||||
(void) strncpy(answer, p_answer, buffer);
|
(void) strncpy(answer, p_answer, buffer);
|
||||||
answer[buffer - 1] = '\0';
|
answer[buffer - 1] = '\0';
|
||||||
Strcpy(g.toplines, tmpbuf);
|
Strcpy(g.toplines, tmpbuf);
|
||||||
mesg_add_line(tmpbuf);
|
mesg_add_line(tmpbuf);
|
||||||
free(tmpbuf);
|
|
||||||
curs_set(orig_cursor);
|
|
||||||
curses_toggle_color_attr(win, NONE, A_BOLD, OFF);
|
|
||||||
if (++my > maxy) {
|
if (++my > maxy) {
|
||||||
scroll_window(MESSAGE_WIN);
|
scroll_window(MESSAGE_WIN);
|
||||||
my--;
|
my--;
|
||||||
}
|
}
|
||||||
mx = border_space;
|
mx = border_space;
|
||||||
return;
|
goto alldone;
|
||||||
case '\177': /* DEL/Rubout */
|
case '\177': /* DEL/Rubout */
|
||||||
case KEY_DC: /* delete-character */
|
case KEY_DC: /* delete-character */
|
||||||
case '\b': /* ^H (Backspace: '\011') */
|
case '\b': /* ^H (Backspace: '\011') */
|
||||||
@@ -666,6 +659,13 @@ curses_message_win_getline(const char *prompt, char *answer, int buffer)
|
|||||||
p_answer[len] = '\0';
|
p_answer[len] = '\0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
alldone:
|
||||||
|
free(linestarts);
|
||||||
|
free(tmpbuf);
|
||||||
|
curses_toggle_color_attr(win, NONE, A_BOLD, OFF);
|
||||||
|
curs_set(orig_cursor);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scroll lines upward in given window, or clear window if only one line. */
|
/* Scroll lines upward in given window, or clear window if only one line. */
|
||||||
|
|||||||
Reference in New Issue
Block a user