void complete_quest(int quest_num)
{
- switch (quest[quest_num].type)
+ quest_type* const q_ptr = &quest[quest_num];
+
+ switch (q_ptr->type)
{
case QUEST_TYPE_RANDOM:
if (record_rand_quest) do_cmd_write_nikki(NIKKI_RAND_QUEST_C, quest_num, NULL);
break;
}
- quest[quest_num].status = QUEST_STATUS_COMPLETED;
- quest[quest_num].complev = (byte)p_ptr->lev;
+ q_ptr->status = QUEST_STATUS_COMPLETED;
+ q_ptr->complev = (byte)p_ptr->lev;
+ update_playtime();
+ q_ptr->comptime = playtime;
- if (!(quest[quest_num].flags & QUEST_FLAG_SILENT))
+ if (!(q_ptr->flags & QUEST_FLAG_SILENT))
{
msg_print(_("¥¯¥¨¥¹¥È¤òãÀ®¤·¤¿¡ª", "You just completed your quest!"));
msg_print(NULL);
*/
void check_quest_completion(monster_type *m_ptr)
{
- int i, j, y, x, ny, nx;
+ int y, x;
int quest_num;
x = m_ptr->fx;
/* Inside a quest */
- quest_num = p_ptr->inside_quest;
+ quest_num = p_ptr->inside_quest;
/* Search for an active quest on this dungeon level */
if (!quest_num)
{
+ int i;
+
for (i = max_quests - 1; i > 0; i--)
{
+ quest_type* const q_ptr = &quest[i];
+
/* Quest is not active */
- if (quest[i].status != QUEST_STATUS_TAKEN)
+ if (q_ptr->status != QUEST_STATUS_TAKEN)
continue;
/* Quest is not a dungeon quest */
- if (quest[i].flags & QUEST_FLAG_PRESET)
+ if (q_ptr->flags & QUEST_FLAG_PRESET)
continue;
/* Quest is not on this level */
- if ((quest[i].level != dun_level) &&
- (quest[i].type != QUEST_TYPE_KILL_ANY_LEVEL))
+ if ((q_ptr->level != dun_level) &&
+ (q_ptr->type != QUEST_TYPE_KILL_ANY_LEVEL))
continue;
/* Not a "kill monster" quest */
- if ((quest[i].type == QUEST_TYPE_FIND_ARTIFACT) ||
- (quest[i].type == QUEST_TYPE_FIND_EXIT))
+ if ((q_ptr->type == QUEST_TYPE_FIND_ARTIFACT) ||
+ (q_ptr->type == QUEST_TYPE_FIND_EXIT))
continue;
/* Interesting quest */
- if ((quest[i].type == QUEST_TYPE_KILL_NUMBER) ||
- (quest[i].type == QUEST_TYPE_TOWER) ||
- (quest[i].type == QUEST_TYPE_KILL_ALL))
+ if ((q_ptr->type == QUEST_TYPE_KILL_NUMBER) ||
+ (q_ptr->type == QUEST_TYPE_TOWER) ||
+ (q_ptr->type == QUEST_TYPE_KILL_ALL))
break;
/* Interesting quest */
- if (((quest[i].type == QUEST_TYPE_KILL_LEVEL) ||
- (quest[i].type == QUEST_TYPE_KILL_ANY_LEVEL) ||
- (quest[i].type == QUEST_TYPE_RANDOM)) &&
- (quest[i].r_idx == m_ptr->r_idx))
+ if (((q_ptr->type == QUEST_TYPE_KILL_LEVEL) ||
+ (q_ptr->type == QUEST_TYPE_KILL_ANY_LEVEL) ||
+ (q_ptr->type == QUEST_TYPE_RANDOM)) &&
+ (q_ptr->r_idx == m_ptr->r_idx))
break;
}
if (quest_num && (quest[quest_num].status == QUEST_STATUS_TAKEN))
{
/* Current quest */
- i = quest_num;
+ quest_type* const q_ptr = &quest[quest_num];
- switch (quest[i].type)
+ switch (q_ptr->type)
{
case QUEST_TYPE_KILL_NUMBER:
{
- quest[i].cur_num++;
+ q_ptr->cur_num++;
- if (quest[i].cur_num >= quest[i].num_mon)
+ if (q_ptr->cur_num >= q_ptr->num_mon)
{
- complete_quest(i);
+ complete_quest(quest_num);
- quest[i].cur_num = 0;
+ q_ptr->cur_num = 0;
}
break;
}
if (count_all_hostile_monsters() == 1)
{
- if (quest[i].flags & QUEST_FLAG_SILENT)
+ if (q_ptr->flags & QUEST_FLAG_SILENT)
{
- quest[i].status = QUEST_STATUS_FINISHED;
+ q_ptr->status = QUEST_STATUS_FINISHED;
}
else
{
- complete_quest(i);
+ complete_quest(quest_num);
}
}
break;
case QUEST_TYPE_RANDOM:
{
/* Only count valid monsters */
- if (quest[i].r_idx != m_ptr->r_idx)
+ if (q_ptr->r_idx != m_ptr->r_idx)
break;
- quest[i].cur_num++;
+ q_ptr->cur_num++;
- if (quest[i].cur_num >= quest[i].max_num)
+ if (q_ptr->cur_num >= q_ptr->max_num)
{
- complete_quest(i);
+ complete_quest(quest_num);
- if (!(quest[i].flags & QUEST_FLAG_PRESET))
+ if (!(q_ptr->flags & QUEST_FLAG_PRESET))
{
create_stairs = TRUE;
p_ptr->inside_quest = 0;
}
/* Finish the two main quests without rewarding */
- if ((i == QUEST_OBERON) || (i == QUEST_SERPENT))
+ if ((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT))
{
- quest[i].status = QUEST_STATUS_FINISHED;
+ q_ptr->status = QUEST_STATUS_FINISHED;
}
- if (quest[i].type == QUEST_TYPE_RANDOM)
+ if (q_ptr->type == QUEST_TYPE_RANDOM)
{
reward = TRUE;
- quest[i].status = QUEST_STATUS_FINISHED;
+ q_ptr->status = QUEST_STATUS_FINISHED;
}
}
break;
}
case QUEST_TYPE_KILL_ANY_LEVEL:
{
- quest[i].cur_num++;
- if (quest[i].cur_num >= quest[i].max_num)
+ q_ptr->cur_num++;
+ if (q_ptr->cur_num >= q_ptr->max_num)
{
- complete_quest(i);
- quest[i].cur_num = 0;
+ complete_quest(quest_num);
+ q_ptr->cur_num = 0;
}
break;
}
if (count_all_hostile_monsters() == 1)
{
- quest[i].status = QUEST_STATUS_STAGE_COMPLETED;
+ q_ptr->status = QUEST_STATUS_STAGE_COMPLETED;
if((quest[QUEST_TOWER1].status == QUEST_STATUS_STAGE_COMPLETED) &&
(quest[QUEST_TOWER2].status == QUEST_STATUS_STAGE_COMPLETED) &&
/* Create a magical staircase */
if (create_stairs)
{
+ int ny, nx;
+
/* Stagger around */
while (cave_perma_bold(y, x) || cave[y][x].o_idx || (cave[y][x].info & CAVE_OBJECT) )
{
*/
if (reward)
{
- for (j = 0; j < (dun_level / 15)+1; j++)
+ int i;
+
+ for (i = 0; i < (dun_level / 15)+1; i++)
{
/* Get local object */
q_ptr = &forge;
break;
case MON_SURTUR:
- a_idx = ART_TWILIGHT;
- chance = 66;
+ if (!one_in_(3))
+ {
+ a_idx = ART_TWILIGHT;
+ chance = 100;
+ }
+ else
+ {
+ a_idx = ART_ORB_OF_FATE;
+ chance = 100;
+ }
break;
case MON_SARUMAN:
a_idx = ART_ROBIN_HOOD;
chance = 5;
break;
+
+ case MON_KOGAN:
+ a_idx = ART_NANACHO;
+ chance = 80;
+ break;
+
}
if ((a_idx > 0) && ((randint0(100) < chance) || p_ptr->wizard))
s64b_RSHIFT(new_exp, new_exp_frac, 2);
}
}
+
+ /* Special penalty for rest_and_shoot exp scum */
+ if ((m_ptr->dealt_damage > m_ptr->max_maxhp) && (m_ptr->hp >= 0))
+ {
+ int over_damage = m_ptr->dealt_damage / m_ptr->max_maxhp;
+ if (over_damage > 32) over_damage = 32;
+
+ while (over_damage--)
+ {
+ /* 9/10 for once */
+ s64b_mul(&new_exp, &new_exp_frac, 0, 9);
+ s64b_div(&new_exp, &new_exp_frac, 0, 10);
+ }
+ }
/* Finally multiply base experience point of the monster */
s64b_mul(&new_exp, &new_exp_frac, 0, r_ptr->mexp);
bool innocent = TRUE, thief = FALSE;
int i;
int expdam;
+ int dealt_damage;
(void)COPY(&exp_mon, m_ptr, monster_type);
- if (!(r_ptr->flags7 & RF7_KILL_EXP))
- {
- expdam = (m_ptr->hp > dam) ? dam : m_ptr->hp;
- if (r_ptr->flags6 & RF6_HEAL) expdam = (expdam+1) * 2 / 3;
-
- get_exp_from_mon(expdam, &exp_mon);
+
+ expdam = (m_ptr->hp > dam) ? dam : m_ptr->hp;
- /* Genocided by chaos patron */
- if (!m_ptr->r_idx) m_idx = 0;
- }
+ get_exp_from_mon(expdam, &exp_mon);
+ /* Genocided by chaos patron */
+ if (!m_ptr->r_idx) m_idx = 0;
+
/* Redraw (later) if needed */
if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
/* Genocided by chaos patron */
if (!m_idx) return TRUE;
+
+ /* Remember dealt_damage before this attack*/
+ dealt_damage = m_ptr->dealt_damage;
/* Hurt it */
m_ptr->hp -= dam;
delete_monster_idx(m_idx);
}
- /* Prevent bug of chaos patron's reward */
- if (r_ptr->flags7 & RF7_KILL_EXP)
- get_exp_from_mon((long)exp_mon.max_maxhp*2, &exp_mon);
- else
- get_exp_from_mon(((long)exp_mon.max_maxhp+1L) * 9L / 10L, &exp_mon);
+ get_exp_from_mon((long)exp_mon.max_maxhp*2, &exp_mon);
/* Not afraid */
(*fear) = FALSE;
n++;
- while(n < temp_n) /* Skip stairs which have defferent distance */
+ /* Skip stairs which have defferent distance */
+ for (; n < temp_n; ++ n)
{
cave_type *c_ptr = &cave[temp_y[n]][temp_x[n]];
- if (ch == '>')
- {
- if (cave_have_flag_grid(c_ptr, FF_LESS) ||
- cave_have_flag_grid(c_ptr, FF_QUEST_ENTER))
- n++;
- else
- break;
- }
- else /* if (ch == '<') */
+ if (cave_have_flag_grid(c_ptr, FF_STAIRS) &&
+ cave_have_flag_grid(c_ptr, ch == '>' ? FF_MORE : FF_LESS))
{
- if (cave_have_flag_grid(c_ptr, FF_MORE) ||
- cave_have_flag_grid(c_ptr, FF_QUEST_EXIT))
- n++;
- else
- break;
+ /* Found */
+ break;
}
}