]> granicus.if.org Git - nethack/commitdiff
Merge branch 'NetHack-3.6'
authornhmall <nhmall@nethack.org>
Sun, 26 May 2019 12:18:03 +0000 (08:18 -0400)
committernhmall <nhmall@nethack.org>
Sun, 26 May 2019 12:18:03 +0000 (08:18 -0400)
1  2 
src/dungeon.c
src/hack.c
src/save.c
src/sp_lev.c
win/curses/cursmesg.c

diff --cc src/dungeon.c
index 275bd14eac9a00dcaabccd76e0c33eb3801e3a32,d473e1c2eaffa3c9cc74b1bd8a338bc8e0010d2a..eff67af3ac75c4e1174685232cb985b4d44f9b8f
@@@ -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/hack.c
Simple merge
diff --cc src/save.c
index e5e966e1dabdb7f6e304b1250c2d4ee0edee1586,d9d3662fd17eac626c0c4f9492e2817f10e9a7dd..bb88bf8a2274e1286ab2f5b584d57c8efebdc2ac
@@@ -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
          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);
              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 4237bf6380719e224c7430f70fbf8479adc7d0d1,dbab1dfdc3c6dbdfda8ccb6fc016cd4411087002..19e2cd24ef99ed9e67d14ea61b0a40fe2728a9b5
@@@ -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) {
index 1548e28183d7492aee866f4232af54c83a898828,13c3109ba9135517c295bdb073d9f89ab93496a0..28c30ab744b61faf37364dd86ef80f1978f56172
@@@ -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--;