--- deliantra/server/common/map.C 2006/08/13 17:16:00 1.1 +++ deliantra/server/common/map.C 2006/08/21 02:58:22 1.7 @@ -1,6 +1,6 @@ /* * static char *rcsid_map_c = - * "$Id: map.C,v 1.1 2006/08/13 17:16:00 elmex Exp $"; + * "$Id: map.C,v 1.7 2006/08/21 02:58:22 elmex Exp $"; */ /* @@ -270,6 +270,10 @@ if (nx) *nx = newx; if (ny) *ny = newy; retval |= mp->spaces[newx + mp->width * newy].flags; + + if (retval & P_SAFE) + retval |= P_NO_MAGIC | P_NO_CLERIC; // P_SAFE does imply these + return retval; } @@ -947,6 +951,8 @@ m->sky = atoi(value); } else if (!strcmp(key, "nosmooth")) { m->nosmooth = atoi(value); + } else if (!strcmp(key, "safe_map")) { + m->safe_map = atoi(value); } else if (!strncmp(key,"tile_path_", 10)) { int tile=atoi(key+10); @@ -1216,7 +1222,8 @@ int new_save_map(mapstruct *m, int flag) { FILE *fp, *fp2; - char filename[MAX_BUF],buf[MAX_BUF], shop[MAX_BUF]; + char filename[MAX_BUF],buf[MAX_BUF], buf_s[MAX_BUF], + shop[MAX_BUF], filename_s[MAX_BUF]; int i; if (flag && !*m->path) { @@ -1247,23 +1254,23 @@ m->tmpname = tempnam_local(settings.tmpdir,NULL); strcpy(filename, m->tmpname); } - LOG(llevDebug,"Saving map %s\n",m->path); + LOG(llevDebug,"Saving map %s to %s\n", m->path, filename); m->in_memory = MAP_SAVING; - unlink (filename); // do not overwrite backups if done via hardlinks + sprintf (filename_s, "%s~", filename); /* Compress if it isn't a temporary save. Do compress if unique */ if (m->compressed && (m->unique || m->templatemap || flag)) { char buf[MAX_BUF]; strcpy(buf, uncomp[m->compressed][2]); strcat(buf, " > "); - strcat(buf, filename); + strcat(buf, filename_s); fp = popen(buf, "w"); } else - fp = fopen(filename, "w"); + fp = fopen(filename_s, "w"); if(fp == NULL) { - LOG(llevError, "Cannot write %s: %s\n", filename, strerror_local(errno)); + LOG(llevError, "Cannot write %s: %s\n", filename_s, strerror_local(errno)); return -1; } @@ -1308,6 +1315,7 @@ if (m->winddir) fprintf(fp, "winddir %d\n", m->winddir); if (m->sky) fprintf(fp, "sky %d\n", m->sky); if (m->nosmooth) fprintf(fp, "nosmooth %d\n", m->nosmooth); + if (m->safe_map) fprintf(fp, "safe_map %d\n", m->safe_map); /* Save any tiling information, except on overlays */ if (flag != 2) @@ -1322,11 +1330,11 @@ * If unique map, save files in the proper destination (set by * player) */ - fp2 = fp; /* save unique items into fp2 */ if ((flag == 0 || flag == 2) && !m->unique && !m->templatemap) { sprintf (buf,"%s.v00",create_items_path (m->path)); - if ((fp2 = fopen (buf, "w")) == NULL) { - LOG(llevError, "Can't open unique items file %s\n", buf); + sprintf (buf_s, "%s~", buf); + if ((fp2 = fopen (buf_s, "w")) == NULL) { + LOG(llevError, "Can't open unique items file %s\n", buf_s); } if (flag == 2) save_objects(m, fp, fp2, 2); @@ -1335,9 +1343,11 @@ if (fp2 != NULL) { if (ftell (fp2) == 0) { fclose (fp2); + rename (buf_s, buf); unlink (buf); } else { fclose (fp2); + rename (buf_s, buf); chmod (buf, SAVE_MODE); } } @@ -1350,6 +1360,8 @@ else fclose(fp); + rename (filename_s, filename); + chmod (filename, SAVE_MODE); return 0; } @@ -1821,6 +1833,8 @@ flags |= P_NO_MAGIC; if (QUERY_FLAG(tmp,FLAG_DAMNED)) flags |= P_NO_CLERIC; + if (tmp->type == SAFE_GROUND) + flags |= P_SAFE | P_NO_CLERIC | P_NO_MAGIC; if (QUERY_FLAG(tmp,FLAG_BLOCKSVIEW)) flags |= P_BLOCKSVIEW;