summaryrefslogtreecommitdiffstats
path: root/crawl-ref
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2009-02-22 11:25:01 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2009-02-22 11:25:01 +0000
commitf00872b7a53d4b7d0aa8eb8b769f88b9abe5f830 (patch)
treef0c6e0522d23a32ffcb2599fb33cf6b02c2f758b /crawl-ref
parent50dd7b84736b4c1c87908cae1030419f773e638d (diff)
downloadcrawl-ref-f00872b7a53d4b7d0aa8eb8b769f88b9abe5f830.tar.gz
crawl-ref-f00872b7a53d4b7d0aa8eb8b769f88b9abe5f830.zip
[2615112] Fix portal vaults sharing ghosts. Ghosts are now saved into bones.XXX where XXX is set from the 'dstext' property of the portal, or to the first three letters of the 'dst' property.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@9148 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref')
-rw-r--r--crawl-ref/docs/level_design.txt13
-rw-r--r--crawl-ref/source/externs.h5
-rw-r--r--crawl-ref/source/files.cc11
-rw-r--r--crawl-ref/source/misc.cc13
-rw-r--r--crawl-ref/source/tags.cc4
-rw-r--r--crawl-ref/source/tags.h3
6 files changed, 41 insertions, 8 deletions
diff --git a/crawl-ref/docs/level_design.txt b/crawl-ref/docs/level_design.txt
index 165716de98..8dd1799c24 100644
--- a/crawl-ref/docs/level_design.txt
+++ b/crawl-ref/docs/level_design.txt
@@ -1330,15 +1330,15 @@ portal vaults in the following steps (no compilation is necessary):
Before going into the details of portal vault creation, some words about
their uses: Portal vaults are different from branches in that they are
-not guaranteed. Also, there is only one go at a portal vault - if you
+not guaranteed. Also, there is only one go at a portal vault - if you
leave, it's gone for good. You can apply special rules to a portal vault,
like enforcing maprot.
-Portal vaults can be particulary thematic, using specialised monster
+Portal vaults can be particulary thematic, using specialised monster
sets, fitting loot, coloured dungeon features etc. Avoid death traps; it
is no fun to enter a vault, being unable to leave and be killed outright.
In order to provide fun and reduce spoiler effects, randomise. For portal
-vaults, it is desirable to have several different layouts (ideally each
+vaults, it is desirable to have several different layouts (ideally each
of the maps has some randomisation on its own). Often, it is a good idea
to skew the map distribution: e.g. with four destination vaults, weights
like 40,30,20,10 might be more interesting than 25,25,25,25.
@@ -1388,6 +1388,11 @@ that isn't present the "dst" paremeter. It can be set to something else
with the "overmap" parameter. A note can be made to accompany the
portal's position on the overmap with the "overmap_note" parameter.
+Bones files for characters killed in the portal vault will normally
+use an extension derived from the first three letters of the 'dst'
+property. You can override this by setting the 'dstext' property to
+your preferred extension.
+
This will produce a portal, but attempting to use it will trigger an
ASSERT since there's no map for the destination. So we create a
destination map like so:
@@ -1496,7 +1501,7 @@ end
You can then use this line in the map definition to execute the lua block:
: sewer_random_monster_list(_G)
-You can also set env.spawn_random_rate() to have monsters generated from the
+You can also set env.spawn_random_rate() to have monsters generated from the
list during play.
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h
index ab99a99379..850a5ccb37 100644
--- a/crawl-ref/source/externs.h
+++ b/crawl-ref/source/externs.h
@@ -877,6 +877,11 @@ public:
// if not explicitly set by the entry portal.
std::string level_type_name;
+ // Three-letter extension for portal vault bones files. Will be set
+ // to first three letters of level_type_tag if not explicitly set by
+ // the entry portal.
+ std::string level_type_ext;
+
// Abbreviation of portal vault name, for use in notes. If not
// explicitly set by the portal vault, will be set from level_type_name
// or level_type_tag if either is short enough, or the shorter of the
diff --git a/crawl-ref/source/files.cc b/crawl-ref/source/files.cc
index 070076e706..ecaa0c1abf 100644
--- a/crawl-ref/source/files.cc
+++ b/crawl-ref/source/files.cc
@@ -1540,11 +1540,16 @@ void save_game_state()
save_game(true);
}
+static std::string _make_portal_vault_ghost_suffix()
+{
+ return you.level_type_ext.empty()? "ptl" : you.level_type_ext;
+}
+
static std::string _make_ghost_filename()
{
if (you.level_type == LEVEL_PORTAL_VAULT)
{
- std::string suffix = "ptl";
+ const std::string suffix = _make_portal_vault_ghost_suffix();
return get_savedir_filename("bones", "", suffix, true);
}
else
@@ -1602,7 +1607,7 @@ void _load_ghost(void)
fclose(gfile);
#if DEBUG_DIAGNOSTICS
- mpr( "Loaded ghost.", MSGCH_DIAGNOSTICS );
+ mpr( "Loaded ghost.", MSGCH_DIAGNOSTICS );
#endif
// Remove bones file - ghosts are hardly permanent.
@@ -1935,7 +1940,7 @@ void save_ghost( bool force )
lk_close(gfile, "wb", cha_fil);
#if DEBUG_DIAGNOSTICS
- mpr( "Saved ghost.", MSGCH_DIAGNOSTICS );
+ mprf(MSGCH_DIAGNOSTICS, "Saved ghost (%s).", cha_fil.c_str() );
#endif
DO_CHMOD_PRIVATE(cha_fil.c_str());
diff --git a/crawl-ref/source/misc.cc b/crawl-ref/source/misc.cc
index 5b4300013c..b67114cf6d 100644
--- a/crawl-ref/source/misc.cc
+++ b/crawl-ref/source/misc.cc
@@ -1304,6 +1304,10 @@ static void leaving_level_now()
const std::string newtype =
env.markers.property_at(you.pos(), MAT_ANY, "dst");
+ // Extension to use for bones files.
+ const std::string newext =
+ env.markers.property_at(you.pos(), MAT_ANY, "dstext");
+
const std::string oldname = you.level_type_name;
std::string newname =
env.markers.property_at(you.pos(), MAT_ANY, "dstname");
@@ -1357,6 +1361,7 @@ static void leaving_level_now()
{
you.level_type_tag = newtype;
}
+
const std::string spaced_tag = replace_all(you.level_type_tag, "_", " ");
if (!you.level_type_tag.empty() && you.level_type_name.empty())
@@ -1378,6 +1383,14 @@ static void leaving_level_now()
}
}
+ if (!newext.empty())
+ you.level_type_ext = newext;
+ else if (!you.level_type_tag.empty())
+ you.level_type_ext = lowercase_string(you.level_type_tag);
+
+ if (you.level_type_ext.length() > 3)
+ you.level_type_ext = you.level_type_ext.substr(0, 3);
+
if (!neworigin.empty())
you.level_type_origin = neworigin;
else if (!you.level_type_name.empty())
diff --git a/crawl-ref/source/tags.cc b/crawl-ref/source/tags.cc
index 071398da15..b494a0031d 100644
--- a/crawl-ref/source/tags.cc
+++ b/crawl-ref/source/tags.cc
@@ -846,6 +846,7 @@ static void tag_construct_you(writer &th)
marshallString(th, you.level_type_name_abbrev);
marshallString(th, you.level_type_origin);
marshallString(th, you.level_type_tag);
+ marshallString(th, you.level_type_ext);
marshallByte(th, you.entry_cause);
marshallByte(th, you.entry_cause_god);
marshallByte(th, you.synch_time);
@@ -1264,6 +1265,9 @@ static void tag_read_you(reader &th, char minorVersion)
you.level_type_name_abbrev = unmarshallString(th);
you.level_type_origin = unmarshallString(th);
you.level_type_tag = unmarshallString(th);
+
+ if (minorVersion >= TAG_MINOR_PORTEXT)
+ you.level_type_ext = unmarshallString(th);
}
you.entry_cause = static_cast<entry_cause_type>( unmarshallByte(th) );
diff --git a/crawl-ref/source/tags.h b/crawl-ref/source/tags.h
index 73d3103013..b9ca330b2a 100644
--- a/crawl-ref/source/tags.h
+++ b/crawl-ref/source/tags.h
@@ -61,7 +61,8 @@ enum tag_minor_version
TAG_MINOR_LUADGN = 11, // Allow dungeon Lua to persist data.
// Bump version past 12.
TAG_MINOR_SVNREV = 13, // Added SVN revision
- TAG_MINOR_VERSION = 13 // Current version. (Keep equal to max.)
+ TAG_MINOR_PORTEXT = 14, // Keep track of portal vault extensions.
+ TAG_MINOR_VERSION = 14 // Current version. (Keep equal to max.)
};