*/
#include "angband.h"
+#include "term.h"
#include "signal-handlers.h"
-#include "util.h"
+#include "view/display-util.h"
+#include "view/status-first-page.h"
+#include "uid-checker.h"
+#include "player/permanent-resistances.h"
+#include "player/temporary-resistances.h"
#include "files.h"
#include "core.h"
#include "birth.h"
-#include "files.h"
-
-#include "bldg.h"
-
-#include "cmd-magiceat.h"
+#include "character-dump.h"
#include "cmd-dump.h"
#include "world.h"
#include "player-inventory.h"
#include "player-personality.h"
#include "player-sex.h"
#include "player-effects.h"
-#include "sort.h"
#include "mutation.h"
#include "quest.h"
-#include "store.h"
-#include "artifact.h"
-#include "avatar.h"
#include "shoot.h"
#include "patron.h"
#include "monster-status.h"
-#include "object-flavor.h"
#include "object-hook.h"
#include "realm-hex.h"
-#include "cmd-pet.h"
-#include "term.h"
#include "view-mainwindow.h"
-#include "floor-town.h"
#include "dungeon-file.h"
-#include "init.h"
-#include "monster-spell.h"
-#include "dungeon.h"
-#include "melee.h"
#include "objectkind.h"
#include "autopick.h"
#include "save.h"
#define DP_IMM 0x02
#define DP_WP 0x08
-#define GRAVE_LINE_WIDTH 31
-
concptr ANGBAND_DIR; //!< Path name: The main "lib" directory This variable is not actually used anywhere in the code
concptr ANGBAND_DIR_APEX; //!< High score files (binary) These files may be portable between platforms
concptr ANGBAND_DIR_BONE; //!< Bone files for player ghosts (ascii) These files are portable between platforms
char savefile[1024];
char savefile_base[40];
- /*!
- * @brief ファイルのドロップパーミッションチェック / Hack -- drop permissions
- */
-void safe_setuid_drop(void)
-{
-
-#ifdef SET_UID
-# ifdef SAFE_SETUID
-# ifdef SAFE_SETUID_POSIX
-
- if (setuid(getuid()) != 0)
- {
- quit(_("setuid(): 正しく許可が取れません!", "setuid(): cannot set permissions correctly!"));
- }
- if (setgid(getgid()) != 0)
- {
- quit(_("setgid(): 正しく許可が取れません!", "setgid(): cannot set permissions correctly!"));
- }
-# else
- if (setreuid(geteuid(), getuid()) != 0)
- {
- quit(_("setreuid(): 正しく許可が取れません!", "setreuid(): cannot set permissions correctly!"));
- }
- if (setregid(getegid(), getgid()) != 0)
- {
- quit(_("setregid(): 正しく許可が取れません!", "setregid(): cannot set permissions correctly!"));
- }
-# endif
-# endif
-#endif
-
-}
-
-
-/*!
- * @brief ファイルのグラブパーミッションチェック / Hack -- grab permissions
- */
-void safe_setuid_grab(void)
-{
-#ifdef SET_UID
-# ifdef SAFE_SETUID
-# ifdef SAFE_SETUID_POSIX
-
- if (setuid(p_ptr->player_egid) != 0)
- {
- quit(_("setuid(): 正しく許可が取れません!", "setuid(): cannot set permissions correctly!"));
- }
- if (setgid(p_ptr->player_egid) != 0)
- {
- quit(_("setgid(): 正しく許可が取れません!", "setgid(): cannot set permissions correctly!"));
- }
-# else
- if (setreuid(geteuid(), getuid()) != 0)
- {
- quit(_("setreuid(): 正しく許可が取れません!", "setreuid(): cannot set permissions correctly!"));
- }
- if (setregid(getegid(), getgid()) != 0)
- {
- quit(_("setregid(): 正しく許可が取れません!", "setregid(): cannot set permissions correctly!"));
- }
-# endif /* SAFE_SETUID_POSIX */
-# endif /* SAFE_SETUID */
-#endif /* SET_UID */
-}
-
-
/*!
* @brief 各種データテキストをトークン単位に分解する / Extract the first few "tokens" from a buffer
* @param buf データテキストの参照ポインタ
char *t;
for (t = s; *t; t++)
{
- /* Found a delimiter */
if ((*t == ':') || (*t == '/')) break;
- /* Handle single quotes */
if ((mode & TOKENIZE_CHECKQUOTE) && (*t == '\''))
{
- /* Advance */
t++;
-
- /* Handle backslash */
if (*t == '\\') t++;
-
- /* Require a character */
if (!*t) break;
- /* Advance */
t++;
-
- /* Hack -- Require a close quote */
if (*t != '\'') *t = '\'';
}
- /* Handle back-slash */
if (*t == '\\') t++;
}
if (!*t) break;
+
*t++ = '\0';
tokens[i++] = s;
s = t;
char *zz[16];
switch (buf[0])
{
- /* Mega-Hack -- read external player's history file */
- /* Process "H:<history>" */
case 'H':
+ {
+ /* Process "H:<history>" */
add_history_from_pref_line(buf + 2);
return 0;
-
- /* Process "R:<num>:<a>/<c>" -- attr/char for monster races */
+ }
case 'R':
{
- if (tokenize(buf + 2, 3, zz, TOKENIZE_CHECKQUOTE) != 3) break;
+ /* Process "R:<num>:<a>/<c>" -- attr/char for monster races */
+ if (tokenize(buf + 2, 3, zz, TOKENIZE_CHECKQUOTE) != 3) return 1;
+
monster_race *r_ptr;
int i = (huge)strtol(zz[0], NULL, 0);
TERM_COLOR n1 = (TERM_COLOR)strtol(zz[1], NULL, 0);
if (n2) r_ptr->x_char = n2;
return 0;
}
-
- /* Process "K:<num>:<a>/<c>" -- attr/char for object kinds */
case 'K':
{
- if (tokenize(buf + 2, 3, zz, TOKENIZE_CHECKQUOTE) != 3) break;
-
+ /* Process "K:<num>:<a>/<c>" -- attr/char for object kinds */
+ if (tokenize(buf + 2, 3, zz, TOKENIZE_CHECKQUOTE) != 3) return 1;
+
object_kind *k_ptr;
int i = (huge)strtol(zz[0], NULL, 0);
TERM_COLOR n1 = (TERM_COLOR)strtol(zz[1], NULL, 0);
if (n2) k_ptr->x_char = n2;
return 0;
}
-
- /* Process "F:<num>:<a>/<c>" -- attr/char for terrain features */
- /* "F:<num>:<a>/<c>" */
- /* "F:<num>:<a>/<c>:LIT" */
- /* "F:<num>:<a>/<c>:<la>/<lc>:<da>/<dc>" */
case 'F':
{
+ /* Process "F:<num>:<a>/<c>" -- attr/char for terrain features */
+ /* "F:<num>:<a>/<c>" */
+ /* "F:<num>:<a>/<c>:LIT" */
+ /* "F:<num>:<a>/<c>:<la>/<lc>:<da>/<dc>" */
feature_type *f_ptr;
int num = tokenize(buf + 2, F_LIT_MAX * 2 + 1, zz, TOKENIZE_CHECKQUOTE);
if (n1 || (!(n2 & 0x80) && n2)) f_ptr->x_attr[F_LIT_STANDARD] = n1; /* Allow TERM_DARK text */
if (n2) f_ptr->x_char[F_LIT_STANDARD] = n2;
- /* Mega-hack -- feat supports lighting */
switch (num)
{
- /* No lighting support */
case 3:
+ {
+ /* No lighting support */
n1 = f_ptr->x_attr[F_LIT_STANDARD];
n2 = f_ptr->x_char[F_LIT_STANDARD];
for (int j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++)
f_ptr->x_char[j] = n2;
}
- break;
-
- /* Use default lighting */
+ return 0;
+ }
case 4:
+ {
+ /* Use default lighting */
apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
- break;
-
- /* Use desired lighting */
+ return 0;
+ }
case F_LIT_MAX * 2 + 1:
+ {
+ /* Use desired lighting */
for (int j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++)
{
n1 = (TERM_COLOR)strtol(zz[j * 2 + 1], NULL, 0);
if (n2) f_ptr->x_char[j] = n2;
}
- break;
+ return 0;
+ }
+ default:
+ return 0;
}
}
-
- return 0;
-
- /* Process "S:<num>:<a>/<c>" -- attr/char for special things */
case 'S':
{
- if (tokenize(buf + 2, 3, zz, TOKENIZE_CHECKQUOTE) != 3) break;
+ /* Process "S:<num>:<a>/<c>" -- attr/char for special things */
+ if (tokenize(buf + 2, 3, zz, TOKENIZE_CHECKQUOTE) != 3) return 1;
int j = (byte)strtol(zz[0], NULL, 0);
TERM_COLOR n1 = (TERM_COLOR)strtol(zz[1], NULL, 0);
misc_to_char[j] = n2;
return 0;
}
-
- /* Process "U:<tv>:<a>/<c>" -- attr/char for unaware items */
case 'U':
{
- if (tokenize(buf + 2, 3, zz, TOKENIZE_CHECKQUOTE) != 3) break;
+ /* Process "U:<tv>:<a>/<c>" -- attr/char for unaware items */
+ if (tokenize(buf + 2, 3, zz, TOKENIZE_CHECKQUOTE) != 3) return 1;
int j = (huge)strtol(zz[0], NULL, 0);
TERM_COLOR n1 = (TERM_COLOR)strtol(zz[1], NULL, 0);
return 0;
}
-
- /* Process "E:<tv>:<a>" -- attribute for inventory objects */
case 'E':
{
- if (tokenize(buf + 2, 2, zz, TOKENIZE_CHECKQUOTE) != 2) break;
+ /* Process "E:<tv>:<a>" -- attribute for inventory objects */
+ if (tokenize(buf + 2, 2, zz, TOKENIZE_CHECKQUOTE) != 2) return 1;
int j = (byte)strtol(zz[0], NULL, 0) % 128;
TERM_COLOR n1 = (TERM_COLOR)strtol(zz[1], NULL, 0);
if (n1) tval_to_attr[j] = n1;
return 0;
}
-
- /* Process "A:<str>" -- save an "action" for later */
case 'A':
+ {
+ /* Process "A:<str>" -- save an "action" for later */
text_to_ascii(macro__buf, buf + 2);
return 0;
-
- /* Process "P:<str>" -- normal macro */
+ }
case 'P':
{
+ /* Process "P:<str>" -- normal macro */
char tmp[1024];
-
text_to_ascii(tmp, buf + 2);
macro_add(tmp, macro__buf);
return 0;
}
-
- /* Process "C:<str>" -- create keymap */
case 'C':
{
+ /* Process "C:<str>" -- create keymap */
if (tokenize(buf + 2, 2, zz, TOKENIZE_CHECKQUOTE) != 2) return 1;
int mode = strtol(zz[0], NULL, 0);
char tmp[1024];
text_to_ascii(tmp, zz[1]);
if (!tmp[0] || tmp[1]) return 1;
- int i = (byte)(tmp[0]);
+ int i = (byte)(tmp[0]);
string_free(keymap_act[mode][i]);
-
keymap_act[mode][i] = string_make(macro__buf);
-
return 0;
}
-
- /* Process "V:<num>:<kv>:<rv>:<gv>:<bv>" -- visual info */
case 'V':
{
- if (tokenize(buf + 2, 5, zz, TOKENIZE_CHECKQUOTE) != 5) break;
+ /* Process "V:<num>:<kv>:<rv>:<gv>:<bv>" -- visual info */
+ if (tokenize(buf + 2, 5, zz, TOKENIZE_CHECKQUOTE) != 5) return 1;
int i = (byte)strtol(zz[0], NULL, 0);
angband_color_table[i][0] = (byte)strtol(zz[1], NULL, 0);
angband_color_table[i][3] = (byte)strtol(zz[4], NULL, 0);
return 0;
}
-
- /* Process "X:<str>" -- turn option off */
- /* Process "Y:<str>" -- turn option on */
case 'X':
case 'Y':
{
+ /* Process "X:<str>" -- turn option off */
+ /* Process "Y:<str>" -- turn option on */
for (int i = 0; option_info[i].o_desc; i++)
{
bool is_option = option_info[i].o_var != NULL;
msg_print(NULL);
return 0;
}
-
- /* Process "Z:<type>:<str>" -- set spell color */
case 'Z':
{
+ /* Process "Z:<type>:<str>" -- set spell color */
char *t = my_strchr(buf + 2, ':');
if (!t) return 1;
+
*(t++) = '\0';
for (int i = 0; gf_desc[i].name; i++)
{
if (!streq(gf_desc[i].name, buf + 2)) continue;
+
gf_color[gf_desc[i].num] = (TERM_COLOR)quark_add(t);
return 0;
}
- break;
+ return 1;
}
-
- /* Initialize macro trigger names and a template */
- /* Process "T:<trigger>:<keycode>:<shift-keycode>" */
- /* Process "T:<template>:<modifier chr>:<modifier name>:..." */
case 'T':
{
+ /* Initialize macro trigger names and a template */
+ /* Process "T:<trigger>:<keycode>:<shift-keycode>" */
+ /* Process "T:<template>:<modifier chr>:<modifier name>:..." */
int tok = tokenize(buf + 2, 2 + MAX_MACRO_MOD, zz, 0);
/* Process "T:<template>:<modifier chr>:<modifier name>:..." */
if (depth_count > 20) continue;
depth_count++;
-
- /* Process that file if allowed */
switch (preftype)
{
case PREF_TYPE_AUTOPICK:
char buf[1024];
path_build(buf, sizeof(buf), ANGBAND_DIR_PREF, name);
- /* Process the system pref file */
errr err1 = process_pref_file_aux(creature_ptr, buf, PREF_TYPE_NORMAL);
-
- /* Stop at parser errors, but not at non-existing file */
if (err1 > 0) return err1;
path_build(buf, sizeof(buf), ANGBAND_DIR_USER, name);
-
- /* Process the user pref file */
errr err2 = process_pref_file_aux(creature_ptr, buf, PREF_TYPE_NORMAL);
-
- /* User file does not exist, but read system pref file */
if (err2 < 0 && !err1)
return -2;
- /* Result of user file processing */
return err2;
}
-#define ENTRY_BARE_HAND 0
-#define ENTRY_TWO_HANDS 1
-#define ENTRY_RIGHT_HAND1 2
-#define ENTRY_LEFT_HAND1 3
-#define ENTRY_LEFT_HAND2 4
-#define ENTRY_RIGHT_HAND2 5
-#define ENTRY_POSTURE 6
-#define ENTRY_SHOOT_HIT_DAM 7
-#define ENTRY_SHOOT_POWER 8
-#define ENTRY_SPEED 9
-#define ENTRY_BASE_AC 10
-#define ENTRY_LEVEL 11
-#define ENTRY_CUR_EXP 12
-#define ENTRY_MAX_EXP 13
-#define ENTRY_EXP_TO_ADV 14
-#define ENTRY_GOLD 15
-#define ENTRY_DAY 16
-#define ENTRY_HP 17
-#define ENTRY_SP 18
-#define ENTRY_PLAY_TIME 19
-#define ENTRY_SKILL_FIGHT 20
-#define ENTRY_SKILL_SHOOT 21
-#define ENTRY_SKILL_SAVING 22
-#define ENTRY_SKILL_STEALTH 23
-#define ENTRY_SKILL_PERCEP 24
-#define ENTRY_SKILL_SEARCH 25
-#define ENTRY_SKILL_DISARM 26
-#define ENTRY_SKILL_DEVICE 27
-#define ENTRY_SKILL_DIG 45
-
-#define ENTRY_BLOWS 28
-#define ENTRY_SHOTS 29
-#define ENTRY_AVG_DMG 30
-#define ENTRY_INFRA 31
-
-#define ENTRY_NAME 32
-#define ENTRY_SEX 33
-#define ENTRY_RACE 34
-#define ENTRY_CLASS 35
-#define ENTRY_REALM 36
-#define ENTRY_PATRON 37
-#define ENTRY_AGE 38
-#define ENTRY_HEIGHT 39
-#define ENTRY_WEIGHT 40
-#define ENTRY_SOCIAL 41
-#define ENTRY_ALIGN 42
-
-#define ENTRY_EXP_ANDR 43
-#define ENTRY_EXP_TO_ADV_ANDR 44
-
-static struct
-{
- int col;
- int row;
- int len;
- char header[20];
-} disp_player_line[]
-#ifdef JP
-= {
- { 1, 10, 25, "打撃修正(格闘)"},
- { 1, 10, 25, "打撃修正(両手)"},
- { 1, 10, 25, "打撃修正(右手)"},
- { 1, 10, 25, "打撃修正(左手)"},
- { 1, 11, 25, "打撃修正(左手)"},
- { 1, 11, 25, "打撃修正(右手)"},
- { 1, 11, 25, ""},
- { 1, 15, 25, "射撃攻撃修正"},
- { 1, 16, 25, "射撃武器倍率"},
- { 1, 20, 25, "加速"},
- { 1, 19, 25, "AC"},
- {29, 13, 21, "レベル"},
- {29, 14, 21, "経験値"},
- {29, 15, 21, "最大経験"},
- {29, 16, 21, "次レベル"},
- {29, 17, 21, "所持金"},
- {29, 19, 21, "日付"},
- {29, 10, 21, "HP"},
- {29, 11, 21, "MP"},
- {29, 20, 21, "プレイ時間"},
- {53, 10, -1, "打撃命中 :"},
- {53, 11, -1, "射撃命中 :"},
- {53, 12, -1, "魔法防御 :"},
- {53, 13, -1, "隠密行動 :"},
- {53, 15, -1, "知覚 :"},
- {53, 16, -1, "探索 :"},
- {53, 17, -1, "解除 :"},
- {53, 18, -1, "魔法道具 :"},
- { 1, 12, 25, "打撃回数"},
- { 1, 17, 25, "射撃回数"},
- { 1, 13, 25, "平均ダメージ"},
- {53, 20, -1, "赤外線視力:"},
- {26, 1, -1, "名前 : "},
- { 1, 3, -1, "性別 : "},
- { 1, 4, -1, "種族 : "},
- { 1, 5, -1, "職業 : "},
- { 1, 6, -1, "魔法 : "},
- { 1, 7, -1, "守護魔神 : "},
- {29, 3, 21, "年齢"},
- {29, 4, 21, "身長"},
- {29, 5, 21, "体重"},
- {29, 6, 21, "社会的地位"},
- {29, 7, 21, "属性"},
- {29, 14, 21, "強化度"},
- {29, 16, 21, "次レベル"},
- {53, 19, -1, "掘削 :" },
-};
-#else
-= {
- { 1, 10, 25, "Bare hand"},
- { 1, 10, 25, "Two hands"},
- { 1, 10, 25, "Right hand"},
- { 1, 10, 25, "Left hand"},
- { 1, 11, 25, "Left hand"},
- { 1, 11, 25, "Right hand"},
- { 1, 11, 25, "Posture"},
- { 1, 15, 25, "Shooting"},
- { 1, 16, 25, "Multiplier"},
- { 1, 20, 25, "Speed"},
- { 1, 19, 25, "AC"},
- {29, 13, 21, "Level"},
- {29, 14, 21, "Experience"},
- {29, 15, 21, "Max Exp"},
- {29, 16, 21, "Exp to Adv"},
- {29, 17, 21, "Gold"},
- {29, 19, 21, "Time"},
- {29, 10, 21, "Hit point"},
- {29, 11, 21, "SP (Mana)"},
- {29, 20, 21, "Play time"},
- {53, 10, -1, "Fighting : "},
- {53, 11, -1, "Bows/Throw : "},
- {53, 12, -1, "SavingThrow: "},
- {53, 13, -1, "Stealth : "},
- {53, 15, -1, "Perception : "},
- {53, 16, -1, "Searching : "},
- {53, 17, -1, "Disarming : "},
- {53, 18, -1, "MagicDevice: "},
- { 1, 12, 25, "Blows/Round"},
- { 1, 17, 25, "Shots/Round"},
- { 1, 13, 25, "AverageDmg/Rnd"},
- {53, 20, -1, "Infravision: "},
- {26, 1, -1, "Name : "},
- { 1, 3, -1, "Sex : "},
- { 1, 4, -1, "Race : "},
- { 1, 5, -1, "Class : "},
- { 1, 6, -1, "Magic : "},
- { 1, 7, -1, "Patron : "},
- {29, 3, 21, "Age"},
- {29, 4, 21, "Height"},
- {29, 5, 21, "Weight"},
- {29, 6, 21, "Social Class"},
- {29, 7, 21, "Align"},
- {29, 14, 21, "Construction"},
- {29, 16, 21, "Const to Adv"},
- {53, 19, -1, "Digging : " },
-};
-#endif
-
-
-/*!
- * @brief プレイヤーのステータス1種を出力する
- * @param entry 項目ID
- * @param val 値を保管した文字列ポインタ
- * @param attr 項目表示の色
- * @return なし
- */
-static void display_player_one_line(int entry, concptr val, TERM_COLOR attr)
-{
- concptr head = disp_player_line[entry].header;
- int head_len = strlen(head);
- int row = disp_player_line[entry].row;
- int col = disp_player_line[entry].col;
- int len = disp_player_line[entry].len;
- Term_putstr(col, row, -1, TERM_WHITE, head);
-
- if (!val) return;
-
- if (len <= 0)
- {
- Term_putstr(col + head_len, row, -1, attr, val);
- return;
- }
-
- int val_len = len - head_len;
- char buf[40];
- sprintf(buf, "%*.*s", val_len, val_len, val);
- Term_putstr(col + head_len, row, -1, attr, buf);
-}
-
-
/*!
* @brief プレイヤーの打撃能力修正を表示する
* @param creature_ptr プレーヤーへの参照ポインタ
HIT_POINT show_todam = creature_ptr->dis_to_d[hand];
object_type *o_ptr = &creature_ptr->inventory_list[INVEN_RARM + hand];
- /* Hack -- add in weapon info if known */
if (object_is_known(o_ptr)) show_tohit += o_ptr->to_h;
if (object_is_known(o_ptr)) show_todam += o_ptr->to_d;
char buf[160];
sprintf(buf, "(%+d,%+d)", (int)show_tohit, (int)show_todam);
- /* Dump the bonuses to hit/dam */
if (!has_melee_weapon(creature_ptr, INVEN_RARM) && !has_melee_weapon(creature_ptr, INVEN_LARM))
display_player_one_line(ENTRY_BARE_HAND, buf, TERM_L_BLUE);
else if (creature_ptr->ryoute)
{
HIT_PROB show_tohit = creature_ptr->dis_to_h_b;
HIT_POINT show_todam = 0;
-
if (creature_ptr->migite)
{
display_player_melee_bonus(creature_ptr, 0, left_hander ? ENTRY_LEFT_HAND1 : ENTRY_RIGHT_HAND1);
}
}
- /* Apply weapon bonuses */
object_type *o_ptr = &creature_ptr->inventory_list[INVEN_BOW];
if (object_is_known(o_ptr)) show_tohit += o_ptr->to_h;
if (object_is_known(o_ptr)) show_todam += o_ptr->to_d;
show_tohit += creature_ptr->skill_thb / BTH_PLUS_ADJ;
- /* Range attacks */
display_player_one_line(ENTRY_SHOOT_HIT_DAM, format("(%+d,%+d)", show_tohit, show_todam), TERM_L_BLUE);
-
int tmul = 0;
if (creature_ptr->inventory_list[INVEN_BOW].k_idx)
{
tmul = bow_tmul(creature_ptr->inventory_list[INVEN_BOW].sval);
-
- /* Get extra "power" from "extra might" */
if (creature_ptr->xtra_might) tmul++;
tmul = tmul * (100 + (int)(adj_str_td[creature_ptr->stat_ind[A_STR]]) - 128);
}
- /* shoot power */
display_player_one_line(ENTRY_SHOOT_POWER, format("x%d.%02d", tmul / 100, tmul % 100), TERM_L_BLUE);
-
- /* Dump the armor class */
display_player_one_line(ENTRY_BASE_AC, format("[%d,%+d]", creature_ptr->dis_ac, creature_ptr->dis_to_a), TERM_L_BLUE);
int i = creature_ptr->pspeed - 110;
-
- /* Hack -- Visually "undo" the Search Mode Slowdown */
if (creature_ptr->action == ACTION_SEARCH) i += 10;
TERM_COLOR attr;
}
display_player_one_line(ENTRY_SPEED, buf, attr);
-
- /* Dump character level */
display_player_one_line(ENTRY_LEVEL, format("%d", creature_ptr->lev), TERM_L_GREEN);
- /* Dump experience */
- int e;
- if (creature_ptr->prace == RACE_ANDROID) e = ENTRY_EXP_ANDR;
- else e = ENTRY_CUR_EXP;
-
+ int e = (creature_ptr->prace == RACE_ANDROID) ? ENTRY_EXP_ANDR : ENTRY_CUR_EXP;
if (creature_ptr->exp >= creature_ptr->max_exp)
display_player_one_line(e, format("%ld", creature_ptr->exp), TERM_L_GREEN);
else
display_player_one_line(e, format("%ld", creature_ptr->exp), TERM_YELLOW);
- /* Dump max experience */
- if (creature_ptr->prace == RACE_ANDROID)
- /* Nothing */;
- else
+ if (creature_ptr->prace != RACE_ANDROID)
display_player_one_line(ENTRY_MAX_EXP, format("%ld", creature_ptr->max_exp), TERM_L_GREEN);
- /* Dump exp to advance */
- if (creature_ptr->prace == RACE_ANDROID) e = ENTRY_EXP_TO_ADV_ANDR;
- else e = ENTRY_EXP_TO_ADV;
+ e = (creature_ptr->prace == RACE_ANDROID) ? ENTRY_EXP_TO_ADV_ANDR : ENTRY_EXP_TO_ADV;
if (creature_ptr->lev >= PY_MAX_LEVEL)
display_player_one_line(e, "*****", TERM_L_GREEN);
else
display_player_one_line(e, format("%ld", (s32b)(player_exp[creature_ptr->lev - 1] * creature_ptr->expfact / 100L)), TERM_L_GREEN);
- /* Dump gold */
display_player_one_line(ENTRY_GOLD, format("%ld", creature_ptr->au), TERM_L_GREEN);
- /* Dump Day */
int day, hour, min;
extract_day_hour_min(creature_ptr, &day, &hour, &min);
- if (day < MAX_DAYS) sprintf(buf, _("%d日目 %2d:%02d", "Day %d %2d:%02d"), day, hour, min);
- else sprintf(buf, _("*****日目 %2d:%02d", "Day ***** %2d:%02d"), hour, min);
+ if (day < MAX_DAYS)
+ sprintf(buf, _("%d日目 %2d:%02d", "Day %d %2d:%02d"), day, hour, min);
+ else
+ sprintf(buf, _("*****日目 %2d:%02d", "Day ***** %2d:%02d"), hour, min);
+
display_player_one_line(ENTRY_DAY, buf, TERM_L_GREEN);
- /* Dump hit point */
if (creature_ptr->chp >= creature_ptr->mhp)
display_player_one_line(ENTRY_HP, format("%4d/%4d", creature_ptr->chp, creature_ptr->mhp), TERM_L_GREEN);
else if (creature_ptr->chp > (creature_ptr->mhp * hitpoint_warn) / 10)
else
display_player_one_line(ENTRY_HP, format("%4d/%4d", creature_ptr->chp, creature_ptr->mhp), TERM_RED);
- /* Dump mana power */
if (creature_ptr->csp >= creature_ptr->msp)
display_player_one_line(ENTRY_SP, format("%4d/%4d", creature_ptr->csp, creature_ptr->msp), TERM_L_GREEN);
else if (creature_ptr->csp > (creature_ptr->msp * mana_warn) / 10)
else
display_player_one_line(ENTRY_SP, format("%4d/%4d", creature_ptr->csp, creature_ptr->msp), TERM_RED);
- /* Dump play time */
- display_player_one_line(ENTRY_PLAY_TIME, format("%.2lu:%.2lu:%.2lu", current_world_ptr->play_time / (60 * 60), (current_world_ptr->play_time / 60) % 60, current_world_ptr->play_time % 60), TERM_L_GREEN);
+ u32b play_hour = current_world_ptr->play_time / (60 * 60);
+ u32b play_min = (current_world_ptr->play_time / 60) % 60;
+ u32b play_sec = current_world_ptr->play_time % 60;
+ display_player_one_line(ENTRY_PLAY_TIME, format("%.2lu:%.2lu:%.2lu", play_hour, play_min, play_sec), TERM_L_GREEN);
}
-/*
- * Hack -- pass color info around this file
- */
-static TERM_COLOR likert_color = TERM_WHITE;
-
-
/*!
- * @brief 技能ランクの表示基準を定める
- * Returns a "rating" of x depending on y
- * @param x 技能値
- * @param y 技能値に対するランク基準比
+ * @brief プレイヤーの装備一覧をシンボルで並べる
+ * Equippy chars
+ * @param creature_ptr プレーヤーへの参照ポインタ
+ * @param y 表示するコンソールの行
+ * @param x 表示するコンソールの列
+ * @param mode オプション
* @return なし
*/
-static concptr likert(int x, int y)
+void display_player_equippy(player_type *creature_ptr, TERM_LEN y, TERM_LEN x, BIT_FLAGS16 mode)
{
- static char dummy[20] = "", dummy2[20] = "";
- memset(dummy, 0, strlen(dummy));
- memset(dummy2, 0, strlen(dummy2));
- if (y <= 0) y = 1;
+ /* Weapon flags need only two column */
+ int max_i = (mode & DP_WP) ? INVEN_LARM + 1 : INVEN_TOTAL;
- if (show_actual_value)
+ /* Dump equippy chars */
+ for (int i = INVEN_RARM; i < max_i; i++)
{
- sprintf(dummy, "%3d-", x);
- }
+ object_type *o_ptr;
+ o_ptr = &creature_ptr->inventory_list[i];
- /* Negative value */
- if (x < 0)
- {
- likert_color = TERM_L_DARK;
- strcat(dummy, _("最低", "Very Bad"));
- return dummy;
- }
+ TERM_COLOR a = object_attr(o_ptr);
+ char c = object_char(o_ptr);
- switch ((x / y))
- {
- case 0:
- case 1:
- likert_color = TERM_RED;
- strcat(dummy, _("悪い", "Bad"));
- break;
- case 2:
- likert_color = TERM_L_RED;
- strcat(dummy, _("劣る", "Poor"));
- break;
-
- case 3:
- case 4:
- likert_color = TERM_ORANGE;
- strcat(dummy, _("普通", "Fair"));
- break;
-
- case 5:
- likert_color = TERM_YELLOW;
- strcat(dummy, _("良い", "Good"));
- break;
-
- case 6:
- likert_color = TERM_YELLOW;
- strcat(dummy, _("大変良い", "Very Good"));
- break;
-
- case 7:
- case 8:
- likert_color = TERM_L_GREEN;
- strcat(dummy, _("卓越", "Excellent"));
- break;
-
- case 9:
- case 10:
- case 11:
- case 12:
- case 13:
- likert_color = TERM_GREEN;
- strcat(dummy, _("超越", "Superb"));
- break;
-
- case 14:
- case 15:
- case 16:
- case 17:
- likert_color = TERM_BLUE;
- strcat(dummy, _("英雄的", "Heroic"));
- break;
-
- default:
- likert_color = TERM_VIOLET;
- sprintf(dummy2, _("伝説的[%d]", "Legendary[%d]"),
- (int)((((x / y) - 17) * 5) / 2));
- strcat(dummy, dummy2);
-
- break;
- }
+ if (!equippy_chars || !o_ptr->k_idx)
+ {
+ c = ' ';
+ a = TERM_DARK;
+ }
- return dummy;
+ Term_putch(x + i - INVEN_RARM, y, a, c);
+ }
}
/*!
- * @brief プレイヤーステータスの1ページ目各種詳細をまとめて表示するサブルーチン
- * Prints ratings on certain abilities
+ * @brief プレイヤーの装備による免疫フラグを返す
* @param creature_ptr プレーヤーへの参照ポインタ
+ * @param flgs フラグを保管する配列
* @return なし
- * @details
- * This code is "imitated" elsewhere to "dump" a character sheet.
+ * @todo
+ * xtra1.c周りと多重実装になっているのを何とかする
*/
-static void display_player_various(player_type *creature_ptr)
+static void known_obj_immunity(player_type *creature_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE])
{
- int muta_att = 0;
- if (creature_ptr->muta2 & MUT2_HORNS) muta_att++;
- if (creature_ptr->muta2 & MUT2_SCOR_TAIL) muta_att++;
- if (creature_ptr->muta2 & MUT2_BEAK) muta_att++;
- if (creature_ptr->muta2 & MUT2_TRUNK) muta_att++;
- if (creature_ptr->muta2 & MUT2_TENTACLES) muta_att++;
-
- int xthn = creature_ptr->skill_thn + (creature_ptr->to_h_m * BTH_PLUS_ADJ);
-
- /* Shooting Skill (with current bow and normal missile) */
- object_type *o_ptr;
- o_ptr = &creature_ptr->inventory_list[INVEN_BOW];
- int tmp = creature_ptr->to_h_b + o_ptr->to_h;
- int xthb = creature_ptr->skill_thb + (tmp * BTH_PLUS_ADJ);
-
- /* If the player is wielding one? */
- int shots;
- int shot_frac;
- if (o_ptr->k_idx)
- {
- ENERGY energy_fire = bow_energy(o_ptr->sval);
-
- /* Calculate shots per round */
- shots = creature_ptr->num_fire * 100;
- shot_frac = (shots * 100 / energy_fire) % 100;
- shots = shots / energy_fire;
- if (o_ptr->name1 == ART_CRIMSON)
- {
- shots = 1;
- shot_frac = 0;
- if (creature_ptr->pclass == CLASS_ARCHER)
- {
- /* Extra shot at level 10 */
- if (creature_ptr->lev >= 10) shots++;
-
- /* Extra shot at level 30 */
- if (creature_ptr->lev >= 30) shots++;
-
- /* Extra shot at level 45 */
- if (creature_ptr->lev >= 45) shots++;
- }
- }
- }
- else
- {
- shots = 0;
- shot_frac = 0;
- }
+ for (int i = 0; i < TR_FLAG_SIZE; i++)
+ flgs[i] = 0L;
- int damage[2];
- int to_h[2];
- int basedam;
- BIT_FLAGS flgs[TR_FLAG_SIZE];
- bool poison_needle;
- for (int i = 0; i < 2; i++)
+ for (int i = INVEN_RARM; i < INVEN_TOTAL; i++)
{
- damage[i] = creature_ptr->dis_to_d[i] * 100;
- if (((creature_ptr->pclass == CLASS_MONK) || (creature_ptr->pclass == CLASS_FORCETRAINER)) && (empty_hands(creature_ptr, TRUE) & EMPTY_HAND_RARM))
- {
- PLAYER_LEVEL level = creature_ptr->lev;
- if (i)
- {
- damage[i] = 0;
- break;
- }
-
- if (creature_ptr->pclass == CLASS_FORCETRAINER) level = MAX(1, level - 3);
- if (creature_ptr->special_defense & KAMAE_BYAKKO)
- basedam = monk_ave_damage[level][1];
- else if (creature_ptr->special_defense & (KAMAE_GENBU | KAMAE_SUZAKU))
- basedam = monk_ave_damage[level][2];
- else
- basedam = monk_ave_damage[level][0];
-
- damage[i] += basedam;
- if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) damage[i] = 1;
- if (damage[i] < 0) damage[i] = 0;
- continue;
- }
-
- o_ptr = &creature_ptr->inventory_list[INVEN_RARM + i];
-
- /* Average damage per round */
- if (o_ptr->k_idx == 0)
- {
- basedam = 0;
- damage[i] += basedam;
- if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) damage[i] = 1;
- if (damage[i] < 0) damage[i] = 0;
- continue;
- }
-
- to_h[i] = 0;
- poison_needle = FALSE;
-
- if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) poison_needle = TRUE;
- if (object_is_known(o_ptr))
- {
- damage[i] += o_ptr->to_d * 100;
- to_h[i] += o_ptr->to_h;
- }
-
- basedam = ((o_ptr->dd + creature_ptr->to_dd[i]) * (o_ptr->ds + creature_ptr->to_ds[i] + 1)) * 50;
- object_flags_known(o_ptr, flgs);
-
- basedam = calc_expect_crit(creature_ptr, o_ptr->weight, to_h[i], basedam, creature_ptr->dis_to_h[i], poison_needle);
- if (OBJECT_IS_FULL_KNOWN(o_ptr) && ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)))
- {
- /* vorpal blade */
- basedam *= 5;
- basedam /= 3;
- }
- else if (have_flag(flgs, TR_VORPAL))
- {
- /* vorpal flag only */
- basedam *= 11;
- basedam /= 9;
- }
+ u32b o_flgs[TR_FLAG_SIZE];
+ object_type *o_ptr;
+ o_ptr = &creature_ptr->inventory_list[i];
+ if (!o_ptr->k_idx) continue;
- if ((creature_ptr->pclass != CLASS_SAMURAI) && have_flag(flgs, TR_FORCE_WEAPON) && (creature_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
- basedam = basedam * 7 / 2;
- damage[i] += basedam;
- if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) damage[i] = 1;
- if (damage[i] < 0) damage[i] = 0;
+ object_flags_known(o_ptr, o_flgs);
+ if (have_flag(o_flgs, TR_IM_ACID)) add_flag(flgs, TR_RES_ACID);
+ if (have_flag(o_flgs, TR_IM_ELEC)) add_flag(flgs, TR_RES_ELEC);
+ if (have_flag(o_flgs, TR_IM_FIRE)) add_flag(flgs, TR_RES_FIRE);
+ if (have_flag(o_flgs, TR_IM_COLD)) add_flag(flgs, TR_RES_COLD);
}
-
- int blows1 = creature_ptr->migite ? creature_ptr->num_blow[0] : 0;
- int blows2 = creature_ptr->hidarite ? creature_ptr->num_blow[1] : 0;
-
- /* Basic abilities */
-
- int xdis = creature_ptr->skill_dis;
- int xdev = creature_ptr->skill_dev;
- int xsav = creature_ptr->skill_sav;
- int xstl = creature_ptr->skill_stl;
- int xsrh = creature_ptr->skill_srh;
- int xfos = creature_ptr->skill_fos;
- int xdig = creature_ptr->skill_dig;
-
- concptr desc = likert(xthn, 12);
- display_player_one_line(ENTRY_SKILL_FIGHT, desc, likert_color);
-
- desc = likert(xthb, 12);
- display_player_one_line(ENTRY_SKILL_SHOOT, desc, likert_color);
-
- desc = likert(xsav, 7);
- display_player_one_line(ENTRY_SKILL_SAVING, desc, likert_color);
-
- desc = likert((xstl > 0) ? xstl : -1, 1);
- display_player_one_line(ENTRY_SKILL_STEALTH, desc, likert_color);
-
- desc = likert(xfos, 6);
- display_player_one_line(ENTRY_SKILL_PERCEP, desc, likert_color);
-
- desc = likert(xsrh, 6);
- display_player_one_line(ENTRY_SKILL_SEARCH, desc, likert_color);
-
- desc = likert(xdis, 8);
- display_player_one_line(ENTRY_SKILL_DISARM, desc, likert_color);
-
- desc = likert(xdev, 6);
- display_player_one_line(ENTRY_SKILL_DEVICE, desc, likert_color);
-
- desc = likert(xdev, 6);
- display_player_one_line(ENTRY_SKILL_DEVICE, desc, likert_color);
-
- desc = likert(xdig, 4);
- display_player_one_line(ENTRY_SKILL_DIG, desc, likert_color);
-
- if (!muta_att)
- display_player_one_line(ENTRY_BLOWS, format("%d+%d", blows1, blows2), TERM_L_BLUE);
- else
- display_player_one_line(ENTRY_BLOWS, format("%d+%d+%d", blows1, blows2, muta_att), TERM_L_BLUE);
-
- display_player_one_line(ENTRY_SHOTS, format("%d.%02d", shots, shot_frac), TERM_L_BLUE);
-
- if ((damage[0] + damage[1]) == 0)
- desc = "nil!";
- else
- desc = format("%d+%d", blows1 * damage[0] / 100, blows2 * damage[1] / 100);
-
- display_player_one_line(ENTRY_AVG_DMG, desc, TERM_L_BLUE);
-
- display_player_one_line(ENTRY_INFRA, format("%d feet", creature_ptr->see_infra * 10), TERM_WHITE);
}
/*!
- * @brief プレイヤーの職業、種族に応じた耐性フラグを返す
- * Prints ratings on certain abilities
- * @param creature_ptr 参照元クリーチャーポインタ
+ * @brief プレイヤーの種族による免疫フラグを返す
+ * @param creature_ptr プレーヤーへの参照ポインタ
* @param flgs フラグを保管する配列
* @return なし
- * @details
- * Obtain the "flags" for the player as if he was an item
* @todo
* xtra1.c周りと多重実装になっているのを何とかする
*/
-static void player_flags(player_type *creature_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE])
-{
- for (int i = 0; i < TR_FLAG_SIZE; i++)
- flgs[i] = 0L;
-
- switch (creature_ptr->pclass)
- {
- case CLASS_WARRIOR:
- if (creature_ptr->lev > 44)
- add_flag(flgs, TR_REGEN);
- case CLASS_SAMURAI:
- if (creature_ptr->lev > 29)
- add_flag(flgs, TR_RES_FEAR);
- break;
- case CLASS_PALADIN:
- if (creature_ptr->lev > 39)
- add_flag(flgs, TR_RES_FEAR);
- break;
- case CLASS_CHAOS_WARRIOR:
- if (creature_ptr->lev > 29)
- add_flag(flgs, TR_RES_CHAOS);
- if (creature_ptr->lev > 39)
- add_flag(flgs, TR_RES_FEAR);
- break;
- case CLASS_MONK:
- case CLASS_FORCETRAINER:
- if ((creature_ptr->lev > 9) && !heavy_armor(creature_ptr))
- add_flag(flgs, TR_SPEED);
- if ((creature_ptr->lev > 24) && !heavy_armor(creature_ptr))
- add_flag(flgs, TR_FREE_ACT);
- break;
- case CLASS_NINJA:
- if (heavy_armor(creature_ptr))
- add_flag(flgs, TR_SPEED);
- else
- {
- if ((!creature_ptr->inventory_list[INVEN_RARM].k_idx || creature_ptr->migite) &&
- (!creature_ptr->inventory_list[INVEN_LARM].k_idx || creature_ptr->hidarite))
- add_flag(flgs, TR_SPEED);
- if (creature_ptr->lev > 24)
- add_flag(flgs, TR_FREE_ACT);
- }
-
- add_flag(flgs, TR_SLOW_DIGEST);
- add_flag(flgs, TR_RES_FEAR);
- if (creature_ptr->lev > 19) add_flag(flgs, TR_RES_POIS);
- if (creature_ptr->lev > 24) add_flag(flgs, TR_SUST_DEX);
- if (creature_ptr->lev > 29) add_flag(flgs, TR_SEE_INVIS);
- break;
- case CLASS_MINDCRAFTER:
- if (creature_ptr->lev > 9)
- add_flag(flgs, TR_RES_FEAR);
- if (creature_ptr->lev > 19)
- add_flag(flgs, TR_SUST_WIS);
- if (creature_ptr->lev > 29)
- add_flag(flgs, TR_RES_CONF);
- if (creature_ptr->lev > 39)
- add_flag(flgs, TR_TELEPATHY);
- break;
- case CLASS_BARD:
- add_flag(flgs, TR_RES_SOUND);
- break;
- case CLASS_BERSERKER:
- add_flag(flgs, TR_SUST_STR);
- add_flag(flgs, TR_SUST_DEX);
- add_flag(flgs, TR_SUST_CON);
- add_flag(flgs, TR_REGEN);
- add_flag(flgs, TR_FREE_ACT);
- add_flag(flgs, TR_SPEED);
- if (creature_ptr->lev > 39) add_flag(flgs, TR_REFLECT);
- break;
- case CLASS_MIRROR_MASTER:
- if (creature_ptr->lev > 39)add_flag(flgs, TR_REFLECT);
- break;
- default:
- break; /* Do nothing */
- }
-
- /* Races */
- if (creature_ptr->mimic_form)
- {
- switch (creature_ptr->mimic_form)
- {
- case MIMIC_DEMON:
- add_flag(flgs, TR_HOLD_EXP);
- add_flag(flgs, TR_RES_CHAOS);
- add_flag(flgs, TR_RES_NETHER);
- add_flag(flgs, TR_RES_FIRE);
- add_flag(flgs, TR_SEE_INVIS);
- add_flag(flgs, TR_SPEED);
- break;
- case MIMIC_DEMON_LORD:
- add_flag(flgs, TR_HOLD_EXP);
- add_flag(flgs, TR_RES_CHAOS);
- add_flag(flgs, TR_RES_NETHER);
- add_flag(flgs, TR_RES_FIRE);
- add_flag(flgs, TR_RES_COLD);
- add_flag(flgs, TR_RES_ELEC);
- add_flag(flgs, TR_RES_ACID);
- add_flag(flgs, TR_RES_POIS);
- add_flag(flgs, TR_RES_CONF);
- add_flag(flgs, TR_RES_DISEN);
- add_flag(flgs, TR_RES_NEXUS);
- add_flag(flgs, TR_RES_FEAR);
- add_flag(flgs, TR_IM_FIRE);
- add_flag(flgs, TR_SH_FIRE);
- add_flag(flgs, TR_SEE_INVIS);
- add_flag(flgs, TR_TELEPATHY);
- add_flag(flgs, TR_LEVITATION);
- add_flag(flgs, TR_SPEED);
- break;
- case MIMIC_VAMPIRE:
- add_flag(flgs, TR_HOLD_EXP);
- add_flag(flgs, TR_RES_DARK);
- add_flag(flgs, TR_RES_NETHER);
- if (creature_ptr->pclass != CLASS_NINJA) add_flag(flgs, TR_LITE_1);
- add_flag(flgs, TR_RES_POIS);
- add_flag(flgs, TR_RES_COLD);
- add_flag(flgs, TR_SEE_INVIS);
- add_flag(flgs, TR_SPEED);
- break;
- }
- }
- else
- {
- switch (creature_ptr->prace)
- {
- case RACE_ELF:
- add_flag(flgs, TR_RES_LITE);
- break;
- case RACE_HOBBIT:
- add_flag(flgs, TR_HOLD_EXP);
- break;
- case RACE_GNOME:
- add_flag(flgs, TR_FREE_ACT);
- break;
- case RACE_DWARF:
- add_flag(flgs, TR_RES_BLIND);
- break;
- case RACE_HALF_ORC:
- add_flag(flgs, TR_RES_DARK);
- break;
- case RACE_HALF_TROLL:
- add_flag(flgs, TR_SUST_STR);
- if (creature_ptr->lev <= 14) break;
-
- add_flag(flgs, TR_REGEN);
- if ((creature_ptr->pclass == CLASS_WARRIOR) || (creature_ptr->pclass == CLASS_BERSERKER))
- {
- add_flag(flgs, TR_SLOW_DIGEST);
- /*
- * Let's not make Regeneration a disadvantage
- * for the poor warriors who can never learn
- * a spell that satisfies hunger (actually
- * neither can rogues, but half-trolls are not
- * supposed to play rogues)
- */
- }
-
- break;
- case RACE_AMBERITE:
- add_flag(flgs, TR_SUST_CON);
- add_flag(flgs, TR_REGEN);
- break;
- case RACE_HIGH_ELF:
- add_flag(flgs, TR_RES_LITE);
- add_flag(flgs, TR_SEE_INVIS);
- break;
- case RACE_BARBARIAN:
- add_flag(flgs, TR_RES_FEAR);
- break;
- case RACE_HALF_OGRE:
- add_flag(flgs, TR_SUST_STR);
- add_flag(flgs, TR_RES_DARK);
- break;
- case RACE_HALF_GIANT:
- add_flag(flgs, TR_RES_SHARDS);
- add_flag(flgs, TR_SUST_STR);
- break;
- case RACE_HALF_TITAN:
- add_flag(flgs, TR_RES_CHAOS);
- break;
- case RACE_CYCLOPS:
- add_flag(flgs, TR_RES_SOUND);
- break;
- case RACE_YEEK:
- add_flag(flgs, TR_RES_ACID);
- if (creature_ptr->lev > 19)
- add_flag(flgs, TR_IM_ACID);
- break;
- case RACE_KLACKON:
- add_flag(flgs, TR_RES_CONF);
- add_flag(flgs, TR_RES_ACID);
- if (creature_ptr->lev > 9)
- add_flag(flgs, TR_SPEED);
- break;
- case RACE_KOBOLD:
- add_flag(flgs, TR_RES_POIS);
- break;
- case RACE_NIBELUNG:
- add_flag(flgs, TR_RES_DISEN);
- add_flag(flgs, TR_RES_DARK);
- break;
- case RACE_DARK_ELF:
- add_flag(flgs, TR_RES_DARK);
- if (creature_ptr->lev > 19)
- add_flag(flgs, TR_SEE_INVIS);
- break;
- case RACE_DRACONIAN:
- add_flag(flgs, TR_LEVITATION);
- if (creature_ptr->lev > 4)
- add_flag(flgs, TR_RES_FIRE);
- if (creature_ptr->lev > 9)
- add_flag(flgs, TR_RES_COLD);
- if (creature_ptr->lev > 14)
- add_flag(flgs, TR_RES_ACID);
- if (creature_ptr->lev > 19)
- add_flag(flgs, TR_RES_ELEC);
- if (creature_ptr->lev > 34)
- add_flag(flgs, TR_RES_POIS);
- break;
- case RACE_MIND_FLAYER:
- add_flag(flgs, TR_SUST_INT);
- add_flag(flgs, TR_SUST_WIS);
- if (creature_ptr->lev > 14)
- add_flag(flgs, TR_SEE_INVIS);
- if (creature_ptr->lev > 29)
- add_flag(flgs, TR_TELEPATHY);
- break;
- case RACE_IMP:
- add_flag(flgs, TR_RES_FIRE);
- if (creature_ptr->lev > 9)
- add_flag(flgs, TR_SEE_INVIS);
- break;
- case RACE_GOLEM:
- add_flag(flgs, TR_SEE_INVIS);
- add_flag(flgs, TR_FREE_ACT);
- add_flag(flgs, TR_RES_POIS);
- add_flag(flgs, TR_SLOW_DIGEST);
- if (creature_ptr->lev > 34)
- add_flag(flgs, TR_HOLD_EXP);
- break;
- case RACE_SKELETON:
- add_flag(flgs, TR_SEE_INVIS);
- add_flag(flgs, TR_RES_SHARDS);
- add_flag(flgs, TR_HOLD_EXP);
- add_flag(flgs, TR_RES_POIS);
- if (creature_ptr->lev > 9)
- add_flag(flgs, TR_RES_COLD);
- break;
- case RACE_ZOMBIE:
- add_flag(flgs, TR_SEE_INVIS);
- add_flag(flgs, TR_HOLD_EXP);
- add_flag(flgs, TR_RES_NETHER);
- add_flag(flgs, TR_RES_POIS);
- add_flag(flgs, TR_SLOW_DIGEST);
- if (creature_ptr->lev > 4)
- add_flag(flgs, TR_RES_COLD);
- break;
- case RACE_VAMPIRE:
- add_flag(flgs, TR_HOLD_EXP);
- add_flag(flgs, TR_RES_DARK);
- add_flag(flgs, TR_RES_NETHER);
- if (creature_ptr->pclass != CLASS_NINJA) add_flag(flgs, TR_LITE_1);
- add_flag(flgs, TR_RES_POIS);
- add_flag(flgs, TR_RES_COLD);
- break;
- case RACE_SPECTRE:
- add_flag(flgs, TR_LEVITATION);
- add_flag(flgs, TR_FREE_ACT);
- add_flag(flgs, TR_RES_COLD);
- add_flag(flgs, TR_SEE_INVIS);
- add_flag(flgs, TR_HOLD_EXP);
- add_flag(flgs, TR_RES_NETHER);
- add_flag(flgs, TR_RES_POIS);
- add_flag(flgs, TR_SLOW_DIGEST);
- /* XXX pass_wall */
- if (creature_ptr->lev > 34)
- add_flag(flgs, TR_TELEPATHY);
- break;
- case RACE_SPRITE:
- add_flag(flgs, TR_RES_LITE);
- add_flag(flgs, TR_LEVITATION);
- if (creature_ptr->lev > 9)
- add_flag(flgs, TR_SPEED);
- break;
- case RACE_BEASTMAN:
- add_flag(flgs, TR_RES_SOUND);
- add_flag(flgs, TR_RES_CONF);
- break;
- case RACE_ANGEL:
- add_flag(flgs, TR_LEVITATION);
- add_flag(flgs, TR_SEE_INVIS);
- break;
- case RACE_DEMON:
- add_flag(flgs, TR_RES_FIRE);
- add_flag(flgs, TR_RES_NETHER);
- add_flag(flgs, TR_HOLD_EXP);
- if (creature_ptr->lev > 9)
- add_flag(flgs, TR_SEE_INVIS);
- break;
- case RACE_DUNADAN:
- add_flag(flgs, TR_SUST_CON);
- break;
- case RACE_S_FAIRY:
- add_flag(flgs, TR_LEVITATION);
- break;
- case RACE_KUTAR:
- add_flag(flgs, TR_RES_CONF);
- break;
- case RACE_ANDROID:
- add_flag(flgs, TR_FREE_ACT);
- add_flag(flgs, TR_RES_POIS);
- add_flag(flgs, TR_SLOW_DIGEST);
- add_flag(flgs, TR_HOLD_EXP);
- break;
- default:
- ; /* Do nothing */
- }
- }
-
- /* Mutations */
- if (creature_ptr->muta3)
- {
- if (creature_ptr->muta3 & MUT3_FLESH_ROT)
- {
- remove_flag(flgs, TR_REGEN);
- }
-
- if ((creature_ptr->muta3 & MUT3_XTRA_FAT) ||
- (creature_ptr->muta3 & MUT3_XTRA_LEGS) ||
- (creature_ptr->muta3 & MUT3_SHORT_LEG))
- {
- add_flag(flgs, TR_SPEED);
- }
-
- if (creature_ptr->muta3 & MUT3_ELEC_TOUC)
- {
- add_flag(flgs, TR_SH_ELEC);
- }
-
- if (creature_ptr->muta3 & MUT3_FIRE_BODY)
- {
- add_flag(flgs, TR_SH_FIRE);
- add_flag(flgs, TR_LITE_1);
- }
-
- if (creature_ptr->muta3 & MUT3_WINGS)
- {
- add_flag(flgs, TR_LEVITATION);
- }
-
- if (creature_ptr->muta3 & MUT3_FEARLESS)
- {
- add_flag(flgs, TR_RES_FEAR);
- }
-
- if (creature_ptr->muta3 & MUT3_REGEN)
- {
- add_flag(flgs, TR_REGEN);
- }
-
- if (creature_ptr->muta3 & MUT3_ESP)
- {
- add_flag(flgs, TR_TELEPATHY);
- }
-
- if (creature_ptr->muta3 & MUT3_MOTION)
- {
- add_flag(flgs, TR_FREE_ACT);
- }
- }
-
- if (creature_ptr->pseikaku == SEIKAKU_SEXY)
- add_flag(flgs, TR_AGGRAVATE);
- if (creature_ptr->pseikaku == SEIKAKU_CHARGEMAN)
- add_flag(flgs, TR_RES_CONF);
- if (creature_ptr->pseikaku == SEIKAKU_MUNCHKIN)
- {
- add_flag(flgs, TR_RES_BLIND);
- add_flag(flgs, TR_RES_CONF);
- add_flag(flgs, TR_HOLD_EXP);
- if (creature_ptr->pclass != CLASS_NINJA) add_flag(flgs, TR_LITE_1);
- if (creature_ptr->lev > 9)
- add_flag(flgs, TR_SPEED);
- }
-
- if (creature_ptr->special_defense & KATA_FUUJIN)
- add_flag(flgs, TR_REFLECT);
-
- if (creature_ptr->special_defense & KAMAE_GENBU)
- add_flag(flgs, TR_REFLECT);
-
- if (creature_ptr->special_defense & KAMAE_SUZAKU)
- add_flag(flgs, TR_LEVITATION);
-
- if (creature_ptr->special_defense & KAMAE_SEIRYU)
- {
- add_flag(flgs, TR_RES_FIRE);
- add_flag(flgs, TR_RES_COLD);
- add_flag(flgs, TR_RES_ACID);
- add_flag(flgs, TR_RES_ELEC);
- add_flag(flgs, TR_RES_POIS);
- add_flag(flgs, TR_LEVITATION);
- add_flag(flgs, TR_SH_FIRE);
- add_flag(flgs, TR_SH_ELEC);
- add_flag(flgs, TR_SH_COLD);
- }
-
- if (creature_ptr->special_defense & KATA_MUSOU)
- {
- add_flag(flgs, TR_RES_FEAR);
- add_flag(flgs, TR_RES_LITE);
- add_flag(flgs, TR_RES_DARK);
- add_flag(flgs, TR_RES_BLIND);
- add_flag(flgs, TR_RES_CONF);
- add_flag(flgs, TR_RES_SOUND);
- add_flag(flgs, TR_RES_SHARDS);
- add_flag(flgs, TR_RES_NETHER);
- add_flag(flgs, TR_RES_NEXUS);
- add_flag(flgs, TR_RES_CHAOS);
- add_flag(flgs, TR_RES_DISEN);
- add_flag(flgs, TR_REFLECT);
- add_flag(flgs, TR_HOLD_EXP);
- add_flag(flgs, TR_FREE_ACT);
- add_flag(flgs, TR_SH_FIRE);
- add_flag(flgs, TR_SH_ELEC);
- add_flag(flgs, TR_SH_COLD);
- add_flag(flgs, TR_LEVITATION);
- add_flag(flgs, TR_LITE_1);
- add_flag(flgs, TR_SEE_INVIS);
- add_flag(flgs, TR_TELEPATHY);
- add_flag(flgs, TR_SLOW_DIGEST);
- add_flag(flgs, TR_REGEN);
- add_flag(flgs, TR_SUST_STR);
- add_flag(flgs, TR_SUST_INT);
- add_flag(flgs, TR_SUST_WIS);
- add_flag(flgs, TR_SUST_DEX);
- add_flag(flgs, TR_SUST_CON);
- add_flag(flgs, TR_SUST_CHR);
- }
-}
-
-
-/*!
- * @brief プレイヤーの一時的魔法効果による耐性を返す
- * Prints ratings on certain abilities
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param flgs フラグを保管する配列
- * @return なし
- * @todo
- * xtra1.c周りと多重実装になっているのを何とかする
- */
-static void tim_player_flags(player_type *creature_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE])
-{
- for (int i = 0; i < TR_FLAG_SIZE; i++)
- flgs[i] = 0L;
-
- if (IS_HERO(creature_ptr) || creature_ptr->shero)
- add_flag(flgs, TR_RES_FEAR);
- if (creature_ptr->tim_invis)
- add_flag(flgs, TR_SEE_INVIS);
- if (creature_ptr->tim_regen)
- add_flag(flgs, TR_REGEN);
- if (is_time_limit_esp(creature_ptr))
- add_flag(flgs, TR_TELEPATHY);
- if (IS_FAST(creature_ptr) || creature_ptr->slow)
- add_flag(flgs, TR_SPEED);
-
- if (is_oppose_acid(creature_ptr) && !(creature_ptr->special_defense & DEFENSE_ACID) && !(PRACE_IS_(creature_ptr, RACE_YEEK) && (creature_ptr->lev > 19)))
- add_flag(flgs, TR_RES_ACID);
- if (is_oppose_elec(creature_ptr) && !(creature_ptr->special_defense & DEFENSE_ELEC))
- add_flag(flgs, TR_RES_ELEC);
- if (is_oppose_fire(creature_ptr) && !(creature_ptr->special_defense & DEFENSE_FIRE))
- add_flag(flgs, TR_RES_FIRE);
- if (is_oppose_cold(creature_ptr) && !(creature_ptr->special_defense & DEFENSE_COLD))
- add_flag(flgs, TR_RES_COLD);
- if (is_oppose_pois(creature_ptr))
- add_flag(flgs, TR_RES_POIS);
-
- if (creature_ptr->special_attack & ATTACK_ACID)
- add_flag(flgs, TR_BRAND_ACID);
- if (creature_ptr->special_attack & ATTACK_ELEC)
- add_flag(flgs, TR_BRAND_ELEC);
- if (creature_ptr->special_attack & ATTACK_FIRE)
- add_flag(flgs, TR_BRAND_FIRE);
- if (creature_ptr->special_attack & ATTACK_COLD)
- add_flag(flgs, TR_BRAND_COLD);
- if (creature_ptr->special_attack & ATTACK_POIS)
- add_flag(flgs, TR_BRAND_POIS);
- if (creature_ptr->special_defense & DEFENSE_ACID)
- add_flag(flgs, TR_IM_ACID);
- if (creature_ptr->special_defense & DEFENSE_ELEC)
- add_flag(flgs, TR_IM_ELEC);
- if (creature_ptr->special_defense & DEFENSE_FIRE)
- add_flag(flgs, TR_IM_FIRE);
- if (creature_ptr->special_defense & DEFENSE_COLD)
- add_flag(flgs, TR_IM_COLD);
- if (creature_ptr->wraith_form)
- add_flag(flgs, TR_REFLECT);
- if (creature_ptr->tim_reflect)
- add_flag(flgs, TR_REFLECT);
-
- if (creature_ptr->magicdef)
- {
- add_flag(flgs, TR_RES_BLIND);
- add_flag(flgs, TR_RES_CONF);
- add_flag(flgs, TR_REFLECT);
- add_flag(flgs, TR_FREE_ACT);
- add_flag(flgs, TR_LEVITATION);
- }
-
- if (creature_ptr->tim_res_nether) add_flag(flgs, TR_RES_NETHER);
-
- if (creature_ptr->tim_sh_fire) add_flag(flgs, TR_SH_FIRE);
-
- if (creature_ptr->ult_res)
- {
- add_flag(flgs, TR_RES_FEAR);
- add_flag(flgs, TR_RES_LITE);
- add_flag(flgs, TR_RES_DARK);
- add_flag(flgs, TR_RES_BLIND);
- add_flag(flgs, TR_RES_CONF);
- add_flag(flgs, TR_RES_SOUND);
- add_flag(flgs, TR_RES_SHARDS);
- add_flag(flgs, TR_RES_NETHER);
- add_flag(flgs, TR_RES_NEXUS);
- add_flag(flgs, TR_RES_CHAOS);
- add_flag(flgs, TR_RES_DISEN);
- add_flag(flgs, TR_REFLECT);
- add_flag(flgs, TR_HOLD_EXP);
- add_flag(flgs, TR_FREE_ACT);
- add_flag(flgs, TR_SH_FIRE);
- add_flag(flgs, TR_SH_ELEC);
- add_flag(flgs, TR_SH_COLD);
- add_flag(flgs, TR_LEVITATION);
- add_flag(flgs, TR_LITE_1);
- add_flag(flgs, TR_SEE_INVIS);
- add_flag(flgs, TR_TELEPATHY);
- add_flag(flgs, TR_SLOW_DIGEST);
- add_flag(flgs, TR_REGEN);
- add_flag(flgs, TR_SUST_STR);
- add_flag(flgs, TR_SUST_INT);
- add_flag(flgs, TR_SUST_WIS);
- add_flag(flgs, TR_SUST_DEX);
- add_flag(flgs, TR_SUST_CON);
- add_flag(flgs, TR_SUST_CHR);
- }
-
- if (creature_ptr->realm1 != REALM_HEX) return;
-
- if (hex_spelling(creature_ptr, HEX_DEMON_AURA))
- {
- add_flag(flgs, TR_SH_FIRE);
- add_flag(flgs, TR_REGEN);
- }
-
- if (hex_spelling(creature_ptr, HEX_ICE_ARMOR)) add_flag(flgs, TR_SH_COLD);
- if (hex_spelling(creature_ptr, HEX_SHOCK_CLOAK)) add_flag(flgs, TR_SH_ELEC);
-}
-
-
-/*!
- * @brief プレイヤーの装備一覧をシンボルで並べる
- * Equippy chars
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param y 表示するコンソールの行
- * @param x 表示するコンソールの列
- * @param mode オプション
- * @return なし
- */
-void display_player_equippy(player_type *creature_ptr, TERM_LEN y, TERM_LEN x, BIT_FLAGS16 mode)
-{
- /* Weapon flags need only two column */
- int max_i = (mode & DP_WP) ? INVEN_LARM + 1 : INVEN_TOTAL;
-
- /* Dump equippy chars */
- for (int i = INVEN_RARM; i < max_i; i++)
- {
- object_type *o_ptr;
- o_ptr = &creature_ptr->inventory_list[i];
-
- TERM_COLOR a = object_attr(o_ptr);
- char c = object_char(o_ptr);
-
- if (!equippy_chars || !o_ptr->k_idx)
- {
- c = ' ';
- a = TERM_DARK;
- }
-
- Term_putch(x + i - INVEN_RARM, y, a, c);
- }
-}
-
-
-/*!
- * @brief プレイヤーの装備による免疫フラグを返す
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param flgs フラグを保管する配列
- * @return なし
- * @todo
- * xtra1.c周りと多重実装になっているのを何とかする
- */
-static void known_obj_immunity(player_type *creature_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE])
-{
- for (int i = 0; i < TR_FLAG_SIZE; i++)
- flgs[i] = 0L;
-
- for (int i = INVEN_RARM; i < INVEN_TOTAL; i++)
- {
- u32b o_flgs[TR_FLAG_SIZE];
- object_type *o_ptr;
- o_ptr = &creature_ptr->inventory_list[i];
- if (!o_ptr->k_idx) continue;
-
- object_flags_known(o_ptr, o_flgs);
- if (have_flag(o_flgs, TR_IM_ACID)) add_flag(flgs, TR_RES_ACID);
- if (have_flag(o_flgs, TR_IM_ELEC)) add_flag(flgs, TR_RES_ELEC);
- if (have_flag(o_flgs, TR_IM_FIRE)) add_flag(flgs, TR_RES_FIRE);
- if (have_flag(o_flgs, TR_IM_COLD)) add_flag(flgs, TR_RES_COLD);
- }
-}
-
-
-/*!
- * @brief プレイヤーの種族による免疫フラグを返す
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param flgs フラグを保管する配列
- * @return なし
- * @todo
- * xtra1.c周りと多重実装になっているのを何とかする
- */
-static void player_immunity(player_type *creature_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE])
+static void player_immunity(player_type *creature_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE])
{
for (int i = 0; i < TR_FLAG_SIZE; i++)
flgs[i] = 0L;
add_flag(flgs, TR_RES_LITE);
}
-
/*
* A struct for storing misc. flags
*/
*/
static void display_player_stat_info(player_type *creature_ptr)
{
- /* Print out the labels for the columns */
int stat_col = 22;
int row = 3;
c_put_str(TERM_WHITE, _("能力", "Stat"), row, stat_col + 1);
c_put_str(TERM_L_GREEN, _("合計", "Actual"), row, stat_col + 28);
c_put_str(TERM_YELLOW, _("現在", "Current"), row, stat_col + 35);
- /* Display the stats */
char buf[80];
for (int i = 0; i < A_MAX; i++)
{
/* This is useful to see if you are maxed out */
cnv_stat(creature_ptr->stat_max[i], buf);
if (creature_ptr->stat_max[i] == creature_ptr->stat_max_max[i])
- {
c_put_str(TERM_WHITE, "!", row + i + 1, _(stat_col + 6, stat_col + 4));
- }
c_put_str(TERM_BLUE, buf, row + i + 1, stat_col + 13 - strlen(buf));
- /* Race, class, and equipment modifiers */
(void)sprintf(buf, "%3d", r_adj);
c_put_str(TERM_L_BLUE, buf, row + i + 1, stat_col + 13);
(void)sprintf(buf, "%3d", (int)cp_ptr->c_adj[i]);
(void)sprintf(buf, "%3d", (int)e_adj);
c_put_str(TERM_L_BLUE, buf, row + i + 1, stat_col + 22);
- /* Actual maximal modified value */
cnv_stat(creature_ptr->stat_top[i], buf);
c_put_str(TERM_L_GREEN, buf, row + i + 1, stat_col + 26);
- /* Only display stat_use if not maximal */
if (creature_ptr->stat_use[i] < creature_ptr->stat_top[i])
{
cnv_stat(creature_ptr->stat_use[i], buf);
object_type *o_ptr;
o_ptr = &creature_ptr->inventory_list[i];
object_flags_known(o_ptr, flgs);
-
- /* Initialize color based of sign of pval. */
for (int stat = 0; stat < A_MAX; stat++)
{
byte a = TERM_SLATE;
char c = '.';
-
- /* Boost */
if (have_flag(flgs, stat))
{
- /* Default */
c = '*';
- /* Good */
if (o_ptr->pval > 0)
{
- /* Good */
a = TERM_L_GREEN;
-
- /* Label boost */
if (o_ptr->pval < 10) c = '0' + o_ptr->pval;
}
if (have_flag(flgs, stat + TR_SUST_STR))
{
- /* Dark green for sustained stats */
a = TERM_GREEN;
}
- /* Bad */
if (o_ptr->pval < 0)
{
- /* Bad */
a = TERM_RED;
-
- /* Label boost */
if (o_ptr->pval > -10) c = '0' - o_ptr->pval;
}
}
-
- /* Sustain */
else if (have_flag(flgs, stat + TR_SUST_STR))
{
- /* Dark green "s" */
a = TERM_GREEN;
c = 's';
}
}
player_flags(creature_ptr, flgs);
-
for (int stat = 0; stat < A_MAX; stat++)
{
byte a = TERM_SLATE;
if (creature_ptr->muta3 & MUT3_ILL_NORM) dummy = 0;
}
- /* Boost */
- if (dummy)
+ if (dummy != 0)
{
c = '*';
-
- /* Good */
if (dummy > 0)
{
/* Good */
if (dummy < 10) c = '0' + dummy;
}
- /* Bad */
if (dummy < 0)
{
- /* Bad */
a = TERM_RED;
-
- /* Label boost */
if (dummy > -10) c = '0' - dummy;
}
}
if (have_flag(flgs, stat + TR_SUST_STR))
{
- /* Dark green "s" */
a = TERM_GREEN;
c = 's';
}
char buf[80];
for (int i = 0; i < A_MAX; i++)
{
- /* Special treatment of "injured" stats */
if (creature_ptr->stat_cur[i] < creature_ptr->stat_max[i])
{
- int value;
-
- /* Use lowercase stat name */
put_str(stat_names_reduced[i], 3 + i, 53);
-
- /* Get the current stat */
- value = creature_ptr->stat_use[i];
-
- /* Obtain the current stat (modified) */
+ int value = creature_ptr->stat_use[i];
cnv_stat(value, buf);
-
- /* Display the current stat (modified) */
c_put_str(TERM_YELLOW, buf, 3 + i, 60);
-
- /* Acquire the max stat */
value = creature_ptr->stat_top[i];
-
- /* Obtain the maximum stat (modified) */
cnv_stat(value, buf);
-
- /* Display the maximum stat (modified) */
c_put_str(TERM_L_GREEN, buf, 3 + i, 67);
}
-
- /* Normal treatment of "normal" stats */
else
{
- /* Assume uppercase stat name */
put_str(stat_names[i], 3 + i, 53);
-
- /* Obtain the current stat (modified) */
cnv_stat(creature_ptr->stat_use[i], buf);
-
- /* Display the current stat (modified) */
c_put_str(TERM_L_GREEN, buf, 3 + i, 60);
}
}
}
- /* Display "history" info */
floor_type *floor_ptr = creature_ptr->current_floor_ptr;
if (mode == 0)
{
/* Bewere that INIT_ASSIGN resets the cur_num. */
init_flags = INIT_NAME_ONLY;
- process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
-
-#ifdef JP
- sprintf(statmsg, "…あなたは、クエスト「%s」で%sに殺された。", quest[floor_ptr->inside_quest].name, creature_ptr->died_from);
-#else
- sprintf(statmsg, "...You were killed by %s in the quest '%s'.", creature_ptr->died_from, quest[floor_ptr->inside_quest].name);
-#endif
- }
- else
- {
-#ifdef JP
- sprintf(statmsg, "…あなたは、%sの%d階で%sに殺された。", map_name(creature_ptr), (int)floor_ptr->dun_level, creature_ptr->died_from);
-#else
- sprintf(statmsg, "...You were killed by %s on level %d of %s.", creature_ptr->died_from, floor_ptr->dun_level, map_name(creature_ptr));
-#endif
- }
- }
- else if (current_world_ptr->character_dungeon)
- {
- if (!floor_ptr->dun_level)
- {
- sprintf(statmsg, _("…あなたは現在、 %s にいる。", "...Now, you are in %s."), map_name(creature_ptr));
- }
- else if (floor_ptr->inside_quest && is_fixed_quest_idx(floor_ptr->inside_quest))
- {
- /* Clear the text */
- /* Must be done before doing INIT_SHOW_TEXT */
- for (int i = 0; i < 10; i++)
- {
- quest_text[i][0] = '\0';
- }
-
- quest_text_line = 0;
-
- /* Get the quest text */
- init_flags = INIT_NAME_ONLY;
- process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
- sprintf(statmsg, _("…あなたは現在、 クエスト「%s」を遂行中だ。", "...Now, you are in the quest '%s'."), quest[floor_ptr->inside_quest].name);
- }
- else
- {
-#ifdef JP
- sprintf(statmsg, "…あなたは現在、 %s の %d 階で探索している。", map_name(creature_ptr), (int)floor_ptr->dun_level);
-#else
- sprintf(statmsg, "...Now, you are exploring level %d of %s.", floor_ptr->dun_level, map_name(creature_ptr));
-#endif
- }
- }
-
- if (!*statmsg) return;
-
- char temp[64 * 2];
- roff_to_buf(statmsg, 60, temp, sizeof(temp));
- char *t;
- t = temp;
- for (int i = 0; i < 2; i++)
- {
- if (t[0] == 0) return;
-
- put_str(t, i + 5 + 12, 10);
- t += strlen(t) + 1;
- }
-}
-
-
-/*!
- * @brief プレイヤーのステータス表示をファイルにダンプする
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_display_player(player_type *creature_ptr, FILE *fff)
-{
- TERM_COLOR a;
- char c;
- char buf[1024];
- display_player(creature_ptr, 0);
-
- for (TERM_LEN y = 1; y < 22; y++)
- {
- TERM_LEN x;
- for (x = 0; x < 79; x++)
- {
- (void)(Term_what(x, y, &a, &c));
- buf[x] = c;
- }
-
- buf[x] = '\0';
- while ((x > 0) && (buf[x - 1] == ' '))
- buf[--x] = '\0';
-
- fprintf(fff, _("%s\n", "%s\n"), buf);
- }
-
- display_player(creature_ptr, 1);
- for (TERM_LEN y = 10; y < 19; y++)
- {
- TERM_LEN x;
- for (x = 0; x < 79; x++)
- {
- (void)(Term_what(x, y, &a, &c));
- buf[x] = c;
- }
-
- buf[x] = '\0';
- while ((x > 0) && (buf[x - 1] == ' '))
- buf[--x] = '\0';
-
- fprintf(fff, "%s\n", buf);
- }
-
- fprintf(fff, "\n");
- display_player(creature_ptr, 2);
- for (TERM_LEN y = 2; y < 22; y++)
- {
- TERM_LEN x;
- for (x = 0; x < 79; x++)
- {
- (void)(Term_what(x, y, &a, &c));
- if (a < 128)
- buf[x] = c;
- else
- buf[x] = ' ';
- }
-
- buf[x] = '\0';
- while ((x > 0) && (buf[x - 1] == ' '))
- buf[--x] = '\0';
-
- fprintf(fff, "%s\n", buf);
- }
-
- fprintf(fff, "\n");
- display_player(creature_ptr, 3);
- for (TERM_LEN y = 1; y < 22; y++)
- {
- TERM_LEN x;
- for (x = 0; x < 79; x++)
- {
- (void)(Term_what(x, y, &a, &c));
- if (a < 128)
- buf[x] = c;
- else
- buf[x] = ' ';
- }
-
- buf[x] = '\0';
- while ((x > 0) && (buf[x - 1] == ' '))
- buf[--x] = '\0';
-
- fprintf(fff, "%s\n", buf);
- }
-
- fprintf(fff, "\n");
-}
-
-
-/*!
- * @brief プレイヤーのペット情報をファイルにダンプする
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_pet(player_type *master_ptr, FILE *fff)
-{
- bool pet = FALSE;
- bool pet_settings = FALSE;
- for (int i = master_ptr->current_floor_ptr->m_max - 1; i >= 1; i--)
- {
- monster_type *m_ptr = &master_ptr->current_floor_ptr->m_list[i];
-
- if (!monster_is_valid(m_ptr)) continue;
- if (!is_pet(m_ptr)) continue;
- pet_settings = TRUE;
- if (!m_ptr->nickname && (master_ptr->riding != i)) continue;
- if (!pet)
- {
- fprintf(fff, _("\n\n [主なペット]\n\n", "\n\n [Leading Pets]\n\n"));
- pet = TRUE;
- }
-
- GAME_TEXT pet_name[MAX_NLEN];
- monster_desc(master_ptr, pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
- fprintf(fff, "%s\n", pet_name);
- }
-
- if (!pet_settings) return;
-
- fprintf(fff, _("\n\n [ペットへの命令]\n", "\n\n [Command for Pets]\n"));
-
- fprintf(fff, _("\n ドアを開ける: %s", "\n Pets open doors: %s"),
- (master_ptr->pet_extra_flags & PF_OPEN_DOORS) ? "ON" : "OFF");
-
- fprintf(fff, _("\n アイテムを拾う: %s", "\n Pets pick up items: %s"),
- (master_ptr->pet_extra_flags & PF_PICKUP_ITEMS) ? "ON" : "OFF");
-
- fprintf(fff, _("\n テレポート系魔法を使う: %s", "\n Allow teleport: %s"),
- (master_ptr->pet_extra_flags & PF_TELEPORT) ? "ON" : "OFF");
-
- fprintf(fff, _("\n 攻撃魔法を使う: %s", "\n Allow cast attack spell: %s"),
- (master_ptr->pet_extra_flags & PF_ATTACK_SPELL) ? "ON" : "OFF");
-
- fprintf(fff, _("\n 召喚魔法を使う: %s", "\n Allow cast summon spell: %s"),
- (master_ptr->pet_extra_flags & PF_SUMMON_SPELL) ? "ON" : "OFF");
-
- fprintf(fff, _("\n プレイヤーを巻き込む範囲魔法を使う: %s", "\n Allow involve player in area spell: %s"),
- (master_ptr->pet_extra_flags & PF_BALL_SPELL) ? "ON" : "OFF");
-
- fputc('\n', fff);
-}
-
-
-/*!
- * todo ここはenum/switchで扱いたい
- * @brief プレイヤーの職業能力情報をファイルにダンプする
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_class_special(player_type *creature_ptr, FILE *fff)
-{
- bool is_special_class = creature_ptr->pclass == CLASS_MAGIC_EATER;
- is_special_class |= creature_ptr->pclass == CLASS_SMITH;
- is_special_class |= creature_ptr->pclass != CLASS_BLUE_MAGE;
- if (!is_special_class) return;
-
- if (creature_ptr->pclass == CLASS_MAGIC_EATER)
- {
- char s[EATER_EXT][MAX_NLEN];
- OBJECT_TYPE_VALUE tval = 0;
- fprintf(fff, _("\n\n [取り込んだ魔法道具]\n", "\n\n [Magic devices eaten]\n"));
-
- for (int ext = 0; ext < 3; ext++)
- {
- int eat_num = 0;
-
- /* Dump an extent name */
- switch (ext)
- {
- case 0:
- tval = TV_STAFF;
- fprintf(fff, _("\n[杖]\n", "\n[Staffs]\n"));
- break;
- case 1:
- tval = TV_WAND;
- fprintf(fff, _("\n[魔法棒]\n", "\n[Wands]\n"));
- break;
- case 2:
- tval = TV_ROD;
- fprintf(fff, _("\n[ロッド]\n", "\n[Rods]\n"));
- break;
- }
-
- /* Get magic device names that were eaten */
- for (OBJECT_SUBTYPE_VALUE i = 0; i < EATER_EXT; i++)
- {
- int idx = EATER_EXT * ext + i;
- int magic_num = creature_ptr->magic_num2[idx];
- if (!magic_num) continue;
-
- KIND_OBJECT_IDX k_idx = lookup_kind(tval, i);
- if (!k_idx) continue;
- sprintf(s[eat_num], "%23s (%2d)", (k_name + k_info[k_idx].name), magic_num);
- eat_num++;
- }
-
- /* Dump magic devices in this extent */
- if (eat_num <= 0)
- {
- fputs(_(" (なし)\n", " (none)\n"), fff);
- continue;
- }
-
- OBJECT_SUBTYPE_VALUE i;
- for (i = 0; i < eat_num; i++)
- {
- fputs(s[i], fff);
- if (i % 3 < 2) fputs(" ", fff);
- else fputs("\n", fff);
- }
-
- if (i % 3 > 0) fputs("\n", fff);
- }
-
- return;
- }
-
- if (creature_ptr->pclass == CLASS_SMITH)
- {
- int i, id[250], n = 0, row;
-
- fprintf(fff, _("\n\n [手に入れたエッセンス]\n\n", "\n\n [Get Essence]\n\n"));
- fprintf(fff, _("エッセンス 個数 エッセンス 個数 エッセンス 個数",
- "Essence Num Essence Num Essence Num "));
- for (i = 0; essence_name[i]; i++)
- {
- if (!essence_name[i][0]) continue;
- id[n] = i;
- n++;
- }
-
- row = n / 3 + 1;
-
- for (i = 0; i < row; i++)
- {
- fprintf(fff, "\n");
- fprintf(fff, "%-11s %5d ", essence_name[id[i]], (int)creature_ptr->magic_num1[id[i]]);
- if (i + row < n) fprintf(fff, "%-11s %5d ", essence_name[id[i + row]], (int)creature_ptr->magic_num1[id[i + row]]);
- if (i + row * 2 < n) fprintf(fff, "%-11s %5d", essence_name[id[i + row * 2]], (int)creature_ptr->magic_num1[id[i + row * 2]]);
- }
-
- fputs("\n", fff);
- return;
- }
-
- // Blue mage
- int l1 = 0;
- int l2 = 0;
- int spellnum[MAX_MONSPELLS];
- BIT_FLAGS f4 = 0, f5 = 0, f6 = 0;
- char p[60][80];
- int col = 0;
- bool pcol = FALSE;
-
- for (int i = 0; i < 60; i++)
- {
- p[i][0] = '\0';
- }
-
- strcat(p[col], _("\n\n [学習済みの青魔法]\n", "\n\n [Learned Blue Magic]\n"));
-
- for (int j = 1; j < 6; j++)
- {
- col++;
- set_rf_masks(&f4, &f5, &f6, j);
- switch (j)
- {
- case MONSPELL_TYPE_BOLT:
- strcat(p[col], _("\n [ボルト型]\n", "\n [Bolt Type]\n"));
- break;
-
- case MONSPELL_TYPE_BALL:
- strcat(p[col], _("\n [ボール型]\n", "\n [Ball Type]\n"));
- break;
-
- case MONSPELL_TYPE_BREATH:
- strcat(p[col], _("\n [ブレス型]\n", "\n [ Breath ]\n"));
- break;
-
- case MONSPELL_TYPE_SUMMON:
- strcat(p[col], _("\n [召喚魔法]\n", "\n [Summonning]\n"));
- break;
-
- case MONSPELL_TYPE_OTHER:
- strcat(p[col], _("\n [ その他 ]\n", "\n [Other Type]\n"));
- break;
- }
-
- int num = 0;
- for (int i = 0; i < 32; i++)
- {
- if ((0x00000001 << i) & f4) spellnum[num++] = i;
- }
-
- for (int i = 32; i < 64; i++)
- {
- if ((0x00000001 << (i - 32)) & f5) spellnum[num++] = i;
- }
-
- for (int i = 64; i < 96; i++)
- {
- if ((0x00000001 << (i - 64)) & f6) spellnum[num++] = i;
- }
-
- col++;
- pcol = FALSE;
- strcat(p[col], " ");
-
- for (int i = 0; i < num; i++)
- {
- if (creature_ptr->magic_num2[spellnum[i]] == 0) continue;
-
- pcol = TRUE;
- /* Dump blue magic */
- l1 = strlen(p[col]);
- l2 = strlen(monster_powers_short[spellnum[i]]);
- if ((l1 + l2) >= 75)
- {
- strcat(p[col], "\n");
- col++;
- strcat(p[col], " ");
- }
-
- strcat(p[col], monster_powers_short[spellnum[i]]);
- strcat(p[col], ", ");
- }
-
- if (!pcol)
- {
- strcat(p[col], _("なし", "None"));
- strcat(p[col], "\n");
- continue;
- }
-
- if (p[col][strlen(p[col]) - 2] == ',')
- {
- p[col][strlen(p[col]) - 2] = '\0';
- }
- else
- {
- p[col][strlen(p[col]) - 10] = '\0';
- }
-
- strcat(p[col], "\n");
- }
-
- for (int i = 0; i <= col; i++)
- {
- fputs(p[i], fff);
- }
-}
-
-
-/*!
- * @brief クエスト情報をファイルにダンプする
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_quest(player_type *creature_ptr, FILE *fff)
-{
- fprintf(fff, _("\n\n [クエスト情報]\n", "\n\n [Quest Information]\n"));
- QUEST_IDX *quest_num;
- C_MAKE(quest_num, max_q_idx, QUEST_IDX);
-
- for (QUEST_IDX i = 1; i < max_q_idx; i++)
- quest_num[i] = i;
- int dummy;
- ang_sort(quest_num, &dummy, max_q_idx, ang_sort_comp_quest_num, ang_sort_swap_quest_num);
-
- fputc('\n', fff);
- do_cmd_knowledge_quests_completed(creature_ptr, fff, quest_num);
- fputc('\n', fff);
- do_cmd_knowledge_quests_failed(creature_ptr, fff, quest_num);
- fputc('\n', fff);
-
- C_KILL(quest_num, max_q_idx, QUEST_IDX);
-}
-
-
-/*!
- * @brief 死の直前メッセージ並びに遺言をファイルにダンプする
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_last_message(player_type *creature_ptr, FILE *fff)
-{
- if (!creature_ptr->is_dead) return;
-
- if (!current_world_ptr->total_winner)
- {
- fprintf(fff, _("\n [死ぬ直前のメッセージ]\n\n", "\n [Last Messages]\n\n"));
- for (int i = MIN(message_num(), 30); i >= 0; i--)
- {
- fprintf(fff, "> %s\n", message_str((s16b)i));
- }
-
- fputc('\n', fff);
- return;
- }
-
- if (creature_ptr->last_message)
- {
- fprintf(fff, _("\n [*勝利*メッセージ]\n\n", "\n [*Winning* Message]\n\n"));
- fprintf(fff, " %s\n", creature_ptr->last_message);
- fputc('\n', fff);
- }
-}
-
-
-/*!
- * @brief 帰還場所情報をファイルにダンプする
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_recall(FILE *fff)
-{
- fprintf(fff, _("\n [帰還場所]\n\n", "\n [Recall Depth]\n\n"));
- for (int y = 1; y < current_world_ptr->max_d_idx; y++)
- {
- bool seiha = FALSE;
-
- if (!d_info[y].maxdepth) continue;
- if (!max_dlv[y]) continue;
- if (d_info[y].final_guardian)
- {
- if (!r_info[d_info[y].final_guardian].max_num) seiha = TRUE;
- }
- else if (max_dlv[y] == d_info[y].maxdepth) seiha = TRUE;
-
- fprintf(fff, _(" %c%-12s: %3d 階\n", " %c%-16s: level %3d\n"),
- seiha ? '!' : ' ', d_name + d_info[y].name, (int)max_dlv[y]);
- }
-}
-
-
-/*!
- * @brief オプション情報をファイルにダンプする
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_options(FILE *fff)
-{
- fprintf(fff, _("\n [オプション設定]\n", "\n [Option Settings]\n"));
- if (preserve_mode)
- fprintf(fff, _("\n 保存モード: ON", "\n Preserve Mode: ON"));
-
- else
- fprintf(fff, _("\n 保存モード: OFF", "\n Preserve Mode: OFF"));
-
- if (ironman_small_levels)
- fprintf(fff, _("\n 小さいダンジョン: ALWAYS", "\n Small Levels: ALWAYS"));
- else if (always_small_levels)
- fprintf(fff, _("\n 小さいダンジョン: ON", "\n Small Levels: ON"));
- else if (small_levels)
- fprintf(fff, _("\n 小さいダンジョン: ENABLED", "\n Small Levels: ENABLED"));
- else
- fprintf(fff, _("\n 小さいダンジョン: OFF", "\n Small Levels: OFF"));
-
- if (vanilla_town)
- fprintf(fff, _("\n 元祖の町のみ: ON", "\n Vanilla Town: ON"));
- else if (lite_town)
- fprintf(fff, _("\n 小規模な町: ON", "\n Lite Town: ON"));
-
- if (ironman_shops)
- fprintf(fff, _("\n 店なし: ON", "\n No Shops: ON"));
-
- if (ironman_downward)
- fprintf(fff, _("\n 階段を上がれない: ON", "\n Diving Only: ON"));
-
- if (ironman_rooms)
- fprintf(fff, _("\n 普通でない部屋: ON", "\n Unusual Rooms: ON"));
-
- if (ironman_nightmare)
- fprintf(fff, _("\n 悪夢モード: ON", "\n Nightmare Mode: ON"));
-
- if (ironman_empty_levels)
- fprintf(fff, _("\n アリーナ: ALWAYS", "\n Arena Levels: ALWAYS"));
- else if (empty_levels)
- fprintf(fff, _("\n アリーナ: ENABLED", "\n Arena Levels: ENABLED"));
- else
- fprintf(fff, _("\n アリーナ: OFF", "\n Arena Levels: OFF"));
-
- fputc('\n', fff);
-
- if (current_world_ptr->noscore)
- fprintf(fff, _("\n 何か不正なことをしてしまっています。\n", "\n You have done something illegal.\n"));
-
- fputc('\n', fff);
-}
-
-
-/*!
- * @brief 闘技場の情報をファイルにダンプする
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_arena(player_type *creature_ptr, FILE *fff)
-{
- if (lite_town || vanilla_town) return;
-
- if (creature_ptr->arena_number < 0)
- {
- if (creature_ptr->arena_number <= ARENA_DEFEATED_OLD_VER)
- {
- fprintf(fff, _("\n 闘技場: 敗北\n", "\n Arena: Defeated\n"));
- }
- else
- {
-#ifdef JP
- fprintf(fff, "\n 闘技場: %d回戦で%sの前に敗北\n", -creature_ptr->arena_number,
- r_name + r_info[arena_info[-1 - creature_ptr->arena_number].r_idx].name);
-#else
- fprintf(fff, "\n Arena: Defeated by %s in the %d%s fight\n",
- r_name + r_info[arena_info[-1 - creature_ptr->arena_number].r_idx].name,
- -creature_ptr->arena_number, get_ordinal_number_suffix(-creature_ptr->arena_number));
-#endif
- }
-
- fprintf(fff, "\n");
- return;
- }
-
- if (creature_ptr->arena_number > MAX_ARENA_MONS + 2)
- {
- fprintf(fff, _("\n 闘技場: 真のチャンピオン\n", "\n Arena: True Champion\n"));
- fprintf(fff, "\n");
- return;
- }
-
- if (creature_ptr->arena_number > MAX_ARENA_MONS - 1)
- {
- fprintf(fff, _("\n 闘技場: チャンピオン\n", "\n Arena: Champion\n"));
- fprintf(fff, "\n");
- return;
- }
-
-#ifdef JP
- fprintf(fff, "\n 闘技場: %2d勝\n", (creature_ptr->arena_number > MAX_ARENA_MONS ? MAX_ARENA_MONS : creature_ptr->arena_number));
-#else
- fprintf(fff, "\n Arena: %2d Victor%s\n", (creature_ptr->arena_number > MAX_ARENA_MONS ? MAX_ARENA_MONS : creature_ptr->arena_number), (creature_ptr->arena_number > 1) ? "ies" : "y");
-#endif
- fprintf(fff, "\n");
-}
-
-
-/*!
- * @brief 撃破モンスターの情報をファイルにダンプする
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_monsters(FILE *fff)
-{
- fprintf(fff, _("\n [倒したモンスター]\n\n", "\n [Defeated Monsters]\n\n"));
-
- /* Allocate the "who" array */
- MONRACE_IDX *who;
- u16b why = 2;
- C_MAKE(who, max_r_idx, MONRACE_IDX);
-
- /* Count monster kills */
- long uniq_total = 0;
- long norm_total = 0;
- for (IDX k = 1; k < max_r_idx; k++)
- {
- /* Ignore unused index */
- monster_race *r_ptr = &r_info[k];
- if (!r_ptr->name) continue;
-
- if (r_ptr->flags1 & RF1_UNIQUE)
- {
- bool dead = (r_ptr->max_num == 0);
- if (dead)
- {
- norm_total++;
-
- /* Add a unique monster to the list */
- who[uniq_total++] = k;
- }
-
- continue;
- }
-
- if (r_ptr->r_pkills > 0)
- {
- norm_total += r_ptr->r_pkills;
- }
- }
-
- /* No monsters is defeated */
- if (norm_total < 1)
- {
- fprintf(fff, _("まだ敵を倒していません。\n", "You have defeated no enemies yet.\n"));
- C_KILL(who, max_r_idx, s16b);
- return;
- }
-
- /* Defeated more than one normal monsters */
- if (uniq_total == 0)
- {
-#ifdef JP
- fprintf(fff, "%ld体の敵を倒しています。\n", norm_total);
-#else
- fprintf(fff, "You have defeated %ld %s.\n", norm_total, norm_total == 1 ? "enemy" : "enemies");
-#endif
- C_KILL(who, max_r_idx, s16b);
- return;
- }
-
- /* Defeated more than one unique monsters */
-#ifdef JP
- fprintf(fff, "%ld体のユニーク・モンスターを含む、合計%ld体の敵を倒しています。\n", uniq_total, norm_total);
-#else
- fprintf(fff, "You have defeated %ld %s including %ld unique monster%s in total.\n", norm_total, norm_total == 1 ? "enemy" : "enemies", uniq_total, (uniq_total == 1 ? "" : "s"));
-#endif
-
- /* Sort the array by dungeon depth of monsters */
- ang_sort(who, &why, uniq_total, ang_sort_comp_hook, ang_sort_swap_hook);
- fprintf(fff, _("\n《上位%ld体のユニーク・モンスター》\n", "\n< Unique monsters top %ld >\n"), MIN(uniq_total, 10));
-
- for (IDX k = uniq_total - 1; k >= 0 && k >= uniq_total - 10; k--)
- {
- monster_race *r_ptr = &r_info[who[k]];
- fprintf(fff, _(" %-40s (レベル%3d)\n", " %-40s (level %3d)\n"), (r_name + r_ptr->name), (int)r_ptr->level);
- }
-
- C_KILL(who, max_r_idx, s16b);
-}
-
-
-/*!
- * @brief 元種族情報をファイルにダンプする
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_race_history(player_type *creature_ptr, FILE *fff)
-{
- if (!creature_ptr->old_race1 && !creature_ptr->old_race2) return;
-
- fprintf(fff, _("\n\n あなたは%sとして生まれた。", "\n\n You were born as %s."), race_info[creature_ptr->start_race].title);
- for (int i = 0; i < MAX_RACES; i++)
- {
- if (creature_ptr->start_race == i) continue;
- if (i < 32)
- {
- if (!(creature_ptr->old_race1 & 1L << i)) continue;
- }
- else
- {
- if (!(creature_ptr->old_race2 & 1L << (i - 32))) continue;
- }
-
- fprintf(fff, _("\n あなたはかつて%sだった。", "\n You were a %s before."), race_info[i].title);
- }
-
- fputc('\n', fff);
-}
-
-
-/*!
- * @brief 元魔法領域情報をファイルにダンプする
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_realm_history(player_type *creature_ptr, FILE *fff)
-{
- if (creature_ptr->old_realm) return;
-
- fputc('\n', fff);
- for (int i = 0; i < MAX_MAGIC; i++)
- {
- if (!(creature_ptr->old_realm & 1L << i)) continue;
- fprintf(fff, _("\n あなたはかつて%s魔法を使えた。", "\n You were able to use %s magic before."), realm_names[i + 1]);
- }
-
- fputc('\n', fff);
-}
-
-
-/*!
- * @brief 徳の情報をファイルにダンプする
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_virtues(player_type *creature_ptr, FILE *fff)
-{
- fprintf(fff, _("\n\n [自分に関する情報]\n\n", "\n\n [HP-rate & Max stat & Virtues]\n\n"));
-
- int percent = (int)(((long)creature_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
- (2 * creature_ptr->hitdie +
- ((PY_MAX_LEVEL - 1 + 3) * (creature_ptr->hitdie + 1))));
-
-#ifdef JP
- if (creature_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "現在の体力ランク : %d/100\n\n", percent);
- else fprintf(fff, "現在の体力ランク : ???\n\n");
- fprintf(fff, "能力の最大値\n");
-#else
- if (creature_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
- else fprintf(fff, "Your current Life Rating is ???.\n\n");
- fprintf(fff, "Limits of maximum stats\n");
-#endif
- for (int v_nr = 0; v_nr < A_MAX; v_nr++)
- {
- if ((creature_ptr->knowledge & KNOW_STAT) || creature_ptr->stat_max[v_nr] == creature_ptr->stat_max_max[v_nr]) fprintf(fff, "%s 18/%d\n", stat_names[v_nr], creature_ptr->stat_max_max[v_nr] - 18);
- else fprintf(fff, "%s ???\n", stat_names[v_nr]);
- }
-
- fprintf(fff, _("\n属性 : %s\n", "\nYour alignment : %s\n"), your_alignment(creature_ptr));
- fprintf(fff, "\n");
- dump_virtues(creature_ptr, fff);
-}
-
-
-/*!
- * @brief 突然変異の情報をファイルにダンプする
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_mutations(player_type *creature_ptr, FILE *fff)
-{
- if (creature_ptr->muta1 || creature_ptr->muta2 || creature_ptr->muta3)
- {
- fprintf(fff, _("\n\n [突然変異]\n\n", "\n\n [Mutations]\n\n"));
- dump_mutations(creature_ptr, fff);
- }
-}
-
-
-/*!
- * @brief 所持品の情報をファイルにダンプする
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_equipment_inventory(player_type *creature_ptr, FILE *fff)
-{
- GAME_TEXT o_name[MAX_NLEN];
- if (creature_ptr->equip_cnt)
- {
- fprintf(fff, _(" [キャラクタの装備]\n\n", " [Character Equipment]\n\n"));
- for (int i = INVEN_RARM; i < INVEN_TOTAL; i++)
- {
- object_desc(creature_ptr, o_name, &creature_ptr->inventory_list[i], 0);
- if ((((i == INVEN_RARM) && creature_ptr->hidarite) || ((i == INVEN_LARM) && creature_ptr->migite)) && creature_ptr->ryoute)
- strcpy(o_name, _("(武器を両手持ち)", "(wielding with two-hands)"));
-
- fprintf(fff, "%c) %s\n",
- index_to_label(i), o_name);
- }
-
- fprintf(fff, "\n\n");
- }
-
- fprintf(fff, _(" [キャラクタの持ち物]\n\n", " [Character Inventory]\n\n"));
-
- for (int i = 0; i < INVEN_PACK; i++)
- {
- if (!creature_ptr->inventory_list[i].k_idx) break;
- object_desc(creature_ptr, o_name, &creature_ptr->inventory_list[i], 0);
- fprintf(fff, "%c) %s\n", index_to_label(i), o_name);
- }
-
- fprintf(fff, "\n\n");
-}
-
-
-/*!
- * @brief 我が家と博物館のオブジェクト情報をファイルにダンプする
- * @param fff ファイルポインタ
- * @return なし
- */
-static void dump_aux_home_museum(player_type *creature_ptr, FILE *fff)
-{
- store_type *st_ptr;
- st_ptr = &town_info[1].store[STORE_HOME];
-
- GAME_TEXT o_name[MAX_NLEN];
- if (st_ptr->stock_num)
- {
- fprintf(fff, _(" [我が家のアイテム]\n", " [Home Inventory]\n"));
+ process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
- TERM_LEN x = 1;
- for (int i = 0; i < st_ptr->stock_num; i++)
+#ifdef JP
+ sprintf(statmsg, "…あなたは、クエスト「%s」で%sに殺された。", quest[floor_ptr->inside_quest].name, creature_ptr->died_from);
+#else
+ sprintf(statmsg, "...You were killed by %s in the quest '%s'.", creature_ptr->died_from, quest[floor_ptr->inside_quest].name);
+#endif
+ }
+ else
{
- if ((i % 12) == 0)
- fprintf(fff, _("\n ( %d ページ )\n", "\n ( page %d )\n"), x++);
- object_desc(creature_ptr, o_name, &st_ptr->stock[i], 0);
- fprintf(fff, "%c) %s\n", I2A(i % 12), o_name);
+#ifdef JP
+ sprintf(statmsg, "…あなたは、%sの%d階で%sに殺された。", map_name(creature_ptr), (int)floor_ptr->dun_level, creature_ptr->died_from);
+#else
+ sprintf(statmsg, "...You were killed by %s on level %d of %s.", creature_ptr->died_from, floor_ptr->dun_level, map_name(creature_ptr));
+#endif
}
-
- fprintf(fff, "\n\n");
}
-
- st_ptr = &town_info[1].store[STORE_MUSEUM];
-
- if (st_ptr->stock_num == 0) return;
-
- fprintf(fff, _(" [博物館のアイテム]\n", " [Museum]\n"));
-
- TERM_LEN x = 1;
- for (int i = 0; i < st_ptr->stock_num; i++)
+ else if (current_world_ptr->character_dungeon)
{
+ if (!floor_ptr->dun_level)
+ {
+ sprintf(statmsg, _("…あなたは現在、 %s にいる。", "...Now, you are in %s."), map_name(creature_ptr));
+ }
+ else if (floor_ptr->inside_quest && is_fixed_quest_idx(floor_ptr->inside_quest))
+ {
+ /* Clear the text */
+ /* Must be done before doing INIT_SHOW_TEXT */
+ for (int i = 0; i < 10; i++)
+ {
+ quest_text[i][0] = '\0';
+ }
+
+ quest_text_line = 0;
+ init_flags = INIT_NAME_ONLY;
+ process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
+ sprintf(statmsg, _("…あなたは現在、 クエスト「%s」を遂行中だ。", "...Now, you are in the quest '%s'."), quest[floor_ptr->inside_quest].name);
+ }
+ else
+ {
#ifdef JP
- if ((i % 12) == 0) fprintf(fff, "\n ( %d ページ )\n", x++);
- object_desc(creature_ptr, o_name, &st_ptr->stock[i], 0);
- fprintf(fff, "%c) %s\n", I2A(i % 12), o_name);
+ sprintf(statmsg, "…あなたは現在、 %s の %d 階で探索している。", map_name(creature_ptr), (int)floor_ptr->dun_level);
#else
- if ((i % 12) == 0) fprintf(fff, "\n ( page %d )\n", x++);
- object_desc(creature_ptr, o_name, &st_ptr->stock[i], 0);
- fprintf(fff, "%c) %s\n", I2A(i % 12), o_name);
+ sprintf(statmsg, "...Now, you are exploring level %d of %s.", floor_ptr->dun_level, map_name(creature_ptr));
#endif
+ }
}
- fprintf(fff, "\n\n");
-}
+ if (!*statmsg) return;
+ char temp[64 * 2];
+ roff_to_buf(statmsg, 60, temp, sizeof(temp));
+ char *t;
+ t = temp;
+ for (int i = 0; i < 2; i++)
+ {
+ if (t[0] == 0) return;
-/*!
- * @brief ダンプ出力のメインルーチン
- * Output the character dump to a file
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff ファイルポインタ
- * @return エラーコード
- */
-errr make_character_dump(player_type *creature_ptr, FILE *fff)
-{
-#ifdef JP
- fprintf(fff, " [変愚蛮怒 %d.%d.%d キャラクタ情報]\n\n",
- FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
-#else
- fprintf(fff, " [Hengband %d.%d.%d Character Dump]\n\n",
- FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
-#endif
- update_playtime();
-
- dump_aux_display_player(creature_ptr, fff);
- dump_aux_last_message(creature_ptr, fff);
- dump_aux_options(fff);
- dump_aux_recall(fff);
- dump_aux_quest(creature_ptr, fff);
- dump_aux_arena(creature_ptr, fff);
- dump_aux_monsters(fff);
- dump_aux_virtues(creature_ptr, fff);
- dump_aux_race_history(creature_ptr, fff);
- dump_aux_realm_history(creature_ptr, fff);
- dump_aux_class_special(creature_ptr, fff);
- dump_aux_mutations(creature_ptr, fff);
- dump_aux_pet(creature_ptr, fff);
- fputs("\n\n", fff);
- dump_aux_equipment_inventory(creature_ptr, fff);
- dump_aux_home_museum(creature_ptr, fff);
-
- fprintf(fff, _(" [チェックサム: \"%s\"]\n\n", " [Check Sum: \"%s\"]\n\n"), get_check_sum());
- return 0;
+ put_str(t, i + 5 + 12, 10);
+ t += strlen(t) + 1;
+ }
}
return -1;
}
- (void)make_character_dump(creature_ptr, fff);
+ /*
+ * todo view-mainwindow への依存があるが、file_character() 自体関数ポインタなのでよそから呼び出されるので何とかするのは辛い
+ * ついでに他の関数でもview(略) は参照されているので、簡単に除去することはできない…
+ */
+ make_character_dump(creature_ptr, fff, update_playtime, display_player);
my_fclose(fff);
msg_print(_("キャラクタ情報のファイルへの書き出しに成功しました。", "Character dump successful."));
msg_print(NULL);
int bracketcol = len + 1;
int endcol = len;
concptr ptr;
-
- /* Search for a shower string in the line */
if (shower)
{
ptr = my_strstr(&lcstr[i], shower);
if (ptr) showercol = ptr - &lcstr[i];
}
- /* Search for a color segment tag */
ptr = in_tag ? my_strchr(&str[i], in_tag) : my_strstr(&str[i], tag_str);
if (ptr) bracketcol = ptr - &str[i];
-
- /* A color tag is found */
if (bracketcol < endcol) endcol = bracketcol;
-
- /* The shower string is found before the color tag */
if (showercol < endcol) endcol = showercol;
- /* Print a segment of the line */
Term_addstr(endcol, color, &str[i]);
cx += endcol;
i += endcol;
if (endcol == showercol)
{
int showerlen = strlen(shower);
-
- /* Print the shower string in yellow */
Term_addstr(showerlen, TERM_YELLOW, &str[i]);
cx += showerlen;
i += showerlen;
if (in_tag)
{
- /* Found the end of colored segment */
i++;
-
- /* Now looking for an another tag_str */
in_tag = '\0';
-
- /* Set back to the default color */
color = TERM_WHITE;
continue;
}
- /* Found a tag_str, and get a tag color */
i += sizeof(tag_str) - 1;
-
- /* Get tag color */
color = color_char_to_attr(str[i]);
-
- /* Illegal color tag */
if (color == 255 || str[i + 1] == '\0')
{
- /* Illegal color tag */
color = TERM_WHITE;
-
- /* Print the broken tag as a string */
Term_addstr(-1, TERM_WHITE, tag_str);
cx += sizeof(tag_str) - 1;
continue;
*/
bool show_file(player_type *creature_ptr, bool show_version, concptr name, concptr what, int line, BIT_FLAGS mode)
{
- int i, n, skey;
+ int i, skey;
int next = 0;
int size = 0;
int back = 0;
char buf[1024];
char hook[68][32];
bool reverse = (line < 0);
- int wid, hgt, rows;
+ int wid, hgt;
Term_get_size(&wid, &hgt);
- rows = hgt - 4;
+ int rows = hgt - 4;
strcpy(finder_str, "");
strcpy(shower_str, "");
}
strcpy(filename, name);
- n = strlen(filename);
+ int n = strlen(filename);
for (i = 0; i < n; i++)
{
}
my_fclose(fff);
- if (skey == 'q') return FALSE;
-
- return TRUE;
+ return (skey != 'q');
}
#endif
if (!savefile_base[0] && savefile[0])
{
- concptr s;
- s = savefile;
+ concptr s = savefile;
while (TRUE)
{
concptr t;
if (sf)
{
char temp[128];
-
strcpy(savefile_base, creature_ptr->base_name);
#ifdef SAVEFILE_USE_UID
/*!
- * @brief 墓石の真ん中に文字列を書き込む /
- * Centers a string within a GRAVE_LINE_WIDTH character string -JWT-
- * @return なし
- * @details
- */
-static void center_string(char *buf, concptr str)
-{
- int i = strlen(str);
- int j = GRAVE_LINE_WIDTH / 2 - i / 2;
- (void)sprintf(buf, "%*s%s%*s", j, "", str, GRAVE_LINE_WIDTH - i - j, "");
-}
-
-
-/*
- * Redefinable "print_tombstone" action
- */
-bool(*tombstone_aux)(void) = NULL;
-
-
-/*!
- * @brief 墓石のアスキーアート表示 /
- * Display a "tomb-stone"
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @return なし
- */
-void print_tomb(player_type *dead_ptr)
-{
- bool done = FALSE;
- if (tombstone_aux)
- {
- done = (*tombstone_aux)();
- }
-
- if (done) return;
-
-#ifdef JP
- int extra_line = 0;
-#endif
- Term_clear();
- char buf[1024];
- path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("dead_j.txt", "dead.txt"));
-
- FILE *fp;
- fp = my_fopen(buf, "r");
-
- if (fp)
- {
- int i = 0;
-
- /* Dump the file to the screen */
- while (my_fgets(fp, buf, sizeof(buf)) == 0)
- {
- put_str(buf, i++, 0);
- }
-
- my_fclose(fp);
- }
-
- concptr p;
- if (current_world_ptr->total_winner || (dead_ptr->lev > PY_MAX_LEVEL))
- {
-#ifdef JP
- p = "偉大なる者";
-#else
- p = "Magnificent";
-#endif
- }
- else
- {
- p = player_title[dead_ptr->pclass][(dead_ptr->lev - 1) / 5];
- }
-
- center_string(buf, dead_ptr->name);
- put_str(buf, 6, 11);
-
-#ifdef JP
-#else
- center_string(buf, "the");
- put_str(buf, 7, 11);
-#endif
-
- center_string(buf, p);
- put_str(buf, 8, 11);
-
- center_string(buf, cp_ptr->title);
- put_str(buf, 10, 11);
-
- char tmp[160];
- (void)sprintf(tmp, _("レベル: %d", "Level: %d"), (int)dead_ptr->lev);
- center_string(buf, tmp);
- put_str(buf, 11, 11);
-
- (void)sprintf(tmp, _("経験値: %ld", "Exp: %ld"), (long)dead_ptr->exp);
- center_string(buf, tmp);
- put_str(buf, 12, 11);
-
- (void)sprintf(tmp, _("所持金: %ld", "AU: %ld"), (long)dead_ptr->au);
- center_string(buf, tmp);
- put_str(buf, 13, 11);
-
-#ifdef JP
- /* 墓に刻む言葉をオリジナルより細かく表示 */
- if (streq(dead_ptr->died_from, "途中終了"))
- {
- strcpy(tmp, "<自殺>");
- }
- else if (streq(dead_ptr->died_from, "ripe"))
- {
- strcpy(tmp, "引退後に天寿を全う");
- }
- else if (streq(dead_ptr->died_from, "Seppuku"))
- {
- strcpy(tmp, "勝利の後、切腹");
- }
- else
- {
- roff_to_buf(dead_ptr->died_from, GRAVE_LINE_WIDTH + 1, tmp, sizeof tmp);
- char *t;
- t = tmp + strlen(tmp) + 1;
- if (*t)
- {
- char dummy[80];
- strcpy(dummy, t); /* 2nd line */
- if (*(t + strlen(t) + 1)) /* Does 3rd line exist? */
- {
- for (t = dummy + strlen(dummy) - 2; iskanji(*(t - 1)); t--) /* Loop */;
- strcpy(t, "…");
- }
- else if (my_strstr(tmp, "『") && suffix(dummy, "』"))
- {
- char dummy2[80];
- char *name_head = my_strstr(tmp, "『");
- sprintf(dummy2, "%s%s", name_head, dummy);
- if (strlen(dummy2) <= GRAVE_LINE_WIDTH)
- {
- strcpy(dummy, dummy2);
- *name_head = '\0';
- }
- }
- else if (my_strstr(tmp, "「") && suffix(dummy, "」"))
- {
- char dummy2[80];
- char *name_head = my_strstr(tmp, "「");
- sprintf(dummy2, "%s%s", name_head, dummy);
- if (strlen(dummy2) <= GRAVE_LINE_WIDTH)
- {
- strcpy(dummy, dummy2);
- *name_head = '\0';
- }
- }
-
- center_string(buf, dummy);
- put_str(buf, 15, 11);
- extra_line = 1;
- }
- }
-
- center_string(buf, tmp);
- put_str(buf, 14, 11);
-
- if (!streq(dead_ptr->died_from, "ripe") && !streq(dead_ptr->died_from, "Seppuku"))
- {
- if (dead_ptr->current_floor_ptr->dun_level == 0)
- {
- concptr field_name = dead_ptr->town_num ? "街" : "荒野";
- if (streq(dead_ptr->died_from, "途中終了"))
- {
- sprintf(tmp, "%sで死んだ", field_name);
- }
- else
- {
- sprintf(tmp, "に%sで殺された", field_name);
- }
- }
- else
- {
- if (streq(dead_ptr->died_from, "途中終了"))
- {
- sprintf(tmp, "地下 %d 階で死んだ", (int)dead_ptr->current_floor_ptr->dun_level);
- }
- else
- {
- sprintf(tmp, "に地下 %d 階で殺された", (int)dead_ptr->current_floor_ptr->dun_level);
- }
- }
-
- center_string(buf, tmp);
- put_str(buf, 15 + extra_line, 11);
- }
-#else
- (void)sprintf(tmp, "Killed on Level %d", dead_ptr->current_floor_ptr->dun_level);
- center_string(buf, tmp);
- put_str(buf, 14, 11);
-
- roff_to_buf(format("by %s.", dead_ptr->died_from), GRAVE_LINE_WIDTH + 1, tmp, sizeof tmp);
- center_string(buf, tmp);
- char *t;
- put_str(buf, 15, 11);
- t = tmp + strlen(tmp) + 1;
- if (*t)
- {
- char dummy[80];
- strcpy(dummy, t); /* 2nd line */
- if (*(t + strlen(t) + 1)) /* Does 3rd line exist? */
- {
- int dummy_len = strlen(dummy);
- strcpy(dummy + MIN(dummy_len, GRAVE_LINE_WIDTH - 3), "...");
- }
- center_string(buf, dummy);
- put_str(buf, 16, 11);
- }
-#endif
- time_t ct = time((time_t*)0);
- (void)sprintf(tmp, "%-.24s", ctime(&ct));
- center_string(buf, tmp);
- put_str(buf, 17, 11);
- msg_format(_("さようなら、%s!", "Goodbye, %s!"), dead_ptr->name);
-}
-
-
-/*!
- * @brief 死亡、引退時の簡易ステータス表示 /
- * Display some character info
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @return なし
- */
-void show_info(player_type *creature_ptr)
-{
- object_type *o_ptr;
- for (int i = 0; i < INVEN_TOTAL; i++)
- {
- o_ptr = &creature_ptr->inventory_list[i];
- if (!o_ptr->k_idx) continue;
-
- object_aware(creature_ptr, o_ptr);
- object_known(o_ptr);
- }
-
- store_type *st_ptr;
- for (int i = 1; i < max_towns; i++)
- {
- st_ptr = &town_info[i].store[STORE_HOME];
-
- /* Hack -- Know everything in the home */
- for (int j = 0; j < st_ptr->stock_num; j++)
- {
- o_ptr = &st_ptr->stock[j];
- if (!o_ptr->k_idx) continue;
-
- /* Aware and Known */
- object_aware(creature_ptr, o_ptr);
- object_known(o_ptr);
- }
- }
-
- creature_ptr->update |= (PU_BONUS);
- handle_stuff(creature_ptr);
- flush();
- msg_erase();
- prt(_("キャラクターの記録をファイルに書き出すことができます。", "You may now dump a character record to one or more files."), 21, 0);
- prt(_("リターンキーでキャラクターを見ます。ESCで中断します。", "Then, hit RETURN to see the character, or ESC to abort."), 22, 0);
- while (TRUE)
- {
- char out_val[160];
- put_str(_("ファイルネーム: ", "Filename: "), 23, 0);
- strcpy(out_val, "");
- if (!askfor(out_val, 60)) return;
- if (!out_val[0]) break;
- screen_save();
- (void)file_character(creature_ptr, out_val);
- screen_load();
- }
-
- update_playtime();
- display_player(creature_ptr, 0);
- prt(_("何かキーを押すとさらに情報が続きます (ESCで中断): ", "Hit any key to see more information (ESC to abort): "), 23, 0);
- if (inkey() == ESCAPE) return;
-
- if (creature_ptr->equip_cnt)
- {
- Term_clear();
- (void)show_equipment(creature_ptr, 0, USE_FULL, 0);
- prt(_("装備していたアイテム: -続く-", "You are using: -more-"), 0, 0);
- if (inkey() == ESCAPE) return;
- }
-
- if (creature_ptr->inven_cnt)
- {
- Term_clear();
- (void)show_inventory(creature_ptr, 0, USE_FULL, 0);
- prt(_("持っていたアイテム: -続く-", "You are carrying: -more-"), 0, 0);
-
- if (inkey() == ESCAPE) return;
- }
-
- for (int l = 1; l < max_towns; l++)
- {
- st_ptr = &town_info[l].store[STORE_HOME];
- if (st_ptr->stock_num == 0) continue;
- for (int i = 0, k = 0; i < st_ptr->stock_num; k++)
- {
- Term_clear();
- for (int j = 0; (j < 12) && (i < st_ptr->stock_num); j++, i++)
- {
- GAME_TEXT o_name[MAX_NLEN];
- char tmp_val[80];
- o_ptr = &st_ptr->stock[i];
- sprintf(tmp_val, "%c) ", I2A(j));
- prt(tmp_val, j + 2, 4);
- object_desc(creature_ptr, o_name, o_ptr, 0);
- c_put_str(tval_to_attr[o_ptr->tval], o_name, j + 2, 7);
- }
-
- prt(format(_("我が家に置いてあったアイテム ( %d ページ): -続く-", "Your home contains (page %d): -more-"), k + 1), 0, 0);
- if (inkey() == ESCAPE) return;
- }
- }
-}
-
-
-/*!
* @brief 異常発生時のゲーム緊急終了処理 /
* Handle abrupt death of the visual system
* @param creature_ptr プレーヤーへの参照ポインタ
* @return なし
* @details
- * <pre>
* This routine is called only in very rare situations, and only
* by certain visual systems, when they experience fatal errors.
- * XXX XXX Hack -- clear the death flag when creating a HANGUP
- * save file so that player can see tombstone when restart.
- * </pre>
*/
void exit_game_panic(player_type *creature_ptr)
{
char buf[1024];
path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, _("z_info_j.raw", "z_info.raw"));
- /* Grab permissions */
safe_setuid_grab();
-
int fd = fd_open(buf, O_RDWR);
-
- /* Drop permissions */
safe_setuid_drop();
-
if (fd < 0)
{
- /* File type is "DATA" */
FILE_TYPE(FILE_TYPE_DATA);
-
- /* Grab permissions */
safe_setuid_grab();
-
- /* Create a new high score file */
fd = fd_make(buf, 0644);
-
- /* Drop permissions */
safe_setuid_drop();
}
- /* Grab permissions */
safe_setuid_grab();
-
errr err = fd_lock(fd, F_WRLCK);
-
- /* Drop permissions */
safe_setuid_drop();
-
if (err) return 1;
counts_seek(creature_ptr, fd, where, TRUE);
fd_write(fd, (char*)(&count), sizeof(u32b));
-
- /* Grab permissions */
safe_setuid_grab();
-
err = fd_lock(fd, F_UNLCK);
-
- /* Drop permissions */
safe_setuid_drop();
if (err) return 1;
(void)fd_close(fd);
-
return 0;
}
+
+
+/*!
+ * @brief 墓のアスキーアートテンプレを読み込む
+ * @param buf テンプレへのバッファ
+ * @param buf_size バッファの長さ
+ * @return なし
+ */
+void read_dead_file(char *buf, size_t buf_size)
+{
+ path_build(buf, buf_size, ANGBAND_DIR_FILE, _("dead_j.txt", "dead.txt"));
+
+ FILE *fp;
+ fp = my_fopen(buf, "r");
+ if (!fp) return;
+
+ int i = 0;
+ while (my_fgets(fp, buf, buf_size) == 0)
+ {
+ put_str(buf, i++, 0);
+ }
+
+ my_fclose(fp);
+}