… | |
… | |
196 | |
196 | |
197 | void |
197 | void |
198 | dump_map (const maptile *m) |
198 | dump_map (const maptile *m) |
199 | { |
199 | { |
200 | LOG (llevError, "Map %s status: %d.\n", m->path, m->in_memory); |
200 | LOG (llevError, "Map %s status: %d.\n", m->path, m->in_memory); |
201 | LOG (llevError, "Size: %dx%d Start: %d,%d\n", MAP_WIDTH (m), MAP_HEIGHT (m), MAP_ENTER_X (m), MAP_ENTER_Y (m)); |
201 | LOG (llevError, "Size: %dx%d Start: %d,%d\n", m->width, m->height, MAP_ENTER_X (m), MAP_ENTER_Y (m)); |
202 | |
202 | |
203 | if (m->msg != NULL) |
203 | if (m->msg != NULL) |
204 | LOG (llevError, "Message:\n%s", m->msg); |
204 | LOG (llevError, "Message:\n%s", m->msg); |
205 | |
205 | |
206 | if (m->maplore != NULL) |
206 | if (m->maplore != NULL) |
… | |
… | |
483 | { |
483 | { |
484 | int x, y; |
484 | int x, y; |
485 | object *tmp, *op, *last, *above; |
485 | object *tmp, *op, *last, *above; |
486 | archetype *at; |
486 | archetype *at; |
487 | |
487 | |
488 | for (x = 0; x < MAP_WIDTH (m); x++) |
488 | for (x = 0; x < m->width; x++) |
489 | for (y = 0; y < MAP_HEIGHT (m); y++) |
489 | for (y = 0; y < m->height; y++) |
490 | for (tmp = GET_MAP_OB (m, x, y); tmp != NULL; tmp = above) |
490 | for (tmp = GET_MAP_OB (m, x, y); tmp != NULL; tmp = above) |
491 | { |
491 | { |
492 | above = tmp->above; |
492 | above = tmp->above; |
493 | |
493 | |
494 | /* already multipart - don't do anything more */ |
494 | /* already multipart - don't do anything more */ |
… | |
… | |
606 | { |
606 | { |
607 | int i, j = 0, unique = 0; |
607 | int i, j = 0, unique = 0; |
608 | object *op; |
608 | object *op; |
609 | |
609 | |
610 | /* first pass - save one-part objects */ |
610 | /* first pass - save one-part objects */ |
611 | for (i = 0; i < MAP_WIDTH (m); i++) |
611 | for (i = 0; i < m->width; i++) |
612 | for (j = 0; j < MAP_HEIGHT (m); j++) |
612 | for (j = 0; j < m->height; j++) |
613 | { |
613 | { |
614 | unique = 0; |
614 | unique = 0; |
615 | for (op = GET_MAP_OB (m, i, j); op; op = op->above) |
615 | for (op = m->at (i, j).bottom; op; op = op->above) |
616 | { |
616 | { |
617 | if (QUERY_FLAG (op, FLAG_IS_FLOOR) && QUERY_FLAG (op, FLAG_UNIQUE)) |
617 | if (op->flag [FLAG_IS_FLOOR] && op->flag [FLAG_UNIQUE]) |
618 | unique = 1; |
618 | unique = 1; |
619 | |
619 | |
620 | if (op->type == PLAYER) |
620 | if (op->type == PLAYER) |
621 | continue; |
621 | continue; |
622 | |
622 | |
623 | if (op->head || op->owner) |
623 | if (op->head || op->owner) |
624 | continue; |
624 | continue; |
625 | |
625 | |
626 | if (unique || QUERY_FLAG (op, FLAG_UNIQUE)) |
626 | if (unique || op->flag [FLAG_UNIQUE]) |
627 | save_object (fp2, op, 3); |
627 | save_object (fp2, op, 3); |
628 | else if (flag == 0 || (flag == 2 && (!QUERY_FLAG (op, FLAG_OBJ_ORIGINAL) && !QUERY_FLAG (op, FLAG_UNPAID)))) |
628 | else if (flag == 0 || (flag == 2 && (!op->flag [FLAG_OBJ_ORIGINAL] && !op->flag [FLAG_UNPAID]))) |
629 | save_object (fp, op, 3); |
629 | save_object (fp, op, 3); |
630 | } |
630 | } |
631 | } |
631 | } |
632 | } |
632 | } |
633 | |
633 | |
… | |
… | |
635 | { |
635 | { |
636 | in_memory = MAP_SWAPPED; |
636 | in_memory = MAP_SWAPPED; |
637 | /* The maps used to pick up default x and y values from the |
637 | /* The maps used to pick up default x and y values from the |
638 | * map archetype. Mimic that behaviour. |
638 | * map archetype. Mimic that behaviour. |
639 | */ |
639 | */ |
640 | MAP_WIDTH (this) = 16; |
640 | this->width = 16; |
641 | MAP_HEIGHT (this) = 16; |
641 | this->height = 16; |
642 | MAP_RESET_TIMEOUT (this) = 0; |
642 | MAP_RESET_TIMEOUT (this) = 0; |
643 | MAP_TIMEOUT (this) = 300; |
643 | MAP_TIMEOUT (this) = 300; |
644 | MAP_ENTER_X (this) = 0; |
644 | MAP_ENTER_X (this) = 0; |
645 | MAP_ENTER_Y (this) = 0; |
645 | MAP_ENTER_Y (this) = 0; |
646 | /*set part to -1 indicating conversion to weather map not yet done */ |
646 | /*set part to -1 indicating conversion to weather map not yet done */ |
… | |
… | |
1238 | delete_unique_items (maptile *m) |
1238 | delete_unique_items (maptile *m) |
1239 | { |
1239 | { |
1240 | int i, j, unique; |
1240 | int i, j, unique; |
1241 | object *op, *next; |
1241 | object *op, *next; |
1242 | |
1242 | |
1243 | for (i = 0; i < MAP_WIDTH (m); i++) |
1243 | for (i = 0; i < m->width; i++) |
1244 | for (j = 0; j < MAP_HEIGHT (m); j++) |
1244 | for (j = 0; j < m->height; j++) |
1245 | { |
1245 | { |
1246 | unique = 0; |
1246 | unique = 0; |
1247 | |
1247 | |
1248 | for (op = GET_MAP_OB (m, i, j); op; op = next) |
1248 | for (op = GET_MAP_OB (m, i, j); op; op = next) |
1249 | { |
1249 | { |
… | |
… | |
1453 | free_all_objects (maptile *m) |
1453 | free_all_objects (maptile *m) |
1454 | { |
1454 | { |
1455 | if (!m->spaces) |
1455 | if (!m->spaces) |
1456 | return; |
1456 | return; |
1457 | |
1457 | |
1458 | for (int i = 0; i < MAP_WIDTH (m); i++) |
1458 | for (int i = 0; i < m->width; i++) |
1459 | for (int j = 0; j < MAP_HEIGHT (m); j++) |
1459 | for (int j = 0; j < m->height; j++) |
1460 | { |
1460 | { |
1461 | mapspace &ms = m->at (i, j); |
1461 | mapspace &ms = m->at (i, j); |
1462 | |
1462 | |
1463 | while (object *op = ms.bottom) |
1463 | while (object *op = ms.bottom) |
1464 | { |
1464 | { |
… | |
… | |
1698 | { |
1698 | { |
1699 | LOG (llevDebug, "Using stored map difficulty: %d\n", MAP_DIFFICULTY (m)); |
1699 | LOG (llevDebug, "Using stored map difficulty: %d\n", MAP_DIFFICULTY (m)); |
1700 | return MAP_DIFFICULTY (m); |
1700 | return MAP_DIFFICULTY (m); |
1701 | } |
1701 | } |
1702 | |
1702 | |
1703 | for (x = 0; x < MAP_WIDTH (m); x++) |
1703 | for (x = 0; x < m->width; x++) |
1704 | for (y = 0; y < MAP_HEIGHT (m); y++) |
1704 | for (y = 0; y < m->height; y++) |
1705 | for (op = GET_MAP_OB (m, x, y); op != NULL; op = op->above) |
1705 | for (op = GET_MAP_OB (m, x, y); op != NULL; op = op->above) |
1706 | { |
1706 | { |
1707 | if (QUERY_FLAG (op, FLAG_MONSTER)) |
1707 | if (QUERY_FLAG (op, FLAG_MONSTER)) |
1708 | { |
1708 | { |
1709 | total_exp += op->stats.exp; |
1709 | total_exp += op->stats.exp; |
… | |
… | |
2044 | return 1; |
2044 | return 1; |
2045 | |
2045 | |
2046 | if (!m->tile_map[3] || m->tile_map[3]->in_memory != MAP_IN_MEMORY) |
2046 | if (!m->tile_map[3] || m->tile_map[3]->in_memory != MAP_IN_MEMORY) |
2047 | load_and_link_tiled_map (m, 3); |
2047 | load_and_link_tiled_map (m, 3); |
2048 | |
2048 | |
2049 | return (out_of_map (m->tile_map[3], x + MAP_WIDTH (m->tile_map[3]), y)); |
2049 | return (out_of_map (m->tile_map[3], x + m->tile_map[3]->width, y)); |
2050 | } |
2050 | } |
2051 | |
2051 | |
2052 | if (x >= MAP_WIDTH (m)) |
2052 | if (x >= m->width) |
2053 | { |
2053 | { |
2054 | if (!m->tile_path[1]) |
2054 | if (!m->tile_path[1]) |
2055 | return 1; |
2055 | return 1; |
2056 | |
2056 | |
2057 | if (!m->tile_map[1] || m->tile_map[1]->in_memory != MAP_IN_MEMORY) |
2057 | if (!m->tile_map[1] || m->tile_map[1]->in_memory != MAP_IN_MEMORY) |
2058 | load_and_link_tiled_map (m, 1); |
2058 | load_and_link_tiled_map (m, 1); |
2059 | |
2059 | |
2060 | return (out_of_map (m->tile_map[1], x - MAP_WIDTH (m), y)); |
2060 | return (out_of_map (m->tile_map[1], x - m->width, y)); |
2061 | } |
2061 | } |
2062 | |
2062 | |
2063 | if (y < 0) |
2063 | if (y < 0) |
2064 | { |
2064 | { |
2065 | if (!m->tile_path[0]) |
2065 | if (!m->tile_path[0]) |
2066 | return 1; |
2066 | return 1; |
2067 | |
2067 | |
2068 | if (!m->tile_map[0] || m->tile_map[0]->in_memory != MAP_IN_MEMORY) |
2068 | if (!m->tile_map[0] || m->tile_map[0]->in_memory != MAP_IN_MEMORY) |
2069 | load_and_link_tiled_map (m, 0); |
2069 | load_and_link_tiled_map (m, 0); |
2070 | |
2070 | |
2071 | return (out_of_map (m->tile_map[0], x, y + MAP_HEIGHT (m->tile_map[0]))); |
2071 | return (out_of_map (m->tile_map[0], x, y + m->tile_map[0]->height)); |
2072 | } |
2072 | } |
2073 | |
2073 | |
2074 | if (y >= MAP_HEIGHT (m)) |
2074 | if (y >= m->height) |
2075 | { |
2075 | { |
2076 | if (!m->tile_path[2]) |
2076 | if (!m->tile_path[2]) |
2077 | return 1; |
2077 | return 1; |
2078 | |
2078 | |
2079 | if (!m->tile_map[2] || m->tile_map[2]->in_memory != MAP_IN_MEMORY) |
2079 | if (!m->tile_map[2] || m->tile_map[2]->in_memory != MAP_IN_MEMORY) |
2080 | load_and_link_tiled_map (m, 2); |
2080 | load_and_link_tiled_map (m, 2); |
2081 | |
2081 | |
2082 | return (out_of_map (m->tile_map[2], x, y - MAP_HEIGHT (m))); |
2082 | return (out_of_map (m->tile_map[2], x, y - m->height)); |
2083 | } |
2083 | } |
2084 | |
2084 | |
2085 | /* Simple case - coordinates are within this local |
2085 | /* Simple case - coordinates are within this local |
2086 | * map. |
2086 | * map. |
2087 | */ |
2087 | */ |
… | |
… | |
2105 | if (!m->tile_path[3]) |
2105 | if (!m->tile_path[3]) |
2106 | return 0; |
2106 | return 0; |
2107 | if (!m->tile_map[3] || m->tile_map[3]->in_memory != MAP_IN_MEMORY) |
2107 | if (!m->tile_map[3] || m->tile_map[3]->in_memory != MAP_IN_MEMORY) |
2108 | load_and_link_tiled_map (m, 3); |
2108 | load_and_link_tiled_map (m, 3); |
2109 | |
2109 | |
2110 | *x += MAP_WIDTH (m->tile_map[3]); |
2110 | *x += m->tile_map[3]->width; |
2111 | return (get_map_from_coord (m->tile_map[3], x, y)); |
2111 | return (get_map_from_coord (m->tile_map[3], x, y)); |
2112 | } |
2112 | } |
2113 | |
2113 | |
2114 | if (*x >= MAP_WIDTH (m)) |
2114 | if (*x >= m->width) |
2115 | { |
2115 | { |
2116 | if (!m->tile_path[1]) |
2116 | if (!m->tile_path[1]) |
2117 | return 0; |
2117 | return 0; |
2118 | |
2118 | |
2119 | if (!m->tile_map[1] || m->tile_map[1]->in_memory != MAP_IN_MEMORY) |
2119 | if (!m->tile_map[1] || m->tile_map[1]->in_memory != MAP_IN_MEMORY) |
2120 | load_and_link_tiled_map (m, 1); |
2120 | load_and_link_tiled_map (m, 1); |
2121 | |
2121 | |
2122 | *x -= MAP_WIDTH (m); |
2122 | *x -= m->width; |
2123 | return (get_map_from_coord (m->tile_map[1], x, y)); |
2123 | return (get_map_from_coord (m->tile_map[1], x, y)); |
2124 | } |
2124 | } |
2125 | |
2125 | |
2126 | if (*y < 0) |
2126 | if (*y < 0) |
2127 | { |
2127 | { |
… | |
… | |
2129 | return 0; |
2129 | return 0; |
2130 | |
2130 | |
2131 | if (!m->tile_map[0] || m->tile_map[0]->in_memory != MAP_IN_MEMORY) |
2131 | if (!m->tile_map[0] || m->tile_map[0]->in_memory != MAP_IN_MEMORY) |
2132 | load_and_link_tiled_map (m, 0); |
2132 | load_and_link_tiled_map (m, 0); |
2133 | |
2133 | |
2134 | *y += MAP_HEIGHT (m->tile_map[0]); |
2134 | *y += m->tile_map[0]->height; |
2135 | return (get_map_from_coord (m->tile_map[0], x, y)); |
2135 | return (get_map_from_coord (m->tile_map[0], x, y)); |
2136 | } |
2136 | } |
2137 | |
2137 | |
2138 | if (*y >= MAP_HEIGHT (m)) |
2138 | if (*y >= m->height) |
2139 | { |
2139 | { |
2140 | if (!m->tile_path[2]) |
2140 | if (!m->tile_path[2]) |
2141 | return 0; |
2141 | return 0; |
2142 | |
2142 | |
2143 | if (!m->tile_map[2] || m->tile_map[2]->in_memory != MAP_IN_MEMORY) |
2143 | if (!m->tile_map[2] || m->tile_map[2]->in_memory != MAP_IN_MEMORY) |
2144 | load_and_link_tiled_map (m, 2); |
2144 | load_and_link_tiled_map (m, 2); |
2145 | |
2145 | |
2146 | *y -= MAP_HEIGHT (m); |
2146 | *y -= m->height; |
2147 | return (get_map_from_coord (m->tile_map[2], x, y)); |
2147 | return (get_map_from_coord (m->tile_map[2], x, y)); |
2148 | } |
2148 | } |
2149 | |
2149 | |
2150 | /* Simple case - coordinates are within this local |
2150 | /* Simple case - coordinates are within this local |
2151 | * map. |
2151 | * map. |
… | |
… | |
2171 | |
2171 | |
2172 | } |
2172 | } |
2173 | else if (map1->tile_map[0] == map2) |
2173 | else if (map1->tile_map[0] == map2) |
2174 | { /* up */ |
2174 | { /* up */ |
2175 | *dx = 0; |
2175 | *dx = 0; |
2176 | *dy = -MAP_HEIGHT (map2); |
2176 | *dy = -map2->height; |
2177 | } |
2177 | } |
2178 | else if (map1->tile_map[1] == map2) |
2178 | else if (map1->tile_map[1] == map2) |
2179 | { /* right */ |
2179 | { /* right */ |
2180 | *dx = MAP_WIDTH (map1); |
2180 | *dx = map1->width; |
2181 | *dy = 0; |
2181 | *dy = 0; |
2182 | } |
2182 | } |
2183 | else if (map1->tile_map[2] == map2) |
2183 | else if (map1->tile_map[2] == map2) |
2184 | { /* down */ |
2184 | { /* down */ |
2185 | *dx = 0; |
2185 | *dx = 0; |
2186 | *dy = MAP_HEIGHT (map1); |
2186 | *dy = map1->height; |
2187 | } |
2187 | } |
2188 | else if (map1->tile_map[3] == map2) |
2188 | else if (map1->tile_map[3] == map2) |
2189 | { /* left */ |
2189 | { /* left */ |
2190 | *dx = -MAP_WIDTH (map2); |
2190 | *dx = -map2->width; |
2191 | *dy = 0; |
2191 | *dy = 0; |
2192 | |
2192 | |
2193 | } |
2193 | } |
2194 | else if (map1->tile_map[0] && map1->tile_map[0]->tile_map[1] == map2) |
2194 | else if (map1->tile_map[0] && map1->tile_map[0]->tile_map[1] == map2) |
2195 | { /* up right */ |
2195 | { /* up right */ |
2196 | *dx = MAP_WIDTH (map1->tile_map[0]); |
2196 | *dx = map1->tile_map[0]->width; |
2197 | *dy = -MAP_HEIGHT (map1->tile_map[0]); |
2197 | *dy = -map1->tile_map[0]->height; |
2198 | } |
2198 | } |
2199 | else if (map1->tile_map[0] && map1->tile_map[0]->tile_map[3] == map2) |
2199 | else if (map1->tile_map[0] && map1->tile_map[0]->tile_map[3] == map2) |
2200 | { /* up left */ |
2200 | { /* up left */ |
2201 | *dx = -MAP_WIDTH (map2); |
2201 | *dx = -map2->width; |
2202 | *dy = -MAP_HEIGHT (map1->tile_map[0]); |
2202 | *dy = -map1->tile_map[0]->height; |
2203 | } |
2203 | } |
2204 | else if (map1->tile_map[1] && map1->tile_map[1]->tile_map[0] == map2) |
2204 | else if (map1->tile_map[1] && map1->tile_map[1]->tile_map[0] == map2) |
2205 | { /* right up */ |
2205 | { /* right up */ |
2206 | *dx = MAP_WIDTH (map1); |
2206 | *dx = map1->width; |
2207 | *dy = -MAP_HEIGHT (map2); |
2207 | *dy = -map2->height; |
2208 | } |
2208 | } |
2209 | else if (map1->tile_map[1] && map1->tile_map[1]->tile_map[2] == map2) |
2209 | else if (map1->tile_map[1] && map1->tile_map[1]->tile_map[2] == map2) |
2210 | { /* right down */ |
2210 | { /* right down */ |
2211 | *dx = MAP_WIDTH (map1); |
2211 | *dx = map1->width; |
2212 | *dy = MAP_HEIGHT (map1->tile_map[1]); |
2212 | *dy = map1->tile_map[1]->height; |
2213 | } |
2213 | } |
2214 | else if (map1->tile_map[2] && map1->tile_map[2]->tile_map[1] == map2) |
2214 | else if (map1->tile_map[2] && map1->tile_map[2]->tile_map[1] == map2) |
2215 | { /* down right */ |
2215 | { /* down right */ |
2216 | *dx = MAP_WIDTH (map1->tile_map[2]); |
2216 | *dx = map1->tile_map[2]->width; |
2217 | *dy = MAP_HEIGHT (map1); |
2217 | *dy = map1->height; |
2218 | } |
2218 | } |
2219 | else if (map1->tile_map[2] && map1->tile_map[2]->tile_map[3] == map2) |
2219 | else if (map1->tile_map[2] && map1->tile_map[2]->tile_map[3] == map2) |
2220 | { /* down left */ |
2220 | { /* down left */ |
2221 | *dx = -MAP_WIDTH (map2); |
2221 | *dx = -map2->width; |
2222 | *dy = MAP_HEIGHT (map1); |
2222 | *dy = map1->height; |
2223 | } |
2223 | } |
2224 | else if (map1->tile_map[3] && map1->tile_map[3]->tile_map[0] == map2) |
2224 | else if (map1->tile_map[3] && map1->tile_map[3]->tile_map[0] == map2) |
2225 | { /* left up */ |
2225 | { /* left up */ |
2226 | *dx = -MAP_WIDTH (map1->tile_map[3]); |
2226 | *dx = -map1->tile_map[3]->width; |
2227 | *dy = -MAP_HEIGHT (map2); |
2227 | *dy = -map2->height; |
2228 | } |
2228 | } |
2229 | else if (map1->tile_map[3] && map1->tile_map[3]->tile_map[2] == map2) |
2229 | else if (map1->tile_map[3] && map1->tile_map[3]->tile_map[2] == map2) |
2230 | { /* left down */ |
2230 | { /* left down */ |
2231 | *dx = -MAP_WIDTH (map1->tile_map[3]); |
2231 | *dx = -map1->tile_map[3]->width; |
2232 | *dy = MAP_HEIGHT (map1->tile_map[3]); |
2232 | *dy = map1->tile_map[3]->height; |
2233 | |
2233 | |
2234 | } |
2234 | } |
2235 | else |
2235 | else |
2236 | { /* not "adjacent" enough */ |
2236 | { /* not "adjacent" enough */ |
2237 | return 0; |
2237 | return 0; |