Pages:<< prev 1 next >>
Off the Edge of the Map

GroupAdministrators
Posts1,199
JoinedMar 21, 2006
Bug: Weather system allowing multiple climates on a single cell.
Danger: Low - Weather system will yield odd results.
Found by: Hanaisse
Fixed by: Kayle
---
weather.c
Find save_weathermap, fread_cell, and load_weathermap.
Replace with the following:
weather.c, do_setweather
Find:
Replace with:
In do_showweather
Replace the lines to display hemisphere and climate with:
This will fix the issue with multiple climates in the same cell.
Danger: Low - Weather system will yield odd results.
Found by: Hanaisse
Fixed by: Kayle
---
weather.c
Find save_weathermap, fread_cell, and load_weathermap.
Replace with the following:
const int weatherVersion = 1;
int version;
void save_weathermap( void )
{
int x, y;
char filename[MIL];
FILE *fp;
snprintf( filename, MIL, "%s%s", SYSTEM_DIR, WEATHER_FILE );
if( !( fp = fopen( filename, "w" ) ) )
{
bug( "%s: fopen", __FUNCTION__ );
perror( filename );
return;
}
fprintf( fp, "#VERSION %d\n\n", weatherVersion );
for ( y = 0; y < WEATHER_SIZE_Y; y++)
{
for ( x = 0; x < WEATHER_SIZE_X; x++)
{
struct WeatherCell *cell = &weatherMap[x][y];
fprintf( fp, "#CELL %d %d\n", x, y );
fprintf( fp, "Climate %s~\n", climate_names[cell->climate] );
fprintf( fp, "Hemisphere %s~\n", hemisphere_name[cell->hemisphere] );
fprintf( fp, "State %d %d %d %d %d %d %d %d\n", cell->cloudcover, cell->energy, cell->humidity,
cell->precipitation, cell->pressure, cell->temperature, cell->windSpeedX, cell->windSpeedY );
fprintf( fp, "End\n\n" );
}
}
fprintf( fp, "\n#END\n\n" );
fclose( fp );
fp = NULL;
return;
}
void fread_cell( FILE * fp, int x, int y )
{
bool fMatch = FALSE;
struct WeatherCell *cell = &weatherMap[x][y];
for( ;; )
{
const char *word = feof( fp ) ? "End" : fread_word( fp );
char flag[MAX_INPUT_LENGTH];
int value = 0;
switch ( UPPER( word[0] ) )
{
case '*':
fread_to_eol( fp );
break;
case 'C':
if( !str_cmp( word, "Climate" ) )
{
if( version >= 1 )
{
const char *climate = NULL;
climate = fread_flagstring( fp );
while( climate[0] != '\0' )
{
climate = one_argument( climate, flag );
value = get_climate( flag );
if( value < 0 || value >= MAX_CLIMATE )
bug( "Unknown climate: %s", flag );
else
cell->climate = value;
}
break;
}
else
cell->climate = fread_number( fp );
}
break;
case 'E':
if( !str_cmp( word, "End" ) )
return;
break;
case 'H':
if( !str_cmp( word, "Hemisphere" ) )
{
if( version >= 1 )
{
const char *hemisphere = NULL;
hemisphere = fread_flagstring( fp );
while( hemisphere[0] != '\0' )
{
hemisphere = one_argument( hemisphere, flag );
value = get_hemisphere( flag );
if( value < 0 || value >= HEMISPHERE_MAX )
bug( "Unknown hemisphere: %s", flag );
else
cell->hemisphere = value;
}
break;
}
else
cell->hemisphere = fread_number( fp );
}
break;
case 'S':
if( !str_cmp( word, "State" ) )
{
cell->cloudcover = fread_number( fp );
cell->energy = fread_number( fp );
cell->humidity = fread_number( fp );
cell->precipitation = fread_number( fp );
cell->pressure = fread_number( fp );
cell->temperature = fread_number( fp );
cell->windSpeedX = fread_number( fp );
cell->windSpeedY = fread_number( fp );
fMatch = TRUE;
break;
}
break;
}
if( !fMatch )
{
bug( "%s: no match for %s", __FUNCTION__, word );
fread_to_eol( fp );
}
}
}
bool load_weathermap( void )
{
FILE *fp = NULL;
char filename[256];
int x, y;
version = 0;
snprintf( filename, 256, "%s%s", SYSTEM_DIR, WEATHER_FILE );
if( !( fp = fopen( filename, "r" ) ) )
{
bug( "load_weathermap(): cannot open %s for reading", filename );
return FALSE;
}
for( ;; )
{
char letter = fread_letter( fp );
char *word;
if( letter == '*' )
{
fread_to_eol( fp );
continue;
}
if( letter != '#' )
{
bug( "%s: # not found (%c)", __FUNCTION__, letter );
return FALSE;
}
word = fread_word( fp );
if( !str_cmp( word, "VERSION" ) )
{
version = fread_number( fp );
continue;
}
if( !str_cmp( word, "CELL" ) )
{
x = fread_number( fp );
y = fread_number( fp );
fread_cell( fp, x, y );
continue;
}
else if( !str_cmp( word, "END" ) )
break;
else
{
bug( "%s: no match for %s", __FUNCTION__, word );
continue;
}
}
fclose( fp );
fp = NULL;
return TRUE;
}
weather.c, do_setweather
Find:
if( !str_cmp( arg3, "climate" ) )
{
<snip>
}
if( !str_cmp( arg3, "hemisphere" ) )
{
<snip>
}
Replace with:
if( !str_cmp( arg3, "climate" ) )
{
if( arg4[0] == '\0' )
{
send_to_char( "Usage: setweather <x> <y> climate <flag>\r\n", ch );
return;
}
value = get_climate( arg4 );
if( value < 0 || value > MAX_CLIMATE )
ch_printf( ch, "Unknown flag: %s\r\n", arg4 );
else
{
cell->climate = value;
send_to_char( "Cell Climate set.\r\n", ch );
}
return;
}
if( !str_cmp( arg3, "hemisphere" ) )
{
if( arg4[0] == '\0' )
{
send_to_char( "Usage: setweather <x> <y> hemisphere <flag>\r\n", ch );
return;
}
value = get_hemisphere( arg4 );
if( value < 0 || value > HEMISPHERE_MAX )
ch_printf( ch, "Unknown flag: %s\r\n", arg4 );
else
{
cell->hemisphere = value;
send_to_char( "Cell Hemisphere set.\r\n", ch );
}
return;
}
In do_showweather
Replace the lines to display hemisphere and climate with:
ch_printf_color( ch, "&WClimate: &w%s&D\r\n", climate_names[cell->climate] ); ch_printf_color( ch, "&WHemispere: &w%s&D\r\n", hemisphere_name[cell->hemisphere] );
This will fix the issue with multiple climates in the same cell.
Pages:<< prev 1 next >>