summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKpy! <ouroboros.ai@gmail.com>2015-09-20 21:22:42 +0200
committerKpy! <ouroboros.ai@gmail.com>2015-09-28 14:11:32 +0200
commita39aa16415157a48ff5f2b3fda6c4372f8592143 (patch)
tree99f685640a30295ed991fae992e80d6efbd8ad54
parent731e30a5c0b32e5ece45954951866602146e5a82 (diff)
downloadhercules-a39aa16415157a48ff5f2b3fda6c4372f8592143.tar.gz
hercules-a39aa16415157a48ff5f2b3fda6c4372f8592143.tar.bz2
hercules-a39aa16415157a48ff5f2b3fda6c4372f8592143.tar.xz
hercules-a39aa16415157a48ff5f2b3fda6c4372f8592143.zip
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.
-rw-r--r--src/map/map.c16
-rw-r--r--src/map/map.h9
2 files changed, 18 insertions, 7 deletions
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;
};