version 1.11 | | version 1.12 |
---|
| | |
/* | | /* |
* static char *rcsid_weather_c = | | * static char *rcsid_weather_c = |
* "$Id: weather.c,v 1.11 2002/10/31 04:50:12 garbled Exp $"; | | * "$Id: weather.c,v 1.12 2002/11/06 09:47:23 garbled Exp $"; |
*/ | | */ |
/* | | /* |
CrossFire, A Multiplayer game for X-windows | | CrossFire, A Multiplayer game for X-windows |
| | |
void let_it_snow(mapstruct *m, int wx, int wy, char *filename) | | void let_it_snow(mapstruct *m, int wx, int wy, char *filename) |
{ | | { |
int x, y; | | int x, y; |
int avoid, two, temp, sky; | | int avoid, two, temp, sky, gotsnow; |
object *ob, *tmp; | | object *ob, *tmp, *oldsnow; |
archetype *at; | | archetype *at; |
| | |
for (x=0; x < settings.worldmaptilesizex; x++) { | | for (x=0; x < settings.worldmaptilesizex; x++) { |
| | |
/* this will definately need tuning */ | | /* this will definately need tuning */ |
avoid = 0; | | avoid = 0; |
two = 0; | | two = 0; |
| | gotsnow = 0; |
temp = real_world_temperature(x, y, m); | | temp = real_world_temperature(x, y, m); |
sky = weathermap[wx][wy].sky; | | sky = weathermap[wx][wy].sky; |
if (temp <= 0 && sky > SKY_OVERCAST && sky < SKY_FOG) | | if (temp <= 0 && sky > SKY_OVERCAST && sky < SKY_FOG) |
sky += 10; /*let it snow*/ | | sky += 10; /*let it snow*/ |
for (tmp=GET_MAP_OB(m, x, y); tmp; tmp = tmp->above) { | | for (tmp=GET_MAP_OB(m, x, y); tmp; tmp = tmp->above) { |
if (!strcasecmp(tmp->name, "snow")) | | /* problem: snow never gets upgraded */ |
| | if (!strcmp(tmp->arch->name, "snow")) { |
| | gotsnow++; |
| | oldsnow = tmp; |
| | } else if (!strcmp(tmp->arch->name, "snow2")) { |
| | gotsnow++; |
| | oldsnow = tmp; |
| | } else if (!strcmp(tmp->arch->name, "snow4")) { |
| | gotsnow++; |
| | oldsnow = tmp; |
| | } else if (!strcmp(tmp->name, "drifts")) |
avoid++; | | avoid++; |
else if (!strcmp(tmp->name, "snow2")) | | else if (!strcmp(tmp->arch->name, "cforest1")) |
avoid++; | | |
else if (!strcmp(tmp->name, "drifts")) | | |
avoid++; | | |
else if (!strcmp(tmp->name, "cforest1")) | | |
avoid++; | | avoid++; |
else if (!strcmp(tmp->name, "sea")) | | else if (!strcmp(tmp->name, "sea")) |
avoid++; | | avoid++; |
| | |
if (!strcmp(GET_MAP_OB(m, x, y)->name, "hills") && | | if (!strcmp(GET_MAP_OB(m, x, y)->name, "hills") && |
sky >= SKY_LIGHT_SNOW) | | sky >= SKY_LIGHT_SNOW) |
at = find_archetype("drifts"); | | at = find_archetype("drifts"); |
| | if (!strcmp(GET_MAP_OB(m, x, y)->name, "cobblestones") && |
| | sky >= SKY_LIGHT_SNOW) |
| | at = find_archetype("snow4"); |
| | if (!strcmp(GET_MAP_OB(m, x, y)->arch->name, "cobblestones2") && |
| | sky >= SKY_LIGHT_SNOW) |
| | at = find_archetype("snow4"); |
| | if (!strcmp(GET_MAP_OB(m, x, y)->name, "stones") && |
| | sky >= SKY_LIGHT_SNOW) |
| | at = find_archetype("snow4"); |
| | if (!strcmp(GET_MAP_OB(m, x, y)->name, "flagstone") && |
| | sky >= SKY_LIGHT_SNOW) |
| | at = find_archetype("snow4"); |
| | if (!strcmp(GET_MAP_OB(m, x, y)->arch->name, "stonefloor2") && |
| | sky >= SKY_LIGHT_SNOW) |
| | at = find_archetype("snow4"); |
if (!strcmp(GET_MAP_OB(m, x, y)->name, "evergreens") && | | if (!strcmp(GET_MAP_OB(m, x, y)->name, "evergreens") && |
sky >= SKY_LIGHT_SNOW) | | sky >= SKY_LIGHT_SNOW) |
at = find_archetype("cforest1"); | | at = find_archetype("cforest1"); |
| | |
two++; | | two++; |
if (!strcmp(GET_MAP_OB(m, x, y)->name, "tree")) | | if (!strcmp(GET_MAP_OB(m, x, y)->name, "tree")) |
two++; | | two++; |
| | if (gotsnow && at) { |
| | if (!strcmp(oldsnow->arch->name, at->name)) |
| | at = NULL; |
| | else { |
| | remove_ob(oldsnow); |
| | free_object(oldsnow); |
| | tmp=GET_MAP_OB(m, x, y); |
| | /* clean up the trees we put over the snow */ |
| | if (!strcmp(tmp->name, "evergreen")) |
| | tmp = tmp->above; |
| | else if (!strcmp(tmp->name, "tree")) |
| | tmp = tmp->above; |
| | if (tmp != NULL) |
| | if (strcmp(tmp->arch->name, "tree3") == 0 || |
| | strcmp(tmp->arch->name, "tree5") == 0) { |
| | remove_ob(tmp); |
| | free_object(tmp); |
| | } |
| | } |
| | } |
if (at != NULL) { | | if (at != NULL) { |
ob = get_object(); | | ob = get_object(); |
copy_object(&at->clone, ob); | | copy_object(&at->clone, ob); |
ob->x = x; | | ob->x = x; |
ob->y = y; | | ob->y = y; |
| | if (!strcmp(ob->arch->name, "snow4")) |
| | SET_FLAG(ob, FLAG_OVERLAY_FLOOR); |
insert_ob_in_map(ob, m, ob, | | insert_ob_in_map(ob, m, ob, |
INS_NO_MERGE | INS_NO_WALK_ON | INS_ABOVE_FLOOR_ONLY); | | INS_NO_MERGE | INS_NO_WALK_ON | INS_ABOVE_FLOOR_ONLY); |
if (two) { | | if (two) { |
| | |
avoid = 0; | | avoid = 0; |
if (!strcmp(tmp->name, "snow")) | | if (!strcmp(tmp->name, "snow")) |
avoid++; | | avoid++; |
else if (!strcmp(tmp->name, "snow2")) | | else if (!strcmp(tmp->arch->name, "snow2")) |
| | avoid++; |
| | else if (!strcmp(tmp->arch->name, "drifts")) |
| | avoid++; |
| | else if (!strcmp(tmp->arch->name, "cforest1")) |
avoid++; | | avoid++; |
else if (!strcmp(tmp->name, "drifts")) | | else if (!strcmp(tmp->arch->name, "snow4")) |
avoid++; | | avoid++; |
else if (!strcmp(tmp->name, "cforest1")) | | else if (!strcmp(tmp->arch->name, "glacier")) |
avoid++; | | avoid++; |
if (avoid) { | | if (avoid) { |
remove_ob(tmp); | | remove_ob(tmp); |
| | |
else if (!strcmp(tmp->name, "tree")) | | else if (!strcmp(tmp->name, "tree")) |
tmp = tmp->above; | | tmp = tmp->above; |
if (tmp != NULL) | | if (tmp != NULL) |
if (strcmp(tmp->name, "tree3") == 0 || | | if (strcmp(tmp->arch->name, "tree3") == 0 || |
strcmp(tmp->name, "tree5") == 0) { | | strcmp(tmp->arch->name, "tree5") == 0) { |
remove_ob(tmp); | | remove_ob(tmp); |
free_object(tmp); | | free_object(tmp); |
} | | } |