From: nhmall Date: Sun, 26 May 2019 12:18:03 +0000 (-0400) Subject: Merge branch 'NetHack-3.6' X-Git-Tag: NetHack-3.7.0_WIP~402 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3fae8c7ce6f1bc425377423ec4f29c59c140165f;p=nethack Merge branch 'NetHack-3.6' --- 3fae8c7ce6f1bc425377423ec4f29c59c140165f diff --cc src/dungeon.c index 275bd14ea,d473e1c2e..eff67af3a --- a/src/dungeon.c +++ b/src/dungeon.c @@@ -176,9 -181,11 +176,11 @@@ boolean perform_write, free_data next_ms = curr_ms->next; if (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); } - mapseenchn = 0; + g.mapseenchn = 0; } } @@@ -2149,8 -2156,9 +2151,9 @@@ int ledger_num mapseen *mptr, *mprev = (mapseen *)0; struct cemetery *bp, *bpnext; - for (mptr = mapseenchn; mptr; mprev = mptr, mptr = mptr->next) - if (dungeons[mptr->lev.dnum].ledger_start + mptr->lev.dlevel + 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; if (!mptr) diff --cc src/save.c index e5e966e1d,d9d3662fd..bb88bf8a2 --- a/src/save.c +++ b/src/save.c @@@ -284,10 -287,10 +284,10 @@@ register int fd, mode #endif uid = (unsigned long) getuid(); bwrite(fd, (genericptr_t) &uid, sizeof uid); - bwrite(fd, (genericptr_t) &g.context, sizeof(struct context_info)); - bwrite(fd, (genericptr_t) &flags, sizeof(struct flag)); - bwrite(fd, (genericptr_t) &context, sizeof context); ++ bwrite(fd, (genericptr_t) &g.context, sizeof g.context); + bwrite(fd, (genericptr_t) &flags, sizeof flags); #ifdef SYSFLAGS - bwrite(fd, (genericptr_t) &sysflags, sizeof(struct sysflag)); + bwrite(fd, (genericptr_t) &sysflags, sysflags); #endif urealtime.finish_time = getnow(); urealtime.realtime += (long) (urealtime.finish_time @@@ -314,22 -317,22 +314,22 @@@ saveobjchn(fd, (struct obj *) 0, mode); } - saveobjchn(fd, migrating_objs, mode); - savemonchn(fd, migrating_mons, mode); + saveobjchn(fd, g.migrating_objs, mode); + savemonchn(fd, g.migrating_mons, mode); if (release_data(mode)) { - invent = 0; - migrating_objs = 0; - migrating_mons = 0; + g.invent = 0; + g.migrating_objs = 0; + g.migrating_mons = 0; } - bwrite(fd, (genericptr_t) g.mvitals, sizeof(g.mvitals)); - bwrite(fd, (genericptr_t) mvitals, sizeof mvitals); ++ bwrite(fd, (genericptr_t) g.mvitals, sizeof g.mvitals); save_dungeon(fd, (boolean) !!perform_bwrite(mode), (boolean) !!release_data(mode)); savelevchn(fd, mode); - bwrite(fd, (genericptr_t) &moves, sizeof moves); - bwrite(fd, (genericptr_t) &monstermoves, sizeof monstermoves); - bwrite(fd, (genericptr_t) &quest_status, sizeof quest_status); - bwrite(fd, (genericptr_t) spl_book, + bwrite(fd, (genericptr_t) &g.moves, sizeof g.moves); + 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, sizeof(struct spell) * (MAXSPELL + 1)); save_artifacts(fd); save_oracles(fd, mode); @@@ -390,12 -394,12 +390,12 @@@ savestateinlock( if (tricked_fileremoved(fd, whynot)) return; - (void) read(fd, (genericptr_t) &hpid, sizeof(hpid)); + (void) read(fd, (genericptr_t) &hpid, sizeof hpid); - if (hackpid != hpid) { + if (g.hackpid != hpid) { Sprintf(whynot, "Level #0 pid (%d) doesn't match ours (%d)!", - hpid, hackpid); + hpid, g.hackpid); pline1(whynot); - Strcpy(killer.name, whynot); + Strcpy(g.killer.name, whynot); done(TRICKED); } (void) nhclose(fd); @@@ -407,7 -411,7 +407,7 @@@ done(TRICKED); return; } - (void) write(fd, (genericptr_t) &g.hackpid, sizeof(g.hackpid)); - (void) write(fd, (genericptr_t) &hackpid, sizeof hackpid); ++ (void) write(fd, (genericptr_t) &g.hackpid, sizeof g.hackpid); if (flags.ins_chkpt) { int currlev = ledger_no(&u.uz); @@@ -491,36 -495,35 +491,35 @@@ int mode count_only = (mode & COUNT_SAVE); #endif if (lev >= 0 && lev <= maxledgerno()) - level_info[lev].flags |= VISITED; - bwrite(fd, (genericptr_t) &hackpid, sizeof hackpid); + 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 tlev = lev; tlev &= 0x00ff; - bwrite(fd, (genericptr_t) &tlev, sizeof(tlev)); + bwrite(fd, (genericptr_t) &tlev, sizeof tlev); #else - bwrite(fd, (genericptr_t) &lev, sizeof(lev)); + bwrite(fd, (genericptr_t) &lev, sizeof lev); #endif - savecemetery(fd, mode, &level.bonesinfo); + savecemetery(fd, mode, &g.level.bonesinfo); - savelevl(fd, - (boolean) ((sfsaveinfo.sfi1 & SFI1_RLECOMP) == SFI1_RLECOMP)); - bwrite(fd, (genericptr_t) g.lastseentyp, sizeof(g.lastseentyp)); - bwrite(fd, (genericptr_t) &g.monstermoves, sizeof(g.monstermoves)); - bwrite(fd, (genericptr_t) &g.upstair, sizeof(stairway)); - bwrite(fd, (genericptr_t) &g.dnstair, sizeof(stairway)); - bwrite(fd, (genericptr_t) &g.upladder, sizeof(stairway)); - bwrite(fd, (genericptr_t) &g.dnladder, sizeof(stairway)); - bwrite(fd, (genericptr_t) &g.sstairs, sizeof(stairway)); - bwrite(fd, (genericptr_t) &g.updest, 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.doors, sizeof(g.doors)); + savelevl(fd, (boolean) ((sfsaveinfo.sfi1 & SFI1_RLECOMP) == SFI1_RLECOMP)); - bwrite(fd, (genericptr_t) lastseentyp, sizeof lastseentyp); - bwrite(fd, (genericptr_t) &monstermoves, sizeof monstermoves); - bwrite(fd, (genericptr_t) &upstair, sizeof (stairway)); - bwrite(fd, (genericptr_t) &dnstair, sizeof (stairway)); - bwrite(fd, (genericptr_t) &upladder, sizeof (stairway)); - bwrite(fd, (genericptr_t) &dnladder, sizeof (stairway)); - bwrite(fd, (genericptr_t) &sstairs, sizeof (stairway)); - bwrite(fd, (genericptr_t) &updest, sizeof (dest_area)); - bwrite(fd, (genericptr_t) &dndest, sizeof (dest_area)); - bwrite(fd, (genericptr_t) &level.flags, sizeof level.flags); - bwrite(fd, (genericptr_t) doors, sizeof doors); ++ bwrite(fd, (genericptr_t) g.lastseentyp, sizeof g.lastseentyp); ++ bwrite(fd, (genericptr_t) &g.monstermoves, sizeof g.monstermoves); ++ bwrite(fd, (genericptr_t) &g.upstair, sizeof (stairway)); ++ bwrite(fd, (genericptr_t) &g.dnstair, sizeof (stairway)); ++ bwrite(fd, (genericptr_t) &g.upladder, sizeof (stairway)); ++ bwrite(fd, (genericptr_t) &g.dnladder, sizeof (stairway)); ++ bwrite(fd, (genericptr_t) &g.sstairs, sizeof (stairway)); ++ bwrite(fd, (genericptr_t) &g.updest, 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.doors, sizeof g.doors); save_rooms(fd); /* no dynamic memory to reclaim */ - /* from here on out, saving also involves allocated memory cleanup */ - skip_lots: + /* from here on out, saving also involves allocated memory cleanup */ + skip_lots: /* this comes before the map, so need cleanup here if we skipped */ if (mode == FREE_SAVE) - savecemetery(fd, mode, &level.bonesinfo); + savecemetery(fd, mode, &g.level.bonesinfo); /* must be saved before mons, objs, and buried objs */ save_timers(fd, mode, RANGE_LEVEL); save_light_sources(fd, mode, RANGE_LEVEL); @@@ -898,15 -900,15 +896,15 @@@ register int fd, mode s_level *tmplev, *tmplev2; int cnt = 0; - for (tmplev = sp_levchn; tmplev; tmplev = tmplev->next) + for (tmplev = g.sp_levchn; tmplev; tmplev = tmplev->next) cnt++; if (perform_bwrite(mode)) - bwrite(fd, (genericptr_t) &cnt, sizeof(int)); + bwrite(fd, (genericptr_t) &cnt, sizeof cnt); - for (tmplev = sp_levchn; tmplev; tmplev = tmplev2) { + for (tmplev = g.sp_levchn; tmplev; tmplev = tmplev2) { tmplev2 = tmplev->next; if (perform_bwrite(mode)) - bwrite(fd, (genericptr_t) tmplev, sizeof(s_level)); + bwrite(fd, (genericptr_t) tmplev, sizeof *tmplev); if (release_data(mode)) free((genericptr_t) tmplev); } @@@ -1156,10 -1123,10 +1119,10 @@@ register struct monst *mtmp mtmp = mtmp2; } if (perform_bwrite(mode)) - bwrite(fd, (genericptr_t) &minusone, sizeof(int)); + bwrite(fd, (genericptr_t) &minusone, sizeof (int)); } -/* save traps; 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 */ STATIC_OVL void savetrapchn(fd, trap, mode) int fd; @@@ -1216,8 -1183,8 +1179,8 @@@ int fd bufoff(fd); /* bwrite() before bufon() uses plain write() */ - bwrite(fd, (genericptr_t) &plsiztmp, sizeof(plsiztmp)); + bwrite(fd, (genericptr_t) &plsiztmp, sizeof plsiztmp); - bwrite(fd, (genericptr_t) plname, plsiztmp); + bwrite(fd, (genericptr_t) g.plname, plsiztmp); bufon(fd); return; } diff --cc src/sp_lev.c index 4237bf638,dbab1dfdc..19e2cd24e --- a/src/sp_lev.c +++ b/src/sp_lev.c @@@ -2023,11 -2044,13 +2023,13 @@@ struct mkroom *croom might be short-circuited if a monster brings object to hero) */ if (Is_mineend_level(&u.uz)) { if (otmp->otyp == iflags.mines_prize_type) { - otmp->record_achieve_special = MINES_PRIZE; - /* prevent stacking; cleared when achievement is recorded */ - otmp->nomerge = 1; - if (++g.mines_prize_count > 1) - impossible(prize_warning, "mines end"); - if (!mines_prize_count++) { ++ if (!g.mines_prize_count++) { + /* Note: the first luckstone on lev will become the prize + even if its not the explicit one, but random */ + otmp->record_achieve_special = MINES_PRIZE; + /* prevent stacking; cleared when achievement is recorded */ + otmp->nomerge = 1; + } } } else if (Is_sokoend_level(&u.uz)) { if (otmp->otyp == iflags.soko_prize_type1) { diff --cc win/curses/cursmesg.c index 1548e2818,13c3109ba..28c30ab74 --- a/win/curses/cursmesg.c +++ b/win/curses/cursmesg.c @@@ -86,7 -86,7 +86,7 @@@ curses_message_win_puts(const char *mes scroll_window(MESSAGE_WIN); mx = width; my--; - strcpy(g.toplines, message); - Strcpy(toplines, message); ++ Strcpy(g.toplines, message); } return; } @@@ -609,21 -610,13 +610,13 @@@ curses_message_win_getline(const char * break; case ERR: /* should not happen */ *answer = '\0'; - free(tmpbuf); - free(linestarts); - curs_set(orig_cursor); - curses_toggle_color_attr(win, NONE, A_BOLD, OFF); - return; + goto alldone; case '\r': case '\n': - free(linestarts); (void) strncpy(answer, p_answer, buffer); answer[buffer - 1] = '\0'; - Strcpy(toplines, tmpbuf); + Strcpy(g.toplines, tmpbuf); mesg_add_line(tmpbuf); - free(tmpbuf); - curs_set(orig_cursor); - curses_toggle_color_attr(win, NONE, A_BOLD, OFF); if (++my > maxy) { scroll_window(MESSAGE_WIN); my--;