#define DIRS ([ \
"north" : ({ ({ 0, -1 }), ({ "|" }) }), \
"northeast" : ({ ({ 1, -1 }), ({ "/" }) }), \
"east" : ({ ({ 1, 0 }), ({ "-" }) }), \
"southeast" : ({ ({ 1, 1 }), ({ "\\" }) }), \
"south" : ({ ({ 0, 1 }), ({ "|" }) }), \
"southwest" : ({ ({ -1, 1 }), ({ "/" }) }), \
"west" : ({ ({ -1, 0 }), ({ "-" }) }), \
"northwest" : ({ ({ -1, -1 }), ({ "\\" }) }), \
])
#define PRIMES ({ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 })
inherit OBJECT_OBJ;
int *origin;
string *lines;
void setup() {
set_name( "easel" );
set_short( "small easel" );
add_adjective( "small" );
set_main_plural( "small easels" );
origin = ({ 0, 0 });
lines = ({ });
} /* setup() */
int *query_origin() { return origin; }
string *query_lines() { return lines; }
string long( string word, int dark ) {
int i, max, min, width;
string part;
if ( !sizeof( lines ) )
return "The easel is blank.\n";
width = ( (int)this_player()->query_cols() - 2 ) / 2;
min = origin[ 0 ] - width;
max = origin[ 0 ] + width;
if ( min < 0 ) {
max -= min;
min = 0;
}
if ( max >= strlen( lines[ 0 ] ) )
max = strlen( lines[ 0 ] ) - 1;
part = "";
for ( i = 0; i < sizeof( lines ); i++ )
part += " "+ lines[ i ][ min .. max ] +"\n";
return part;
} /* long() */
int query_at( int *place ) {
if ( !sizeof( lines ) )
return 32;
if ( ( origin[ 0 ] + place[ 0 ] ) < 0 )
return 32;
if ( ( origin[ 0 ] + place[ 0 ] ) >= strlen( lines[ 0 ] ) )
return 32;
if ( ( origin[ 1 ] + place[ 1 ] ) < 0 )
return 32;
if ( ( origin[ 1 ] + place[ 1 ] ) >= sizeof( lines ) )
return 32;
return lines[ origin[ 1 ] + place[ 1 ] ][ origin[ 0 ] + place[ 0 ] ];
} /* query_at() */
void add_shape( int *start, string *pieces ) {
int i, number, max, width;
string gap, front, back;
for ( i = 0; i < sizeof( pieces ); i++ )
if ( strlen( pieces[ i ] ) > max )
max = strlen( pieces[ i ] );
if ( sizeof( lines ) )
width = strlen( lines[ 0 ] );
else
lines = ({ "" });
if ( ( origin[ 0 ] + start[ 0 ] ) < 0 ) {
gap = "";
for ( i = origin[ 0 ] + start[ 0 ]; i < 0; i++ )
gap += " ";
for ( i = 0; i < sizeof( lines ); i++ )
lines[ i ] = gap + lines[ i ];
origin[ 0 ] = -start[ 0 ];
}
if ( ( origin[ 0 ] + start[ 0 ] + max ) > width ) {
gap = "";
for ( i = width; i < ( origin[ 0 ] + start[ 0 ] + max ); i++ )
gap += " ";
for ( i = 0; i < sizeof( lines ); i++ )
lines[ i ] += gap;
}
max = sizeof( pieces );
width = sizeof( lines );
if ( ( origin[ 1 ] + start[ 1 ] ) < 0 ) {
gap = "";
for ( i = 0; i < strlen( lines[ 0 ] ); i++ )
gap += " ";
for ( i = origin[ 1 ] + start[ 1 ]; i < 0; i++ )
lines = ({ gap }) + lines;
origin[ 1 ] = -start[ 1 ];
}
if ( ( origin[ 1 ] + start[ 1 ] + max ) > width ) {
gap = "";
for ( i = 0; i < strlen( lines[ 0 ] ); i++ )
gap += " ";
for ( i = width; i < ( origin[ 1 ] + start[ 1 ] + max ); i++ )
lines += ({ gap });
}
for ( i = origin[ 1 ] + start[ 1 ]; i < ( origin[ 1 ] + start[ 1 ] + max );
i++ ) {
number = origin[ 0 ] + start[ 0 ];
if ( number > 0 )
front = lines[ i ][ 0 .. number - 1 ];
else
front = "";
number = origin[ 0 ] + start[ 0 ] +
strlen( pieces[ i - origin[ 1 ] - start[ 1 ] ] );
if ( number < strlen( lines[ i ] ) )
back = lines[ i ][ number .. strlen( lines[ i ] ) - 1 ];
else
back = "";
lines[ i ] = front + pieces[ i - origin[ 1 ] - start[ 1 ] ] + back;
}
} /* add_shape() */
string *make_block( int size, int home ) {
int i, j;
string *blocks;
if ( size == 1 )
if ( home )
return ({ "@" });
else
return ({ "#" });
blocks = allocate( size );
if ( home )
blocks[ 0 ] = "@";
else
blocks[ 0 ] = "+";
for ( i = 2; i < size; i++ )
blocks[ 0 ] += "-";
if ( home )
blocks[ 0 ] += "@";
else
blocks[ 0 ] += "+";
for ( i = 2; i < size; i++ ) {
blocks[ i - 1 ] = "|";
for ( j = 2; j < size; j++ )
blocks[ i - 1 ] += ".";
blocks[ i - 1 ] += "|";
}
if ( home )
blocks[ size - 1 ] = "@";
else
blocks[ size - 1 ] = "+";
for ( i = 2; i < size; i++ )
blocks[ size - 1 ] += "-";
if ( home )
blocks[ size - 1 ] += "@";
else
blocks[ size - 1 ] += "+";
return blocks;
} /* make_block() */
void make_map( mixed *locations, mapping connections ) {
int i, j, k, x, y, *sizes;
string *places;
mapping centres;
sizes = ({ });
places = ({ });
centres = ([ ]);
for ( i = 0; i < sizeof( locations ); i+= 2 ) {
sizes += ({ locations[ i + 1 ] });
places += ({ locations[ i ] });
reset_eval_cost();
}
for ( i = 0; i < sizeof( PRIMES ); i++ ) {
x = 0;
y = 0;
for ( j = 0; j < sizeof( sizes ); j++ ) {
if ( PRIMES[ i ] > sizes[ j ] ) {
x = 1;
break;
}
if ( sizes[ j ] % PRIMES[ i ] )
y = 1;
}
if ( x )
break;
if ( !y ) {
for ( j = 0; j < sizeof( sizes ); j++ )
sizes[ j ] /= PRIMES[ i ];
i--;
}
}
reset_eval_cost();
centres[ places[ 0 ] ] = ({ 0, 0 });
for ( i = 0; i < sizeof( places ); i++ ) {
tell_object( find_player( "deutha" ), "On "+ i +", "+ places[ i ] +
", at "+ centres[ places[ i ] ][ 0 ] +", "+
centres[ places[ i ] ][ 1 ] +" for "+ sizes[ i ] +"\n" );
add_shape( ({ centres[ places[ i ] ][ 0 ] - sizes[ i ],
centres[ places[ i ] ][ 1 ] - sizes[ i ] }),
make_block( 2 * sizes[ i ] - 1, !i ) );
if ( undefinedp( connections[ places[ i ] ] ) )
continue;
for ( j = 0; j < sizeof( connections[ places[ i ] ] ); j += 2 ) {
reset_eval_cost();
add_shape( ({ centres[ places[ i ] ][ 0 ] -1 + sizes[ i ] *
DIRS[ connections[ places[ i ] ][ j ] ][ 0 ][ 0 ],
centres[ places[ i ] ][ 1 ] -1 + sizes[ i ] *
DIRS[ connections[ places[ i ] ][ j ] ][ 0 ][ 1 ] }),
DIRS[ connections[ places[ i ] ][ j ] ][ 1 ] );
k = member_array( connections[ places[ i ] ][ j + 1 ], places );
if ( k < 0 )
continue;
x = centres[ places[ i ] ][ 0 ] +
DIRS[ connections[ places[ i ] ][ j ] ][ 0 ][ 0 ] *
( sizes[ i ] + sizes[ k ] );
y = centres[ places[ i ] ][ 1 ] +
DIRS[ connections[ places[ i ] ][ j ] ][ 0 ][ 1 ] *
( sizes[ i ] + sizes[ k ] );
centres[ places[ k ] ] = ({ x, y });
tell_object( find_player( "deutha" ), "Put "+
connections[ places[ i ] ][ j + 1 ] +" at "+
x +", "+ y +"\n" );
reset_eval_cost();
}
}
} /* make_map() */