#include "spells-status.h"
#include "projection.h"
#include "spells.h"
+#include "monster.h"
/*!
* @brief モンスター回復処理
}
creature_ptr->timewalk = TRUE;
msg_print(_("「時よ!」", "You yell 'Time!'"));
+// msg_print(_("「『ザ・ワールド』!時は止まった!」", "You yell 'The World! Time has stopped!'"));
msg_print(NULL);
/* Hack */
msg_print(_("そこは水辺ではない。", "There is no fishing place."));
return FALSE;
}
- else if (grid_array[y][x].m_idx)
+ else if (current_floor_ptr->grid_array[y][x].m_idx)
{
GAME_TEXT m_name[MAX_NLEN];
- monster_desc(m_name, &m_list[grid_array[y][x].m_idx], 0);
+ monster_desc(m_name, ¤t_floor_ptr->m_list[current_floor_ptr->grid_array[y][x].m_idx], 0);
msg_format(_("%sが邪魔だ!", "%^s is stand in your way."), m_name);
free_turn(creature_ptr);
return FALSE;
creature_ptr->redraw |= (PR_STATE);
return TRUE;
}
+
+
+bool cosmic_cast_off(player_type *creature_ptr, object_type *o_ptr)
+{
+ INVENTORY_IDX inv;
+ int t;
+ OBJECT_IDX o_idx;
+ GAME_TEXT o_name[MAX_NLEN];
+ object_type forge;
+
+ /* Cast off activated item */
+ for (inv = INVEN_RARM; inv <= INVEN_FEET; inv++)
+ {
+ if (o_ptr == &inventory[inv]) break;
+ }
+ if (inv > INVEN_FEET) return FALSE;
+
+ object_copy(&forge, o_ptr);
+ inven_item_increase(inv, (0 - o_ptr->number));
+ inven_item_optimize(inv);
+ o_idx = drop_near(&forge, 0, creature_ptr->y, creature_ptr->x);
+ o_ptr = ¤t_floor_ptr->o_list[o_idx];
+
+ object_desc(o_name, o_ptr, OD_NAME_ONLY);
+ msg_format(_("%sを脱ぎ捨てた。", "You cast off %s."), o_name);
+
+ /* Get effects */
+ msg_print(_("「燃え上がれ俺の小宇宙!」", "You say, 'Burn up my cosmo!"));
+ t = 20 + randint1(20);
+ (void)set_blind(creature_ptr->blind + t);
+ (void)set_afraid(0);
+ (void)set_tim_esp(creature_ptr->tim_esp + t, FALSE);
+ (void)set_tim_regen(creature_ptr->tim_regen + t, FALSE);
+ (void)set_hero(creature_ptr->hero + t, FALSE);
+ (void)set_blessed(creature_ptr->blessed + t, FALSE);
+ (void)set_fast(creature_ptr->fast + t, FALSE);
+ (void)set_shero(creature_ptr->shero + t, FALSE);
+ if (creature_ptr->pclass == CLASS_FORCETRAINER)
+ {
+ P_PTR_KI = creature_ptr->lev * 5 + 190;
+ msg_print(_("気が爆発寸前になった。", "Your force are immediatly before explosion."));
+ }
+
+ return TRUE;
+}
+
+
+/*!
+ * @brief プレイヤーの因果混乱処理 / Apply Nexus
+ * @param m_ptr 因果混乱をプレイヤーに与えたモンスターの情報参照ポインタ
+ * @return なし
+ */
+void apply_nexus(monster_type *m_ptr)
+{
+ switch (randint1(7))
+ {
+ case 1: case 2: case 3:
+ {
+ teleport_player(200, TELEPORT_PASSIVE);
+ break;
+ }
+
+ case 4: case 5:
+ {
+ teleport_player_to(m_ptr->fy, m_ptr->fx, TELEPORT_PASSIVE);
+ break;
+ }
+
+ case 6:
+ {
+ if (randint0(100) < p_ptr->skill_sav)
+ {
+ msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
+ break;
+ }
+ teleport_level(0);
+ break;
+ }
+
+ case 7:
+ {
+ if (randint0(100) < p_ptr->skill_sav)
+ {
+ msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
+ break;
+ }
+
+ msg_print(_("体がねじれ始めた...", "Your body starts to scramble..."));
+ status_shuffle();
+ break;
+ }
+ }
+}
+
+/*!
+ * @brief プレイヤーのステータスシャッフル処理
+ * @return なし
+ */
+void status_shuffle(void)
+{
+ BASE_STATUS max1, cur1, max2, cur2;
+ int ii, jj, i;
+
+ /* Pick a pair of stats */
+ ii = randint0(A_MAX);
+ for (jj = ii; jj == ii; jj = randint0(A_MAX)) /* loop */;
+
+ max1 = p_ptr->stat_max[ii];
+ cur1 = p_ptr->stat_cur[ii];
+ max2 = p_ptr->stat_max[jj];
+ cur2 = p_ptr->stat_cur[jj];
+
+ p_ptr->stat_max[ii] = max2;
+ p_ptr->stat_cur[ii] = cur2;
+ p_ptr->stat_max[jj] = max1;
+ p_ptr->stat_cur[jj] = cur1;
+
+ for (i = 0; i < A_MAX; i++)
+ {
+ if (p_ptr->stat_max[i] > p_ptr->stat_max_max[i]) p_ptr->stat_max[i] = p_ptr->stat_max_max[i];
+ if (p_ptr->stat_cur[i] > p_ptr->stat_max_max[i]) p_ptr->stat_cur[i] = p_ptr->stat_max_max[i];
+ }
+
+ p_ptr->update |= (PU_BONUS);
+}