#include "angband.h"
#include "cmd-activate.h"
#include "cmd-eat.h"
+#include "cmd-hissatsu.h"
#include "cmd-item.h"
#include "cmd-magiceat.h"
+#include "cmd-mane.h"
#include "cmd-quaff.h"
#include "cmd-read.h"
#include "cmd-smith.h"
#include "realm-hex.h"
#include "object-hook.h"
#include "wild.h"
+#include "monster-status.h"
+#include "floor-save.h"
static bool load = TRUE; /*!<ロード処理中の分岐フラグ*/
{
return;
}
-
- /* Paranoia */
if (command_arg < min_level) command_arg = (COMMAND_ARG)min_level;
-
- /* Paranoia */
if (command_arg > max_level) command_arg = (COMMAND_ARG)max_level;
/* Accept request */
monster_type *m_ptr = ¤t_floor_ptr->m_list[i];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
-
- /* Skip dead monsters */
- if (!m_ptr->r_idx) continue;
+ if (!monster_is_valid(m_ptr)) continue;
/* Allow regeneration (if needed) */
if (m_ptr->hp < m_ptr->maxhp)
if (p_ptr->levitation)
{
- msg_print(_("電撃を受けた!", "The electric shocks you!"));
+ msg_print(_("電撃を受けた!", "The electricity shocks you!"));
take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
}
if (p_ptr->levitation)
{
- msg_print(_("酸が飛び散った!", "The acid melt you!"));
+ msg_print(_("酸が飛び散った!", "The acid melts you!"));
take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
}
(void)teleport_player_aux(100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
wiz_dark();
msg_print(_("あなたは見知らぬ場所で目が醒めた...頭が痛い。", "You wake up somewhere with a sore head..."));
- msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing, or how you got here!"));
+ msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing or how you got here!"));
}
else
{
{
monster_type *m_ptr = ¤t_floor_ptr->m_list[monster];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
-
- /* Paranoia -- Skip dead monsters */
- if (!m_ptr->r_idx) continue;
+ if (!monster_is_valid(m_ptr)) continue;
if (r_ptr->level >= p_ptr->lev)
{
GAME_TEXT o_name[MAX_NLEN];
object_desc(o_name, choose_cursed_obj_name(TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
- msg_format(_("%sが動物を引き寄せた!", "Your %s have attracted an animal!"), o_name);
+ msg_format(_("%sが動物を引き寄せた!", "Your %s has attracted an animal!"), o_name);
disturb(FALSE, TRUE);
}
}
GAME_TEXT o_name[MAX_NLEN];
object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
- msg_format(_("%sが悪魔を引き寄せた!", "Your %s have attracted a demon!"), o_name);
+ msg_format(_("%sが悪魔を引き寄せた!", "Your %s has attracted a demon!"), o_name);
disturb(FALSE, TRUE);
}
}
GAME_TEXT o_name[MAX_NLEN];
object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
- msg_format(_("%sがドラゴンを引き寄せた!", "Your %s have attracted an dragon!"), o_name);
+ msg_format(_("%sがドラゴンを引き寄せた!", "Your %s has attracted an dragon!"), o_name);
disturb(FALSE, TRUE);
}
}
GAME_TEXT o_name[MAX_NLEN];
object_desc(o_name, choose_cursed_obj_name(TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY));
- msg_format(_("%sが死霊を引き寄せた!", "Your %s have attracted an undead!"), o_name);
+ msg_format(_("%sが死霊を引き寄せた!", "Your %s has attracted an undead!"), o_name);
disturb(FALSE, TRUE);
}
}
/*
* Recharge rods. Rods now use timeout to control charging status,
* and each charging rod in a stack decreases the stack's timeout by
- * one per current_world_ptr->game_turn. -LM-
+ * one per turn. -LM-
*/
for (changed = FALSE, i = 0; i < INVEN_PACK; i++)
{
monster_type *m_ptr = ¤t_floor_ptr->m_list[i];
monster_race *r_ptr;
int delta = 0;
-
- /* Skip dead monsters */
- if (!m_ptr->r_idx) continue;
+ if (!monster_is_valid(m_ptr)) continue;
/* Ignore pet */
if (is_pet(m_ptr)) continue;
if (number_mon == 0)
{
- msg_print(_("相打ちに終わりました。", "They have kill each other at the same time."));
+ msg_print(_("相打ちに終わりました。", "Nothing survived."));
msg_print(NULL);
p_ptr->energy_need = 0;
battle_monsters();
wm_ptr = ¤t_floor_ptr->m_list[win_m_idx];
monster_desc(m_name, wm_ptr, 0);
- msg_format(_("%sが勝利した!", "%s is winner!"), m_name);
+ msg_format(_("%sが勝利した!", "%s won!"), m_name);
msg_print(NULL);
if (win_m_idx == (sel_monster+1))
}
else if (current_world_ptr->game_turn - current_floor_ptr->generated_turn == 150 * TURNS_PER_TICK)
{
- msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle have ended in a draw."));
+ msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle ended in a draw."));
p_ptr->au += kakekin;
msg_print(NULL);
p_ptr->energy_need = 0;
p_ptr->enchant_energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed);
}
- /* No current_world_ptr->game_turn yet */
+ /* No turn yet */
if (p_ptr->enchant_energy_need > 0) return;
while (p_ptr->enchant_energy_need <= 0)
*/
static void process_player(void)
{
- IDX i;
+ MONSTER_IDX m_idx;
/*** Apply energy ***/
if (p_ptr->inside_battle)
{
- for(i = 1; i < m_max; i++)
+ for(m_idx = 1; m_idx < m_max; m_idx++)
{
- monster_type *m_ptr = ¤t_floor_ptr->m_list[i];
+ monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
- if (!m_ptr->r_idx) continue;
+ if (!monster_is_valid(m_ptr)) continue;
m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
- update_monster(i, FALSE);
+ update_monster(m_idx, FALSE);
}
prt_time();
}
p_ptr->energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed);
}
- /* No current_world_ptr->game_turn yet */
+ /* No turn yet */
if (p_ptr->energy_need > 0) return;
if (!command_rep) prt_time();
/* Recover fully */
(void)set_monster_csleep(p_ptr->riding, 0);
monster_desc(m_name, m_ptr, 0);
- msg_format(_("%^sを起こした。", "You have waked %s up."), m_name);
+ msg_format(_("%^sを起こした。", "You have woken %s up."), m_name);
}
if (MON_STUNNED(m_ptr))
{
GAME_TEXT m_name[MAX_NLEN];
monster_desc(m_name, m_ptr, 0);
- msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer fear."), m_name);
+ msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer afraid."), m_name);
}
}
- /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */
handle_stuff();
}
/* Hack -- cancel "lurking browse mode" */
if (!command_new) command_see = FALSE;
- /* Assume free current_world_ptr->game_turn */
+ /* Assume free turn */
free_turn(p_ptr);
if (p_ptr->inside_battle)
/* Place the cursor on the player */
move_cursor_relative(p_ptr->y, p_ptr->x);
+ if(refresh_mon_list)
+ {
+ p_ptr->window |= PW_MONSTER_LIST;
+ update_output();
+ }
+
can_save = TRUE;
/* Get a command (normal) */
request_command(FALSE);
process_command();
}
-
/* Hack -- Pack Overflow */
pack_overflow();
-
/*** Clean up ***/
/* Significant */
shimmer_monsters = FALSE;
/* Shimmer multi-hued monsters */
- for (i = 1; i < m_max; i++)
+ for (m_idx = 1; m_idx < m_max; m_idx++)
{
monster_type *m_ptr;
monster_race *r_ptr;
- /* Access monster */
- m_ptr = ¤t_floor_ptr->m_list[i];
-
- /* Skip dead monsters */
- if (!m_ptr->r_idx) continue;
+ m_ptr = ¤t_floor_ptr->m_list[m_idx];
+ if (!monster_is_valid(m_ptr)) continue;
/* Skip unseen monsters */
if (!m_ptr->ml) continue;
repair_monsters = FALSE;
/* Rotate detection flags */
- for (i = 1; i < m_max; i++)
+ for (m_idx = 1; m_idx < m_max; m_idx++)
{
monster_type *m_ptr;
-
- /* Access monster */
- m_ptr = ¤t_floor_ptr->m_list[i];
-
- /* Skip dead monsters */
- if (!m_ptr->r_idx) continue;
+ m_ptr = ¤t_floor_ptr->m_list[m_idx];
+ if (!monster_is_valid(m_ptr)) continue;
/* Nice monsters get mean */
if (m_ptr->mflag & MFLAG_NICE)
/* Assume invisible */
m_ptr->ml = FALSE;
- update_monster(i, FALSE);
+ update_monster(m_idx, FALSE);
- if (p_ptr->health_who == i) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == i) p_ptr->redraw |= (PR_UHEALTH);
+ if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
+ if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
/* Redraw regardless */
lite_spot(m_ptr->fy, m_ptr->fx);
}
if (p_ptr->pclass == CLASS_IMITATOR)
{
+ int j;
if (p_ptr->mane_num > (p_ptr->lev > 44 ? 3 : p_ptr->lev > 29 ? 2 : 1))
{
p_ptr->mane_num--;
- for (i = 0; i < p_ptr->mane_num; i++)
+ for (j = 0; j < p_ptr->mane_num; j++)
{
- p_ptr->mane_spell[i] = p_ptr->mane_spell[i+1];
- p_ptr->mane_dam[i] = p_ptr->mane_dam[i+1];
+ p_ptr->mane_spell[j] = p_ptr->mane_spell[j + 1];
+ p_ptr->mane_dam[j] = p_ptr->mane_dam[j + 1];
}
}
new_mane = FALSE;
p_ptr->redraw |= (PR_MAP);
p_ptr->update |= (PU_MONSTERS);
-
p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
p_ptr->timewalk = FALSE;
p_ptr->energy_need = ENERGY_NEED();
- /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */
handle_stuff();
}
}
character_xtra = TRUE;
p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON);
+ p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
+ p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS | PU_VIEW | PU_LITE | PU_MON_LITE | PU_TORCH | PU_MONSTERS | PU_DISTANCE | PU_FLOW);
- /* Redraw dungeon */
- p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY);
-
- p_ptr->redraw |= (PR_MAP);
-
- p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
-
- /* Update lite/view */
- p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE | PU_TORCH);
- p_ptr->update |= (PU_MONSTERS | PU_DISTANCE | PU_FLOW);
-
- /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */
handle_stuff();
/* Leave "xtra" mode */
process_player();
process_upkeep_with_speed();
- /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */
handle_stuff();
/* Hack -- Hilite the player */
}
}
- /* Hack -- current_world_ptr->game_turn off the cursor */
+ /* Hack -- turn off the cursor */
(void)Term_set_cursor(0);
/* No player? -- Try to regenerate floor */
if (!p_ptr->y || !p_ptr->x)
{
- msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location. Regenerate the dungeon floor."));
+ msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location, regenerate the dungeon floor."));
change_floor();
}
rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days;
if (current_world_ptr->game_turn > rollback_turns) current_world_ptr->game_turn -= rollback_turns;
- else current_world_ptr->game_turn = 1; /* Paranoia */
+ else current_world_ptr->game_turn = 1;
if (current_floor_ptr->generated_turn > rollback_turns) current_floor_ptr->generated_turn -= rollback_turns;
else current_floor_ptr->generated_turn = 1;
if (old_battle > rollback_turns) old_battle -= rollback_turns;
}
}
}
+
+/*!
+ * @brief ゲーム終了処理 /
+ * Close up the current game (player may or may not be dead)
+ * @return なし
+ * @details
+ * <pre>
+ * This function is called only from "main.c" and "signals.c".
+ * </pre>
+ */
+void close_game(void)
+{
+ char buf[1024];
+ bool do_send = TRUE;
+
+ /* concptr p = "[i:キャラクタの情報, f:ファイル書き出し, t:スコア, x:*鑑定*, ESC:ゲーム終了]"; */
+ handle_stuff();
+
+ /* Flush the messages */
+ msg_print(NULL);
+
+ /* Flush the input */
+ flush();
+
+
+ /* No suspending now */
+ signals_ignore_tstp();
+
+
+ /* Hack -- Character is now "icky" */
+ character_icky = TRUE;
+
+
+ /* Build the filename */
+ path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
+
+ /* Grab permissions */
+ safe_setuid_grab();
+
+ /* Open the high score file, for reading/writing */
+ highscore_fd = fd_open(buf, O_RDWR);
+
+ /* Drop permissions */
+ safe_setuid_drop();
+
+ /* Handle death */
+ if (p_ptr->is_dead)
+ {
+ /* Handle retirement */
+ if (p_ptr->total_winner) kingly();
+
+ /* Save memories */
+ if (!cheat_save || get_check(_("死んだデータをセーブしますか? ", "Save death? ")))
+ {
+ if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!"));
+ }
+ else do_send = FALSE;
+
+ /* You are dead */
+ print_tomb();
+
+ flush();
+
+ /* Show more info */
+ show_info();
+ Term_clear();
+
+ if (check_score())
+ {
+ if ((!send_world_score(do_send)))
+ {
+ if (get_check_strict(_("後でスコアを登録するために待機しますか?", "Stand by for later score registration? "),
+ (CHECK_NO_ESCAPE | CHECK_NO_HISTORY)))
+ {
+ p_ptr->wait_report_score = TRUE;
+ p_ptr->is_dead = FALSE;
+ if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!"));
+ }
+ }
+ if (!p_ptr->wait_report_score)
+ (void)top_twenty();
+ }
+ else if (highscore_fd >= 0)
+ {
+ display_scores_aux(0, 10, -1, NULL);
+ }
+#if 0
+ /* Dump bones file */
+ make_bones();
+#endif
+ }
+
+ /* Still alive */
+ else
+ {
+ /* Save the game */
+ do_cmd_save_game(FALSE);
+
+ /* Prompt for scores */
+ prt(_("リターンキーか ESC キーを押して下さい。", "Press Return (or Escape)."), 0, 40);
+ play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_EXIT);
+
+ /* Predict score (or ESCAPE) */
+ if (inkey() != ESCAPE) predict_score();
+ }
+
+
+ /* Shut the high score file */
+ (void)fd_close(highscore_fd);
+
+ /* Forget the high score fd */
+ highscore_fd = -1;
+
+ /* Kill all temporary files */
+ clear_saved_floor_files();
+
+ /* Allow suspending now */
+ signals_handle_tstp();
+}