summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-06-16 17:26:36 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-06-16 17:26:36 +0000
commit678e0a6c132e04803d98aed21c28a284568e9dda (patch)
tree0cd161b384437ee128e9181071f99f51f8a95713
parent141a6b8304cb7a55cad08cd1de379e43ca83b38b (diff)
downloadcrawl-ref-678e0a6c132e04803d98aed21c28a284568e9dda.tar.gz
crawl-ref-678e0a6c132e04803d98aed21c28a284568e9dda.zip
Reintroduce a *very* basic version of the player doll.
Crawl can now read in dolls.txt again but there's no in-game editor or anything. What you can do is take your old dolls.txt file (if you still have it) and modify the numbers until you get something you like. Alternatively, you could create the doll settings using 0.4.5 (though the order of weapons has changed, so they'll still look a bit different). Yeah, I know it's a bit of a hassle but for those who absolutely *need* their avatar to be properly dressed it is an improvement. :) Hint: The 5th column is for legs, i.e. trousers. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@9986 c06c8d41-db1a-0410-9941-cceddc491573
-rw-r--r--crawl-ref/source/acr.cc2
-rw-r--r--crawl-ref/source/player.cc29
-rw-r--r--crawl-ref/source/tilepick.cc54
-rw-r--r--crawl-ref/source/tilereg.cc94
-rw-r--r--crawl-ref/source/tilereg.h1
5 files changed, 144 insertions, 36 deletions
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index f7364fa457..853c16a791 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -3435,6 +3435,8 @@ static bool _initialise(void)
if (Options.tile_menu_icons && Options.show_inventory_weights)
Options.show_inventory_weights = false;
+ init_player_doll();
+
tiles.resize();
#endif
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index c1f4e21a71..0a7f16c50e 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -3088,10 +3088,6 @@ void level_change(bool skip_attribute_increase)
break;
case SP_MOUNTAIN_DWARF:
- // lowered because of HD raise -- bwr
- // if (you.experience_level < 14)
- // hp_adjust++;
-
if (!(you.experience_level % 2))
hp_adjust++;
@@ -3202,10 +3198,6 @@ void level_change(bool skip_attribute_increase)
break;
case SP_NAGA:
- // lower because of HD raise -- bwr
- // if (you.experience_level < 14)
- // hp_adjust++;
-
hp_adjust++;
if (!(you.experience_level % 4))
@@ -3249,6 +3241,9 @@ void level_change(bool skip_attribute_increase)
case SP_BASE_DRACONIAN:
if (you.experience_level == 7)
{
+#ifdef USE_TILE
+ init_player_doll();
+#endif
switch (you.species)
{
case SP_RED_DRACONIAN:
@@ -3267,19 +3262,24 @@ void level_change(bool skip_attribute_increase)
break;
case SP_YELLOW_DRACONIAN:
- mpr("Your scales start taking on a golden yellow colour.", MSGCH_INTRINSIC_GAIN);
+ mpr("Your scales start taking on a golden yellow colour.",
+ MSGCH_INTRINSIC_GAIN);
break;
case SP_BLACK_DRACONIAN:
- mpr("Your scales start turning black.", MSGCH_INTRINSIC_GAIN);
+ mpr("Your scales start turning black.",
+ MSGCH_INTRINSIC_GAIN);
break;
case SP_PURPLE_DRACONIAN:
- mpr("Your scales start taking on a rich purple colour.", MSGCH_INTRINSIC_GAIN);
+ mpr("Your scales start taking on a rich purple colour.",
+ MSGCH_INTRINSIC_GAIN);
break;
case SP_MOTTLED_DRACONIAN:
- mpr("Your scales start taking on a weird mottled pattern.", MSGCH_INTRINSIC_GAIN);
+ mpr("Your scales start taking on a weird mottled pattern.",
+ MSGCH_INTRINSIC_GAIN);
break;
case SP_PALE_DRACONIAN:
- mpr("Your scales start fading to a pale grey colour.", MSGCH_INTRINSIC_GAIN);
+ mpr("Your scales start fading to a pale grey colour.",
+ MSGCH_INTRINSIC_GAIN);
break;
case SP_BASE_DRACONIAN:
mpr("");
@@ -3326,6 +3326,9 @@ void level_change(bool skip_attribute_increase)
case SP_GREY_DRACONIAN:
if (you.experience_level == 7)
{
+#ifdef USE_TILE
+ init_player_doll();
+#endif
mpr("Your scales start turning grey.",
MSGCH_INTRINSIC_GAIN);
more();
diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc
index 1a79526ac8..e736c2f5da 100644
--- a/crawl-ref/source/tilepick.cc
+++ b/crawl-ref/source/tilepick.cc
@@ -2716,9 +2716,7 @@ static inline void _finalize_tile(unsigned int *tile,
void tilep_calc_flags(const int parts[], int flag[])
{
- int i;
-
- for (i = 0; i < TILEP_PART_MAX; i++)
+ for (unsigned i = 0; i < TILEP_PART_MAX; i++)
flag[i] = TILEP_FLAG_NORMAL;
if (parts[TILEP_PART_HELM] - 1 >= TILEP_HELM_HELM_OFS)
@@ -2865,16 +2863,20 @@ void tilep_race_default(int race, int gender, int level, int *parts)
case SP_PURPLE_DRACONIAN:
case SP_MOTTLED_DRACONIAN:
case SP_PALE_DRACONIAN:
+ {
+ const int colour_offset = _draconian_colour(race, level);
+ result = TILEP_BASE_DRACONIAN + colour_offset * 2;
hair = 0;
+ int st = tile_player_part_start[TILEP_PART_DRCHEAD];
+ parts[TILEP_PART_DRCHEAD] = st + colour_offset;
+
if (player_mutation_level(MUT_BIG_WINGS))
{
- int st = tile_player_part_start[TILEP_PART_DRCWING];
- parts[TILEP_PART_DRCWING] = st + _draconian_colour(race, level);
+ st = tile_player_part_start[TILEP_PART_DRCWING];
+ parts[TILEP_PART_DRCWING] = st + colour_offset;
}
-
- result = TILEP_BASE_DRACONIAN + _draconian_colour(race, level) * 2;
break;
-
+ }
case SP_CENTAUR:
result = TILEP_BASE_CENTAUR;
break;
@@ -2930,6 +2932,7 @@ void tilep_race_default(int race, int gender, int level, int *parts)
if (gender == TILEP_GENDER_MALE)
result++;
+
parts[TILEP_PART_BASE] = result;
parts[TILEP_PART_HAIR] = hair;
parts[TILEP_PART_BEARD] = beard;
@@ -3251,7 +3254,6 @@ void tilep_scan_parts(char *fbuf, int *parts)
int ccount = 0;
for (int i = 0; parts_saved[i] != -1; i++)
{
- int idx;
ccount = 0;
int p = parts_saved[i];
@@ -3264,7 +3266,24 @@ void tilep_scan_parts(char *fbuf, int *parts)
ibuf[ccount] = '\0';
gcount++;
- idx = tilep_str_to_part(ibuf);
+ int idx = tilep_str_to_part(ibuf);
+ if (p == TILEP_PART_BASE)
+ parts[p] += idx % 2;
+ else if (idx == 0)
+ parts[p] = 0;
+ else if (idx == TILEP_SHOW_EQUIP)
+ continue;
+ else if (idx > tile_player_part_count[p])
+ parts[p] = tile_player_part_start[p];
+ else
+ {
+ int idx2 = tile_player_part_start[p] + idx - 1;
+ if (idx2 < TILE_MAIN_MAX || idx2 >= TILEP_PLAYER_MAX)
+ parts[p] = TILEP_SHOW_EQUIP;
+ else
+ parts[p] = idx2;
+ }
+/*
if (p == TILEP_PART_BASE)
{
int p0 = (parts[p]-1) & (0xfe);
@@ -3274,13 +3293,24 @@ void tilep_scan_parts(char *fbuf, int *parts)
}
else if (idx == TILEP_SHOW_EQUIP)
parts[p] = TILEP_SHOW_EQUIP;
+ else
+ parts[p] = 0;
+*/
+/*
+ else if (idx < TILE_MAIN_MAX)
+ parts[p] = TILE_MAIN_MAX;
+ else if (idx >= TILEP_PLAYER_MAX)
+ parts[p] = TILEP_PLAYER_MAX - 1;
else if (idx < 0)
parts[p] = 0;
// TODO enne - is this right? did the old count end at idx not just subtotal?
- else if (idx > tile_player_part_count[p])
- parts[p] = tile_player_part_count[p];
+ else if (idx >= tile_player_part_count[p])
+ parts[p] = tile_player_part_count[p] - 1;
+// else if (idx > tilep_parts_total[p]) // bound it
+// parts[p] = tilep_parts_total[p];
else
parts[p] = idx;
+*/
}
}
diff --git a/crawl-ref/source/tilereg.cc b/crawl-ref/source/tilereg.cc
index b7ee5377c7..32231aafec 100644
--- a/crawl-ref/source/tilereg.cc
+++ b/crawl-ref/source/tilereg.cc
@@ -14,6 +14,7 @@ REVISION("$Rev$");
#include "cio.h"
#include "debug.h"
#include "describe.h"
+#include "files.h"
#include "food.h"
#include "itemname.h"
#include "it_use2.h"
@@ -289,25 +290,98 @@ void DungeonRegion::pack_background(unsigned int bg, int x, int y)
m_buf_dngn.add(TILE_RAY_OUT_OF_RANGE, x, y);
}
-void DungeonRegion::pack_player(int x, int y)
+// static void _load_doll_data(const char *fn, dolls_data *dolls, int max,
+// int *mode, int *cur)
+static void _load_doll_data(const char *fn, dolls_data *doll)
+{
+ char fbuf[1024];
+ FILE *fp = NULL;
+
+ std::string dollsTxtString = datafile_path(fn, false, true);
+ const char *dollsTxt = (dollsTxtString.c_str()[0] == 0) ?
+ "dolls.txt" : dollsTxtString.c_str();
+
+ if ( (fp = fopen(dollsTxt, "r")) == NULL )
+ {
+ mpr("File not found.");
+ // File doesn't exist. By default, use equipment defaults.
+ // This will be saved out (if possible).
+
+ // Don't take gender too seriously. -- Enne
+ tilep_race_default(you.species, coinflip() ? 1 : 0,
+ you.experience_level, doll->parts);
+
+ doll->parts[TILEP_PART_SHADOW] = TILEP_SHADOW_SHADOW;
+
+#if 0
+ // For some reason I can't reset this although it's used identically
+ // elsewhere. (jpeg)
+ for (unsigned int j = 0; j < TILEP_PART_MAX; ++j)
+ doll->parts[j] = TILEP_SHOW_EQUIP;
+#endif
+ }
+ else
+ {
+ memset(fbuf, 0, sizeof(fbuf));
+ int cur = 0;
+ if (fscanf(fp, "%s", fbuf) != EOF)
+ {
+#if 0
+ mpr("Read MODE.");
+ if (strcmp(fbuf, "MODE=LOADING") == 0)
+ mode0 = TILEP_M_LOADING;
+#endif
+ }
+ if (fscanf(fp, "%s", fbuf) != EOF)
+ {
+ if (strncmp(fbuf, "NUM=", 4) == 0)
+ {
+ sscanf(fbuf, "NUM=%d", &cur);
+ if (cur < 0 || cur > 10)
+ cur = 0;
+ }
+ }
+
+ int count = 0;
+ while (fscanf(fp, "%s", fbuf) != EOF)
+ {
+ if (cur == count++)
+ {
+ tilep_scan_parts(fbuf, doll->parts);
+ break;
+ }
+ }
+ if (cur >= count)
+ {
+ mprf(MSGCH_WARN, "Doll %d could not be found in '%s'.",
+ cur, dollsTxt);
+ }
+
+ fclose(fp);
+ }
+}
+
+static dolls_data player_doll;
+
+void init_player_doll()
{
dolls_data default_doll;
- dolls_data player_doll;
- dolls_data result;
- for (int i = 0; i < TILEP_PART_MAX; i++)
+ for (unsigned int i = 0; i < TILEP_PART_MAX; ++i)
default_doll.parts[i] = TILEP_SHOW_EQUIP;
- int gender = you.your_name[0] % 2;
+ int gender = coinflip();
tilep_race_default(you.species, gender, you.experience_level,
default_doll.parts);
- result = default_doll;
+ _load_doll_data("dolls.txt", &default_doll);
+ player_doll = default_doll;
+}
- result.parts[TILEP_PART_BASE] = default_doll.parts[TILEP_PART_BASE];
- result.parts[TILEP_PART_DRCHEAD] = default_doll.parts[TILEP_PART_DRCHEAD];
- result.parts[TILEP_PART_DRCWING] = default_doll.parts[TILEP_PART_DRCWING];
+void DungeonRegion::pack_player(int x, int y)
+{
+ dolls_data result = player_doll;
const bool halo = inside_halo(you.pos());
result.parts[TILEP_PART_HALO] = halo ? TILEP_HALO_TSO : 0;
@@ -740,7 +814,6 @@ void DungeonRegion::render()
// Draw text tags.
// TODO enne - be more intelligent about not covering stuff up
for (int y = 0; y < ENV_SHOW_DIAMETER; y++)
- {
for (int x = 0; x < ENV_SHOW_DIAMETER; x++)
{
coord_def ep(x, y);
@@ -760,7 +833,6 @@ void DungeonRegion::render()
m_tag_font->render_string(pc.x, pc.y, def.text,
min_pos, max_pos, WHITE, false);
}
- }
}
void DungeonRegion::clear()
diff --git a/crawl-ref/source/tilereg.h b/crawl-ref/source/tilereg.h
index 17bd2d56b3..da8d36f8b0 100644
--- a/crawl-ref/source/tilereg.h
+++ b/crawl-ref/source/tilereg.h
@@ -440,5 +440,6 @@ protected:
VertBuffer<PTVert> m_buf;
};
+void init_player_doll();
#endif
#endif