summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/files.cc
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-07-07 10:44:55 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-07-07 10:44:55 +0000
commite73443245850c17be63996e97549416d6cba1759 (patch)
treeca57253e1c3b350117bd63e320d714c7a3204a60 /crawl-ref/source/files.cc
parent1219201e4079858b2963b4c943488e1c0b93d26c (diff)
downloadcrawl-ref-e73443245850c17be63996e97549416d6cba1759.tar.gz
crawl-ref-e73443245850c17be63996e97549416d6cba1759.zip
Tiles: Save per-character equipment setting and use it in the character
selection menu. TODO: Use this instead of dolls.txt for initialising dolls, falling back on dolls.txt if name.tdl cannot be found and for new characters. I've tried displaying floor type but found it resulted in an information overload, and also distracts from the main information (species, equipment), esp. since it's mostly floor and most of the tile is covered anyway. I left it in (though commented out), so it's in the repository, but will remove it afterwards. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@10122 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/files.cc')
-rw-r--r--crawl-ref/source/files.cc100
1 files changed, 98 insertions, 2 deletions
diff --git a/crawl-ref/source/files.cc b/crawl-ref/source/files.cc
index 506530b621..47adcea3bb 100644
--- a/crawl-ref/source/files.cc
+++ b/crawl-ref/source/files.cc
@@ -65,6 +65,7 @@ REVISION("$Rev$");
#include "mon-util.h"
#include "mstuff2.h"
#include "mtransit.h"
+#include "newgame.h"
#include "notes.h"
#include "output.h"
#include "overmap.h"
@@ -191,8 +192,8 @@ player_save_info read_character_info(const std::string &savefile)
fromfile = you;
you.copy_from(backup);
}
-
fclose(charf);
+
return fromfile;
}
@@ -602,6 +603,57 @@ std::string get_savedir_path(const std::string &shortpath)
#endif
}
+#ifdef USE_TILE
+static void _fill_player_doll(player_save_info &p, const std::string &dollfile)
+{
+ dolls_data equip_doll;
+ for (unsigned int j = 0; j < TILEP_PART_MAX; ++j)
+ equip_doll.parts[j] = TILEP_SHOW_EQUIP;
+
+ equip_doll.parts[TILEP_PART_BASE]
+ = tilep_species_to_base_tile(p.species, p.experience_level);
+
+ bool success = false;
+
+ FILE *fdoll = fopen(dollfile.c_str(), "r");
+ if (fdoll)
+ {
+ char fbuf[1024];
+ memset(fbuf, 0, sizeof(fbuf));
+ if (fscanf(fdoll, "%s", fbuf) != EOF)
+ {
+ tilep_scan_parts(fbuf, equip_doll.parts);
+ tilep_race_default(p.species,
+ get_gender_from_tile(equip_doll.parts),
+ p.experience_level,
+ equip_doll.parts);
+ success = true;
+
+ while (fscanf(fdoll, "%s", fbuf) != EOF)
+ {
+ if (strcmp(fbuf, "net") == 0)
+ p.held_in_net = true;
+// else if (strncmp(fbuf, "floor=", 6) == 0)
+// sscanf(fbuf, "floor=%d", &p.floor_tile);
+ }
+ }
+ fclose(fdoll);
+ }
+
+ if (!success) // Use default doll instead.
+ {
+ int job = get_class_by_name(p.class_name.c_str());
+ if (job == -1)
+ job = JOB_FIGHTER;
+
+ int gender = coinflip();
+ tilep_job_default(job, gender, equip_doll.parts);
+ }
+ p.doll = equip_doll;
+}
+#endif
+
+
/*
* Returns a list of the names of characters that are already saved for the
* current user.
@@ -646,9 +698,33 @@ std::vector<player_save_info> find_saved_characters()
#endif
if (is_save_file_name(filename))
{
- player_save_info p=read_character_info(get_savedir_path(filename));
+ const std::string path = get_savedir_path(filename);
+ player_save_info p = read_character_info(path);
if (!p.name.empty())
+ {
+#ifdef USE_TILE
+ if (Options.tile_menu_icons)
+ {
+ const std::string dollname = basename + ".tdl";
+ #ifdef LOAD_UNPACKAGE_CMD
+ snprintf( cmd_buff, sizeof(cmd_buff),
+ UNPACK_SPECIFIC_FILE_CMD,
+ zipname.c_str(),
+ dir.c_str(),
+ dollname.c_str() );
+ system(cmd_buff);
+ #endif
+ const std::string dollpath = get_savedir_path(dollname);
+ _fill_player_doll(p, dollpath);
+ #ifdef LOAD_UNPACKAGE_CMD
+ // Throw away doll file.
+ if (file_exists(dollpath.c_str()))
+ unlink( dollpath.c_str() );
+ #endif
+ }
+#endif
chars.push_back(p);
+ }
}
#ifdef LOAD_UNPACKAGE_CMD
@@ -1517,6 +1593,26 @@ void save_game(bool leave_game, const char *farewellmsg)
DO_CHMOD_PRIVATE(msgFile.c_str());
}
+ /* tile dolls (empty for ASCII)*/
+ std::string dollFile = get_savedir_filename(you.your_name, "", "tdl");
+#ifdef USE_TILE
+ // Save the current equipment into a file.
+ FILE *dollf = fopen(dollFile.c_str(), "w+");
+ if (dollf)
+ {
+ save_doll_file(dollf);
+ fclose(dollf);
+ DO_CHMOD_PRIVATE(dollFile.c_str());
+ }
+#else
+ // Don't overwrite old tile dolls.
+ if (!file_exists(dollFile))
+ {
+ FILE *dollf = fopen(dollFile.c_str(), "wb");
+ fclose(dollf);
+ }
+#endif
+
std::string charFile = get_savedir_filename(you.your_name, "", "sav");
FILE *charf = fopen(charFile.c_str(), "wb");
if (!charf)