|
|
@@ -1,7 +1,7 @@
|
|
|
/******************************************************************************
|
|
|
* This file is part of TinTin++ *
|
|
|
* *
|
|
|
-* Copyright 2004-2019 Igor van den Hoven *
|
|
|
+* Copyright 2004-2020 Igor van den Hoven *
|
|
|
* *
|
|
|
* TinTin++ is free software; you can redistribute it and/or modify *
|
|
|
* it under the terms of the GNU General Public License as published by *
|
|
|
@@ -13,13 +13,12 @@
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
|
* GNU General Public License for more details. *
|
|
|
* *
|
|
|
-* *
|
|
|
* You should have received a copy of the GNU General Public License *
|
|
|
* along with TinTin++. If not, see https://www.gnu.org/licenses. *
|
|
|
******************************************************************************/
|
|
|
|
|
|
/******************************************************************************
|
|
|
-* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t *
|
|
|
+* T I N T I N + + *
|
|
|
* *
|
|
|
* coded by Igor van den Hoven 2004 *
|
|
|
******************************************************************************/
|
|
|
@@ -38,21 +37,28 @@ int map_grid_y;
|
|
|
|
|
|
extern int dir_flags(struct session *ses, int room, int dir);
|
|
|
extern void create_map(struct session *ses, char *arg);
|
|
|
-extern int create_room(struct session *ses, char *format, ...);
|
|
|
+extern struct room_data *create_room(struct session *ses, char *format, ...);
|
|
|
extern void delete_room(struct session *ses, int room, int exits);
|
|
|
extern struct exit_data *create_exit(struct session *ses, int room, char *format, ...);
|
|
|
extern void delete_exit(struct session *ses, int room, struct exit_data *exit);
|
|
|
extern void search_keywords(struct session *ses, char *arg, char *out, char *var);
|
|
|
extern void map_search_compile(struct session *ses, char *arg, char *var);
|
|
|
extern int match_room(struct session *ses, int room, struct search_data *search);
|
|
|
+extern int find_location(struct session *ses, char *arg);
|
|
|
+extern int find_path(struct session *ses, char *arg);
|
|
|
extern int find_room(struct session *ses, char *arg);
|
|
|
extern void goto_room(struct session *ses, int room);
|
|
|
extern int find_new_room(struct session *ses);
|
|
|
extern struct exit_data *find_exit(struct session *ses, int room, char *arg);
|
|
|
extern int get_exit_dir(struct session *ses, char *arg);
|
|
|
-extern int get_exit_grid(struct session *ses, int dir);
|
|
|
+extern int get_exit_length(struct session *ses, struct exit_data *exit);
|
|
|
+extern char *get_exit_color(struct session *ses, int room, struct exit_data *exit);
|
|
|
+extern int dir_to_grid(int dir);
|
|
|
+extern int revdir_to_grid(int dir);
|
|
|
extern void set_room_exits(struct session *ses, int room);
|
|
|
extern int get_room_exits(struct session *ses, int room);
|
|
|
+extern int get_terrain_index(struct session *ses, struct room_data *room, int x, int y);
|
|
|
+extern char *draw_terrain_symbol(struct session *ses, struct room_data *room, int line, int col, int x, int y, int flags);
|
|
|
extern void displaygrid_build(struct session *ses, int room, int x, int y, int z);
|
|
|
extern void add_undo(struct session *ses, char *format, ...);
|
|
|
extern void del_undo(struct session *ses, struct link_data *link);
|
|
|
@@ -65,55 +71,31 @@ extern int tunnel_void(struct session *ses, int from, int room, int dir);
|
|
|
extern int check_global(struct session *ses, int room);
|
|
|
extern int find_coord(struct session *ses, char *arg);
|
|
|
extern int spatialgrid_find(struct session *ses, int vnum, int x, int y, int z);
|
|
|
+extern void update_terrain(struct session *ses);
|
|
|
|
|
|
DO_COMMAND(do_map)
|
|
|
{
|
|
|
int cnt;
|
|
|
char arg1[BUFFER_SIZE], arg2[BUFFER_SIZE];
|
|
|
|
|
|
+ push_call("do_map(%p,%p)",ses,arg);
|
|
|
+
|
|
|
arg = get_arg_in_braces(ses, arg, arg1, GET_ONE);
|
|
|
|
|
|
if (*arg1 == 0)
|
|
|
{
|
|
|
- tintin_printf2(ses, "Available map options");
|
|
|
- tintin_printf2(ses, "");
|
|
|
- tintin_printf2(ses, "#map at <location> <command> (execute command at given location)");
|
|
|
- tintin_printf2(ses, "#map color <field> <color> (set the color for given field)");
|
|
|
- tintin_printf2(ses, "#map create [size] (creates the initial map)");
|
|
|
- tintin_printf2(ses, "#map destroy (destroys the map)");
|
|
|
- tintin_printf2(ses, "#map delete <direction> (delete the room at given dir)");
|
|
|
- tintin_printf2(ses, "#map dig <direction> [new] [vnum] (creates a new room)");
|
|
|
- tintin_printf2(ses, "#map exit <direction> <command> (sets the exit command)");
|
|
|
- tintin_printf2(ses, "#map exitflag <direction> <exit flag> (set the exit direction)");
|
|
|
- tintin_printf2(ses, "#map explore <direction> (saves path to #path)");
|
|
|
- tintin_printf2(ses, "#map info (info on map and current room)");
|
|
|
- tintin_printf2(ses, "#map insert <direction> [room flag] (insert a new room)");
|
|
|
- tintin_printf2(ses, "#map jump <x> <y> <z> (go to given coordinate)");
|
|
|
- tintin_printf2(ses, "#map find <location> [exits] (saves path to #path)");
|
|
|
- tintin_printf2(ses, "#map flag <map flag> (set map wide flags)");
|
|
|
- tintin_printf2(ses, "#map get <option> <variable> (get various values)");
|
|
|
- tintin_printf2(ses, "#map global <room vnum> (sets the global exit room)");
|
|
|
- tintin_printf2(ses, "#map goto <location> [exits] (moves you to given room)");
|
|
|
- tintin_printf2(ses, "#map leave (leave the map, return with goto)");
|
|
|
- tintin_printf2(ses, "#map legend <symbols> (sets the map legend)");
|
|
|
- tintin_printf2(ses, "#map link <direction> <room name> (links 2 rooms)");
|
|
|
- tintin_printf2(ses, "#map list <location> (shows list of matching rooms)");
|
|
|
- tintin_printf2(ses, "#map map <radius> <filename> (shows an ascii map)");
|
|
|
- tintin_printf2(ses, "#map move <direction> (move to given direction)");
|
|
|
- tintin_printf2(ses, "#map offset <square> (place vtmap in given square)");
|
|
|
- tintin_printf2(ses, "#map read <filename> (load a map from file)");
|
|
|
- tintin_printf2(ses, "#map resize <size> (resize the maximum size)");
|
|
|
- tintin_printf2(ses, "#map roomflag <room flag> (set room based flags)");
|
|
|
- tintin_printf2(ses, "#map set <option> <value> (set various values)");
|
|
|
- tintin_printf2(ses, "#map return (return to last room.)");
|
|
|
- tintin_printf2(ses, "#map run <location> [delay] (run to given room)");
|
|
|
- tintin_printf2(ses, "#map travel <direction> [delay] (run in given direction)");
|
|
|
- tintin_printf2(ses, "#map undo (undo last move)");
|
|
|
- tintin_printf2(ses, "#map uninsert <direction> (opposite of insert)");
|
|
|
- tintin_printf2(ses, "#map unlink <direction> [both] (deletes an exit)");
|
|
|
- tintin_printf2(ses, "#map vnum <low vnum> [high vnum] (change room vnum)");
|
|
|
- tintin_printf2(ses, "#map write <filename> (save the map)");
|
|
|
+ tintin_header(ses, " MAP OPTIONS ");
|
|
|
+
|
|
|
+ for (cnt = 0 ; *map_table[cnt].fun != NULL ; cnt++)
|
|
|
+ {
|
|
|
+ if (*map_table[cnt].desc)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, " [%-13s] %s", map_table[cnt].name, map_table[cnt].desc);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ tintin_header(ses, "");
|
|
|
|
|
|
+ pop_call();
|
|
|
return ses;
|
|
|
}
|
|
|
else
|
|
|
@@ -126,15 +108,18 @@ DO_COMMAND(do_map)
|
|
|
{
|
|
|
show_error(ses, LIST_COMMAND, "#MAP: This session has no map data. Use #map create or #map read to create one.");
|
|
|
|
|
|
+ pop_call();
|
|
|
return ses;
|
|
|
}
|
|
|
if (map_table[cnt].check > 1 && ses->map->room_list[ses->map->in_room] == NULL)
|
|
|
{
|
|
|
show_error(ses, LIST_COMMAND, "#MAP: You are not inside the map. Use #map goto to enter it.");
|
|
|
|
|
|
+ pop_call();
|
|
|
return ses;
|
|
|
}
|
|
|
- *arg1 = *arg2 = 0;
|
|
|
+ *arg1 = 0;
|
|
|
+ *arg2 = 0;
|
|
|
|
|
|
if (gtd->level->ignore == 0)
|
|
|
{
|
|
|
@@ -143,5904 +128,8048 @@ DO_COMMAND(do_map)
|
|
|
SET_BIT(ses->flags, SES_FLAG_UPDATEVTMAP);
|
|
|
}
|
|
|
}
|
|
|
+ pop_call();
|
|
|
|
|
|
- map_table[cnt].map (ses, arg, arg1, arg2);
|
|
|
+ push_call("MAP_%s(%p,%p,%p,%p,%p)",map_table[cnt].name,ses,arg,arg1,arg2);
|
|
|
|
|
|
+ map_table[cnt].fun (ses, arg, arg1, arg2);
|
|
|
+
|
|
|
+ pop_call();
|
|
|
return ses;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
do_map(ses, "");
|
|
|
}
|
|
|
+ pop_call();
|
|
|
return ses;
|
|
|
}
|
|
|
|
|
|
-DO_MAP(map_at)
|
|
|
-{
|
|
|
- struct exit_data *exit;
|
|
|
- int new_room;
|
|
|
+/*
|
|
|
+ Utility functions
|
|
|
+*/
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_NONE);
|
|
|
+void create_map(struct session *ses, char *arg)
|
|
|
+{
|
|
|
+ int group, legend;
|
|
|
|
|
|
- new_room = find_room(ses, arg1);
|
|
|
+ push_call("create_map(%p,%p)",ses,arg);
|
|
|
|
|
|
- if (new_room == 0)
|
|
|
+ if (ses->map)
|
|
|
{
|
|
|
- exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
-
|
|
|
- if (exit == NULL)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP AT: Couldn't find room or exit {%s}.", arg1);
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
- new_room = exit->vnum;
|
|
|
+ delete_map(ses);
|
|
|
}
|
|
|
|
|
|
- ses->map->at_room = ses->map->in_room;
|
|
|
- ses->map->in_room = new_room;
|
|
|
-
|
|
|
- script_driver(ses, LIST_COMMAND, arg2);
|
|
|
+ ses->map = (struct map_data *) calloc(1, sizeof(struct map_data));
|
|
|
+ ses->map->size = atoi(arg) > 0 ? atoi(arg) : 50000;
|
|
|
|
|
|
- if (ses->map)
|
|
|
- {
|
|
|
- ses->map->in_room = ses->map->at_room;
|
|
|
- }
|
|
|
-}
|
|
|
+ ses->map->room_list = (struct room_data **) calloc(ses->map->size, sizeof(struct room_data *));
|
|
|
|
|
|
-DO_MAP(map_center)
|
|
|
-{
|
|
|
- char arg3[BUFFER_SIZE];
|
|
|
+ ses->map->max_grid_x = 255;
|
|
|
+ ses->map->max_grid_y = 101;
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ ses->map->grid_rooms = (struct room_data **) calloc(ses->map->max_grid_x * ses->map->max_grid_y, sizeof(struct room_data *));
|
|
|
|
|
|
- if (*arg1 == 0)
|
|
|
- {
|
|
|
- ses->map->center_x = ses->map->center_y = ses->map->center_z = 0;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ ses->map->search = calloc(1, sizeof(struct search_data));
|
|
|
|
|
|
- if (!is_math(ses, arg1) || !is_math(ses, arg2) || !is_math(ses, arg3))
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP CENTER {X} {Y} {Z}");
|
|
|
+ ses->map->flags = MAP_FLAG_ASCIIGRAPHICS|MAP_FLAG_DIRECTION|MAP_FLAG_TERRAIN;
|
|
|
|
|
|
- return;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ses->map->center_x = get_number(ses, arg1);
|
|
|
- ses->map->center_y = get_number(ses, arg2);
|
|
|
- ses->map->center_z = get_number(ses, arg3);
|
|
|
+ ses->map->global_exit = (struct exit_data *) calloc(1, sizeof(struct exit_data));
|
|
|
+ ses->map->global_exit->vnum = ses->map->global_vnum;
|
|
|
+ ses->map->global_exit->name = restringf(ses->map->global_exit->name, "%cnop global", gtd->tintin_char);
|
|
|
+ ses->map->global_exit->cmd = restringf(ses->map->global_exit->cmd, "%cnop global", gtd->tintin_char);
|
|
|
+ ses->map->global_exit->data = strdup("");
|
|
|
+ ses->map->global_exit->weight = 1;
|
|
|
+ ses->map->global_exit->color = strdup("");
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP CENTER SET TO {%d} {%d} {%d}", ses->map->center_x, ses->map->center_y, ses->map->center_z);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
+ do_map(ses, "{COLOR} {RESET}");
|
|
|
|
|
|
-DO_MAP(map_color)
|
|
|
-{
|
|
|
- char buf[BUFFER_SIZE];
|
|
|
- int index;
|
|
|
+ ses->map->display_stamp = 1;
|
|
|
+ ses->map->search->stamp = 1;
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ do_map(ses, "TERRAIN {} { }");
|
|
|
+/*
|
|
|
+ do_map(ses, "TERRAIN BEACH <eea>~");
|
|
|
+ do_map(ses, "TERRAIN CITY <ebf>-");
|
|
|
+ do_map(ses, "TERRAIN DESERT <ffa>.");
|
|
|
+ do_map(ses, "TERRAIN FIELD <228>.");
|
|
|
+ do_map(ses, "TERRAIN FOREST <128>^");
|
|
|
+ do_map(ses, "TERRAIN HILL <ddd>^");
|
|
|
+ do_map(ses, "TERRAIN LAKE <248>~");
|
|
|
+ do_map(ses, "TERRAIN MOUNTAIN <acf>^");
|
|
|
+ do_map(ses, "TERRAIN OCEAN <148>@");
|
|
|
+ do_map(ses, "TERRAIN SWAMP <bda>.");
|
|
|
+ do_map(ses, "TERRAIN UNDERGROUND <baa>-");
|
|
|
+*/
|
|
|
|
|
|
- if (*arg1)
|
|
|
- {
|
|
|
- if (!strcasecmp(arg1, "RESET"))
|
|
|
- {
|
|
|
- for (index = 0 ; map_color_table[index].name ; index++)
|
|
|
- {
|
|
|
- strncpy(ses->map->color[index], map_color_table[index].code, COLOR_SIZE - 1);
|
|
|
- }
|
|
|
+ create_room(ses, "%s", "{1} {0} {} {} { } {} {} {} {} {} {1.0} {}");
|
|
|
|
|
|
- return;
|
|
|
- }
|
|
|
+ strcpy(arg, "");
|
|
|
|
|
|
- for (index = 0 ; map_color_table[index].name ; index++)
|
|
|
+ for (group = 0 ; map_group_table[group].name ; group++)
|
|
|
+ {
|
|
|
+ for (legend = 0 ; map_legend_table[legend].group ; legend++)
|
|
|
{
|
|
|
- if (is_abbrev(arg1, map_color_table[index].name))
|
|
|
+ if (*map_group_table[group].group == 0 || is_abbrev(map_group_table[group].group, map_legend_table[legend].group))
|
|
|
{
|
|
|
- if (is_abbrev(arg2, "RESET"))
|
|
|
- {
|
|
|
- strncpy(ses->map->color[index], map_color_table[index].code, COLOR_SIZE - 1);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strncpy(ses->map->color[index], arg2, COLOR_SIZE - 1);
|
|
|
- }
|
|
|
- get_color_names(ses, ses->map->color[index], buf);
|
|
|
-
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP COLOR %s%10s\e[0m SET TO {%s}", buf, map_color_table[index].name, ses->map->color[index]);
|
|
|
-
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (map_color_table[index].name == NULL)
|
|
|
+ if (map_legend_table[legend].group)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP COLOR {AVOID|BACKGROUND|EXIT|HIDE|INVIS|PATH|ROOM|USER} {COLOR CODE}");
|
|
|
-
|
|
|
- return;
|
|
|
+ map_group_table[group].start = legend;
|
|
|
}
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: %s color set to: %s", arg1, arg2);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- for (index = 0 ; map_color_table[index].name ; index++)
|
|
|
+ else
|
|
|
{
|
|
|
- get_color_names(ses, ses->map->color[index], buf);
|
|
|
+ show_error(ses, LIST_COMMAND, "create_map: unknown legend group: %s, %s", map_group_table[group].name, map_group_table[group].group);
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP COLOR %s%10s\e[0m SET TO {%s}", buf, map_color_table[index].name, ses->map->color[index]);
|
|
|
+ continue;
|
|
|
}
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-DO_MAP(map_create)
|
|
|
-{
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
-
|
|
|
- create_map(ses, arg1);
|
|
|
-
|
|
|
- tintin_printf2(ses, "#MAP: %d room map created, use #map goto 1, to proceed", ses->map->size);
|
|
|
-}
|
|
|
-
|
|
|
-DO_MAP(map_debug)
|
|
|
-{
|
|
|
- tintin_printf2(ses, "max spatial grid x: %d", ses->map->max_grid_x);
|
|
|
- tintin_printf2(ses, "max spatial grid y: %d", ses->map->max_grid_y);
|
|
|
- tintin_printf2(ses, " max undo size: %d", ses->map->undo_size);
|
|
|
- tintin_printf2(ses, " in room: %d", ses->map->in_room);
|
|
|
- tintin_printf2(ses, " at room: %d", ses->map->at_room);
|
|
|
- tintin_printf2(ses, " last room: %d", ses->map->last_room);
|
|
|
- tintin_printf2(ses, " stamp: %d", ses->map->search->stamp);
|
|
|
- tintin_printf2(ses, " length: %f", ses->map->room_list[ses->map->in_room]->length);
|
|
|
- tintin_printf2(ses, " nofollow: %d", ses->map->nofollow);
|
|
|
-
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
- if (*arg1)
|
|
|
- {
|
|
|
- if (is_abbrev(arg1, "undo"))
|
|
|
+ while (map_legend_table[++legend].group)
|
|
|
{
|
|
|
- struct link_data *link;
|
|
|
-
|
|
|
- for (link = ses->map->undo_head ; link ; link = link->next)
|
|
|
+ if (*map_group_table[group].group && !is_abbrev(map_group_table[group].group, map_legend_table[legend].group))
|
|
|
{
|
|
|
- tintin_printf2(ses, "%05s %05s %s", link->str1, link->str2, link->str3);
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
+ map_group_table[group].end = legend;
|
|
|
}
|
|
|
+
|
|
|
+ gtd->level->quiet++;
|
|
|
+ do_map(ses, "LEGEND RESET");
|
|
|
+ gtd->level->quiet--;
|
|
|
+
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
-DO_MAP(map_delete)
|
|
|
+int delete_map(struct session *ses)
|
|
|
{
|
|
|
- int room;
|
|
|
- struct exit_data *exit;
|
|
|
-
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ int index, cnt;
|
|
|
|
|
|
- if (is_number(arg1))
|
|
|
+ for (index = cnt = 0 ; index < ses->map->size ; index++)
|
|
|
{
|
|
|
- room = find_room(ses, arg1);
|
|
|
-
|
|
|
- if (room == 0)
|
|
|
+ if (ses->map->room_list[index])
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP DELETE {%s} - No room with that vnum found", arg1);
|
|
|
+ cnt++;
|
|
|
|
|
|
- return;
|
|
|
+ delete_room(ses, index, FALSE);
|
|
|
}
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+ free(ses->map->room_list);
|
|
|
|
|
|
- if (exit)
|
|
|
- {
|
|
|
- room = exit->vnum;
|
|
|
- }
|
|
|
+ while (ses->map->undo_head)
|
|
|
+ {
|
|
|
+ del_undo(ses, ses->map->undo_head);
|
|
|
+ }
|
|
|
|
|
|
- if (exit == NULL)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: No exit with that name found");
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
+ free(ses->map->global_exit->name);
|
|
|
+ free(ses->map->global_exit->cmd);
|
|
|
+ free(ses->map->global_exit->data);
|
|
|
+ free(ses->map->global_exit);
|
|
|
|
|
|
- room = exit->vnum;
|
|
|
- }
|
|
|
+ free(ses->map);
|
|
|
|
|
|
- if (room == ses->map->in_room)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: You must first leave the room you're trying to delete");
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
+ ses->map = NULL;
|
|
|
|
|
|
- delete_room(ses, room, TRUE);
|
|
|
+ kill_list(ses->list[LIST_LANDMARK]);
|
|
|
+ kill_list(ses->list[LIST_TERRAIN]);
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Room {%d} deleted", room);
|
|
|
+ return cnt;
|
|
|
}
|
|
|
|
|
|
-DO_MAP(map_destroy)
|
|
|
+struct room_data *create_room(struct session *ses, char *format, ...)
|
|
|
{
|
|
|
- struct exit_data *exit;
|
|
|
- int index, cnt;
|
|
|
+ char *arg, buf[BUFFER_SIZE];
|
|
|
+ struct room_data *newroom;
|
|
|
+ va_list args;
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ va_start(args, format);
|
|
|
+ vsprintf(buf, format, args);
|
|
|
+ va_end(args);
|
|
|
|
|
|
- if (is_abbrev(arg1, "AREA"))
|
|
|
- {
|
|
|
- if (*arg2 == 0)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP DESTROY AREA {<AREA NAME>}");
|
|
|
+ newroom = (struct room_data *) calloc(1, sizeof(struct room_data));
|
|
|
|
|
|
- return;
|
|
|
- }
|
|
|
+ arg = buf;
|
|
|
|
|
|
- if (ses->map->room_list[ses->map->in_room] && !strcmp(arg2, ses->map->room_list[ses->map->in_room]->area))
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP DESTROY AREA: YOU MUST FIRST LEAVE THE AREA YOU ARE TRYING TO DESTROY.");
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->vnum = atoi(buf);
|
|
|
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_SYNC) && ses->map->room_list[newroom->vnum] != NULL)
|
|
|
+ {
|
|
|
+ int vnum = newroom->vnum;
|
|
|
|
|
|
- for (index = cnt = 0 ; index < ses->map->size ; index++)
|
|
|
- {
|
|
|
- if (ses->map->room_list[index])
|
|
|
- {
|
|
|
- if (!strcmp(arg2, ses->map->room_list[index]->area))
|
|
|
- {
|
|
|
- cnt++;
|
|
|
+ free(newroom);
|
|
|
|
|
|
- delete_room(ses, index, FALSE);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ return ses->map->room_list[vnum];
|
|
|
+ }
|
|
|
|
|
|
- for (index = 0 ; index < ses->map->size ; index++)
|
|
|
- {
|
|
|
- if (ses->map->room_list[index])
|
|
|
- {
|
|
|
- for (exit = ses->map->room_list[index]->f_exit ; exit ; exit = exit->next)
|
|
|
- {
|
|
|
- if (ses->map->room_list[exit->vnum] == NULL)
|
|
|
- {
|
|
|
- delete_exit(ses, index, exit);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->flags = atoi(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->color = strdup(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->name = strdup(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->symbol = strdup(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->desc = strdup(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->area = strdup(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->note = strdup(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->terrain = strdup(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->data = strdup(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->weight = atof(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->id = strdup(buf);
|
|
|
|
|
|
- if (ses->map->room_list[index]->f_exit)
|
|
|
- {
|
|
|
- exit = ses->map->room_list[index]->f_exit;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP DESTROY AREA: DELETED %d ROOMS.", cnt);
|
|
|
+ if (HAS_BIT(newroom->flags, ROOM_FLAG_AVOID))
|
|
|
+ {
|
|
|
+ SET_BIT(newroom->flags, ROOM_FLAG_AVOID_TMP);
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "WORLD"))
|
|
|
+ if (HAS_BIT(newroom->flags, ROOM_FLAG_HIDE))
|
|
|
{
|
|
|
- cnt = delete_map(ses);
|
|
|
+ SET_BIT(newroom->flags, ROOM_FLAG_HIDE_TMP);
|
|
|
+ }
|
|
|
+ if (HAS_BIT(newroom->flags, ROOM_FLAG_LEAVE))
|
|
|
+ {
|
|
|
+ SET_BIT(newroom->flags, ROOM_FLAG_LEAVE_TMP);
|
|
|
+ }
|
|
|
+ if (HAS_BIT(newroom->flags, ROOM_FLAG_VOID))
|
|
|
+ {
|
|
|
+ SET_BIT(newroom->flags, ROOM_FLAG_VOID_TMP);
|
|
|
+ }
|
|
|
+ if (HAS_BIT(newroom->flags, ROOM_FLAG_CURVED))
|
|
|
+ {
|
|
|
+ SET_BIT(newroom->flags, ROOM_FLAG_CURVED_TMP);
|
|
|
+ }
|
|
|
|
|
|
- tintin_printf2(ses, "#MAP DESTROY WORLD: DELETED %d ROOMS.", cnt);
|
|
|
+ if (newroom->weight <= 0)
|
|
|
+ {
|
|
|
+ newroom->weight = 1;
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (newroom->vnum)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP DESTROY {AREA|WORLD} {<ARGUMENT>}");
|
|
|
+ ses->map->room_list[newroom->vnum] = newroom;
|
|
|
}
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP CREATE ROOM %5d {%s}.", newroom->vnum, newroom->name);
|
|
|
+
|
|
|
+ return newroom;
|
|
|
}
|
|
|
|
|
|
-DO_MAP(map_dig)
|
|
|
+void delete_room(struct session *ses, int room, int exits)
|
|
|
{
|
|
|
- char arg3[BUFFER_SIZE];
|
|
|
- int room;
|
|
|
- struct exit_data *exit;
|
|
|
- struct listnode *node;
|
|
|
-
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ struct exit_data *exit, *exit_next;
|
|
|
+ int cnt;
|
|
|
|
|
|
- if (*arg1 == 0)
|
|
|
+ while (ses->map->room_list[room]->f_exit)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP DIG {<DIRECTION>|<VNUM>} {<LOCATION>|NEW}");
|
|
|
-
|
|
|
- return;
|
|
|
+ delete_exit(ses, room, ses->map->room_list[room]->f_exit);
|
|
|
}
|
|
|
|
|
|
- room = atoi(arg1);
|
|
|
+ free(ses->map->room_list[room]->area);
|
|
|
+ free(ses->map->room_list[room]->color);
|
|
|
+ free(ses->map->room_list[room]->id);
|
|
|
+ free(ses->map->room_list[room]->name);
|
|
|
+ free(ses->map->room_list[room]->symbol);
|
|
|
+ free(ses->map->room_list[room]->desc);
|
|
|
+ free(ses->map->room_list[room]->note);
|
|
|
+ free(ses->map->room_list[room]->terrain);
|
|
|
+ free(ses->map->room_list[room]->data);
|
|
|
|
|
|
- if (room > 0 && room < ses->map->size)
|
|
|
+ free(ses->map->room_list[room]);
|
|
|
+
|
|
|
+ ses->map->room_list[room] = NULL;
|
|
|
+
|
|
|
+ if (exits)
|
|
|
{
|
|
|
- if (ses->map->room_list[room] == NULL)
|
|
|
+ for (cnt = 0 ; cnt < ses->map->size ; cnt++)
|
|
|
{
|
|
|
- add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_CREATE);
|
|
|
+ if (ses->map->room_list[cnt])
|
|
|
+ {
|
|
|
+ for (exit = ses->map->room_list[cnt]->f_exit ; exit ; exit = exit_next)
|
|
|
+ {
|
|
|
+ exit_next = exit->next;
|
|
|
|
|
|
- create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {}", room);
|
|
|
+ if (exit->vnum == room)
|
|
|
+ {
|
|
|
+ delete_exit(ses, cnt, exit);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
- exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+}
|
|
|
|
|
|
- if (exit)
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP DIG: There is already a room in that direction.");
|
|
|
- return;
|
|
|
- }
|
|
|
+struct exit_data *create_exit(struct session *ses, int vnum, char *format, ...)
|
|
|
+{
|
|
|
+ struct exit_data *newexit;
|
|
|
+ struct room_data *room;
|
|
|
+ va_list args;
|
|
|
+ char *arg, buf[BUFFER_SIZE];
|
|
|
|
|
|
- if (*arg2 && strcasecmp(arg2, "new"))
|
|
|
- {
|
|
|
- if (is_number(arg2))
|
|
|
- {
|
|
|
- room = get_number(ses, arg2);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- room = find_room(ses, arg2);
|
|
|
- }
|
|
|
+ push_call("create_exit(%p,%d,%p)",ses,vnum,format);
|
|
|
|
|
|
- if (room == 0 && !strcasecmp(arg3, "new"))
|
|
|
- {
|
|
|
- room = find_new_room(ses);
|
|
|
- }
|
|
|
+ va_start(args, format);
|
|
|
+ vsprintf(buf, format, args);
|
|
|
+ va_end(args);
|
|
|
|
|
|
- if (room <= 0 || room >= ses->map->size)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP DIG {%s}: Couldn't find room {%s}.", arg1, arg2);
|
|
|
+ newexit = (struct exit_data *) calloc(1, sizeof(struct exit_data));
|
|
|
|
|
|
- return;
|
|
|
- }
|
|
|
+ room = ses->map->room_list[vnum];
|
|
|
|
|
|
- if (ses->map->room_list[room] == NULL)
|
|
|
- {
|
|
|
- add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_CREATE|MAP_UNDO_LINK);
|
|
|
+ arg = buf;
|
|
|
|
|
|
- create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {%s}", room, ses->map->search->id ? ses->map->search->id : "");
|
|
|
- create_exit(ses, ses->map->in_room, "{%d} {%s} {%s}", room, arg1, arg1);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_LINK);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newexit->vnum = atoi(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE);
|
|
|
|
|
|
- create_exit(ses, ses->map->in_room, "{%d} {%s} {%s}", room, arg1, arg1);
|
|
|
- }
|
|
|
- return;
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_SYNC) && find_exit(ses, vnum, buf))
|
|
|
+ {
|
|
|
+ free(newexit);
|
|
|
+
|
|
|
+ return find_exit(ses, vnum, buf);
|
|
|
}
|
|
|
+ newexit->name = strdup(buf);
|
|
|
|
|
|
- room = find_coord(ses, arg1);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ALL); newexit->cmd = strdup(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newexit->dir = atoi(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newexit->flags = atoi(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ALL); newexit->data = strdup(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newexit->weight = atof(buf);
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newexit->color = strdup(buf);
|
|
|
|
|
|
- if (room && strcasecmp(arg2, "new"))
|
|
|
+ if (newexit->dir == 0)
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP CREATE LINK %5d {%s}.", room, ses->map->room_list[room]->name);
|
|
|
-
|
|
|
- add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_LINK);
|
|
|
-
|
|
|
- create_exit(ses, ses->map->in_room, "{%d} {%s} {%s}", room, arg1, arg1);
|
|
|
+ newexit->dir = get_exit_dir(ses, newexit->name);
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- for (room = 1 ; room < ses->map->size ; room++)
|
|
|
- {
|
|
|
- if (ses->map->room_list[room] == NULL)
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- if (room == ses->map->size)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP DIG: Maximum amount of rooms of %d reached.", ses->map->size);
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
- add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_CREATE|MAP_UNDO_LINK);
|
|
|
+ newexit->grid = dir_to_grid(newexit->dir);
|
|
|
|
|
|
- create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {}", room);
|
|
|
- create_exit(ses, ses->map->in_room, "{%d} {%s} {%s}", room, arg1, arg1);
|
|
|
+ if (room->exit_grid[newexit->grid] == NULL)
|
|
|
+ {
|
|
|
+ room->exit_grid[newexit->grid] = newexit;
|
|
|
}
|
|
|
|
|
|
- if ((node = search_node_list(ses->list[LIST_PATHDIR], arg1)) != NULL)
|
|
|
+ if (newexit->weight <= 0)
|
|
|
{
|
|
|
- if (find_exit(ses, room, node->arg2) == NULL)
|
|
|
- {
|
|
|
- create_exit(ses, room, "{%d} {%s} {%s}", ses->map->in_room, node->arg2, node->arg2);
|
|
|
- }
|
|
|
+ newexit->weight = 1;
|
|
|
}
|
|
|
+
|
|
|
+ LINK(newexit, room->f_exit, room->l_exit);
|
|
|
+
|
|
|
+ room->exit_size++;
|
|
|
+
|
|
|
+ SET_BIT(room->exit_dirs, (1LL << newexit->dir));
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP CREATE EXIT {%s} {%s} TO ROOM %d.", newexit->name, newexit->cmd, newexit->vnum);
|
|
|
+
|
|
|
+ pop_call();
|
|
|
+ return newexit;
|
|
|
}
|
|
|
|
|
|
-DO_MAP(map_exit)
|
|
|
+void delete_exit(struct session *ses, int room, struct exit_data *exit)
|
|
|
{
|
|
|
- char arg3[BUFFER_SIZE];
|
|
|
- struct exit_data *exit;
|
|
|
- int room, dir;
|
|
|
+ free(exit->name);
|
|
|
+ free(exit->cmd);
|
|
|
+ free(exit->data);
|
|
|
+ free(exit->color);
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ UNLINK(exit, ses->map->room_list[room]->f_exit, ses->map->room_list[room]->l_exit)
|
|
|
|
|
|
- exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+ set_room_exits(ses, room);
|
|
|
|
|
|
- if (exit == NULL)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: Exit {%s} not found.", arg1);
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
+ free(exit);
|
|
|
+}
|
|
|
|
|
|
- if (*arg2 == 0)
|
|
|
+int get_exit_dir(struct session *ses, char *arg)
|
|
|
+{
|
|
|
+ struct listnode *node;
|
|
|
+
|
|
|
+ node = search_node_list(ses->list[LIST_PATHDIR], arg);
|
|
|
+
|
|
|
+ if (node)
|
|
|
{
|
|
|
- tintin_printf2(ses, " command: %s", exit->cmd);
|
|
|
- tintin_printf2(ses, "direction: %d", exit->dir);
|
|
|
- tintin_printf2(ses, " flags: %d", exit->flags);
|
|
|
- tintin_printf2(ses, " get/set: %s", exit->data);
|
|
|
- tintin_printf2(ses, " name: %s", exit->name);
|
|
|
- tintin_printf2(ses, " vnum: %d", exit->vnum);
|
|
|
- tintin_printf2(ses, " weight: %.3f", exit->weight);
|
|
|
+ return atoi(node->arg3);
|
|
|
}
|
|
|
- else if (is_abbrev(arg2, "COMMAND"))
|
|
|
+ else
|
|
|
{
|
|
|
- RESTRING(exit->cmd, arg3);
|
|
|
-
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP EXIT {%s} : COMMAND SET TO {%s}.", arg1, exit->cmd);
|
|
|
+ return 0;
|
|
|
}
|
|
|
- else if (is_abbrev(arg2, "DIRECTION"))
|
|
|
+}
|
|
|
+
|
|
|
+int get_exit_length(struct session *ses, struct exit_data *exit)
|
|
|
+{
|
|
|
+ return (int) exit->weight + ses->map->room_list[exit->vnum]->length;
|
|
|
+}
|
|
|
+
|
|
|
+char *get_exit_color(struct session *ses, int room, struct exit_data *exit)
|
|
|
+{
|
|
|
+ push_call("get_exit_color(%p,%d,%p)",ses,room,exit);
|
|
|
+
|
|
|
+ if (exit)
|
|
|
{
|
|
|
- if (is_math(ses, arg3))
|
|
|
- {
|
|
|
- dir = (int) get_number(ses, arg3);
|
|
|
- }
|
|
|
- else if ((dir = get_exit_dir(ses, arg3)) == 0)
|
|
|
+ if (*exit->color)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP EXIT {%s} : DIRECTION {%s} NOT FOUND.", arg1, arg3);
|
|
|
-
|
|
|
- return;
|
|
|
+ pop_call();
|
|
|
+ return exit->color;
|
|
|
}
|
|
|
|
|
|
- exit->dir = dir;
|
|
|
-
|
|
|
- set_room_exits(ses, ses->map->in_room);
|
|
|
+ if (room)
|
|
|
+ {
|
|
|
+ struct exit_data *rev_exit = ses->map->room_list[exit->vnum]->exit_grid[revdir_to_grid(exit->dir)];
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP EXIT {%s} : DIRECTION {%s} SET TO {%d}.", arg1, arg3, dir);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg2, "FLAGS"))
|
|
|
- {
|
|
|
- exit->flags = (int) get_number(ses, arg3);
|
|
|
+ if (rev_exit && rev_exit->vnum == room)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[exit->vnum]->length < ses->map->room_list[rev_exit->vnum]->length)
|
|
|
+ {
|
|
|
+ exit = rev_exit;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP EXIT {%s} : FLAGS SET TO {%d}.", arg1, exit->flags);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg2, "GET"))
|
|
|
- {
|
|
|
- if (*arg3)
|
|
|
+ if (HAS_BIT(exit->flags, EXIT_FLAG_AVOID) && *ses->map->color[MAP_COLOR_AVOID])
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg3, "%s", exit->data);
|
|
|
+ pop_call();
|
|
|
+ return ses->map->color[MAP_COLOR_AVOID];
|
|
|
}
|
|
|
- else
|
|
|
+ if (HAS_BIT(exit->flags, EXIT_FLAG_BLOCK) && *ses->map->color[MAP_COLOR_BLOCK])
|
|
|
{
|
|
|
- tintin_printf2(ses, "#MAP EXIT GET: No destination variable.");
|
|
|
+ pop_call();
|
|
|
+ return ses->map->color[MAP_COLOR_BLOCK];
|
|
|
}
|
|
|
- }
|
|
|
- else if (is_abbrev(arg2, "NAME"))
|
|
|
- {
|
|
|
- RESTRING(exit->name, arg3);
|
|
|
-
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP EXIT {%s} : NAME SET TO {%s}.", arg1, exit->name);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg2, "SAVE"))
|
|
|
- {
|
|
|
- if (*arg3)
|
|
|
+ if (HAS_BIT(exit->flags, EXIT_FLAG_HIDE) && *ses->map->color[MAP_COLOR_HIDE])
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg3, "{command}{%s}{destination}{%d}{dir}{%d}{flags}{%d}{name}{%s}{vnum}{%d}{weight}{%.3f}", exit->cmd, tunnel_void(ses, ses->map->in_room, exit->vnum, exit->dir), exit->dir, exit->flags, exit->name, exit->vnum, exit->weight);
|
|
|
+ pop_call();
|
|
|
+ return ses->map->color[MAP_COLOR_HIDE];
|
|
|
}
|
|
|
- else
|
|
|
+ if (HAS_BIT(exit->flags, EXIT_FLAG_INVIS) && *ses->map->color[MAP_COLOR_INVIS])
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP EXIT SAVE: No destination variable.");
|
|
|
+ pop_call();
|
|
|
+ return ses->map->color[MAP_COLOR_INVIS];
|
|
|
}
|
|
|
+ pop_call();
|
|
|
+ return ses->map->color[MAP_COLOR_EXIT];
|
|
|
}
|
|
|
- else if (is_abbrev(arg2, "SET"))
|
|
|
+ else
|
|
|
{
|
|
|
- RESTRING(exit->data, arg3);
|
|
|
+ pop_call();
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP EXIT {%s} : DATA SET TO {%s}.", arg1, exit->data);
|
|
|
+int revdir_to_grid(int dir)
|
|
|
+{
|
|
|
+ switch (dir)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ return EXIT_GRID_0;
|
|
|
+ case MAP_EXIT_N:
|
|
|
+ return EXIT_GRID_S;
|
|
|
+ case MAP_EXIT_E:
|
|
|
+ return EXIT_GRID_W;
|
|
|
+ case MAP_EXIT_S:
|
|
|
+ return EXIT_GRID_N;
|
|
|
+ case MAP_EXIT_W:
|
|
|
+ return EXIT_GRID_E;
|
|
|
+ case MAP_EXIT_N|MAP_EXIT_E:
|
|
|
+ return EXIT_GRID_SW;
|
|
|
+ case MAP_EXIT_N|MAP_EXIT_W:
|
|
|
+ return EXIT_GRID_SE;
|
|
|
+ case MAP_EXIT_S|MAP_EXIT_E:
|
|
|
+ return EXIT_GRID_NW;
|
|
|
+ case MAP_EXIT_S|MAP_EXIT_W:
|
|
|
+ return EXIT_GRID_NE;
|
|
|
}
|
|
|
- else if (is_abbrev(arg2, "VNUM"))
|
|
|
+
|
|
|
+ if (HAS_BIT(dir, MAP_EXIT_D))
|
|
|
{
|
|
|
- room = atoi(arg3);
|
|
|
+ return EXIT_GRID_U;
|
|
|
+ }
|
|
|
|
|
|
- if (room <= 0 || room >= ses->map->size)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP EXIT VNUM: Invalid room vnum: %d.", room);
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (HAS_BIT(dir, MAP_EXIT_U))
|
|
|
+ {
|
|
|
+ return EXIT_GRID_D;
|
|
|
+ }
|
|
|
|
|
|
- if (ses->map->room_list[room] == NULL)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP EXIT VNUM: Non existant room vnum: %d.", room);
|
|
|
- return;
|
|
|
- }
|
|
|
- exit->vnum = room;
|
|
|
+ return EXIT_GRID_0;
|
|
|
+}
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP EXIT {%s} : VNUM SET TO {%s}.", arg1, arg3);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg2, "WEIGHT"))
|
|
|
+int dir_to_grid(int dir)
|
|
|
+{
|
|
|
+ switch (dir)
|
|
|
{
|
|
|
- if (get_number(ses, arg3) < 0.001)
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP EXIT {%s} : WEIGHT SHOULD BE AT LEAST 0.001", arg1);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- exit->weight = (float) get_number(ses, arg3);
|
|
|
+ case 0:
|
|
|
+ return EXIT_GRID_0;
|
|
|
+ case MAP_EXIT_N:
|
|
|
+ return EXIT_GRID_N;
|
|
|
+ case MAP_EXIT_E:
|
|
|
+ return EXIT_GRID_E;
|
|
|
+ case MAP_EXIT_S:
|
|
|
+ return EXIT_GRID_S;
|
|
|
+ case MAP_EXIT_W:
|
|
|
+ return EXIT_GRID_W;
|
|
|
+ case MAP_EXIT_N|MAP_EXIT_E:
|
|
|
+ return EXIT_GRID_NE;
|
|
|
+ case MAP_EXIT_N|MAP_EXIT_W:
|
|
|
+ return EXIT_GRID_NW;
|
|
|
+ case MAP_EXIT_S|MAP_EXIT_E:
|
|
|
+ return EXIT_GRID_SE;
|
|
|
+ case MAP_EXIT_S|MAP_EXIT_W:
|
|
|
+ return EXIT_GRID_SW;
|
|
|
+ }
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP EXIT {%s} : WEIGHT SET TO {%.3f}", arg1, exit->weight);
|
|
|
- }
|
|
|
+ if (HAS_BIT(dir, MAP_EXIT_D))
|
|
|
+ {
|
|
|
+ return EXIT_GRID_D;
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (HAS_BIT(dir, MAP_EXIT_U))
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "Syntax: #MAP EXIT {<NAME>} {COMMAND|DIRECTION|GET|NAME|FLAGS|SAVE|SET|VNUM|WEIGHT} {<argument>}");
|
|
|
+ return EXIT_GRID_U;
|
|
|
}
|
|
|
+
|
|
|
+ return EXIT_GRID_0;
|
|
|
}
|
|
|
|
|
|
-DO_MAP(map_exitflag)
|
|
|
+int get_room_exits(struct session *ses, int room)
|
|
|
+{
|
|
|
+ return ses->map->room_list[room]->exit_size;
|
|
|
+}
|
|
|
+
|
|
|
+void set_room_exits(struct session *ses, int vnum)
|
|
|
{
|
|
|
struct exit_data *exit;
|
|
|
- char arg3[BUFFER_SIZE];
|
|
|
- int flag;
|
|
|
+ struct room_data *room;
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ room = ses->map->room_list[vnum];
|
|
|
|
|
|
- exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+ room->exit_dirs = 0;
|
|
|
+ room->exit_size = 0;
|
|
|
|
|
|
- if (exit == NULL)
|
|
|
+ memset(room->exit_grid, 0, sizeof(room->exit_grid));
|
|
|
+
|
|
|
+ for (exit = room->f_exit ; exit ; exit = exit->next)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP EXITFLAG: EXIT {%s} NOT FOUND.", arg1);
|
|
|
+ SET_BIT(room->exit_dirs, 1LL << exit->dir);
|
|
|
|
|
|
- return;
|
|
|
+ if (room->exit_grid[exit->grid] == NULL)
|
|
|
+ {
|
|
|
+ room->exit_grid[exit->grid] = exit;
|
|
|
+ }
|
|
|
+ room->exit_size++;
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- if (*arg2 == 0)
|
|
|
- {
|
|
|
- tintin_printf2(ses, "#MAP: AVOID FLAG IS SET TO: %s.", HAS_BIT(exit->flags, EXIT_FLAG_AVOID) ? "ON" : "OFF");
|
|
|
- tintin_printf2(ses, "#MAP: HIDE FLAG IS SET TO: %s.", HAS_BIT(exit->flags, EXIT_FLAG_HIDE) ? "ON" : "OFF");
|
|
|
- tintin_printf2(ses, "#MAP: INVIS FLAG IS SET TO: %s.", HAS_BIT(exit->flags, EXIT_FLAG_INVIS) ? "ON" : "OFF");
|
|
|
+int get_terrain_index(struct session *ses, struct room_data *room, int x, int y)
|
|
|
+{
|
|
|
+ struct listroot *root = ses->list[LIST_TERRAIN];
|
|
|
+ struct room_data *wide_grid[11], *vast_grid[11];
|
|
|
+ int terrain;
|
|
|
|
|
|
- return;
|
|
|
+ if (room)
|
|
|
+ {
|
|
|
+ return room->terrain_index;
|
|
|
}
|
|
|
|
|
|
- if (is_abbrev(arg2, "AVOID"))
|
|
|
+ wide_grid[EXIT_GRID_N] = ses->map->grid_rooms[x + map_grid_x * (y + 1)];
|
|
|
+ wide_grid[EXIT_GRID_NE] = ses->map->grid_rooms[x + 1 + map_grid_x * (y + 1)];
|
|
|
+ wide_grid[EXIT_GRID_E] = ses->map->grid_rooms[x + 1 + map_grid_x * (y )];
|
|
|
+ wide_grid[EXIT_GRID_SE] = ses->map->grid_rooms[x + 1 + map_grid_x * (y - 1)];
|
|
|
+ wide_grid[EXIT_GRID_S] = ses->map->grid_rooms[x + map_grid_x * (y - 1)];
|
|
|
+ wide_grid[EXIT_GRID_SW] = ses->map->grid_rooms[x - 1 + map_grid_x * (y - 1)];
|
|
|
+ wide_grid[EXIT_GRID_W] = ses->map->grid_rooms[x - 1 + map_grid_x * (y )];
|
|
|
+ wide_grid[EXIT_GRID_NW] = ses->map->grid_rooms[x - 1 + map_grid_x * (y + 1)];
|
|
|
+
|
|
|
+ if (wide_grid[EXIT_GRID_N] && wide_grid[EXIT_GRID_N]->terrain_index != -1 && wide_grid[EXIT_GRID_N]->vnum && HAS_BIT(root->list[wide_grid[EXIT_GRID_N]->terrain_index]->room->terrain_flags, TERRAIN_FLAG_WIDE))
|
|
|
{
|
|
|
- flag = EXIT_FLAG_AVOID;
|
|
|
+ terrain = wide_grid[EXIT_GRID_N]->terrain_index;
|
|
|
+
|
|
|
+ if ((wide_grid[EXIT_GRID_E] == NULL || wide_grid[EXIT_GRID_E]->terrain_index == terrain) && (wide_grid[EXIT_GRID_S] == NULL || wide_grid[EXIT_GRID_S]->terrain_index == terrain) && (wide_grid[EXIT_GRID_W] == NULL || wide_grid[EXIT_GRID_W]->terrain_index == terrain))
|
|
|
+ {
|
|
|
+ return wide_grid[EXIT_GRID_N]->terrain_index;
|
|
|
+ }
|
|
|
}
|
|
|
- else if (is_abbrev(arg2, "HIDE"))
|
|
|
+
|
|
|
+ if (wide_grid[EXIT_GRID_E] && wide_grid[EXIT_GRID_E]->terrain_index != -1 && wide_grid[EXIT_GRID_E]->vnum && HAS_BIT(root->list[wide_grid[EXIT_GRID_E]->terrain_index]->room->terrain_flags, TERRAIN_FLAG_WIDE))
|
|
|
{
|
|
|
- flag = EXIT_FLAG_HIDE;
|
|
|
+ terrain = wide_grid[EXIT_GRID_E]->terrain_index;
|
|
|
+
|
|
|
+ if ((wide_grid[EXIT_GRID_S] == NULL || wide_grid[EXIT_GRID_S]->terrain_index == terrain) && (wide_grid[EXIT_GRID_W] == NULL || wide_grid[EXIT_GRID_W]->terrain_index == terrain) && (wide_grid[EXIT_GRID_N] == NULL || wide_grid[EXIT_GRID_N]->terrain_index == terrain))
|
|
|
+ {
|
|
|
+ return wide_grid[EXIT_GRID_E]->terrain_index;
|
|
|
+ }
|
|
|
}
|
|
|
- else if (is_abbrev(arg2, "INVISIBLE"))
|
|
|
+
|
|
|
+ if (wide_grid[EXIT_GRID_S] && wide_grid[EXIT_GRID_S]->terrain_index != -1 && wide_grid[EXIT_GRID_S]->vnum && HAS_BIT(root->list[wide_grid[EXIT_GRID_S]->terrain_index]->room->terrain_flags, TERRAIN_FLAG_WIDE))
|
|
|
{
|
|
|
- flag = EXIT_FLAG_INVIS;
|
|
|
+ terrain = wide_grid[EXIT_GRID_S]->terrain_index;
|
|
|
+
|
|
|
+ if ((wide_grid[EXIT_GRID_W] == NULL || wide_grid[EXIT_GRID_W]->terrain_index == terrain) && (wide_grid[EXIT_GRID_N] == NULL || wide_grid[EXIT_GRID_N]->terrain_index == terrain) && (wide_grid[EXIT_GRID_E] == NULL || wide_grid[EXIT_GRID_E]->terrain_index == terrain))
|
|
|
+ {
|
|
|
+ return wide_grid[EXIT_GRID_S]->terrain_index;
|
|
|
+ }
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (wide_grid[EXIT_GRID_W] && wide_grid[EXIT_GRID_W]->terrain_index != -1 && wide_grid[EXIT_GRID_W]->vnum && HAS_BIT(root->list[wide_grid[EXIT_GRID_W]->terrain_index]->room->terrain_flags, TERRAIN_FLAG_WIDE))
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP EXITFLAG {%s} <AVOID|HIDE|INVIS> [ON|OFF]", arg1);
|
|
|
+ terrain = wide_grid[EXIT_GRID_W]->terrain_index;
|
|
|
|
|
|
- return;
|
|
|
+ if ((wide_grid[EXIT_GRID_N] == NULL || wide_grid[EXIT_GRID_N]->terrain_index == terrain) && (wide_grid[EXIT_GRID_E] == NULL || wide_grid[EXIT_GRID_E]->terrain_index == terrain) && (wide_grid[EXIT_GRID_S] == NULL || wide_grid[EXIT_GRID_S]->terrain_index == terrain))
|
|
|
+ {
|
|
|
+ return wide_grid[EXIT_GRID_W]->terrain_index;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- if (*arg3 == 0)
|
|
|
+ if (x < 2 || y < 2 || x > map_grid_x - 3 || y > map_grid_y - 3)
|
|
|
{
|
|
|
- TOG_BIT(exit->flags, flag);
|
|
|
+ return -1;
|
|
|
}
|
|
|
- else if (is_abbrev(arg3, "ON"))
|
|
|
+
|
|
|
+ vast_grid[EXIT_GRID_N] = ses->map->grid_rooms[x + map_grid_x * (y + 2)];
|
|
|
+ vast_grid[EXIT_GRID_NE] = ses->map->grid_rooms[x + 2 + map_grid_x * (y + 2)];
|
|
|
+ vast_grid[EXIT_GRID_E] = ses->map->grid_rooms[x + 2 + map_grid_x * (y )];
|
|
|
+ vast_grid[EXIT_GRID_SE] = ses->map->grid_rooms[x + 2 + map_grid_x * (y - 2)];
|
|
|
+ vast_grid[EXIT_GRID_S] = ses->map->grid_rooms[x + map_grid_x * (y - 2)];
|
|
|
+ vast_grid[EXIT_GRID_SW] = ses->map->grid_rooms[x - 2 + map_grid_x * (y - 2)];
|
|
|
+ vast_grid[EXIT_GRID_W] = ses->map->grid_rooms[x - 2 + map_grid_x * (y )];
|
|
|
+ vast_grid[EXIT_GRID_NW] = ses->map->grid_rooms[x - 2 + map_grid_x * (y + 2)];
|
|
|
+
|
|
|
+ if (vast_grid[EXIT_GRID_N] && vast_grid[EXIT_GRID_N]->terrain_index != -1 && vast_grid[EXIT_GRID_N]->vnum && HAS_BIT(root->list[vast_grid[EXIT_GRID_N]->terrain_index]->room->terrain_flags, TERRAIN_FLAG_VAST))
|
|
|
{
|
|
|
- SET_BIT(exit->flags, flag);
|
|
|
+ terrain = vast_grid[EXIT_GRID_N]->terrain_index;
|
|
|
+
|
|
|
+ if ((wide_grid[EXIT_GRID_E] == NULL || wide_grid[EXIT_GRID_E]->terrain_index == terrain) && (wide_grid[EXIT_GRID_S] == NULL || wide_grid[EXIT_GRID_S]->terrain_index == terrain) && (wide_grid[EXIT_GRID_W] == NULL || wide_grid[EXIT_GRID_W]->terrain_index == terrain))
|
|
|
+ {
|
|
|
+ return vast_grid[EXIT_GRID_N]->terrain_index;
|
|
|
+ }
|
|
|
}
|
|
|
- else if (is_abbrev(arg3, "OFF"))
|
|
|
+
|
|
|
+ if (vast_grid[EXIT_GRID_E] && vast_grid[EXIT_GRID_E]->terrain_index != -1 && vast_grid[EXIT_GRID_E]->vnum && HAS_BIT(root->list[vast_grid[EXIT_GRID_E]->terrain_index]->room->terrain_flags, TERRAIN_FLAG_VAST))
|
|
|
{
|
|
|
- DEL_BIT(exit->flags, flag);
|
|
|
+ terrain = vast_grid[EXIT_GRID_E]->terrain_index;
|
|
|
+
|
|
|
+ if ((wide_grid[EXIT_GRID_S] == NULL || wide_grid[EXIT_GRID_S]->terrain_index == terrain) && (wide_grid[EXIT_GRID_W] == NULL || wide_grid[EXIT_GRID_W]->terrain_index == terrain) && (wide_grid[EXIT_GRID_N] == NULL || wide_grid[EXIT_GRID_N]->terrain_index == terrain))
|
|
|
+ {
|
|
|
+ return vast_grid[EXIT_GRID_E]->terrain_index;
|
|
|
+ }
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (vast_grid[EXIT_GRID_S] && vast_grid[EXIT_GRID_S]->terrain_index != -1 && vast_grid[EXIT_GRID_S]->vnum && HAS_BIT(root->list[vast_grid[EXIT_GRID_S]->terrain_index]->room->terrain_flags, TERRAIN_FLAG_VAST))
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP EXITFLAG {%s} {%s} [ON|OFF]", arg3);
|
|
|
+ terrain = vast_grid[EXIT_GRID_S]->terrain_index;
|
|
|
+
|
|
|
+ if ((wide_grid[EXIT_GRID_W] == NULL || wide_grid[EXIT_GRID_W]->terrain_index == terrain) && (wide_grid[EXIT_GRID_N] == NULL || wide_grid[EXIT_GRID_N]->terrain_index == terrain) && (wide_grid[EXIT_GRID_E] == NULL || wide_grid[EXIT_GRID_E]->terrain_index == terrain))
|
|
|
+ {
|
|
|
+ return vast_grid[EXIT_GRID_S]->terrain_index;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- if (is_abbrev(arg2, "AVOID"))
|
|
|
+ if (vast_grid[EXIT_GRID_W] && vast_grid[EXIT_GRID_W]->terrain_index != -1 && vast_grid[EXIT_GRID_W]->vnum && HAS_BIT(root->list[vast_grid[EXIT_GRID_W]->terrain_index]->room->terrain_flags, TERRAIN_FLAG_VAST))
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: AVOID FLAG SET TO %s.", HAS_BIT(exit->flags, EXIT_FLAG_AVOID) ? "ON" : "OFF");
|
|
|
+ terrain = vast_grid[EXIT_GRID_W]->terrain_index;
|
|
|
+
|
|
|
+ if ((wide_grid[EXIT_GRID_N] == NULL || wide_grid[EXIT_GRID_N]->terrain_index == terrain) && (wide_grid[EXIT_GRID_E] == NULL || wide_grid[EXIT_GRID_E]->terrain_index == terrain) && (wide_grid[EXIT_GRID_S] == NULL || wide_grid[EXIT_GRID_S]->terrain_index == terrain))
|
|
|
+ {
|
|
|
+ return vast_grid[EXIT_GRID_W]->terrain_index;
|
|
|
+ }
|
|
|
}
|
|
|
- else if (is_abbrev(arg2, "HIDE"))
|
|
|
+
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+int get_terrain_density(struct room_data *room, int width)
|
|
|
+{
|
|
|
+ int flag = 0;
|
|
|
+
|
|
|
+ switch (width)
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: HIDE FLAG SET TO %s.", HAS_BIT(exit->flags, EXIT_FLAG_HIDE) ? "ON" : "OFF");
|
|
|
+ case 0:
|
|
|
+ if (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_FADEIN))
|
|
|
+ {
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_DENSE|TERRAIN_FLAG_AMPLE|TERRAIN_FLAG_SPARSE|TERRAIN_FLAG_SCANT))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_DENSE:
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_NARROW|TERRAIN_FLAG_STANDARD|TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_NARROW:
|
|
|
+ flag = TERRAIN_FLAG_DENSE;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_STANDARD:
|
|
|
+ flag = TERRAIN_FLAG_AMPLE;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_WIDE:
|
|
|
+ flag = TERRAIN_FLAG_SPARSE;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_AMPLE:
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_NARROW|TERRAIN_FLAG_STANDARD|TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_NARROW:
|
|
|
+ flag = TERRAIN_FLAG_AMPLE;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_STANDARD:
|
|
|
+ flag = TERRAIN_FLAG_SPARSE;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_WIDE:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_SPARSE:
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_NARROW|TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_NARROW:
|
|
|
+ flag = TERRAIN_FLAG_SPARSE;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_STANDARD:
|
|
|
+ case TERRAIN_FLAG_WIDE:
|
|
|
+ case TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_SCANT:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_FADEOUT))
|
|
|
+ {
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_DENSE|TERRAIN_FLAG_AMPLE|TERRAIN_FLAG_SPARSE|TERRAIN_FLAG_SCANT))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_DENSE:
|
|
|
+ flag = TERRAIN_FLAG_DENSE;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_AMPLE:
|
|
|
+ flag = TERRAIN_FLAG_AMPLE;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_SPARSE:
|
|
|
+ flag = TERRAIN_FLAG_SPARSE;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_SCANT:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ flag = room->terrain_flags;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 1:
|
|
|
+ if (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_FADEIN))
|
|
|
+ {
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_DENSE|TERRAIN_FLAG_SPARSE|TERRAIN_FLAG_SCANT))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_DENSE:
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_NARROW|TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_NARROW:
|
|
|
+ case TERRAIN_FLAG_STANDARD:
|
|
|
+ flag = TERRAIN_FLAG_DENSE;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_WIDE:
|
|
|
+ flag = TERRAIN_FLAG_AMPLE;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST:
|
|
|
+ flag = TERRAIN_FLAG_SPARSE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_AMPLE:
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_NARROW|TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_NARROW:
|
|
|
+ case TERRAIN_FLAG_STANDARD:
|
|
|
+ flag = TERRAIN_FLAG_AMPLE;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_WIDE:
|
|
|
+ flag = TERRAIN_FLAG_SPARSE;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_SPARSE:
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_NARROW|TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_NARROW:
|
|
|
+ case TERRAIN_FLAG_STANDARD:
|
|
|
+ case TERRAIN_FLAG_WIDE:
|
|
|
+ flag = TERRAIN_FLAG_SPARSE;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_SCANT:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_FADEOUT))
|
|
|
+ {
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_DENSE|TERRAIN_FLAG_SPARSE|TERRAIN_FLAG_SCANT))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_DENSE:
|
|
|
+ flag = TERRAIN_FLAG_AMPLE;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_AMPLE:
|
|
|
+ flag = TERRAIN_FLAG_SPARSE;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_SPARSE:
|
|
|
+ case TERRAIN_FLAG_SCANT:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ flag = room->terrain_flags;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 2:
|
|
|
+ if (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_FADEIN))
|
|
|
+ {
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_DENSE|TERRAIN_FLAG_SPARSE|TERRAIN_FLAG_SCANT))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_DENSE:
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_NARROW|TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_NARROW:
|
|
|
+ case TERRAIN_FLAG_STANDARD:
|
|
|
+ case TERRAIN_FLAG_WIDE:
|
|
|
+ flag = TERRAIN_FLAG_DENSE;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST:
|
|
|
+ flag = TERRAIN_FLAG_AMPLE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_AMPLE:
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_NARROW|TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_NARROW:
|
|
|
+ case TERRAIN_FLAG_STANDARD:
|
|
|
+ case TERRAIN_FLAG_WIDE:
|
|
|
+ flag = TERRAIN_FLAG_AMPLE;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST:
|
|
|
+ flag = TERRAIN_FLAG_SPARSE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_SPARSE:
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_NARROW|TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_NARROW:
|
|
|
+ case TERRAIN_FLAG_STANDARD:
|
|
|
+ case TERRAIN_FLAG_WIDE:
|
|
|
+ flag = TERRAIN_FLAG_SPARSE;
|
|
|
+ break;
|
|
|
+ case TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_SCANT:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_FADEOUT))
|
|
|
+ {
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_DENSE|TERRAIN_FLAG_SPARSE|TERRAIN_FLAG_SCANT))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_DENSE:
|
|
|
+ flag = TERRAIN_FLAG_SPARSE;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ flag = room->terrain_flags;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ if (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_FADEIN))
|
|
|
+ {
|
|
|
+ switch (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_DENSE|TERRAIN_FLAG_SPARSE|TERRAIN_FLAG_SCANT))
|
|
|
+ {
|
|
|
+ case TERRAIN_FLAG_DENSE:
|
|
|
+ flag = TERRAIN_FLAG_DENSE;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ flag = 0;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_SPARSE:
|
|
|
+ flag = TERRAIN_FLAG_SPARSE;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TERRAIN_FLAG_SCANT:
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_FADEOUT))
|
|
|
+ {
|
|
|
+ flag = TERRAIN_FLAG_SCANT;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ flag = room->terrain_flags;
|
|
|
+ }
|
|
|
+ break;
|
|
|
}
|
|
|
- else if (is_abbrev(arg2, "INVISIBLE"))
|
|
|
+
|
|
|
+ if (HAS_BIT(room->terrain_flags, TERRAIN_FLAG_DOUBLE))
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: INVIS FLAG SET TO %s.", HAS_BIT(exit->flags, EXIT_FLAG_INVIS) ? "ON" : "OFF");
|
|
|
+ SET_BIT(flag, TERRAIN_FLAG_DOUBLE);
|
|
|
}
|
|
|
+ return flag;
|
|
|
}
|
|
|
|
|
|
-DO_MAP(map_explore)
|
|
|
+char *blank_terrain_symbol(struct session *ses, struct room_data *room, int index, int flags)
|
|
|
{
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
-
|
|
|
- explore_path(ses, FALSE, arg1, "");
|
|
|
-}
|
|
|
+ if (HAS_BIT(flags, TERRAIN_FLAG_DOUBLE))
|
|
|
+ {
|
|
|
+ if (room && room->terrain_index != -1 && HAS_BIT(ses->list[LIST_TERRAIN]->list[room->terrain_index]->room->terrain_flags, TERRAIN_FLAG_DOUBLE))
|
|
|
+ {
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
+ {
|
|
|
+ if (index % 2 == 1)
|
|
|
+ {
|
|
|
+ SET_BIT(ses->map->flags, MAP_FLAG_DOUBLED);
|
|
|
|
|
|
-DO_MAP(map_find)
|
|
|
-{
|
|
|
- shortest_path(ses, FALSE, arg1, arg);
|
|
|
+ return " ";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEL_BIT(ses->map->flags, MAP_FLAG_DOUBLED);
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS))
|
|
|
+ {
|
|
|
+ switch (index)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ case 3:
|
|
|
+ SET_BIT(ses->map->flags, MAP_FLAG_DOUBLED);
|
|
|
+ return " ";
|
|
|
+ case 2:
|
|
|
+ case 4:
|
|
|
+ DEL_BIT(ses->map->flags, MAP_FLAG_DOUBLED);
|
|
|
+ return "";
|
|
|
+ case 5:
|
|
|
+ return "\e[1;31m5";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+// DEL_BIT(ses->map->flags, MAP_FLAG_DOUBLED);
|
|
|
+ return " ";
|
|
|
+ }
|
|
|
+ return " ";
|
|
|
}
|
|
|
|
|
|
-DO_MAP(map_flag)
|
|
|
+char *draw_terrain_symbol(struct session *ses, struct room_data *room, int line, int index, int x, int y, int flags)
|
|
|
{
|
|
|
- int flag = 0, unflag = 0;
|
|
|
+ struct room_data *room_grid[11], *terrain_room;
|
|
|
+ int terrain, width = 0, density, hash;
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ if (!HAS_BIT(ses->map->flags, MAP_FLAG_TERRAIN))
|
|
|
+ {
|
|
|
+ return " ";
|
|
|
+ }
|
|
|
|
|
|
- if (*arg1)
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_DOUBLED))
|
|
|
{
|
|
|
- if (is_abbrev(arg1, "static"))
|
|
|
+ DEL_BIT(ses->map->flags, MAP_FLAG_DOUBLED);
|
|
|
+
|
|
|
+ if (HAS_BIT(flags, TERRAIN_FLAG_DOUBLE) && index != 1)
|
|
|
{
|
|
|
- flag = MAP_FLAG_STATIC;
|
|
|
+ return "";
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "vtmap"))
|
|
|
+// return "\e[1;31m?";
|
|
|
+ }
|
|
|
+
|
|
|
+ room_grid[EXIT_GRID_0] = ses->map->grid_rooms[x + map_grid_x * (y )];
|
|
|
+ room_grid[EXIT_GRID_N] = ses->map->grid_rooms[x + map_grid_x * (y + 1)];
|
|
|
+ room_grid[EXIT_GRID_NE] = ses->map->grid_rooms[x + 1 + map_grid_x * (y + 1)];
|
|
|
+ room_grid[EXIT_GRID_E] = ses->map->grid_rooms[x + 1 + map_grid_x * (y )];
|
|
|
+ room_grid[EXIT_GRID_SE] = ses->map->grid_rooms[x + 1 + map_grid_x * (y - 1)];
|
|
|
+ room_grid[EXIT_GRID_S] = ses->map->grid_rooms[x + map_grid_x * (y - 1)];
|
|
|
+ room_grid[EXIT_GRID_SW] = ses->map->grid_rooms[x - 1 + map_grid_x * (y - 1)];
|
|
|
+ room_grid[EXIT_GRID_W] = ses->map->grid_rooms[x - 1 + map_grid_x * (y )];
|
|
|
+ room_grid[EXIT_GRID_NW] = ses->map->grid_rooms[x - 1 + map_grid_x * (y + 1)];
|
|
|
+
|
|
|
+ hash = index + (room && room->vnum ? room->vnum : x + y);
|
|
|
+
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
+ {
|
|
|
+ if (room == NULL)
|
|
|
{
|
|
|
- flag = MAP_FLAG_VTMAP;
|
|
|
+ width++;
|
|
|
+
|
|
|
+ switch (line)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ switch (index)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ case 2:
|
|
|
+ room = room_grid[EXIT_GRID_N] ? room_grid[EXIT_GRID_N] : room_grid[EXIT_GRID_W] ? room_grid[EXIT_GRID_W] : room_grid[EXIT_GRID_NW] ? room_grid[EXIT_GRID_NW] : NULL;
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ case 4:
|
|
|
+ room = room_grid[EXIT_GRID_N] ? room_grid[EXIT_GRID_N] : NULL;
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ case 6:
|
|
|
+ room = room_grid[EXIT_GRID_N] ? room_grid[EXIT_GRID_N] : room_grid[EXIT_GRID_E] ? room_grid[EXIT_GRID_E] : room_grid[EXIT_GRID_NE] ? room_grid[EXIT_GRID_NE] : NULL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 2:
|
|
|
+ switch (index)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ case 2:
|
|
|
+ room = room_grid[EXIT_GRID_W] ? room_grid[EXIT_GRID_W] : room_grid[EXIT_GRID_NW] ? room_grid[EXIT_GRID_NW] : room_grid[EXIT_GRID_SW] ? room_grid[EXIT_GRID_SW] : NULL;
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ case 4:
|
|
|
+ room = room_grid[EXIT_GRID_N] ? room_grid[EXIT_GRID_N] : room_grid[EXIT_GRID_S] ? room_grid[EXIT_GRID_S] : NULL;
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ case 6:
|
|
|
+ room = room_grid[EXIT_GRID_E] ? room_grid[EXIT_GRID_E] : room_grid[EXIT_GRID_NE] ? room_grid[EXIT_GRID_NE] : room_grid[EXIT_GRID_SE] ? room_grid[EXIT_GRID_SE] : NULL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 3:
|
|
|
+ switch (index)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ case 2:
|
|
|
+ room = room_grid[EXIT_GRID_S] ? room_grid[EXIT_GRID_S] : room_grid[EXIT_GRID_W] ? room_grid[EXIT_GRID_W] : room_grid[EXIT_GRID_SW] ? room_grid[EXIT_GRID_SW] : NULL;
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ case 4:
|
|
|
+ room = room_grid[EXIT_GRID_S] ? room_grid[EXIT_GRID_S] : NULL;
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ case 6:
|
|
|
+ room = room_grid[EXIT_GRID_S] ? room_grid[EXIT_GRID_S] : room_grid[EXIT_GRID_E] ? room_grid[EXIT_GRID_E] : room_grid[EXIT_GRID_SE] ? room_grid[EXIT_GRID_SE] : NULL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room == NULL || room->terrain_index == -1 || HAS_BIT(ses->list[LIST_TERRAIN]->list[room->terrain_index]->room->terrain_flags, TERRAIN_FLAG_NARROW))
|
|
|
+ {
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "asciigraphics"))
|
|
|
+
|
|
|
+ terrain = room->terrain_index;
|
|
|
+
|
|
|
+ if (terrain == -1)
|
|
|
{
|
|
|
- flag = MAP_FLAG_ASCIIGRAPHICS;
|
|
|
- unflag = MAP_FLAG_MUDFONT|MAP_FLAG_UNICODEGRAPHICS|MAP_FLAG_BLOCKGRAPHICS;
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "asciivnums"))
|
|
|
+
|
|
|
+ terrain_room = ses->list[LIST_TERRAIN]->list[terrain]->room;
|
|
|
+
|
|
|
+ if (HAS_BIT(ses->list[LIST_TERRAIN]->list[room->terrain_index]->room->terrain_flags, TERRAIN_FLAG_DOUBLE))
|
|
|
{
|
|
|
- flag = MAP_FLAG_ASCIIVNUMS;
|
|
|
+ if (HAS_BIT(flags, TERRAIN_FLAG_DOUBLE))
|
|
|
+ {
|
|
|
+ if (index % 2 == 0)
|
|
|
+ {
|
|
|
+ return "\e[1;36m?";
|
|
|
+ }
|
|
|
+ SET_BIT(ses->map->flags, MAP_FLAG_DOUBLED);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return " ";
|
|
|
+ }
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "blockgraphics"))
|
|
|
+
|
|
|
+ if (HAS_BIT(terrain_room->terrain_flags, TERRAIN_FLAG_NARROW) && room->exit_grid[EXIT_GRID_E] == NULL)
|
|
|
{
|
|
|
- flag = MAP_FLAG_BLOCKGRAPHICS;
|
|
|
- unflag = MAP_FLAG_MUDFONT|MAP_FLAG_UNICODEGRAPHICS|MAP_FLAG_ASCIIGRAPHICS;
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 16:
|
|
|
+ case 26:
|
|
|
+ case 36:
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "direction"))
|
|
|
+
|
|
|
+ if (room->vnum == 0)
|
|
|
{
|
|
|
- flag = MAP_FLAG_DIRECTION;
|
|
|
+ width++;
|
|
|
+
|
|
|
+ density = 0;
|
|
|
+
|
|
|
+ density += (room_grid[EXIT_GRID_N] && room_grid[EXIT_GRID_N]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_NE] && room_grid[EXIT_GRID_NE]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_E] && room_grid[EXIT_GRID_E]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_SE] && room_grid[EXIT_GRID_SE]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_S] && room_grid[EXIT_GRID_S]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_SW] && room_grid[EXIT_GRID_SW]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_W] && room_grid[EXIT_GRID_W]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_NW] && room_grid[EXIT_GRID_NW]->vnum);
|
|
|
+
|
|
|
+ if (density == 0)
|
|
|
+ {
|
|
|
+ width++;
|
|
|
+ }
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "mudfont"))
|
|
|
+
|
|
|
+ density = get_terrain_density(terrain_room, width);
|
|
|
+
|
|
|
+ if (HAS_BIT(density, TERRAIN_FLAG_DENSE))
|
|
|
{
|
|
|
- flag = MAP_FLAG_MUDFONT;
|
|
|
- unflag = MAP_FLAG_ASCIIGRAPHICS|MAP_FLAG_UNICODEGRAPHICS|MAP_FLAG_BLOCKGRAPHICS;
|
|
|
+ return ses->list[LIST_TERRAIN]->list[terrain]->arg2;
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "nofollow"))
|
|
|
+
|
|
|
+ if (HAS_BIT(density, TERRAIN_FLAG_SPARSE))
|
|
|
{
|
|
|
- flag = MAP_FLAG_NOFOLLOW;
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 11:
|
|
|
+ case 23:
|
|
|
+ case 35:
|
|
|
+ return ses->list[LIST_TERRAIN]->list[terrain]->arg2;
|
|
|
+ }
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "simplegraphics"))
|
|
|
+
|
|
|
+ if (HAS_BIT(density, TERRAIN_FLAG_SCANT))
|
|
|
{
|
|
|
- unflag = MAP_FLAG_ASCIIVNUMS|MAP_FLAG_SYMBOLGRAPHICS|MAP_FLAG_MUDFONT|MAP_FLAG_ASCIIGRAPHICS|MAP_FLAG_UNICODEGRAPHICS|MAP_FLAG_BLOCKGRAPHICS;
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 11:
|
|
|
+ return hash % 3 == 0 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ case 23:
|
|
|
+ return hash % 3 == 1 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ case 35:
|
|
|
+ return hash % 3 == 2 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "symbolgraphics"))
|
|
|
+
|
|
|
+ if (HAS_BIT(density, TERRAIN_FLAG_DOUBLE))
|
|
|
{
|
|
|
- flag = MAP_FLAG_SYMBOLGRAPHICS;
|
|
|
- unflag = MAP_FLAG_ASCIIGRAPHICS|MAP_FLAG_UNICODEGRAPHICS|MAP_FLAG_BLOCKGRAPHICS;
|
|
|
+ switch (y % 2 * 30 + line * 10 + index)
|
|
|
+ {
|
|
|
+ case 11:
|
|
|
+ case 15:
|
|
|
+ case 23:
|
|
|
+ case 31:
|
|
|
+ case 35:
|
|
|
+ case 43:
|
|
|
+ case 51:
|
|
|
+ case 55:
|
|
|
+ case 63:
|
|
|
+ return ses->list[LIST_TERRAIN]->list[terrain]->arg2;
|
|
|
+ }
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "unicodegraphics"))
|
|
|
+
|
|
|
+ switch (y % 2 * 30 + line * 10 + index)
|
|
|
{
|
|
|
- flag = MAP_FLAG_UNICODEGRAPHICS;
|
|
|
- unflag = MAP_FLAG_ASCIIGRAPHICS|MAP_FLAG_MUDFONT|MAP_FLAG_BLOCKGRAPHICS;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: Invalid flag {%s}.", arg1);
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tintin_printf2(ses, "#MAP: AsciiGraphics flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS) ? "ON" : "OFF");
|
|
|
- tintin_printf2(ses, "#MAP: AsciiVnums flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS) ? "ON" : "OFF");
|
|
|
- tintin_printf2(ses, "#MAP: BlockGraphics flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS) ? "ON" : "OFF");
|
|
|
- tintin_printf2(ses, "#MAP: Direction flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_DIRECTION) ? "ON" : "OFF");
|
|
|
- tintin_printf2(ses, "#MAP: MudFont flag is set to %s", HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT) ? "ON" : "OFF");
|
|
|
- tintin_printf2(ses, "#MAP: NoFollow flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW) ? "ON" : "OFF");
|
|
|
- tintin_printf2(ses, "#MAP: SimpleGraphics flag is set to %s.", !HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS|MAP_FLAG_SYMBOLGRAPHICS|MAP_FLAG_MUDFONT|MAP_FLAG_ASCIIGRAPHICS|MAP_FLAG_UNICODEGRAPHICS|MAP_FLAG_BLOCKGRAPHICS) ? "ON" : "OFF");
|
|
|
- tintin_printf2(ses, "#MAP: Static flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_STATIC) ? "ON" : "OFF");
|
|
|
- tintin_printf2(ses, "#MAP: SymbolGraphics flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_SYMBOLGRAPHICS) ? "ON" : "OFF");
|
|
|
- tintin_printf2(ses, "#MAP: UnicodeGraphics flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS) ? "ON" : "OFF");
|
|
|
- tintin_printf2(ses, "#MAP: VTmap flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP) ? "ON" : "OFF");
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
+ case 11:
|
|
|
+ case 13:
|
|
|
+ case 15:
|
|
|
+ case 22:
|
|
|
+ case 24:
|
|
|
+ case 26:
|
|
|
+ case 31:
|
|
|
+ case 33:
|
|
|
+ case 35:
|
|
|
+ case 42:
|
|
|
+ case 44:
|
|
|
+ case 46:
|
|
|
+ case 51:
|
|
|
+ case 53:
|
|
|
+ case 55:
|
|
|
+ case 62:
|
|
|
+ case 64:
|
|
|
+ case 66:
|
|
|
+ return ses->list[LIST_TERRAIN]->list[terrain]->arg2;
|
|
|
+ }
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+
|
|
|
+ // UNICODE
|
|
|
|
|
|
- if (is_abbrev(arg2, "ON"))
|
|
|
- {
|
|
|
- SET_BIT(ses->map->flags, flag);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg2, "OFF"))
|
|
|
- {
|
|
|
- DEL_BIT(ses->map->flags, flag);
|
|
|
- }
|
|
|
- else
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS))
|
|
|
{
|
|
|
- TOG_BIT(ses->map->flags, flag);
|
|
|
- }
|
|
|
+ if (room == NULL)
|
|
|
+ {
|
|
|
+ width++;
|
|
|
|
|
|
- if (unflag)
|
|
|
- {
|
|
|
- DEL_BIT(ses->map->flags, unflag);
|
|
|
- }
|
|
|
+ switch (line)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ switch (index)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ case 2:
|
|
|
+ room = room_grid[EXIT_GRID_W] ? room_grid[EXIT_GRID_W] : room_grid[EXIT_GRID_NW] ? room_grid[EXIT_GRID_NW] : NULL;
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ case 4:
|
|
|
+ room = room_grid[EXIT_GRID_N] ? room_grid[EXIT_GRID_N] : NULL;
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ room = room_grid[EXIT_GRID_N] ? room_grid[EXIT_GRID_N] : NULL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
|
|
|
- if (is_abbrev(arg1, "asciigraphics"))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: AsciiGraphics flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS) ? "ON" : "OFF");
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "asciivnums"))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: AsciiVnums flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS) ? "ON" : "OFF");
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "direction"))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Direction flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_DIRECTION) ? "ON" : "OFF");
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "mudfont"))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: MudFont flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT) ? "ON" : "OFF");
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "nofollow"))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: NoFollow flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW) ? "ON" : "OFF");
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "static"))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Static flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_STATIC) ? "ON" : "OFF");
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "simplegraphics"))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: All graphic modes have been disabled.");
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "symbolgraphics"))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: SymbolGraphics flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_SYMBOLGRAPHICS) ? "ON" : "OFF");
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "unicodegraphics"))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: UnicodeGraphics flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS) ? "ON" : "OFF");
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "vtmap"))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: VTmap flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP) ? "ON" : "OFF");
|
|
|
- }
|
|
|
+ case 2:
|
|
|
+ switch (index)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ case 2:
|
|
|
+ room = room_grid[EXIT_GRID_W] ? room_grid[EXIT_GRID_W] : NULL;
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ case 4:
|
|
|
+ if (room_grid[EXIT_GRID_S])
|
|
|
+ {
|
|
|
+ room = room_grid[EXIT_GRID_S];
|
|
|
+ }
|
|
|
+ else if (room_grid[EXIT_GRID_N])
|
|
|
+ {
|
|
|
+ room = room_grid[EXIT_GRID_N];
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ room = room_grid[EXIT_GRID_S] ? room_grid[EXIT_GRID_S] : NULL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
+ if (room == NULL || room->terrain_index == -1)
|
|
|
+ {
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
|
|
|
-}
|
|
|
+ if (HAS_BIT(ses->list[LIST_TERRAIN]->list[room->terrain_index]->room->terrain_flags, TERRAIN_FLAG_NARROW))
|
|
|
+ {
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 23:
|
|
|
+ case 24:
|
|
|
+ case 25:
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
|
|
|
-DO_MAP(map_get)
|
|
|
-{
|
|
|
- struct room_data *room = ses->map->room_list[ses->map->in_room];
|
|
|
- struct exit_data *exit;
|
|
|
- char exits[BUFFER_SIZE], arg3[BUFFER_SIZE];
|
|
|
+ if (room_grid[EXIT_GRID_N] == NULL)
|
|
|
+ {
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 13:
|
|
|
+ case 14:
|
|
|
+ case 15:
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ if (room_grid[EXIT_GRID_W] == NULL && room_grid[EXIT_GRID_NW] == NULL)
|
|
|
+ {
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 11:
|
|
|
+ case 12:
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (*arg3)
|
|
|
- {
|
|
|
- if (atoi(arg3) > 0 && atoi(arg3) < ses->map->size)
|
|
|
- {
|
|
|
- room = ses->map->room_list[atoi(arg3)];
|
|
|
+ if (room_grid[EXIT_GRID_W] == NULL)
|
|
|
+ {
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 21:
|
|
|
+ case 22:
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- room = NULL;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (room == NULL)
|
|
|
- {
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "0");
|
|
|
- }
|
|
|
- else if (*arg1 == 0 || *arg2 == 0)
|
|
|
- {
|
|
|
- tintin_printf2(ses, " worldflags: %d", ses->map->flags);
|
|
|
- tintin_printf2(ses, " worldsize: %d", ses->map->size);
|
|
|
- tintin_printf2(ses, "");
|
|
|
- tintin_printf2(ses, " roomvnum: %d", room->vnum);
|
|
|
- tintin_printf2(ses, " roomarea: %s", room->area);
|
|
|
- tintin_printf2(ses, " roomcolor: %s", room->color);
|
|
|
- tintin_printf2(ses, " roomdata: %s", room->data);
|
|
|
- tintin_printf2(ses, " roomdesc: %s", room->desc);
|
|
|
- tintin_printf2(ses, " roomexits: %d", get_room_exits(ses, room->vnum));
|
|
|
- tintin_printf2(ses, " roomflags: %d", room->flags);
|
|
|
- tintin_printf2(ses, " roomid: %s", room->id);
|
|
|
- tintin_printf2(ses, " roomname: %s", room->name);
|
|
|
- tintin_printf2(ses, " roomnote: %s", room->note);
|
|
|
- tintin_printf2(ses, " roomsymbol: %s", room->symbol);
|
|
|
- tintin_printf2(ses, "roomterrain: %s", room->terrain);
|
|
|
- tintin_printf2(ses, " roomweight: %.3f", room->weight);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (is_abbrev(arg1, "all"))
|
|
|
- {
|
|
|
- exits[0] = 0;
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 11:
|
|
|
+ case 12:
|
|
|
+ if (room_grid[EXIT_GRID_N] && hash % 4 == 0)
|
|
|
+ {
|
|
|
+ room = room_grid[EXIT_GRID_N];
|
|
|
+ }
|
|
|
+ else if (room_grid[EXIT_GRID_W] && hash % 4 == 1)
|
|
|
+ {
|
|
|
+ room = room_grid[EXIT_GRID_W];
|
|
|
+ }
|
|
|
+ else if (room_grid[EXIT_GRID_NW] && hash % 4 == 2)
|
|
|
+ {
|
|
|
+ room = room_grid[EXIT_GRID_NW];
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 13:
|
|
|
+ case 14:
|
|
|
+ if (room_grid[EXIT_GRID_N] && hash % 2 == 0)
|
|
|
+ {
|
|
|
+ room = room_grid[EXIT_GRID_N];
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 21:
|
|
|
+ case 22:
|
|
|
+ if (room_grid[EXIT_GRID_W] && hash % 2 == 0)
|
|
|
+ {
|
|
|
+ room = room_grid[EXIT_GRID_W];
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- for (exit = room->f_exit ; exit ; exit = exit->next)
|
|
|
+ if (room == NULL)
|
|
|
{
|
|
|
- cat_sprintf(exits, "{%s}{%d}", exit->name, exit->vnum);
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
}
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "{area}{%s}{color}{%s}{data}{%s}{desc}{%s}{exits}{%s}{flags}{%d}{id}{%d}{name}{%s}{note}{%s}{symbol}{%s}{terrain}{%s}{vnum}{%d}{weight}{%.3f}", room->area, room->color, room->data, room->desc, exits, room->flags, room->id, room->name, room->note, room->symbol, room->terrain, room->vnum, room->weight);
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "roomarea"))
|
|
|
+
|
|
|
+ terrain = room->terrain_index;
|
|
|
+
|
|
|
+ if (terrain == -1)
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%s", room->area);
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "roomcolor"))
|
|
|
+
|
|
|
+ terrain_room = ses->list[LIST_TERRAIN]->list[terrain]->room;
|
|
|
+
|
|
|
+ if (HAS_BIT(terrain_room->terrain_flags, TERRAIN_FLAG_DOUBLE))
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%s", room->color);
|
|
|
+ if (HAS_BIT(flags, TERRAIN_FLAG_DOUBLE))
|
|
|
+ {
|
|
|
+ if (index == 5)
|
|
|
+ {
|
|
|
+ return "\e[1;32m5";
|
|
|
+ }
|
|
|
+ if (index % 2 == 0)
|
|
|
+ {
|
|
|
+ DEL_BIT(ses->map->flags, MAP_FLAG_DOUBLED);
|
|
|
+ if (index == 2)
|
|
|
+ {
|
|
|
+ return " ";
|
|
|
+ }
|
|
|
+ if (index == 4)
|
|
|
+ {
|
|
|
+ return " ";
|
|
|
+ }
|
|
|
+ return "\e[1;35m?";
|
|
|
+ }
|
|
|
+ SET_BIT(ses->map->flags, MAP_FLAG_DOUBLED);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "roomdata"))
|
|
|
+
|
|
|
+ if (room->vnum == 0)
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%s", room->data);
|
|
|
+ width++;
|
|
|
+
|
|
|
+ density = 0;
|
|
|
+
|
|
|
+ density += (room_grid[EXIT_GRID_N] && room_grid[EXIT_GRID_N]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_NE] && room_grid[EXIT_GRID_NE]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_E] && room_grid[EXIT_GRID_E]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_SE] && room_grid[EXIT_GRID_SE]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_S] && room_grid[EXIT_GRID_S]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_SW] && room_grid[EXIT_GRID_SW]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_W] && room_grid[EXIT_GRID_W]->vnum);
|
|
|
+ density += (room_grid[EXIT_GRID_NW] && room_grid[EXIT_GRID_NW]->vnum);
|
|
|
+
|
|
|
+ if (density == 0)
|
|
|
+ {
|
|
|
+ width++;
|
|
|
+ }
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "roomdesc"))
|
|
|
+
|
|
|
+ density = get_terrain_density(terrain_room, width);
|
|
|
+
|
|
|
+ if (HAS_BIT(density, TERRAIN_FLAG_DENSE))
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%s", room->desc);
|
|
|
+ return ses->list[LIST_TERRAIN]->list[terrain]->arg2;
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "roomflags"))
|
|
|
+
|
|
|
+ if (HAS_BIT(density, TERRAIN_FLAG_SPARSE))
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%d", room->flags);
|
|
|
+ if (HAS_BIT(flags, TERRAIN_FLAG_DOUBLE) && HAS_BIT(terrain_room->terrain_flags, TERRAIN_FLAG_DOUBLE))
|
|
|
+ {
|
|
|
+ if (room_grid[EXIT_GRID_0] && room_grid[EXIT_GRID_N] && room_grid[EXIT_GRID_0]->terrain_index != room_grid[EXIT_GRID_N]->terrain_index)
|
|
|
+ {
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 13:
|
|
|
+ return hash % 2 == 0 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 11:
|
|
|
+ return hash % 2 == 1 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+
|
|
|
+ case 23:
|
|
|
+ return hash % 2 == 0 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room_grid[EXIT_GRID_0] && room_grid[EXIT_GRID_N] && room_grid[EXIT_GRID_0]->terrain_index != room_grid[EXIT_GRID_N]->terrain_index)
|
|
|
+ {
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 12:
|
|
|
+ return hash % 2 == 0 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+
|
|
|
+ case 14:
|
|
|
+ return hash % 2 == 1 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 11:
|
|
|
+ return hash % 5 == 0 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ case 13:
|
|
|
+ return hash % 5 == 2 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ case 15:
|
|
|
+ return hash % 5 == 4 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+
|
|
|
+ case 22:
|
|
|
+ return hash % 2 == 0 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ case 24:
|
|
|
+ return hash % 2 == 1 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "roomid"))
|
|
|
+
|
|
|
+ if (HAS_BIT(density, TERRAIN_FLAG_SCANT))
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%s", room->id);
|
|
|
+ if (HAS_BIT(flags, TERRAIN_FLAG_DOUBLE) && HAS_BIT(terrain_room->terrain_flags, TERRAIN_FLAG_DOUBLE))
|
|
|
+ {
|
|
|
+ if (room_grid[EXIT_GRID_0] && room_grid[EXIT_GRID_N] && room_grid[EXIT_GRID_0]->terrain_index != room_grid[EXIT_GRID_N]->terrain_index)
|
|
|
+ {
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 13:
|
|
|
+ return hash % 4 == 2 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 11:
|
|
|
+ return hash % 4 == 0 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+// case 13:
|
|
|
+// return hash % 8 == 1 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+// case 21:
|
|
|
+// return hash % 8 == 2 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ case 23:
|
|
|
+ return hash % 4 == 1 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room_grid[EXIT_GRID_0] && room_grid[EXIT_GRID_N] && room_grid[EXIT_GRID_0]->terrain_index != room_grid[EXIT_GRID_N]->terrain_index)
|
|
|
+ {
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 12:
|
|
|
+ return hash % 7 == 5 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ case 14:
|
|
|
+ return hash % 7 == 6 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 11:
|
|
|
+ return hash % 7 == 0 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ case 13:
|
|
|
+ return hash % 7 == 1 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ case 15:
|
|
|
+ return hash % 7 == 2 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ case 22:
|
|
|
+ return hash % 7 == 3 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ case 24:
|
|
|
+ return hash % 7 == 4 ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "roomname"))
|
|
|
+
|
|
|
+ if (HAS_BIT(flags, TERRAIN_FLAG_DOUBLE) && HAS_BIT(terrain_room->terrain_flags, TERRAIN_FLAG_DOUBLE))
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%s", room->name);
|
|
|
+ switch (line * 10 + index)
|
|
|
+ {
|
|
|
+ case 13:
|
|
|
+ return room_grid[EXIT_GRID_0] && room_grid[EXIT_GRID_N] && room_grid[EXIT_GRID_0]->terrain_index != room_grid[EXIT_GRID_N]->terrain_index ? ses->list[LIST_TERRAIN]->list[terrain]->arg2 : blank_terrain_symbol(ses, room, index, flags);
|
|
|
+
|
|
|
+ case 11:
|
|
|
+// return "\e[1;31m1 ";
|
|
|
+ case 23:
|
|
|
+// return "\e[1;34m3 ";
|
|
|
+ return ses->list[LIST_TERRAIN]->list[terrain]->arg2;
|
|
|
+ }
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "roomnote"))
|
|
|
+
|
|
|
+ switch (line * 10 + index)
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%s", room->note);
|
|
|
+ case 12:
|
|
|
+ case 14:
|
|
|
+ if (room_grid[EXIT_GRID_0] && room_grid[EXIT_GRID_N] && room_grid[EXIT_GRID_0]->terrain_index != -1 && room_grid[EXIT_GRID_0]->terrain_index != room_grid[EXIT_GRID_N]->terrain_index)
|
|
|
+ {
|
|
|
+ if (!HAS_BIT(ses->list[LIST_TERRAIN]->list[room_grid[EXIT_GRID_N]->terrain_index]->room->terrain_flags, TERRAIN_FLAG_DOUBLE))
|
|
|
+ {
|
|
|
+ return ses->list[LIST_TERRAIN]->list[room_grid[EXIT_GRID_N]->terrain_index]->arg2;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ case 11:
|
|
|
+ case 13:
|
|
|
+ case 15:
|
|
|
+ case 22:
|
|
|
+ case 24:
|
|
|
+ return ses->list[LIST_TERRAIN]->list[terrain]->arg2;
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "roomsymbol"))
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+ }
|
|
|
+ return blank_terrain_symbol(ses, room, index, flags);
|
|
|
+}
|
|
|
+
|
|
|
+int follow_map(struct session *ses, char *argument)
|
|
|
+{
|
|
|
+ struct room_data *room;
|
|
|
+ struct exit_data *exit;;
|
|
|
+ int in_room, vnum;
|
|
|
+
|
|
|
+ push_call("follow_map(%p,%p)",ses,argument);
|
|
|
+
|
|
|
+ room = ses->map->room_list[ses->map->in_room];
|
|
|
+
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW))
|
|
|
+ {
|
|
|
+ if (check_global(ses, room->vnum) && find_exit(ses, ses->map->global_vnum, argument))
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%s", room->symbol);
|
|
|
+ in_room = ses->map->global_vnum;
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "roomterrain"))
|
|
|
+ else
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%s", room->terrain);
|
|
|
+ in_room = ses->map->in_room;
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "roomvnum"))
|
|
|
+ exit = find_exit(ses, in_room, argument);
|
|
|
+
|
|
|
+ if (exit)
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%d", room->vnum);
|
|
|
+ ses->map->dir = exit->dir;
|
|
|
+
|
|
|
+ vnum = tunnel_void(ses, in_room, exit->vnum, exit->dir);
|
|
|
+
|
|
|
+ check_all_events(ses, SUB_ARG, 0, 5, "MAP FOLLOW MAP", ntos(in_room), ntos(vnum), exit->name);
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "roomweight"))
|
|
|
+ pop_call();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (check_global(ses, room->vnum))
|
|
|
+ {
|
|
|
+ if (find_exit(ses, ses->map->global_vnum, argument))
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%.3f", room->weight);
|
|
|
+ goto_room(ses, ses->map->global_vnum);
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "roomexits"))
|
|
|
+ }
|
|
|
+
|
|
|
+ exit = find_exit(ses, ses->map->in_room, argument);
|
|
|
+
|
|
|
+ if (exit)
|
|
|
+ {
|
|
|
+ ses->map->dir = exit->dir;
|
|
|
+
|
|
|
+ in_room = ses->map->in_room;
|
|
|
+
|
|
|
+ vnum = tunnel_void(ses, in_room, exit->vnum, exit->dir);
|
|
|
+
|
|
|
+ if (ses->map->nofollow == 0)
|
|
|
{
|
|
|
- exits[0] = 0;
|
|
|
+ if (HAS_BIT(exit->flags, EXIT_FLAG_BLOCK) || HAS_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_BLOCK))
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP FOLLOW: %s {%d} HAS THE BLOCK FLAG SET.", HAS_BIT(exit->flags, EXIT_FLAG_BLOCK) ? "EXIT" : "ROOM", vnum);
|
|
|
|
|
|
- for (exit = room->f_exit ; exit ; exit = exit->next)
|
|
|
+ pop_call();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- cat_sprintf(exits, "{%s}{%d}", exit->name, exit->vnum);
|
|
|
+ ses->map->nofollow++;
|
|
|
+ script_driver(ses, LIST_COMMAND, exit->cmd);
|
|
|
+ ses->map->nofollow--;
|
|
|
}
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%s", exits);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "worldflags"))
|
|
|
- {
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%d", ses->map->flags);
|
|
|
}
|
|
|
- else if (is_abbrev(arg1, "worldsize"))
|
|
|
+
|
|
|
+ check_all_events(ses, SUB_ARG, 0, 5, "MAP FOLLOW MAP", ntos(in_room), ntos(vnum), exit->name);
|
|
|
+
|
|
|
+ add_undo(ses, "%d %d %d", vnum, in_room, MAP_UNDO_MOVE);
|
|
|
+
|
|
|
+ goto_room(ses, vnum);
|
|
|
+
|
|
|
+ if (HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_LEAVE))
|
|
|
{
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg2, "%d", ses->map->size);
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: LEAVE FLAG FOUND IN ROOM {%d}. LEAVING MAP.", ses->map->in_room);
|
|
|
+
|
|
|
+ map_leave(ses, "", "", "");
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP))
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP GET: unknown option: %s.", arg1);
|
|
|
+ SET_BIT(ses->flags, SES_FLAG_UPDATEVTMAP);
|
|
|
}
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
-DO_MAP(map_global)
|
|
|
-{
|
|
|
- int room;
|
|
|
-
|
|
|
- sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
-
|
|
|
- if (*arg1 == 0)
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP GLOBAL: GLOBAL ROOM SET TO VNUM %d.", ses->map->global_vnum);
|
|
|
+ pop_call();
|
|
|
+ return 1;
|
|
|
}
|
|
|
- else if (!strcmp(arg1, "0"))
|
|
|
- {
|
|
|
- ses->map->global_vnum = ses->map->global_exit->vnum = 0;
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP GLOBAL: GLOBAL ROOM SET TO VNUM %d.", 0);
|
|
|
- }
|
|
|
- else
|
|
|
+ if (!HAS_BIT(ses->map->flags, MAP_FLAG_STATIC) && !HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_STATIC))
|
|
|
{
|
|
|
- room = find_room(ses, arg);
|
|
|
+ struct listnode *node;
|
|
|
|
|
|
- if (room)
|
|
|
+ if ((node = search_node_list(ses->list[LIST_PATHDIR], argument)) == NULL)
|
|
|
{
|
|
|
- ses->map->global_vnum = ses->map->global_exit->vnum = room;
|
|
|
+ pop_call();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP GLOBAL: GLOBAL ROOM SET TO VNUM %d.", room);
|
|
|
+ in_room = find_coord(ses, argument);
|
|
|
+
|
|
|
+ if (in_room)
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP CREATE LINK %5d {%s}.", in_room, ses->map->room_list[in_room]->name);
|
|
|
+
|
|
|
+ add_undo(ses, "%d %d %d", in_room, ses->map->in_room, MAP_UNDO_MOVE|MAP_UNDO_LINK);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP GLOBAL: COULDN'T FIND ROOM %s.", arg1);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-DO_MAP(map_goto)
|
|
|
-{
|
|
|
- struct exit_data *exit;
|
|
|
- int room;
|
|
|
-
|
|
|
- room = find_room(ses, arg);
|
|
|
+ for (in_room = 1 ; in_room < ses->map->size ; in_room++)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[in_room] == NULL)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN); // look for dig argument
|
|
|
+ if (in_room == ses->map->size)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: Maximum amount of rooms of %d reached. Use #MAP RESIZE to increase the maximum.", ses->map->size);
|
|
|
|
|
|
- if (room == 0 && ses->map->search->vnum > 0 && ses->map->search->vnum < ses->map->size && !strcasecmp(arg2, "dig"))
|
|
|
- {
|
|
|
- room = ses->map->search->vnum;
|
|
|
+ pop_call();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ add_undo(ses, "%d %d %d", in_room, ses->map->in_room, MAP_UNDO_MOVE|MAP_UNDO_CREATE|MAP_UNDO_LINK);
|
|
|
|
|
|
- create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {}", room);
|
|
|
- }
|
|
|
+ create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {}", in_room);
|
|
|
+ }
|
|
|
|
|
|
- if (room == 0)
|
|
|
- {
|
|
|
- room = find_room(ses, arg1);
|
|
|
- }
|
|
|
+ exit = create_exit(ses, ses->map->in_room, "{%d} {%s} {%s}", in_room, node->arg1, node->arg1);
|
|
|
|
|
|
- if (room == 0 && ses->map->search->id && *ses->map->search->id && !strcasecmp(arg2, "dig"))
|
|
|
- {
|
|
|
- room = find_new_room(ses);
|
|
|
+ ses->map->dir = exit->dir;
|
|
|
|
|
|
- if (room)
|
|
|
+ if (find_exit(ses, in_room, node->arg2) == NULL)
|
|
|
{
|
|
|
- create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {%s}", room, ses->map->search->id);
|
|
|
+ create_exit(ses, in_room, "{%d} {%s} {%s}", ses->map->in_room, node->arg2, node->arg2);
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- if (room == 0)
|
|
|
- {
|
|
|
- exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
|
|
|
- if (exit == NULL)
|
|
|
+ if (ses->map->nofollow == 0)
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP GOTO: COULDN'T FIND ROOM %s.", arg1);
|
|
|
+ ses->map->nofollow++;
|
|
|
|
|
|
- return;
|
|
|
- }
|
|
|
- room = exit->vnum;
|
|
|
- }
|
|
|
+ script_driver(ses, LIST_COMMAND, argument);
|
|
|
|
|
|
- add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_MOVE);
|
|
|
+ ses->map->nofollow--;
|
|
|
+ }
|
|
|
+ goto_room(ses, in_room);
|
|
|
|
|
|
- goto_room(ses, room);
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP))
|
|
|
+ {
|
|
|
+ SET_BIT(ses->flags, SES_FLAG_UPDATEVTMAP);
|
|
|
+ }
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP GOTO: MOVED TO ROOM %d {%s}.", room, *ses->map->room_list[room]->name ? ses->map->room_list[room]->name : ses->map->room_list[room]->id);
|
|
|
+ pop_call();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ pop_call();
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-DO_MAP(map_info)
|
|
|
+void add_undo(struct session *ses, char *format, ...)
|
|
|
{
|
|
|
- int room, cnt, exits;
|
|
|
- struct exit_data *exit;
|
|
|
- struct room_data *in_room = ses->map->room_list[ses->map->in_room];
|
|
|
+ struct link_data *link;
|
|
|
+ char buf[BUFFER_SIZE], *arg, dir[BUFFER_SIZE], rev[BUFFER_SIZE], flag[BUFFER_SIZE];
|
|
|
+ va_list args;
|
|
|
|
|
|
- for (room = cnt = exits = 0 ; room < ses->map->size ; room++)
|
|
|
- {
|
|
|
- if (ses->map->room_list[room])
|
|
|
- {
|
|
|
- cnt++;
|
|
|
+ push_call("add_undo(%s,%s)",ses->name, format);
|
|
|
|
|
|
- exits += get_room_exits(ses, room);
|
|
|
- }
|
|
|
- }
|
|
|
+ va_start(args, format);
|
|
|
+ vsprintf(buf, format, args);
|
|
|
+ va_end(args);
|
|
|
|
|
|
+ arg = get_arg_in_braces(ses, buf, dir, GET_ONE);
|
|
|
+ arg = get_arg_in_braces(ses, arg, rev, GET_ONE);
|
|
|
+ arg = get_arg_in_braces(ses, arg, flag, GET_ONE);
|
|
|
|
|
|
- tintin_printf2(ses, " %+16s %-7d %+16s %-7d %+16s %-7d", "Total rooms:", cnt, "Total exits:", exits, "World size:", ses->map->size);
|
|
|
- tintin_printf2(ses, " %+16s %-7d %+16s %-7d %+16s %-7d", "Direction:", ses->map->dir, "Last room:", ses->map->last_room, "Undo size:", ses->map->undo_size);
|
|
|
- tintin_printf2(ses, "");
|
|
|
+ link = (struct link_data *) calloc(1, sizeof(struct link_data));
|
|
|
|
|
|
- strcpy(arg1, "");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "AsciiGraphics:", HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS) ? "ON" : "off");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "AsciiVnums:", HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS) ? "ON" : "off");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "BlockGraphics:", HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS) ? "ON" : "off");
|
|
|
- tintin_puts2(ses, arg1);
|
|
|
+ link->str1 = strdup(dir);
|
|
|
+ link->str2 = strdup(rev);
|
|
|
+ link->str3 = strdup(flag);
|
|
|
|
|
|
- strcpy(arg1, "");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "Direction:", HAS_BIT(ses->map->flags, MAP_FLAG_DIRECTION) ? "ON" : "OFF");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "MudFont:", HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT) ? "ON" : "off");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "Nofollow:", HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW) ? "ON" : "off");
|
|
|
- tintin_puts2(ses, arg1);
|
|
|
+ LINK(link, ses->map->undo_head, ses->map->undo_tail);
|
|
|
|
|
|
- strcpy(arg1, "");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "Static:", HAS_BIT(ses->map->flags, MAP_FLAG_STATIC) ? "ON" : "off");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "SymbolGraphics:", HAS_BIT(ses->map->flags, MAP_FLAG_SYMBOLGRAPHICS) ? "ON" : "off");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "UnicodeGraphics:", HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS) ? "ON" : "off");
|
|
|
- tintin_puts2(ses, arg1);
|
|
|
+ ses->map->undo_size++;
|
|
|
|
|
|
- strcpy(arg1, "");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "Vtmap:", HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP) ? "ON" : "off");
|
|
|
- tintin_puts2(ses, arg1);
|
|
|
-/*
|
|
|
- strcpy(arg1, "");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s",
|
|
|
- cat_sprintf(arg1, " %+16s %-7s",
|
|
|
- cat_sprintf(arg1, " %+16s %-7s",
|
|
|
- tintin_puts2(ses, arg1);
|
|
|
-*/
|
|
|
- if (ses->map->in_room == 0)
|
|
|
+ if (ses->map->undo_size > 100)
|
|
|
{
|
|
|
- return;
|
|
|
+ del_undo(ses, ses->map->undo_head);
|
|
|
}
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+}
|
|
|
|
|
|
- tintin_printf2(ses, "");
|
|
|
+void del_undo(struct session *ses, struct link_data *link)
|
|
|
+{
|
|
|
+ UNLINK(link, ses->map->undo_head, ses->map->undo_tail);
|
|
|
|
|
|
- tintin_printf2(ses, "%+16s %s", "Room area:", in_room->area);
|
|
|
- tintin_printf2(ses, "%+16s %s", "Room data:", in_room->data);
|
|
|
- tintin_printf2(ses, "%+16s %s", "Room desc:", in_room->desc);
|
|
|
- tintin_printf2(ses, "%+16s %s", "Room id:", in_room->id);
|
|
|
- tintin_printf2(ses, "%+16s %s", "Room name:", in_room->name);
|
|
|
- tintin_printf2(ses, "%+16s %s", "Room note:", in_room->note);
|
|
|
- tintin_printf2(ses, "%+16s %s", "Room color:", str_convert_meta(in_room->color, TRUE));
|
|
|
- tintin_printf2(ses, "%+16s %s", "Room terrain:", in_room->terrain);
|
|
|
+ free(link->str1);
|
|
|
+ free(link->str2);
|
|
|
+ free(link->str3);
|
|
|
|
|
|
- tintin_printf2(ses, "");
|
|
|
- tintin_printf2(ses, " %+16s %-7d %+16s %-7.3f %+16s %-7s", "Room vnum:", ses->map->in_room, "Room weight:", in_room->weight, "Room symbol:", in_room->symbol);
|
|
|
+ free(link);
|
|
|
|
|
|
- tintin_printf2(ses, " %+16s %-7d %+16s %-7d %+16s %-7d", "Center x:", ses->map->center_x, "Center y:", ses->map->center_y, "Center z:", ses->map->center_z);
|
|
|
+ ses->map->undo_size--;
|
|
|
+}
|
|
|
|
|
|
- tintin_printf2(ses, "");
|
|
|
+/*
|
|
|
+ Draws a map on a grid, original breadth first improvements by Bryan Turner
|
|
|
+*/
|
|
|
|
|
|
- strcpy(arg1, "");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "Avoid:", HAS_BIT(in_room->flags, ROOM_FLAG_AVOID) ? "on" : "off");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "Curved:", HAS_BIT(in_room->flags, ROOM_FLAG_CURVED) ? "on" : "off");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "Hide:", HAS_BIT(in_room->flags, ROOM_FLAG_HIDE) ? "on" : "off");
|
|
|
|
|
|
- tintin_puts2(ses, arg1);
|
|
|
|
|
|
- strcpy(arg1, "");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "Invis:", HAS_BIT(in_room->flags, ROOM_FLAG_INVIS) ? "on" : "off");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "Leave:", HAS_BIT(in_room->flags, ROOM_FLAG_LEAVE) ? "on" : "off");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "NoGlobal:", HAS_BIT(in_room->flags, ROOM_FLAG_NOGLOBAL) ? "on" : "off");
|
|
|
- tintin_puts2(ses, arg1);
|
|
|
+struct grid_node
|
|
|
+{
|
|
|
+ int vnum;
|
|
|
+ int from;
|
|
|
+ int flags;
|
|
|
+ float length;
|
|
|
+ int dir;
|
|
|
+ int w;
|
|
|
+ int x;
|
|
|
+ int y;
|
|
|
+ int z;
|
|
|
+};
|
|
|
|
|
|
- strcpy(arg1, "");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "Static:", HAS_BIT(in_room->flags, ROOM_FLAG_STATIC) ? "on" : "off");
|
|
|
- cat_sprintf(arg1, " %+16s %-7s", "Void:", HAS_BIT(in_room->flags, ROOM_FLAG_VOID) ? "on" : "off");
|
|
|
- tintin_puts2(ses, arg1);
|
|
|
+void displaygrid_build(struct session *ses, int vnum, int x, int y, int z)
|
|
|
+{
|
|
|
+ int head, tail;
|
|
|
+ struct grid_node *node, *temp, list[MAP_BF_SIZE];
|
|
|
+ struct exit_data *exit;
|
|
|
+ struct room_data *room, *toroom;
|
|
|
|
|
|
- tintin_printf2(ses, "");
|
|
|
+ push_call("displaygrid_build(%p,%d,%d,%d,%d)",ses,vnum,x,y,z);
|
|
|
|
|
|
- for (exit = in_room->f_exit ; exit ; exit = exit->next)
|
|
|
- {
|
|
|
- tintin_printf2(ses, "%+16s %-3s (%3s) to room: %-5d (%5s)", "Exit:", exit->name, exit->cmd, exit->vnum, ses->map->room_list[exit->vnum]->name);
|
|
|
- }
|
|
|
+ map_grid_x = x;
|
|
|
+ map_grid_y = y;
|
|
|
|
|
|
- tintin_printf2(ses, "");
|
|
|
+ head = 0;
|
|
|
+ tail = 1;
|
|
|
|
|
|
- for (room = 0 ; room < ses->map->size ; room++)
|
|
|
+ node = &list[head];
|
|
|
+
|
|
|
+ node->vnum = vnum;
|
|
|
+ node->length = ses->map->room_list[vnum]->weight;
|
|
|
+ node->flags = 0;
|
|
|
+
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS))
|
|
|
{
|
|
|
- if (ses->map->room_list[room])
|
|
|
- {
|
|
|
- for (exit = ses->map->room_list[room]->f_exit ; exit ; exit = exit->next)
|
|
|
- {
|
|
|
- if (exit->vnum == ses->map->in_room)
|
|
|
- {
|
|
|
- tintin_printf2(ses, "%+16s %-3s (%3s) from room: %-5d (%5s)", "Entrance:", exit->name, exit->cmd, room, ses->map->room_list[room]->name);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ node->x = (x - 2) / 2 + ses->map->center_x;
|
|
|
}
|
|
|
-/*
|
|
|
- for (exit = in_room->f_exit ; exit ; exit = exit->next)
|
|
|
+ else
|
|
|
{
|
|
|
- tintin_printf2(ses, "%+14s %-4s %+14s %5d %+14s %5d %+14s %5s", "Exit name:", exit->name, "vnum:", exit->vnum, "flags:", exit->flags, "command:", exit->cmd);
|
|
|
- tintin_printf2(ses, "%+14s %s", "Exit data:", exit->data);
|
|
|
+ node->x = x / 2 + ses->map->center_x;
|
|
|
}
|
|
|
-*/
|
|
|
-}
|
|
|
-
|
|
|
-DO_MAP(map_insert)
|
|
|
-{
|
|
|
- int room, in_room, to_room;
|
|
|
- struct exit_data *exit;
|
|
|
- struct listnode *node;
|
|
|
-
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ node->y = y / 2 + ses->map->center_y;
|
|
|
+ node->z = z / 2 + ses->map->center_z;
|
|
|
|
|
|
- for (room = 1 ; room < ses->map->size ; room++)
|
|
|
- {
|
|
|
- if (ses->map->room_list[room] == NULL)
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
|
|
|
- node = search_node_list(ses->list[LIST_PATHDIR], arg1);
|
|
|
+ ses->map->display_stamp++;
|
|
|
|
|
|
- if (exit == NULL)
|
|
|
+ for (vnum = 0 ; vnum < x * y ; vnum++)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: There is no room in that direction.");
|
|
|
-
|
|
|
- return;
|
|
|
+ ses->map->grid_rooms[vnum] = NULL;
|
|
|
}
|
|
|
|
|
|
- if (room == ses->map->size)
|
|
|
+ while (head != tail)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: Maximum amount of rooms of %d reached.", ses->map->size);
|
|
|
- return;
|
|
|
- }
|
|
|
+ node = &list[head];
|
|
|
|
|
|
- if (node == NULL)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: Given direction must be a pathdir.");
|
|
|
- return;
|
|
|
- }
|
|
|
+ head = (head + 1) % MAP_BF_SIZE;
|
|
|
|
|
|
- in_room = ses->map->in_room;
|
|
|
- to_room = exit->vnum;
|
|
|
+ room = ses->map->room_list[node->vnum];
|
|
|
|
|
|
- add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_INSERT);
|
|
|
+ if (ses->map->display_stamp != room->display_stamp)
|
|
|
+ {
|
|
|
+ room->display_stamp = ses->map->display_stamp;
|
|
|
+ }
|
|
|
+ else if (room->length <= node->length /*&& !HAS_BIT(room->flags, ROOM_FLAG_VOID)*/)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {}", room);
|
|
|
+ room->length = node->length;
|
|
|
|
|
|
- create_exit(ses, room, "{%d} {%s} {%s}", to_room, node->arg1, node->arg1);
|
|
|
+ if (node->x >= 0 && node->x < map_grid_x && node->y >= 0 && node->y < map_grid_y && node->z == 0)
|
|
|
+ {
|
|
|
+ if (ses->map->grid_rooms[node->x + map_grid_x * node->y] == NULL)
|
|
|
+ {
|
|
|
+ ses->map->grid_rooms[node->x + map_grid_x * node->y] = room;
|
|
|
+ }
|
|
|
+ else if (!HAS_BIT(room->flags, ROOM_FLAG_VOID))
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- create_exit(ses, room, "{%d} {%s} {%s}", in_room, node->arg2, node->arg2);
|
|
|
+ for (exit = room->f_exit ; exit ; exit = exit->next)
|
|
|
+ {
|
|
|
+ if (exit->dir == 0)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- exit->vnum = room;
|
|
|
+ toroom = ses->map->room_list[exit->vnum];
|
|
|
|
|
|
- if ((exit = find_exit(ses, to_room, node->arg2)) != NULL)
|
|
|
- {
|
|
|
- exit->vnum = room;
|
|
|
- }
|
|
|
+ if (ses->map->display_stamp == toroom->display_stamp)
|
|
|
+ {
|
|
|
+ if (HAS_BIT(room->flags, ROOM_FLAG_VOID) || !HAS_BIT(toroom->flags, ROOM_FLAG_VOID))
|
|
|
+ {
|
|
|
+ if (room->length >= ses->map->room_list[exit->vnum]->length)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (*arg)
|
|
|
- {
|
|
|
- ses->map->in_room = room;
|
|
|
- map_roomflag(ses, arg, arg1, arg2);
|
|
|
- ses->map->in_room = in_room;
|
|
|
- }
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Inserted room {%d}.", room);
|
|
|
-}
|
|
|
+ if (HAS_BIT(exit->flags, EXIT_FLAG_HIDE) || HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_HIDE))
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
-DO_MAP(map_jump)
|
|
|
-{
|
|
|
- char arg3[BUFFER_SIZE];
|
|
|
- int room, x, y, z;
|
|
|
+ if (head == (tail + 1) % MAP_BF_SIZE)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ if (HAS_BIT(room->flags, ROOM_FLAG_VOID) && ses->map->in_room != room->vnum && get_room_exits(ses, room->vnum) % 2 == 0)
|
|
|
+ {
|
|
|
+ exit = room->exit_grid[dir_to_grid(node->dir)];
|
|
|
+
|
|
|
+ if (exit == NULL)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[room->f_exit->vnum]->display_stamp != ses->map->display_stamp)
|
|
|
+ {
|
|
|
+ exit = room->f_exit;
|
|
|
+ }
|
|
|
+ else if (ses->map->room_list[room->l_exit->vnum]->display_stamp != ses->map->display_stamp)
|
|
|
+ {
|
|
|
+ exit = room->l_exit;
|
|
|
+ }
|
|
|
+ else if (ses->map->room_list[room->f_exit->vnum]->length <= ses->map->room_list[room->l_exit->vnum]->length)
|
|
|
+ {
|
|
|
+ exit = room->f_exit;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ exit = room->l_exit;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- x = get_number(ses, arg1);
|
|
|
- y = get_number(ses, arg2);
|
|
|
- z = get_number(ses, arg3);
|
|
|
+ temp = &list[tail];
|
|
|
|
|
|
- room = spatialgrid_find(ses, ses->map->in_room, x, y, z);
|
|
|
+ temp->vnum = exit->vnum;
|
|
|
+ temp->dir = exit->dir;
|
|
|
+ temp->x = node->x + (HAS_BIT(exit->dir, MAP_EXIT_E) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_W) ? -1 : 0);
|
|
|
+ temp->y = node->y + (HAS_BIT(exit->dir, MAP_EXIT_N) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_S) ? -1 : 0);
|
|
|
+ temp->z = node->z + (HAS_BIT(exit->dir, MAP_EXIT_U) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_D) ? -1 : 0);
|
|
|
+ temp->length = node->length + exit->weight + ses->map->room_list[exit->vnum]->weight;
|
|
|
|
|
|
- if (room)
|
|
|
- {
|
|
|
- add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_MOVE);
|
|
|
+ temp->flags = 0;
|
|
|
|
|
|
- goto_room(ses, room);
|
|
|
+ tail = (tail + 1) % MAP_BF_SIZE;
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP JUMP: JUMPED TO ROOM %d {%s}.", room, *ses->map->room_list[room]->name ? ses->map->room_list[room]->name : ses->map->room_list[room]->id);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP JUMP: Couldn't find a room at {%d} {%d} {%d}.", x, y, z);
|
|
|
+ if (HAS_BIT(room->flags, ROOM_FLAG_VOID) && ses->map->in_room != room->vnum && get_room_exits(ses, room->vnum) % 2 == 0)
|
|
|
+ {
|
|
|
+ temp->length = node->length + 0.000001;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-DO_MAP(map_leave)
|
|
|
-{
|
|
|
- if (ses->map->in_room == 0)
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_UPDATETERRAIN))
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: You're not currently inside the map.");
|
|
|
+ update_terrain(ses);
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
{
|
|
|
- ses->map->last_room = ses->map->in_room;
|
|
|
- ses->map->in_room = 0;
|
|
|
+ int terrain;
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Leaving the map. Use goto or return to return.");
|
|
|
+ for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
+ {
|
|
|
+ for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
+ {
|
|
|
+ if (ses->map->grid_rooms[x + map_grid_x * y] == NULL)
|
|
|
+ {
|
|
|
+ terrain = get_terrain_index(ses, NULL, x, y);
|
|
|
|
|
|
- check_all_events(ses, SUB_ARG|SUB_SEC, 0, 1, "MAP EXIT MAP", ntos(ses->map->in_room));
|
|
|
+ if (terrain != -1)
|
|
|
+ {
|
|
|
+ ses->map->grid_rooms[x + map_grid_x * y] = ses->list[LIST_TERRAIN]->list[terrain]->room;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
-void map_legend_index(struct session *ses, char *arg, int head, int tail)
|
|
|
+
|
|
|
+void show_vtmap(struct session *ses)
|
|
|
{
|
|
|
- char esc[BUFFER_SIZE], raw[BUFFER_SIZE];
|
|
|
- int cnt;
|
|
|
+ char buf[BUFFER_SIZE], out[BUFFER_SIZE], tmp[BUFFER_SIZE];
|
|
|
+ int x, y, line;
|
|
|
+ int top_row, top_col, bot_row, bot_col, rows, cols, row;
|
|
|
|
|
|
- for (cnt = head ; cnt < tail ; cnt++)
|
|
|
- {
|
|
|
- arg = sub_arg_in_braces(ses, arg, raw, GET_ONE, SUB_NONE);
|
|
|
+ push_call("show_vtmap(%p)",ses);
|
|
|
|
|
|
- substitute(ses, raw, esc, SUB_ESC);
|
|
|
+ if (ses->map == NULL || !HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP))
|
|
|
+ {
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if (is_number(esc))
|
|
|
- {
|
|
|
- numbertocharacter(ses, esc);
|
|
|
- }
|
|
|
- snprintf(ses->map->legend[cnt], LEGEND_SIZE - 1, "%s", esc);
|
|
|
- snprintf(ses->map->legend_raw[cnt], LEGEND_SIZE - 1, "%s", raw);
|
|
|
-
|
|
|
- if (*arg == 0)
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
-DO_MAP(map_legend)
|
|
|
-{
|
|
|
- char buf[BUFFER_SIZE], arg3[BUFFER_SIZE];
|
|
|
- int group, legend;
|
|
|
-
|
|
|
- push_call("map_legend(%p,%p,%p,%p)",ses,arg,arg1,arg2);
|
|
|
-
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
-
|
|
|
- strcpy(buf, arg2);
|
|
|
-
|
|
|
- if (*arg1 == 0)
|
|
|
+ if (ses->map->room_list[ses->map->in_room] == NULL)
|
|
|
{
|
|
|
- for (group = 0 ; map_group_table[group].name ; group++)
|
|
|
- {
|
|
|
- tintin_printf2(ses, " [%-22s] [%-22s] [%3d] [%3d]",
|
|
|
- map_group_table[group].group,
|
|
|
- map_group_table[group].name,
|
|
|
- map_group_table[group].start,
|
|
|
- map_group_table[group].end);
|
|
|
- }
|
|
|
pop_call();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (is_abbrev(arg1, "RESET"))
|
|
|
+ if (ses != gtd->ses || HAS_BIT(gtd->ses->flags, SES_FLAG_READMUD))
|
|
|
{
|
|
|
- map_legend(ses, "{ASCII} {RESET}", arg1, arg2);
|
|
|
- map_legend(ses, "{NESW} {RESET}", arg1, arg2);
|
|
|
- map_legend(ses, "{MUDFONT BRAILLE TUBE} {RESET}", arg1, arg2);
|
|
|
-
|
|
|
pop_call();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (is_math(ses, arg1))
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_RESIZE))
|
|
|
{
|
|
|
- legend = (int) get_number(ses, arg1);
|
|
|
+ DEL_BIT(ses->map->flags, MAP_FLAG_RESIZE);
|
|
|
|
|
|
- if (legend < map_group_table[0].start || legend >= map_group_table[0].end)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP LEGEND {%d - %d} {[SYMBOL]}", map_group_table[0].start, map_group_table[0].end);
|
|
|
- }
|
|
|
- else if (*arg2 == 0)
|
|
|
- {
|
|
|
- tintin_printf2(ses, " [%-22s] [%-20s] [%3d] [ %8s ] [ %s ]",
|
|
|
- map_legend_table[legend].group,
|
|
|
- map_legend_table[legend].name,
|
|
|
- legend,
|
|
|
- ses->map->legend_raw[legend],
|
|
|
- ses->map->legend[legend]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- map_legend_index(ses, arg2, legend, legend + 1);
|
|
|
- }
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
+ map_offset(ses, NULL, "", "");
|
|
|
}
|
|
|
|
|
|
- for (group = 0 ; map_group_table[group].name ; group++)
|
|
|
+ if (ses->map->rows > 1 && ses->map->cols > 1)
|
|
|
{
|
|
|
- if (is_abbrev(arg1, map_group_table[group].name))
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
+ top_row = ses->map->top_row;
|
|
|
+ top_col = ses->map->top_col;
|
|
|
+ bot_row = ses->map->bot_row;
|
|
|
+ bot_col = ses->map->bot_col;
|
|
|
+ rows = ses->map->rows;
|
|
|
+ cols = ses->map->cols;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ top_row = 1;
|
|
|
+ top_col = 1;
|
|
|
+ bot_row = ses->split->top_row - 2;
|
|
|
+ bot_col = gtd->screen->cols;
|
|
|
+
|
|
|
+ rows = ses->split->top_row - 2;
|
|
|
+ cols = gtd->screen->cols;
|
|
|
}
|
|
|
|
|
|
+// print_stdout("\e[%d;%d;%d;%d${", top_row, top_col, bot_row, bot_col);
|
|
|
|
|
|
- if (!map_group_table[group].name)
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP LEGEND: UNKNOWN LEGEND {%s} TRY:", arg1);
|
|
|
-
|
|
|
- map_legend(ses, "", arg1, arg2);
|
|
|
+ erase_square(ses, top_row, top_col, bot_row, bot_col);
|
|
|
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
+ map_grid_y = 2 + rows / 3;
|
|
|
+ map_grid_x = 2 + cols / 6;
|
|
|
}
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS))
|
|
|
+ {
|
|
|
+ erase_square(ses, top_row, top_col, bot_row - 1, bot_col);
|
|
|
|
|
|
- if (*arg2 == 0)
|
|
|
+ map_grid_y = 2 + (rows + 2) / 2;
|
|
|
+ map_grid_x = 2 + (cols + 4) / 5;
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS))
|
|
|
{
|
|
|
- for (legend = map_group_table[group].start ; legend < map_group_table[group].end ; legend++)
|
|
|
- {
|
|
|
- tintin_printf2(ses, " [%-22s] [%-20s] [%3d] [ %8s ] [ %s ]",
|
|
|
- map_group_table[group].name,
|
|
|
- map_legend_table[legend].name,
|
|
|
- legend,
|
|
|
- ses->map->legend_raw[legend],
|
|
|
- ses->map->legend[legend]);
|
|
|
- }
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
+ erase_square(ses, top_row, top_col, bot_row, bot_col);
|
|
|
+
|
|
|
+ map_grid_y = 2 + rows / 2;
|
|
|
+ map_grid_x = 2 + cols / 5;
|
|
|
}
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT))
|
|
|
+ {
|
|
|
+ erase_square(ses, top_row, top_col, bot_row, bot_col);
|
|
|
|
|
|
- if (is_abbrev(arg2, "RESET"))
|
|
|
+ map_grid_y = 2 + rows;
|
|
|
+ map_grid_x = 2 + cols / 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- map_legend_index(ses, map_group_table[group].reset, map_group_table[group].start, map_group_table[group].end);
|
|
|
+ erase_square(ses, top_row, top_col, bot_row, bot_col);
|
|
|
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
+ map_grid_y = 2 + rows;
|
|
|
+ map_grid_x = 2 + cols;
|
|
|
}
|
|
|
|
|
|
- for (legend = map_group_table[group].start ; legend < map_group_table[group].end ; legend++)
|
|
|
+ displaygrid_build(ses, ses->map->in_room, map_grid_x, map_grid_y, 0);
|
|
|
+
|
|
|
+ save_pos(ses);
|
|
|
+
|
|
|
+ goto_pos(ses, top_row, 1);
|
|
|
+
|
|
|
+ row = top_row;
|
|
|
+
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
{
|
|
|
- if (!strcasecmp(space_out(arg2), space_out(map_legend_table[legend].name)))
|
|
|
+ for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
{
|
|
|
- if (*arg3 == 0)
|
|
|
- {
|
|
|
- tintin_printf2(ses, " [%-22s] [%-20s] [%3d] [ %8s ] [ %s ]",
|
|
|
- map_group_table[group].name,
|
|
|
- map_legend_table[legend].name,
|
|
|
- legend,
|
|
|
- ses->map->legend_raw[legend],
|
|
|
- ses->map->legend[legend]);
|
|
|
- }
|
|
|
- else
|
|
|
+ for (line = 1 ; line <= 3 ; line++)
|
|
|
{
|
|
|
- map_legend_index(ses, arg3, legend, legend + 1);
|
|
|
+ strcpy(buf, ses->map->color[MAP_COLOR_BACK]);
|
|
|
+
|
|
|
+ for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
+ {
|
|
|
+ strcat(buf, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], line, x, y));
|
|
|
+ }
|
|
|
+ substitute(ses, buf, out, SUB_COL|SUB_CMP|SUB_LIT);
|
|
|
+
|
|
|
+ print_stdout("\e[%d;%dH%s\e[0m", row++, top_col, out);
|
|
|
}
|
|
|
- break;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- if (legend == map_group_table[group].end)
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS))
|
|
|
{
|
|
|
- for (legend = map_group_table[group].start ; legend < map_group_table[group].end ; legend++)
|
|
|
+ for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
{
|
|
|
- if (is_abbrev(space_out(arg2), space_out(map_legend_table[legend].name)))
|
|
|
+ for (line = 1 ; line <= 2 ; line++)
|
|
|
{
|
|
|
- if (*arg3 == 0)
|
|
|
+ if (line == 2 && y == 1)
|
|
|
{
|
|
|
- tintin_printf2(ses, " [%-22s] [%-20s] [%3d] [ %8s ] [ %s ]",
|
|
|
- map_group_table[group].name,
|
|
|
- map_legend_table[legend].name,
|
|
|
- legend,
|
|
|
- ses->map->legend_raw[legend],
|
|
|
- ses->map->legend[legend]);
|
|
|
+ continue;
|
|
|
}
|
|
|
- else
|
|
|
+ strcpy(buf, ses->map->color[MAP_COLOR_BACK]);
|
|
|
+
|
|
|
+ for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
{
|
|
|
- map_legend_index(ses, arg3, legend, legend + 1);
|
|
|
+ if (x == map_grid_x - 2)
|
|
|
+ {
|
|
|
+ strcpy(tmp, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], line, x, y));
|
|
|
+
|
|
|
+ cat_sprintf(buf, "%.*s", string_str_raw_len(ses, tmp, 0, 2), tmp);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcat(buf, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], line, x, y));
|
|
|
+ }
|
|
|
}
|
|
|
- break;
|
|
|
+ substitute(ses, buf, out, SUB_COL|SUB_CMP|SUB_LIT);
|
|
|
+
|
|
|
+ print_stdout("\e[%d;%dH%s\e[0m", row++, top_col, out);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- if (legend == map_group_table[group].end)
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS))
|
|
|
{
|
|
|
- if (strlen(arg2) > (map_group_table[group].end - map_group_table[group].start) * 2)
|
|
|
+ for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
{
|
|
|
- map_legend_index(ses, arg2, map_group_table[group].start, map_group_table[group].end);
|
|
|
+ for (line = 1 ; line <= 2 ; line++)
|
|
|
+ {
|
|
|
+ strcpy(buf, ses->map->color[MAP_COLOR_BACK]);
|
|
|
+
|
|
|
+ for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
+ {
|
|
|
+ strcat(buf, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], line, x, y));
|
|
|
+ }
|
|
|
+ substitute(ses, buf, out, SUB_COL|SUB_CMP|SUB_LIT);
|
|
|
+
|
|
|
+ print_stdout("\e[%d;%dH%s\e[0m", row++, top_col, out);
|
|
|
+ }
|
|
|
}
|
|
|
- else
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP LEGEND {%s} {{arg %d} {arg %d} ... {arg %d} {arg %d}",
|
|
|
- map_group_table[group].group,
|
|
|
- map_group_table[group].start,
|
|
|
- map_group_table[group].start - 1,
|
|
|
- map_group_table[group].end - 1,
|
|
|
- map_group_table[group].end);
|
|
|
+ strcpy(buf, ses->map->color[MAP_COLOR_BACK]);
|
|
|
+
|
|
|
+ for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
+ {
|
|
|
+ strcat(buf, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], 0, x, y));
|
|
|
+ }
|
|
|
+ substitute(ses, buf, out, SUB_COL|SUB_CMP|SUB_LIT);
|
|
|
+
|
|
|
+ print_stdout("\e[%d;%dH%s\e[0m", row++, top_col, out);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ restore_pos(ses);
|
|
|
+
|
|
|
pop_call();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
-DO_MAP(map_link)
|
|
|
-{
|
|
|
- char arg3[BUFFER_SIZE];
|
|
|
- struct listnode *node;
|
|
|
- struct exit_data *exit;
|
|
|
- int room;
|
|
|
-
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+// http://shapecatcher.com/unicode/block/Mathematical_Operators diagonal #⊥⊤#
|
|
|
|
|
|
- if (*arg1 == 0 || *arg2 == 0)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP LINK {<DIRECTION>} {<LOCATION>} {BOTH}");
|
|
|
- return;
|
|
|
- }
|
|
|
+char *draw_room(struct session *ses, struct room_data *room, int line, int x, int y)
|
|
|
+{
|
|
|
+ static char buf[201], *room_color, room_left[101], room_right[101];
|
|
|
+ int index, symsize = 1, exits, exit1, exit2, room1, room2, offset, flags = 0;
|
|
|
+// struct room_data * room_grid[11];
|
|
|
|
|
|
- room = find_room(ses, arg2);
|
|
|
+ push_call("draw_room(%p,%p,%d,%d,%d)",ses,room,line,x,y);
|
|
|
|
|
|
- if (room == 0)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: Couldn't find room {%s}.", arg1);
|
|
|
- return;
|
|
|
- }
|
|
|
+ offset = HAS_BIT(ses->charset, CHARSET_FLAG_UTF8) ? LEGEND_UNICODE : LEGEND_ASCII;
|
|
|
|
|
|
- exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+ room_color = ses->map->color[MAP_COLOR_ROOM];
|
|
|
|
|
|
- if (exit)
|
|
|
+ if (room && room->vnum)
|
|
|
{
|
|
|
- delete_exit(ses, ses->map->in_room, exit);
|
|
|
- }
|
|
|
-
|
|
|
- create_exit(ses, ses->map->in_room, "{%d} {%s} {%s}", room, arg1, arg1);
|
|
|
+ symsize = strip_color_strlen(ses, room->symbol);
|
|
|
|
|
|
- if (is_abbrev(arg3, "both"))
|
|
|
- {
|
|
|
- if ((node = search_node_list(ses->list[LIST_PATHDIR], arg1)) != NULL)
|
|
|
+ if (HAS_BIT(room->flags, ROOM_FLAG_PATH) && room->search_stamp == ses->map->search->stamp)
|
|
|
{
|
|
|
- if (find_exit(ses, room, node->arg2) == NULL)
|
|
|
+ room_color = ses->map->color[MAP_COLOR_PATH];
|
|
|
+ }
|
|
|
+ else if (*room->color)
|
|
|
+ {
|
|
|
+ room_color = room->color;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (HAS_BIT(room->flags, ROOM_FLAG_INVIS))
|
|
|
{
|
|
|
- create_exit(ses, room, "{%d} {%s} {%s}", ses->map->in_room, node->arg2, node->arg2);
|
|
|
+ room_color = ses->map->color[MAP_COLOR_INVIS];
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->flags, ROOM_FLAG_HIDE))
|
|
|
+ {
|
|
|
+ room_color = ses->map->color[MAP_COLOR_HIDE];
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->flags, ROOM_FLAG_AVOID))
|
|
|
+ {
|
|
|
+ room_color = ses->map->color[MAP_COLOR_AVOID];
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->flags, ROOM_FLAG_BLOCK))
|
|
|
+ {
|
|
|
+ room_color = ses->map->color[MAP_COLOR_BLOCK];
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_SYMBOLGRAPHICS))
|
|
|
+ {
|
|
|
+ room_color = ses->map->color[MAP_COLOR_SYMBOL];
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP LINK: Connected room {%s} to {%s}.", ses->map->room_list[ses->map->in_room]->name, ses->map->room_list[room]->name);
|
|
|
-}
|
|
|
-
|
|
|
-DO_MAP(map_list)
|
|
|
-{
|
|
|
- struct room_data *room;
|
|
|
- char var[BUFFER_SIZE];
|
|
|
- int vnum;
|
|
|
-
|
|
|
- map_search_compile(ses, "0", var);
|
|
|
|
|
|
- searchgrid_find(ses, ses->map->in_room, ses->map->search);
|
|
|
+ if (room->vnum == ses->map->in_room)
|
|
|
+ {
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_DIRECTION))
|
|
|
+ {
|
|
|
+ exits = ses->map->dir;
|
|
|
|
|
|
- map_search_compile(ses, arg, var);
|
|
|
+ DEL_BIT(exits, MAP_EXIT_U|MAP_EXIT_D);
|
|
|
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], var, "");
|
|
|
+ switch (exits)
|
|
|
+ {
|
|
|
+ case MAP_EXIT_N:
|
|
|
+ index = LEGEND_ASCII_DIRS + 0;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_N+MAP_EXIT_E:
|
|
|
+ index = LEGEND_ASCII_DIRS + 1;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_E:
|
|
|
+ index = LEGEND_ASCII_DIRS + 2;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_S+MAP_EXIT_E:
|
|
|
+ index = LEGEND_ASCII_DIRS + 3;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_S:
|
|
|
+ index = LEGEND_ASCII_DIRS + 4;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_W+MAP_EXIT_S:
|
|
|
+ index = LEGEND_ASCII_DIRS + 5;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_W:
|
|
|
+ index = LEGEND_ASCII_DIRS + 6;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_W+MAP_EXIT_N:
|
|
|
+ index = LEGEND_ASCII_DIRS + 7;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ index = LEGEND_ASCII_MISC + 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ index = LEGEND_ASCII_MISC + 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- for (vnum = 0 ; vnum < ses->map->size ; vnum++)
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS))
|
|
|
{
|
|
|
- if (match_room(ses, vnum, ses->map->search))
|
|
|
- {
|
|
|
- room = ses->map->room_list[vnum];
|
|
|
+ struct room_data *room_n, *room_nw, *room_w;
|
|
|
+ long long exit_n, exit_nw, exit_w;
|
|
|
|
|
|
- if (*var)
|
|
|
+ if (room)
|
|
|
+ {
|
|
|
+ if (HAS_BIT(room->flags, ROOM_FLAG_CURVED))
|
|
|
{
|
|
|
- add_nest_node(ses->list[LIST_VARIABLE], var, "{%d} {{distance}{%.3f}{x}{%d}{y}{%d}{z}{%d}}", room->vnum, ses->map->search->stamp == room->search_stamp ? room->length : -1, room->x, room->y, room->z);
|
|
|
+ sprintf(room_left, "%s%s", room_color, ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_RL_CURVED]);
|
|
|
+ sprintf(room_right, "%s%s", room_color, ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_RR_CURVED]);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if (ses->map->search->stamp == room->search_stamp)
|
|
|
- {
|
|
|
- if (room->w == 0)
|
|
|
- {
|
|
|
- tintin_printf2(ses, "vnum: %5d dist: %8.3f x: %4d y: %4d z: %4d name: %s", room->vnum, room->length, room->x, room->y, room->z, room->name);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tintin_printf2(ses, "vnum: %5d dist: %8.3f x: %4s y: %4s z: %4s name: %s", room->vnum, room->length, "?", "?", "?", room->name);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tintin_printf2(ses, "vnum: %5d dist: %8.8s x: ? y: ? z: ? name: %s", room->vnum, "-1", room->name);
|
|
|
- }
|
|
|
+
|
|
|
+ sprintf(room_left, "%s%s", room_color, ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_RL]);
|
|
|
+ sprintf(room_right, "%s%s", room_color, ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_RR]);
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-}
|
|
|
+ room_n = ses->map->grid_rooms[x + 0 + map_grid_x * (y + 1)];
|
|
|
+ room_nw = ses->map->grid_rooms[x - 1 + map_grid_x * (y + 1)];
|
|
|
+ room_w = ses->map->grid_rooms[x - 1 + map_grid_x * (y + 0)];
|
|
|
|
|
|
-DO_MAP(map_map)
|
|
|
-{
|
|
|
- char arg3[BUFFER_SIZE], arg4[BUFFER_SIZE];
|
|
|
- FILE *logfile = NULL;
|
|
|
- int x, y, line, row;
|
|
|
+ exit_n = exit_nw = exit_w = 0;
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg4, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ if (room_nw && room_nw->exit_grid[EXIT_GRID_SE])
|
|
|
+ {
|
|
|
+ SET_BIT(exit_nw, UNICODE_DIR_SE);
|
|
|
+ }
|
|
|
|
|
|
- push_call("map_map(%p,%p)",ses,arg);
|
|
|
+ if (room_w && room_w->exit_grid[EXIT_GRID_NE])
|
|
|
+ {
|
|
|
+ SET_BIT(exit_nw, UNICODE_DIR_NE);
|
|
|
+ }
|
|
|
|
|
|
- if (is_math(ses, arg1))
|
|
|
- {
|
|
|
- map_grid_y = get_number(ses, arg1);
|
|
|
+ if (room_n && room_n->exit_grid[EXIT_GRID_SW])
|
|
|
+ {
|
|
|
+ SET_BIT(exit_nw, UNICODE_DIR_SW);
|
|
|
+ }
|
|
|
|
|
|
- if (map_grid_y <= 0)
|
|
|
+ if (room && HAS_BIT(room->exit_dirs, MAP_DIR_NW))
|
|
|
{
|
|
|
- map_grid_y = UMAX(0, get_scroll_rows(ses) + map_grid_y);
|
|
|
+ SET_BIT(exit_nw, UNICODE_DIR_NW);
|
|
|
}
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- map_grid_y = get_scroll_rows(ses);
|
|
|
- }
|
|
|
|
|
|
- if (is_math(ses, arg2))
|
|
|
- {
|
|
|
- map_grid_x = get_number(ses, arg2);
|
|
|
|
|
|
- if (map_grid_x <= 0)
|
|
|
+ if (room_n && HAS_BIT(room_n->exit_dirs, MAP_DIR_D))
|
|
|
{
|
|
|
- map_grid_x = UMAX(0, gtd->screen->cols + map_grid_x);
|
|
|
+ SET_BIT(exit_n, MAP_DIR_D);
|
|
|
}
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- map_grid_x = get_scroll_cols(ses);
|
|
|
- }
|
|
|
|
|
|
- if (*arg3)
|
|
|
- {
|
|
|
- switch (*arg3)
|
|
|
+ if (room && room->exit_grid[EXIT_GRID_N])
|
|
|
{
|
|
|
- case 'a':
|
|
|
- case 'A':
|
|
|
-
|
|
|
- strcpy(arg3, "APPEND");
|
|
|
+ SET_BIT(exit_n, MAP_DIR_N);
|
|
|
+ }
|
|
|
|
|
|
- logfile = fopen(arg4, "a");
|
|
|
+ if (room_n && room_n->exit_grid[EXIT_GRID_S])
|
|
|
+ {
|
|
|
+ SET_BIT(exit_n, MAP_DIR_S);
|
|
|
+ }
|
|
|
|
|
|
- loginit(ses, logfile, LOG_FLAG_APPEND | HAS_BIT(ses->logmode, LOG_FLAG_HTML));
|
|
|
+ if (room && room->exit_grid[EXIT_GRID_W])
|
|
|
+ {
|
|
|
+ SET_BIT(exit_w, UNICODE_DIR_W);
|
|
|
+ }
|
|
|
|
|
|
- break;
|
|
|
+ if (room_w && room_w->exit_grid[EXIT_GRID_E])
|
|
|
+ {
|
|
|
+ SET_BIT(exit_w, UNICODE_DIR_E);
|
|
|
+ }
|
|
|
|
|
|
- case 'd':
|
|
|
- case 'D':
|
|
|
- strcpy(arg3, "DRAW");
|
|
|
+ sprintf(buf, "%s", ses->map->color[MAP_COLOR_EXIT]);
|
|
|
|
|
|
- if (*arg4 == 0)
|
|
|
+ switch (line)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ switch (exit_nw)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP MAP {%s} {%s} {%s} {square}", arg1, arg2, arg3);
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
- }
|
|
|
- break;
|
|
|
+ case 0:
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 1, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 2, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ break;
|
|
|
|
|
|
- case 'o':
|
|
|
- case 'O':
|
|
|
- strcpy(arg3, "OVERWRITE");
|
|
|
+ case UNICODE_DIR_SE:
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, 0, room_nw->exit_grid[EXIT_GRID_SE]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_SE]);
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 2, x, y, flags));
|
|
|
+ break;
|
|
|
+ case UNICODE_DIR_NE:
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, 0, room_w->exit_grid[EXIT_GRID_NE]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_NE]);
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 2, x, y, flags));
|
|
|
+ break;
|
|
|
+ case UNICODE_DIR_SE|UNICODE_DIR_NE:
|
|
|
+ cat_sprintf(buf, "%s%s", room_nw->length < room_w->length ? get_exit_color(ses, 0, room_nw->exit_grid[EXIT_GRID_SE]) : get_exit_color(ses, 0, room_w->exit_grid[EXIT_GRID_NE]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_SE + UNICODE_DIR_NE]);
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 2, x, y, flags));
|
|
|
+ break;
|
|
|
|
|
|
- logfile = fopen(arg4, "w");
|
|
|
+ case UNICODE_DIR_SE|UNICODE_DIR_NW:
|
|
|
+ cat_sprintf(buf, "%s%s", room_nw->length < room->length ? get_exit_color(ses, 0, room_nw->exit_grid[EXIT_GRID_SE]) : get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_NW]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_SE + UNICODE_DIR_NW]);
|
|
|
+ break;
|
|
|
|
|
|
- loginit(ses, logfile, LOG_FLAG_OVERWRITE | HAS_BIT(ses->logmode, LOG_FLAG_HTML));
|
|
|
+ case UNICODE_DIR_NE|UNICODE_DIR_SW:
|
|
|
+ cat_sprintf(buf, "%s%s", room_w->length < room_n->length ? get_exit_color(ses, 0, room_w->exit_grid[EXIT_GRID_NE]) : get_exit_color(ses, 0, room_n->exit_grid[EXIT_GRID_SW]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_NE + UNICODE_DIR_SW]);
|
|
|
+ break;
|
|
|
+//
|
|
|
+ case UNICODE_DIR_NE|UNICODE_DIR_NW:
|
|
|
+ cat_sprintf(buf, "%s%s%s%s", get_exit_color(ses, 0, room_w->exit_grid[EXIT_GRID_NE]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_NE], get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_NW]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_NW]);
|
|
|
+ break;
|
|
|
|
|
|
- break;
|
|
|
+ case UNICODE_DIR_NE|UNICODE_DIR_SW|UNICODE_DIR_NW:
|
|
|
+ cat_sprintf(buf, "%s%s%s%s", get_exit_color(ses, 0, room_w->exit_grid[EXIT_GRID_NE]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_NE], room_n->length < room->length ? get_exit_color(ses, 0, room_n->exit_grid[EXIT_GRID_SW]) : get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_NW]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_NW + UNICODE_DIR_SW]);
|
|
|
+ break;
|
|
|
|
|
|
- case 'l':
|
|
|
- case 'L':
|
|
|
- strcpy(arg3, "LIST");
|
|
|
- break;
|
|
|
+ case UNICODE_DIR_SE|UNICODE_DIR_SW:
|
|
|
+ cat_sprintf(buf, "%s%s%s%s", get_exit_color(ses, 0, room_nw->exit_grid[EXIT_GRID_SE]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_SE], get_exit_color(ses, 0, room_n->exit_grid[EXIT_GRID_SW]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_SW]);
|
|
|
+ break;
|
|
|
|
|
|
- case 'v':
|
|
|
- case 'V':
|
|
|
- strcpy(arg3, "VARIABLE");
|
|
|
- break;
|
|
|
+ case UNICODE_DIR_SE|UNICODE_DIR_SW|UNICODE_DIR_NW:
|
|
|
+ cat_sprintf(buf, "%s%s%s%s", get_exit_color(ses, 0, room_nw->exit_grid[EXIT_GRID_SE]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_SE], room_n->length < room->length ? get_exit_color(ses, 0, room_n->exit_grid[EXIT_GRID_SW]) : get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_NW]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_NW + UNICODE_DIR_SW]);
|
|
|
+ break;
|
|
|
|
|
|
- default:
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP MAP {rows} {cols} {append|overwrite|list|variable} {name}");
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
- }
|
|
|
+ case UNICODE_DIR_SE|UNICODE_DIR_NE|UNICODE_DIR_SW:
|
|
|
+ cat_sprintf(buf, "%s%s%s%s", room_nw->length < room_w->length ? get_exit_color(ses, 0, room_nw->exit_grid[EXIT_GRID_SE]) : get_exit_color(ses, 0, room_w->exit_grid[EXIT_GRID_NE]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_SE + UNICODE_DIR_NE], get_exit_color(ses, 0, room_n->exit_grid[EXIT_GRID_SW]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_SW]);
|
|
|
+ break;
|
|
|
|
|
|
- if (*arg4 == 0)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP MAP {%s} {%s} {%s} {name}", arg1, arg2, arg3);
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
+ case UNICODE_DIR_SE|UNICODE_DIR_NE|UNICODE_DIR_NW:
|
|
|
+ cat_sprintf(buf, "%s%s%s%s", room_nw->length < room_w->length ? get_exit_color(ses, 0, room_nw->exit_grid[EXIT_GRID_SE]) : get_exit_color(ses, 0, room_w->exit_grid[EXIT_GRID_NE]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_SE + UNICODE_DIR_NE], get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_NW]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_NW]);
|
|
|
+ break;
|
|
|
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
- {
|
|
|
- map_grid_y = 2 + map_grid_y / 3;
|
|
|
- map_grid_x = 2 + map_grid_x / 6;
|
|
|
- }
|
|
|
- else if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS))
|
|
|
- {
|
|
|
- map_grid_y = 2 + map_grid_y / 2;
|
|
|
- map_grid_x = 2 + map_grid_x / 5;
|
|
|
- }
|
|
|
- else if (HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS))
|
|
|
- {
|
|
|
- map_grid_y = 2 + map_grid_y / 2;
|
|
|
- map_grid_x = 2 + map_grid_x / 5;
|
|
|
- }
|
|
|
- else if (HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT))
|
|
|
- {
|
|
|
- map_grid_y = 2 + map_grid_y / 1;
|
|
|
- map_grid_x = 2 + map_grid_x / 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- map_grid_y = 2 + map_grid_y;
|
|
|
- map_grid_x = 2 + map_grid_x;
|
|
|
- }
|
|
|
+ case UNICODE_DIR_SW:
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 1, x, y, flags));
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, 0, room_n->exit_grid[EXIT_GRID_SW]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_SW]);
|
|
|
+ break;
|
|
|
|
|
|
- if (map_grid_x > ses->map->max_grid_x || map_grid_y > ses->map->max_grid_y)
|
|
|
- {
|
|
|
- if (map_grid_x > ses->map->max_grid_x)
|
|
|
- {
|
|
|
- ses->map->max_grid_x = map_grid_x + 1;
|
|
|
- }
|
|
|
- if (map_grid_y > ses->map->max_grid_y)
|
|
|
- {
|
|
|
- ses->map->max_grid_y = map_grid_y + 1;
|
|
|
- }
|
|
|
+ case UNICODE_DIR_NW:
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 1, x, y, flags));
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_NW]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_NW]);
|
|
|
+ break;
|
|
|
|
|
|
- ses->map->grid_rooms = (struct room_data **) realloc(ses->map->grid_rooms, ses->map->max_grid_x * ses->map->max_grid_y * sizeof(struct room_data *));
|
|
|
- ses->map->grid_flags = (int *) realloc(ses->map->grid_flags, ses->map->max_grid_x * ses->map->max_grid_y * sizeof(int));
|
|
|
- }
|
|
|
-
|
|
|
- displaygrid_build(ses, ses->map->in_room, map_grid_x, map_grid_y, 0);
|
|
|
-
|
|
|
- *arg1 = row = 0;
|
|
|
-
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
- {
|
|
|
- for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
- {
|
|
|
- for (line = 1 ; line <= 3 ; line++)
|
|
|
- {
|
|
|
- str_cpy(>d->buf, ses->map->color[MAP_COLOR_BACK]);
|
|
|
+ case UNICODE_DIR_SW|UNICODE_DIR_NW:
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 1, x, y, flags));
|
|
|
+ cat_sprintf(buf, "%s%s", room_n->length < room->length ? get_exit_color(ses, 0, room_n->exit_grid[EXIT_GRID_SW]) : get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_NW]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_SW + UNICODE_DIR_NW]);
|
|
|
+ break;
|
|
|
|
|
|
- for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
- {
|
|
|
- str_cat(>d->buf, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], line, x, y));
|
|
|
+ case UNICODE_DIR_NW|UNICODE_DIR_SE|UNICODE_DIR_NE|UNICODE_DIR_SW:
|
|
|
+// cat_sprintf(buf, "ᐳᐸ");
|
|
|
+ cat_sprintf(buf, "%s%s%s%s", room_nw->length < room_w->length ? get_exit_color(ses, 0, room_nw->exit_grid[EXIT_GRID_SE]) : get_exit_color(ses, 0, room_w->exit_grid[EXIT_GRID_NE]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_SE + UNICODE_DIR_NE], room_n->length < room->length ? get_exit_color(ses, 0, room_n->exit_grid[EXIT_GRID_SW]) : get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_NW]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_NW + UNICODE_DIR_SW]);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ cat_sprintf(buf, "??");
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
- str_clone(>d->out, gtd->buf);
|
|
|
-
|
|
|
- substitute(ses, gtd->buf, gtd->out, SUB_COL|SUB_CMP|SUB_LIT);
|
|
|
-
|
|
|
- if (logfile)
|
|
|
+ if (!HAS_BIT(exit_n, MAP_DIR_D) && !HAS_BIT(exit_n, MAP_DIR_N|MAP_DIR_S))
|
|
|
{
|
|
|
- logit(ses, gtd->out, logfile, LOG_FLAG_LINEFEED);
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 3, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 4, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
}
|
|
|
- else if (*arg3 == 'L')
|
|
|
+ else
|
|
|
{
|
|
|
- cat_sprintf(arg1, "{%02d}{%s}", ++row, gtd->out);
|
|
|
+ if (HAS_BIT(exit_n, MAP_DIR_D))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, 0, room_n->exit_grid[EXIT_GRID_D]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_D]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 3, x, y, flags));
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (HAS_BIT(exit_n, MAP_DIR_N|MAP_DIR_S))
|
|
|
+ {
|
|
|
+ case MAP_DIR_N:
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_N]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_N]);
|
|
|
+ break;
|
|
|
+ case MAP_DIR_S:
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, 0, room_n->exit_grid[EXIT_GRID_S]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_S]);
|
|
|
+ break;
|
|
|
+ case MAP_DIR_N|MAP_DIR_S:
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_N]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_NS]);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 4, x, y, flags));
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
- else if (*arg3 == 'V' || *arg3 == 'D')
|
|
|
+
|
|
|
+ if (room && room->exit_grid[EXIT_GRID_U])
|
|
|
{
|
|
|
- cat_sprintf(arg1, "%s\n", gtd->out);
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_U]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_U]);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- tintin_puts2(ses, gtd->out);
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 5, x, y, flags));
|
|
|
}
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS) || HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS))
|
|
|
- {
|
|
|
- for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
- {
|
|
|
- for (line = 1 ; line <= 2 ; line++)
|
|
|
- {
|
|
|
- str_cpy(>d->buf, ses->map->color[MAP_COLOR_BACK]);
|
|
|
+ break;
|
|
|
|
|
|
- for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
+ case 2:
|
|
|
+ buf[0] = 0;
|
|
|
+
|
|
|
+ if (room == NULL || room->vnum == 0)
|
|
|
{
|
|
|
- str_cat(>d->buf, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], line, x, y));
|
|
|
- }
|
|
|
+ if (HAS_BIT(exit_w, MAP_DIR_W))
|
|
|
+ {
|
|
|
+ sprintf(buf, "%s%s%s",
|
|
|
+ get_exit_color(ses, 0, room_w->exit_grid[EXIT_GRID_E]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_E],
|
|
|
+ draw_terrain_symbol(ses, room, line, 2, x, y, flags));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 1, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 2, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ }
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 3, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 4, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
|
|
|
- str_clone(>d->out, gtd->buf);
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 5, x, y, flags));
|
|
|
|
|
|
- substitute(ses, gtd->buf, gtd->out, SUB_COL|SUB_CMP|SUB_LIT);
|
|
|
+ pop_call();
|
|
|
+ return buf;
|
|
|
+ }
|
|
|
|
|
|
- if (logfile)
|
|
|
+ switch (exit_w)
|
|
|
{
|
|
|
- fprintf(logfile, "%s\n", gtd->out);
|
|
|
+ case 0:
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 1, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 2, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ break;
|
|
|
+ case UNICODE_DIR_E:
|
|
|
+ sprintf(buf, "%s%s%s", get_exit_color(ses, 0, room_w->exit_grid[EXIT_GRID_E]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_E], draw_terrain_symbol(ses, room, line, 2, x, y, flags));
|
|
|
+ break;
|
|
|
+ case UNICODE_DIR_W:
|
|
|
+ sprintf(buf, "%s%s%s", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_W]), draw_terrain_symbol(ses, room, line, 1, x, y, flags), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_W]);
|
|
|
+ break;
|
|
|
+ case UNICODE_DIR_E|UNICODE_DIR_W:
|
|
|
+ if (room->exit_grid[EXIT_GRID_W]->vnum == room_w->vnum && room_w->exit_grid[EXIT_GRID_E]->vnum == room->vnum)
|
|
|
+ {
|
|
|
+ // ‒‒
|
|
|
+ sprintf(buf, "%s%s%s%s", get_exit_color(ses, 0, room_w->exit_grid[EXIT_GRID_E]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_EW], get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_W]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_EW]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(buf, "%s%s%s%s", get_exit_color(ses, 0, room_w->exit_grid[EXIT_GRID_E]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_E], get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_W]), ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_W]);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ strcat(buf, "??");
|
|
|
+ break;
|
|
|
}
|
|
|
- else if (*arg3 == 'L')
|
|
|
+
|
|
|
+ if (room->vnum == ses->map->in_room)
|
|
|
{
|
|
|
- cat_sprintf(arg1, "{%02d}{%s\e[0m}", ++row, gtd->out);
|
|
|
+ cat_sprintf(buf, "%s%s%s%s", room_left, ses->map->color[MAP_COLOR_USER], ses->map->legend[offset + index], room_right);
|
|
|
}
|
|
|
- else if (*arg3 == 'V' || *arg3 == 'D')
|
|
|
+ else if (symsize > 3)
|
|
|
{
|
|
|
- cat_sprintf(arg1, "%s\e[0m\n", gtd->out);
|
|
|
+ cat_sprintf(buf, "%s%-3s", ses->map->color[MAP_COLOR_SYMBOL], room->symbol);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- tintin_puts2(ses, gtd->out);
|
|
|
+ if (symsize > 1)
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%-3s", ses->map->color[MAP_COLOR_SYMBOL], room->symbol);
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->flags, ROOM_FLAG_VOID))
|
|
|
+ {
|
|
|
+ if (HAS_BIT(room->exit_dirs, MAP_DIR_W))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s─", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_W]));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*room->symbol != ' ' && symsize == 1)
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%-1s", ses->map->color[MAP_COLOR_SYMBOL], room->symbol);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (HAS_BIT(room->exit_dirs, MAP_DIR_N|MAP_DIR_E|MAP_DIR_S|MAP_DIR_W) == (MAP_DIR_N|MAP_DIR_E|MAP_DIR_S|MAP_DIR_W))
|
|
|
+ {
|
|
|
+ if (get_exit_length(ses, room->exit_grid[EXIT_GRID_N]) < get_exit_length(ses, room->exit_grid[EXIT_GRID_W]))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s│", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_N]));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s─", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_W]));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->exit_dirs, MAP_DIR_E|MAP_DIR_W) == (MAP_DIR_E|MAP_DIR_W))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s─", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_W]));
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->exit_dirs, MAP_DIR_N|MAP_DIR_S) == (MAP_DIR_N|MAP_DIR_S))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s│", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_N]));
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->exit_dirs, MAP_DIR_N|MAP_DIR_E|MAP_DIR_S|MAP_DIR_W|MAP_DIR_NW|MAP_DIR_NE|MAP_DIR_SE|MAP_DIR_SW) == (MAP_DIR_S))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s│", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_S]));
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->exit_dirs, MAP_DIR_N|MAP_DIR_E|MAP_DIR_S|MAP_DIR_W|MAP_DIR_NW|MAP_DIR_NE|MAP_DIR_SE|MAP_DIR_SW) == (MAP_DIR_N))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s│", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_N]));
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->exit_dirs, MAP_DIR_N|MAP_DIR_E|MAP_DIR_S|MAP_DIR_W|MAP_DIR_NW|MAP_DIR_NE|MAP_DIR_SE|MAP_DIR_SW) == (MAP_DIR_E))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s─", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_E]));
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->exit_dirs, MAP_DIR_N|MAP_DIR_E|MAP_DIR_S|MAP_DIR_W|MAP_DIR_NW|MAP_DIR_NE|MAP_DIR_SE|MAP_DIR_SW) == (MAP_DIR_W))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s─", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_W]));
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->exit_dirs, MAP_DIR_N|MAP_DIR_E|MAP_DIR_S|MAP_DIR_W|MAP_DIR_NW|MAP_DIR_NE|MAP_DIR_SE|MAP_DIR_SW) == (MAP_DIR_N|MAP_DIR_E|MAP_DIR_W))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s├", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_N]));
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->exit_dirs, MAP_DIR_N|MAP_DIR_E|MAP_DIR_S|MAP_DIR_W|MAP_DIR_NW|MAP_DIR_NE|MAP_DIR_SE|MAP_DIR_SW) == (MAP_DIR_S|MAP_DIR_E|MAP_DIR_W))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s┬", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_E]));
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->exit_dirs, MAP_DIR_NW|MAP_DIR_SW) && HAS_BIT(room->exit_dirs, MAP_DIR_E))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s─", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_E]));
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->exit_dirs, MAP_DIR_NE))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s╴", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_NE]));
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->exit_dirs, MAP_DIR_SE))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s╴", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_SE]));
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->exit_dirs, MAP_DIR_SW))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s╴", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_SW]));
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->exit_dirs, MAP_DIR_NW))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s╴", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_NW]));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, " ");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (HAS_BIT(room->exit_dirs, MAP_DIR_E))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s─", get_exit_color(ses, 0, room->exit_grid[EXIT_GRID_E]));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, " ");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%s%-1s%s", room_left, ses->map->color[MAP_COLOR_SYMBOL], room->symbol, room_right);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
+ cat_sprintf(buf, "%s", ses->map->color[MAP_COLOR_BACK]);
|
|
|
+
|
|
|
+ break;
|
|
|
}
|
|
|
+ pop_call();
|
|
|
+ return buf;
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
- {
|
|
|
- str_cpy(>d->buf, ses->map->color[MAP_COLOR_BACK]);
|
|
|
|
|
|
- for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
- {
|
|
|
- str_cat(>d->buf, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], 0, x, y));
|
|
|
- }
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS))
|
|
|
+ {
|
|
|
+ struct room_data *room_w;
|
|
|
+ long long exit_w;
|
|
|
|
|
|
- substitute(ses, gtd->buf, gtd->out, SUB_COL|SUB_CMP|SUB_LIT);
|
|
|
+ room_w = ses->map->grid_rooms[x - 1 + map_grid_x * (y + 0)];
|
|
|
+ exit_w = 0;
|
|
|
|
|
|
- if (logfile)
|
|
|
- {
|
|
|
- fprintf(logfile, "%s\n", gtd->out);
|
|
|
- }
|
|
|
- else if (*arg3 == 'L')
|
|
|
- {
|
|
|
- cat_sprintf(arg1, "{%02d}{%s}", ++row, gtd->out);
|
|
|
- }
|
|
|
- else if (*arg3 == 'V' || *arg3 == 'D')
|
|
|
+ if (room_w)
|
|
|
+ {
|
|
|
+ if (HAS_BIT(room_w->exit_dirs, MAP_DIR_E))
|
|
|
{
|
|
|
- cat_sprintf(arg1, "%s\n", gtd->out);
|
|
|
+ SET_BIT(exit_w, MAP_DIR_E);
|
|
|
}
|
|
|
- else
|
|
|
+ if (HAS_BIT(room_w->exit_dirs, MAP_DIR_U))
|
|
|
{
|
|
|
- tintin_puts2(ses, gtd->out);
|
|
|
+ SET_BIT(exit_w, MAP_DIR_U);
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- if (logfile)
|
|
|
- {
|
|
|
- fclose(logfile);
|
|
|
- }
|
|
|
- else if (*arg3 == 'D')
|
|
|
- {
|
|
|
- draw_map(ses, 1, 2, 3, 4, 5, 6, 7, "", arg4, arg2, arg1);
|
|
|
- }
|
|
|
- else if (*arg3 == 'L')
|
|
|
- {
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg4, "%s", arg1);
|
|
|
- }
|
|
|
- else if (*arg3 == 'V')
|
|
|
- {
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg4, "%s", arg1);
|
|
|
- }
|
|
|
-
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
-}
|
|
|
|
|
|
-DO_MAP(map_move)
|
|
|
-{
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ sprintf(buf, "%s", room_color);
|
|
|
|
|
|
- arg = arg1;
|
|
|
+ switch (line)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ switch (exit_w)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ strcat(buf, " ");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_E:
|
|
|
+ strcat(buf, "═");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_E|MAP_DIR_U:
|
|
|
+ strcat(buf, "═̂");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_U:
|
|
|
+ strcat(buf, " ̂");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ strcat(buf, "?");
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- while (*arg)
|
|
|
- {
|
|
|
- arg = get_arg_in_braces(ses, arg, arg2, GET_ALL);
|
|
|
+ if (room == NULL)
|
|
|
+ {
|
|
|
+ strcat(buf, " ");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_W) ? "═" : " ");
|
|
|
|
|
|
- ses->map->nofollow++;
|
|
|
+ if (room->vnum == ses->map->in_room)
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s", ses->map->color[MAP_COLOR_USER]);
|
|
|
+ }
|
|
|
|
|
|
- follow_map(ses, arg2);
|
|
|
-
|
|
|
- ses->map->nofollow--;
|
|
|
-
|
|
|
- if (*arg == COMMAND_SEPARATOR)
|
|
|
- {
|
|
|
- arg++;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-DO_MAP(map_name)
|
|
|
-{
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
-
|
|
|
- RESTRING(ses->map->room_list[ses->map->in_room]->name, arg1);
|
|
|
-}
|
|
|
-
|
|
|
-DO_MAP(map_offset)
|
|
|
-{
|
|
|
- char arg3[BUFFER_SIZE], arg4[BUFFER_SIZE];
|
|
|
-
|
|
|
- if (arg)
|
|
|
- {
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg4, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
-
|
|
|
- ses->map->sav_top_row = get_number(ses, arg1);
|
|
|
- ses->map->sav_top_col = get_number(ses, arg2);
|
|
|
- ses->map->sav_bot_row = get_number(ses, arg3);
|
|
|
- ses->map->sav_bot_col = get_number(ses, arg4);
|
|
|
- }
|
|
|
+ switch (HAS_BIT(room->exit_dirs, MAP_DIR_N|MAP_DIR_W))
|
|
|
+ {
|
|
|
+ case MAP_DIR_N:
|
|
|
+ strcat(buf, "║");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_W:
|
|
|
+ strcat(buf, "═");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_N|MAP_DIR_W:
|
|
|
+ strcat(buf, "╝");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ strcat(buf, "╔");
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- if (ses->map->sav_top_row == 0)
|
|
|
- {
|
|
|
- ses->map->top_row = 1;
|
|
|
- }
|
|
|
- else if (ses->map->sav_top_row < 0)
|
|
|
- {
|
|
|
- ses->map->top_row = 1 + gtd->screen->rows + ses->map->sav_top_row;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ses->map->top_row = ses->map->sav_top_row;
|
|
|
- }
|
|
|
|
|
|
- if (ses->map->sav_top_col == 0)
|
|
|
- {
|
|
|
- ses->map->top_col = 1;
|
|
|
- }
|
|
|
- else if (ses->map->sav_top_col < 0)
|
|
|
- {
|
|
|
- ses->map->top_col = 1 + gtd->screen->cols + ses->map->sav_top_col;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ses->map->top_col = ses->map->sav_top_col;
|
|
|
- }
|
|
|
+ strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_N) ? " " : "═");
|
|
|
|
|
|
- if (ses->map->sav_bot_row == 0)
|
|
|
- {
|
|
|
- ses->map->bot_row = ses->split->top_row - 1;
|
|
|
- }
|
|
|
- else if (ses->map->sav_bot_row < 0)
|
|
|
- {
|
|
|
- ses->map->bot_row = 1 + gtd->screen->rows + ses->map->sav_bot_row;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ses->map->bot_row = ses->map->sav_bot_row;
|
|
|
- }
|
|
|
|
|
|
- if (ses->map->sav_bot_col == 0)
|
|
|
- {
|
|
|
- ses->map->bot_col = gtd->screen->cols;
|
|
|
- }
|
|
|
- else if (ses->map->sav_bot_col < 0)
|
|
|
- {
|
|
|
- ses->map->bot_col = 1 + gtd->screen->cols + ses->map->sav_bot_col;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ses->map->bot_col = ses->map->sav_bot_col;
|
|
|
- }
|
|
|
+ switch (HAS_BIT(room->exit_dirs, MAP_DIR_N|MAP_DIR_E))
|
|
|
+ {
|
|
|
+ case MAP_DIR_N:
|
|
|
+ strcat(buf, "║");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_E:
|
|
|
+ strcat(buf, "═");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_N|MAP_DIR_E:
|
|
|
+ strcat(buf, "╚");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ strcat(buf, "╗");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
|
|
|
- ses->map->rows = ses->map->bot_row - ses->map->top_row;
|
|
|
- ses->map->cols = ses->map->bot_col - ses->map->top_col;
|
|
|
+ case 2:
|
|
|
+ switch (exit_w)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ strcat(buf, " ");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_E:
|
|
|
+ strcat(buf, "═");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_E|MAP_DIR_U:
|
|
|
+ strcat(buf, "═");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ strcat(buf, " ");
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- if (arg)
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP OFFSET: SQUARE {%d, %d, %d, %d} ROWS {%d} COLS {%d}", ses->map->top_row, ses->map->top_col, ses->map->bot_row, ses->map->bot_col, ses->map->rows, ses->map->cols);
|
|
|
- }
|
|
|
-}
|
|
|
+ if (room == NULL)
|
|
|
+ {
|
|
|
+ strcat(buf, " ");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ switch (HAS_BIT(room->exit_dirs, MAP_DIR_W|MAP_DIR_D))
|
|
|
+ {
|
|
|
+ case MAP_DIR_W:
|
|
|
+ strcat(buf, "═");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_W|MAP_DIR_D:
|
|
|
+ strcat(buf, "═̬");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_D:
|
|
|
+ strcat(buf, " ̬");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ strcat(buf, " ");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
-DO_MAP(map_read)
|
|
|
-{
|
|
|
- FILE *myfile;
|
|
|
- struct exit_data *exit;
|
|
|
- char buffer[BUFFER_SIZE], file[BUFFER_SIZE], *cptr;
|
|
|
- int line = 1, room = 0;
|
|
|
+ if (room == NULL)
|
|
|
+ {
|
|
|
+ strcat(buf, " ");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (room->vnum == ses->map->in_room)
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s", ses->map->color[MAP_COLOR_USER]);
|
|
|
+ }
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, file, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ switch (HAS_BIT(room->exit_dirs, MAP_DIR_S|MAP_DIR_W))
|
|
|
+ {
|
|
|
+ case MAP_DIR_S:
|
|
|
+ strcat(buf, "║");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_W:
|
|
|
+ strcat(buf, "═");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_S|MAP_DIR_W:
|
|
|
+ strcat(buf, "╗");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ strcat(buf, "╚");
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- if ((myfile = fopen(file, "r")) == NULL)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: Map file {%s} not found.", file);
|
|
|
+ strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_S) ? " " : "═");
|
|
|
|
|
|
- return;
|
|
|
+ switch (HAS_BIT(room->exit_dirs, MAP_DIR_S|MAP_DIR_E))
|
|
|
+ {
|
|
|
+ case MAP_DIR_S:
|
|
|
+ strcat(buf, "║");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_E:
|
|
|
+ strcat(buf, "═");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_S|MAP_DIR_E:
|
|
|
+ strcat(buf, "╔");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ strcat(buf, "╝");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ pop_call();
|
|
|
+ return buf;
|
|
|
}
|
|
|
|
|
|
- gtd->level->quiet++;
|
|
|
-
|
|
|
- if (fgets(buffer, BUFFER_SIZE - 1, myfile))
|
|
|
+ if (room == NULL || room->vnum == 0)
|
|
|
{
|
|
|
- cptr = strchr(buffer, '\r'); /* For map files editor on Windows systems. */
|
|
|
-
|
|
|
- if (cptr)
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
{
|
|
|
- *cptr = 0;
|
|
|
- }
|
|
|
-
|
|
|
- cptr = strchr(buffer, '\n');
|
|
|
+ strcpy(buf, "");
|
|
|
|
|
|
- if (cptr)
|
|
|
- {
|
|
|
- *cptr = 0;
|
|
|
+ for (index = 1 ; index <= 6 ; index++)
|
|
|
+ {
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, index, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- if (buffer[0] == 'C' && buffer[1] == ' ')
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT))
|
|
|
{
|
|
|
- create_map(ses, buffer + 2);
|
|
|
+ sprintf(buf, " ");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- gtd->level->quiet--;
|
|
|
-
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP READ {%s}: INVALID START OF FILE. ABORTING READ..", file);
|
|
|
-
|
|
|
- fclose(myfile);
|
|
|
-
|
|
|
- return;
|
|
|
+ sprintf(buf, " ");
|
|
|
}
|
|
|
+ pop_call();
|
|
|
+ return buf;
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- gtd->level->quiet--;
|
|
|
-
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: INVALID READ ON LINE %d. ABORTING READ..", line);
|
|
|
|
|
|
- fclose(myfile);
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
|
|
|
- while (fgets(buffer, BUFFER_SIZE - 1, myfile))
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
{
|
|
|
- line++;
|
|
|
+ strcpy(buf, "");
|
|
|
|
|
|
- cptr = strchr(buffer, '\r'); /* For map files editor on Windows systems. */
|
|
|
-
|
|
|
- if (cptr)
|
|
|
- {
|
|
|
- *cptr = 0;
|
|
|
- }
|
|
|
-
|
|
|
- cptr = strchr(buffer, '\n');
|
|
|
-
|
|
|
- if (cptr)
|
|
|
- {
|
|
|
- *cptr = 0;
|
|
|
- }
|
|
|
-
|
|
|
- switch (buffer[0])
|
|
|
+ switch (line)
|
|
|
{
|
|
|
- case 'C':
|
|
|
- switch (buffer[1])
|
|
|
+ case 1:
|
|
|
+ if (room->exit_grid[EXIT_GRID_NW])
|
|
|
{
|
|
|
- case ' ':
|
|
|
- gtd->level->quiet--;
|
|
|
-
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: INVALID COMMAND {%d} {%s} ON LINE %d. ABORTING READ..", buffer[0], buffer, line);
|
|
|
-
|
|
|
- fclose(myfile);
|
|
|
-
|
|
|
- delete_map(ses);
|
|
|
-
|
|
|
- return;
|
|
|
-
|
|
|
- case 'A':
|
|
|
- case 'B':
|
|
|
- case 'E':
|
|
|
- case 'H':
|
|
|
- case 'I':
|
|
|
- case 'P':
|
|
|
- case 'R':
|
|
|
- case 'S':
|
|
|
- case 'U':
|
|
|
- map_color(ses, buffer + 1, arg1, arg2);
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP READ: INVALID COMMAND {%d} {%s} ON LINE %d. ABORTING READ..", buffer[0], buffer, line);
|
|
|
- break;
|
|
|
+ strcat(buf, get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_NW]));
|
|
|
+ strcat(buf, "\\");
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 2, x, y, flags));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 1, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 2, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
}
|
|
|
- break;
|
|
|
-
|
|
|
- case 'E':
|
|
|
- create_exit(ses, room, "%s", buffer + 2);
|
|
|
- break;
|
|
|
-
|
|
|
- case 'F':
|
|
|
- ses->map->flags = atoi(buffer + 2);
|
|
|
- break;
|
|
|
|
|
|
- case 'G':
|
|
|
- ses->map->global_vnum = ses->map->global_exit->vnum = atoi(buffer + 2);
|
|
|
- break;
|
|
|
+ if (room->exit_grid[EXIT_GRID_N] || room->exit_grid[EXIT_GRID_U])
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_N]), room->exit_grid[EXIT_GRID_N] ? "|" : draw_terrain_symbol(ses, room, line, 3, x, y, flags));
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_U]), room->exit_grid[EXIT_GRID_U] ? "+" : draw_terrain_symbol(ses, room, line, 4, x, y, flags));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 3, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 4, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ }
|
|
|
|
|
|
- case 'I':
|
|
|
- ses->map->last_room = atoi(buffer + 2);
|
|
|
+ if (room->exit_grid[EXIT_GRID_NE])
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%s%s", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_NE]), "/", draw_terrain_symbol(ses, room, line, 6, x, y, flags));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 5, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 6, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
- case 'L':
|
|
|
- map_legend(ses, buffer + 2, arg1, arg2);
|
|
|
- break;
|
|
|
+ case 2:
|
|
|
+ if (HAS_BIT(room->flags, ROOM_FLAG_CURVED))
|
|
|
+ {
|
|
|
+ sprintf(room_left, "%s%s", room_color, ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_RL_CURVED]);
|
|
|
+ sprintf(room_right, "%s%s", room_color, ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_RR_CURVED]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(room_left, "%s%s", room_color, ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_RL]);
|
|
|
+ sprintf(room_right, "%s%s", room_color, ses->map->legend[LEGEND_UNICODE_GRAPHICS + UNICODE_DIR_RR]);
|
|
|
+ }
|
|
|
|
|
|
- case 'R':
|
|
|
- room = create_room(ses, "%s", buffer + 2);
|
|
|
- break;
|
|
|
+ if (!HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS) && symsize <= 3)
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%s",
|
|
|
+ get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_W]),
|
|
|
+ room->exit_grid[EXIT_GRID_W] ? "-" : draw_terrain_symbol(ses, room, line, 1, x, y, flags));
|
|
|
+ }
|
|
|
|
|
|
- case 'V':
|
|
|
- ses->map->version = atoi(buffer + 2);
|
|
|
- break;
|
|
|
+ if (room->vnum == ses->map->in_room)
|
|
|
+ {
|
|
|
+ if (!HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%s%s%s", room_left, ses->map->color[MAP_COLOR_USER], ses->map->legend[index], room_right);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIILENGTH))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%5.1f", ses->map->color[MAP_COLOR_USER], room->length, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%05d", ses->map->color[MAP_COLOR_USER], room->vnum);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS))
|
|
|
+ {
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIILENGTH))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%5.1f%s", ses->map->color[MAP_COLOR_USER], room->length, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%05d%s", room_color, room->vnum, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (symsize > 3)
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%-5s", ses->map->color[MAP_COLOR_SYMBOL], room->symbol);
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(room->flags, ROOM_FLAG_VOID))
|
|
|
+ {
|
|
|
+ if (*room->symbol != ' ' && symsize == 1)
|
|
|
+ {
|
|
|
+ if (room->exit_dirs == (MAP_DIR_E|MAP_DIR_W))
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s-%s%s%s-", ses->map->color[MAP_COLOR_EXIT], ses->map->color[MAP_COLOR_SYMBOL], room->symbol, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s %-2s", ses->map->color[MAP_COLOR_SYMBOL], room->symbol);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (*room->symbol != ' ' && strip_color_strlen(ses, room->symbol) > 1)
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s %-2s", ses->map->color[MAP_COLOR_SYMBOL], room->symbol);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcat(buf, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
|
|
|
- case '#':
|
|
|
- buffer[0] = gtd->tintin_char;
|
|
|
- ses = script_driver(ses, LIST_COMMAND, buffer);
|
|
|
- break;
|
|
|
+ switch (room->exit_dirs)
|
|
|
+ {
|
|
|
+ case MAP_DIR_N|MAP_DIR_S:
|
|
|
+ cat_sprintf(buf, " | ");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_E|MAP_DIR_W:
|
|
|
+ cat_sprintf(buf, "---");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_NE|MAP_DIR_SW:
|
|
|
+ cat_sprintf(buf, " / ");
|
|
|
+ break;
|
|
|
+ case MAP_DIR_NW|MAP_DIR_SE:
|
|
|
+ cat_sprintf(buf, " \\ ");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ cat_sprintf(buf, " * ");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (strip_color_strlen(ses, room->symbol) <= 1)
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%s%-1s%s", room_left, ses->map->color[MAP_COLOR_SYMBOL], room->symbol, room_right);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%s%-3s", room_color, ses->map->color[MAP_COLOR_SYMBOL], room->symbol);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- case 0:
|
|
|
- case 13:
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS) || symsize > 3)
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_E]), room->exit_grid[EXIT_GRID_E] ? "-" : draw_terrain_symbol(ses, room, line, 6, x, y, flags));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (room->exit_grid[EXIT_GRID_E])
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s--", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_E]));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 5, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 6, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ }
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
- default:
|
|
|
- gtd->level->quiet--;
|
|
|
-
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: INVALID COMMAND {%d} {%s} ON LINE %d. ABORTING READ..", buffer[0], buffer, line);
|
|
|
-
|
|
|
- fclose(myfile);
|
|
|
-
|
|
|
- delete_map(ses);
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- gtd->level->quiet--;
|
|
|
-
|
|
|
- fclose(myfile);
|
|
|
-
|
|
|
- for (room = 0 ; room < ses->map->size ; room++)
|
|
|
- {
|
|
|
- if (ses->map->room_list[room] == NULL)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- for (exit = ses->map->room_list[room]->f_exit ; exit ; exit = exit->next)
|
|
|
- {
|
|
|
- if (exit->vnum < 0 || exit->vnum >= ses->map->size || ses->map->room_list[exit->vnum] == NULL)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP READ: Room %d - invalid exit '%s' to room %d.", room, exit->name, exit->vnum);
|
|
|
+ case 3:
|
|
|
+ if (room->exit_grid[EXIT_GRID_SW] || room->exit_grid[EXIT_GRID_D])
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_SW]), room->exit_grid[EXIT_GRID_SW] ? "/" : draw_terrain_symbol(ses, room, line, 1, x, y, flags));
|
|
|
+ cat_sprintf(buf, "%s%s", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_D]), room->exit_grid[EXIT_GRID_D] ? "-" : draw_terrain_symbol(ses, room, line, 2, x, y, flags));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 1, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 2, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ }
|
|
|
|
|
|
- delete_exit(ses, room, exit);
|
|
|
+ if (room->exit_grid[EXIT_GRID_S])
|
|
|
+ {
|
|
|
+ cat_sprintf(buf, "%s|%s", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_S]), draw_terrain_symbol(ses, room, line, 4, x, y, flags));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 3, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 4, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ }
|
|
|
|
|
|
- if (ses->map->room_list[room]->f_exit)
|
|
|
+ if (room->exit_grid[EXIT_GRID_SE])
|
|
|
{
|
|
|
- exit = ses->map->room_list[room]->f_exit;
|
|
|
+ cat_sprintf(buf, "%s\\%s", get_exit_color(ses, room->vnum, room->exit_grid[EXIT_GRID_SE]), draw_terrain_symbol(ses, room, line, 6, x, y, flags));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- break;
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 5, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
+ strcat(buf, draw_terrain_symbol(ses, room, line, 6, x, y, TERRAIN_FLAG_DOUBLE));
|
|
|
}
|
|
|
- }
|
|
|
+ break;
|
|
|
}
|
|
|
+ pop_call();
|
|
|
+ return buf;
|
|
|
}
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP READ: Map file {%s} loaded.", file);
|
|
|
-
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-DO_MAP(map_resize)
|
|
|
-{
|
|
|
- int size, vnum, room;
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ if (room->vnum == ses->map->in_room)
|
|
|
+ {
|
|
|
+ exits = ses->map->dir;
|
|
|
|
|
|
- size = atoi(arg1);
|
|
|
+ DEL_BIT(exits, MAP_EXIT_U|MAP_EXIT_D);
|
|
|
|
|
|
- if (size <= ses->map->size)
|
|
|
- {
|
|
|
- for (room = vnum = 1 ; vnum < ses->map->size ; vnum++)
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_DIRECTION))
|
|
|
{
|
|
|
- if (ses->map->room_list[vnum])
|
|
|
+ switch (exits)
|
|
|
{
|
|
|
- room = vnum;
|
|
|
+ case MAP_EXIT_N:
|
|
|
+ index = 24;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_N+MAP_EXIT_E:
|
|
|
+ index = 25;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_E:
|
|
|
+ index = 26;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_S+MAP_EXIT_E:
|
|
|
+ index = 27;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_S:
|
|
|
+ index = 28;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_S+MAP_EXIT_W:
|
|
|
+ index = 29;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_W:
|
|
|
+ index = 30;
|
|
|
+ break;
|
|
|
+ case MAP_EXIT_N+MAP_EXIT_W:
|
|
|
+ index = 31;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ index = 17;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- if (room >= size)
|
|
|
+ else
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP RESIZE: YOU MUST DELETE ALL ROOMS WITH VNUMS ABOVE (%d) FIRST.", size);
|
|
|
- return;
|
|
|
+ index = 16;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- ses->map->room_list = (struct room_data **) realloc(ses->map->room_list, size * sizeof(struct room_data *));
|
|
|
-
|
|
|
- if (ses->map->size < size)
|
|
|
- {
|
|
|
- while (ses->map->size < size)
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT))
|
|
|
{
|
|
|
- ses->map->room_list[ses->map->size++] = NULL;
|
|
|
+ sprintf(buf, "%s%s%s", ses->map->color[MAP_COLOR_USER], ses->map->legend[offset + index], ses->map->legend[offset + index]);
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(buf, "%s%s", ses->map->color[MAP_COLOR_USER], ses->map->legend[offset + index]);
|
|
|
+ }
|
|
|
+ pop_call();
|
|
|
+ return buf;
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ exit1 = 0;
|
|
|
+ exit2 = 0;
|
|
|
+ exits = 0;
|
|
|
+
|
|
|
+ if (HAS_BIT(room->exit_dirs, MAP_DIR_N))
|
|
|
{
|
|
|
- ses->map->size = size;
|
|
|
+ SET_BIT(exit1, 1 << 0);
|
|
|
+ SET_BIT(exit2, 1 << 0);
|
|
|
+ SET_BIT(exits, MAP_EXIT_N);
|
|
|
}
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP RESIZE: MAP RESIZED TO %d ROOMS.", ses->map->size);
|
|
|
-}
|
|
|
+ if (HAS_BIT(room->exit_dirs, MAP_DIR_W))
|
|
|
+ {
|
|
|
+ SET_BIT(exit1, 1 << 2);
|
|
|
+ SET_BIT(exits, MAP_EXIT_W);
|
|
|
+ }
|
|
|
|
|
|
-DO_MAP(map_return)
|
|
|
-{
|
|
|
- if (ses->map == NULL || ses->map->room_list[ses->map->last_room] == NULL)
|
|
|
+ if (HAS_BIT(room->exit_dirs, MAP_DIR_E))
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP RETURN: NO KNOWN LAST ROOM.");
|
|
|
+ SET_BIT(exit2, 1 << 2);
|
|
|
+ SET_BIT(exits, MAP_EXIT_E);
|
|
|
+ }
|
|
|
|
|
|
- return;
|
|
|
+ if (HAS_BIT(room->exit_dirs, MAP_DIR_S))
|
|
|
+ {
|
|
|
+ SET_BIT(exit1, 1 << 4);
|
|
|
+ SET_BIT(exit2, 1 << 4);
|
|
|
+ SET_BIT(exits, MAP_EXIT_S);
|
|
|
}
|
|
|
|
|
|
- if (ses->map->in_room)
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT))
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP RETURN: ALREADY IN THE MAP.");
|
|
|
+ if (HAS_BIT(room->exit_dirs, MAP_DIR_NW))
|
|
|
+ {
|
|
|
+ SET_BIT(exit1, 1 << 1);
|
|
|
+ }
|
|
|
+ if (HAS_BIT(room->exit_dirs, MAP_DIR_NE))
|
|
|
+ {
|
|
|
+ SET_BIT(exit2, 1 << 1);
|
|
|
+ }
|
|
|
+ if (HAS_BIT(room->exit_dirs, MAP_DIR_SW))
|
|
|
+ {
|
|
|
+ SET_BIT(exit1, 1 << 3);
|
|
|
+ }
|
|
|
+ if (HAS_BIT(room->exit_dirs, MAP_DIR_SE))
|
|
|
+ {
|
|
|
+ SET_BIT(exit2, 1 << 3);
|
|
|
+ }
|
|
|
+
|
|
|
+ room1 = exit1 + LEGEND_MUDFONT_NWS;
|
|
|
+ room2 = exit2 + LEGEND_MUDFONT_NES;
|
|
|
+
|
|
|
+ if (HAS_BIT(room->flags, ROOM_FLAG_VOID))
|
|
|
+ {
|
|
|
+ room1 += 64;
|
|
|
+ room2 += 64;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (HAS_BIT(room->flags, ROOM_FLAG_CURVED))
|
|
|
+ {
|
|
|
+ switch (room->exit_dirs)
|
|
|
+ {
|
|
|
+ case MAP_DIR_N|MAP_DIR_E:
|
|
|
+ case MAP_DIR_N|MAP_DIR_SE:
|
|
|
+ room1 = LEGEND_MUDFONT_CURVED + 0;
|
|
|
+ break;
|
|
|
+ case MAP_DIR_S|MAP_DIR_E:
|
|
|
+ case MAP_DIR_S|MAP_DIR_NE:
|
|
|
+ room1 = LEGEND_MUDFONT_CURVED + 1;
|
|
|
+ break;
|
|
|
+ case MAP_DIR_S|MAP_DIR_W:
|
|
|
+ case MAP_DIR_S|MAP_DIR_NW:
|
|
|
+ room2 = LEGEND_MUDFONT_CURVED + 2;
|
|
|
+ break;
|
|
|
+ case MAP_DIR_N|MAP_DIR_W:
|
|
|
+ case MAP_DIR_N|MAP_DIR_SW:
|
|
|
+ room2 = LEGEND_MUDFONT_CURVED + 3;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ sprintf(buf, "%s%s%s", room_color, ses->map->legend[room1], ses->map->legend[room2]);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- goto_room(ses, ses->map->last_room);
|
|
|
-
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP RETURN: RETURNED TO ROOM %d {%s}.", ses->map->in_room, ses->map->room_list[ses->map->in_room]->name);
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_SYMBOLGRAPHICS) && room->symbol[0] && room->symbol[0] != ' ')
|
|
|
+ {
|
|
|
+ sprintf(buf, "%s%-1s", room_color, room->symbol);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (HAS_BIT(room->flags, ROOM_FLAG_VOID) && (exits == MAP_EXIT_N+MAP_EXIT_S || exits == MAP_EXIT_E+MAP_EXIT_W))
|
|
|
+ {
|
|
|
+ sprintf(buf, "%s%s", room_color, exits == MAP_EXIT_N+MAP_EXIT_S ? ses->map->legend[offset+16+2] : ses->map->legend[offset+16+3]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (HAS_BIT(room->flags, ROOM_FLAG_CURVED))
|
|
|
+ {
|
|
|
+ switch (room->exit_dirs)
|
|
|
+ {
|
|
|
+ case MAP_DIR_N|MAP_DIR_E:
|
|
|
+ exits = 16 + 4;
|
|
|
+ break;
|
|
|
+ case MAP_DIR_S|MAP_DIR_E:
|
|
|
+ exits = 16 + 5;
|
|
|
+ break;
|
|
|
+ case MAP_DIR_S|MAP_DIR_W:
|
|
|
+ exits = 16 + 6;
|
|
|
+ break;
|
|
|
+ case MAP_DIR_N|MAP_DIR_W:
|
|
|
+ exits = 16 + 7;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sprintf(buf, "%s%s", room_color, ses->map->legend[offset + exits]);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+ pop_call();
|
|
|
+ return buf;
|
|
|
}
|
|
|
|
|
|
-DO_MAP(map_roomflag)
|
|
|
+void search_keywords(struct session *ses, char *arg, char *out, char *var)
|
|
|
{
|
|
|
- char buf[BUFFER_SIZE], *str, arg3[BUFFER_SIZE];
|
|
|
- int flag = 0;
|
|
|
+ char buf[MAP_SEARCH_MAX][BUFFER_SIZE], arg1[BUFFER_SIZE], arg2[BUFFER_SIZE];
|
|
|
+ int type, max;
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ push_call("search_keywords(%p,%p,%p,%p)",ses,arg,out,var);
|
|
|
|
|
|
- if (*arg1 == 0)
|
|
|
+ for (type = 0 ; type < MAP_SEARCH_MAX ; type++)
|
|
|
{
|
|
|
- tintin_printf2(ses, "#MAP: Avoid flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_AVOID) ? "ON" : "off");
|
|
|
- tintin_printf2(ses, "#MAP: Hide flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_HIDE) ? "ON" : "off");
|
|
|
- tintin_printf2(ses, "#MAP: Invis flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_INVIS) ? "ON" : "off");
|
|
|
- tintin_printf2(ses, "#MAP: Leave flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_LEAVE) ? "ON" : "off");
|
|
|
- tintin_printf2(ses, "#MAP: Void flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_VOID) ? "ON" : "off");
|
|
|
- tintin_printf2(ses, "#MAP: Static flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_STATIC) ? "ON" : "off");
|
|
|
- tintin_printf2(ses, "#MAP: Curved flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_CURVED) ? "ON" : "off");
|
|
|
- tintin_printf2(ses, "#MAP: NoGlobal flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_NOGLOBAL) ? "ON" : "off");
|
|
|
- return;
|
|
|
+ buf[type][0] = 0;
|
|
|
}
|
|
|
|
|
|
- str = arg1;
|
|
|
+ var[0] = 0;
|
|
|
|
|
|
- while (*str)
|
|
|
+ type = 0;
|
|
|
+
|
|
|
+ while (*arg && type < MAP_SEARCH_MAX)
|
|
|
{
|
|
|
- str = get_arg_in_braces(ses, str, buf, GET_ONE);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
- if (is_abbrev(buf, "avoid"))
|
|
|
+ if (*arg1 == '{')
|
|
|
{
|
|
|
- SET_BIT(flag, ROOM_FLAG_AVOID);
|
|
|
+ strcpy(arg2, arg1);
|
|
|
+
|
|
|
+ arg = get_arg_in_braces(ses, arg2, arg1, GET_ALL);
|
|
|
}
|
|
|
- else if (is_abbrev(buf, "curved"))
|
|
|
+
|
|
|
+ if (!strcasecmp(arg1, "roomid"))
|
|
|
{
|
|
|
- SET_BIT(flag, ROOM_FLAG_CURVED);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_ID], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
}
|
|
|
- else if (is_abbrev(buf, "hide"))
|
|
|
+ else if (!strcasecmp(arg1, "roomname"))
|
|
|
{
|
|
|
- SET_BIT(flag, ROOM_FLAG_HIDE);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_NAME], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
}
|
|
|
- else if (is_abbrev(buf, "invisible"))
|
|
|
+ else if (!strcasecmp(arg1, "roomexits"))
|
|
|
{
|
|
|
- SET_BIT(flag, ROOM_FLAG_INVIS);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_EXITS], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
}
|
|
|
- else if (is_abbrev(buf, "leave"))
|
|
|
+ else if (!strcasecmp(arg1, "roomdesc"))
|
|
|
{
|
|
|
- SET_BIT(flag, ROOM_FLAG_LEAVE);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_DESC], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
}
|
|
|
- else if (is_abbrev(buf, "noglobal"))
|
|
|
+ else if (!strcasecmp(arg1, "roomarea"))
|
|
|
{
|
|
|
- SET_BIT(flag, ROOM_FLAG_NOGLOBAL);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_AREA], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
}
|
|
|
- else if (is_abbrev(buf, "static"))
|
|
|
+ else if (!strcasecmp(arg1, "roomnote"))
|
|
|
{
|
|
|
- SET_BIT(flag, ROOM_FLAG_STATIC);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_NOTE], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
}
|
|
|
- else if (is_abbrev(buf, "void"))
|
|
|
+ else if (!strcasecmp(arg1, "roomterrain"))
|
|
|
{
|
|
|
- SET_BIT(flag, ROOM_FLAG_VOID);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_TERRAIN], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ }
|
|
|
+ else if (!strcasecmp(arg1, "roomflag"))
|
|
|
+ {
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_FLAG], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ }
|
|
|
+ else if (!strcasecmp(arg1, "variable"))
|
|
|
+ {
|
|
|
+ arg = sub_arg_in_braces(ses, arg, var, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: Invalid room flag {%s}.", buf);
|
|
|
-
|
|
|
- return;
|
|
|
+ strcpy(buf[type++], arg1);
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- if (*str == COMMAND_SEPARATOR)
|
|
|
+ for (max = MAP_SEARCH_MAX - 1 ; max >= 0 ; max--)
|
|
|
+ {
|
|
|
+ if (*buf[max])
|
|
|
{
|
|
|
- str++;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (*arg2 == 0)
|
|
|
+ out[0] = 0;
|
|
|
+
|
|
|
+ for (type = 0 ; type <= max ; type++)
|
|
|
{
|
|
|
- TOG_BIT(ses->map->room_list[ses->map->in_room]->flags, flag);
|
|
|
+ cat_sprintf(out, "{%s}", buf[type]);
|
|
|
}
|
|
|
- else if (is_abbrev(arg2, "ON"))
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
+void map_search_compile(struct session *ses, char *arg, char *var)
|
|
|
+{
|
|
|
+ char tmp[BUFFER_SIZE], buf[BUFFER_SIZE], *ptb;
|
|
|
+ struct listnode *node;
|
|
|
+
|
|
|
+ push_call("map_search_compile(%p,%p,%p)",ses,arg,var);
|
|
|
+
|
|
|
+ search_keywords(ses, arg, tmp, var);
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, tmp, buf, GET_ALL, SUB_VAR|SUB_FUN); // name
|
|
|
+
|
|
|
+ if (is_math(ses, buf))
|
|
|
{
|
|
|
- SET_BIT(ses->map->room_list[ses->map->in_room]->flags, flag);
|
|
|
+ ses->map->search->vnum = (int) get_number(ses, buf);
|
|
|
}
|
|
|
- else if (is_abbrev(arg2, "OFF"))
|
|
|
+ else
|
|
|
{
|
|
|
- DEL_BIT(ses->map->room_list[ses->map->in_room]->flags, flag);
|
|
|
+ ses->map->search->vnum = 0;
|
|
|
}
|
|
|
- else if (is_abbrev(arg2, "GET"))
|
|
|
+
|
|
|
+ if (ses->map->search->vnum)
|
|
|
{
|
|
|
- if (*arg3 == 0)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX #MAP ROOMFLAG {%s} {GET} {<VARIABLE>}.", buf);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- set_nest_node(ses->list[LIST_VARIABLE], arg3, "%d", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, flag));
|
|
|
- }
|
|
|
+ pop_call();
|
|
|
return;
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (ses->map->search->arg)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX #MAP ROOMFLAG {%s} {[GET|ON|OFF]}.", buf);
|
|
|
+ free(ses->map->search->arg);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- if (HAS_BIT(flag, ROOM_FLAG_AVOID))
|
|
|
+ if (*buf)
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Avoid flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_AVOID) ? "ON" : "off");
|
|
|
+ ses->map->search->arg = strdup(buf);
|
|
|
+
|
|
|
+ node = search_node_list(ses->list[LIST_LANDMARK], ses->map->search->arg);
|
|
|
+
|
|
|
+ if (node)
|
|
|
+ {
|
|
|
+ ses->map->search->vnum = node->val32[0];
|
|
|
+
|
|
|
+ if (ses->map->search->vnum)
|
|
|
+ {
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- if (HAS_BIT(flag, ROOM_FLAG_CURVED))
|
|
|
+ else
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Curved flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_CURVED) ? "ON" : "off");
|
|
|
+ ses->map->search->arg = NULL;
|
|
|
}
|
|
|
- if (HAS_BIT(flag, ROOM_FLAG_HIDE))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Hide flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_HIDE) ? "ON" : "off");
|
|
|
- }
|
|
|
- if (HAS_BIT(flag, ROOM_FLAG_INVIS))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Invis flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_INVIS) ? "ON" : "off");
|
|
|
- }
|
|
|
- if (HAS_BIT(flag, ROOM_FLAG_LEAVE))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Leave flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_LEAVE) ? "ON" : "off");
|
|
|
- }
|
|
|
- if (HAS_BIT(flag, ROOM_FLAG_NOGLOBAL))
|
|
|
+
|
|
|
+ if (ses->map->search->name)
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: NoGlobal flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_NOGLOBAL) ? "ON" : "off");
|
|
|
+ free(ses->map->search->name);
|
|
|
}
|
|
|
- if (HAS_BIT(flag, ROOM_FLAG_VOID))
|
|
|
+
|
|
|
+ if (*buf)
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Void flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_VOID) ? "ON" : "off");
|
|
|
+ strcat(buf, "$");
|
|
|
+
|
|
|
+ ses->map->search->name = tintin_regexp_compile(ses, NULL, buf, PCRE_ANCHORED);
|
|
|
}
|
|
|
- if (HAS_BIT(flag, ROOM_FLAG_STATIC))
|
|
|
+ else
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Static flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_STATIC) ? "ON" : "off");
|
|
|
+ ses->map->search->name = NULL;
|
|
|
}
|
|
|
|
|
|
-}
|
|
|
-
|
|
|
-DO_MAP(map_set)
|
|
|
-{
|
|
|
- struct room_data *room = ses->map->room_list[ses->map->in_room];
|
|
|
- char arg3[BUFFER_SIZE];
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // exits
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ ses->map->search->exit_dirs = 0;
|
|
|
+ ses->map->search->exit_size = 0;
|
|
|
|
|
|
- if (*arg3)
|
|
|
+ if (ses->map->search->exit_list)
|
|
|
{
|
|
|
- if (atoi(arg3) > 0 && atoi(arg3) < ses->map->size)
|
|
|
- {
|
|
|
- room = ses->map->room_list[atoi(arg3)];
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- room = NULL;
|
|
|
- }
|
|
|
+ free(ses->map->search->exit_list);
|
|
|
}
|
|
|
|
|
|
- if (room == NULL)
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: invalid room vnum: %s", arg3);
|
|
|
- }
|
|
|
- else if (*arg1 == 0)
|
|
|
- {
|
|
|
- tintin_printf2(ses, " roomarea: %s", room->area);
|
|
|
- tintin_printf2(ses, " roomcolor: %s", room->color);
|
|
|
- tintin_printf2(ses, " roomdata: %s", room->data);
|
|
|
- tintin_printf2(ses, " roomdesc: %s", room->desc);
|
|
|
- tintin_printf2(ses, " roomflags: %d", room->flags);
|
|
|
- tintin_printf2(ses, " roomid: %s", room->id);
|
|
|
- tintin_printf2(ses, " roomname: %s", room->name);
|
|
|
- tintin_printf2(ses, " roomnote: %s", room->note);
|
|
|
- tintin_printf2(ses, " roomsymbol: %s", room->symbol);
|
|
|
- tintin_printf2(ses, "roomterrain: %s", room->terrain);
|
|
|
- tintin_printf2(ses, " roomweight: %.3f", room->weight);
|
|
|
- }
|
|
|
- else
|
|
|
+ if (*buf)
|
|
|
{
|
|
|
- if (is_abbrev(arg1, "roomarea"))
|
|
|
- {
|
|
|
- RESTRING(room->area, arg2);
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: roomarea set to: %s", room->area);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "roomcolor"))
|
|
|
- {
|
|
|
- RESTRING(room->color, arg2);
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: roomcolor set to: %s", arg2);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "roomdata"))
|
|
|
- {
|
|
|
- RESTRING(room->data, arg2);
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: roomdata set to: %s", arg2);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "roomdesc"))
|
|
|
- {
|
|
|
- RESTRING(room->desc, arg2);
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: roomdesc set to: %s", arg2);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "roomflags"))
|
|
|
- {
|
|
|
- room->flags = (int) get_number(ses, arg2);
|
|
|
-
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: roomflags set to: %d", room->flags);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "roomid"))
|
|
|
- {
|
|
|
- RESTRING(room->id, arg2);
|
|
|
-
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: roomid set to: %s", room->id);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "roomname"))
|
|
|
- {
|
|
|
- RESTRING(room->name, arg2);
|
|
|
+ struct listnode *node;
|
|
|
+ char exit[BUFFER_SIZE];
|
|
|
+ ptb = buf;
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: roomname set to: %s", room->name);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "roomnote"))
|
|
|
- {
|
|
|
- RESTRING(room->note, arg2);
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: roomnote set to: %s", arg2);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "roomsymbol"))
|
|
|
- {
|
|
|
- RESTRING(room->symbol, arg2);
|
|
|
+ tmp[0] = 0;
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: roomsymbol set to: %s", room->symbol);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "roomterrain"))
|
|
|
- {
|
|
|
- RESTRING(room->terrain, arg2);
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: roomterrain set to: %s", arg2);
|
|
|
- }
|
|
|
- else if (is_abbrev(arg1, "roomweight"))
|
|
|
+ if (is_math(ses, buf))
|
|
|
{
|
|
|
- if (get_number(ses, arg2) < 0.001)
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: roomweight should be at least 0.001");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- room->weight = (float) get_number(ses, arg2);
|
|
|
+ ses->map->search->exit_dirs = get_number(ses, buf);
|
|
|
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: roomweight set to: %.3f", room->weight);
|
|
|
- }
|
|
|
+ if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_N)) ses->map->search->exit_size++;
|
|
|
+ if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_E)) ses->map->search->exit_size++;
|
|
|
+ if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_S)) ses->map->search->exit_size++;
|
|
|
+ if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_W)) ses->map->search->exit_size++;
|
|
|
+ if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_U)) ses->map->search->exit_size++;
|
|
|
+ if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_D)) ses->map->search->exit_size++;
|
|
|
+ if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_NE)) ses->map->search->exit_size++;
|
|
|
+ if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_NW)) ses->map->search->exit_size++;
|
|
|
+ if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_SE)) ses->map->search->exit_size++;
|
|
|
+ if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_SW)) ses->map->search->exit_size++;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP SET: unknown option: %s", arg1);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
+ while (*ptb)
|
|
|
+ {
|
|
|
+ ptb = get_arg_in_braces(ses, ptb, exit, GET_ONE);
|
|
|
|
|
|
-DO_MAP(map_travel)
|
|
|
-{
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ node = search_node_list(ses->list[LIST_PATHDIR], exit);
|
|
|
|
|
|
- explore_path(ses, TRUE, arg1, arg2);
|
|
|
-}
|
|
|
+ ses->map->search->exit_size++;
|
|
|
|
|
|
+ if (node)
|
|
|
+ {
|
|
|
+ SET_BIT(ses->map->search->exit_dirs, 1LL << atoi(node->arg3));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SET_BIT(ses->map->search->exit_dirs, 1); // flag indicates no exits
|
|
|
|
|
|
-DO_MAP(map_uninsert)
|
|
|
-{
|
|
|
- int room1, room2, room3;
|
|
|
- struct exit_data *exit1, *exit2, *exit3;
|
|
|
- struct listnode *node;
|
|
|
+ cat_sprintf(tmp, "{%s}", exit);
|
|
|
+ }
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ if (*ptb == COMMAND_SEPARATOR)
|
|
|
+ {
|
|
|
+ ptb++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ses->map->search->exit_list = strdup(tmp);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ses->map->search->exit_list = strdup("");
|
|
|
+ }
|
|
|
|
|
|
- room1 = ses->map->in_room;
|
|
|
- exit1 = find_exit(ses, room1, arg1);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // desc
|
|
|
|
|
|
- node = search_node_list(ses->list[LIST_PATHDIR], arg1);
|
|
|
+ if (ses->map->search->desc)
|
|
|
+ {
|
|
|
+ free(ses->map->search->desc);
|
|
|
+ }
|
|
|
|
|
|
- if (exit1 == NULL)
|
|
|
+ if (*buf)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP UNINSERT: There is no room in that direction.");
|
|
|
+ strcat(buf, "$");
|
|
|
|
|
|
- return;
|
|
|
+ ses->map->search->desc = tintin_regexp_compile(ses, NULL, buf, PCRE_ANCHORED);
|
|
|
}
|
|
|
-
|
|
|
- if (node == NULL)
|
|
|
+ else
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP UNINSERT: Given direction must be a pathdir.");
|
|
|
- return;
|
|
|
+ ses->map->search->desc = NULL;
|
|
|
}
|
|
|
|
|
|
- room2 = exit1->vnum;
|
|
|
- exit2 = find_exit(ses, room2, node->arg1);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // area
|
|
|
|
|
|
- if (exit2 == NULL)
|
|
|
+ if (ses->map->search->area)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP UNINSERT: Unable to find backlink room.");
|
|
|
- return;
|
|
|
+ free(ses->map->search->area);
|
|
|
}
|
|
|
|
|
|
- room3 = exit2->vnum;
|
|
|
- exit3 = find_exit(ses, room3, node->arg2);
|
|
|
-
|
|
|
- if (exit3 == NULL)
|
|
|
+ if (*buf)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP UNINSERT: Unable to find backlink exit.");
|
|
|
+ strcat(buf, "$");
|
|
|
|
|
|
- return;
|
|
|
+ ses->map->search->area = tintin_regexp_compile(ses, NULL, buf, PCRE_ANCHORED);
|
|
|
}
|
|
|
-
|
|
|
- exit1->vnum = room3;
|
|
|
- exit3->vnum = room1;
|
|
|
-
|
|
|
- delete_room(ses, room2, TRUE);
|
|
|
-
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP UNINSERT: Uninserted room {%d}.", room2);
|
|
|
-}
|
|
|
-
|
|
|
-// 1) timestamp 2) type 3) data
|
|
|
-
|
|
|
-DO_MAP(map_undo)
|
|
|
-{
|
|
|
- struct link_data *link;
|
|
|
- struct room_data *room;
|
|
|
- int undo_flag;
|
|
|
- struct exit_data *exit1, *exit2, *exit3;
|
|
|
-
|
|
|
- link = ses->map->undo_tail;
|
|
|
-
|
|
|
- if (link == NULL)
|
|
|
+ else
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP UNDO: No known last move.");
|
|
|
-
|
|
|
- return;
|
|
|
+ ses->map->search->area = NULL;
|
|
|
}
|
|
|
|
|
|
- room = ses->map->room_list[atoi(link->str1)];
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // note
|
|
|
|
|
|
- if (room == NULL)
|
|
|
+ if (ses->map->search->note)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP UNDO: Room %s does not exist.", link->str2);
|
|
|
- return;
|
|
|
+ free(ses->map->search->note);
|
|
|
}
|
|
|
|
|
|
- if (ses->map->room_list[atoi(link->str2)] == NULL)
|
|
|
+ if (*buf)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP UNDO: Invalid last move.");
|
|
|
- return;
|
|
|
+ strcat(buf, "$");
|
|
|
+
|
|
|
+ ses->map->search->note = tintin_regexp_compile(ses, NULL, buf, PCRE_ANCHORED);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ses->map->search->note = NULL;
|
|
|
}
|
|
|
|
|
|
- undo_flag = atoi(link->str3);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // terrain
|
|
|
|
|
|
- if (HAS_BIT(undo_flag, MAP_UNDO_MOVE))
|
|
|
+ if (ses->map->search->terrain)
|
|
|
{
|
|
|
- if (ses->map->in_room != room->vnum)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP UNDO: Invalid last move.");
|
|
|
- return;
|
|
|
- }
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP UNDO: Moving to room %s.", link->str2);
|
|
|
-
|
|
|
- goto_room(ses, atoi(link->str2));
|
|
|
+ free(ses->map->search->terrain);
|
|
|
}
|
|
|
|
|
|
- if (HAS_BIT(undo_flag, MAP_UNDO_CREATE))
|
|
|
+ if (*buf)
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP UNDO: Deleting room %d.", room->vnum);
|
|
|
- delete_room(ses, room->vnum, TRUE);
|
|
|
+ strcat(buf, "$");
|
|
|
+
|
|
|
+ ses->map->search->terrain = tintin_regexp_compile(ses, NULL, buf, PCRE_ANCHORED);
|
|
|
}
|
|
|
- else if (HAS_BIT(undo_flag, MAP_UNDO_LINK))
|
|
|
+ else
|
|
|
{
|
|
|
- exit1 = find_exit(ses, room->vnum, link->str2);
|
|
|
-
|
|
|
- if (exit1)
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP UNDO: Deleting exit leading %s.", exit1->name);
|
|
|
- delete_exit(ses, room->vnum, exit1);
|
|
|
- }
|
|
|
+ ses->map->search->terrain = NULL;
|
|
|
+ }
|
|
|
|
|
|
- exit2 = find_exit(ses, atoi(link->str2), link->str1);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // flag
|
|
|
|
|
|
- if (exit2)
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP UNDO: Deleting exit leading %s.", exit2->name);
|
|
|
- delete_exit(ses, atoi(link->str2), exit2);
|
|
|
- }
|
|
|
- }
|
|
|
- else if (HAS_BIT(undo_flag, MAP_UNDO_INSERT))
|
|
|
+ if (*buf)
|
|
|
{
|
|
|
- exit1 = find_exit(ses, atoi(link->str2), link->str1);
|
|
|
+ char flags[BUFFER_SIZE];
|
|
|
|
|
|
- if (exit1 == NULL)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP UNDO: Can't find exit between %s and %s.", link->str2, link->str1);
|
|
|
- return;
|
|
|
- }
|
|
|
+ ses->map->search->flag = get_number(ses, buf);
|
|
|
|
|
|
- exit2 = find_exit(ses, room->vnum, exit1->name);
|
|
|
+ ptb = buf;
|
|
|
|
|
|
- if (exit2 == NULL)
|
|
|
+ while (*buf)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP UNDO: No valid exit found in room %d.", room->vnum);
|
|
|
- return;
|
|
|
- }
|
|
|
+ ptb = sub_arg_in_braces(ses, ptb, flags, GET_ONE, SUB_NONE);
|
|
|
|
|
|
- exit3 = find_exit(ses, exit2->vnum, ntos(room->vnum));
|
|
|
+ if (is_abbrev(buf, "avoid"))
|
|
|
+ {
|
|
|
+ SET_BIT(ses->map->search->flag, ROOM_FLAG_AVOID);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "curved"))
|
|
|
+ {
|
|
|
+ SET_BIT(ses->map->search->flag, ROOM_FLAG_CURVED);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "hide"))
|
|
|
+ {
|
|
|
+ SET_BIT(ses->map->search->flag, ROOM_FLAG_HIDE);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "invis"))
|
|
|
+ {
|
|
|
+ SET_BIT(ses->map->search->flag, ROOM_FLAG_INVIS);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "leave"))
|
|
|
+ {
|
|
|
+ SET_BIT(ses->map->search->flag, ROOM_FLAG_LEAVE);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "void"))
|
|
|
+ {
|
|
|
+ SET_BIT(ses->map->search->flag, ROOM_FLAG_VOID);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "static"))
|
|
|
+ {
|
|
|
+ SET_BIT(ses->map->search->flag, ROOM_FLAG_STATIC);
|
|
|
+ }
|
|
|
|
|
|
- if (exit3 == NULL)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP UNDO: Can't find exit between %d and %d.", room->vnum, exit2->vnum);
|
|
|
- return;
|
|
|
+ if (*ptb == COMMAND_SEPARATOR)
|
|
|
+ {
|
|
|
+ ptb++;
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- exit1->vnum = exit2->vnum;
|
|
|
- exit3->vnum = atoi(link->str2);
|
|
|
-
|
|
|
- delete_room(ses, room->vnum, TRUE);
|
|
|
-
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP UNDO: Uninserting room %s.", link->str1);
|
|
|
}
|
|
|
- del_undo(ses, link);
|
|
|
-}
|
|
|
-
|
|
|
-DO_MAP(map_unlink)
|
|
|
-{
|
|
|
- struct exit_data *exit1;
|
|
|
- struct exit_data *exit2;
|
|
|
- struct listnode *node;
|
|
|
-
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
-
|
|
|
- node = search_node_list(ses->list[LIST_PATHDIR], arg1);
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ses->map->search->flag = 0;
|
|
|
+ }
|
|
|
|
|
|
- exit1 = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // id
|
|
|
|
|
|
- if (exit1 == NULL)
|
|
|
+ if (ses->map->search->id)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP UNLINK: No exit with that name found");
|
|
|
-
|
|
|
- return;
|
|
|
+ free(ses->map->search->id);
|
|
|
}
|
|
|
|
|
|
- if (*arg2 == 'b' || *arg == 'B')
|
|
|
+ if (*buf)
|
|
|
{
|
|
|
- if (node)
|
|
|
- {
|
|
|
- exit2 = find_exit(ses, exit1->vnum, node->arg2);
|
|
|
-
|
|
|
- if (exit2)
|
|
|
- {
|
|
|
- delete_exit(ses, exit1->vnum, exit2);
|
|
|
- }
|
|
|
- }
|
|
|
+ ses->map->search->id = strdup(buf);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ses->map->search->id = NULL;
|
|
|
}
|
|
|
|
|
|
- delete_exit(ses, ses->map->in_room, exit1);
|
|
|
-
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP UNLINK: Exit deleted.");
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
-DO_MAP(map_update)
|
|
|
+int match_room(struct session *ses, int vnum, struct search_data *search)
|
|
|
{
|
|
|
- if (ses->map == NULL)
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP UPDATE: NO MAP DATA.");
|
|
|
- }
|
|
|
- else if (ses->map->room_list[ses->map->in_room] == NULL)
|
|
|
+ struct room_data *room = ses->map->room_list[vnum];
|
|
|
+
|
|
|
+ if (room == NULL)
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP UPDATE: NOT INSIDE MAP.");
|
|
|
+ return 0;
|
|
|
}
|
|
|
- else if (!HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP))
|
|
|
+
|
|
|
+ if (search->vnum)
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP UPDATE: VTMAP FLAG NOT SET.");
|
|
|
+ return room->vnum == search->vnum;
|
|
|
}
|
|
|
- else if (ses != gtd->ses)
|
|
|
+
|
|
|
+ if (search->id)
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP UPDATE: NOT THE ACTIVE SESSION.");
|
|
|
+ return !strcmp(room->id, search->id);
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (search->name)
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP UPDATE: OK.");
|
|
|
-
|
|
|
- SET_BIT(ses->flags, SES_FLAG_UPDATEVTMAP);
|
|
|
+ if (!regexp_compare(ses, search->name, room->name, "", 0, 0))
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-DO_MAP(map_run)
|
|
|
-{
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ if (search->exit_dirs)
|
|
|
+ {
|
|
|
+ char *arg, exit[BUFFER_SIZE];
|
|
|
|
|
|
- shortest_path(ses, TRUE, arg2, arg1);
|
|
|
-}
|
|
|
+ if (search->exit_dirs != room->exit_dirs)
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ if (search->exit_size != room->exit_size)
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
-DO_MAP(map_vnum)
|
|
|
-{
|
|
|
- int vnum, vnum1, vnum2, old_room, new_room;
|
|
|
- struct exit_data *exit;
|
|
|
+ arg = search->exit_list;
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ while (*arg)
|
|
|
+ {
|
|
|
+ arg = get_arg_in_braces(ses, arg, exit, GET_ONE);
|
|
|
|
|
|
- vnum1 = atoi(arg1);
|
|
|
+ if (!find_exit(ses, vnum, exit))
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
- if (*arg2)
|
|
|
- {
|
|
|
- vnum2 = atoi(arg2);
|
|
|
+ if (*arg == COMMAND_SEPARATOR)
|
|
|
+ {
|
|
|
+ arg++;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (search->desc)
|
|
|
{
|
|
|
- vnum2 = vnum1;
|
|
|
+ if (!regexp_compare(ses, search->desc, room->desc, "", 0, 0))
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- if (vnum1 <= 0 || vnum1 >= ses->map->size || vnum2 <= 0 || vnum2 >= ses->map->size)
|
|
|
+
|
|
|
+ if (search->area)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP VNUM {%s} {%s} - VNUMS MUST BE BETWEEN {1} and {%d}", arg1, arg2, ses->map->size - 1);
|
|
|
- return;
|
|
|
+ if (!regexp_compare(ses, search->area, room->area, "", 0, 0))
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- for (vnum = vnum1 ; vnum <= vnum2 ; vnum++)
|
|
|
+ if (search->note)
|
|
|
{
|
|
|
- if (ses->map->room_list[vnum] == NULL)
|
|
|
+ if (!regexp_compare(ses, search->note, room->note, "", 0, 0))
|
|
|
{
|
|
|
- break;
|
|
|
+ return 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (vnum > vnum2)
|
|
|
+ if (search->terrain)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP VNUM {%s} {%s} - NO FREE VNUM FOUND.", arg1, arg2);
|
|
|
- return;
|
|
|
+ if (!regexp_compare(ses, search->terrain, room->terrain, "", 0, 0))
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- old_room = ses->map->in_room;
|
|
|
- new_room = vnum;
|
|
|
-
|
|
|
- ses->map->room_list[new_room] = ses->map->room_list[old_room];
|
|
|
- ses->map->room_list[new_room]->vnum = new_room;
|
|
|
- ses->map->room_list[old_room] = NULL;
|
|
|
- ses->map->in_room = new_room;
|
|
|
-
|
|
|
- if (ses->map->at_room == old_room)
|
|
|
+ if (search->flag)
|
|
|
{
|
|
|
- ses->map->at_room = new_room;
|
|
|
+ if ((room->flags & search->flag) != search->flag)
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
}
|
|
|
+ return 1;
|
|
|
+}
|
|
|
|
|
|
- for (vnum = 1 ; vnum < ses->map->size ; vnum++)
|
|
|
+int find_path(struct session *ses, char *arg)
|
|
|
+{
|
|
|
+ struct exit_data *exit;
|
|
|
+ char arg1[BUFFER_SIZE], arg2[BUFFER_SIZE];
|
|
|
+ int room;
|
|
|
+
|
|
|
+ push_call("find_path(%p,%p)",ses,arg);
|
|
|
+
|
|
|
+ arg = substitute_speedwalk(ses, arg, arg1);
|
|
|
+
|
|
|
+ room = ses->map->in_room;
|
|
|
+
|
|
|
+ while (*arg)
|
|
|
{
|
|
|
- if (ses->map->room_list[vnum] == NULL)
|
|
|
+ arg = get_arg_in_braces(ses, arg, arg2, GET_ALL);
|
|
|
+
|
|
|
+ exit = find_exit(ses, room, arg2);
|
|
|
+
|
|
|
+ if (exit == NULL)
|
|
|
{
|
|
|
- continue;
|
|
|
+ pop_call();
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
- for (exit = ses->map->room_list[vnum]->f_exit ; exit ; exit = exit->next)
|
|
|
+ room = tunnel_void(ses, room, exit->vnum, exit->dir);
|
|
|
+
|
|
|
+ if (*arg == COMMAND_SEPARATOR)
|
|
|
{
|
|
|
- if (exit->vnum == old_room)
|
|
|
- {
|
|
|
- exit->vnum = new_room;
|
|
|
- }
|
|
|
+ arg++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- tintin_printf(ses, "#MAP VNUM: MOVED ROOM %d TO %d.", old_room, new_room);
|
|
|
+ pop_call();
|
|
|
+ return room == ses->map->in_room ? 0 : room;
|
|
|
}
|
|
|
|
|
|
-DO_MAP(map_write)
|
|
|
+int find_location(struct session *ses, char *arg)
|
|
|
{
|
|
|
- FILE *file;
|
|
|
- struct exit_data *exit;
|
|
|
- int index;
|
|
|
-
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ struct listnode *node;
|
|
|
+ char arg1[BUFFER_SIZE], arg2[BUFFER_SIZE], arg3[BUFFER_SIZE];
|
|
|
+ int x, y, z;
|
|
|
+
|
|
|
+ push_call("find_location(%p,%p)",ses,arg);
|
|
|
|
|
|
- if (*arg1 == 0)
|
|
|
+ if (find_exit(ses, ses->map->in_room, arg))
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP WRITE {<filename>} {FORCE}");
|
|
|
-
|
|
|
- return;
|
|
|
+ pop_call();
|
|
|
+ return find_exit(ses, ses->map->in_room, arg)->vnum;
|
|
|
}
|
|
|
|
|
|
- if (!str_suffix(arg1, ".tin") && !is_abbrev(arg2, "FORCE"))
|
|
|
+ if (is_math(ses, arg))
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP WRITE {%s}: USE {FORCE} TO OVERWRITE .tin FILES.");
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
- return;
|
|
|
+ x = get_number(ses, arg1);
|
|
|
+ y = get_number(ses, arg2);
|
|
|
+ z = get_number(ses, arg3);
|
|
|
}
|
|
|
-
|
|
|
- if ((file = fopen(arg1, "w")) == NULL)
|
|
|
+ else
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP WRITE {%s} - COULDN'T OPEN FILE TO WRITE.", arg1);
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
+ x = y = z = 0;
|
|
|
|
|
|
- fprintf(file, "C %d\n\n", ses->map->size);
|
|
|
-
|
|
|
- fprintf(file, "V 2020\n\n");
|
|
|
-
|
|
|
- for (index = 0 ; map_color_table[index].name ; index++)
|
|
|
- {
|
|
|
- fprintf(file, "C%s %s\n", map_color_table[index].name, ses->map->color[index]);
|
|
|
- }
|
|
|
- fprintf(file, "\n");
|
|
|
+ arg = substitute_speedwalk(ses, arg, arg2);
|
|
|
|
|
|
- fprintf(file, "F %d\n\n", ses->map->flags);
|
|
|
+ while (*arg)
|
|
|
+ {
|
|
|
+ arg = get_arg_in_braces(ses, arg, arg3, GET_ALL);
|
|
|
|
|
|
- fprintf(file, "G %d\n\n", ses->map->global_vnum);
|
|
|
+ node = search_node_list(ses->list[LIST_PATHDIR], arg3);
|
|
|
|
|
|
- fprintf(file, "I %d\n\n", ses->map->in_room ? ses->map->in_room : ses->map->last_room);
|
|
|
+ if (node == NULL)
|
|
|
+ {
|
|
|
+// show_error(ses, LIST_COMMAND, "#ERROR: #MAP FIND_LOCATION: {%s} IS AN INVALID PATHDIR.", arg3);
|
|
|
|
|
|
- for (index = 0 ; map_legend_table[index].name ; index++)
|
|
|
- {
|
|
|
- fprintf(file, "L {%s} {%s} {%s}\n", map_legend_table[index].group, map_legend_table[index].name, ses->map->legend_raw[index]);
|
|
|
- }
|
|
|
- fprintf(file, "\n\n");
|
|
|
+ pop_call();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
- for (index = 0 ; index < ses->map->size ; index++)
|
|
|
- {
|
|
|
- if (ses->map->room_list[index])
|
|
|
- {
|
|
|
- fprintf(file, "\nR {%5d} {%d} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%.3f} {%s}\n",
|
|
|
- ses->map->room_list[index]->vnum,
|
|
|
- ses->map->room_list[index]->flags,
|
|
|
- ses->map->room_list[index]->color,
|
|
|
- ses->map->room_list[index]->name,
|
|
|
- ses->map->room_list[index]->symbol,
|
|
|
- ses->map->room_list[index]->desc,
|
|
|
- ses->map->room_list[index]->area,
|
|
|
- ses->map->room_list[index]->note,
|
|
|
- ses->map->room_list[index]->terrain,
|
|
|
- ses->map->room_list[index]->data,
|
|
|
- ses->map->room_list[index]->weight,
|
|
|
- ses->map->room_list[index]->id);
|
|
|
+ x += (HAS_BIT(atoi(node->arg3), MAP_EXIT_E) ? 1 : HAS_BIT(atoi(node->arg3), MAP_EXIT_W) ? -1 : 0);
|
|
|
+ y += (HAS_BIT(atoi(node->arg3), MAP_EXIT_N) ? 1 : HAS_BIT(atoi(node->arg3), MAP_EXIT_S) ? -1 : 0);
|
|
|
+ z += (HAS_BIT(atoi(node->arg3), MAP_EXIT_U) ? 1 : HAS_BIT(atoi(node->arg3), MAP_EXIT_D) ? -1 : 0);
|
|
|
|
|
|
- for (exit = ses->map->room_list[index]->f_exit ; exit ; exit = exit->next)
|
|
|
+ if (*arg == COMMAND_SEPARATOR)
|
|
|
{
|
|
|
- fprintf(file, "E {%5d} {%s} {%s} {%d} {%d} {%s} {%.3f}\n",
|
|
|
- exit->vnum,
|
|
|
- exit->name,
|
|
|
- exit->cmd,
|
|
|
- exit->dir,
|
|
|
- exit->flags,
|
|
|
- exit->data,
|
|
|
- exit->weight);
|
|
|
+ arg++;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- fclose(file);
|
|
|
-
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Map file written to {%s}.", arg1);
|
|
|
+ pop_call();
|
|
|
+ return spatialgrid_find(ses, ses->map->in_room, x, y, z);
|
|
|
}
|
|
|
|
|
|
-void create_map(struct session *ses, char *arg)
|
|
|
+int find_room(struct session *ses, char *arg)
|
|
|
{
|
|
|
- int group, legend;
|
|
|
+ char var[BUFFER_SIZE];
|
|
|
+ struct listnode *node;
|
|
|
+ int room;
|
|
|
|
|
|
- push_call("create_map(%p,%p)",ses,arg);
|
|
|
+ push_call("find_room(%p,%s)",ses,arg);
|
|
|
|
|
|
- if (ses->map)
|
|
|
+ map_search_compile(ses, arg, var);
|
|
|
+
|
|
|
+ if (ses->map->search->vnum > 0 && ses->map->search->vnum < ses->map->size)
|
|
|
{
|
|
|
- delete_map(ses);
|
|
|
+ if (ses->map->room_list[ses->map->search->vnum])
|
|
|
+ {
|
|
|
+ pop_call();
|
|
|
+ return ses->map->search->vnum;
|
|
|
+ }
|
|
|
+ pop_call();
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
- ses->map = (struct map_data *) calloc(1, sizeof(struct map_data));
|
|
|
- ses->map->size = atoi(arg) > 0 ? atoi(arg) : 50000;
|
|
|
-
|
|
|
- ses->map->room_list = (struct room_data **) calloc(ses->map->size, sizeof(struct room_data *));
|
|
|
-
|
|
|
- ses->map->max_grid_x = 255;
|
|
|
- ses->map->max_grid_y = 101;
|
|
|
-
|
|
|
- ses->map->grid_rooms = (struct room_data **) calloc(ses->map->max_grid_x * ses->map->max_grid_y, sizeof(struct room_data *));
|
|
|
- ses->map->grid_flags = (int *) calloc(ses->map->max_grid_x * ses->map->max_grid_y, sizeof(struct room_data *));
|
|
|
-
|
|
|
- ses->map->search = (struct search_data *) calloc(1, sizeof(struct search_data));
|
|
|
-
|
|
|
- ses->map->flags = MAP_FLAG_ASCIIGRAPHICS|MAP_FLAG_DIRECTION;
|
|
|
-
|
|
|
- ses->map->global_exit = (struct exit_data *) calloc(1, sizeof(struct exit_data));
|
|
|
- ses->map->global_exit->vnum = ses->map->global_vnum;
|
|
|
- ses->map->global_exit->name = restringf(ses->map->global_exit->name, "%cnop global", gtd->tintin_char);
|
|
|
- ses->map->global_exit->cmd = restringf(ses->map->global_exit->cmd, "%cnop global", gtd->tintin_char);
|
|
|
- ses->map->global_exit->data = strdup("");
|
|
|
- ses->map->global_exit->weight = 1;
|
|
|
-
|
|
|
- do_map(ses, "{COLOR} {RESET}");
|
|
|
-
|
|
|
- ses->map->display_stamp = 1;
|
|
|
- ses->map->search->stamp = 1;
|
|
|
-
|
|
|
- create_room(ses, "%s", "{1} {0} {} {} { } {} {} {} {} {} {1.0} {}");
|
|
|
-
|
|
|
- strcpy(arg, "");
|
|
|
-
|
|
|
- for (group = 0 ; map_group_table[group].name ; group++)
|
|
|
+ if (ses->map->search->arg)
|
|
|
{
|
|
|
- for (legend = 0 ; map_legend_table[legend].group ; legend++)
|
|
|
+ node = search_node_list(ses->list[LIST_LANDMARK], ses->map->search->arg);
|
|
|
+
|
|
|
+ if (node)
|
|
|
{
|
|
|
- if (*map_group_table[group].group == 0 || is_abbrev(map_group_table[group].group, map_legend_table[legend].group))
|
|
|
+ if (ses->map->room_list[node->val32[0]])
|
|
|
{
|
|
|
- break;
|
|
|
+ pop_call();
|
|
|
+ return node->val32[0];
|
|
|
}
|
|
|
+ pop_call();
|
|
|
+ return 0;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- if (map_legend_table[legend].group)
|
|
|
+ if (ses->map->in_room)
|
|
|
+ {
|
|
|
+ room = searchgrid_find(ses, ses->map->in_room, ses->map->search);
|
|
|
+
|
|
|
+ if (room)
|
|
|
{
|
|
|
- map_group_table[group].start = legend;
|
|
|
+ pop_call();
|
|
|
+ return room;
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "create_map: unknown legend group: %s, %s", map_group_table[group].name, map_group_table[group].group);
|
|
|
+ }
|
|
|
|
|
|
+ for (room = 0 ; room < ses->map->size ; room++)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[room] == NULL)
|
|
|
+ {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- while (map_legend_table[++legend].group)
|
|
|
+ if (!match_room(ses, room, ses->map->search))
|
|
|
{
|
|
|
- if (*map_group_table[group].group && !is_abbrev(map_group_table[group].group, map_legend_table[legend].group))
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
+ continue;
|
|
|
}
|
|
|
- map_group_table[group].end = legend;
|
|
|
+ pop_call();
|
|
|
+ return room;
|
|
|
}
|
|
|
-
|
|
|
- gtd->level->quiet++;
|
|
|
- do_map(ses, "LEGEND RESET");
|
|
|
- gtd->level->quiet--;
|
|
|
-
|
|
|
pop_call();
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-int delete_map(struct session *ses)
|
|
|
+void goto_room(struct session *ses, int room)
|
|
|
{
|
|
|
- int index, cnt;
|
|
|
-
|
|
|
- for (index = cnt = 0 ; index < ses->map->size ; index++)
|
|
|
- {
|
|
|
- if (ses->map->room_list[index])
|
|
|
- {
|
|
|
- cnt++;
|
|
|
+ int last_room = ses->map->in_room;
|
|
|
|
|
|
- delete_room(ses, index, FALSE);
|
|
|
- }
|
|
|
- }
|
|
|
- free(ses->map->room_list);
|
|
|
+ push_call("goto_room(%p,%d)",ses,room);
|
|
|
|
|
|
- while (ses->map->undo_head)
|
|
|
+ if (ses->map->in_room)
|
|
|
{
|
|
|
- del_undo(ses, ses->map->undo_head);
|
|
|
+ check_all_events(ses, SUB_ARG|SUB_SEC, 0, 2, "MAP EXIT ROOM", ntos(last_room), ntos(room));
|
|
|
+ check_all_events(ses, SUB_ARG|SUB_SEC, 1, 2, "MAP EXIT ROOM %d", last_room, ntos(last_room), ntos(room));
|
|
|
}
|
|
|
|
|
|
- free(ses->map->global_exit->name);
|
|
|
- free(ses->map->global_exit->cmd);
|
|
|
- free(ses->map->global_exit->data);
|
|
|
- free(ses->map->global_exit);
|
|
|
+ ses->map->in_room = room;
|
|
|
|
|
|
- free(ses->map);
|
|
|
+ DEL_BIT(ses->map->room_list[room]->flags, ROOM_FLAG_PATH);
|
|
|
|
|
|
- ses->map = NULL;
|
|
|
+ if (last_room == 0)
|
|
|
+ {
|
|
|
+ check_all_events(ses, SUB_ARG|SUB_SEC, 0, 1, "MAP ENTER MAP", ntos(room));
|
|
|
+ }
|
|
|
|
|
|
- return cnt;
|
|
|
+ check_all_events(ses, SUB_ARG|SUB_SEC, 0, 2, "MAP ENTER ROOM", ntos(room), ntos(last_room));
|
|
|
+ check_all_events(ses, SUB_ARG|SUB_SEC, 1, 2, "MAP ENTER ROOM %d", room, ntos(room), ntos(last_room));
|
|
|
+
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
-int create_room(struct session *ses, char *format, ...)
|
|
|
+int find_new_room(struct session *ses)
|
|
|
{
|
|
|
- char *arg, buf[BUFFER_SIZE];
|
|
|
- struct room_data *newroom;
|
|
|
- va_list args;
|
|
|
-
|
|
|
- va_start(args, format);
|
|
|
- vsprintf(buf, format, args);
|
|
|
- va_end(args);
|
|
|
-
|
|
|
- newroom = (struct room_data *) calloc(1, sizeof(struct room_data));
|
|
|
-
|
|
|
- arg = buf;
|
|
|
-
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->vnum = atoi(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->flags = atoi(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->color = strdup(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->name = strdup(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->symbol = strdup(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->desc = strdup(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->area = strdup(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->note = strdup(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->terrain = strdup(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->data = strdup(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->weight = atof(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newroom->id = strdup(buf);
|
|
|
+ int room;
|
|
|
|
|
|
- if (HAS_BIT(newroom->flags, ROOM_FLAG_AVOID))
|
|
|
- {
|
|
|
- SET_BIT(newroom->flags, ROOM_FLAG_AVOID_TMP);
|
|
|
- }
|
|
|
- if (HAS_BIT(newroom->flags, ROOM_FLAG_HIDE))
|
|
|
- {
|
|
|
- SET_BIT(newroom->flags, ROOM_FLAG_HIDE_TMP);
|
|
|
- }
|
|
|
- if (HAS_BIT(newroom->flags, ROOM_FLAG_LEAVE))
|
|
|
- {
|
|
|
- SET_BIT(newroom->flags, ROOM_FLAG_LEAVE_TMP);
|
|
|
- }
|
|
|
- if (HAS_BIT(newroom->flags, ROOM_FLAG_VOID))
|
|
|
- {
|
|
|
- SET_BIT(newroom->flags, ROOM_FLAG_VOID_TMP);
|
|
|
- }
|
|
|
- if (HAS_BIT(newroom->flags, ROOM_FLAG_CURVED))
|
|
|
+ for (room = 1 ; room < ses->map->size ; room++)
|
|
|
{
|
|
|
- SET_BIT(newroom->flags, ROOM_FLAG_CURVED_TMP);
|
|
|
+ if (ses->map->room_list[room] == NULL)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- if (newroom->weight <= 0)
|
|
|
+ if (room == ses->map->size)
|
|
|
{
|
|
|
- newroom->weight = 1;
|
|
|
- }
|
|
|
-
|
|
|
- ses->map->room_list[newroom->vnum] = newroom;
|
|
|
-
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP CREATE ROOM %5d {%s}.", newroom->vnum, newroom->name);
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP CREATE ROOM: Maximum amount of rooms of %d reached. Use #map resize.", ses->map->size);
|
|
|
|
|
|
- return newroom->vnum;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return room;
|
|
|
}
|
|
|
|
|
|
-void delete_room(struct session *ses, int room, int exits)
|
|
|
+int dir_flags(struct session *ses, int room, int dir)
|
|
|
{
|
|
|
- struct exit_data *exit, *exit_next;
|
|
|
- int cnt;
|
|
|
+ struct exit_data *exit;
|
|
|
|
|
|
- while (ses->map->room_list[room]->f_exit)
|
|
|
+ for (exit = ses->map->room_list[room]->f_exit ; exit ; exit = exit->next)
|
|
|
{
|
|
|
- delete_exit(ses, room, ses->map->room_list[room]->f_exit);
|
|
|
+ if (exit->dir == dir)
|
|
|
+ {
|
|
|
+ return exit->flags; /* | HAS_BIT(ses->map->room_list[exit->vnum]->flags, EXIT_FLAG_ALL);*/
|
|
|
+ }
|
|
|
}
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
+struct exit_data *find_exit(struct session *ses, int room, char *arg)
|
|
|
+{
|
|
|
+ struct exit_data *exit;
|
|
|
|
|
|
- free(ses->map->room_list[room]->area);
|
|
|
- free(ses->map->room_list[room]->color);
|
|
|
- free(ses->map->room_list[room]->id);
|
|
|
- free(ses->map->room_list[room]->name);
|
|
|
- free(ses->map->room_list[room]->symbol);
|
|
|
- free(ses->map->room_list[room]->desc);
|
|
|
- free(ses->map->room_list[room]->note);
|
|
|
- free(ses->map->room_list[room]->terrain);
|
|
|
- free(ses->map->room_list[room]->data);
|
|
|
-
|
|
|
- free(ses->map->room_list[room]);
|
|
|
-
|
|
|
- ses->map->room_list[room] = NULL;
|
|
|
-
|
|
|
- if (exits)
|
|
|
+ for (exit = ses->map->room_list[room]->f_exit ; exit ; exit = exit->next)
|
|
|
{
|
|
|
- for (cnt = 0 ; cnt < ses->map->size ; cnt++)
|
|
|
+// if (!strcmp(exit->name, arg) || exit->vnum == atoi(arg))
|
|
|
+ if (!strcmp(exit->name, arg))
|
|
|
{
|
|
|
- if (ses->map->room_list[cnt])
|
|
|
- {
|
|
|
- for (exit = ses->map->room_list[cnt]->f_exit ; exit ; exit = exit_next)
|
|
|
- {
|
|
|
- exit_next = exit->next;
|
|
|
-
|
|
|
- if (exit->vnum == room)
|
|
|
- {
|
|
|
- delete_exit(ses, cnt, exit);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ return exit;
|
|
|
}
|
|
|
}
|
|
|
+ return NULL;
|
|
|
}
|
|
|
|
|
|
-struct exit_data *create_exit(struct session *ses, int vnum, char *format, ...)
|
|
|
+int check_global(struct session *ses, int room)
|
|
|
{
|
|
|
- struct exit_data *newexit;
|
|
|
- struct room_data *room;
|
|
|
- va_list args;
|
|
|
- char *arg, buf[BUFFER_SIZE];
|
|
|
-
|
|
|
- push_call("create_exit(%p,%d,%p)",ses,vnum,format);
|
|
|
-
|
|
|
- va_start(args, format);
|
|
|
- vsprintf(buf, format, args);
|
|
|
- va_end(args);
|
|
|
-
|
|
|
- newexit = (struct exit_data *) calloc(1, sizeof(struct exit_data));
|
|
|
-
|
|
|
- room = ses->map->room_list[vnum];
|
|
|
-
|
|
|
- arg = buf;
|
|
|
-
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newexit->vnum = atoi(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newexit->name = strdup(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ALL); newexit->cmd = strdup(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newexit->dir = atoi(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newexit->flags = atoi(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ALL); newexit->data = strdup(buf);
|
|
|
- arg = get_arg_in_braces(ses, arg, buf, GET_ONE); newexit->weight = atof(buf);
|
|
|
-
|
|
|
- if (newexit->dir == 0)
|
|
|
+ if (HAS_BIT(ses->map->room_list[room]->flags, ROOM_FLAG_NOGLOBAL))
|
|
|
{
|
|
|
- newexit->dir = get_exit_dir(ses, newexit->name);
|
|
|
+ return FALSE;
|
|
|
}
|
|
|
-
|
|
|
- newexit->grid = get_exit_grid(ses, newexit->dir);
|
|
|
-
|
|
|
- if (room->exit_grid[newexit->grid] == NULL)
|
|
|
+
|
|
|
+ if (ses->map->room_list[ses->map->global_vnum] == NULL)
|
|
|
{
|
|
|
- room->exit_grid[newexit->grid] = newexit;
|
|
|
+ return FALSE;
|
|
|
}
|
|
|
|
|
|
- if (newexit->weight <= 0)
|
|
|
+ if (room == ses->map->global_vnum)
|
|
|
{
|
|
|
- newexit->weight = 1;
|
|
|
+ return FALSE;
|
|
|
}
|
|
|
-
|
|
|
- LINK(newexit, room->f_exit, room->l_exit);
|
|
|
-
|
|
|
- room->exit_size++;
|
|
|
-
|
|
|
- SET_BIT(room->exit_dirs, (1LL << newexit->dir));
|
|
|
-
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP CREATE EXIT {%s} {%s} TO ROOM %d.", newexit->name, newexit->cmd, newexit->vnum);
|
|
|
-
|
|
|
- pop_call();
|
|
|
- return newexit;
|
|
|
-}
|
|
|
-
|
|
|
-void delete_exit(struct session *ses, int room, struct exit_data *exit)
|
|
|
-{
|
|
|
- free(exit->name);
|
|
|
- free(exit->cmd);
|
|
|
- free(exit->data);
|
|
|
-
|
|
|
- UNLINK(exit, ses->map->room_list[room]->f_exit, ses->map->room_list[room]->l_exit)
|
|
|
-
|
|
|
- set_room_exits(ses, room);
|
|
|
-
|
|
|
- free(exit);
|
|
|
+ return TRUE;
|
|
|
}
|
|
|
|
|
|
-int get_exit_dir(struct session *ses, char *arg)
|
|
|
+int tunnel_void(struct session *ses, int from, int room, int dir)
|
|
|
{
|
|
|
- struct listnode *node;
|
|
|
-
|
|
|
- node = search_node_list(ses->list[LIST_PATHDIR], arg);
|
|
|
-
|
|
|
- if (node)
|
|
|
- {
|
|
|
- return atoi(node->arg3);
|
|
|
- }
|
|
|
- else
|
|
|
+ if (!HAS_BIT(ses->map->room_list[room]->flags, ROOM_FLAG_VOID))
|
|
|
{
|
|
|
- return 0;
|
|
|
+ return room;
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-int get_exit_grid(struct session *ses, int dir)
|
|
|
-{
|
|
|
- switch (dir)
|
|
|
+ if (get_room_exits(ses, room) != 2)
|
|
|
{
|
|
|
- case 0:
|
|
|
- return EXIT_GRID_0;
|
|
|
- case MAP_EXIT_N:
|
|
|
- return EXIT_GRID_N;
|
|
|
- case MAP_EXIT_E:
|
|
|
- return EXIT_GRID_E;
|
|
|
- case MAP_EXIT_S:
|
|
|
- return EXIT_GRID_S;
|
|
|
- case MAP_EXIT_W:
|
|
|
- return EXIT_GRID_W;
|
|
|
- case MAP_EXIT_N|MAP_EXIT_E:
|
|
|
- return EXIT_GRID_NE;
|
|
|
- case MAP_EXIT_N|MAP_EXIT_W:
|
|
|
- return EXIT_GRID_NW;
|
|
|
- case MAP_EXIT_S|MAP_EXIT_E:
|
|
|
- return EXIT_GRID_SE;
|
|
|
- case MAP_EXIT_S|MAP_EXIT_W:
|
|
|
- return EXIT_GRID_SW;
|
|
|
+ struct exit_data *exit = ses->map->room_list[room]->exit_grid[dir_to_grid(dir)];
|
|
|
+
|
|
|
+ if (exit)
|
|
|
+ {
|
|
|
+ return tunnel_void(ses, room, exit->vnum, exit->dir);
|
|
|
+ }
|
|
|
+ return room;
|
|
|
}
|
|
|
|
|
|
- if (HAS_BIT(dir, MAP_EXIT_D))
|
|
|
+ if (ses->map->room_list[room]->f_exit->vnum != from)
|
|
|
{
|
|
|
- return EXIT_GRID_D;
|
|
|
+ return tunnel_void(ses, room, ses->map->room_list[room]->f_exit->vnum, ses->map->room_list[room]->f_exit->dir);
|
|
|
}
|
|
|
-
|
|
|
- if (HAS_BIT(dir, MAP_EXIT_U))
|
|
|
+ else
|
|
|
{
|
|
|
- return EXIT_GRID_U;
|
|
|
+ return tunnel_void(ses, room, ses->map->room_list[room]->l_exit->vnum, ses->map->room_list[room]->l_exit->dir);
|
|
|
}
|
|
|
-
|
|
|
- return EXIT_GRID_0;
|
|
|
}
|
|
|
|
|
|
-int get_room_exits(struct session *ses, int room)
|
|
|
-{
|
|
|
- return ses->map->room_list[room]->exit_size;
|
|
|
-}
|
|
|
+// shortest_path() utilities
|
|
|
|
|
|
-void set_room_exits(struct session *ses, int vnum)
|
|
|
+int searchgrid_find(struct session *ses, int from, struct search_data *search)
|
|
|
{
|
|
|
+ int vnum, head, tail, index;
|
|
|
+ float length;
|
|
|
+ struct grid_node *node, *temp, list[MAP_BF_SIZE];
|
|
|
struct exit_data *exit;
|
|
|
struct room_data *room;
|
|
|
|
|
|
- room = ses->map->room_list[vnum];
|
|
|
+ search->stamp++;
|
|
|
|
|
|
- room->exit_dirs = 0;
|
|
|
- room->exit_size = 0;
|
|
|
+ head = 0;
|
|
|
+ tail = 1;
|
|
|
|
|
|
- memset(room->exit_grid, 0, sizeof(struct exit_data *) * 11);
|
|
|
+ node = &list[head];
|
|
|
|
|
|
- for (exit = room->f_exit ; exit ; exit = exit->next)
|
|
|
- {
|
|
|
- SET_BIT(room->exit_dirs, 1LL << exit->dir);
|
|
|
+ node->vnum = from;
|
|
|
+ node->length = ses->map->room_list[from]->weight;
|
|
|
|
|
|
- if (room->exit_grid[exit->grid] == NULL)
|
|
|
- {
|
|
|
- room->exit_grid[exit->grid] = exit;
|
|
|
- }
|
|
|
- room->exit_size++;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-int follow_map(struct session *ses, char *argument)
|
|
|
-{
|
|
|
- struct room_data *room;
|
|
|
- struct exit_data *exit;;
|
|
|
- int in_room, vnum;
|
|
|
-
|
|
|
- push_call("follow_map(%p,%p)",ses,argument);
|
|
|
+ // for map_list
|
|
|
|
|
|
- room = ses->map->room_list[ses->map->in_room];
|
|
|
+ node->w = 0;
|
|
|
+ node->x = 0;
|
|
|
+ node->y = 0;
|
|
|
+ node->z = 0;
|
|
|
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW))
|
|
|
+ while (head != tail)
|
|
|
{
|
|
|
- if (check_global(ses, room->vnum) && find_exit(ses, ses->map->global_vnum, argument))
|
|
|
- {
|
|
|
- in_room = ses->map->global_vnum;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- in_room = ses->map->in_room;
|
|
|
- }
|
|
|
- exit = find_exit(ses, in_room, argument);
|
|
|
+ node = &list[head];
|
|
|
|
|
|
- if (exit)
|
|
|
- {
|
|
|
- ses->map->dir = exit->dir;
|
|
|
+ room = ses->map->room_list[node->vnum];
|
|
|
|
|
|
- vnum = tunnel_void(ses, in_room, exit->vnum, exit->dir);
|
|
|
+ length = node->length;
|
|
|
|
|
|
- check_all_events(ses, SUB_ARG, 0, 5, "MAP FOLLOW MAP", ntos(in_room), ntos(vnum), exit->name);
|
|
|
- }
|
|
|
- pop_call();
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ head = (head + 1) % MAP_BF_SIZE;
|
|
|
|
|
|
- if (check_global(ses, room->vnum))
|
|
|
- {
|
|
|
- if (find_exit(ses, ses->map->global_vnum, argument))
|
|
|
+ if (search->stamp != room->search_stamp)
|
|
|
{
|
|
|
- goto_room(ses, ses->map->global_vnum);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- exit = find_exit(ses, ses->map->in_room, argument);
|
|
|
+ room->search_stamp = search->stamp;
|
|
|
|
|
|
- if (exit)
|
|
|
- {
|
|
|
- ses->map->dir = exit->dir;
|
|
|
+ // first come first serve like with spatialgrid_find
|
|
|
|
|
|
- in_room = ses->map->in_room;
|
|
|
+ room->w = node->w;
|
|
|
+ room->x = node->x;
|
|
|
+ room->y = node->y;
|
|
|
+ room->z = node->z;
|
|
|
|
|
|
- if (ses->map->nofollow == 0)
|
|
|
+ DEL_BIT(room->flags, ROOM_FLAG_PATH);
|
|
|
+ }
|
|
|
+ else if (length >= room->length)
|
|
|
{
|
|
|
- ses->map->nofollow++;
|
|
|
-
|
|
|
- script_driver(ses, LIST_COMMAND, exit->cmd);
|
|
|
-
|
|
|
- ses->map->nofollow--;
|
|
|
+ if (room->vnum != ses->map->global_vnum && room->w && node->w == 0)
|
|
|
+ {
|
|
|
+ room->w = node->w;
|
|
|
+ room->x = node->x;
|
|
|
+ room->y = node->y;
|
|
|
+ room->z = node->z;
|
|
|
+ }
|
|
|
+ continue;
|
|
|
}
|
|
|
|
|
|
- vnum = tunnel_void(ses, in_room, exit->vnum, exit->dir);
|
|
|
-
|
|
|
- check_all_events(ses, SUB_ARG, 0, 5, "MAP FOLLOW MAP", ntos(in_room), ntos(vnum), exit->name);
|
|
|
-
|
|
|
- add_undo(ses, "%d %d %d", vnum, in_room, MAP_UNDO_MOVE);
|
|
|
-
|
|
|
- goto_room(ses, vnum);
|
|
|
+ room->length = length;
|
|
|
|
|
|
- if (HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_LEAVE))
|
|
|
+ if (search->vnum)
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: LEAVE FLAG FOUND IN ROOM {%d}. LEAVING MAP.", ses->map->in_room);
|
|
|
-
|
|
|
- map_leave(ses, "", "", "");
|
|
|
+ if (room->vnum == search->vnum)
|
|
|
+ {
|
|
|
+ return room->vnum;
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP))
|
|
|
+ else
|
|
|
{
|
|
|
- SET_BIT(ses->flags, SES_FLAG_UPDATEVTMAP);
|
|
|
+ if (match_room(ses, room->vnum, search))
|
|
|
+ {
|
|
|
+ return room->vnum;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- pop_call();
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- if (!HAS_BIT(ses->map->flags, MAP_FLAG_STATIC) && !HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_STATIC))
|
|
|
- {
|
|
|
- struct listnode *node;
|
|
|
-
|
|
|
- if ((node = search_node_list(ses->list[LIST_PATHDIR], argument)) == NULL)
|
|
|
+ if (check_global(ses, room->vnum))
|
|
|
{
|
|
|
- pop_call();
|
|
|
- return 0;
|
|
|
+ exit = ses->map->global_exit;
|
|
|
}
|
|
|
-
|
|
|
- in_room = find_coord(ses, argument);
|
|
|
-
|
|
|
- if (in_room)
|
|
|
+ else
|
|
|
{
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP CREATE LINK %5d {%s}.", in_room, ses->map->room_list[in_room]->name);
|
|
|
-
|
|
|
- add_undo(ses, "%d %d %d", in_room, ses->map->in_room, MAP_UNDO_MOVE|MAP_UNDO_LINK);
|
|
|
+ exit = room->f_exit;
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ for ( ; exit ; exit = exit->next)
|
|
|
{
|
|
|
- for (in_room = 1 ; in_room < ses->map->size ; in_room++)
|
|
|
+ vnum = tunnel_void(ses, room->vnum, exit->vnum, exit->dir);
|
|
|
+
|
|
|
+ if (HAS_BIT(exit->flags, EXIT_FLAG_AVOID|EXIT_FLAG_BLOCK) || HAS_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_AVOID|ROOM_FLAG_BLOCK))
|
|
|
{
|
|
|
- if (ses->map->room_list[in_room] == NULL)
|
|
|
+ goto next_exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ length = room->length + exit->weight + ses->map->room_list[vnum]->weight;
|
|
|
+
|
|
|
+ if (search->stamp == ses->map->room_list[vnum]->search_stamp)
|
|
|
+ {
|
|
|
+ if (length >= ses->map->room_list[vnum]->length)
|
|
|
{
|
|
|
- break;
|
|
|
+ goto next_exit;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (in_room == ses->map->size)
|
|
|
+ temp = &list[tail];
|
|
|
+
|
|
|
+ temp->vnum = vnum;
|
|
|
+ temp->length = length;
|
|
|
+ temp->w = room->vnum == ses->map->global_vnum ? 1 : room->w;
|
|
|
+ temp->x = room->x + (HAS_BIT(exit->dir, MAP_EXIT_E) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_W) ? -1 : 0);
|
|
|
+ temp->y = room->y + (HAS_BIT(exit->dir, MAP_EXIT_N) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_S) ? -1 : 0);
|
|
|
+ temp->z = room->z + (HAS_BIT(exit->dir, MAP_EXIT_U) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_D) ? -1 : 0);
|
|
|
+
|
|
|
+ /*
|
|
|
+ list must remain ordered by length
|
|
|
+ */
|
|
|
+
|
|
|
+ index = tail;
|
|
|
+
|
|
|
+ while (index != head)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: Maximum amount of rooms of %d reached. Use #MAP RESIZE to increase the maximum.", ses->map->size);
|
|
|
+ temp = &list[index];
|
|
|
|
|
|
- pop_call();
|
|
|
- return 1;
|
|
|
- }
|
|
|
- add_undo(ses, "%d %d %d", in_room, ses->map->in_room, MAP_UNDO_MOVE|MAP_UNDO_CREATE|MAP_UNDO_LINK);
|
|
|
+ node = &list[index ? index - 1 : MAP_BF_SIZE - 1];
|
|
|
|
|
|
- create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {}", in_room);
|
|
|
- }
|
|
|
+ if (temp->length >= node->length)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- exit = create_exit(ses, ses->map->in_room, "{%d} {%s} {%s}", in_room, node->arg1, node->arg1);
|
|
|
+ vnum = temp->vnum;
|
|
|
+ length = temp->length;
|
|
|
|
|
|
- ses->map->dir = exit->dir;
|
|
|
+ temp->vnum = node->vnum;
|
|
|
+ temp->length = node->length;
|
|
|
|
|
|
- if (find_exit(ses, in_room, node->arg2) == NULL)
|
|
|
- {
|
|
|
- create_exit(ses, in_room, "{%d} {%s} {%s}", ses->map->in_room, node->arg2, node->arg2);
|
|
|
- }
|
|
|
+ node->vnum = vnum;
|
|
|
+ node->length = length;
|
|
|
|
|
|
- if (ses->map->nofollow == 0)
|
|
|
- {
|
|
|
- ses->map->nofollow++;
|
|
|
+ index = index ? index - 1 : MAP_BF_SIZE - 1;
|
|
|
+ }
|
|
|
|
|
|
- script_driver(ses, LIST_COMMAND, argument);
|
|
|
+ tail = (tail + 1) % MAP_BF_SIZE;
|
|
|
|
|
|
- ses->map->nofollow--;
|
|
|
- }
|
|
|
- goto_room(ses, in_room);
|
|
|
+ if (tail == head)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SHORTEST PATH: MAP TOO BIG FOR BF STACK OF %d", MAP_BF_SIZE);
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP))
|
|
|
- {
|
|
|
- SET_BIT(ses->flags, SES_FLAG_UPDATEVTMAP);
|
|
|
- }
|
|
|
+ next_exit:
|
|
|
|
|
|
- pop_call();
|
|
|
- return 1;
|
|
|
+ if (exit == ses->map->global_exit)
|
|
|
+ {
|
|
|
+ exit->next = room->f_exit;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- pop_call();
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-void add_undo(struct session *ses, char *format, ...)
|
|
|
+int searchgrid_walk(struct session *ses, int offset, int from, int dest)
|
|
|
{
|
|
|
- struct link_data *link;
|
|
|
- char buf[BUFFER_SIZE], *arg, dir[BUFFER_SIZE], rev[BUFFER_SIZE], flag[BUFFER_SIZE];
|
|
|
- va_list args;
|
|
|
+ int vnum, trim, head, tail, index;
|
|
|
+ float length;
|
|
|
+ struct grid_node *node, *temp, list[MAP_BF_SIZE];
|
|
|
+ struct exit_data *exit;
|
|
|
+ struct room_data *room;
|
|
|
|
|
|
- push_call("add_undo(%s,%s)",ses->name, format);
|
|
|
+ head = 0;
|
|
|
+ tail = 1;
|
|
|
|
|
|
- va_start(args, format);
|
|
|
- vsprintf(buf, format, args);
|
|
|
- va_end(args);
|
|
|
+ list[head].vnum = from;
|
|
|
+ list[head].length = ses->map->room_list[from]->weight;
|
|
|
|
|
|
- arg = get_arg_in_braces(ses, buf, dir, GET_ONE);
|
|
|
- arg = get_arg_in_braces(ses, arg, rev, GET_ONE);
|
|
|
- arg = get_arg_in_braces(ses, arg, flag, GET_ONE);
|
|
|
+ while (head != tail)
|
|
|
+ {
|
|
|
+ node = &list[head];
|
|
|
|
|
|
- link = (struct link_data *) calloc(1, sizeof(struct link_data));
|
|
|
+ room = ses->map->room_list[node->vnum];
|
|
|
|
|
|
- link->str1 = strdup(dir);
|
|
|
- link->str2 = strdup(rev);
|
|
|
- link->str3 = strdup(flag);
|
|
|
+ length = node->length;
|
|
|
|
|
|
- LINK(link, ses->map->undo_head, ses->map->undo_tail);
|
|
|
+ head = (head + 1) % MAP_BF_SIZE;
|
|
|
|
|
|
- ses->map->undo_size++;
|
|
|
|
|
|
- if (ses->map->undo_size > 100)
|
|
|
- {
|
|
|
- del_undo(ses, ses->map->undo_head);
|
|
|
- }
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
-}
|
|
|
+ if (length >= room->length)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
-void del_undo(struct session *ses, struct link_data *link)
|
|
|
-{
|
|
|
- UNLINK(link, ses->map->undo_head, ses->map->undo_tail);
|
|
|
+ room->length = length;
|
|
|
|
|
|
- free(link->str1);
|
|
|
- free(link->str2);
|
|
|
- free(link->str3);
|
|
|
-
|
|
|
- free(link);
|
|
|
-
|
|
|
- ses->map->undo_size--;
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- Draws a map on a grid, original breadth first improvements by Bryan Turner
|
|
|
-*/
|
|
|
+ if (room->vnum == dest)
|
|
|
+ {
|
|
|
+ return room->vnum;
|
|
|
+ }
|
|
|
|
|
|
+ trim = 1;
|
|
|
|
|
|
+ if (check_global(ses, room->vnum))
|
|
|
+ {
|
|
|
+ exit = ses->map->global_exit;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ exit = room->f_exit;
|
|
|
+ }
|
|
|
|
|
|
-struct grid_node
|
|
|
-{
|
|
|
- int vnum;
|
|
|
- int flags;
|
|
|
- float length;
|
|
|
- int w;
|
|
|
- int x;
|
|
|
- int y;
|
|
|
- int z;
|
|
|
-};
|
|
|
+ for ( ; exit ; exit = exit->next)
|
|
|
+ {
|
|
|
+ vnum = tunnel_void(ses, room->vnum, exit->vnum, exit->dir);
|
|
|
|
|
|
-void displaygrid_build(struct session *ses, int vnum, int x, int y, int z)
|
|
|
-{
|
|
|
- int head, tail;
|
|
|
- struct grid_node *node, *temp, list[MAP_BF_SIZE];
|
|
|
- struct exit_data *exit;
|
|
|
- struct room_data *room;
|
|
|
+ if (HAS_BIT(exit->flags, EXIT_FLAG_AVOID|EXIT_FLAG_BLOCK) || HAS_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_AVOID|ROOM_FLAG_BLOCK))
|
|
|
+ {
|
|
|
+ goto next_exit;
|
|
|
+ }
|
|
|
|
|
|
- push_call("displaygrid_build(%p,%d,%d,%d,%d)",ses,vnum,x,y,z);
|
|
|
+ length = room->length + exit->weight + ses->map->room_list[vnum]->weight;
|
|
|
|
|
|
- map_grid_x = x;
|
|
|
- map_grid_y = y;
|
|
|
+ if (ses->map->search->stamp != ses->map->room_list[vnum]->search_stamp)
|
|
|
+ {
|
|
|
+ goto next_exit;
|
|
|
+ }
|
|
|
|
|
|
- head = 0;
|
|
|
- tail = 1;
|
|
|
+ if (length >= ses->map->room_list[vnum]->length || length >= ses->map->room_list[dest]->length)
|
|
|
+ {
|
|
|
+ goto next_exit;
|
|
|
+ }
|
|
|
|
|
|
- node = &list[head];
|
|
|
+ temp = &list[tail];
|
|
|
|
|
|
- node->vnum = vnum;
|
|
|
- node->x = x / 2 + ses->map->center_x;
|
|
|
- node->y = y / 2 + ses->map->center_y;
|
|
|
- node->z = z / 2 + ses->map->center_z;
|
|
|
- node->length = 0;
|
|
|
- node->flags = 0;
|
|
|
+ temp->vnum = vnum;
|
|
|
+ temp->length = length;
|
|
|
|
|
|
- ses->map->display_stamp++;
|
|
|
+ /*
|
|
|
+ list must remain ordered by length
|
|
|
+ */
|
|
|
|
|
|
- for (vnum = 0 ; vnum < x * y ; vnum++)
|
|
|
- {
|
|
|
- ses->map->grid_rooms[vnum] = NULL;
|
|
|
- ses->map->grid_flags[vnum] = 0;
|
|
|
- }
|
|
|
+ index = tail;
|
|
|
|
|
|
- while (head != tail)
|
|
|
- {
|
|
|
- node = &list[head];
|
|
|
+ while (index != head)
|
|
|
+ {
|
|
|
+ temp = &list[index];
|
|
|
|
|
|
- head = (head + 1) % MAP_BF_SIZE;
|
|
|
+ node = &list[index ? index - 1 : MAP_BF_SIZE - 1];
|
|
|
|
|
|
- room = ses->map->room_list[node->vnum];
|
|
|
+ if (temp->length >= node->length)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- if (ses->map->display_stamp != room->display_stamp)
|
|
|
- {
|
|
|
- room->display_stamp = ses->map->display_stamp;
|
|
|
- }
|
|
|
- else if (room->length <= node->length)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
+ vnum = temp->vnum;
|
|
|
+ length = temp->length;
|
|
|
|
|
|
- room->length = node->length;
|
|
|
+ temp->vnum = node->vnum;
|
|
|
+ temp->length = node->length;
|
|
|
|
|
|
- if (node->x >= 0 && node->x < map_grid_x && node->y >= 0 && node->y < map_grid_y && node->z == 0)
|
|
|
- {
|
|
|
- if (ses->map->grid_rooms[node->x + map_grid_x * node->y] == NULL/* || HAS_BIT(ses->map->grid_flags[node->x + map_grid_x * node->y], GRID_FLAG_HIDE)*/)
|
|
|
- {
|
|
|
- ses->map->grid_rooms[node->x + map_grid_x * node->y] = room;
|
|
|
- ses->map->grid_flags[node->x + map_grid_x * node->y] = node->flags;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
-/*
|
|
|
- if (HAS_BIT(node->flags, GRID_FLAG_HIDE))
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
-*/
|
|
|
- for (exit = room->f_exit ; exit ; exit = exit->next)
|
|
|
- {
|
|
|
- if (ses->map->display_stamp == ses->map->room_list[exit->vnum]->display_stamp)
|
|
|
- {
|
|
|
- if (room->length >= ses->map->room_list[exit->vnum]->length)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
+ node->vnum = vnum;
|
|
|
+ node->length = length;
|
|
|
|
|
|
- if (exit->dir == 0)
|
|
|
- {
|
|
|
- continue;
|
|
|
+ index = index ? index - 1 : MAP_BF_SIZE - 1;
|
|
|
}
|
|
|
|
|
|
- if (HAS_BIT(exit->flags, EXIT_FLAG_HIDE) || HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_HIDE))
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
+ tail = (tail + 1) % MAP_BF_SIZE;
|
|
|
|
|
|
- if (head == (tail + 1) % MAP_BF_SIZE)
|
|
|
+ if (tail == head)
|
|
|
{
|
|
|
+ show_error(ses, LIST_COMMAND, "#SHORTEST PATH: MAP TOO BIG FOR BF STACK OF %d", MAP_BF_SIZE);
|
|
|
break;
|
|
|
}
|
|
|
+ trim = 0;
|
|
|
|
|
|
- temp = &list[tail];
|
|
|
-
|
|
|
- temp->vnum = exit->vnum;
|
|
|
- temp->x = node->x + (HAS_BIT(exit->dir, MAP_EXIT_E) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_W) ? -1 : 0);
|
|
|
- temp->y = node->y + (HAS_BIT(exit->dir, MAP_EXIT_N) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_S) ? -1 : 0);
|
|
|
- temp->z = node->z + (HAS_BIT(exit->dir, MAP_EXIT_U) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_D) ? -1 : 0);
|
|
|
- temp->length = node->length + 1;
|
|
|
- temp->flags = 0;
|
|
|
-/*
|
|
|
- if (HAS_BIT(exit->flags, EXIT_FLAG_HIDE) || HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_HIDE))
|
|
|
- {
|
|
|
- SET_BIT(temp->flags, GRID_FLAG_HIDE);
|
|
|
+ next_exit:
|
|
|
|
|
|
- temp->length += 1000;
|
|
|
- }
|
|
|
-*/
|
|
|
- if (HAS_BIT(exit->flags, EXIT_FLAG_INVIS) || HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_INVIS))
|
|
|
+ if (exit == ses->map->global_exit)
|
|
|
{
|
|
|
- SET_BIT(temp->flags, GRID_FLAG_INVIS);
|
|
|
+ exit->next = room->f_exit;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- tail = (tail + 1) % MAP_BF_SIZE;
|
|
|
+ if (trim)
|
|
|
+ {
|
|
|
+ room->length = 0;
|
|
|
}
|
|
|
}
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-void show_vtmap(struct session *ses)
|
|
|
+void shortest_path(struct session *ses, int run, char *delay, char *arg)
|
|
|
{
|
|
|
- char buf[BUFFER_SIZE], out[BUFFER_SIZE];
|
|
|
- int x, y, line;
|
|
|
- int top_row, top_col, bot_row, bot_col, rows, cols;
|
|
|
-
|
|
|
- push_call("show_vtmap(%p)",ses);
|
|
|
+ char var[BUFFER_SIZE];
|
|
|
+ struct exit_data *exit;
|
|
|
+ struct room_data *room;
|
|
|
+ int vnum, dest;
|
|
|
|
|
|
- if (ses->map == NULL || !HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP))
|
|
|
+ if (HAS_BIT(ses->flags, SES_FLAG_PATHMAPPING))
|
|
|
{
|
|
|
- pop_call();
|
|
|
+ show_error(ses, LIST_COMMAND, "#SHORTEST PATH: You have to use #PATH END first.");
|
|
|
+
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (ses->map->room_list[ses->map->in_room] == NULL)
|
|
|
+ kill_list(ses->list[LIST_PATH]);
|
|
|
+
|
|
|
+ ses->list[LIST_PATH]->update = 0;
|
|
|
+
|
|
|
+ map_search_compile(ses, arg, var);
|
|
|
+
|
|
|
+ dest = searchgrid_find(ses, ses->map->in_room, ses->map->search);
|
|
|
+
|
|
|
+ if (dest == 0 || dest == ses->map->global_vnum)
|
|
|
{
|
|
|
- pop_call();
|
|
|
+ show_error(ses, LIST_COMMAND, "#SHORTEST PATH: NO PATH FOUND TO %s.", arg);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (ses != gtd->ses || HAS_BIT(gtd->ses->flags, SES_FLAG_READMUD))
|
|
|
+ if (dest == ses->map->in_room)
|
|
|
{
|
|
|
- pop_call();
|
|
|
+ show_error(ses, LIST_COMMAND, "#SHORTEST PATH: Already there.");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_RESIZE))
|
|
|
- {
|
|
|
- DEL_BIT(ses->map->flags, MAP_FLAG_RESIZE);
|
|
|
+ vnum = ses->map->in_room;
|
|
|
|
|
|
- map_offset(ses, NULL, "", "");
|
|
|
- }
|
|
|
+ // Slower than a backtrace, but works with mazes.
|
|
|
|
|
|
- if (ses->map->rows > 1 && ses->map->cols > 1)
|
|
|
- {
|
|
|
- top_row = ses->map->top_row;
|
|
|
- top_col = ses->map->top_col;
|
|
|
- bot_row = ses->map->bot_row;
|
|
|
- bot_col = ses->map->bot_col;
|
|
|
- rows = ses->map->rows;
|
|
|
- cols = ses->map->cols;
|
|
|
- }
|
|
|
- else
|
|
|
+ while (TRUE)
|
|
|
{
|
|
|
- top_row = 1;
|
|
|
- top_col = 1;
|
|
|
- bot_row = ses->split->top_row - 2;
|
|
|
- bot_col = gtd->screen->cols;
|
|
|
+ room = ses->map->room_list[vnum];
|
|
|
|
|
|
- rows = ses->split->top_row - 2;
|
|
|
- cols = gtd->screen->cols;
|
|
|
- }
|
|
|
+ if (check_global(ses, room->vnum))
|
|
|
+ {
|
|
|
+ exit = ses->map->global_exit;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ exit = room->f_exit;
|
|
|
+ }
|
|
|
|
|
|
- erase_square(ses, top_row, top_col, bot_row, bot_col);
|
|
|
+ for ( ; exit ; exit = exit->next)
|
|
|
+ {
|
|
|
+ if (HAS_BIT(exit->flags, EXIT_FLAG_AVOID|EXIT_FLAG_BLOCK) || HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_AVOID|ROOM_FLAG_BLOCK))
|
|
|
+ {
|
|
|
+ goto exit_next;
|
|
|
+ }
|
|
|
|
|
|
-// print_stdout("\e[%d;%d;%d;%d${", top_row, top_col, bot_row, bot_col);
|
|
|
+ vnum = tunnel_void(ses, room->vnum, exit->vnum, exit->dir);
|
|
|
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
- {
|
|
|
- map_grid_y = 2 + rows / 3;
|
|
|
- map_grid_x = 2 + cols / 6;
|
|
|
- }
|
|
|
- else if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS) || HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS))
|
|
|
- {
|
|
|
- map_grid_y = 2 + rows / 2;
|
|
|
- map_grid_x = 2 + cols / 5;
|
|
|
- }
|
|
|
- else if (HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT))
|
|
|
- {
|
|
|
- map_grid_y = 2 + rows;
|
|
|
- map_grid_x = 2 + cols / 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- map_grid_y = 2 + rows;
|
|
|
- map_grid_x = 2 + cols;
|
|
|
- }
|
|
|
+ if (searchgrid_walk(ses, room->length, vnum, dest))
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- displaygrid_build(ses, ses->map->in_room, map_grid_x, map_grid_y, 0);
|
|
|
+ exit_next:
|
|
|
|
|
|
- save_pos(ses);
|
|
|
+ if (exit == ses->map->global_exit)
|
|
|
+ {
|
|
|
+ exit->next = room->f_exit;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- goto_pos(ses, top_row, 1);
|
|
|
+ if (exit == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SHORTEST PATH: UNKNOWN ERROR.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
- {
|
|
|
- for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
+ if (exit != ses->map->global_exit)
|
|
|
{
|
|
|
- for (line = 1 ; line <= 3 ; line++)
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW))
|
|
|
{
|
|
|
- strcpy(buf, ses->map->color[MAP_COLOR_BACK]);
|
|
|
+ check_append_path(ses, exit->cmd, "", 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ check_append_path(ses, exit->name, "", 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
- {
|
|
|
- strcat(buf, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], line, x, y));
|
|
|
- }
|
|
|
+ SET_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_PATH);
|
|
|
|
|
|
- substitute(ses, buf, out, SUB_COL|SUB_CMP|SUB_LIT);
|
|
|
+ if (ses->map->room_list[vnum]->search_stamp != ses->map->search->stamp)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "%d bad search stamp %d vs %d", vnum, ses->map->room_list[vnum]->search_stamp, ses->map->search->stamp);
|
|
|
+ }
|
|
|
|
|
|
- print_stdout("\e[%dG%s\e[0m\n", top_col, out);
|
|
|
- }
|
|
|
+ if (vnum == dest)
|
|
|
+ {
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
- else if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS) || HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS))
|
|
|
+
|
|
|
+ if (run)
|
|
|
{
|
|
|
- for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
- {
|
|
|
- for (line = 1 ; line <= 2 ; line++)
|
|
|
- {
|
|
|
- strcpy(buf, ses->map->color[MAP_COLOR_BACK]);
|
|
|
+ path_run(ses, delay);
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
- {
|
|
|
- strcat(buf, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], line, x, y));
|
|
|
- }
|
|
|
- substitute(ses, buf, out, SUB_COL|SUB_CMP|SUB_LIT);
|
|
|
+/*
|
|
|
+ Virtual coordinate search for linkable rooms when creating a new room.
|
|
|
+*/
|
|
|
|
|
|
- print_stdout("\e[%dG%s\e[0m\n", top_col, out);
|
|
|
- }
|
|
|
- }
|
|
|
+int find_coord(struct session *ses, char *arg)
|
|
|
+{
|
|
|
+ int dir, x, y, z, room;
|
|
|
+
|
|
|
+ dir = get_exit_dir(ses, arg);
|
|
|
+
|
|
|
+ if (dir == 0)
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ x = (HAS_BIT(dir, MAP_EXIT_E) ? 1 : HAS_BIT(dir, MAP_EXIT_W) ? -1 : 0);
|
|
|
+ y = (HAS_BIT(dir, MAP_EXIT_N) ? 1 : HAS_BIT(dir, MAP_EXIT_S) ? -1 : 0);
|
|
|
+ z = (HAS_BIT(dir, MAP_EXIT_U) ? 1 : HAS_BIT(dir, MAP_EXIT_D) ? -1 : 0);
|
|
|
+
|
|
|
+ room = spatialgrid_find(ses, ses->map->in_room, x, y, z);
|
|
|
+
|
|
|
+ if (ses->map->room_list[room])
|
|
|
{
|
|
|
- for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
+ if (HAS_BIT(ses->map->room_list[room]->flags, ROOM_FLAG_STATIC))
|
|
|
{
|
|
|
- strcpy(buf, ses->map->color[MAP_COLOR_BACK]);
|
|
|
-
|
|
|
- for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
- {
|
|
|
- strcat(buf, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], 0, x, y));
|
|
|
- }
|
|
|
- substitute(ses, buf, out, SUB_COL|SUB_CMP|SUB_LIT);
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Linkable room is marked static. Creating overlapping room instead.");
|
|
|
|
|
|
- print_stdout("\e[%dG%s\e[0m\n", top_col, out);
|
|
|
+ return 0;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- restore_pos(ses);
|
|
|
-
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
+ return room;
|
|
|
}
|
|
|
|
|
|
-// http://shapecatcher.com/unicode/block/Mathematical_Operators diagonal #⊥⊤#
|
|
|
+// Used by #map jump and the auto linker
|
|
|
|
|
|
-char *draw_room(struct session *ses, struct room_data *room, int line, int x, int y)
|
|
|
+int spatialgrid_find(struct session *ses, int from, int x, int y, int z)
|
|
|
{
|
|
|
- static char buf[201], *room_color, room_left[101], room_right[101];
|
|
|
- int index, flags, exits, exit1, exit2, room1, room2, offset;
|
|
|
+ int head, tail;
|
|
|
+ struct grid_node *node, *temp, list[MAP_BF_SIZE];
|
|
|
+ struct exit_data *exit;
|
|
|
+ struct room_data *room;
|
|
|
|
|
|
- push_call("draw_room(%p,%p,%d,%d,%d)",ses,room,line,x,y);
|
|
|
+ push_call("spatialgrid_find(%s,%d,%d,%d,%d)",ses->name,from,x,y,z);
|
|
|
|
|
|
- offset = HAS_BIT(ses->charset, CHARSET_FLAG_UTF8) ? LEGEND_UNICODE : LEGEND_ASCII;
|
|
|
+ head = 0;
|
|
|
+ tail = 1;
|
|
|
|
|
|
- room_color = ses->map->color[MAP_COLOR_ROOM];
|
|
|
+ node = &list[head];
|
|
|
|
|
|
- if (room)
|
|
|
+ node->vnum = from;
|
|
|
+ node->x = 0;
|
|
|
+ node->y = 0;
|
|
|
+ node->z = 0;
|
|
|
+ node->length = 0;
|
|
|
+ node->flags = 0;
|
|
|
+
|
|
|
+ ses->map->display_stamp++;
|
|
|
+
|
|
|
+ while (head != tail)
|
|
|
{
|
|
|
- if (HAS_BIT(room->flags, ROOM_FLAG_PATH) && room->search_stamp == ses->map->search->stamp)
|
|
|
- {
|
|
|
- room_color = ses->map->color[MAP_COLOR_PATH];
|
|
|
- }
|
|
|
- else if (*room->color)
|
|
|
+ node = &list[head];
|
|
|
+
|
|
|
+ head = (head + 1) % MAP_BF_SIZE;
|
|
|
+
|
|
|
+ room = ses->map->room_list[node->vnum];
|
|
|
+
|
|
|
+ if (ses->map->display_stamp != room->display_stamp)
|
|
|
{
|
|
|
- room_color = room->color;
|
|
|
+ room->display_stamp = ses->map->display_stamp;
|
|
|
}
|
|
|
- else
|
|
|
+ else if (room->length <= node->length)
|
|
|
{
|
|
|
- if (HAS_BIT(ses->map->grid_flags[x + map_grid_x * y], GRID_FLAG_INVIS))
|
|
|
- {
|
|
|
- room_color = ses->map->color[MAP_COLOR_INVIS];
|
|
|
- }
|
|
|
- else if (HAS_BIT(room->flags, ROOM_FLAG_INVIS))
|
|
|
- {
|
|
|
- room_color = ses->map->color[MAP_COLOR_INVIS];
|
|
|
- }
|
|
|
-/* else if (HAS_BIT(ses->map->grid_flags[x + map_grid_x * y], GRID_FLAG_HIDE))
|
|
|
- {
|
|
|
- room_color = ses->map->color[MAP_COLOR_HIDE];
|
|
|
- }*/
|
|
|
- else if (HAS_BIT(room->flags, ROOM_FLAG_HIDE))
|
|
|
- {
|
|
|
- room_color = ses->map->color[MAP_COLOR_HIDE];
|
|
|
- }
|
|
|
- else if (HAS_BIT(room->flags, ROOM_FLAG_AVOID))
|
|
|
- {
|
|
|
- room_color = ses->map->color[MAP_COLOR_AVOID];
|
|
|
- }
|
|
|
- else if (HAS_BIT(ses->map->flags, MAP_FLAG_SYMBOLGRAPHICS))
|
|
|
- {
|
|
|
- room_color = ses->map->color[MAP_COLOR_SYMBOL];
|
|
|
- }
|
|
|
+ continue;
|
|
|
}
|
|
|
|
|
|
- if (HAS_BIT(room->flags, ROOM_FLAG_CURVED))
|
|
|
+ room->length = node->length;
|
|
|
+/*
|
|
|
+ if (HAS_BIT(node->flags, GRID_FLAG_HIDE))
|
|
|
{
|
|
|
- sprintf(room_left, "%s(", room_color);
|
|
|
- sprintf(room_right, "%s)", room_color);
|
|
|
+ continue;
|
|
|
}
|
|
|
- else
|
|
|
+*/
|
|
|
+ if (node->x == x && node->y == y && node->z == z)
|
|
|
{
|
|
|
- sprintf(room_left, "%s[", room_color);
|
|
|
- sprintf(room_right, "%s]", room_color);
|
|
|
+ pop_call();
|
|
|
+ return node->vnum;
|
|
|
}
|
|
|
|
|
|
- if (room->vnum == ses->map->in_room)
|
|
|
+ for (exit = room->f_exit ; exit ; exit = exit->next)
|
|
|
{
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_DIRECTION))
|
|
|
+ if (ses->map->display_stamp == ses->map->room_list[exit->vnum]->display_stamp)
|
|
|
{
|
|
|
- exits = ses->map->dir;
|
|
|
-
|
|
|
- DEL_BIT(exits, MAP_EXIT_U|MAP_EXIT_D);
|
|
|
-
|
|
|
- switch (exits)
|
|
|
+ if (room->length >= ses->map->room_list[exit->vnum]->length)
|
|
|
{
|
|
|
- case MAP_EXIT_N:
|
|
|
- index = 24;
|
|
|
- break;
|
|
|
- case MAP_EXIT_N+MAP_EXIT_E:
|
|
|
- index = 25;
|
|
|
- break;
|
|
|
- case MAP_EXIT_E:
|
|
|
- index = 26;
|
|
|
- break;
|
|
|
- case MAP_EXIT_S+MAP_EXIT_E:
|
|
|
- index = 27;
|
|
|
- break;
|
|
|
- case MAP_EXIT_S:
|
|
|
- index = 28;
|
|
|
- break;
|
|
|
- case MAP_EXIT_W+MAP_EXIT_S:
|
|
|
- index = 29;
|
|
|
- break;
|
|
|
- case MAP_EXIT_W:
|
|
|
- index = 30;
|
|
|
- break;
|
|
|
- case MAP_EXIT_W+MAP_EXIT_N:
|
|
|
- index = 31;
|
|
|
- break;
|
|
|
- default:
|
|
|
- index = 17;
|
|
|
- break;
|
|
|
+ continue;
|
|
|
}
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (exit->dir == 0)
|
|
|
{
|
|
|
- index = 16;
|
|
|
+ continue;
|
|
|
}
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS))
|
|
|
- {
|
|
|
- struct room_data *room_n, *room_nw, *room_w;
|
|
|
- long long exit_n, exit_nw, exit_w;
|
|
|
|
|
|
- room_n = ses->map->grid_rooms[x + 0 + map_grid_x * (y + 1)];
|
|
|
- room_nw = ses->map->grid_rooms[x - 1 + map_grid_x * (y + 1)];
|
|
|
- room_w = ses->map->grid_rooms[x - 1 + map_grid_x * (y + 0)];
|
|
|
+ if (HAS_BIT(exit->flags, EXIT_FLAG_HIDE) || HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_HIDE))
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- exit_n = exit_nw = exit_w = 0;
|
|
|
+ if (head == (tail + 1) % MAP_BF_SIZE)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- if (room && room->exit_grid[EXIT_GRID_N])
|
|
|
- {
|
|
|
- SET_BIT(exit_n, MAP_DIR_N);
|
|
|
- }
|
|
|
+ temp = &list[tail];
|
|
|
|
|
|
- if (room_n && HAS_BIT(room_n->exit_dirs, MAP_DIR_S))
|
|
|
- {
|
|
|
- SET_BIT(exit_n, MAP_DIR_S);
|
|
|
- }
|
|
|
+ temp->vnum = exit->vnum;
|
|
|
+ temp->w = node->w;
|
|
|
+ temp->x = node->x + (HAS_BIT(exit->dir, MAP_EXIT_E) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_W) ? -1 : 0);
|
|
|
+ temp->y = node->y + (HAS_BIT(exit->dir, MAP_EXIT_N) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_S) ? -1 : 0);
|
|
|
+ temp->z = node->z + (HAS_BIT(exit->dir, MAP_EXIT_U) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_D) ? -1 : 0);
|
|
|
+ temp->length = node->length + 1;
|
|
|
+ temp->flags = 0;
|
|
|
+/*
|
|
|
+ if (HAS_BIT(exit->flags, EXIT_FLAG_HIDE) || HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_HIDE))
|
|
|
+ {
|
|
|
+ SET_BIT(temp->flags, GRID_FLAG_HIDE);
|
|
|
|
|
|
- if (room_n && HAS_BIT(room_n->exit_dirs, MAP_DIR_D))
|
|
|
- {
|
|
|
- SET_BIT(exit_n, MAP_DIR_D);
|
|
|
+ temp->length += 1000;
|
|
|
+ }
|
|
|
+*/
|
|
|
+ tail = (tail + 1) % MAP_BF_SIZE;
|
|
|
}
|
|
|
+ }
|
|
|
+ pop_call();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
- if (room && HAS_BIT(room->exit_dirs, MAP_DIR_NW))
|
|
|
- {
|
|
|
- SET_BIT(exit_nw, MAP_DIR_SE);
|
|
|
- }
|
|
|
+void explore_path(struct session *ses, int run, char *arg1, char *arg2)
|
|
|
+{
|
|
|
+ struct exit_data *exit;
|
|
|
+ int room, vnum;
|
|
|
|
|
|
- if (room_n && HAS_BIT(room_n->exit_dirs, MAP_DIR_SW))
|
|
|
- {
|
|
|
- SET_BIT(exit_nw, MAP_DIR_NE);
|
|
|
- }
|
|
|
- if (room_nw && HAS_BIT(room_nw->exit_dirs, MAP_DIR_SE))
|
|
|
+ for (vnum = 0 ; vnum < ses->map->size ; vnum++)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[vnum])
|
|
|
{
|
|
|
- SET_BIT(exit_nw, MAP_DIR_NW);
|
|
|
+ DEL_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_PATH);
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- if (room_w && HAS_BIT(room_w->exit_dirs, MAP_DIR_NE))
|
|
|
- {
|
|
|
- SET_BIT(exit_nw, MAP_DIR_SW);
|
|
|
- }
|
|
|
+ if (HAS_BIT(ses->flags, SES_FLAG_PATHMAPPING))
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP EXPLORE: You have to use #PATH END first.");
|
|
|
|
|
|
- if (room && room->exit_grid[EXIT_GRID_W])
|
|
|
- {
|
|
|
- SET_BIT(exit_w, MAP_DIR_E);
|
|
|
- }
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if (room_w && room_w->exit_grid[EXIT_GRID_E])
|
|
|
- {
|
|
|
- SET_BIT(exit_w, MAP_DIR_W);
|
|
|
- }
|
|
|
+ kill_list(ses->list[LIST_PATH]);
|
|
|
|
|
|
- sprintf(buf, "%s", ses->map->color[MAP_COLOR_EXIT]);
|
|
|
+ ses->list[LIST_PATH]->update = 0;
|
|
|
|
|
|
- switch (line)
|
|
|
- {
|
|
|
- case 1:
|
|
|
- switch (exit_nw)
|
|
|
- {
|
|
|
- case 0:
|
|
|
- strcat(buf, " ");
|
|
|
- break;
|
|
|
- case MAP_DIR_NE:
|
|
|
- strcat(buf, " ⸍");
|
|
|
- break;
|
|
|
- case MAP_DIR_SE:
|
|
|
- strcat(buf, " ⸜");
|
|
|
- break;
|
|
|
- case MAP_DIR_NE|MAP_DIR_SE:
|
|
|
- strcat(buf, " <");
|
|
|
- break;
|
|
|
- case MAP_DIR_SW:
|
|
|
- strcat(buf, "⸝ ");
|
|
|
- break;
|
|
|
- case MAP_DIR_NE|MAP_DIR_SW:
|
|
|
- strcat(buf, "/");
|
|
|
- break;
|
|
|
- case MAP_DIR_SE|MAP_DIR_SW:
|
|
|
- strcat(buf, "⸝⸜");
|
|
|
- break;
|
|
|
- case MAP_DIR_NE|MAP_DIR_SE|MAP_DIR_SW:
|
|
|
- strcat(buf, "⸝<");
|
|
|
- break;
|
|
|
- case MAP_DIR_NW:
|
|
|
- strcat(buf, "⸌ ");
|
|
|
- break;
|
|
|
- case MAP_DIR_NE|MAP_DIR_NW:
|
|
|
- strcat(buf, "⸌⸍");
|
|
|
- break;
|
|
|
- case MAP_DIR_SE|MAP_DIR_NW:
|
|
|
- strcat(buf, "\");
|
|
|
- break;
|
|
|
- case MAP_DIR_SW|MAP_DIR_NW:
|
|
|
- strcat(buf, "> ");
|
|
|
- break;
|
|
|
- case MAP_DIR_NE|MAP_DIR_SE|MAP_DIR_NW:
|
|
|
- strcat(buf, "⸌<");
|
|
|
- break;
|
|
|
- case MAP_DIR_NE|MAP_DIR_SW|MAP_DIR_NW:
|
|
|
- strcat(buf, ">⸍");
|
|
|
- break;
|
|
|
- case MAP_DIR_SE|MAP_DIR_SW|MAP_DIR_NW:
|
|
|
- strcat(buf, ">⸜");
|
|
|
- break;
|
|
|
- case MAP_DIR_NW|MAP_DIR_SE|MAP_DIR_NE|MAP_DIR_SW:
|
|
|
-// strcat(buf, "ᐳᐸ");
|
|
|
- strcat(buf, "><");
|
|
|
- break;
|
|
|
- default:
|
|
|
- strcat(buf, "??");
|
|
|
- break;
|
|
|
- }
|
|
|
+ room = ses->map->in_room;
|
|
|
|
|
|
- if (HAS_BIT(exit_n, MAP_DIR_D))
|
|
|
- {
|
|
|
- flags = dir_flags(ses, room_n->vnum, MAP_EXIT_D); // merging
|
|
|
+ exit = find_exit(ses, room, arg1);
|
|
|
|
|
|
- if (HAS_BIT(flags, EXIT_FLAG_AVOID))
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s-%s", ses->map->color[MAP_COLOR_AVOID], ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- else if (HAS_BIT(flags, EXIT_FLAG_HIDE))
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s-%s", ses->map->color[MAP_COLOR_HIDE], ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- else if (HAS_BIT(flags, EXIT_FLAG_INVIS))
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s-%s", ses->map->color[MAP_COLOR_INVIS], ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcat(buf, "-");
|
|
|
-// strcat(buf, "⏷");
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcat(buf, " ");
|
|
|
- }
|
|
|
+ if (exit == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: There's no exit named '%s'.", arg1);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- switch (HAS_BIT(exit_n, MAP_DIR_N|MAP_DIR_S))
|
|
|
- {
|
|
|
- case MAP_DIR_N:
|
|
|
- strcat(buf, "↑");
|
|
|
- break;
|
|
|
- case MAP_DIR_S:
|
|
|
- strcat(buf, "↓");
|
|
|
- break;
|
|
|
- case MAP_DIR_N|MAP_DIR_S:
|
|
|
- strcat(buf, "│");
|
|
|
- break;
|
|
|
- default:
|
|
|
- strcat(buf, " ");
|
|
|
- break;
|
|
|
- }
|
|
|
+ vnum = exit->vnum;
|
|
|
|
|
|
- if (room && room->exit_grid[EXIT_GRID_U])
|
|
|
- {
|
|
|
- flags = room->exit_grid[EXIT_GRID_U]->flags;
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW))
|
|
|
+ {
|
|
|
+ check_append_path(ses, exit->cmd, "", 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ check_append_path(ses, exit->name, "", 0);
|
|
|
+ }
|
|
|
|
|
|
- if (HAS_BIT(flags, EXIT_FLAG_AVOID))
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s+%s", ses->map->color[MAP_COLOR_AVOID], ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- else if (HAS_BIT(flags, EXIT_FLAG_HIDE))
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s+%s", ses->map->color[MAP_COLOR_HIDE], ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- else if (HAS_BIT(flags, EXIT_FLAG_INVIS))
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s+%s", ses->map->color[MAP_COLOR_INVIS], ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcat(buf, "+");
|
|
|
-// strcat(buf, "⏶");
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcat(buf, " ");
|
|
|
- }
|
|
|
- break;
|
|
|
+ SET_BIT(ses->map->room_list[room]->flags, ROOM_FLAG_PATH);
|
|
|
+ SET_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_PATH);
|
|
|
|
|
|
- case 2:
|
|
|
- if (room == NULL)
|
|
|
- {
|
|
|
- if (HAS_BIT(exit_w, MAP_DIR_W))
|
|
|
- {
|
|
|
- sprintf(buf, "%s→ ", ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(buf, " ");
|
|
|
- }
|
|
|
- pop_call();
|
|
|
- return buf;
|
|
|
- }
|
|
|
+ while (get_room_exits(ses, vnum) == 2)
|
|
|
+ {
|
|
|
+ exit = ses->map->room_list[vnum]->f_exit;
|
|
|
|
|
|
- switch (exit_w)
|
|
|
- {
|
|
|
- case 0:
|
|
|
- strcpy(buf, " ");
|
|
|
- break;
|
|
|
- case MAP_DIR_W:
|
|
|
- sprintf(buf, "%s→ ", ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- break;
|
|
|
- case MAP_DIR_E:
|
|
|
- sprintf(buf, "%s ←", ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- break;
|
|
|
- case MAP_DIR_W|MAP_DIR_E:
|
|
|
- if (room->exit_grid[EXIT_GRID_W]->vnum == room_w->vnum && room_w->exit_grid[EXIT_GRID_E]->vnum == room->vnum)
|
|
|
- {
|
|
|
- // ‒‒
|
|
|
- sprintf(buf, "%s──", ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(buf, "%s→←", ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- strcat(buf, "??");
|
|
|
- break;
|
|
|
- }
|
|
|
+ if (HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_PATH))
|
|
|
+ {
|
|
|
+ exit = ses->map->room_list[vnum]->l_exit;
|
|
|
|
|
|
- if (room->vnum == ses->map->in_room)
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s%s%s%s%s", room_left, ses->map->color[MAP_COLOR_USER], ses->map->legend[offset + index], room_right, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- pop_call();
|
|
|
- return buf;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // use a yet to be made 1x1 8 exit legend for void room drawing, call semi-recursively.
|
|
|
+ if (HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_PATH))
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (strip_color_strlen(ses, room->symbol) > 1)
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s%-3s%s", ses->map->color[MAP_COLOR_SYMBOL], room->symbol, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- else if (HAS_BIT(room->flags, ROOM_FLAG_VOID))
|
|
|
- {
|
|
|
- if (HAS_BIT(room->exit_dirs, MAP_DIR_W) && !HAS_BIT(room->exit_dirs, MAP_DIR_NW|MAP_DIR_SW))
|
|
|
- {
|
|
|
- cat_sprintf(buf, "─");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- cat_sprintf(buf, " ");
|
|
|
- }
|
|
|
+ if (!HAS_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_VOID))
|
|
|
+ {
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW))
|
|
|
+ {
|
|
|
+ check_append_path(ses, exit->cmd, "", 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ check_append_path(ses, exit->name, "", 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (*room->symbol != ' ' && strip_color_strlen(ses, room->symbol) == 1)
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s%-1s%s", ses->map->color[MAP_COLOR_SYMBOL], room->symbol, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
+ vnum = exit->vnum;
|
|
|
|
|
|
- if (room->vnum == ses->map->in_room)
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s", ses->map->color[MAP_COLOR_USER]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s", ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
+ SET_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_PATH);
|
|
|
+ }
|
|
|
|
|
|
- switch (HAS_BIT(room->exit_dirs, MAP_DIR_N|MAP_DIR_E|MAP_DIR_S|MAP_DIR_W|MAP_DIR_NW|MAP_DIR_NE|MAP_DIR_SE|MAP_DIR_SW))
|
|
|
- {
|
|
|
- case MAP_DIR_S:
|
|
|
- case MAP_DIR_N:
|
|
|
- case MAP_DIR_N|MAP_DIR_S:
|
|
|
- cat_sprintf(buf, "│");
|
|
|
- break;
|
|
|
+ DEL_BIT(ses->map->room_list[room]->flags, ROOM_FLAG_PATH);
|
|
|
|
|
|
- case MAP_DIR_E:
|
|
|
- case MAP_DIR_W:
|
|
|
- case MAP_DIR_E|MAP_DIR_W:
|
|
|
- cat_sprintf(buf, "─");
|
|
|
- break;
|
|
|
+ if (run)
|
|
|
+ {
|
|
|
+ path_run(ses, arg2);
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- default:
|
|
|
- cat_sprintf(buf, "*");
|
|
|
- break;
|
|
|
- }
|
|
|
+void map_mouse_handler(struct session *ses, char *arg1, char *arg2, int x, int y, int height, int width)
|
|
|
+{
|
|
|
+ char exit[10];
|
|
|
+ int max_x, max_y;
|
|
|
+ int top_row, top_col, bot_row, bot_col, rows, cols, char_height;
|
|
|
|
|
|
- if (room->vnum == ses->map->in_room)
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s", ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- }
|
|
|
+ push_call("map_mouse_handler(%p,%p,%p,%d,%d)",ses,arg1,arg2,x,y);
|
|
|
|
|
|
- if (HAS_BIT(room->exit_dirs, MAP_DIR_E) && !HAS_BIT(room->exit_dirs, MAP_DIR_NE|MAP_DIR_SE))
|
|
|
- {
|
|
|
- cat_sprintf(buf, "─");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- cat_sprintf(buf, " ");
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s%s%-1s%s%s", room_left, ses->map->color[MAP_COLOR_SYMBOL], room->symbol, room_right, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
+ if (ses->map == NULL || !HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP) || ses->map->room_list[ses->map->in_room] == NULL)
|
|
|
+ {
|
|
|
pop_call();
|
|
|
- return buf;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
+ {
|
|
|
+ if (arg1 && arg2)
|
|
|
+ {
|
|
|
+// do_screen(ses, "{RAISE} {SCREEN MOUSE LOCATION}");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS))
|
|
|
+ exit[0] = 0;
|
|
|
+
|
|
|
+ char_height = 1 + height % UMAX(1, gtd->screen->char_height);
|
|
|
+
|
|
|
+ if (ses->map->rows > 1 && ses->map->cols > 1)
|
|
|
+ {
|
|
|
+ top_row = ses->map->top_row;
|
|
|
+ top_col = ses->map->top_col;
|
|
|
+ bot_row = ses->map->bot_row;
|
|
|
+ bot_col = ses->map->bot_col;
|
|
|
+ rows = ses->map->rows;
|
|
|
+ cols = ses->map->cols;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ top_row = 1;
|
|
|
+ top_col = 1;
|
|
|
+ bot_row = ses->split->top_row - 2;
|
|
|
+ bot_col = gtd->screen->cols;
|
|
|
+ rows = ses->split->top_row - 2;
|
|
|
+ cols = gtd->screen->cols;
|
|
|
+ }
|
|
|
+
|
|
|
+ y = y - 1;
|
|
|
+ x = x - 1;
|
|
|
+
|
|
|
+ if (y > bot_row || y < top_row)
|
|
|
+ {
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (x > bot_col || x < top_col)
|
|
|
+ {
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ y = y + 1 - top_row;
|
|
|
+ x = x + 1 - top_col;
|
|
|
+
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
+ {
|
|
|
+ char *grid[] = { "nw", "2", "n", "u", "ne", "6",
|
|
|
+ "w", "RL", "RC", "RR", "e", "e",
|
|
|
+ "sw", "d", "s", "16", "se", "18" };
|
|
|
+
|
|
|
+// tintin_printf2(ses, "\e[1;32mdebug: y=%d x=%d mod(y)=%d mod(x)=%d", y / 3, y / 6, y % 3, x % 6);
|
|
|
+
|
|
|
+ strcpy(exit, grid[URANGE(0, y % 3 * 6 + x % 6, 17)]);
|
|
|
+
|
|
|
+ y /= 3;
|
|
|
+ x /= 6;
|
|
|
+
|
|
|
+ max_y = 2 + rows / 3;
|
|
|
+ max_x = 2 + cols / 6;
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS))
|
|
|
+ {
|
|
|
+ char *grid[] = { "se", "sw", "d", "s", "5", "ne", "nw", "8", "n", "u", "e", "w", "RL", "RC", "RR", "e", "w", "RL", "RC", "RR" };
|
|
|
+ int x_mod, y_mod;
|
|
|
+
|
|
|
+ y_mod = y % 2 * 2 + (char_height * 2 / gtd->screen->char_height ? 1 : 0);
|
|
|
+ x_mod = x % 5;
|
|
|
+
|
|
|
+ y = y / 2;
|
|
|
+ x = x / 5;
|
|
|
+
|
|
|
+ strcpy(exit, grid[URANGE(0, 5 * y_mod + x_mod, 20)]);
|
|
|
+
|
|
|
+ switch (5 * y_mod + x_mod)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ y--;
|
|
|
+ case 5:
|
|
|
+ case 10:
|
|
|
+ case 15:
|
|
|
+ x--;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ case 2:
|
|
|
+ case 3:
|
|
|
+ case 4:
|
|
|
+ y--;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+// tintin_printf2(ses, "\e[1;32mdebug: y=%d x=%d y_mod=%d x_mod=%d y+x=%d y=%d x=%d", y, x, y_mod, x_mod, 5*y_mod+x_mod, y, x);
|
|
|
+
|
|
|
+ max_y = 2 + (rows + 2) / 2;
|
|
|
+ max_x = 2 + (cols + 4) / 5;
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS))
|
|
|
+ {
|
|
|
+ y /= 2;
|
|
|
+ x /= 5;
|
|
|
+
|
|
|
+ max_y = 2 + rows / 2;
|
|
|
+ max_x = 2 + cols / 5;
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT))
|
|
|
+ {
|
|
|
+ x /= 2;
|
|
|
+
|
|
|
+ max_y = 2 + rows;
|
|
|
+ max_x = 2 + cols / 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ max_y = 2 + rows;
|
|
|
+ max_x = 2 + cols;
|
|
|
+ }
|
|
|
+
|
|
|
+ y = max_y - 1 - y;
|
|
|
+
|
|
|
+ if (x < 0 || y < 0)
|
|
|
+ {
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (max_x != map_grid_x || max_y != map_grid_y)
|
|
|
+ {
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ses->map->grid_rooms[x + 1 + max_x * (y - 1)])
|
|
|
+ {
|
|
|
+ if (arg1 && arg2)
|
|
|
+ {
|
|
|
+ check_all_events(ses, SUB_ARG, 2, 2, "MAP %s %s", arg1, arg2, ntos(ses->map->grid_rooms[x + 1 + max_x * (y - 1)]->vnum), exit);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ check_all_events(ses, SUB_ARG, 0, 2, "MAP MOUSE LOCATION", ntos(ses->map->grid_rooms[x + 1 + max_x * (y - 1)]->vnum), exit);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
+void update_terrain(struct session *ses)
|
|
|
+{
|
|
|
+ struct room_data *room;
|
|
|
+ int vnum;
|
|
|
+
|
|
|
+ DEL_BIT(ses->map->flags, MAP_FLAG_UPDATETERRAIN);
|
|
|
+
|
|
|
+ for (vnum = 1 ; vnum < ses->map->size ; vnum++)
|
|
|
+ {
|
|
|
+ room = ses->map->room_list[vnum];
|
|
|
+
|
|
|
+ if (room)
|
|
|
+ {
|
|
|
+ room->terrain_index = bsearch_alpha_list(ses->list[LIST_TERRAIN], room->terrain, 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ Map options
|
|
|
+*/
|
|
|
+
|
|
|
+
|
|
|
+DO_MAP(map_at)
|
|
|
+{
|
|
|
+ int new_room;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_NONE);
|
|
|
+
|
|
|
+ new_room = find_room(ses, arg1);
|
|
|
+
|
|
|
+ ses->map->at_room = ses->map->in_room;
|
|
|
+
|
|
|
+ if (new_room == 0)
|
|
|
+ {
|
|
|
+ new_room = find_location(ses, arg1);
|
|
|
+
|
|
|
+ if (new_room == 0)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP AT: Couldn't find room or exit {%s}.", arg1);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ses->map->in_room = new_room;
|
|
|
+
|
|
|
+ script_driver(ses, LIST_COMMAND, arg2);
|
|
|
+
|
|
|
+ if (ses->map)
|
|
|
+ {
|
|
|
+ ses->map->in_room = ses->map->at_room;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_center)
|
|
|
+{
|
|
|
+ char arg3[BUFFER_SIZE];
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if (*arg1 == 0)
|
|
|
+ {
|
|
|
+ ses->map->center_x = ses->map->center_y = ses->map->center_z = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if (!is_math(ses, arg1) || !is_math(ses, arg2) || !is_math(ses, arg3))
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP CENTER {X} {Y} {Z}");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ses->map->center_x = get_number(ses, arg1);
|
|
|
+ ses->map->center_y = get_number(ses, arg2);
|
|
|
+ ses->map->center_z = get_number(ses, arg3);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP CENTER SET TO {%d} {%d} {%d}", ses->map->center_x, ses->map->center_y, ses->map->center_z);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_color)
|
|
|
+{
|
|
|
+ char buf[BUFFER_SIZE];
|
|
|
+ int index;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if (*arg1)
|
|
|
+ {
|
|
|
+ if (!strcasecmp(arg1, "RESET"))
|
|
|
+ {
|
|
|
+ for (index = 0 ; map_color_table[index].name ; index++)
|
|
|
+ {
|
|
|
+ strncpy(ses->map->color[index], map_color_table[index].code, COLOR_SIZE - 1);
|
|
|
+ strncpy(ses->map->color_raw[index], map_color_table[index].code, COLOR_SIZE - 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (index = 0 ; map_color_table[index].name ; index++)
|
|
|
+ {
|
|
|
+ if (is_abbrev(arg1, map_color_table[index].name))
|
|
|
+ {
|
|
|
+ if (is_abbrev(arg2, "RESET"))
|
|
|
+ {
|
|
|
+ translate_color_names(ses, map_color_table[index].code, ses->map->color[index]);
|
|
|
+ strncpy(ses->map->color_raw[index], map_color_table[index].code, COLOR_SIZE - 1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ translate_color_names(ses, arg2, ses->map->color[index]);
|
|
|
+ strncpy(ses->map->color_raw[index], arg2, COLOR_SIZE - 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ get_color_names(ses, ses->map->color[index], buf);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP COLOR %s%10s\e[0m SET TO {%s}", ses->map->color[index], buf, map_color_table[index].name, ses->map->color_raw[index]);
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (map_color_table[index].name == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP COLOR {AVOID|BACKGROUND|EXIT|HIDE|INVIS|PATH|ROOM|USER} {COLOR CODE}");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: %s color set to: %s", arg1, arg2);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ for (index = 0 ; map_color_table[index].name ; index++)
|
|
|
+ {
|
|
|
+ get_color_names(ses, ses->map->color[index], buf);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP COLOR %s%10s\e[0m SET TO {%s}", buf, map_color_table[index].name, ses->map->color_raw[index]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_create)
|
|
|
+{
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ create_map(ses, arg1);
|
|
|
+
|
|
|
+ tintin_printf2(ses, "#MAP: %d room map created, use #map goto 1, to proceed", ses->map->size);
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_debug)
|
|
|
+{
|
|
|
+ tintin_printf2(ses, "max spatial grid x: %d", ses->map->max_grid_x);
|
|
|
+ tintin_printf2(ses, "max spatial grid y: %d", ses->map->max_grid_y);
|
|
|
+ tintin_printf2(ses, " max undo size: %d", ses->map->undo_size);
|
|
|
+ tintin_printf2(ses, " in room: %d", ses->map->in_room);
|
|
|
+ tintin_printf2(ses, " at room: %d", ses->map->at_room);
|
|
|
+ tintin_printf2(ses, " last room: %d", ses->map->last_room);
|
|
|
+ tintin_printf2(ses, " stamp: %d", ses->map->search->stamp);
|
|
|
+ tintin_printf2(ses, " length: %f", ses->map->room_list[ses->map->in_room]->length);
|
|
|
+ tintin_printf2(ses, " nofollow: %d", ses->map->nofollow);
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if (*arg1)
|
|
|
+ {
|
|
|
+ if (is_abbrev(arg1, "undo"))
|
|
|
+ {
|
|
|
+ struct link_data *link;
|
|
|
+
|
|
|
+ for (link = ses->map->undo_head ; link ; link = link->next)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, "%05s %05s %s", link->str1, link->str2, link->str3);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_delete)
|
|
|
+{
|
|
|
+ int room;
|
|
|
+ struct exit_data *exit;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if (is_number(arg1))
|
|
|
+ {
|
|
|
+ room = find_room(ses, arg1);
|
|
|
+
|
|
|
+ if (room == 0)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP DELETE {%s} - No room with that vnum found", arg1);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+
|
|
|
+ if (exit)
|
|
|
+ {
|
|
|
+ room = exit->vnum;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (exit == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: No exit with that name found");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ room = exit->vnum;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room == ses->map->in_room)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: You must first leave the room you're trying to delete");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ delete_room(ses, room, TRUE);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Room {%d} deleted", room);
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_destroy)
|
|
|
+{
|
|
|
+ struct exit_data *exit;
|
|
|
+ int index, cnt;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if (is_abbrev(arg1, "AREA"))
|
|
|
+ {
|
|
|
+ if (*arg2 == 0)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP DESTROY AREA {<AREA NAME>}");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ses->map->room_list[ses->map->in_room] && !strcmp(arg2, ses->map->room_list[ses->map->in_room]->area))
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP DESTROY AREA: YOU MUST FIRST LEAVE THE AREA YOU ARE TRYING TO DESTROY.");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (index = cnt = 0 ; index < ses->map->size ; index++)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[index])
|
|
|
+ {
|
|
|
+ if (!strcmp(arg2, ses->map->room_list[index]->area))
|
|
|
+ {
|
|
|
+ cnt++;
|
|
|
+
|
|
|
+ delete_room(ses, index, FALSE);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (index = 0 ; index < ses->map->size ; index++)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[index])
|
|
|
+ {
|
|
|
+ for (exit = ses->map->room_list[index]->f_exit ; exit ; exit = exit->next)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[exit->vnum] == NULL)
|
|
|
+ {
|
|
|
+ delete_exit(ses, index, exit);
|
|
|
+
|
|
|
+ if (ses->map->room_list[index]->f_exit)
|
|
|
+ {
|
|
|
+ exit = ses->map->room_list[index]->f_exit;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP DESTROY AREA: DELETED %d ROOMS.", cnt);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "WORLD"))
|
|
|
+ {
|
|
|
+ cnt = delete_map(ses);
|
|
|
+
|
|
|
+ tintin_printf2(ses, "#MAP DESTROY WORLD: DELETED %d ROOMS.", cnt);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP DESTROY {AREA|WORLD} {<ARGUMENT>}");
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_dig)
|
|
|
+{
|
|
|
+ char arg3[BUFFER_SIZE];
|
|
|
+ int room;
|
|
|
+ struct exit_data *exit;
|
|
|
+ struct listnode *node;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if (*arg1 == 0)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP DIG {<DIRECTION>|<VNUM>} {<LOCATION>|NEW}");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ room = atoi(arg1);
|
|
|
+
|
|
|
+ if (room > 0 && room < ses->map->size)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[room] == NULL)
|
|
|
+ {
|
|
|
+ add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_CREATE);
|
|
|
+
|
|
|
+ create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {}", room);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+
|
|
|
+ if (exit)
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP DIG: There is already a room in that direction.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*arg2 && strcasecmp(arg2, "new"))
|
|
|
+ {
|
|
|
+ if (is_number(arg2))
|
|
|
+ {
|
|
|
+ room = get_number(ses, arg2);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ room = find_room(ses, arg2);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room == 0 && !strcasecmp(arg3, "new"))
|
|
|
+ {
|
|
|
+ room = find_new_room(ses);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room <= 0 || room >= ses->map->size)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP DIG {%s}: Couldn't find room {%s}.", arg1, arg2);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ses->map->room_list[room] == NULL)
|
|
|
+ {
|
|
|
+ add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_CREATE|MAP_UNDO_LINK);
|
|
|
+
|
|
|
+ create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {%s}", room, ses->map->search->id ? ses->map->search->id : "");
|
|
|
+ create_exit(ses, ses->map->in_room, "{%d} {%s} {%s}", room, arg1, arg1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_LINK);
|
|
|
+
|
|
|
+ create_exit(ses, ses->map->in_room, "{%d} {%s} {%s}", room, arg1, arg1);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ room = find_coord(ses, arg1);
|
|
|
+
|
|
|
+ if (room && strcasecmp(arg2, "new"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP CREATE LINK %5d {%s}.", room, ses->map->room_list[room]->name);
|
|
|
+
|
|
|
+ add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_LINK);
|
|
|
+
|
|
|
+ create_exit(ses, ses->map->in_room, "{%d} {%s} {%s}", room, arg1, arg1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ for (room = 1 ; room < ses->map->size ; room++)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[room] == NULL)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room == ses->map->size)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP DIG: Maximum amount of rooms of %d reached.", ses->map->size);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_CREATE|MAP_UNDO_LINK);
|
|
|
+
|
|
|
+ create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {}", room);
|
|
|
+ create_exit(ses, ses->map->in_room, "{%d} {%s} {%s}", room, arg1, arg1);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((node = search_node_list(ses->list[LIST_PATHDIR], arg1)) != NULL)
|
|
|
+ {
|
|
|
+ if (find_exit(ses, room, node->arg2) == NULL)
|
|
|
+ {
|
|
|
+ create_exit(ses, room, "{%d} {%s} {%s}", ses->map->in_room, node->arg2, node->arg2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void exit_edit(struct session *ses, struct exit_data *exit, char *arg, char *arg1, char *arg2, char *arg3)
|
|
|
+{
|
|
|
+ int room, dir;
|
|
|
+
|
|
|
+ if (*arg2 == 0)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, " color: %s", str_convert_meta(exit->color, TRUE));
|
|
|
+ tintin_printf2(ses, " command: %s", exit->cmd);
|
|
|
+ tintin_printf2(ses, "direction: %d", exit->dir);
|
|
|
+ tintin_printf2(ses, " flags: %d", exit->flags);
|
|
|
+ tintin_printf2(ses, " get/set: %s", exit->data);
|
|
|
+ tintin_printf2(ses, " name: %s", exit->name);
|
|
|
+ tintin_printf2(ses, " vnum: %d", exit->vnum);
|
|
|
+ tintin_printf2(ses, " weight: %.3f", exit->weight);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "COLOR"))
|
|
|
+ {
|
|
|
+ RESTRING(exit->color, arg3);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP %s {%s} : COLOR SET TO {%s}.", arg, arg1, exit->color);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "COMMAND"))
|
|
|
+ {
|
|
|
+ RESTRING(exit->cmd, arg3);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP %s {%s} : COMMAND SET TO {%s}.", arg, arg1, exit->cmd);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "DIRECTION"))
|
|
|
+ {
|
|
|
+ if (is_math(ses, arg3))
|
|
|
+ {
|
|
|
+ dir = (int) get_number(ses, arg3);
|
|
|
+ }
|
|
|
+ else if ((dir = get_exit_dir(ses, arg3)) == 0)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP %s {%s} : DIRECTION {%s} NOT FOUND.", arg, arg1, arg3);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ exit->dir = dir;
|
|
|
+
|
|
|
+ exit->grid = dir_to_grid(exit->dir);
|
|
|
+
|
|
|
+ set_room_exits(ses, ses->map->in_room);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP %s {%s} : DIRECTION {%s} SET TO {%d}.", arg, arg1, arg3, dir);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "FLAGS"))
|
|
|
+ {
|
|
|
+ exit->flags = (int) get_number(ses, arg3);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP %s {%s} : FLAGS SET TO {%d}.", arg, arg1, exit->flags);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "GET"))
|
|
|
+ {
|
|
|
+ if (*arg3)
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg3, "%s", exit->data);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, "#MAP %s GET: No destination variable.", arg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "NAME"))
|
|
|
+ {
|
|
|
+ RESTRING(exit->name, arg3);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP %s {%s} : NAME SET TO {%s}.", arg, arg1, exit->name);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "SAVE"))
|
|
|
+ {
|
|
|
+ if (*arg3)
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg3, "{command}{%s}{destination}{%d}{dir}{%d}{flags}{%d}{name}{%s}{vnum}{%d}{weight}{%.3f}", exit->cmd, tunnel_void(ses, ses->map->in_room, exit->vnum, exit->dir), exit->dir, exit->flags, exit->name, exit->vnum, exit->weight);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP %s SAVE: No destination variable.", arg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "SET"))
|
|
|
+ {
|
|
|
+ RESTRING(exit->data, arg3);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP %s {%s} : DATA SET TO {%s}.", arg, arg1, exit->data);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "VNUM"))
|
|
|
+ {
|
|
|
+ room = atoi(arg3);
|
|
|
+
|
|
|
+ if (room <= 0 || room >= ses->map->size)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP %s VNUM: Invalid room vnum: %d.", arg, room);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ses->map->room_list[room] == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP %s VNUM: Non existant room vnum: %d.", arg, room);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ exit->vnum = room;
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP %s {%s} : VNUM SET TO {%s}.", arg, arg1, arg3);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "WEIGHT"))
|
|
|
+ {
|
|
|
+ if (get_number(ses, arg3) < 0.001)
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP %s {%s} : WEIGHT SHOULD BE AT LEAST 0.001", arg, arg1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ exit->weight = (float) get_number(ses, arg3);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP %s {%s} : WEIGHT SET TO {%.3f}", arg, arg1, exit->weight);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "Syntax: #MAP %s {<NAME>} {COMMAND|DIRECTION|GET|NAME|FLAGS|SAVE|SET|VNUM|WEIGHT} {<argument>}", arg);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_entrance)
|
|
|
+{
|
|
|
+ char arg3[BUFFER_SIZE];
|
|
|
+ struct exit_data *exit, *rev_exit;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+
|
|
|
+ if (exit == NULL)
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP ENTRANCE: Exit {%s} not found.", arg1);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ rev_exit = ses->map->room_list[exit->vnum]->exit_grid[revdir_to_grid(exit->dir)];
|
|
|
+
|
|
|
+ if (rev_exit == NULL)
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP ENTRANCE {%s}: Exit {%s} has no matching entrance.");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ exit_edit(ses, rev_exit, "ENTRANCE", arg1, arg2, arg3);
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_exit)
|
|
|
+{
|
|
|
+ char arg3[BUFFER_SIZE];
|
|
|
+ struct exit_data *exit;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+
|
|
|
+ if (exit == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP EXIT: Exit {%s} not found.", arg1);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ exit_edit(ses, exit, "EXIT", arg1, arg2, arg3);
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_exitflag)
|
|
|
+{
|
|
|
+ struct exit_data *exit;
|
|
|
+ char arg3[BUFFER_SIZE];
|
|
|
+ int flag;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+
|
|
|
+ if (exit == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP EXITFLAG: EXIT {%s} NOT FOUND.", arg1);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*arg2 == 0)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, "#MAP: AVOID FLAG IS SET TO: %s.", HAS_BIT(exit->flags, EXIT_FLAG_AVOID) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: HIDE FLAG IS SET TO: %s.", HAS_BIT(exit->flags, EXIT_FLAG_HIDE) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: INVIS FLAG IS SET TO: %s.", HAS_BIT(exit->flags, EXIT_FLAG_INVIS) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: BLOCK FLAG IS SET TO: %s.", HAS_BIT(exit->flags, EXIT_FLAG_BLOCK) ? "ON" : "OFF");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (is_abbrev(arg2, "AVOID"))
|
|
|
+ {
|
|
|
+ flag = EXIT_FLAG_AVOID;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "BLOCK"))
|
|
|
+ {
|
|
|
+ flag = EXIT_FLAG_BLOCK;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "HIDE"))
|
|
|
+ {
|
|
|
+ flag = EXIT_FLAG_HIDE;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "INVISIBLE"))
|
|
|
+ {
|
|
|
+ flag = EXIT_FLAG_INVIS;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP EXITFLAG {%s} <AVOID|HIDE|INVIS> [ON|OFF]", arg1);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*arg3 == 0)
|
|
|
+ {
|
|
|
+ TOG_BIT(exit->flags, flag);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg3, "ON"))
|
|
|
+ {
|
|
|
+ SET_BIT(exit->flags, flag);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg3, "OFF"))
|
|
|
+ {
|
|
|
+ DEL_BIT(exit->flags, flag);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP EXITFLAG {%s} {%s} [ON|OFF]", arg3);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (is_abbrev(arg2, "AVOID"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: AVOID FLAG SET TO %s.", HAS_BIT(exit->flags, EXIT_FLAG_AVOID) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "BLOCK"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: BLOCK FLAG SET TO %s.", HAS_BIT(exit->flags, EXIT_FLAG_BLOCK) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "HIDE"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: HIDE FLAG SET TO %s.", HAS_BIT(exit->flags, EXIT_FLAG_HIDE) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "INVISIBLE"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: INVIS FLAG SET TO %s.", HAS_BIT(exit->flags, EXIT_FLAG_INVIS) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_explore)
|
|
|
+{
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ explore_path(ses, FALSE, arg1, "");
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_find)
|
|
|
+{
|
|
|
+ shortest_path(ses, FALSE, arg1, arg);
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_flag)
|
|
|
+{
|
|
|
+ int flag = 0, unflag = 0;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if (*arg1)
|
|
|
+ {
|
|
|
+ if (is_abbrev(arg1, "static"))
|
|
|
+ {
|
|
|
+ flag = MAP_FLAG_STATIC;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "vtmap"))
|
|
|
+ {
|
|
|
+ flag = MAP_FLAG_VTMAP;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "asciigraphics"))
|
|
|
+ {
|
|
|
+ flag = MAP_FLAG_ASCIIGRAPHICS;
|
|
|
+ unflag = MAP_FLAG_MUDFONT|MAP_FLAG_UNICODEGRAPHICS|MAP_FLAG_BLOCKGRAPHICS;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "asciilength"))
|
|
|
+ {
|
|
|
+ flag = MAP_FLAG_ASCIIVNUMS|MAP_FLAG_ASCIILENGTH;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "asciivnums"))
|
|
|
+ {
|
|
|
+ flag = MAP_FLAG_ASCIIVNUMS;
|
|
|
+ unflag = MAP_FLAG_ASCIILENGTH;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "blockgraphics"))
|
|
|
+ {
|
|
|
+ flag = MAP_FLAG_BLOCKGRAPHICS;
|
|
|
+ unflag = MAP_FLAG_MUDFONT|MAP_FLAG_UNICODEGRAPHICS|MAP_FLAG_ASCIIGRAPHICS;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "direction"))
|
|
|
+ {
|
|
|
+ flag = MAP_FLAG_DIRECTION;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "mudfont"))
|
|
|
+ {
|
|
|
+ flag = MAP_FLAG_MUDFONT;
|
|
|
+ unflag = MAP_FLAG_ASCIIGRAPHICS|MAP_FLAG_UNICODEGRAPHICS|MAP_FLAG_BLOCKGRAPHICS;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "nofollow"))
|
|
|
+ {
|
|
|
+ flag = MAP_FLAG_NOFOLLOW;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "simplegraphics"))
|
|
|
+ {
|
|
|
+ unflag = MAP_FLAG_ASCIIVNUMS|MAP_FLAG_SYMBOLGRAPHICS|MAP_FLAG_MUDFONT|MAP_FLAG_ASCIIGRAPHICS|MAP_FLAG_UNICODEGRAPHICS|MAP_FLAG_BLOCKGRAPHICS;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "symbolgraphics"))
|
|
|
+ {
|
|
|
+ flag = MAP_FLAG_SYMBOLGRAPHICS;
|
|
|
+ unflag = MAP_FLAG_ASCIIGRAPHICS|MAP_FLAG_UNICODEGRAPHICS|MAP_FLAG_BLOCKGRAPHICS;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "terrain"))
|
|
|
+ {
|
|
|
+ flag = MAP_FLAG_TERRAIN;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "unicodegraphics"))
|
|
|
+ {
|
|
|
+ flag = MAP_FLAG_UNICODEGRAPHICS;
|
|
|
+ unflag = MAP_FLAG_ASCIIGRAPHICS|MAP_FLAG_MUDFONT|MAP_FLAG_BLOCKGRAPHICS;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: Invalid flag {%s}.", arg1);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, "#MAP: AsciiGraphics flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: AsciiVnums flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: BlockGraphics flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: Direction flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_DIRECTION) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: MudFont flag is set to %s", HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: NoFollow flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: SimpleGraphics flag is set to %s.", !HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS|MAP_FLAG_SYMBOLGRAPHICS|MAP_FLAG_MUDFONT|MAP_FLAG_ASCIIGRAPHICS|MAP_FLAG_UNICODEGRAPHICS|MAP_FLAG_BLOCKGRAPHICS) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: Static flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_STATIC) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: SymbolGraphics flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_SYMBOLGRAPHICS) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: Terrain flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_TERRAIN) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: UnicodeGraphics flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: VTmap flag is set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP) ? "ON" : "OFF");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (is_abbrev(arg2, "ON"))
|
|
|
+ {
|
|
|
+ SET_BIT(ses->map->flags, flag);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "OFF"))
|
|
|
+ {
|
|
|
+ DEL_BIT(ses->map->flags, flag);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ TOG_BIT(ses->map->flags, flag);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (unflag)
|
|
|
+ {
|
|
|
+ DEL_BIT(ses->map->flags, unflag);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (is_abbrev(arg1, "asciigraphics"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: AsciiGraphics flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "asciivnums"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: AsciiVnums flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "direction"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Direction flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_DIRECTION) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "mudfont"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: MudFont flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "nofollow"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: NoFollow flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "static"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Static flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_STATIC) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "simplegraphics"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: All graphic modes have been disabled.");
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "symbolgraphics"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: SymbolGraphics flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_SYMBOLGRAPHICS) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "terrain"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Terrain flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_TERRAIN) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "unicodegraphics"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: UnicodeGraphics flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "vtmap"))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: VTmap flag set to %s.", HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_get)
|
|
|
+{
|
|
|
+ struct room_data *room = ses->map->room_list[ses->map->in_room];
|
|
|
+ struct exit_data *exit;
|
|
|
+ char exits[BUFFER_SIZE], arg3[BUFFER_SIZE];
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if (*arg3)
|
|
|
+ {
|
|
|
+ if (atoi(arg3) > 0 && atoi(arg3) < ses->map->size)
|
|
|
+ {
|
|
|
+ room = ses->map->room_list[atoi(arg3)];
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ room = NULL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room == NULL)
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "0");
|
|
|
+ }
|
|
|
+ else if (*arg1 == 0 || *arg2 == 0)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, " worldflags: %d", ses->map->flags);
|
|
|
+ tintin_printf2(ses, " worldsize: %d", ses->map->size);
|
|
|
+ tintin_printf2(ses, "");
|
|
|
+ tintin_printf2(ses, " roomvnum: %d", room->vnum);
|
|
|
+ tintin_printf2(ses, " roomarea: %s", room->area);
|
|
|
+ tintin_printf2(ses, " roomcolor: %s", room->color);
|
|
|
+ tintin_printf2(ses, " roomdata: %s", room->data);
|
|
|
+ tintin_printf2(ses, " roomdesc: %s", room->desc);
|
|
|
+ tintin_printf2(ses, " roomexits: %d", get_room_exits(ses, room->vnum));
|
|
|
+ tintin_printf2(ses, " roomflags: %d", room->flags);
|
|
|
+ tintin_printf2(ses, " roomid: %s", room->id);
|
|
|
+ tintin_printf2(ses, " roomname: %s", room->name);
|
|
|
+ tintin_printf2(ses, " roomnote: %s", room->note);
|
|
|
+ tintin_printf2(ses, " roomsymbol: %s", room->symbol);
|
|
|
+ tintin_printf2(ses, "roomterrain: %s", room->terrain);
|
|
|
+ tintin_printf2(ses, " roomweight: %.3f", room->weight);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (is_abbrev(arg1, "all"))
|
|
|
+ {
|
|
|
+ exits[0] = 0;
|
|
|
+
|
|
|
+ for (exit = room->f_exit ; exit ; exit = exit->next)
|
|
|
+ {
|
|
|
+ cat_sprintf(exits, "{%s}{%d}", exit->name, exit->vnum);
|
|
|
+ }
|
|
|
+ set_nest_node_ses(ses, arg2, "{area}{%s}{color}{%s}{data}{%s}{desc}{%s}{exits}{%s}{flags}{%d}{id}{%d}{name}{%s}{note}{%s}{symbol}{%s}{terrain}{%s}{vnum}{%d}{weight}{%.3f}", room->area, room->color, room->data, room->desc, exits, room->flags, room->id, room->name, room->note, room->symbol, room->terrain, room->vnum, room->weight);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomarea"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%s", room->area);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomcolor"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%s", room->color);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomdata"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%s", room->data);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomdesc"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%s", room->desc);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomflags"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%d", room->flags);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomid"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%s", room->id);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomname"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%s", room->name);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomnote"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%s", room->note);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomsymbol"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%s", room->symbol);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomterrain"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%s", room->terrain);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomvnum"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%d", room->vnum);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomweight"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%.3f", room->weight);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomexits"))
|
|
|
+ {
|
|
|
+ exits[0] = 0;
|
|
|
+
|
|
|
+ for (exit = room->f_exit ; exit ; exit = exit->next)
|
|
|
+ {
|
|
|
+ cat_sprintf(exits, "{%s}{%d}", exit->name, exit->vnum);
|
|
|
+ }
|
|
|
+ set_nest_node_ses(ses, arg2, "%s", exits);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "worldflags"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%d", ses->map->flags);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "worldsize"))
|
|
|
+ {
|
|
|
+ set_nest_node_ses(ses, arg2, "%d", ses->map->size);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP GET: unknown option: %s.", arg1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_global)
|
|
|
+{
|
|
|
+ int room;
|
|
|
+
|
|
|
+ sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if (*arg1 == 0)
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP GLOBAL: GLOBAL ROOM SET TO VNUM %d.", ses->map->global_vnum);
|
|
|
+ }
|
|
|
+ else if (!strcmp(arg1, "0"))
|
|
|
+ {
|
|
|
+ ses->map->global_vnum = ses->map->global_exit->vnum = 0;
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP GLOBAL: GLOBAL ROOM SET TO VNUM %d.", 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ room = find_room(ses, arg);
|
|
|
+
|
|
|
+ if (room)
|
|
|
+ {
|
|
|
+ ses->map->global_vnum = ses->map->global_exit->vnum = room;
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP GLOBAL: GLOBAL ROOM SET TO VNUM %d.", room);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP GLOBAL: COULDN'T FIND ROOM %s.", arg1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_goto)
|
|
|
+{
|
|
|
+ int room;
|
|
|
+
|
|
|
+ room = find_room(ses, arg);
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN); // look for dig argument
|
|
|
+
|
|
|
+ if (room == 0 && ses->map->search->vnum > 0 && ses->map->search->vnum < ses->map->size && !strcasecmp(arg2, "dig"))
|
|
|
+ {
|
|
|
+ room = ses->map->search->vnum;
|
|
|
+
|
|
|
+ create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {}", room);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room == 0)
|
|
|
+ {
|
|
|
+ room = find_room(ses, arg1);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room == 0 && ses->map->search->id && *ses->map->search->id && !strcasecmp(arg2, "dig"))
|
|
|
+ {
|
|
|
+ room = find_new_room(ses);
|
|
|
+
|
|
|
+ if (room)
|
|
|
+ {
|
|
|
+ create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {%s}", room, ses->map->search->id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room == 0 && ses->map->in_room)
|
|
|
+ {
|
|
|
+ room = find_path(ses, arg1);
|
|
|
+
|
|
|
+ if (room == 0)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP GOTO: COULDN'T FIND ROOM OR EXIT {%s}.", arg1);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room == 0)
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP GOTO: COULDN'T FIND ROOM %s.", arg1);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_MOVE);
|
|
|
+
|
|
|
+ goto_room(ses, room);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP GOTO: MOVED TO ROOM %d {%s}.", room, *ses->map->room_list[room]->name ? ses->map->room_list[room]->name : ses->map->room_list[room]->id);
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_info)
|
|
|
+{
|
|
|
+ int room, cnt, exits;
|
|
|
+ struct exit_data *exit;
|
|
|
+ struct room_data *in_room = ses->map->room_list[ses->map->in_room];
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if (ses->map->in_room)
|
|
|
+ {
|
|
|
+ exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+
|
|
|
+ if (exit)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, " color: %s", str_convert_meta(exit->color, TRUE));
|
|
|
+ tintin_printf2(ses, " command: %s", exit->cmd);
|
|
|
+ tintin_printf2(ses, "direction: %d", exit->dir);
|
|
|
+ tintin_printf2(ses, " flags: %d", exit->flags);
|
|
|
+ tintin_printf2(ses, " get/set: %s", exit->data);
|
|
|
+ tintin_printf2(ses, " length: %d", get_exit_length(ses, exit));
|
|
|
+ tintin_printf2(ses, " name: %s", exit->name);
|
|
|
+ tintin_printf2(ses, " vnum: %d", exit->vnum);
|
|
|
+ tintin_printf2(ses, " weight: %.3f", exit->weight);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (room = cnt = exits = 0 ; room < ses->map->size ; room++)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[room])
|
|
|
+ {
|
|
|
+ cnt++;
|
|
|
+
|
|
|
+ exits += get_room_exits(ses, room);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ tintin_printf2(ses, " %+16s %-7d %+16s %-7d %+16s %-7d", "Total rooms:", cnt, "Total exits:", exits, "World size:", ses->map->size);
|
|
|
+ tintin_printf2(ses, " %+16s %-7d %+16s %-7d %+16s %-7d", "Direction:", ses->map->dir, "Last room:", ses->map->last_room, "Undo size:", ses->map->undo_size);
|
|
|
+ tintin_printf2(ses, "");
|
|
|
+
|
|
|
+ strcpy(arg1, "");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "AsciiGraphics:", HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS) ? "on" : "off");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "AsciiVnums:", HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS) ? "on" : "off");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "BlockGraphics:", HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS) ? "on" : "off");
|
|
|
+ tintin_puts2(ses, arg1);
|
|
|
+
|
|
|
+ strcpy(arg1, "");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "Direction:", HAS_BIT(ses->map->flags, MAP_FLAG_DIRECTION) ? "on" : "off");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "MudFont:", HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT) ? "on" : "off");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "Nofollow:", HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW) ? "on" : "off");
|
|
|
+ tintin_puts2(ses, arg1);
|
|
|
+
|
|
|
+ strcpy(arg1, "");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "Static:", HAS_BIT(ses->map->flags, MAP_FLAG_STATIC) ? "on" : "off");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "SymbolGraphics:", HAS_BIT(ses->map->flags, MAP_FLAG_SYMBOLGRAPHICS) ? "on" : "off");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "UnicodeGraphics:", HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS) ? "on" : "off");
|
|
|
+ tintin_puts2(ses, arg1);
|
|
|
+
|
|
|
+ strcpy(arg1, "");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "Vtmap:", HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP) ? "on" : "off");
|
|
|
+ tintin_puts2(ses, arg1);
|
|
|
+
|
|
|
+/*
|
|
|
+ strcpy(arg1, "");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s",
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s",
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s",
|
|
|
+ tintin_puts2(ses, arg1);
|
|
|
+*/
|
|
|
+
|
|
|
+ tintin_printf2(ses, "");
|
|
|
+ tintin_printf2(ses, " %+16s %4d %4d %4d %4d", "Map Offset:", ses->map->sav_top_row, ses->map->sav_top_col, ses->map->sav_bot_row, ses->map->sav_bot_col);
|
|
|
+ tintin_printf2(ses, " %+16s %4d %4d %4d %4d", "Current Offset:", ses->map->top_row, ses->map->top_col, ses->map->bot_row, ses->map->bot_col);
|
|
|
+
|
|
|
+ if (ses->map->in_room == 0)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ tintin_printf2(ses, "");
|
|
|
+
|
|
|
+ tintin_printf2(ses, "%+16s %s", "Room area:", in_room->area);
|
|
|
+ tintin_printf2(ses, "%+16s %s", "Room data:", in_room->data);
|
|
|
+ tintin_printf2(ses, "%+16s %s", "Room desc:", in_room->desc);
|
|
|
+ tintin_printf2(ses, "%+16s %s", "Room id:", in_room->id);
|
|
|
+ tintin_printf2(ses, "%+16s %s", "Room name:", in_room->name);
|
|
|
+ tintin_printf2(ses, "%+16s %s", "Room note:", in_room->note);
|
|
|
+ tintin_printf2(ses, "%+16s %s", "Room color:", str_convert_meta(in_room->color, TRUE));
|
|
|
+ tintin_printf2(ses, "%+16s %s (%d)", "Room terrain:", in_room->terrain, in_room->terrain_index);
|
|
|
+
|
|
|
+ tintin_printf2(ses, "");
|
|
|
+ tintin_printf2(ses, " %+16s %-7d %+16s %-7.3f %+16s %-7s", "Room vnum:", ses->map->in_room, "Room weight:", in_room->weight, "Room symbol:", in_room->symbol);
|
|
|
+
|
|
|
+ tintin_printf2(ses, " %+16s %-7d %+16s %-7d %+16s %-7d", "Center x:", ses->map->center_x, "Center y:", ses->map->center_y, "Center z:", ses->map->center_z);
|
|
|
+
|
|
|
+ tintin_printf2(ses, "");
|
|
|
+
|
|
|
+ strcpy(arg1, "");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "Avoid:", HAS_BIT(in_room->flags, ROOM_FLAG_AVOID) ? "on" : "off");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "Curved:", HAS_BIT(in_room->flags, ROOM_FLAG_CURVED) ? "on" : "off");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "Hide:", HAS_BIT(in_room->flags, ROOM_FLAG_HIDE) ? "on" : "off");
|
|
|
+
|
|
|
+ tintin_puts2(ses, arg1);
|
|
|
+
|
|
|
+ strcpy(arg1, "");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "Invis:", HAS_BIT(in_room->flags, ROOM_FLAG_INVIS) ? "on" : "off");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "Leave:", HAS_BIT(in_room->flags, ROOM_FLAG_LEAVE) ? "on" : "off");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "NoGlobal:", HAS_BIT(in_room->flags, ROOM_FLAG_NOGLOBAL) ? "on" : "off");
|
|
|
+ tintin_puts2(ses, arg1);
|
|
|
+
|
|
|
+ strcpy(arg1, "");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "Static:", HAS_BIT(in_room->flags, ROOM_FLAG_STATIC) ? "on" : "off");
|
|
|
+ cat_sprintf(arg1, " %+16s %-7s", "Void:", HAS_BIT(in_room->flags, ROOM_FLAG_VOID) ? "on" : "off");
|
|
|
+ tintin_puts2(ses, arg1);
|
|
|
+
|
|
|
+ tintin_printf2(ses, "");
|
|
|
+
|
|
|
+ for (exit = in_room->f_exit ; exit ; exit = exit->next)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, "%+16s %-3s (%3s) to room: %-5d (%5s)", "Exit:", exit->name, exit->cmd, exit->vnum, ses->map->room_list[exit->vnum]->name);
|
|
|
+ }
|
|
|
+
|
|
|
+ tintin_printf2(ses, "");
|
|
|
+
|
|
|
+ for (room = 0 ; room < ses->map->size ; room++)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[room])
|
|
|
+ {
|
|
|
+ for (exit = ses->map->room_list[room]->f_exit ; exit ; exit = exit->next)
|
|
|
+ {
|
|
|
+ if (exit->vnum == ses->map->in_room)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, "%+16s %-3s (%3s) from room: %-5d (%5s)", "Entrance:", exit->name, exit->cmd, room, ses->map->room_list[room]->name);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+/*
|
|
|
+ for (exit = in_room->f_exit ; exit ; exit = exit->next)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, "%+14s %-4s %+14s %5d %+14s %5d %+14s %5s", "Exit name:", exit->name, "vnum:", exit->vnum, "flags:", exit->flags, "command:", exit->cmd);
|
|
|
+ tintin_printf2(ses, "%+14s %s", "Exit data:", exit->data);
|
|
|
+ }
|
|
|
+*/
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_insert)
|
|
|
+{
|
|
|
+ int room, in_room, to_room;
|
|
|
+ struct exit_data *exit;
|
|
|
+ struct listnode *node;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ for (room = 1 ; room < ses->map->size ; room++)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[room] == NULL)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+
|
|
|
+ node = search_node_list(ses->list[LIST_PATHDIR], arg1);
|
|
|
+
|
|
|
+ if (exit == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: There is no room in that direction.");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room == ses->map->size)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: Maximum amount of rooms of %d reached.", ses->map->size);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (node == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: Given direction must be a pathdir.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ in_room = ses->map->in_room;
|
|
|
+ to_room = exit->vnum;
|
|
|
+
|
|
|
+ add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_INSERT);
|
|
|
+
|
|
|
+ create_room(ses, "{%d} {0} {} {} { } {} {} {} {} {} {1.0} {}", room);
|
|
|
+
|
|
|
+ create_exit(ses, room, "{%d} {%s} {%s}", to_room, node->arg1, node->arg1);
|
|
|
+
|
|
|
+ create_exit(ses, room, "{%d} {%s} {%s}", in_room, node->arg2, node->arg2);
|
|
|
+
|
|
|
+ exit->vnum = room;
|
|
|
+
|
|
|
+ if ((exit = find_exit(ses, to_room, node->arg2)) != NULL)
|
|
|
+ {
|
|
|
+ exit->vnum = room;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*arg)
|
|
|
+ {
|
|
|
+ ses->map->in_room = room;
|
|
|
+ map_roomflag(ses, arg, arg1, arg2);
|
|
|
+ ses->map->in_room = in_room;
|
|
|
+ }
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Inserted room {%d}.", room);
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_jump)
|
|
|
+{
|
|
|
+ int room;
|
|
|
+
|
|
|
+ sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ room = find_location(ses, arg1);
|
|
|
+
|
|
|
+ if (room)
|
|
|
+ {
|
|
|
+ add_undo(ses, "%d %d %d", room, ses->map->in_room, MAP_UNDO_MOVE);
|
|
|
+
|
|
|
+ goto_room(ses, room);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP JUMP: JUMPED TO ROOM %d {%s}.", room, *ses->map->room_list[room]->name ? ses->map->room_list[room]->name : ses->map->room_list[room]->id);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP JUMP: Couldn't find a room at {%s}.", arg1);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_landmark)
|
|
|
+{
|
|
|
+ struct listroot *root = ses->list[LIST_LANDMARK];
|
|
|
+ struct listnode *node;
|
|
|
+ char arg3[BUFFER_SIZE], arg4[BUFFER_SIZE];
|
|
|
+ int room, i, found;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg4, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if (*arg1 == 0 || *arg2 == 0)
|
|
|
+ {
|
|
|
+ i = bsearch_alpha_list(root, arg1, 0);
|
|
|
+
|
|
|
+ if (i > 0)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, "name: %-16s vnum:%7d size: %7s desc %s", root->list[i]->arg1, root->list[i]->val32[0], root->list[i]->arg4, root->list[i]->arg3);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ for (found = i = 0 ; i < root->used ; i++)
|
|
|
+ {
|
|
|
+ if (*arg1 == 0 || match(ses, root->list[i]->arg1, arg1, SUB_NONE))
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, "name: %-16s vnum:%7d size: %7s desc: %s", root->list[i]->arg1, root->list[i]->val32[0], root->list[i]->arg4, root->list[i]->arg3);
|
|
|
+
|
|
|
+ found = TRUE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (found == FALSE)
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP LANDMARK: NO MATCHES FOUND FOR {%s}.", arg1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (is_math(ses, arg2))
|
|
|
+ {
|
|
|
+ room = (int) get_number(ses, arg2);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (room <= 0 || room >= ses->map->size)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP LANDMARK: INVALID VNUM {%s}.", arg2);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ node = update_node_list(root, arg1, arg2, arg3, arg4);
|
|
|
+
|
|
|
+ node->val32[0] = room;
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#OK. LANDMARK {%s} HAS VNUM {%d} AND IS DESCRIBED AS {%s} WITH SIZE {%s}.", arg1, room, arg3, arg4);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_unlandmark)
|
|
|
+{
|
|
|
+ delete_node_with_wild(ses, LIST_LANDMARK, arg);
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_leave)
|
|
|
+{
|
|
|
+ if (ses->map->in_room == 0)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: You're not currently inside the map.");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ses->map->last_room = ses->map->in_room;
|
|
|
+ ses->map->in_room = 0;
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Leaving the map. Use goto or return to return.");
|
|
|
+
|
|
|
+ check_all_events(ses, SUB_ARG|SUB_SEC, 0, 1, "MAP EXIT MAP", ntos(ses->map->in_room));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void map_legend_index(struct session *ses, char *arg, int head, int tail)
|
|
|
+{
|
|
|
+ char esc[BUFFER_SIZE], raw[BUFFER_SIZE];
|
|
|
+ int cnt;
|
|
|
+
|
|
|
+ for (cnt = head ; cnt < tail ; cnt++)
|
|
|
+ {
|
|
|
+ arg = sub_arg_in_braces(ses, arg, raw, GET_ONE, SUB_NONE);
|
|
|
+
|
|
|
+ substitute(ses, raw, esc, SUB_ESC);
|
|
|
+
|
|
|
+ if (is_number(esc))
|
|
|
+ {
|
|
|
+ numbertocharacter(ses, esc);
|
|
|
+ }
|
|
|
+ snprintf(ses->map->legend[cnt], LEGEND_SIZE - 1, "%s", esc);
|
|
|
+ snprintf(ses->map->legend_raw[cnt], LEGEND_SIZE - 1, "%s", raw);
|
|
|
+
|
|
|
+ if (*arg == 0)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_legend)
|
|
|
+{
|
|
|
+ char buf[BUFFER_SIZE], arg3[BUFFER_SIZE];
|
|
|
+ int group, legend;
|
|
|
+
|
|
|
+ push_call("map_legend(%p,%p,%p,%p)",ses,arg,arg1,arg2);
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ strcpy(buf, arg2);
|
|
|
+
|
|
|
+ if (*arg1 == 0)
|
|
|
+ {
|
|
|
+ for (group = 0 ; map_group_table[group].name ; group++)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, " [%-22s] [%-22s] [%3d] [%3d]",
|
|
|
+ map_group_table[group].group,
|
|
|
+ map_group_table[group].name,
|
|
|
+ map_group_table[group].start,
|
|
|
+ map_group_table[group].end);
|
|
|
+ }
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (is_abbrev(arg1, "RESET"))
|
|
|
+ {
|
|
|
+ map_legend(ses, "{ASCII} {RESET}", arg1, arg2);
|
|
|
+ map_legend(ses, "{NESW} {RESET}", arg1, arg2);
|
|
|
+ map_legend(ses, "{MUDFONT BRAILLE TUBE} {RESET}", arg1, arg2);
|
|
|
+ map_legend(ses, "{UNICODE GRAPHICS} {RESET}", arg1, arg2);
|
|
|
+
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (is_math(ses, arg1))
|
|
|
+ {
|
|
|
+ legend = (int) get_number(ses, arg1);
|
|
|
+
|
|
|
+ if (legend < map_group_table[0].start || legend >= map_group_table[0].end)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP LEGEND {%d - %d} {[SYMBOL]}", map_group_table[0].start, map_group_table[0].end);
|
|
|
+ }
|
|
|
+ else if (*arg2 == 0)
|
|
|
+ {
|
|
|
+ if (strip_vt102_strlen(ses, ses->map->legend[legend]) > 1)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, " [%-22s] [%-20s] [%3d] [ %12s ] [ %s]",
|
|
|
+ map_legend_table[legend].group,
|
|
|
+ map_legend_table[legend].name,
|
|
|
+ legend,
|
|
|
+ ses->map->legend_raw[legend],
|
|
|
+ ses->map->legend[legend]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, " [%-22s] [%-20s] [%3d] [ %12s ] [ %s ]",
|
|
|
+ map_legend_table[legend].group,
|
|
|
+ map_legend_table[legend].name,
|
|
|
+ legend,
|
|
|
+ ses->map->legend_raw[legend],
|
|
|
+ ses->map->legend[legend]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ map_legend_index(ses, arg2, legend, legend + 1);
|
|
|
+ }
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (group = 0 ; map_group_table[group].name ; group++)
|
|
|
+ {
|
|
|
+ if (is_abbrev(arg1, map_group_table[group].name))
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (!map_group_table[group].name)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP LEGEND: UNKNOWN LEGEND {%s} TRY:", arg1);
|
|
|
+
|
|
|
+ map_legend(ses, "", arg1, arg2);
|
|
|
+
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*arg2 == 0)
|
|
|
+ {
|
|
|
+ for (legend = map_group_table[group].start ; legend < map_group_table[group].end ; legend++)
|
|
|
+ {
|
|
|
+ if (strip_vt102_strlen(ses, ses->map->legend[legend]) > 1)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, " [%-22s] [%-20s] [%3d] [ %12s ] [ %s]",
|
|
|
+ map_legend_table[legend].group,
|
|
|
+ map_legend_table[legend].name,
|
|
|
+ legend,
|
|
|
+ ses->map->legend_raw[legend],
|
|
|
+ ses->map->legend[legend]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, " [%-22s] [%-20s] [%3d] [ %12s ] [ %s ]",
|
|
|
+ map_legend_table[legend].group,
|
|
|
+ map_legend_table[legend].name,
|
|
|
+ legend,
|
|
|
+ ses->map->legend_raw[legend],
|
|
|
+ ses->map->legend[legend]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (is_abbrev(arg2, "RESET"))
|
|
|
+ {
|
|
|
+ map_legend_index(ses, map_group_table[group].reset, map_group_table[group].start, map_group_table[group].end);
|
|
|
+
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (legend = map_group_table[group].start ; legend < map_group_table[group].end ; legend++)
|
|
|
+ {
|
|
|
+ if (!strcasecmp(space_out(arg2), space_out(map_legend_table[legend].name)))
|
|
|
+ {
|
|
|
+ if (*arg3 == 0)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, " [%-22s] [%-20s] [%3d] [ %8s ] [ %s ]",
|
|
|
+ map_group_table[group].name,
|
|
|
+ map_legend_table[legend].name,
|
|
|
+ legend,
|
|
|
+ ses->map->legend_raw[legend],
|
|
|
+ ses->map->legend[legend]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ map_legend_index(ses, arg3, legend, legend + 1);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (legend == map_group_table[group].end)
|
|
|
+ {
|
|
|
+ for (legend = map_group_table[group].start ; legend < map_group_table[group].end ; legend++)
|
|
|
+ {
|
|
|
+ if (is_abbrev(space_out(arg2), space_out(map_legend_table[legend].name)))
|
|
|
+ {
|
|
|
+ if (*arg3 == 0)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, " [%-22s] [%-20s] [%3d] [ %8s ] [ %s ]",
|
|
|
+ map_group_table[group].name,
|
|
|
+ map_legend_table[legend].name,
|
|
|
+ legend,
|
|
|
+ ses->map->legend_raw[legend],
|
|
|
+ ses->map->legend[legend]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ map_legend_index(ses, arg3, legend, legend + 1);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (legend == map_group_table[group].end)
|
|
|
+ {
|
|
|
+ if (strlen(arg2) > (map_group_table[group].end - map_group_table[group].start) * 2)
|
|
|
+ {
|
|
|
+ map_legend_index(ses, arg2, map_group_table[group].start, map_group_table[group].end);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP LEGEND {%s} {{arg %d} {arg %d} ... {arg %d} {arg %d}",
|
|
|
+ map_group_table[group].group,
|
|
|
+ map_group_table[group].start,
|
|
|
+ map_group_table[group].start - 1,
|
|
|
+ map_group_table[group].end - 1,
|
|
|
+ map_group_table[group].end);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_link)
|
|
|
+{
|
|
|
+ char arg3[BUFFER_SIZE];
|
|
|
+ struct listnode *node;
|
|
|
+ struct exit_data *exit;
|
|
|
+ int room;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if (*arg1 == 0 || *arg2 == 0)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP LINK {<DIRECTION>} {<LOCATION>} {BOTH}");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ room = find_room(ses, arg2);
|
|
|
+
|
|
|
+ if (room == 0)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: Couldn't find room {%s}.", arg1);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ exit = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+
|
|
|
+ if (exit)
|
|
|
{
|
|
|
- struct room_data *room_w;
|
|
|
- long long exit_w;
|
|
|
+ delete_exit(ses, ses->map->in_room, exit);
|
|
|
+ }
|
|
|
|
|
|
- room_w = ses->map->grid_rooms[x - 1 + map_grid_x * (y + 0)];
|
|
|
- exit_w = 0;
|
|
|
+ create_exit(ses, ses->map->in_room, "{%d} {%s} {%s}", room, arg1, arg1);
|
|
|
|
|
|
- if (room_w)
|
|
|
+ if (is_abbrev(arg3, "both"))
|
|
|
+ {
|
|
|
+ if ((node = search_node_list(ses->list[LIST_PATHDIR], arg1)) != NULL)
|
|
|
{
|
|
|
- if (HAS_BIT(room_w->exit_dirs, MAP_DIR_E))
|
|
|
- {
|
|
|
- SET_BIT(exit_w, MAP_DIR_E);
|
|
|
- }
|
|
|
- if (HAS_BIT(room_w->exit_dirs, MAP_DIR_U))
|
|
|
+ if (find_exit(ses, room, node->arg2) == NULL)
|
|
|
{
|
|
|
- SET_BIT(exit_w, MAP_DIR_U);
|
|
|
+ create_exit(ses, room, "{%d} {%s} {%s}", ses->map->in_room, node->arg2, node->arg2);
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP LINK: Connected room {%s} to {%s}.", ses->map->room_list[ses->map->in_room]->name, ses->map->room_list[room]->name);
|
|
|
+}
|
|
|
|
|
|
- sprintf(buf, "%s", room_color);
|
|
|
-
|
|
|
- switch (line)
|
|
|
- {
|
|
|
- case 1:
|
|
|
- switch (exit_w)
|
|
|
- {
|
|
|
- case 0:
|
|
|
- strcat(buf, " ");
|
|
|
- break;
|
|
|
- case MAP_DIR_E:
|
|
|
- strcat(buf, "═");
|
|
|
- break;
|
|
|
- case MAP_DIR_E|MAP_DIR_U:
|
|
|
- strcat(buf, "═̂");
|
|
|
- break;
|
|
|
- case MAP_DIR_U:
|
|
|
- strcat(buf, " ̂");
|
|
|
- break;
|
|
|
- default:
|
|
|
- strcat(buf, "?");
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if (room == NULL)
|
|
|
- {
|
|
|
- strcat(buf, " ");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_W) ? "═" : " ");
|
|
|
+DO_MAP(map_list)
|
|
|
+{
|
|
|
+ struct room_data *room;
|
|
|
+ char var[BUFFER_SIZE];
|
|
|
+ int vnum;
|
|
|
|
|
|
- if (room->vnum == ses->map->in_room)
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s", ses->map->color[MAP_COLOR_USER]);
|
|
|
- }
|
|
|
+ map_search_compile(ses, "0", var);
|
|
|
|
|
|
- switch (HAS_BIT(room->exit_dirs, MAP_DIR_N|MAP_DIR_W))
|
|
|
- {
|
|
|
- case MAP_DIR_N:
|
|
|
- strcat(buf, "║");
|
|
|
- break;
|
|
|
- case MAP_DIR_W:
|
|
|
- strcat(buf, "═");
|
|
|
- break;
|
|
|
- case MAP_DIR_N|MAP_DIR_W:
|
|
|
- strcat(buf, "╝");
|
|
|
- break;
|
|
|
- default:
|
|
|
- strcat(buf, "╔");
|
|
|
- break;
|
|
|
- }
|
|
|
+ searchgrid_find(ses, ses->map->in_room, ses->map->search);
|
|
|
|
|
|
+ map_search_compile(ses, arg, var);
|
|
|
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_N) ? " " : "═");
|
|
|
+ set_nest_node_ses(ses, var, "");
|
|
|
|
|
|
+ for (vnum = 0 ; vnum < ses->map->size ; vnum++)
|
|
|
+ {
|
|
|
+ if (match_room(ses, vnum, ses->map->search))
|
|
|
+ {
|
|
|
+ room = ses->map->room_list[vnum];
|
|
|
|
|
|
- switch (HAS_BIT(room->exit_dirs, MAP_DIR_N|MAP_DIR_E))
|
|
|
+ if (*var)
|
|
|
+ {
|
|
|
+ add_nest_node_ses(ses, var, "{%d} {{distance}{%.3f}{x}{%d}{y}{%d}{z}{%d}}", room->vnum, ses->map->search->stamp == room->search_stamp ? room->length : -1, room->x, room->y, room->z);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (ses->map->search->stamp == room->search_stamp)
|
|
|
+ {
|
|
|
+ if (room->w == 0)
|
|
|
{
|
|
|
- case MAP_DIR_N:
|
|
|
- strcat(buf, "║");
|
|
|
- break;
|
|
|
- case MAP_DIR_E:
|
|
|
- strcat(buf, "═");
|
|
|
- break;
|
|
|
- case MAP_DIR_N|MAP_DIR_E:
|
|
|
- strcat(buf, "╚");
|
|
|
- break;
|
|
|
- default:
|
|
|
- strcat(buf, "╗");
|
|
|
- break;
|
|
|
+ tintin_printf2(ses, "vnum: %5d dist: %8.3f x: %4d y: %4d z: %4d name: %s", room->vnum, room->length, room->x, room->y, room->z, room->name);
|
|
|
}
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case 2:
|
|
|
- switch (exit_w)
|
|
|
- {
|
|
|
- case 0:
|
|
|
- strcat(buf, " ");
|
|
|
- break;
|
|
|
- case MAP_DIR_E:
|
|
|
- strcat(buf, "═");
|
|
|
- break;
|
|
|
- case MAP_DIR_E|MAP_DIR_U:
|
|
|
- strcat(buf, "═");
|
|
|
- break;
|
|
|
- default:
|
|
|
- strcat(buf, " ");
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if (room == NULL)
|
|
|
- {
|
|
|
- strcat(buf, " ");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- switch (HAS_BIT(room->exit_dirs, MAP_DIR_W|MAP_DIR_D))
|
|
|
+ else
|
|
|
{
|
|
|
- case MAP_DIR_W:
|
|
|
- strcat(buf, "═");
|
|
|
- break;
|
|
|
- case MAP_DIR_W|MAP_DIR_D:
|
|
|
- strcat(buf, "═̬");
|
|
|
- break;
|
|
|
- case MAP_DIR_D:
|
|
|
- strcat(buf, " ̬");
|
|
|
- break;
|
|
|
- default:
|
|
|
- strcat(buf, " ");
|
|
|
- break;
|
|
|
+ tintin_printf2(ses, "vnum: %5d dist: %8.3f x: %4s y: %4s z: %4s name: %s", room->vnum, room->length, "?", "?", "?", room->name);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- if (room == NULL)
|
|
|
- {
|
|
|
- strcat(buf, " ");
|
|
|
- }
|
|
|
else
|
|
|
{
|
|
|
- if (room->vnum == ses->map->in_room)
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s", ses->map->color[MAP_COLOR_USER]);
|
|
|
- }
|
|
|
-
|
|
|
- switch (HAS_BIT(room->exit_dirs, MAP_DIR_S|MAP_DIR_W))
|
|
|
- {
|
|
|
- case MAP_DIR_S:
|
|
|
- strcat(buf, "║");
|
|
|
- break;
|
|
|
- case MAP_DIR_W:
|
|
|
- strcat(buf, "═");
|
|
|
- break;
|
|
|
- case MAP_DIR_S|MAP_DIR_W:
|
|
|
- strcat(buf, "╗");
|
|
|
- break;
|
|
|
- default:
|
|
|
- strcat(buf, "╚");
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_S) ? " " : "═");
|
|
|
-
|
|
|
- switch (HAS_BIT(room->exit_dirs, MAP_DIR_S|MAP_DIR_E))
|
|
|
- {
|
|
|
- case MAP_DIR_S:
|
|
|
- strcat(buf, "║");
|
|
|
- break;
|
|
|
- case MAP_DIR_E:
|
|
|
- strcat(buf, "═");
|
|
|
- break;
|
|
|
- case MAP_DIR_S|MAP_DIR_E:
|
|
|
- strcat(buf, "╔");
|
|
|
- break;
|
|
|
- default:
|
|
|
- strcat(buf, "╝");
|
|
|
- break;
|
|
|
- }
|
|
|
+ tintin_printf2(ses, "vnum: %5d dist: %8.8s x: ? y: ? z: ? name: %s", room->vnum, "-1", room->name);
|
|
|
}
|
|
|
- break;
|
|
|
+ }
|
|
|
}
|
|
|
- pop_call();
|
|
|
- return buf;
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- if (room == NULL)
|
|
|
+DO_MAP(map_map)
|
|
|
+{
|
|
|
+ char arg3[BUFFER_SIZE], arg4[BUFFER_SIZE];
|
|
|
+ FILE *logfile = NULL;
|
|
|
+ int x, y, line, row;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg4, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ push_call("map_map(%p,%p)",ses,arg);
|
|
|
+
|
|
|
+ if (is_math(ses, arg1))
|
|
|
{
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
- {
|
|
|
- sprintf(buf, " ");
|
|
|
- }
|
|
|
- else if (HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT))
|
|
|
+ map_grid_y = get_number(ses, arg1);
|
|
|
+
|
|
|
+ if (map_grid_y <= 0)
|
|
|
{
|
|
|
- sprintf(buf, " ");
|
|
|
+ map_grid_y = UMAX(0, get_scroll_rows(ses) + map_grid_y);
|
|
|
}
|
|
|
- else
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ map_grid_y = get_scroll_rows(ses);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (is_math(ses, arg2))
|
|
|
+ {
|
|
|
+ map_grid_x = get_number(ses, arg2);
|
|
|
+
|
|
|
+ if (map_grid_x <= 0)
|
|
|
{
|
|
|
- sprintf(buf, " ");
|
|
|
+ map_grid_x = UMAX(0, gtd->screen->cols + map_grid_x);
|
|
|
}
|
|
|
- pop_call();
|
|
|
- return buf;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ map_grid_x = get_scroll_cols(ses);
|
|
|
}
|
|
|
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
+ if (*arg3)
|
|
|
{
|
|
|
- sprintf(buf, "%s", ses->map->color[MAP_COLOR_EXIT]);
|
|
|
+ switch (*arg3)
|
|
|
+ {
|
|
|
+ case 'a':
|
|
|
+ case 'A':
|
|
|
+
|
|
|
+ strcpy(arg3, "APPEND");
|
|
|
+
|
|
|
+ logfile = fopen(arg4, "a");
|
|
|
|
|
|
- switch (line)
|
|
|
- {
|
|
|
- case 1:
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_NW) ? "\\ " : " ");
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_N) ? "|" : " ");
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_U) ? "+" : " ");
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_NE) ? "/ " : " ");
|
|
|
- break;
|
|
|
+ loginit(ses, logfile, LOG_FLAG_APPEND | HAS_BIT(ses->logmode, LOG_FLAG_HTML));
|
|
|
|
|
|
- case 2:
|
|
|
- if (!HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS))
|
|
|
- {
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_W) ? "-" : " ");
|
|
|
- }
|
|
|
+ break;
|
|
|
|
|
|
- if (room->vnum == ses->map->in_room)
|
|
|
- {
|
|
|
- if (!HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS))
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s%s%s%s%s", room_left, ses->map->color[MAP_COLOR_USER], ses->map->legend[index], room_right, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s%05d%s", ses->map->color[MAP_COLOR_USER], room->vnum, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS))
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s%05d%s", room_color, room->vnum, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- else if (HAS_BIT(room->flags, ROOM_FLAG_VOID))
|
|
|
- {
|
|
|
- switch (room->exit_dirs)
|
|
|
- {
|
|
|
- case MAP_DIR_N|MAP_DIR_S:
|
|
|
- cat_sprintf(buf, " | ");
|
|
|
- break;
|
|
|
- case MAP_DIR_E|MAP_DIR_W:
|
|
|
- cat_sprintf(buf, "---");
|
|
|
- break;
|
|
|
- case MAP_DIR_NE|MAP_DIR_SW:
|
|
|
- cat_sprintf(buf, " / ");
|
|
|
- break;
|
|
|
- case MAP_DIR_NW|MAP_DIR_SE:
|
|
|
- cat_sprintf(buf, " \\ ");
|
|
|
- break;
|
|
|
- default:
|
|
|
- cat_sprintf(buf, " * ");
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (strip_color_strlen(ses, room->symbol) <= 1)
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s%s%-1s%s%s", room_left, ses->map->color[MAP_COLOR_SYMBOL], room->symbol, room_right, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- cat_sprintf(buf, "%s%s%-3s%s", room_color, ses->map->color[MAP_COLOR_SYMBOL], room->symbol, ses->map->color[MAP_COLOR_EXIT]);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ case 'd':
|
|
|
+ case 'D':
|
|
|
+ strcpy(arg3, "DRAW");
|
|
|
|
|
|
- if (!HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIVNUMS))
|
|
|
- {
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_E) ? "--" : " ");
|
|
|
- }
|
|
|
- else
|
|
|
+ if (*arg4 == 0)
|
|
|
{
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_E) ? "-" : " ");
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP MAP {%s} {%s} {%s} {square}", arg1, arg2, arg3);
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
- case 3:
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_SW) ? "/" : " ");
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_D) ? "-" : " ");
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_S) ? "| " : " ");
|
|
|
- strcat(buf, HAS_BIT(room->exit_dirs, MAP_DIR_SE) ? "\\ " : " ");
|
|
|
- break;
|
|
|
- }
|
|
|
- pop_call();
|
|
|
- return buf;
|
|
|
- }
|
|
|
+ case 'o':
|
|
|
+ case 'O':
|
|
|
+ strcpy(arg3, "OVERWRITE");
|
|
|
|
|
|
+ logfile = fopen(arg4, "w");
|
|
|
|
|
|
- if (room->vnum == ses->map->in_room)
|
|
|
- {
|
|
|
- exits = ses->map->dir;
|
|
|
+ loginit(ses, logfile, LOG_FLAG_OVERWRITE | HAS_BIT(ses->logmode, LOG_FLAG_HTML));
|
|
|
|
|
|
- DEL_BIT(exits, MAP_EXIT_U|MAP_EXIT_D);
|
|
|
+ break;
|
|
|
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_DIRECTION))
|
|
|
- {
|
|
|
- switch (exits)
|
|
|
- {
|
|
|
- case MAP_EXIT_N:
|
|
|
- index = 24;
|
|
|
- break;
|
|
|
- case MAP_EXIT_N+MAP_EXIT_E:
|
|
|
- index = 25;
|
|
|
- break;
|
|
|
- case MAP_EXIT_E:
|
|
|
- index = 26;
|
|
|
- break;
|
|
|
- case MAP_EXIT_S+MAP_EXIT_E:
|
|
|
- index = 27;
|
|
|
- break;
|
|
|
- case MAP_EXIT_S:
|
|
|
- index = 28;
|
|
|
- break;
|
|
|
- case MAP_EXIT_S+MAP_EXIT_W:
|
|
|
- index = 29;
|
|
|
- break;
|
|
|
- case MAP_EXIT_W:
|
|
|
- index = 30;
|
|
|
- break;
|
|
|
- case MAP_EXIT_N+MAP_EXIT_W:
|
|
|
- index = 31;
|
|
|
- break;
|
|
|
+ case 'l':
|
|
|
+ case 'L':
|
|
|
+ strcpy(arg3, "LIST");
|
|
|
+ break;
|
|
|
|
|
|
- default:
|
|
|
- index = 17;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- index = 16;
|
|
|
- }
|
|
|
+ case 'v':
|
|
|
+ case 'V':
|
|
|
+ strcpy(arg3, "VARIABLE");
|
|
|
+ break;
|
|
|
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT))
|
|
|
- {
|
|
|
- sprintf(buf, "%s%s%s", ses->map->color[MAP_COLOR_USER], ses->map->legend[offset + index], ses->map->legend[offset + index]);
|
|
|
+ default:
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP MAP {rows} {cols} {append|overwrite|list|variable} {name}");
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (*arg4 == 0)
|
|
|
{
|
|
|
- sprintf(buf, "%s%s", ses->map->color[MAP_COLOR_USER], ses->map->legend[offset + index]);
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP MAP {%s} {%s} {%s} {name}", arg1, arg2, arg3);
|
|
|
+ pop_call();
|
|
|
+ return;
|
|
|
}
|
|
|
- pop_call();
|
|
|
- return buf;
|
|
|
}
|
|
|
|
|
|
- exit1 = 0;
|
|
|
- exit2 = 0;
|
|
|
- exits = 0;
|
|
|
-
|
|
|
- if (HAS_BIT(room->exit_dirs, MAP_DIR_N))
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
{
|
|
|
- SET_BIT(exit1, 1 << 0);
|
|
|
- SET_BIT(exit2, 1 << 0);
|
|
|
- SET_BIT(exits, MAP_EXIT_N);
|
|
|
+ map_grid_y = 2 + map_grid_y / 3;
|
|
|
+ map_grid_x = 2 + map_grid_x / 6;
|
|
|
}
|
|
|
-
|
|
|
- if (HAS_BIT(room->exit_dirs, MAP_DIR_W))
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS))
|
|
|
{
|
|
|
- SET_BIT(exit1, 1 << 2);
|
|
|
- SET_BIT(exits, MAP_EXIT_W);
|
|
|
+ map_grid_y = 2 + (map_grid_y + 1) / 2;
|
|
|
+ map_grid_x = 2 + (map_grid_x + 3) / 5;
|
|
|
}
|
|
|
-
|
|
|
- if (HAS_BIT(room->exit_dirs, MAP_DIR_E))
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS))
|
|
|
{
|
|
|
- SET_BIT(exit2, 1 << 2);
|
|
|
- SET_BIT(exits, MAP_EXIT_E);
|
|
|
+ map_grid_y = 2 + map_grid_y / 2;
|
|
|
+ map_grid_x = 2 + map_grid_x / 5;
|
|
|
}
|
|
|
-
|
|
|
- if (HAS_BIT(room->exit_dirs, MAP_DIR_S))
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT))
|
|
|
{
|
|
|
- SET_BIT(exit1, 1 << 4);
|
|
|
- SET_BIT(exit2, 1 << 4);
|
|
|
- SET_BIT(exits, MAP_EXIT_S);
|
|
|
+ map_grid_y = 2 + map_grid_y / 1;
|
|
|
+ map_grid_x = 2 + map_grid_x / 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ map_grid_y = 2 + map_grid_y;
|
|
|
+ map_grid_x = 2 + map_grid_x;
|
|
|
}
|
|
|
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT))
|
|
|
+ if (map_grid_x > ses->map->max_grid_x || map_grid_y > ses->map->max_grid_y)
|
|
|
{
|
|
|
- if (HAS_BIT(room->exit_dirs, MAP_DIR_NW))
|
|
|
- {
|
|
|
- SET_BIT(exit1, 1 << 1);
|
|
|
- }
|
|
|
- if (HAS_BIT(room->exit_dirs, MAP_DIR_NE))
|
|
|
- {
|
|
|
- SET_BIT(exit2, 1 << 1);
|
|
|
- }
|
|
|
- if (HAS_BIT(room->exit_dirs, MAP_DIR_SW))
|
|
|
+ if (map_grid_x > ses->map->max_grid_x)
|
|
|
{
|
|
|
- SET_BIT(exit1, 1 << 3);
|
|
|
+ ses->map->max_grid_x = map_grid_x + 1;
|
|
|
}
|
|
|
- if (HAS_BIT(room->exit_dirs, MAP_DIR_SE))
|
|
|
+ if (map_grid_y > ses->map->max_grid_y)
|
|
|
{
|
|
|
- SET_BIT(exit2, 1 << 3);
|
|
|
+ ses->map->max_grid_y = map_grid_y + 1;
|
|
|
}
|
|
|
|
|
|
- room1 = exit1 + LEGEND_MUDFONT_NWS;
|
|
|
- room2 = exit2 + LEGEND_MUDFONT_NES;
|
|
|
+ ses->map->grid_rooms = (struct room_data **) realloc(ses->map->grid_rooms, ses->map->max_grid_x * ses->map->max_grid_y * sizeof(struct room_data *));
|
|
|
+ }
|
|
|
|
|
|
- if (HAS_BIT(room->flags, ROOM_FLAG_VOID))
|
|
|
+ displaygrid_build(ses, ses->map->in_room, map_grid_x, map_grid_y, 0);
|
|
|
+
|
|
|
+ *arg1 = row = 0;
|
|
|
+
|
|
|
+ if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
+ {
|
|
|
+ for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
{
|
|
|
- room1 += 64;
|
|
|
- room2 += 64;
|
|
|
- }
|
|
|
+ for (line = 1 ; line <= 3 ; line++)
|
|
|
+ {
|
|
|
+ str_cpy(>d->buf, ses->map->color[MAP_COLOR_BACK]);
|
|
|
|
|
|
- if (HAS_BIT(room->flags, ROOM_FLAG_CURVED))
|
|
|
+ for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
+ {
|
|
|
+ str_cat(>d->buf, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], line, x, y));
|
|
|
+ }
|
|
|
+
|
|
|
+ str_clone(>d->out, gtd->buf);
|
|
|
+
|
|
|
+ substitute(ses, gtd->buf, gtd->out, SUB_COL|SUB_CMP|SUB_LIT);
|
|
|
+
|
|
|
+ if (logfile)
|
|
|
+ {
|
|
|
+ logit(ses, gtd->out, logfile, LOG_FLAG_LINEFEED);
|
|
|
+ }
|
|
|
+ else if (*arg3 == 'L')
|
|
|
+ {
|
|
|
+ cat_sprintf(arg1, "{%02d}{%s}", ++row, gtd->out);
|
|
|
+ }
|
|
|
+ else if (*arg3 == 'V' || *arg3 == 'D')
|
|
|
+ {
|
|
|
+ cat_sprintf(arg1, "%s\n", gtd->out);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tintin_puts2(ses, gtd->out);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS) || HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS))
|
|
|
+ {
|
|
|
+ for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
{
|
|
|
- switch (room->exit_dirs)
|
|
|
+ for (line = 1 ; line <= 2 ; line++)
|
|
|
{
|
|
|
- case MAP_DIR_N|MAP_DIR_E:
|
|
|
- case MAP_DIR_N|MAP_DIR_SE:
|
|
|
- room1 = LEGEND_MUDFONT_CURVED + 0;
|
|
|
- break;
|
|
|
- case MAP_DIR_S|MAP_DIR_E:
|
|
|
- case MAP_DIR_S|MAP_DIR_NE:
|
|
|
- room1 = LEGEND_MUDFONT_CURVED + 1;
|
|
|
- break;
|
|
|
- case MAP_DIR_S|MAP_DIR_W:
|
|
|
- case MAP_DIR_S|MAP_DIR_NW:
|
|
|
- room2 = LEGEND_MUDFONT_CURVED + 2;
|
|
|
- break;
|
|
|
- case MAP_DIR_N|MAP_DIR_W:
|
|
|
- case MAP_DIR_N|MAP_DIR_SW:
|
|
|
- room2 = LEGEND_MUDFONT_CURVED + 3;
|
|
|
- break;
|
|
|
+ str_cpy(>d->buf, ses->map->color[MAP_COLOR_BACK]);
|
|
|
+
|
|
|
+ for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
+ {
|
|
|
+ str_cat(>d->buf, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], line, x, y));
|
|
|
+ }
|
|
|
+
|
|
|
+ str_clone(>d->out, gtd->buf);
|
|
|
+
|
|
|
+ substitute(ses, gtd->buf, gtd->out, SUB_COL|SUB_CMP|SUB_LIT);
|
|
|
+
|
|
|
+ if (logfile)
|
|
|
+ {
|
|
|
+ fprintf(logfile, "%s\n", gtd->out);
|
|
|
+ }
|
|
|
+ else if (*arg3 == 'L')
|
|
|
+ {
|
|
|
+ cat_sprintf(arg1, "{%02d}{%s\e[0m}", ++row, gtd->out);
|
|
|
+ }
|
|
|
+ else if (*arg3 == 'V' || *arg3 == 'D')
|
|
|
+ {
|
|
|
+ cat_sprintf(arg1, "%s\e[0m\n", gtd->out);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tintin_puts2(ses, gtd->out);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- sprintf(buf, "%s%s%s", room_color, ses->map->legend[room1], ses->map->legend[room2]);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_SYMBOLGRAPHICS) && room->symbol[0] && room->symbol[0] != ' ')
|
|
|
- {
|
|
|
- sprintf(buf, "%s%-1s", room_color, room->symbol);
|
|
|
- }
|
|
|
- else
|
|
|
+ for (y = map_grid_y - 2 ; y >= 1 ; y--)
|
|
|
{
|
|
|
- if (HAS_BIT(room->flags, ROOM_FLAG_VOID) && (exits == MAP_EXIT_N+MAP_EXIT_S || exits == MAP_EXIT_E+MAP_EXIT_W))
|
|
|
+ str_cpy(>d->buf, ses->map->color[MAP_COLOR_BACK]);
|
|
|
+
|
|
|
+ for (x = 1 ; x < map_grid_x - 1 ; x++)
|
|
|
{
|
|
|
- sprintf(buf, "%s%s", room_color, exits == MAP_EXIT_N+MAP_EXIT_S ? ses->map->legend[offset+16+2] : ses->map->legend[offset+16+3]);
|
|
|
+ str_cat(>d->buf, draw_room(ses, ses->map->grid_rooms[x + map_grid_x * y], 0, x, y));
|
|
|
+ }
|
|
|
+
|
|
|
+ substitute(ses, gtd->buf, gtd->out, SUB_COL|SUB_CMP|SUB_LIT);
|
|
|
+
|
|
|
+ if (logfile)
|
|
|
+ {
|
|
|
+ fprintf(logfile, "%s\n", gtd->out);
|
|
|
+ }
|
|
|
+ else if (*arg3 == 'L')
|
|
|
+ {
|
|
|
+ cat_sprintf(arg1, "{%02d}{%s}", ++row, gtd->out);
|
|
|
+ }
|
|
|
+ else if (*arg3 == 'V' || *arg3 == 'D')
|
|
|
+ {
|
|
|
+ cat_sprintf(arg1, "%s\n", gtd->out);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if (HAS_BIT(room->flags, ROOM_FLAG_CURVED))
|
|
|
- {
|
|
|
- switch (room->exit_dirs)
|
|
|
- {
|
|
|
- case MAP_DIR_N|MAP_DIR_E:
|
|
|
- exits = 16 + 4;
|
|
|
- break;
|
|
|
- case MAP_DIR_S|MAP_DIR_E:
|
|
|
- exits = 16 + 5;
|
|
|
- break;
|
|
|
- case MAP_DIR_S|MAP_DIR_W:
|
|
|
- exits = 16 + 6;
|
|
|
- break;
|
|
|
- case MAP_DIR_N|MAP_DIR_W:
|
|
|
- exits = 16 + 7;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- sprintf(buf, "%s%s", room_color, ses->map->legend[offset + exits]);
|
|
|
+ tintin_puts2(ses, gtd->out);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- pop_call();
|
|
|
- return buf;
|
|
|
-}
|
|
|
-
|
|
|
-void search_keywords(struct session *ses, char *arg, char *out, char *var)
|
|
|
-{
|
|
|
- char buf[MAP_SEARCH_MAX][BUFFER_SIZE], tmp[BUFFER_SIZE];
|
|
|
- int type, max;
|
|
|
-
|
|
|
- push_call("search_keywords(%p,%p,%p,%p)",ses,arg,out,var);
|
|
|
|
|
|
- for (type = 0 ; type < MAP_SEARCH_MAX ; type++)
|
|
|
+ if (logfile)
|
|
|
{
|
|
|
- buf[type][0] = 0;
|
|
|
+ fclose(logfile);
|
|
|
}
|
|
|
-
|
|
|
- var[0] = 0;
|
|
|
-
|
|
|
- type = 0;
|
|
|
-
|
|
|
- while (*arg && type < MAP_SEARCH_MAX)
|
|
|
+ else if (*arg3 == 'D')
|
|
|
{
|
|
|
- arg = sub_arg_in_braces(ses, arg, tmp, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
-
|
|
|
- if (!strcasecmp(tmp, "roomid"))
|
|
|
- {
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_ID], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- }
|
|
|
- else if (!strcasecmp(tmp, "roomname"))
|
|
|
- {
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_NAME], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- }
|
|
|
- else if (!strcasecmp(tmp, "roomexits"))
|
|
|
- {
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_EXITS], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- }
|
|
|
- else if (!strcasecmp(tmp, "roomdesc"))
|
|
|
- {
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_DESC], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- }
|
|
|
- else if (!strcasecmp(tmp, "roomarea"))
|
|
|
- {
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_AREA], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- }
|
|
|
- else if (!strcasecmp(tmp, "roomnote"))
|
|
|
- {
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_NOTE], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- }
|
|
|
- else if (!strcasecmp(tmp, "roomterrain"))
|
|
|
- {
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_TERRAIN], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- }
|
|
|
- else if (!strcasecmp(tmp, "roomflag"))
|
|
|
- {
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf[MAP_SEARCH_FLAG], GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- }
|
|
|
- else if (!strcasecmp(tmp, "variable"))
|
|
|
- {
|
|
|
- arg = sub_arg_in_braces(ses, arg, var, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(buf[type++], tmp);
|
|
|
- }
|
|
|
+ draw_map(ses, 1, 2, 3, 4, 5, 6, 7, "", arg4, arg2, arg1);
|
|
|
}
|
|
|
-
|
|
|
- for (max = MAP_SEARCH_MAX - 1 ; max >= 0 ; max--)
|
|
|
+ else if (*arg3 == 'L')
|
|
|
{
|
|
|
- if (*buf[max])
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
+ set_nest_node_ses(ses, arg4, "%s", arg1);
|
|
|
}
|
|
|
-
|
|
|
- out[0] = 0;
|
|
|
-
|
|
|
- for (type = 0 ; type <= max ; type++)
|
|
|
+ else if (*arg3 == 'V')
|
|
|
{
|
|
|
- cat_sprintf(out, "{%s}", buf[type]);
|
|
|
+ set_nest_node_ses(ses, arg4, "%s", arg1);
|
|
|
}
|
|
|
+
|
|
|
pop_call();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
-void map_search_compile(struct session *ses, char *arg, char *var)
|
|
|
+DO_MAP(map_move)
|
|
|
{
|
|
|
- char tmp[BUFFER_SIZE], buf[BUFFER_SIZE], *ptb;
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
- push_call("map_search_compile(%p,%p,%p)",ses,arg,var);
|
|
|
+// tintin_printf2(ses, "debug: %s vs %s", arg, arg1);
|
|
|
|
|
|
- search_keywords(ses, arg, tmp, var);
|
|
|
+ arg = substitute_speedwalk(ses, arg1, arg2);
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, tmp, buf, GET_ALL, SUB_VAR|SUB_FUN); // name
|
|
|
+// tintin_printf2(ses, "debug: %s vs %s", arg, arg2);
|
|
|
|
|
|
- if (is_math(ses, buf))
|
|
|
- {
|
|
|
- ses->map->search->vnum = (int) get_number(ses, buf);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ses->map->search->vnum = 0;
|
|
|
- }
|
|
|
+ ses->map->nofollow++;
|
|
|
|
|
|
- if (ses->map->search->vnum)
|
|
|
+ while (*arg)
|
|
|
{
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
- }
|
|
|
+ arg = get_arg_in_braces(ses, arg, arg1, GET_ALL);
|
|
|
|
|
|
- if (ses->map->search->name)
|
|
|
- {
|
|
|
- free(ses->map->search->name);
|
|
|
+ follow_map(ses, arg1);
|
|
|
+
|
|
|
+ if (*arg == COMMAND_SEPARATOR)
|
|
|
+ {
|
|
|
+ arg++;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- if (*buf)
|
|
|
- {
|
|
|
- strcat(buf, "$");
|
|
|
+ ses->map->nofollow--;
|
|
|
+}
|
|
|
|
|
|
- ses->map->search->name = tintin_regexp_compile(ses, NULL, buf, PCRE_ANCHORED);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ses->map->search->name = NULL;
|
|
|
- }
|
|
|
+DO_MAP(map_name)
|
|
|
+{
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // exits
|
|
|
+ RESTRING(ses->map->room_list[ses->map->in_room]->name, arg1);
|
|
|
+}
|
|
|
|
|
|
- ses->map->search->exit_dirs = 0;
|
|
|
- ses->map->search->exit_size = 0;
|
|
|
+DO_MAP(map_offset)
|
|
|
+{
|
|
|
+ char arg3[BUFFER_SIZE], arg4[BUFFER_SIZE];
|
|
|
|
|
|
- if (ses->map->search->exit_list)
|
|
|
+ if (arg)
|
|
|
{
|
|
|
- free(ses->map->search->exit_list);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg4, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ ses->map->sav_top_row = get_number(ses, arg1);
|
|
|
+ ses->map->sav_top_col = get_number(ses, arg2);
|
|
|
+ ses->map->sav_bot_row = get_number(ses, arg3);
|
|
|
+ ses->map->sav_bot_col = get_number(ses, arg4);
|
|
|
}
|
|
|
|
|
|
- if (*buf)
|
|
|
+ if (ses->map->sav_top_row == 0)
|
|
|
{
|
|
|
- struct listnode *node;
|
|
|
- char exit[BUFFER_SIZE];
|
|
|
- ptb = buf;
|
|
|
-
|
|
|
- tmp[0] = 0;
|
|
|
-
|
|
|
- if (is_math(ses, buf))
|
|
|
- {
|
|
|
- ses->map->search->exit_dirs = get_number(ses, buf);
|
|
|
-
|
|
|
- if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_N)) ses->map->search->exit_size++;
|
|
|
- if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_E)) ses->map->search->exit_size++;
|
|
|
- if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_S)) ses->map->search->exit_size++;
|
|
|
- if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_W)) ses->map->search->exit_size++;
|
|
|
- if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_U)) ses->map->search->exit_size++;
|
|
|
- if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_D)) ses->map->search->exit_size++;
|
|
|
- if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_NE)) ses->map->search->exit_size++;
|
|
|
- if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_NW)) ses->map->search->exit_size++;
|
|
|
- if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_SE)) ses->map->search->exit_size++;
|
|
|
- if (HAS_BIT(ses->map->search->exit_dirs, MAP_DIR_SW)) ses->map->search->exit_size++;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- while (*ptb)
|
|
|
- {
|
|
|
- ptb = get_arg_in_braces(ses, ptb, exit, GET_ONE);
|
|
|
-
|
|
|
- node = search_node_list(ses->list[LIST_PATHDIR], exit);
|
|
|
-
|
|
|
- ses->map->search->exit_size++;
|
|
|
-
|
|
|
- if (node)
|
|
|
- {
|
|
|
- SET_BIT(ses->map->search->exit_dirs, 1LL << atoi(node->arg3));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- SET_BIT(ses->map->search->exit_dirs, 1); // flag indicates no exits
|
|
|
-
|
|
|
- cat_sprintf(tmp, "{%s}", exit);
|
|
|
- }
|
|
|
-
|
|
|
- if (*ptb == COMMAND_SEPARATOR)
|
|
|
- {
|
|
|
- ptb++;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- ses->map->search->exit_list = strdup(tmp);
|
|
|
+ ses->map->top_row = 1;
|
|
|
+ }
|
|
|
+ else if (ses->map->sav_top_row < 0)
|
|
|
+ {
|
|
|
+ ses->map->top_row = 1 + gtd->screen->rows + ses->map->sav_top_row;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- ses->map->search->exit_list = strdup("");
|
|
|
+ ses->map->top_row = ses->map->sav_top_row;
|
|
|
}
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // desc
|
|
|
-
|
|
|
- if (ses->map->search->desc)
|
|
|
+ if (ses->map->sav_top_col == 0)
|
|
|
{
|
|
|
- free(ses->map->search->desc);
|
|
|
+ ses->map->top_col = 1;
|
|
|
}
|
|
|
-
|
|
|
- if (*buf)
|
|
|
+ else if (ses->map->sav_top_col < 0)
|
|
|
{
|
|
|
- strcat(buf, "$");
|
|
|
-
|
|
|
- ses->map->search->desc = tintin_regexp_compile(ses, NULL, buf, PCRE_ANCHORED);
|
|
|
+ ses->map->top_col = 1 + gtd->screen->cols + ses->map->sav_top_col;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- ses->map->search->desc = NULL;
|
|
|
+ ses->map->top_col = ses->map->sav_top_col;
|
|
|
}
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // area
|
|
|
-
|
|
|
- if (ses->map->search->area)
|
|
|
+ if (ses->map->sav_bot_row == 0)
|
|
|
{
|
|
|
- free(ses->map->search->area);
|
|
|
+ ses->map->bot_row = ses->split->top_row - 1;
|
|
|
}
|
|
|
-
|
|
|
- if (*buf)
|
|
|
+ else if (ses->map->sav_bot_row < 0)
|
|
|
{
|
|
|
- strcat(buf, "$");
|
|
|
-
|
|
|
- ses->map->search->area = tintin_regexp_compile(ses, NULL, buf, PCRE_ANCHORED);
|
|
|
+ ses->map->bot_row = 1 + gtd->screen->rows + ses->map->sav_bot_row;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- ses->map->search->area = NULL;
|
|
|
+ ses->map->bot_row = ses->map->sav_bot_row;
|
|
|
}
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // note
|
|
|
-
|
|
|
- if (ses->map->search->note)
|
|
|
+ if (ses->map->sav_bot_col == 0)
|
|
|
{
|
|
|
- free(ses->map->search->note);
|
|
|
+ ses->map->bot_col = gtd->screen->cols;
|
|
|
}
|
|
|
-
|
|
|
- if (*buf)
|
|
|
+ else if (ses->map->sav_bot_col < 0)
|
|
|
{
|
|
|
- strcat(buf, "$");
|
|
|
-
|
|
|
- ses->map->search->note = tintin_regexp_compile(ses, NULL, buf, PCRE_ANCHORED);
|
|
|
+ ses->map->bot_col = 1 + gtd->screen->cols + ses->map->sav_bot_col;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- ses->map->search->note = NULL;
|
|
|
+ ses->map->bot_col = ses->map->sav_bot_col;
|
|
|
}
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // terrain
|
|
|
+ ses->map->rows = ses->map->bot_row - ses->map->top_row;
|
|
|
+ ses->map->cols = ses->map->bot_col - ses->map->top_col;
|
|
|
|
|
|
- if (ses->map->search->terrain)
|
|
|
+ if (arg)
|
|
|
{
|
|
|
- free(ses->map->search->terrain);
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP OFFSET: SQUARE {%d, %d, %d, %d} ROWS {%d} COLS {%d}", ses->map->top_row, ses->map->top_col, ses->map->bot_row, ses->map->bot_col, ses->map->rows, ses->map->cols);
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- if (*buf)
|
|
|
- {
|
|
|
- strcat(buf, "$");
|
|
|
|
|
|
- ses->map->search->terrain = tintin_regexp_compile(ses, NULL, buf, PCRE_ANCHORED);
|
|
|
- }
|
|
|
- else
|
|
|
+DO_MAP(map_read)
|
|
|
+{
|
|
|
+ FILE *myfile;
|
|
|
+ struct room_data *room;
|
|
|
+ struct exit_data *exit;
|
|
|
+ char buffer[BUFFER_SIZE], file[BUFFER_SIZE], *cptr;
|
|
|
+ int line = 1, vnum = 0;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, file, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ if ((myfile = fopen(file, "r")) == NULL)
|
|
|
{
|
|
|
- ses->map->search->terrain = NULL;
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: Map file {%s} not found.", file);
|
|
|
+
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // flag
|
|
|
+ gtd->level->quiet++;
|
|
|
|
|
|
- if (*buf)
|
|
|
+ if (fgets(buffer, BUFFER_SIZE - 1, myfile))
|
|
|
{
|
|
|
- char flags[BUFFER_SIZE];
|
|
|
+ cptr = strchr(buffer, '\r'); /* For map files editor on Windows systems. */
|
|
|
|
|
|
- ses->map->search->flag = get_number(ses, buf);
|
|
|
+ if (cptr)
|
|
|
+ {
|
|
|
+ *cptr = 0;
|
|
|
+ }
|
|
|
|
|
|
- ptb = buf;
|
|
|
+ cptr = strchr(buffer, '\n');
|
|
|
|
|
|
- while (*buf)
|
|
|
+ if (cptr)
|
|
|
{
|
|
|
- ptb = sub_arg_in_braces(ses, ptb, flags, GET_ONE, SUB_NONE);
|
|
|
+ *cptr = 0;
|
|
|
+ }
|
|
|
|
|
|
- if (is_abbrev(buf, "avoid"))
|
|
|
- {
|
|
|
- SET_BIT(ses->map->search->flag, ROOM_FLAG_AVOID);
|
|
|
- }
|
|
|
- else if (is_abbrev(buf, "curved"))
|
|
|
- {
|
|
|
- SET_BIT(ses->map->search->flag, ROOM_FLAG_CURVED);
|
|
|
- }
|
|
|
- else if (is_abbrev(buf, "hide"))
|
|
|
- {
|
|
|
- SET_BIT(ses->map->search->flag, ROOM_FLAG_HIDE);
|
|
|
- }
|
|
|
- else if (is_abbrev(buf, "invis"))
|
|
|
- {
|
|
|
- SET_BIT(ses->map->search->flag, ROOM_FLAG_INVIS);
|
|
|
- }
|
|
|
- else if (is_abbrev(buf, "leave"))
|
|
|
- {
|
|
|
- SET_BIT(ses->map->search->flag, ROOM_FLAG_LEAVE);
|
|
|
- }
|
|
|
- else if (is_abbrev(buf, "void"))
|
|
|
- {
|
|
|
- SET_BIT(ses->map->search->flag, ROOM_FLAG_VOID);
|
|
|
- }
|
|
|
- else if (is_abbrev(buf, "static"))
|
|
|
+ if (buffer[0] == 'C' && buffer[1] == ' ')
|
|
|
+ {
|
|
|
+ if (ses->map == NULL || !HAS_BIT(ses->map->flags, MAP_FLAG_SYNC))
|
|
|
{
|
|
|
- SET_BIT(ses->map->search->flag, ROOM_FLAG_STATIC);
|
|
|
+ create_map(ses, buffer + 2);
|
|
|
}
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ gtd->level->quiet--;
|
|
|
|
|
|
- if (*ptb == COMMAND_SEPARATOR)
|
|
|
- {
|
|
|
- ptb++;
|
|
|
- }
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP READ {%s}: INVALID START OF FILE. ABORTING READ..", file);
|
|
|
+
|
|
|
+ fclose(myfile);
|
|
|
+
|
|
|
+ return;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- ses->map->search->flag = 0;
|
|
|
- }
|
|
|
+ gtd->level->quiet--;
|
|
|
|
|
|
- arg = sub_arg_in_braces(ses, arg, buf, GET_ALL, SUB_VAR|SUB_FUN); // id
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: INVALID READ ON LINE %d. ABORTING READ..", line);
|
|
|
|
|
|
- if (ses->map->search->id)
|
|
|
- {
|
|
|
- free(ses->map->search->id);
|
|
|
+ fclose(myfile);
|
|
|
+
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- if (*buf)
|
|
|
- {
|
|
|
- ses->map->search->id = strdup(buf);
|
|
|
- }
|
|
|
- else
|
|
|
+ while (fgets(buffer, BUFFER_SIZE - 1, myfile))
|
|
|
{
|
|
|
- ses->map->search->id = NULL;
|
|
|
- }
|
|
|
+ line++;
|
|
|
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
-}
|
|
|
+ cptr = strchr(buffer, '\r'); /* For map files editor on Windows systems. */
|
|
|
|
|
|
-int match_room(struct session *ses, int vnum, struct search_data *search)
|
|
|
-{
|
|
|
- struct room_data *room = ses->map->room_list[vnum];
|
|
|
+ if (cptr)
|
|
|
+ {
|
|
|
+ *cptr = 0;
|
|
|
+ }
|
|
|
|
|
|
- if (room == NULL)
|
|
|
- {
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ cptr = strchr(buffer, '\n');
|
|
|
+
|
|
|
+ if (cptr)
|
|
|
+ {
|
|
|
+ *cptr = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (buffer[0])
|
|
|
+ {
|
|
|
+ case 'C':
|
|
|
+ switch (buffer[1])
|
|
|
+ {
|
|
|
+ case ' ':
|
|
|
+ gtd->level->quiet--;
|
|
|
+
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: INVALID COMMAND {%d} {%s} ON LINE %d. ABORTING READ..", buffer[0], buffer, line);
|
|
|
+
|
|
|
+ fclose(myfile);
|
|
|
+
|
|
|
+ delete_map(ses);
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+ case 'A':
|
|
|
+ case 'B':
|
|
|
+ case 'E':
|
|
|
+ case 'H':
|
|
|
+ case 'I':
|
|
|
+ case 'P':
|
|
|
+ case 'R':
|
|
|
+ case 'S':
|
|
|
+ case 'U':
|
|
|
+ if (!HAS_BIT(ses->map->flags, MAP_FLAG_SYNC))
|
|
|
+ {
|
|
|
+ map_color(ses, buffer + 1, arg1, arg2);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP READ: INVALID COMMAND {%d} {%s} ON LINE %d. ABORTING READ..", buffer[0], buffer, line);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'E':
|
|
|
+ create_exit(ses, vnum, "%s", buffer + 2);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'F':
|
|
|
+ if (!HAS_BIT(ses->map->flags, MAP_FLAG_SYNC))
|
|
|
+ {
|
|
|
+ ses->map->flags = atoi(buffer + 2);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'G':
|
|
|
+ if (ses->map->global_vnum == 0)
|
|
|
+ {
|
|
|
+ ses->map->global_vnum = ses->map->global_exit->vnum = atoi(buffer + 2);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'I':
|
|
|
+ if (ses->map->last_room == 0)
|
|
|
+ {
|
|
|
+ ses->map->last_room = atoi(buffer + 2);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'L':
|
|
|
+ switch (buffer[1])
|
|
|
+ {
|
|
|
+ case ' ':
|
|
|
+ if (!HAS_BIT(ses->map->flags, MAP_FLAG_SYNC))
|
|
|
+ {
|
|
|
+ map_legend(ses, buffer + 2, arg1, arg2);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'M':
|
|
|
+ map_landmark(ses, buffer + 3, arg1, arg2);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'R':
|
|
|
+ room = create_room(ses, "%s", buffer + 2);
|
|
|
+ vnum = room->vnum;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'T':
|
|
|
+ if (!HAS_BIT(ses->map->flags, MAP_FLAG_SYNC))
|
|
|
+ {
|
|
|
+ map_terrain(ses, buffer + 2, arg1, arg2);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'V':
|
|
|
+ if (ses->map->version == 0)
|
|
|
+ {
|
|
|
+ ses->map->version = atoi(buffer + 2);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case '#':
|
|
|
+ buffer[0] = gtd->tintin_char;
|
|
|
+ ses = script_driver(ses, LIST_COMMAND, buffer);
|
|
|
+ break;
|
|
|
|
|
|
- if (search->vnum)
|
|
|
- {
|
|
|
- return room->vnum == search->vnum;
|
|
|
- }
|
|
|
+ case 0:
|
|
|
+ case 13:
|
|
|
+ break;
|
|
|
|
|
|
- if (search->id)
|
|
|
- {
|
|
|
- return !strcmp(room->id, search->id);
|
|
|
- }
|
|
|
+ default:
|
|
|
+ gtd->level->quiet--;
|
|
|
|
|
|
- if (search->name)
|
|
|
- {
|
|
|
- if (!regexp_compare(search->name, room->name, "", 0, 0))
|
|
|
- {
|
|
|
- return 0;
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: INVALID COMMAND {%d} {%s} ON LINE %d.", buffer[0], buffer, line);
|
|
|
+
|
|
|
+ gtd->level->quiet++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (search->exit_dirs)
|
|
|
- {
|
|
|
- char *arg, exit[BUFFER_SIZE];
|
|
|
+ gtd->level->quiet--;
|
|
|
|
|
|
- if (search->exit_dirs != room->exit_dirs)
|
|
|
- {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- if (search->exit_size != room->exit_size)
|
|
|
+ fclose(myfile);
|
|
|
+
|
|
|
+ for (vnum = 0 ; vnum < ses->map->size ; vnum++)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[vnum] == NULL)
|
|
|
{
|
|
|
- return 0;
|
|
|
+ continue;
|
|
|
}
|
|
|
|
|
|
- arg = search->exit_list;
|
|
|
-
|
|
|
- while (*arg)
|
|
|
+ for (exit = ses->map->room_list[vnum]->f_exit ; exit ; exit = exit->next)
|
|
|
{
|
|
|
- arg = get_arg_in_braces(ses, arg, exit, GET_ONE);
|
|
|
-
|
|
|
- if (!find_exit(ses, vnum, exit))
|
|
|
+ if (exit->vnum < 0 || exit->vnum >= ses->map->size || ses->map->room_list[exit->vnum] == NULL)
|
|
|
{
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP READ: Room %d - invalid exit '%s' to room %d.", vnum, exit->name, exit->vnum);
|
|
|
|
|
|
- if (*arg == COMMAND_SEPARATOR)
|
|
|
- {
|
|
|
- arg++;
|
|
|
+ delete_exit(ses, vnum, exit);
|
|
|
+
|
|
|
+ if (ses->map->room_list[vnum]->f_exit)
|
|
|
+ {
|
|
|
+ exit = ses->map->room_list[vnum]->f_exit;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (search->desc)
|
|
|
- {
|
|
|
- if (!regexp_compare(search->desc, room->desc, "", 0, 0))
|
|
|
- {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- }
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP READ: Map file {%s} loaded.", file);
|
|
|
|
|
|
- if (search->area)
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+DO_MAP(map_resize)
|
|
|
+{
|
|
|
+ int size, vnum, room;
|
|
|
+
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+
|
|
|
+ size = atoi(arg1);
|
|
|
+
|
|
|
+ if (size <= ses->map->size)
|
|
|
{
|
|
|
- if (!regexp_compare(search->area, room->area, "", 0, 0))
|
|
|
+ for (room = vnum = 1 ; vnum < ses->map->size ; vnum++)
|
|
|
{
|
|
|
- return 0;
|
|
|
+ if (ses->map->room_list[vnum])
|
|
|
+ {
|
|
|
+ room = vnum;
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if (search->note)
|
|
|
- {
|
|
|
- if (!regexp_compare(search->note, room->note, "", 0, 0))
|
|
|
+ if (room >= size)
|
|
|
{
|
|
|
- return 0;
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP RESIZE: YOU MUST DELETE ALL ROOMS WITH VNUMS ABOVE (%d) FIRST.", size);
|
|
|
+ return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (search->terrain)
|
|
|
+ ses->map->room_list = (struct room_data **) realloc(ses->map->room_list, size * sizeof(struct room_data *));
|
|
|
+
|
|
|
+ if (ses->map->size < size)
|
|
|
{
|
|
|
- if (!regexp_compare(search->terrain, room->terrain, "", 0, 0))
|
|
|
+ while (ses->map->size < size)
|
|
|
{
|
|
|
- return 0;
|
|
|
+ ses->map->room_list[ses->map->size++] = NULL;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- if (search->flag)
|
|
|
+ else
|
|
|
{
|
|
|
- if ((room->flags & search->flag) != search->flag)
|
|
|
- {
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ ses->map->size = size;
|
|
|
}
|
|
|
- return 1;
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP RESIZE: MAP RESIZED TO %d ROOMS.", ses->map->size);
|
|
|
}
|
|
|
|
|
|
-int find_room(struct session *ses, char *arg)
|
|
|
+DO_MAP(map_return)
|
|
|
{
|
|
|
- char var[BUFFER_SIZE];
|
|
|
- int room;
|
|
|
-
|
|
|
- push_call("find_room(%p,%s)",ses,arg);
|
|
|
-
|
|
|
- map_search_compile(ses, arg, var);
|
|
|
-
|
|
|
- if (ses->map->search->vnum > 0 && ses->map->search->vnum < ses->map->size)
|
|
|
+ if (ses->map == NULL || ses->map->room_list[ses->map->last_room] == NULL)
|
|
|
{
|
|
|
- if (ses->map->room_list[ses->map->search->vnum])
|
|
|
- {
|
|
|
- pop_call();
|
|
|
- return ses->map->search->vnum;
|
|
|
- }
|
|
|
- pop_call();
|
|
|
- return 0;
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP RETURN: NO KNOWN LAST ROOM.");
|
|
|
+
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
if (ses->map->in_room)
|
|
|
{
|
|
|
- room = searchgrid_find(ses, ses->map->in_room, ses->map->search);
|
|
|
-
|
|
|
- if (room)
|
|
|
- {
|
|
|
- pop_call();
|
|
|
- return room;
|
|
|
- }
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP RETURN: ALREADY IN THE MAP.");
|
|
|
}
|
|
|
-
|
|
|
- for (room = 0 ; room < ses->map->size ; room++)
|
|
|
+ else
|
|
|
{
|
|
|
- if (ses->map->room_list[room] == NULL)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
+ goto_room(ses, ses->map->last_room);
|
|
|
|
|
|
- if (!match_room(ses, room, ses->map->search))
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
- pop_call();
|
|
|
- return room;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP RETURN: RETURNED TO ROOM %d {%s}.", ses->map->in_room, ses->map->room_list[ses->map->in_room]->name);
|
|
|
}
|
|
|
- pop_call();
|
|
|
- return 0;
|
|
|
}
|
|
|
|
|
|
-void goto_room(struct session *ses, int room)
|
|
|
+DO_MAP(map_roomflag)
|
|
|
{
|
|
|
- int last_room = ses->map->in_room;
|
|
|
+ char buf[BUFFER_SIZE], *str, arg3[BUFFER_SIZE];
|
|
|
+ int flag = 0;
|
|
|
|
|
|
- push_call("goto_room(%p,%d)",ses,room);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
- if (ses->map->in_room)
|
|
|
+ if (*arg1 == 0)
|
|
|
{
|
|
|
- check_all_events(ses, SUB_ARG|SUB_SEC, 0, 2, "MAP EXIT ROOM", ntos(last_room), ntos(room));
|
|
|
- check_all_events(ses, SUB_ARG|SUB_SEC, 1, 2, "MAP EXIT ROOM %d", last_room, ntos(last_room), ntos(room));
|
|
|
+ tintin_printf2(ses, "#MAP: Avoid flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_AVOID) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: Block flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_BLOCK) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: Hide flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_HIDE) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: Invis flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_INVIS) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: Leave flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_LEAVE) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: Void flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_VOID) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: Static flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_STATIC) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: Curved flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_CURVED) ? "ON" : "OFF");
|
|
|
+ tintin_printf2(ses, "#MAP: NoGlobal flag is set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_NOGLOBAL) ? "ON" : "OFF");
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- ses->map->in_room = room;
|
|
|
-
|
|
|
- DEL_BIT(ses->map->room_list[room]->flags, ROOM_FLAG_PATH);
|
|
|
+ str = arg1;
|
|
|
|
|
|
- if (last_room == 0)
|
|
|
+ while (*str)
|
|
|
{
|
|
|
- check_all_events(ses, SUB_ARG|SUB_SEC, 0, 1, "MAP ENTER MAP", ntos(room));
|
|
|
- }
|
|
|
-
|
|
|
- check_all_events(ses, SUB_ARG|SUB_SEC, 0, 2, "MAP ENTER ROOM", ntos(room), ntos(last_room));
|
|
|
- check_all_events(ses, SUB_ARG|SUB_SEC, 1, 2, "MAP ENTER ROOM %d", room, ntos(room), ntos(last_room));
|
|
|
+ str = get_arg_in_braces(ses, str, buf, GET_ONE);
|
|
|
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
-}
|
|
|
+ if (is_abbrev(buf, "avoid"))
|
|
|
+ {
|
|
|
+ SET_BIT(flag, ROOM_FLAG_AVOID);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "block"))
|
|
|
+ {
|
|
|
+ SET_BIT(flag, ROOM_FLAG_BLOCK);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "curved"))
|
|
|
+ {
|
|
|
+ SET_BIT(flag, ROOM_FLAG_CURVED);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "hide"))
|
|
|
+ {
|
|
|
+ SET_BIT(flag, ROOM_FLAG_HIDE);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "invisible"))
|
|
|
+ {
|
|
|
+ SET_BIT(flag, ROOM_FLAG_INVIS);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "leave"))
|
|
|
+ {
|
|
|
+ SET_BIT(flag, ROOM_FLAG_LEAVE);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "noglobal"))
|
|
|
+ {
|
|
|
+ SET_BIT(flag, ROOM_FLAG_NOGLOBAL);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "static"))
|
|
|
+ {
|
|
|
+ SET_BIT(flag, ROOM_FLAG_STATIC);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf, "void"))
|
|
|
+ {
|
|
|
+ SET_BIT(flag, ROOM_FLAG_VOID);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP: Invalid room flag {%s}.", buf);
|
|
|
|
|
|
-int find_new_room(struct session *ses)
|
|
|
-{
|
|
|
- int room;
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- for (room = 1 ; room < ses->map->size ; room++)
|
|
|
- {
|
|
|
- if (ses->map->room_list[room] == NULL)
|
|
|
+ if (*str == COMMAND_SEPARATOR)
|
|
|
{
|
|
|
- break;
|
|
|
+ str++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (room == ses->map->size)
|
|
|
+ if (*arg2 == 0)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP CREATE ROOM: Maximum amount of rooms of %d reached. Use #map resize.", ses->map->size);
|
|
|
-
|
|
|
- return 0;
|
|
|
+ TOG_BIT(ses->map->room_list[ses->map->in_room]->flags, flag);
|
|
|
}
|
|
|
- return room;
|
|
|
-}
|
|
|
-
|
|
|
-int dir_flags(struct session *ses, int room, int dir)
|
|
|
-{
|
|
|
- struct exit_data *exit;
|
|
|
-
|
|
|
- for (exit = ses->map->room_list[room]->f_exit ; exit ; exit = exit->next)
|
|
|
+ else if (is_abbrev(arg2, "ON"))
|
|
|
{
|
|
|
- if (exit->dir == dir)
|
|
|
+ SET_BIT(ses->map->room_list[ses->map->in_room]->flags, flag);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "OFF"))
|
|
|
+ {
|
|
|
+ DEL_BIT(ses->map->room_list[ses->map->in_room]->flags, flag);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg2, "GET"))
|
|
|
+ {
|
|
|
+ if (*arg3 == 0)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX #MAP ROOMFLAG {%s} {GET} {<VARIABLE>}.", buf);
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- return exit->flags; /* | HAS_BIT(ses->map->room_list[exit->vnum]->flags, EXIT_FLAG_ALL);*/
|
|
|
+ set_nest_node_ses(ses, arg3, "%d", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, flag));
|
|
|
}
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX #MAP ROOMFLAG {%s} {[GET|ON|OFF]}.", buf);
|
|
|
}
|
|
|
- return 0;
|
|
|
-}
|
|
|
|
|
|
-struct exit_data *find_exit(struct session *ses, int room, char *arg)
|
|
|
-{
|
|
|
- struct exit_data *exit;
|
|
|
|
|
|
- for (exit = ses->map->room_list[room]->f_exit ; exit ; exit = exit->next)
|
|
|
+ if (HAS_BIT(flag, ROOM_FLAG_AVOID))
|
|
|
{
|
|
|
-// if (!strcmp(exit->name, arg) || exit->vnum == atoi(arg))
|
|
|
- if (!strcmp(exit->name, arg))
|
|
|
- {
|
|
|
- return exit;
|
|
|
- }
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Avoid flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_AVOID) ? "ON" : "OFF");
|
|
|
}
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
-int check_global(struct session *ses, int room)
|
|
|
-{
|
|
|
- if (HAS_BIT(ses->map->room_list[room]->flags, ROOM_FLAG_NOGLOBAL))
|
|
|
+ if (HAS_BIT(flag, ROOM_FLAG_BLOCK))
|
|
|
{
|
|
|
- return FALSE;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Block flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_AVOID) ? "ON" : "OFF");
|
|
|
}
|
|
|
-
|
|
|
- if (ses->map->room_list[ses->map->global_vnum] == NULL)
|
|
|
+ if (HAS_BIT(flag, ROOM_FLAG_CURVED))
|
|
|
{
|
|
|
- return FALSE;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Curved flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_CURVED) ? "ON" : "OFF");
|
|
|
}
|
|
|
-
|
|
|
- if (room == ses->map->global_vnum)
|
|
|
+ if (HAS_BIT(flag, ROOM_FLAG_HIDE))
|
|
|
{
|
|
|
- return FALSE;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Hide flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_HIDE) ? "ON" : "OFF");
|
|
|
}
|
|
|
- return TRUE;
|
|
|
-}
|
|
|
-
|
|
|
-int tunnel_void(struct session *ses, int from, int room, int dir)
|
|
|
-{
|
|
|
- if (!HAS_BIT(ses->map->room_list[room]->flags, ROOM_FLAG_VOID))
|
|
|
+ if (HAS_BIT(flag, ROOM_FLAG_INVIS))
|
|
|
{
|
|
|
- return room;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Invis flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_INVIS) ? "ON" : "OFF");
|
|
|
}
|
|
|
-
|
|
|
- if (get_room_exits(ses, room) != 2)
|
|
|
+ if (HAS_BIT(flag, ROOM_FLAG_LEAVE))
|
|
|
{
|
|
|
- struct exit_data *exit;
|
|
|
-
|
|
|
- for (exit = ses->map->room_list[room]->f_exit ; exit ; exit = exit->next)
|
|
|
- {
|
|
|
- if (exit->dir == dir)
|
|
|
- {
|
|
|
- return tunnel_void(ses, room, exit->vnum, exit->dir);
|
|
|
- }
|
|
|
- }
|
|
|
- return room;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Leave flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_LEAVE) ? "ON" : "OFF");
|
|
|
}
|
|
|
-
|
|
|
- if (ses->map->room_list[room]->f_exit->vnum != from)
|
|
|
+ if (HAS_BIT(flag, ROOM_FLAG_NOGLOBAL))
|
|
|
{
|
|
|
- return tunnel_void(ses, room, ses->map->room_list[room]->f_exit->vnum, ses->map->room_list[room]->f_exit->dir);
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: NoGlobal flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_NOGLOBAL) ? "ON" : "OFF");
|
|
|
}
|
|
|
- else
|
|
|
+ if (HAS_BIT(flag, ROOM_FLAG_VOID))
|
|
|
{
|
|
|
- return tunnel_void(ses, room, ses->map->room_list[room]->l_exit->vnum, ses->map->room_list[room]->l_exit->dir);
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Void flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_VOID) ? "ON" : "OFF");
|
|
|
+ }
|
|
|
+ if (HAS_BIT(flag, ROOM_FLAG_STATIC))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Static flag set to %s.", HAS_BIT(ses->map->room_list[ses->map->in_room]->flags, ROOM_FLAG_STATIC) ? "ON" : "OFF");
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-// shortest_path() utilities
|
|
|
+}
|
|
|
|
|
|
-int searchgrid_find(struct session *ses, int from, struct search_data *search)
|
|
|
+DO_MAP(map_set)
|
|
|
{
|
|
|
- int vnum, head, tail, index;
|
|
|
- float length;
|
|
|
- struct grid_node *node, *temp, list[MAP_BF_SIZE];
|
|
|
- struct exit_data *exit;
|
|
|
- struct room_data *room;
|
|
|
-
|
|
|
- search->stamp++;
|
|
|
-
|
|
|
- head = 0;
|
|
|
- tail = 1;
|
|
|
-
|
|
|
- node = &list[head];
|
|
|
-
|
|
|
- node->vnum = from;
|
|
|
- node->length = ses->map->room_list[from]->weight;
|
|
|
-
|
|
|
- // for map_list
|
|
|
+ struct room_data *room = ses->map->room_list[ses->map->in_room];
|
|
|
+ char arg3[BUFFER_SIZE];
|
|
|
|
|
|
- node->w = 0;
|
|
|
- node->x = 0;
|
|
|
- node->y = 0;
|
|
|
- node->z = 0;
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
- while (head != tail)
|
|
|
+ if (*arg3)
|
|
|
{
|
|
|
- node = &list[head];
|
|
|
-
|
|
|
- room = ses->map->room_list[node->vnum];
|
|
|
-
|
|
|
- length = node->length;
|
|
|
-
|
|
|
- head = (head + 1) % MAP_BF_SIZE;
|
|
|
-
|
|
|
- if (search->stamp != room->search_stamp)
|
|
|
- {
|
|
|
- room->search_stamp = search->stamp;
|
|
|
-
|
|
|
- // first come first serve like with spatialgrid_find
|
|
|
-
|
|
|
- room->w = node->w;
|
|
|
- room->x = node->x;
|
|
|
- room->y = node->y;
|
|
|
- room->z = node->z;
|
|
|
-
|
|
|
- DEL_BIT(room->flags, ROOM_FLAG_PATH);
|
|
|
- }
|
|
|
- else if (length >= room->length)
|
|
|
- {
|
|
|
- if (room->vnum != ses->map->global_vnum && room->w && node->w == 0)
|
|
|
- {
|
|
|
- room->w = node->w;
|
|
|
- room->x = node->x;
|
|
|
- room->y = node->y;
|
|
|
- room->z = node->z;
|
|
|
- }
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- room->length = length;
|
|
|
-
|
|
|
- if (search->vnum)
|
|
|
- {
|
|
|
- if (room->vnum == search->vnum)
|
|
|
- {
|
|
|
- return room->vnum;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (match_room(ses, room->vnum, search))
|
|
|
- {
|
|
|
- return room->vnum;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (check_global(ses, room->vnum))
|
|
|
+ if (atoi(arg3) > 0 && atoi(arg3) < ses->map->size)
|
|
|
{
|
|
|
- exit = ses->map->global_exit;
|
|
|
+ room = ses->map->room_list[atoi(arg3)];
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- exit = room->f_exit;
|
|
|
- }
|
|
|
-
|
|
|
- for ( ; exit ; exit = exit->next)
|
|
|
- {
|
|
|
- vnum = tunnel_void(ses, room->vnum, exit->vnum, exit->dir);
|
|
|
-
|
|
|
- if (HAS_BIT(exit->flags, EXIT_FLAG_AVOID) || HAS_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_AVOID))
|
|
|
- {
|
|
|
- goto next_exit;
|
|
|
- }
|
|
|
-
|
|
|
- length = room->length + exit->weight + ses->map->room_list[vnum]->weight;
|
|
|
-
|
|
|
- if (search->stamp == ses->map->room_list[vnum]->search_stamp)
|
|
|
- {
|
|
|
- if (length >= ses->map->room_list[vnum]->length)
|
|
|
- {
|
|
|
- goto next_exit;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- temp = &list[tail];
|
|
|
-
|
|
|
- temp->vnum = vnum;
|
|
|
- temp->length = length;
|
|
|
- temp->w = room->vnum == ses->map->global_vnum ? 1 : room->w;
|
|
|
- temp->x = room->x + (HAS_BIT(exit->dir, MAP_EXIT_E) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_W) ? -1 : 0);
|
|
|
- temp->y = room->y + (HAS_BIT(exit->dir, MAP_EXIT_N) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_S) ? -1 : 0);
|
|
|
- temp->z = room->z + (HAS_BIT(exit->dir, MAP_EXIT_U) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_D) ? -1 : 0);
|
|
|
-
|
|
|
- /*
|
|
|
- list must remain ordered by length
|
|
|
- */
|
|
|
-
|
|
|
- index = tail;
|
|
|
-
|
|
|
- while (index != head)
|
|
|
- {
|
|
|
- temp = &list[index];
|
|
|
-
|
|
|
- node = &list[index ? index - 1 : MAP_BF_SIZE - 1];
|
|
|
-
|
|
|
- if (temp->length >= node->length)
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- vnum = temp->vnum;
|
|
|
- length = temp->length;
|
|
|
-
|
|
|
- temp->vnum = node->vnum;
|
|
|
- temp->length = node->length;
|
|
|
-
|
|
|
- node->vnum = vnum;
|
|
|
- node->length = length;
|
|
|
-
|
|
|
- index = index ? index - 1 : MAP_BF_SIZE - 1;
|
|
|
- }
|
|
|
-
|
|
|
- tail = (tail + 1) % MAP_BF_SIZE;
|
|
|
-
|
|
|
- if (tail == head)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#SHORTEST PATH: MAP TOO BIG FOR BF STACK OF %d", MAP_BF_SIZE);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- next_exit:
|
|
|
-
|
|
|
- if (exit == ses->map->global_exit)
|
|
|
- {
|
|
|
- exit->next = room->f_exit;
|
|
|
- }
|
|
|
+ room = NULL;
|
|
|
}
|
|
|
}
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-int searchgrid_walk(struct session *ses, int offset, int from, int dest)
|
|
|
-{
|
|
|
- int vnum, trim, head, tail, index;
|
|
|
- float length;
|
|
|
- struct grid_node *node, *temp, list[MAP_BF_SIZE];
|
|
|
- struct exit_data *exit;
|
|
|
- struct room_data *room;
|
|
|
-
|
|
|
- head = 0;
|
|
|
- tail = 1;
|
|
|
|
|
|
- list[head].vnum = from;
|
|
|
- list[head].length = ses->map->room_list[from]->weight;
|
|
|
-
|
|
|
- while (head != tail)
|
|
|
+ if (room == NULL)
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: invalid room vnum: %s", arg3);
|
|
|
+ }
|
|
|
+ else if (*arg1 == 0)
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, " roomarea: %s", room->area);
|
|
|
+ tintin_printf2(ses, " roomcolor: %s", room->color);
|
|
|
+ tintin_printf2(ses, " roomdata: %s", room->data);
|
|
|
+ tintin_printf2(ses, " roomdesc: %s", room->desc);
|
|
|
+ tintin_printf2(ses, " roomflags: %d", room->flags);
|
|
|
+ tintin_printf2(ses, " roomid: %s", room->id);
|
|
|
+ tintin_printf2(ses, " roomname: %s", room->name);
|
|
|
+ tintin_printf2(ses, " roomnote: %s", room->note);
|
|
|
+ tintin_printf2(ses, " roomsymbol: %s", room->symbol);
|
|
|
+ tintin_printf2(ses, "roomterrain: %s", room->terrain);
|
|
|
+ tintin_printf2(ses, " roomweight: %.3f", room->weight);
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- node = &list[head];
|
|
|
-
|
|
|
- room = ses->map->room_list[node->vnum];
|
|
|
-
|
|
|
- length = node->length;
|
|
|
-
|
|
|
- head = (head + 1) % MAP_BF_SIZE;
|
|
|
-
|
|
|
-
|
|
|
- if (length >= room->length)
|
|
|
+ if (is_abbrev(arg1, "roomarea"))
|
|
|
{
|
|
|
- continue;
|
|
|
+ RESTRING(room->area, arg2);
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: roomarea set to: %s", room->area);
|
|
|
}
|
|
|
-
|
|
|
- room->length = length;
|
|
|
-
|
|
|
- if (room->vnum == dest)
|
|
|
+ else if (is_abbrev(arg1, "roomcolor"))
|
|
|
{
|
|
|
- return room->vnum;
|
|
|
+ RESTRING(room->color, arg2);
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: roomcolor set to: %s", arg2);
|
|
|
}
|
|
|
-
|
|
|
- trim = 1;
|
|
|
-
|
|
|
- if (check_global(ses, room->vnum))
|
|
|
+ else if (is_abbrev(arg1, "roomdata"))
|
|
|
{
|
|
|
- exit = ses->map->global_exit;
|
|
|
+ RESTRING(room->data, arg2);
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: roomdata set to: %s", arg2);
|
|
|
}
|
|
|
- else
|
|
|
+ else if (is_abbrev(arg1, "roomdesc"))
|
|
|
{
|
|
|
- exit = room->f_exit;
|
|
|
+ RESTRING(room->desc, arg2);
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: roomdesc set to: %s", arg2);
|
|
|
}
|
|
|
-
|
|
|
- for ( ; exit ; exit = exit->next)
|
|
|
+ else if (is_abbrev(arg1, "roomflags"))
|
|
|
{
|
|
|
- vnum = tunnel_void(ses, room->vnum, exit->vnum, exit->dir);
|
|
|
-
|
|
|
- if (HAS_BIT(exit->flags, EXIT_FLAG_AVOID) || HAS_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_AVOID))
|
|
|
- {
|
|
|
- goto next_exit;
|
|
|
- }
|
|
|
-
|
|
|
- length = room->length + exit->weight + ses->map->room_list[vnum]->weight;
|
|
|
-
|
|
|
- if (ses->map->search->stamp != ses->map->room_list[vnum]->search_stamp)
|
|
|
- {
|
|
|
- goto next_exit;
|
|
|
- }
|
|
|
-
|
|
|
- if (length >= ses->map->room_list[vnum]->length || length >= ses->map->room_list[dest]->length)
|
|
|
- {
|
|
|
- goto next_exit;
|
|
|
- }
|
|
|
-
|
|
|
- temp = &list[tail];
|
|
|
+ room->flags = (int) get_number(ses, arg2);
|
|
|
|
|
|
- temp->vnum = vnum;
|
|
|
- temp->length = length;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: roomflags set to: %d", room->flags);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomid"))
|
|
|
+ {
|
|
|
+ RESTRING(room->id, arg2);
|
|
|
|
|
|
- /*
|
|
|
- list must remain ordered by length
|
|
|
- */
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: roomid set to: %s", room->id);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomname"))
|
|
|
+ {
|
|
|
+ RESTRING(room->name, arg2);
|
|
|
|
|
|
- index = tail;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: roomname set to: %s", room->name);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomnote"))
|
|
|
+ {
|
|
|
+ RESTRING(room->note, arg2);
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: roomnote set to: %s", arg2);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomsymbol"))
|
|
|
+ {
|
|
|
+ RESTRING(room->symbol, arg2);
|
|
|
|
|
|
- while (index != head)
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: roomsymbol set to: %s", room->symbol);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomterrain"))
|
|
|
+ {
|
|
|
+ RESTRING(room->terrain, arg2);
|
|
|
+ room->terrain_index = bsearch_alpha_list(ses->list[LIST_TERRAIN], room->terrain, 0);
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: roomterrain set to: %s (%d)", arg2, room->terrain_index);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(arg1, "roomweight"))
|
|
|
+ {
|
|
|
+ if (get_number(ses, arg2) < 0.001)
|
|
|
{
|
|
|
- temp = &list[index];
|
|
|
-
|
|
|
- node = &list[index ? index - 1 : MAP_BF_SIZE - 1];
|
|
|
-
|
|
|
- if (temp->length >= node->length)
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- vnum = temp->vnum;
|
|
|
- length = temp->length;
|
|
|
-
|
|
|
- temp->vnum = node->vnum;
|
|
|
- temp->length = node->length;
|
|
|
-
|
|
|
- node->vnum = vnum;
|
|
|
- node->length = length;
|
|
|
-
|
|
|
- index = index ? index - 1 : MAP_BF_SIZE - 1;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: roomweight should be at least 0.001");
|
|
|
}
|
|
|
-
|
|
|
- tail = (tail + 1) % MAP_BF_SIZE;
|
|
|
-
|
|
|
- if (tail == head)
|
|
|
+ else
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#SHORTEST PATH: MAP TOO BIG FOR BF STACK OF %d", MAP_BF_SIZE);
|
|
|
- break;
|
|
|
- }
|
|
|
- trim = 0;
|
|
|
-
|
|
|
- next_exit:
|
|
|
+ room->weight = (float) get_number(ses, arg2);
|
|
|
|
|
|
- if (exit == ses->map->global_exit)
|
|
|
- {
|
|
|
- exit->next = room->f_exit;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: roomweight set to: %.3f", room->weight);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- if (trim)
|
|
|
+ else
|
|
|
{
|
|
|
- room->length = 0;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP SET: unknown option: %s", arg1);
|
|
|
}
|
|
|
}
|
|
|
- return 0;
|
|
|
}
|
|
|
|
|
|
-void shortest_path(struct session *ses, int run, char *delay, char *arg)
|
|
|
+DO_MAP(map_sync)
|
|
|
{
|
|
|
- char var[BUFFER_SIZE];
|
|
|
- struct exit_data *exit;
|
|
|
- struct room_data *room;
|
|
|
- int vnum, dest;
|
|
|
-
|
|
|
- if (HAS_BIT(ses->flags, SES_FLAG_PATHMAPPING))
|
|
|
+ if (ses->map)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#SHORTEST PATH: You have to use #PATH END first.");
|
|
|
-
|
|
|
- return;
|
|
|
+ SET_BIT(ses->map->flags, MAP_FLAG_SYNC);
|
|
|
}
|
|
|
|
|
|
- kill_list(ses->list[LIST_PATH]);
|
|
|
-
|
|
|
- ses->list[LIST_PATH]->update = 0;
|
|
|
-
|
|
|
- map_search_compile(ses, arg, var);
|
|
|
-
|
|
|
- dest = searchgrid_find(ses, ses->map->in_room, ses->map->search);
|
|
|
-
|
|
|
- if (dest == 0 || dest == ses->map->global_vnum)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#SHORTEST PATH: NO PATH FOUND TO %s.", arg);
|
|
|
- return;
|
|
|
- }
|
|
|
+ map_read(ses, arg, arg1, arg2);
|
|
|
|
|
|
- if (dest == ses->map->in_room)
|
|
|
+ if (ses->map)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#SHORTEST PATH: Already there.");
|
|
|
- return;
|
|
|
+ DEL_BIT(ses->map->flags, MAP_FLAG_SYNC);
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- vnum = ses->map->in_room;
|
|
|
+DO_MAP(map_terrain)
|
|
|
+{
|
|
|
+ struct listroot *root = ses->list[LIST_TERRAIN];
|
|
|
+ struct listnode *node;
|
|
|
+ struct room_data *room;
|
|
|
+ char arg3[BUFFER_SIZE], buf1[BUFFER_SIZE];
|
|
|
+ int i, found, flags, density, spread;
|
|
|
|
|
|
- // Slower than a backtrace, but works with mazes.
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg3, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, buf1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
- while (TRUE)
|
|
|
+ if (*arg2 == 0 || (*arg1 == 0 && *arg2 == 0))
|
|
|
{
|
|
|
- room = ses->map->room_list[vnum];
|
|
|
+ i = bsearch_alpha_list(root, arg1, 0);
|
|
|
|
|
|
- if (check_global(ses, room->vnum))
|
|
|
+ if (i > 0)
|
|
|
{
|
|
|
- exit = ses->map->global_exit;
|
|
|
+ tintin_printf2(ses, "name: %-16s index %4d symbol: %-12s flags: %s %s", root->list[i]->arg1, i, root->list[i]->arg2, root->list[i]->arg3, root->list[i]->arg4);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- exit = room->f_exit;
|
|
|
- }
|
|
|
+ for (found = i = 0 ; i < root->used ; i++)
|
|
|
+ {
|
|
|
+ if (*arg1 == 0 || match(ses, root->list[i]->arg1, arg1, SUB_NONE))
|
|
|
+ {
|
|
|
+ room = root->list[i]->room;
|
|
|
|
|
|
- for ( ; exit ; exit = exit->next)
|
|
|
- {
|
|
|
- if (HAS_BIT(exit->flags, EXIT_FLAG_AVOID) || HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_AVOID))
|
|
|
+ if (!HAS_BIT(room->flags, ROOM_FLAG_TERRAIN))
|
|
|
+ {
|
|
|
+ tintin_printf2(ses, "error: no terrain flag set.");
|
|
|
+ }
|
|
|
+ tintin_printf2(ses, "name: %-16s index %4d symbol: %-16s %s %s", room->name, room->terrain_index, room->symbol, root->list[i]->arg3, root->list[i]->arg4);
|
|
|
+
|
|
|
+ found = TRUE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (found == FALSE)
|
|
|
{
|
|
|
- goto exit_next;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP TERRAIN: NO MATCHES FOUND FOR {%s}.", arg1);
|
|
|
}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SET_BIT(ses->map->flags, MAP_FLAG_UPDATETERRAIN);
|
|
|
|
|
|
- vnum = tunnel_void(ses, room->vnum, exit->vnum, exit->dir);
|
|
|
+ density = TERRAIN_FLAG_AMPLE;
|
|
|
+ spread = TERRAIN_FLAG_STANDARD;
|
|
|
+ flags = 0;
|
|
|
|
|
|
- if (searchgrid_walk(ses, room->length, vnum, dest))
|
|
|
+ arg = arg3;
|
|
|
+
|
|
|
+ while (*arg)
|
|
|
+ {
|
|
|
+ arg = get_arg_in_braces(ses, arg, buf1, GET_ONE);
|
|
|
+
|
|
|
+ if (is_abbrev(buf1, "DENSE"))
|
|
|
{
|
|
|
- break;
|
|
|
+ density = TERRAIN_FLAG_DENSE;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf1, "AMPLE"))
|
|
|
+ {
|
|
|
+ density = TERRAIN_FLAG_AMPLE;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf1, "SPARSE"))
|
|
|
+ {
|
|
|
+ density = TERRAIN_FLAG_SPARSE;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf1, "SCANT"))
|
|
|
+ {
|
|
|
+ density = TERRAIN_FLAG_SCANT;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf1, "NARROW"))
|
|
|
+ {
|
|
|
+ spread = TERRAIN_FLAG_NARROW;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf1, "WIDE"))
|
|
|
+ {
|
|
|
+ spread = TERRAIN_FLAG_WIDE;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf1, "VAST"))
|
|
|
+ {
|
|
|
+ spread = TERRAIN_FLAG_WIDE|TERRAIN_FLAG_VAST;
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf1, "FADEIN"))
|
|
|
+ {
|
|
|
+ SET_BIT(flags, TERRAIN_FLAG_FADEIN);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf1, "FADEOUT"))
|
|
|
+ {
|
|
|
+ SET_BIT(flags, TERRAIN_FLAG_FADEOUT);
|
|
|
+ }
|
|
|
+ else if (is_abbrev(buf1, "DOUBLE"))
|
|
|
+ {
|
|
|
+ SET_BIT(flags, TERRAIN_FLAG_DOUBLE);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP TERRAIN {%s} [DENSE|DOUBLE|SPARSE|SCANT|NARROW|WIDE|VAST|FADEIN|FADEOUT]", arg1);
|
|
|
}
|
|
|
|
|
|
- exit_next:
|
|
|
-
|
|
|
- if (exit == ses->map->global_exit)
|
|
|
+ if (*arg == COMMAND_SEPARATOR)
|
|
|
{
|
|
|
- exit->next = room->f_exit;
|
|
|
+ arg++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (exit == NULL)
|
|
|
- {
|
|
|
- show_error(ses, LIST_COMMAND, "#SHORTEST PATH: UNKNOWN ERROR.");
|
|
|
- return;
|
|
|
- }
|
|
|
+ strcpy(buf1, "");
|
|
|
|
|
|
- if (exit != ses->map->global_exit)
|
|
|
+ SET_BIT(flags, density);
|
|
|
+ SET_BIT(flags, spread);
|
|
|
+
|
|
|
+ if (flags)
|
|
|
{
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW))
|
|
|
+ if (HAS_BIT(flags, TERRAIN_FLAG_DENSE))
|
|
|
{
|
|
|
- check_append_path(ses, exit->cmd, "", 0);
|
|
|
+ strcat(buf1, "DENSE ");
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(flags, TERRAIN_FLAG_SPARSE))
|
|
|
+ {
|
|
|
+ strcat(buf1, "SPARSE ");
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(flags, TERRAIN_FLAG_SCANT))
|
|
|
+ {
|
|
|
+ strcat(buf1, "SCANT ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (HAS_BIT(flags, TERRAIN_FLAG_NARROW))
|
|
|
+ {
|
|
|
+ strcat(buf1, "NARROW ");
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(flags, TERRAIN_FLAG_VAST))
|
|
|
+ {
|
|
|
+ strcat(buf1, "VAST ");
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(flags, TERRAIN_FLAG_WIDE))
|
|
|
+ {
|
|
|
+ strcat(buf1, "WIDE ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (HAS_BIT(flags, TERRAIN_FLAG_FADEIN))
|
|
|
+ {
|
|
|
+ strcat(buf1, "FADEIN ");
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(flags, TERRAIN_FLAG_FADEOUT))
|
|
|
+ {
|
|
|
+ strcat(buf1, "FADEOUT ");
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (HAS_BIT(flags, TERRAIN_FLAG_DOUBLE))
|
|
|
{
|
|
|
- check_append_path(ses, exit->name, "", 0);
|
|
|
+ strcat(buf1, "DOUBLE ");
|
|
|
}
|
|
|
+
|
|
|
+ buf1[strlen(buf1) - 1] = 0;
|
|
|
}
|
|
|
|
|
|
- SET_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_PATH);
|
|
|
+ node = update_node_list(root, arg1, arg2, buf1, "");
|
|
|
|
|
|
- if (ses->map->room_list[vnum]->search_stamp != ses->map->search->stamp)
|
|
|
+ if (node->room)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "%d bad search stamp %d vs %d", vnum, ses->map->room_list[vnum]->search_stamp, ses->map->search->stamp);
|
|
|
+ if (node->room->symbol)
|
|
|
+ {
|
|
|
+ RESTRING(node->room->terrain, arg1);
|
|
|
+ RESTRING(node->room->symbol, arg2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ node->room = create_room(ses, "{0} {%d} {} {%s} {%s} {} {} {} {} {} {1.0} {}", ROOM_FLAG_TERRAIN, node->arg1, node->arg2);
|
|
|
}
|
|
|
|
|
|
- if (vnum == dest)
|
|
|
+ node->room->terrain_flags = flags;
|
|
|
+
|
|
|
+ for (i = 0 ; i < root->used ; i++)
|
|
|
{
|
|
|
- break;
|
|
|
+ root->list[i]->room->terrain_index = i;
|
|
|
}
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#OK. TERRAIN {%s} HAS BEEN SET TO {%s} {%s}.", arg1, arg2, buf1);
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- if (run)
|
|
|
+DO_MAP(map_unterrain)
|
|
|
+{
|
|
|
+ if (delete_node_with_wild(ses, LIST_TERRAIN, arg))
|
|
|
{
|
|
|
- path_run(ses, delay);
|
|
|
+ SET_BIT(ses->map->flags, MAP_FLAG_UPDATETERRAIN);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- Virtual coordinate search for linkable rooms when creating a new room.
|
|
|
-*/
|
|
|
+DO_MAP(map_travel)
|
|
|
+{
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
-int find_coord(struct session *ses, char *arg)
|
|
|
+ explore_path(ses, TRUE, arg1, arg2);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+DO_MAP(map_uninsert)
|
|
|
{
|
|
|
- int dir, x, y, z, room;
|
|
|
+ int room1, room2, room3;
|
|
|
+ struct exit_data *exit1, *exit2, *exit3;
|
|
|
+ struct listnode *node;
|
|
|
|
|
|
- dir = get_exit_dir(ses, arg);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
- if (dir == 0)
|
|
|
+ room1 = ses->map->in_room;
|
|
|
+ exit1 = find_exit(ses, room1, arg1);
|
|
|
+
|
|
|
+ node = search_node_list(ses->list[LIST_PATHDIR], arg1);
|
|
|
+
|
|
|
+ if (exit1 == NULL)
|
|
|
{
|
|
|
- return 0;
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP UNINSERT: There is no room in that direction.");
|
|
|
+
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- x = (HAS_BIT(dir, MAP_EXIT_E) ? 1 : HAS_BIT(dir, MAP_EXIT_W) ? -1 : 0);
|
|
|
- y = (HAS_BIT(dir, MAP_EXIT_N) ? 1 : HAS_BIT(dir, MAP_EXIT_S) ? -1 : 0);
|
|
|
- z = (HAS_BIT(dir, MAP_EXIT_U) ? 1 : HAS_BIT(dir, MAP_EXIT_D) ? -1 : 0);
|
|
|
+ if (node == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP UNINSERT: Given direction must be a pathdir.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- room = spatialgrid_find(ses, ses->map->in_room, x, y, z);
|
|
|
+ room2 = exit1->vnum;
|
|
|
+ exit2 = find_exit(ses, room2, node->arg1);
|
|
|
|
|
|
- if (ses->map->room_list[room])
|
|
|
+ if (exit2 == NULL)
|
|
|
{
|
|
|
- if (HAS_BIT(ses->map->room_list[room]->flags, ROOM_FLAG_STATIC))
|
|
|
- {
|
|
|
- show_message(ses, LIST_COMMAND, "#MAP: Linkable room is marked static. Creating overlapping room instead.");
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP UNINSERT: Unable to find backlink room.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ room3 = exit2->vnum;
|
|
|
+ exit3 = find_exit(ses, room3, node->arg2);
|
|
|
+
|
|
|
+ if (exit3 == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP UNINSERT: Unable to find backlink exit.");
|
|
|
+
|
|
|
+ return;
|
|
|
}
|
|
|
- return room;
|
|
|
+
|
|
|
+ exit1->vnum = room3;
|
|
|
+ exit3->vnum = room1;
|
|
|
+
|
|
|
+ delete_room(ses, room2, TRUE);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP UNINSERT: Uninserted room {%d}.", room2);
|
|
|
}
|
|
|
|
|
|
-// Used by #map jump and the auto linker
|
|
|
+// 1) timestamp 2) type 3) data
|
|
|
|
|
|
-int spatialgrid_find(struct session *ses, int from, int x, int y, int z)
|
|
|
+DO_MAP(map_undo)
|
|
|
{
|
|
|
- int head, tail;
|
|
|
- struct grid_node *node, *temp, list[MAP_BF_SIZE];
|
|
|
- struct exit_data *exit;
|
|
|
+ struct link_data *link;
|
|
|
struct room_data *room;
|
|
|
+ int undo_flag;
|
|
|
+ struct exit_data *exit1, *exit2, *exit3;
|
|
|
|
|
|
- push_call("spatialgrid_find(%s,%d,%d,%d,%d)",ses->name,from,x,y,z);
|
|
|
+ link = ses->map->undo_tail;
|
|
|
|
|
|
- head = 0;
|
|
|
- tail = 1;
|
|
|
+ if (link == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP UNDO: No known last move.");
|
|
|
|
|
|
- node = &list[head];
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- node->vnum = from;
|
|
|
- node->x = 0;
|
|
|
- node->y = 0;
|
|
|
- node->z = 0;
|
|
|
- node->length = 0;
|
|
|
- node->flags = 0;
|
|
|
+ room = ses->map->room_list[atoi(link->str1)];
|
|
|
|
|
|
- ses->map->display_stamp++;
|
|
|
+ if (room == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP UNDO: Room %s does not exist.", link->str2);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- while (head != tail)
|
|
|
+ if (ses->map->room_list[atoi(link->str2)] == NULL)
|
|
|
{
|
|
|
- node = &list[head];
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP UNDO: Invalid last move.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- head = (head + 1) % MAP_BF_SIZE;
|
|
|
+ undo_flag = atoi(link->str3);
|
|
|
|
|
|
- room = ses->map->room_list[node->vnum];
|
|
|
+ if (HAS_BIT(undo_flag, MAP_UNDO_MOVE))
|
|
|
+ {
|
|
|
+ if (ses->map->in_room != room->vnum)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP UNDO: Invalid last move.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP UNDO: Moving to room %s.", link->str2);
|
|
|
|
|
|
- if (ses->map->display_stamp != room->display_stamp)
|
|
|
+ goto_room(ses, atoi(link->str2));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (HAS_BIT(undo_flag, MAP_UNDO_CREATE))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP UNDO: Deleting room %d.", room->vnum);
|
|
|
+ delete_room(ses, room->vnum, TRUE);
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(undo_flag, MAP_UNDO_LINK))
|
|
|
+ {
|
|
|
+ exit1 = find_exit(ses, room->vnum, link->str2);
|
|
|
+
|
|
|
+ if (exit1)
|
|
|
{
|
|
|
- room->display_stamp = ses->map->display_stamp;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP UNDO: Deleting exit leading %s.", exit1->name);
|
|
|
+ delete_exit(ses, room->vnum, exit1);
|
|
|
}
|
|
|
- else if (room->length <= node->length)
|
|
|
+
|
|
|
+ exit2 = find_exit(ses, atoi(link->str2), link->str1);
|
|
|
+
|
|
|
+ if (exit2)
|
|
|
{
|
|
|
- continue;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP UNDO: Deleting exit leading %s.", exit2->name);
|
|
|
+ delete_exit(ses, atoi(link->str2), exit2);
|
|
|
}
|
|
|
+ }
|
|
|
+ else if (HAS_BIT(undo_flag, MAP_UNDO_INSERT))
|
|
|
+ {
|
|
|
+ exit1 = find_exit(ses, atoi(link->str2), link->str1);
|
|
|
|
|
|
- room->length = node->length;
|
|
|
-/*
|
|
|
- if (HAS_BIT(node->flags, GRID_FLAG_HIDE))
|
|
|
+ if (exit1 == NULL)
|
|
|
{
|
|
|
- continue;
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP UNDO: Can't find exit between %s and %s.", link->str2, link->str1);
|
|
|
+ return;
|
|
|
}
|
|
|
-*/
|
|
|
- if (node->x == x && node->y == y && node->z == z)
|
|
|
+
|
|
|
+ exit2 = find_exit(ses, room->vnum, exit1->name);
|
|
|
+
|
|
|
+ if (exit2 == NULL)
|
|
|
{
|
|
|
- pop_call();
|
|
|
- return node->vnum;
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP UNDO: No valid exit found in room %d.", room->vnum);
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- for (exit = room->f_exit ; exit ; exit = exit->next)
|
|
|
+ exit3 = find_exit(ses, exit2->vnum, ntos(room->vnum));
|
|
|
+
|
|
|
+ if (exit3 == NULL)
|
|
|
{
|
|
|
- if (ses->map->display_stamp == ses->map->room_list[exit->vnum]->display_stamp)
|
|
|
- {
|
|
|
- if (room->length >= ses->map->room_list[exit->vnum]->length)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP UNDO: Can't find exit between %d and %d.", room->vnum, exit2->vnum);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if (exit->dir == 0)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
+ exit1->vnum = exit2->vnum;
|
|
|
+ exit3->vnum = atoi(link->str2);
|
|
|
|
|
|
- if (HAS_BIT(exit->flags, EXIT_FLAG_HIDE) || HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_HIDE))
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
+ delete_room(ses, room->vnum, TRUE);
|
|
|
|
|
|
- if (head == (tail + 1) % MAP_BF_SIZE)
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP UNDO: Uninserting room %s.", link->str1);
|
|
|
+ }
|
|
|
+ del_undo(ses, link);
|
|
|
+}
|
|
|
|
|
|
- temp = &list[tail];
|
|
|
+DO_MAP(map_unlink)
|
|
|
+{
|
|
|
+ struct exit_data *exit1;
|
|
|
+ struct exit_data *exit2;
|
|
|
+ struct listnode *node;
|
|
|
|
|
|
- temp->vnum = exit->vnum;
|
|
|
- temp->w = node->w;
|
|
|
- temp->x = node->x + (HAS_BIT(exit->dir, MAP_EXIT_E) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_W) ? -1 : 0);
|
|
|
- temp->y = node->y + (HAS_BIT(exit->dir, MAP_EXIT_N) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_S) ? -1 : 0);
|
|
|
- temp->z = node->z + (HAS_BIT(exit->dir, MAP_EXIT_U) ? 1 : HAS_BIT(exit->dir, MAP_EXIT_D) ? -1 : 0);
|
|
|
- temp->length = node->length + 1;
|
|
|
- temp->flags = 0;
|
|
|
-/*
|
|
|
- if (HAS_BIT(exit->flags, EXIT_FLAG_HIDE) || HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_HIDE))
|
|
|
- {
|
|
|
- SET_BIT(temp->flags, GRID_FLAG_HIDE);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
- temp->length += 1000;
|
|
|
+ node = search_node_list(ses->list[LIST_PATHDIR], arg1);
|
|
|
+
|
|
|
+ exit1 = find_exit(ses, ses->map->in_room, arg1);
|
|
|
+
|
|
|
+ if (exit1 == NULL)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP UNLINK: No exit with that name found");
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*arg2 == 'b' || *arg == 'B')
|
|
|
+ {
|
|
|
+ if (node)
|
|
|
+ {
|
|
|
+ exit2 = find_exit(ses, exit1->vnum, node->arg2);
|
|
|
+
|
|
|
+ if (exit2)
|
|
|
+ {
|
|
|
+ delete_exit(ses, exit1->vnum, exit2);
|
|
|
}
|
|
|
-*/
|
|
|
- tail = (tail + 1) % MAP_BF_SIZE;
|
|
|
}
|
|
|
}
|
|
|
- pop_call();
|
|
|
- return 0;
|
|
|
+
|
|
|
+ delete_exit(ses, ses->map->in_room, exit1);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP UNLINK: Exit deleted.");
|
|
|
}
|
|
|
|
|
|
-void explore_path(struct session *ses, int run, char *arg1, char *arg2)
|
|
|
+DO_MAP(map_update)
|
|
|
{
|
|
|
- struct exit_data *exit;
|
|
|
- int room, vnum;
|
|
|
-
|
|
|
- for (vnum = 0 ; vnum < ses->map->size ; vnum++)
|
|
|
+ if (ses->map == NULL)
|
|
|
{
|
|
|
- if (ses->map->room_list[vnum])
|
|
|
- {
|
|
|
- DEL_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_PATH);
|
|
|
- }
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP UPDATE: NO MAP DATA.");
|
|
|
}
|
|
|
-
|
|
|
- if (HAS_BIT(ses->flags, SES_FLAG_PATHMAPPING))
|
|
|
+ else if (ses->map->room_list[ses->map->in_room] == NULL)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP EXPLORE: You have to use #PATH END first.");
|
|
|
-
|
|
|
- return;
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP UPDATE: NOT INSIDE MAP.");
|
|
|
+ }
|
|
|
+ else if (!HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP))
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP UPDATE: VTMAP FLAG NOT SET.");
|
|
|
+ }
|
|
|
+ else if (ses != gtd->ses)
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP UPDATE: NOT THE ACTIVE SESSION.");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP UPDATE: OK.");
|
|
|
+
|
|
|
+ SET_BIT(ses->flags, SES_FLAG_UPDATEVTMAP);
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- kill_list(ses->list[LIST_PATH]);
|
|
|
+DO_MAP(map_run)
|
|
|
+{
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ALL, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
- ses->list[LIST_PATH]->update = 0;
|
|
|
+ shortest_path(ses, TRUE, arg2, arg1);
|
|
|
+}
|
|
|
|
|
|
- room = ses->map->in_room;
|
|
|
+DO_MAP(map_vnum)
|
|
|
+{
|
|
|
+ int vnum, vnum1, vnum2, old_room, new_room;
|
|
|
+ struct exit_data *exit;
|
|
|
|
|
|
- exit = find_exit(ses, room, arg1);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
- if (exit == NULL)
|
|
|
+ vnum1 = atoi(arg1);
|
|
|
+
|
|
|
+ if (*arg2)
|
|
|
{
|
|
|
- show_error(ses, LIST_COMMAND, "#MAP: There's no exit named '%s'.", arg1);
|
|
|
+ vnum2 = atoi(arg2);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ vnum2 = vnum1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (vnum1 <= 0 || vnum1 >= ses->map->size || vnum2 <= 0 || vnum2 >= ses->map->size)
|
|
|
+ {
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP VNUM {%s} {%s} - VNUMS MUST BE BETWEEN {1} and {%d}", arg1, arg2, ses->map->size - 1);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- vnum = exit->vnum;
|
|
|
-
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW))
|
|
|
+ for (vnum = vnum1 ; vnum <= vnum2 ; vnum++)
|
|
|
{
|
|
|
- check_append_path(ses, exit->cmd, "", 0);
|
|
|
+ if (ses->map->room_list[vnum] == NULL)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (vnum > vnum2)
|
|
|
{
|
|
|
- check_append_path(ses, exit->name, "", 0);
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP VNUM {%s} {%s} - NO FREE VNUM FOUND.", arg1, arg2);
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- SET_BIT(ses->map->room_list[room]->flags, ROOM_FLAG_PATH);
|
|
|
- SET_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_PATH);
|
|
|
+ old_room = ses->map->in_room;
|
|
|
+ new_room = vnum;
|
|
|
|
|
|
- while (get_room_exits(ses, vnum) == 2)
|
|
|
+ ses->map->room_list[new_room] = ses->map->room_list[old_room];
|
|
|
+ ses->map->room_list[new_room]->vnum = new_room;
|
|
|
+ ses->map->room_list[old_room] = NULL;
|
|
|
+ ses->map->in_room = new_room;
|
|
|
+
|
|
|
+ if (ses->map->at_room == old_room)
|
|
|
{
|
|
|
- exit = ses->map->room_list[vnum]->f_exit;
|
|
|
+ ses->map->at_room = new_room;
|
|
|
+ }
|
|
|
|
|
|
- if (HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_PATH))
|
|
|
+ for (vnum = 1 ; vnum < ses->map->size ; vnum++)
|
|
|
+ {
|
|
|
+ if (ses->map->room_list[vnum] == NULL)
|
|
|
{
|
|
|
- exit = ses->map->room_list[vnum]->l_exit;
|
|
|
-
|
|
|
- if (HAS_BIT(ses->map->room_list[exit->vnum]->flags, ROOM_FLAG_PATH))
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
+ continue;
|
|
|
}
|
|
|
|
|
|
- if (!HAS_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_VOID))
|
|
|
+ for (exit = ses->map->room_list[vnum]->f_exit ; exit ; exit = exit->next)
|
|
|
{
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_NOFOLLOW))
|
|
|
- {
|
|
|
- check_append_path(ses, exit->cmd, "", 0);
|
|
|
- }
|
|
|
- else
|
|
|
+ if (exit->vnum == old_room)
|
|
|
{
|
|
|
- check_append_path(ses, exit->name, "", 0);
|
|
|
+ exit->vnum = new_room;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- vnum = exit->vnum;
|
|
|
-
|
|
|
- SET_BIT(ses->map->room_list[vnum]->flags, ROOM_FLAG_PATH);
|
|
|
}
|
|
|
|
|
|
- DEL_BIT(ses->map->room_list[room]->flags, ROOM_FLAG_PATH);
|
|
|
-
|
|
|
- if (run)
|
|
|
- {
|
|
|
- path_run(ses, arg2);
|
|
|
- }
|
|
|
+ tintin_printf(ses, "#MAP VNUM: MOVED ROOM %d TO %d.", old_room, new_room);
|
|
|
}
|
|
|
|
|
|
-void map_mouse_handler(struct session *ses, char *arg1, char *arg2, int x, int y)
|
|
|
+DO_MAP(map_write)
|
|
|
{
|
|
|
- int max_x, max_y;
|
|
|
- int top_row, top_col, bot_row, bot_col, rows, cols;
|
|
|
+ struct listroot *root;
|
|
|
+ FILE *file;
|
|
|
+ struct exit_data *exit;
|
|
|
+ int index;
|
|
|
|
|
|
- push_call("map_mouse_handler(%p,%p,%p,%d,%d)",ses,arg1,arg2,x,y);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg1, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
+ arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
|
|
|
|
|
|
- if (ses->map == NULL || !HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP) || ses->map->room_list[ses->map->in_room] == NULL)
|
|
|
+ if (*arg1 == 0)
|
|
|
{
|
|
|
- pop_call();
|
|
|
+ show_error(ses, LIST_COMMAND, "#SYNTAX: #MAP WRITE {<filename>} {FORCE}");
|
|
|
+
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (ses->map->rows > 1 && ses->map->cols > 1)
|
|
|
- {
|
|
|
- top_row = ses->map->top_row;
|
|
|
- top_col = ses->map->top_col;
|
|
|
- bot_row = ses->map->bot_row;
|
|
|
- bot_col = ses->map->bot_col;
|
|
|
- rows = ses->map->rows;
|
|
|
- cols = ses->map->cols;
|
|
|
- }
|
|
|
- else
|
|
|
+ if (!str_suffix(arg1, ".tin") && !is_abbrev(arg2, "FORCE"))
|
|
|
{
|
|
|
- top_row = 1;
|
|
|
- top_col = 1;
|
|
|
- bot_row = ses->split->top_row - 2;
|
|
|
- bot_col = gtd->screen->cols;
|
|
|
- rows = ses->split->top_row - 2;
|
|
|
- cols = gtd->screen->cols;
|
|
|
- }
|
|
|
-
|
|
|
- y = y - 1;
|
|
|
- x = x - 1;
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP WRITE {%s}: USE {FORCE} TO OVERWRITE .tin FILES.");
|
|
|
|
|
|
- if (y > bot_row || y < top_row)
|
|
|
- {
|
|
|
- pop_call();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (x > bot_col || x < top_col)
|
|
|
+ if ((file = fopen(arg1, "w")) == NULL)
|
|
|
{
|
|
|
- pop_call();
|
|
|
+ show_error(ses, LIST_COMMAND, "#MAP WRITE {%s} - COULDN'T OPEN FILE TO WRITE.", arg1);
|
|
|
+
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- y = y + 1 - top_row;
|
|
|
- x = x + 1 - top_col;
|
|
|
+ fprintf(file, "C %d\n\n", ses->map->size);
|
|
|
|
|
|
- if (HAS_BIT(ses->map->flags, MAP_FLAG_ASCIIGRAPHICS))
|
|
|
- {
|
|
|
- y /= 3;
|
|
|
- x /= 6;
|
|
|
+ fprintf(file, "V 2020\n\n");
|
|
|
|
|
|
- max_y = 2 + rows / 3;
|
|
|
- max_x = 2 + cols / 6;
|
|
|
- }
|
|
|
- else if (HAS_BIT(ses->map->flags, MAP_FLAG_UNICODEGRAPHICS) || HAS_BIT(ses->map->flags, MAP_FLAG_BLOCKGRAPHICS))
|
|
|
+ for (index = 0 ; map_color_table[index].name ; index++)
|
|
|
{
|
|
|
- y /= 2;
|
|
|
- x /= 5;
|
|
|
-
|
|
|
- max_y = 2 + rows / 2;
|
|
|
- max_x = 2 + cols / 5;
|
|
|
+ fprintf(file, "C%s %s\n", map_color_table[index].name, ses->map->color[index]);
|
|
|
}
|
|
|
- else if (HAS_BIT(ses->map->flags, MAP_FLAG_MUDFONT))
|
|
|
- {
|
|
|
- x /= 2;
|
|
|
+ fprintf(file, "\n");
|
|
|
|
|
|
- max_y = 2 + rows;
|
|
|
- max_x = 2 + cols / 2;
|
|
|
- }
|
|
|
- else
|
|
|
+ fprintf(file, "F %d\n\n", ses->map->flags);
|
|
|
+
|
|
|
+ fprintf(file, "G %d\n\n", ses->map->global_vnum);
|
|
|
+
|
|
|
+ fprintf(file, "I %d\n\n", ses->map->in_room ? ses->map->in_room : ses->map->last_room);
|
|
|
+
|
|
|
+ for (index = 0 ; map_legend_table[index].name ; index++)
|
|
|
{
|
|
|
- max_y = 2 + rows;
|
|
|
- max_x = 2 + cols;
|
|
|
+ fprintf(file, "L {%s} {%s} {%s}\n", map_legend_table[index].group, map_legend_table[index].name, ses->map->legend_raw[index]);
|
|
|
}
|
|
|
+ fprintf(file, "\n\n");
|
|
|
|
|
|
- y = max_y - 1 - y;
|
|
|
+ root = ses->list[LIST_LANDMARK];
|
|
|
|
|
|
- if (x < 0 || y < 0)
|
|
|
+ for (index = 0 ; index < root->used ; index++)
|
|
|
{
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
+ fprintf(file, "LM {%s} {%d} {%s} {%s}\n", root->list[index]->arg1, root->list[index]->val32[0], root->list[index]->arg3, root->list[index]->arg4);
|
|
|
}
|
|
|
+ fprintf(file, "\n\n");
|
|
|
|
|
|
- if (max_x != map_grid_x || max_y != map_grid_y)
|
|
|
+ root = ses->list[LIST_TERRAIN];
|
|
|
+
|
|
|
+ for (index = 0 ; index < root->used ; index++)
|
|
|
{
|
|
|
- pop_call();
|
|
|
- return;
|
|
|
+ fprintf(file, "T {%s} {%s} {%s}\n", root->list[index]->arg1, root->list[index]->arg2, root->list[index]->arg3);
|
|
|
}
|
|
|
+ fprintf(file, "\n\n");
|
|
|
|
|
|
- if (ses->map->grid_rooms[x + 1 + max_x * (y - 1)])
|
|
|
+ for (index = 0 ; index < ses->map->size ; index++)
|
|
|
{
|
|
|
- check_all_events(ses, SUB_ARG, 2, 1, "MAP %s %s", arg1, arg2, ntos(ses->map->grid_rooms[x + 1 + max_x * (y - 1)]->vnum));
|
|
|
+ if (ses->map->room_list[index])
|
|
|
+ {
|
|
|
+ DEL_BIT(ses->map->room_list[index]->flags, ROOM_FLAG_PATH);
|
|
|
+
|
|
|
+ fprintf(file, "\nR {%5d} {%d} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%.3f} {%s}\n",
|
|
|
+ ses->map->room_list[index]->vnum,
|
|
|
+ ses->map->room_list[index]->flags,
|
|
|
+ ses->map->room_list[index]->color,
|
|
|
+ ses->map->room_list[index]->name,
|
|
|
+ ses->map->room_list[index]->symbol,
|
|
|
+ ses->map->room_list[index]->desc,
|
|
|
+ ses->map->room_list[index]->area,
|
|
|
+ ses->map->room_list[index]->note,
|
|
|
+ ses->map->room_list[index]->terrain,
|
|
|
+ ses->map->room_list[index]->data,
|
|
|
+ ses->map->room_list[index]->weight,
|
|
|
+ ses->map->room_list[index]->id);
|
|
|
+
|
|
|
+ for (exit = ses->map->room_list[index]->f_exit ; exit ; exit = exit->next)
|
|
|
+ {
|
|
|
+ fprintf(file, "E {%5d} {%s} {%s} {%d} {%d} {%s} {%.3f} {%s}\n",
|
|
|
+ exit->vnum,
|
|
|
+ exit->name,
|
|
|
+ exit->cmd,
|
|
|
+ exit->dir,
|
|
|
+ exit->flags,
|
|
|
+ exit->data,
|
|
|
+ exit->weight,
|
|
|
+ exit->color);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ fclose(file);
|
|
|
+
|
|
|
+ show_message(ses, LIST_COMMAND, "#MAP: Map file written to {%s}.", arg1);
|
|
|
}
|