From a39aa16415157a48ff5f2b3fda6c4372f8592143 Mon Sep 17 00:00:00 2001 From: Kpy! Date: Sun, 20 Sep 2015 21:22:42 +0200 Subject: Fixed merge behaviour of map zones. Fixes #572 - Both "Normal" and "PK Mode" default zones will now be overwritten (instead of merged) by "GvG", "PvP" and "Battlegrounds" zones. - Refactored some code to clarify intent. --- src/map/map.c | 16 ++++++++++------ src/map/map.h | 9 ++++++++- 2 files changed, 18 insertions(+), 7 deletions(-) (limited to 'src/map') diff --git a/src/map/map.c b/src/map/map.c index fe0922063..e01a25366 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -3854,6 +3854,7 @@ struct map_zone_data *map_merge_zone(struct map_zone_data *main, struct map_zone CREATE(zone, struct map_zone_data, 1); safestrncpy(zone->name, newzone, MAP_ZONE_NAME_LENGTH); + zone->merge_type = MZMT_NEVERMERGE; zone->disabled_skills_count = main->disabled_skills_count + other->disabled_skills_count; zone->disabled_items_count = main->disabled_items_count + other->disabled_items_count; zone->mapflags_count = main->mapflags_count + other->mapflags_count; @@ -3930,7 +3931,7 @@ struct map_zone_data *map_merge_zone(struct map_zone_data *main, struct map_zone memcpy(zone->capped_skills[cursor], other->capped_skills[i], sizeof(struct map_zone_skill_damage_cap_entry)); } - zone->info.special = 2; + zone->info.merged = 1; strdb_put(map->zone_db, newzone, zone); return zone; } @@ -3941,13 +3942,13 @@ void map_zone_change2(int m, struct map_zone_data *zone) { if( map->list[m].zone == zone ) return; - if( map->list[m].zone->info.special != 2 ) /* we don't update it for merged zones! */ + if( !map->list[m].zone->info.merged ) /* we don't update it for merged zones! */ map->list[m].prev_zone = map->list[m].zone; if( map->list[m].zone_mf_count ) map->zone_remove(m); - if( zone->info.special ) { + if( zone->merge_type == MZMT_MERGEABLE && map->list[m].prev_zone->merge_type != MZMT_NEVERMERGE ) { zone = map->merge_zone(zone,map->list[m].prev_zone); } @@ -4899,12 +4900,15 @@ void read_map_zone_db(void) { /* is this the global template? */ if( strncmpi(zonename,MAP_ZONE_NORMAL_NAME,MAP_ZONE_NAME_LENGTH) == 0 ) { zone = &map->zone_all; + zone->merge_type = MZMT_NEVERMERGE; is_all = true; } else if( strncmpi(zonename,MAP_ZONE_PK_NAME,MAP_ZONE_NAME_LENGTH) == 0 ) { zone = &map->zone_pk; + zone->merge_type = MZMT_NEVERMERGE; is_all = true; } else { CREATE( zone, struct map_zone_data, 1 ); + zone->merge_type = MZMT_NORMAL; zone->disabled_skills_count = 0; zone->disabled_items_count = 0; } @@ -5257,11 +5261,11 @@ void read_map_zone_db(void) { /* post-load processing */ if( (zone = strdb_get(map->zone_db, MAP_ZONE_PVP_NAME)) ) - zone->info.special = 1; + zone->merge_type = MZMT_MERGEABLE; if( (zone = strdb_get(map->zone_db, MAP_ZONE_GVG_NAME)) ) - zone->info.special = 1; + zone->merge_type = MZMT_MERGEABLE; if( (zone = strdb_get(map->zone_db, MAP_ZONE_BG_NAME)) ) - zone->info.special = 1; + zone->merge_type = MZMT_MERGEABLE; } /* not supposed to go in here but in skill_final whatever */ libconfig->destroy(&map_zone_db); diff --git a/src/map/map.h b/src/map/map.h index 39af13de8..3ac39e54f 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -549,6 +549,12 @@ struct map_zone_skill_damage_cap_entry { enum map_zone_skill_subtype subtype; }; +enum map_zone_merge_type { + MZMT_NORMAL = 0, ///< MZMT_MERGEABLE zones can merge *into* MZMT_NORMAL zones (but not the converse). + MZMT_MERGEABLE, ///< Can merge with other MZMT_MERGEABLE zones and *into* MZMT_NORMAL zones. + MZMT_NEVERMERGE, ///< Cannot merge with any zones. +}; + #define MAP_ZONE_NAME_LENGTH 60 #define MAP_ZONE_ALL_NAME "All" #define MAP_ZONE_NORMAL_NAME "Normal" @@ -560,6 +566,7 @@ struct map_zone_skill_damage_cap_entry { struct map_zone_data { char name[MAP_ZONE_NAME_LENGTH];/* 20'd */ + enum map_zone_merge_type merge_type; struct map_zone_disabled_skill_entry **disabled_skills; int disabled_skills_count; int *disabled_items; @@ -573,7 +580,7 @@ struct map_zone_data { struct map_zone_skill_damage_cap_entry **capped_skills; int capped_skills_count; struct { - unsigned int special : 2;/* 1: whether this is a mergeable zone; 2: whether it is a merged zone */ + unsigned int merged : 1; } info; }; -- cgit v1.2.3-60-g2f50