summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/tags.cc
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-07-19 12:31:32 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-07-19 12:31:32 +0000
commitab679653017c1d661572cf34a62bf5ddf7c1304e (patch)
tree359b57bcf3e60574d64ce9c6ee4ca54a2d788807 /crawl-ref/source/tags.cc
parent73eb0f77865d30c6da027b85c716bce7edd3fa1b (diff)
downloadcrawl-ref-ab679653017c1d661572cf34a62bf5ddf7c1304e.tar.gz
crawl-ref-ab679653017c1d661572cf34a62bf5ddf7c1304e.zip
Added elf arrival vaults (Eino).
Tweaked dungeon builder so you always land on { on level 1 of a branch (using a map marker to identify which stair was a {). Maps with the "uniq" tag will be used only once in a game. Maps with a "uniq_foo" tag will be used only once, and will also prevent any other maps tagged "uniq_foo" from being used thereafter. Breaks saves. Oklob plants should not receive stab brands, fixed. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1897 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/tags.cc')
-rw-r--r--crawl-ref/source/tags.cc52
1 files changed, 39 insertions, 13 deletions
diff --git a/crawl-ref/source/tags.cc b/crawl-ref/source/tags.cc
index 8ae971b5a2..8b38c9f764 100644
--- a/crawl-ref/source/tags.cc
+++ b/crawl-ref/source/tags.cc
@@ -129,9 +129,9 @@ static void unmarshall_monster(tagHeader &th, monsters &m);
static void marshall_item(tagHeader &th, const item_def &item);
static void unmarshall_item(tagHeader &th, item_def &item);
-template<typename T, typename T_iter>
+template<typename T, typename T_iter, typename T_marshal>
static void marshall_iterator(struct tagHeader &th, T_iter beg, T_iter end,
- void (*T_marshall)(struct tagHeader&, const T&));
+ T_marshal marshal);
template<typename T>
static void unmarshall_vector(struct tagHeader& th, std::vector<T>& vec,
T (*T_unmarshall)(struct tagHeader&));
@@ -236,9 +236,9 @@ void marshallMap(struct tagHeader &th, const std::map<key,value>& data,
}
}
-template<typename T, typename T_iter>
+template<typename T_iter, typename T_marshall_t>
static void marshall_iterator(struct tagHeader &th, T_iter beg, T_iter end,
- void (*T_marshall)(struct tagHeader&, const T&))
+ T_marshall_t T_marshall)
{
marshallLong(th, std::distance(beg, end));
while ( beg != end )
@@ -258,6 +258,16 @@ static void unmarshall_vector(struct tagHeader& th, std::vector<T>& vec,
vec.push_back( T_unmarshall(th) );
}
+template <typename T_container, typename T_inserter, typename T_unmarshall>
+static void unmarshall_container(tagHeader &th, T_container &container,
+ T_inserter inserter, T_unmarshall unmarshal)
+{
+ container.clear();
+ const long num_to_read = unmarshallLong(th);
+ for (long i = 0; i < num_to_read; ++i)
+ (container.*inserter)(unmarshal(th));
+}
+
void marshall_level_id( tagHeader& th, const level_id& id )
{
marshallByte(th, id.branch );
@@ -348,22 +358,22 @@ float unmarshallFloat(struct tagHeader &th)
}
// string -- marshall length & string data
-void marshallString(struct tagHeader &th, const char *data, int maxSize)
+void marshallString(struct tagHeader &th, const std::string &data, int maxSize)
{
- // allow for very long strings.
- short len = strlen(data);
+ // allow for very long strings (well, up to 32K).
+ int len = data.length();
if (maxSize > 0 && len > maxSize)
len = maxSize;
marshallShort(th, len);
// put in the actual string -- we'll null terminate on
// unmarshall.
- memcpy(&tagBuffer[th.offset], data, len);
+ memcpy(&tagBuffer[th.offset], data.c_str(), len);
th.offset += len;
}
// string -- unmarshall length & string data
-void unmarshallString(struct tagHeader &th, char *data, int maxSize)
+void unmarshallCString(struct tagHeader &th, char *data, int maxSize)
{
// get length
short len = unmarshallShort(th);
@@ -387,7 +397,7 @@ std::string unmarshallString(tagHeader &th, int maxSize)
if (!buffer)
return ("");
*buffer = 0;
- unmarshallString(th, buffer, maxSize);
+ unmarshallCString(th, buffer, maxSize);
const std::string res = buffer;
delete [] buffer;
@@ -942,6 +952,11 @@ static void tag_construct_you_dungeon(struct tagHeader &th)
marshall_level_pos, marshall_as_long<god_type>);
marshallMap(th, portals_present,
marshall_level_pos, marshall_as_long<portal_type>);
+
+ marshall_iterator(th, you.uniq_map_tags.begin(), you.uniq_map_tags.end(),
+ marshallString);
+ marshall_iterator(th, you.uniq_map_names.begin(), you.uniq_map_names.end(),
+ marshallString);
}
static void marshall_follower(tagHeader &th, const follower &f)
@@ -998,7 +1013,7 @@ static void tag_read_you(struct tagHeader &th, char minorVersion)
char count_c;
short count_s;
- unmarshallString(th, you.your_name, 30);
+ unmarshallCString(th, you.your_name, 30);
you.religion = static_cast<god_type>(unmarshallByte(th));
you.piety = unmarshallByte(th);
@@ -1056,7 +1071,7 @@ static void tag_read_you(struct tagHeader &th, char minorVersion)
const int y = unmarshallShort(th);
you.moveto(x, y);
- unmarshallString(th, you.class_name, 30);
+ unmarshallCString(th, you.class_name, 30);
you.burden = unmarshallShort(th);
@@ -1139,7 +1154,7 @@ static void tag_read_you(struct tagHeader &th, char minorVersion)
you.wizard = (bool) unmarshallByte(th);
// time of character creation
- unmarshallString( th, buff, 20 );
+ unmarshallCString( th, buff, 20 );
you.birth_time = parse_date_string( buff );
you.real_time = unmarshallLong(th);
@@ -1284,6 +1299,17 @@ static void tag_read_you_dungeon(struct tagHeader &th)
unmarshall_level_pos, unmarshall_long_as<god_type>);
unmarshallMap(th, portals_present,
unmarshall_level_pos, unmarshall_long_as<portal_type>);
+
+ typedef std::set<std::string> string_set;
+ typedef std::pair<string_set::iterator, bool> ssipair;
+ unmarshall_container(th, you.uniq_map_tags,
+ (ssipair (string_set::*)(const std::string &))
+ &string_set::insert,
+ unmarshallString);
+ unmarshall_container(th, you.uniq_map_names,
+ (ssipair (string_set::*)(const std::string &))
+ &string_set::insert,
+ unmarshallString);
}
static void tag_read_lost_monsters(tagHeader &th, int minorVersion)