コード例 #1
0
ファイル: fear.c プロジェクト: Alkalinear/poschengband
bool fear_p_hurt_m(int m_idx, int dam)
{
    monster_type *m_ptr = &m_list[m_idx];
    monster_race *r_ptr = &r_info[m_ptr->ap_r_idx];
    bool          result = FALSE;

    /* Apply Aura of Fear to the Player for non-melee damage */
    if (!melee_hack && (r_ptr->flags2 & RF2_AURA_FEAR))
    {
        int r_level = _r_level(r_ptr);
        if (!fear_save_p(r_level))
        {
            mon_lore_2(m_ptr, RF2_AURA_FEAR);
            fear_add_p(r_level/MAX(1, m_ptr->cdis - 2));
        }
    }

    if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & (RF3_NO_FEAR)))
    {
        int percentage = (100 * m_ptr->hp) / m_ptr->maxhp;
        int n = 10;

        n = n * adj_fear_m[p_ptr->stat_ind[A_CHR]] / 100;

        if ((n >= percentage) || (dam >= m_ptr->hp && randint0(100) < 80))
        {
            if (!fear_save_m(m_ptr))
            {
                result = TRUE;
                set_monster_monfear(m_idx, randint1(10) + 20);
            }
        }
    }
    return result;
}
コード例 #2
0
ファイル: fear.c プロジェクト: Alkalinear/poschengband
/* Monster Fear */
bool fear_process_m(int m_idx)
{
    monster_type *m_ptr = &m_list[m_idx];
    if (MON_MONFEAR(m_ptr) && !MON_CSLEEP(m_ptr))
    {
        if (fear_save_m(m_ptr))
        {
            bool recovered = FALSE;
            if (fear_save_m(m_ptr))
            {
                set_monster_monfear(m_idx, 0);
                recovered = TRUE;
            }
            else
            {
            monster_race *r_ptr = &r_info[m_ptr->ap_r_idx];

                recovered = set_monster_monfear(m_idx,
                    MON_MONFEAR(m_ptr) - randint1(r_ptr->level / 20 + 1));
            }

            if (recovered && is_seen(m_ptr))
            {
                char m_name[80];
                char m_poss[80];

                monster_desc(m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE);
                monster_desc(m_name, m_ptr, 0);

                msg_format("%^s recovers %s courage.", m_name, m_poss);
            }
        }
        else if (one_in_(3) && !fear_save_m(m_ptr))
        {
            if (is_seen(m_ptr))
            {
                char m_name[80];
                monster_desc(m_name, m_ptr, 0);
                msg_format("%^s is scared stiff!", m_name);
            }
            return FALSE;
        }
    }
    return TRUE;
}
コード例 #3
0
ファイル: save.c プロジェクト: dis-/hengband
/*!
 * @brief モンスター情報を書き込む / Write a "monster" record
 * @param m_ptr モンスター情報保存元ポインタ
 * @return なし
 */
static void wr_monster(monster_type *m_ptr)
{
	u32b flags = 0x00000000;
	byte tmp8u;

	if (!is_original_ap(m_ptr)) flags |= SAVE_MON_AP_R_IDX;
	if (m_ptr->sub_align) flags |= SAVE_MON_SUB_ALIGN;
	if (MON_CSLEEP(m_ptr)) flags |= SAVE_MON_CSLEEP;
	if (MON_FAST(m_ptr)) flags |= SAVE_MON_FAST;
	if (MON_SLOW(m_ptr)) flags |= SAVE_MON_SLOW;
	if (MON_STUNNED(m_ptr)) flags |= SAVE_MON_STUNNED;
	if (MON_CONFUSED(m_ptr)) flags |= SAVE_MON_CONFUSED;
	if (MON_MONFEAR(m_ptr)) flags |= SAVE_MON_MONFEAR;
	if (m_ptr->target_y) flags |= SAVE_MON_TARGET_Y;
	if (m_ptr->target_x) flags |= SAVE_MON_TARGET_X;
	if (MON_INVULNER(m_ptr)) flags |= SAVE_MON_INVULNER;
	if (m_ptr->smart) flags |= SAVE_MON_SMART;
	if (m_ptr->exp) flags |= SAVE_MON_EXP;
	if (m_ptr->mflag2) flags |= SAVE_MON_MFLAG2;
	if (m_ptr->nickname) flags |= SAVE_MON_NICKNAME;
	if (m_ptr->parent_m_idx) flags |= SAVE_MON_PARENT;

	/*** Monster save flags ***/
	wr_u32b(flags);

	/*** Write only un-obvious elements ***/
	wr_s16b(m_ptr->r_idx);
	wr_byte(m_ptr->fy);
	wr_byte(m_ptr->fx);
	wr_s16b(m_ptr->hp);
	wr_s16b(m_ptr->maxhp);
	wr_s16b(m_ptr->max_maxhp);
	wr_u32b(m_ptr->dealt_damage);
	

	/* Monster race index of its appearance */
	if (flags & SAVE_MON_AP_R_IDX) wr_s16b(m_ptr->ap_r_idx);

	if (flags & SAVE_MON_SUB_ALIGN) wr_byte(m_ptr->sub_align);
	if (flags & SAVE_MON_CSLEEP) wr_s16b(m_ptr->mtimed[MTIMED_CSLEEP]);

	wr_byte(m_ptr->mspeed);
	wr_s16b(m_ptr->energy_need);

	if (flags & SAVE_MON_FAST)
	{
		tmp8u = (byte)m_ptr->mtimed[MTIMED_FAST];
		wr_byte(tmp8u);
	}
	if (flags & SAVE_MON_SLOW)
	{
		tmp8u = (byte)m_ptr->mtimed[MTIMED_SLOW];
		wr_byte(tmp8u);
	}
	if (flags & SAVE_MON_STUNNED)
	{
		tmp8u = (byte)m_ptr->mtimed[MTIMED_STUNNED];
		wr_byte(tmp8u);
	}
	if (flags & SAVE_MON_CONFUSED)
	{
		tmp8u = (byte)m_ptr->mtimed[MTIMED_CONFUSED];
		wr_byte(tmp8u);
	}
	if (flags & SAVE_MON_MONFEAR)
	{
		tmp8u = (byte)m_ptr->mtimed[MTIMED_MONFEAR];
		wr_byte(tmp8u);
	}
	if (flags & SAVE_MON_TARGET_Y) wr_s16b(m_ptr->target_y);
	if (flags & SAVE_MON_TARGET_X) wr_s16b(m_ptr->target_x);
	if (flags & SAVE_MON_INVULNER)
	{
		tmp8u = (byte)m_ptr->mtimed[MTIMED_INVULNER];
		wr_byte(tmp8u);
	}
	if (flags & SAVE_MON_SMART) wr_u32b(m_ptr->smart);
	if (flags & SAVE_MON_EXP) wr_u32b(m_ptr->exp);
	if (flags & SAVE_MON_MFLAG2) wr_byte(m_ptr->mflag2);
	if (flags & SAVE_MON_NICKNAME) wr_string(quark_str(m_ptr->nickname));
	if (flags & SAVE_MON_PARENT) wr_s16b(m_ptr->parent_m_idx);
}