> It was a long time since I last asked about this thing. I have managed
> to get it to work, that is why I release this little snippet for all
That's ok, I'll still help you with problems if you can be specific about
them.
> you MUD-admins who wishes to have an Automap in your MUD. Only one
> problem remains, color. I cannot seem to get color on the characters
> without getting them all scattered around, making the map unreadable.
The easiest way to add color to the map would be to first add the
Easy-Color 2 patch, and then use its color codes like this:
sprintf, buf("Hi! I'm learning to use easycolor, this is &Bbright blue&n,
this is normal, this is &cdark cyan&n.\r\n", ch);
> #define MAP_WIDTH 5
> #define MAP_HEIGHT 5
> #define MAP_ROOMS (MAP_WIDTH * MAP_HEIGHT)
The reason i told you to do it this way is so you can make a dynamically
sized map(which i'm finishing up on mine right now).
(By dynamic i mean that, mortals can only see a max 12x12, immortas 30x30,
and imp's 80x24 (assumming you don't lag out first(that's a lot of data)),
and to save time and such, the game only maps what a char can see of the
map(morts only map 144 rooms, immorts map 900 rooms, etc.... It's really
cool :) )
> char map_chars[MAP_ROOMS][5];
the 5 yields enough space for the symbol and color ocde. Example(using
below symbols):
sprintf(map_chars[1], "&B%s", sector_symbols[0]);
This would yield a bright blue # going to the char.
> const char *sector_symbols[] = {
> "#",
> ":",
> "*",
...
> ".",
> "*"
> };
I'd do these like this:
const char *sector_symbols[] = {
"&Y#",
"&W:", /* Or whatever color you want to use for each of
these */
"&Y*",
...
"&y.",
"&G*"
};
> map_rnum[17] = IN_ROOM(ch);
I made a small function that returns the value of the center of the map:
(replace the dynamic size variables with static ones if you like)
#define ROUNDL(d) ((long) ((d) + ((d) > 0 ? 0.5 : -0.5)))
int wild_cr(struct char_data *ch) {
float center = (float) 0;
if ((GET_MAP_HEIGHT(ch)%2) == 0) {
center = ((float)GET_MAP_HEIGHT(ch) / (float)2);
center *= (float)GET_MAP_WIDTH(ch);
center -= ((float)GET_MAP_WIDTH(ch) / (float)2);
} else if ((GET_MAP_HEIGHT(ch)%2) == 1) {
center = ((float)GET_MAP_HEIGHT(ch) / (float)2);
center *= (float)GET_MAP_WIDTH(ch);
center = (float)(ROUNDL(center));
} else
center = (float) 0;
return (int) center;
}
> if (CAN_GO(ch, 0)) {
> map_rnum[12] = EXIT(ch, 0)->to_room;
> sprintf(map_chars[12], sector_symbols[SECT(map_rnum[12])]);
[SNIPPED LONG EXCESSIVE CODE]
why do this all the long hard way?
just pop the mapping lines in a for loop.
int order[] = {13, 8, 14, 18, 12, 9, 19, 17, 7, 3, 15, 23, 11, 4, 5, 10,
20, 25, 24, 22, 21, 16, 6, 1, 2 , -1};
int i, j;
for (i = 0; order[i] != -1, i++) {
/* map a single room, checks it's doors for surrounding rooms and set
their rnum's in the array */ // following loop from my code, remove dynamic
variables if needed
for (door = NORTH; door < NUM_OF_DIRS; door++) {
if (world[j].dir_option[door] && world[j].dir_option[door]->to_room !=
NOWHERE) {
if (!IS_SET(world[j].dir_option[door]->exit_info, EX_NOMAP)) {
if ((door == NORTH) && (r_n > 0)) {
w_map[r_n] = world[j].dir_option[door]->to_room;
} else if ((door == EAST) && (r_e%GET_MAP_WIDTH(ch))) {
w_map[r_e] = world[j].dir_option[door]->to_room;
} else if ((door == SOUTH) && (r_s <= wild_rms(ch))) {
w_map[r_s] = world[j].dir_option[door]->to_room;
} else if ((door == WEST) && (r_w%GET_MAP_WIDTH(ch))) {
w_map[r_w] = world[j].dir_option[door]->to_room;
}
}
}
}
sprintf(w_room[rm], sectors[world[j].sector_type]);
}
> &y===&rMAP&y===&n
> %s
> %s%s%s
> %s%sC%s%s
> %s%s%s
> %s
> &y=========&n\r\n\r\n",
> map_chars[11],
> map_chars[10],
> map_chars[12],
> map_chars[20],
> map_chars[15],
> map_chars[16],
> map_chars[18],
> map_chars[19],
> map_chars[24],
> map_chars[22],
> map_chars[21],
> map_chars[23]);
> send_to_char(buf, ch);
> }
i'd make this a for loop also(this is the exact code from my map.c):
/* now the routine that actually sets up the dynamic wilderness map */
*buf = '\0';
for (cnt = 1; cnt <= j; cnt++) {
sprintf(buf1,"%1s",w_room[cnt]);
strcat(buf, buf1);
if ((cnt%GET_MAP_WIDTH(ch))==0)
strcat(buf, "\r\n&n");
}
strcat(buf, "&n");
send_to_char(buf, ch);
I havea variable in there for dynamic size, but you can replace it(easy to
figure it out :) )
> What can be wrong? This is the only remaining thing to do to get this
> little snippet to work 100%.
Nothing is wrong, you just didn't provide enough space for a normal color
code defined in screen.h, you had enough for an easy-color code
>
> > Christoffer <
-Astaroth
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST