| version 1.8 | | version 1.9 |
|---|
| | |
| /* | | /* |
| * static char *rcsid_weather_c = | | * static char *rcsid_weather_c = |
| * "$Id: weather.c,v 1.8 2002/10/29 07:49:32 garbled Exp $"; | | * "$Id: weather.c,v 1.9 2002/10/29 09:00:44 garbled Exp $"; |
| */ | | */ |
| /* | | /* |
| CrossFire, A Multiplayer game for X-windows | | CrossFire, A Multiplayer game for X-windows |
| | |
| 1, 1, 1, 1, 1, 0} | | 1, 1, 1, 1, 1, 0} |
| }; | | }; |
| | | |
| | | const int season_tempchange[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 |
| | | 8 9 10 11 12 13 */ |
| | | 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, |
| | | 1, 1, 1, 1, 1, 1}; |
| | | |
| void set_darkness_map(mapstruct *m) | | void set_darkness_map(mapstruct *m) |
| { | | { |
| int i; | | int i; |
| | |
| fclose(fp); | | fclose(fp); |
| } | | } |
| | | |
| | | /* provide wx and wy. Will fill in with weathermap coordinates. Requires |
| | | the current mapname (must be a worldmap), and your coordinates on the |
| | | map. returns -1 if you give it something it can't figure out. 0 normally. |
| | | */ |
| | | |
| | | int worldmap_to_weathermap(int x, int y, int *wx, int *wy, char *filename) |
| | | { |
| | | int spwtx, spwty; |
| | | int fx, fy; |
| | | int nx, ny; |
| | | |
| | | spwtx = (settings.worldmaptilesx * settings.worldmaptilesizex) / WEATHERMAPTILESX; |
| | | spwty = (settings.worldmaptilesy * settings.worldmaptilesizey) / WEATHERMAPTILESY; |
| | | |
| | | fx = -1; |
| | | fy = -1; |
| | | sscanf(filename, "world/world_%d_%d", &fx, &fy); |
| | | if (fx > settings.worldmapstartx + settings.worldmaptilesx || |
| | | fx < settings.worldmapstartx) |
| | | return -1; |
| | | if (fy > settings.worldmapstarty + settings.worldmaptilesy || |
| | | fy < settings.worldmapstarty) |
| | | return -1; |
| | | fx -= settings.worldmapstartx; |
| | | fy -= settings.worldmapstarty; |
| | | |
| | | nx = fx * settings.worldmaptilesizex + x; |
| | | ny = fy * settings.worldmaptilesizey + y; |
| | | |
| | | *wx = nx/spwtx; |
| | | *wy = ny/spwty; |
| | | |
| | | return 0; |
| | | } |
| | | |
| /* provide x and y. Will fill in with the requested corner of the real | | /* provide x and y. Will fill in with the requested corner of the real |
| * world map, given the current weathermap section. dir selects which | | * world map, given the current weathermap section. dir selects which |
| * corner to return. Valid values are 2 4 6 8 for the corners. return | | * corner to return. Valid values are 2 4 6 8 for the corners. return |
| | |
| weathermap[x][y].temp -= elev; | | weathermap[x][y].temp -= elev; |
| } | | } |
| | | |
| | | /* Compute the real (adjusted) temperature of a given weathermap tile. |
| | | This takes into account the wind, base temp, sunlight, and other fun |
| | | things. Seasons are automatically handled by moving the equator. |
| | | Elevation is considered in the base temp. |
| | | */ |
| | | |
| | | int real_temperature(int x, int y) |
| | | { |
| | | int i, temp; |
| | | timeofday_t tod; |
| | | |
| | | /* adjust for time of day */ |
| | | temp = weathermap[x][y].temp; |
| | | get_tod(&tod); |
| | | for (i = HOURS_PER_DAY/2; i < HOURS_PER_DAY; i++) { |
| | | temp += season_tempchange[i]; |
| | | /* high amounts of water has a buffering effect on the temp */ |
| | | if (weathermap[x][y].water > 33) |
| | | i++; |
| | | } |
| | | for (i = 0; i <= tod.hour; i++) { |
| | | temp += season_tempchange[i]; |
| | | if (weathermap[x][y].water > 33) |
| | | i++; |
| | | } |
| | | |
| | | /* windchill */ |
| | | for (i=0; i < weathermap[x][y].windspeed; i+=i) |
| | | temp--; |
| | | |
| | | return temp; |
| | | } |
| | | |
| /* this code simply smooths the pressure map */ | | /* this code simply smooths the pressure map */ |
| | | |