version 1.1 | | version 1.2 |
---|
| | |
#include <global.h> | | #include <global.h> |
#include <tod.h> | | #include <tod.h> |
| | #include <map.h> |
| | #ifndef __CEXTRACT__ |
| | #include <sproto.h> |
| | #endif |
| | |
extern unsigned long todtick; | | extern unsigned long todtick; |
| | extern weathermap_t **weathermap; |
| | |
const int season_timechange[5][HOURS_PER_DAY] = { | | const int season_timechange[5][HOURS_PER_DAY] = { |
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 2 3 4 5 6 7 | | /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 2 3 4 5 6 7 |
| | |
write_todclock(); | | write_todclock(); |
get_tod(&tod); | | get_tod(&tod); |
dawn_to_dusk(&tod); | | dawn_to_dusk(&tod); |
| | perform_weather(); |
| | } |
| | |
| | int wmperformstartx; |
| | int wmperformstarty; |
| | |
| | void init_weather() |
| | { |
| | int x, y; |
| | int i, j; |
| | long long int tmp; |
| | char filename[MAX_BUF]; |
| | FILE *fp; |
| | mapstruct *m; |
| | |
| | /* all this stuff needs to be set, otherwise this function will cause |
| | * chaos and destruction. |
| | */ |
| | if (settings.dynamiclevel < 1) |
| | return; |
| | if (settings.worldmapstartx < 1 || settings.worldmapstarty < 1 || |
| | settings.worldmaptilesx < 1 || settings.worldmaptilesy < 1 || |
| | settings.worldmaptilesizex < 1 || settings.worldmaptilesizex < 1) |
| | return; |
| | |
| | LOG(llevDebug, "Initializing the weathermap...\n"); |
| | |
| | weathermap = (weathermap_t **)malloc(sizeof(weathermap_t *) * |
| | settings.worldmaptilesx); |
| | if (weathermap == NULL) |
| | fatal(OUT_OF_MEMORY); |
| | for (y=0; y < settings.worldmaptilesy; y++) { |
| | weathermap[y] = (weathermap_t *)malloc(sizeof(weathermap_t) * |
| | settings.worldmaptilesy); |
| | if (weathermap[y] == NULL) |
| | fatal(OUT_OF_MEMORY); |
| | } |
| | /* now we load the values in the big worldmap weather array */ |
| | for (x=0; x < settings.worldmaptilesx; x++) { |
| | for (y=0; y < settings.worldmaptilesy; y++) { |
| | sprintf(filename, "world/world_%d_%d", |
| | x+settings.worldmapstartx, y+settings.worldmapstarty); |
| | m = load_original_map(filename, 0); |
| | if (m == NULL) |
| | continue; |
| | m = load_overlay_map(filename, m); |
| | if (m == NULL) |
| | continue; |
| | sprintf(weathermap[x][y].path, "%s", m->path); |
| | if (m->tmpname) |
| | weathermap[x][y].tmpname = strdup(m->tmpname); |
| | weathermap[x][y].name = strdup(m->name); |
| | weathermap[x][y].temp = m->temp; |
| | weathermap[x][y].pressure = m->pressure; |
| | weathermap[x][y].humid = m->humid; |
| | weathermap[x][y].windspeed = m->windspeed; |
| | weathermap[x][y].winddir = m->winddir; |
| | weathermap[x][y].sky = m->sky; |
| | weathermap[x][y].darkness = m->darkness; |
| | tmp = 0; |
| | for (i=0; i < settings.worldmaptilesizex; i++) |
| | for (j=0; j < settings.worldmaptilesizey; j++) |
| | tmp += m->spaces[i+j].bottom->elevation; |
| | weathermap[x][y].avgelev = tmp / (i*j); |
| | delete_map(m); |
| | } |
| | } |
| | LOG(llevDebug, "Done reading worldmaps\n"); |
| | sprintf(filename, "%s/wmapcurpos", settings.localdir); |
| | LOG(llevDebug, "Reading current weather position from %s...", filename); |
| | if ((fp = fopen(filename, "r")) == NULL) { |
| | LOG(llevError, "Can't open %s.\n", filename); |
| | wmperformstartx = -1; |
| | return; |
| | } |
| | fscanf(fp, "%d %d", &wmperformstartx, &wmperformstarty); |
| | LOG(llevDebug, "curposx=%d curposy=%d\n", wmperformstartx, wmperformstarty); |
| | fclose(fp); |
| | if (wmperformstartx > settings.worldmaptilesx) |
| | wmperformstartx = -1; |
| | if (wmperformstarty > settings.worldmaptilesy) |
| | wmperformstarty = 0; |
| | |
| | } |
| | |
| | /* |
| | * This routine slowly loads the world, patches it up due to the weather, |
| | * and saves it back to disk. In this way, the world constantly feels the |
| | * effects of weather uniformly, without relying on players wandering. |
| | */ |
| | |
| | void perform_weather() |
| | { |
| | mapstruct *m; |
| | char filename[MAX_BUF]; |
| | FILE *fp; |
| | |
| | if (!settings.dynamiclevel) |
| | return; |
| | |
| | /* move right to left, top to bottom */ |
| | if (wmperformstartx == settings.worldmaptilesx) { |
| | wmperformstartx = 0; |
| | wmperformstarty++; |
| | } else |
| | wmperformstartx++; |
| | if (wmperformstarty == settings.worldmaptilesy) |
| | wmperformstartx = wmperformstarty = 0; |
| | |
| | sprintf(filename, "world/world_%d_%d", |
| | wmperformstartx+settings.worldmapstartx, |
| | wmperformstarty+settings.worldmapstarty); |
| | m = ready_map_name(filename, 0); |
| | if (m == NULL) |
| | return; /* hrmm */ |
| | |
| | m->temp = weathermap[wmperformstartx][wmperformstarty].temp; |
| | m->pressure = weathermap[wmperformstartx][wmperformstarty].pressure; |
| | m->humid = weathermap[wmperformstartx][wmperformstarty].humid; |
| | m->windspeed = weathermap[wmperformstartx][wmperformstarty].windspeed; |
| | m->winddir = weathermap[wmperformstartx][wmperformstarty].winddir; |
| | m->sky = weathermap[wmperformstartx][wmperformstarty].sky; |
| | decay_objects(m); |
| | new_save_map(m, 2); /* write the overlay */ |
| | sprintf(filename, "%s/wmapcurpos", settings.localdir); |
| | if ((fp = fopen(filename, "w")) == NULL) { |
| | LOG(llevError, "Cannot open %s for writing\n", filename); |
| | return; |
| | } |
| | fprintf(fp, "%d %d", wmperformstartx, wmperformstarty); |
| | fclose(fp); |
} | | } |