1 | /* |
1 | /* |
2 | * static char *rcsid_map_c = |
2 | * static char *rcsid_map_c = |
3 | * "$Id: map.c,v 1.6 2006/03/06 22:59:26 root Exp $"; |
3 | * "$Id: map.c,v 1.10 2006/04/01 15:39:58 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 | |
… | |
… | |
38 | #include "path.h" |
38 | #include "path.h" |
39 | |
39 | |
40 | |
40 | |
41 | extern int nrofallocobjects,nroffreeobjects; |
41 | extern int nrofallocobjects,nroffreeobjects; |
42 | |
42 | |
|
|
43 | void (*load_original_map_callback)(mapstruct *map); |
|
|
44 | void (*load_temporary_map_callback)(mapstruct *map); |
|
|
45 | void (*clean_temporary_map_callback)(mapstruct *map); |
43 | |
46 | |
44 | /* |
47 | /* |
45 | * Returns the mapstruct which has a name matching the given argument. |
48 | * Returns the mapstruct which has a name matching the given argument. |
46 | * return NULL if no match is found. |
49 | * return NULL if no match is found. |
47 | */ |
50 | */ |
… | |
… | |
587 | * and we only save the head of multi part objects - this is needed |
590 | * and we only save the head of multi part objects - this is needed |
588 | * in order to do map tiling properly. |
591 | * in order to do map tiling properly. |
589 | */ |
592 | */ |
590 | void save_objects (mapstruct *m, FILE *fp, FILE *fp2, int flag) { |
593 | void save_objects (mapstruct *m, FILE *fp, FILE *fp2, int flag) { |
591 | int i, j = 0,unique=0; |
594 | int i, j = 0,unique=0; |
592 | object *op, *otmp; |
595 | object *op; |
593 | /* first pass - save one-part objects */ |
596 | /* first pass - save one-part objects */ |
594 | for(i = 0; i < MAP_WIDTH(m); i++) |
597 | for(i = 0; i < MAP_WIDTH(m); i++) |
595 | for (j = 0; j < MAP_HEIGHT(m); j++) { |
598 | for (j = 0; j < MAP_HEIGHT(m); j++) { |
596 | unique=0; |
599 | unique=0; |
597 | for(op = get_map_ob (m, i, j); op; op = otmp) { |
600 | for(op = get_map_ob (m, i, j); op; op = op->above) { |
598 | otmp = op->above; |
|
|
599 | |
|
|
600 | if (QUERY_FLAG(op,FLAG_IS_FLOOR) && QUERY_FLAG(op, FLAG_UNIQUE)) |
601 | if (QUERY_FLAG(op,FLAG_IS_FLOOR) && QUERY_FLAG(op, FLAG_UNIQUE)) |
601 | unique=1; |
602 | unique=1; |
602 | |
603 | |
603 | if(op->type == PLAYER) { |
604 | if(op->type == PLAYER) { |
604 | LOG(llevDebug, "Player on map that is being saved\n"); |
605 | LOG(llevDebug, "Player on map that is being saved\n"); |
… | |
… | |
676 | |
677 | |
677 | if(m->spaces==NULL) |
678 | if(m->spaces==NULL) |
678 | fatal(OUT_OF_MEMORY); |
679 | fatal(OUT_OF_MEMORY); |
679 | } |
680 | } |
680 | |
681 | |
681 | /* Creatures and returns a map of the specific size. Used |
682 | /* Create and returns a map of the specific size. Used |
682 | * in random map code and the editor. |
683 | * in random map code and the editor. |
683 | */ |
684 | */ |
684 | mapstruct *get_empty_map(int sizex, int sizey) { |
685 | mapstruct *get_empty_map(int sizex, int sizey) { |
685 | mapstruct *m = get_linked_map(); |
686 | mapstruct *m = get_linked_map(); |
686 | m->width = sizex; |
687 | m->width = sizex; |
… | |
… | |
1010 | * cases, no matter if this flag is set or not. |
1011 | * 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 |
1012 | * MAP_STYLE: style map - don't add active objects, don't add to server |
1012 | * managed map list. |
1013 | * managed map list. |
1013 | */ |
1014 | */ |
1014 | |
1015 | |
1015 | void (*load_original_map_callback)(mapstruct *map); |
|
|
1016 | void (*load_temporary_map_callback)(mapstruct *map); |
|
|
1017 | |
|
|
1018 | mapstruct *load_original_map(const char *filename, int flags) { |
1016 | mapstruct *load_original_map(const char *filename, int flags) { |
1019 | FILE *fp; |
1017 | FILE *fp; |
1020 | mapstruct *m; |
1018 | mapstruct *m; |
1021 | int comp; |
1019 | int comp; |
1022 | char pathname[MAX_BUF]; |
1020 | char pathname[MAX_BUF]; |
… | |
… | |
1150 | *****************************************************************************/ |
1148 | *****************************************************************************/ |
1151 | |
1149 | |
1152 | /* This goes through map 'm' and removed any unique items on the map. */ |
1150 | /* This goes through map 'm' and removed any unique items on the map. */ |
1153 | static void delete_unique_items(mapstruct *m) |
1151 | static void delete_unique_items(mapstruct *m) |
1154 | { |
1152 | { |
1155 | int i,j,unique=0; |
1153 | int i,j,unique; |
1156 | object *op, *next; |
1154 | object *op, *next; |
1157 | |
1155 | |
1158 | for(i=0; i<MAP_WIDTH(m); i++) |
1156 | for(i=0; i<MAP_WIDTH(m); i++) |
1159 | for(j=0; j<MAP_HEIGHT(m); j++) { |
1157 | for(j=0; j<MAP_HEIGHT(m); j++) { |
1160 | unique=0; |
1158 | unique=0; |
… | |
… | |
1664 | } |
1662 | } |
1665 | |
1663 | |
1666 | void clean_tmp_map(mapstruct *m) { |
1664 | void clean_tmp_map(mapstruct *m) { |
1667 | if(m->tmpname == NULL) |
1665 | if(m->tmpname == NULL) |
1668 | return; |
1666 | return; |
|
|
1667 | if (clean_temporary_map_callback) |
|
|
1668 | clean_temporary_map_callback (m); |
1669 | (void) unlink(m->tmpname); |
1669 | (void) unlink(m->tmpname); |
1670 | } |
1670 | } |
1671 | |
1671 | |
1672 | void free_all_maps(void) |
1672 | void free_all_maps(void) |
1673 | { |
1673 | { |
… | |
… | |
1701 | return 0; |
1701 | return 0; |
1702 | } |
1702 | } |
1703 | |
1703 | |
1704 | /* inform all players on the map */ |
1704 | /* inform all players on the map */ |
1705 | if (change>0) |
1705 | if (change>0) |
1706 | new_info_map(NDI_BLACK, m,"It becomes darker."); |
1706 | new_info_map(NDI_BLACK|NDI_UNIQUE, m,"It becomes darker."); |
1707 | else |
1707 | else |
1708 | new_info_map(NDI_BLACK, m,"It becomes brighter."); |
1708 | new_info_map(NDI_BLACK|NDI_UNIQUE, m,"It becomes brighter."); |
1709 | |
1709 | |
1710 | /* Do extra checking. since m->darkness is a unsigned value, |
1710 | /* Do extra checking. since m->darkness is a unsigned value, |
1711 | * we need to be extra careful about negative values. |
1711 | * we need to be extra careful about negative values. |
1712 | * In general, the checks below are only needed if change |
1712 | * In general, the checks below are only needed if change |
1713 | * is not +/-1 |
1713 | * is not +/-1 |