ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/map.c
(Generate patch)

Comparing deliantra/server/common/map.c (file contents):
Revision 1.4 by elmex, Wed Feb 22 18:53:48 2006 UTC vs.
Revision 1.6 by root, Mon Mar 6 22:59:26 2006 UTC

1/* 1/*
2 * static char *rcsid_map_c = 2 * static char *rcsid_map_c =
3 * "$Id: map.c,v 1.4 2006/02/22 18:53:48 elmex Exp $"; 3 * "$Id: map.c,v 1.6 2006/03/06 22:59:26 root Exp $";
4 */ 4 */
5 5
6/* 6/*
7 CrossFire, A Multiplayer game for X-windows 7 CrossFire, A Multiplayer game for X-windows
8 8
1010 * cases, no matter if this flag is set or not. 1010 * cases, no matter if this flag is set or not.
1011 * MAP_STYLE: style map - don't add active objects, don't add to server 1011 * MAP_STYLE: style map - don't add active objects, don't add to server
1012 * managed map list. 1012 * managed map list.
1013 */ 1013 */
1014 1014
1015void (*load_original_map_callback)(mapstruct *map);
1016void (*load_temporary_map_callback)(mapstruct *map);
1017
1015mapstruct *load_original_map(const char *filename, int flags) { 1018mapstruct *load_original_map(const char *filename, int flags) {
1016 FILE *fp; 1019 FILE *fp;
1017 mapstruct *m; 1020 mapstruct *m;
1018 int comp; 1021 int comp;
1019 char pathname[MAX_BUF]; 1022 char pathname[MAX_BUF];
1049 close_and_delete(fp, comp); 1052 close_and_delete(fp, comp);
1050 m->in_memory=MAP_IN_MEMORY; 1053 m->in_memory=MAP_IN_MEMORY;
1051 if (!MAP_DIFFICULTY(m)) 1054 if (!MAP_DIFFICULTY(m))
1052 MAP_DIFFICULTY(m)=calculate_difficulty(m); 1055 MAP_DIFFICULTY(m)=calculate_difficulty(m);
1053 set_map_reset_time(m); 1056 set_map_reset_time(m);
1057 if (load_original_map_callback)
1058 load_original_map_callback(m);
1054 return (m); 1059 return (m);
1055} 1060}
1056 1061
1057/* 1062/*
1058 * Loads a map, which has been loaded earlier, from file. 1063 * Loads a map, which has been loaded earlier, from file.
1098 1103
1099 m->in_memory=MAP_LOADING; 1104 m->in_memory=MAP_LOADING;
1100 load_objects (m, fp, 0); 1105 load_objects (m, fp, 0);
1101 close_and_delete(fp, comp); 1106 close_and_delete(fp, comp);
1102 m->in_memory=MAP_IN_MEMORY; 1107 m->in_memory=MAP_IN_MEMORY;
1108 if (load_temporary_map_callback)
1109 load_temporary_map_callback(m);
1103 return m; 1110 return m;
1104} 1111}
1105 1112
1106/* 1113/*
1107 * Loads a map, which has been loaded earlier, from file. 1114 * Loads a map, which has been loaded earlier, from file.
2037 */ 2044 */
2038 2045
2039 return m; 2046 return m;
2040} 2047}
2041 2048
2042// return wether map2 is adjacent to map1 and store their distance
2043// in dx/dy if yes.
2044static int adjacent_map (mapstruct *map1, mapstruct *map2, int *dx, int *dy)
2045{
2046 if (!map1 || !map2)
2047 return 0;
2048
2049 else if (map1 == map2)
2050 *dx = *dy = 0;
2051
2052 else if (map1->tile_map[0] == map2) // up
2053 (*dx = 0), (*dy = -MAP_HEIGHT (map2));
2054 else if (map1->tile_map[1] == map2) // right
2055 (*dx = MAP_WIDTH (map2)), (*dy = 0);
2056 else if (map1->tile_map[2] == map2) // down
2057 (*dx = 0), (*dy = MAP_HEIGHT (map2));
2058 else if (map1->tile_map[3] == map2) // left
2059 (*dx = -MAP_WIDTH (map2)), (*dy = 0);
2060
2061 else if (map1->tile_map[0] && map1->tile_map[0]->tile_map[1] == map2) // up right
2062 (*dx = MAP_WIDTH (map2)), (*dy = -MAP_HEIGHT (map1->tile_map[0]));
2063 else if (map1->tile_map[0] && map1->tile_map[0]->tile_map[3] == map2) // up left
2064 (*dx = -MAP_WIDTH (map2)), (*dy = -MAP_HEIGHT (map1->tile_map[0]));
2065 else if (map1->tile_map[1] && map1->tile_map[1]->tile_map[0] == map2) // right up
2066 (*dx = MAP_HEIGHT (map1->tile_map[1])), (*dy = -MAP_WIDTH (map2));
2067 else if (map1->tile_map[1] && map1->tile_map[1]->tile_map[2] == map2) // right down
2068 (*dx = MAP_HEIGHT (map1->tile_map[1])), (*dy = MAP_WIDTH (map2));
2069 else if (map1->tile_map[2] && map1->tile_map[2]->tile_map[1] == map2) // down right
2070 (*dx = MAP_WIDTH (map2)), (*dy = MAP_HEIGHT (map1->tile_map[2]));
2071 else if (map1->tile_map[2] && map1->tile_map[2]->tile_map[3] == map2) // down left
2072 (*dx = -MAP_WIDTH (map2)), (*dy = MAP_HEIGHT (map1->tile_map[2]));
2073 else if (map1->tile_map[3] && map1->tile_map[3]->tile_map[0] == map2) // left up
2074 (*dx = -MAP_HEIGHT (map1->tile_map[3])), (*dy = -MAP_WIDTH (map2));
2075 else if (map1->tile_map[3] && map1->tile_map[3]->tile_map[2] == map2) // left down
2076 (*dx = MAP_HEIGHT (map1->tile_map[3])), (*dy = MAP_WIDTH (map2));
2077
2078 else // not "adjacent" enough
2079 return 0;
2080
2081 return 1;
2082}
2083
2084/** 2049/**
2085 * Return whether map2 is adjacent to map1. If so, store the distance from 2050 * Return whether map2 is adjacent to map1. If so, store the distance from
2086 * map1 to map2 in dx/dy. 2051 * map1 to map2 in dx/dy.
2087 */ 2052 */
2088static int adjacent_map(const mapstruct *map1, const mapstruct *map2, int *dx, int *dy) { 2053static int adjacent_map(const mapstruct *map1, const mapstruct *map2, int *dx, int *dy) {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines