}
case CLASS_PALADIN:
+ case CLASS_SNIPER:
{
/* Bad sensing */
if (0 != randint0(77777L / (plev * plev + 40))) return;
case CLASS_SAMURAI:
case CLASS_CAVALRY:
case CLASS_BERSERKER:
+ case CLASS_SNIPER:
{
return;
}
/*
* Regenerate magic
+ * regen_amount: PY_REGEN_NORMAL * 2 (if resting) * 2 (if having regenarate)
*/
-static void regenmagic(int percent)
+static void regenmagic(int regen_amount)
{
- s32b new_mana;
+ s32b new_mana;
int i;
+ int dev = 30;
+ int mult = (dev + adj_mag_mana[p_ptr->stat_ind[A_INT]]); /* x1 to x2 speed bonus for recharging */
for (i = 0; i < EATER_EXT*2; i++)
{
if (!p_ptr->magic_num2[i]) continue;
if (p_ptr->magic_num1[i] == ((long)p_ptr->magic_num2[i] << 16)) continue;
- new_mana = ((long)p_ptr->magic_num2[i]+adj_mag_mana[A_INT]+13) * percent / 8;
+
+ /* Increase remaining charge number like float value */
+ new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 13)) / (dev * 8);
p_ptr->magic_num1[i] += new_mana;
/* Check maximum charge */
{
if (!p_ptr->magic_num1[i]) continue;
if (!p_ptr->magic_num2[i]) continue;
- p_ptr->magic_num1[i] -= (long)(p_ptr->magic_num2[i] * (adj_mag_mana[A_INT] + 10)) * EATER_ROD_CHARGE/16;
+
+ /* Decrease remaining period for charging */
+ new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 10) * EATER_ROD_CHARGE) / (dev * 16);
+ p_ptr->magic_num1[i] -= new_mana;
+
+ /* Check minimum remaining period for charging */
if (p_ptr->magic_num1[i] < 0) p_ptr->magic_num1[i] = 0;
wild_regen = 20;
}
{
quest[leaving_quest].status = QUEST_STATUS_FAILED;
quest[leaving_quest].complev = (byte)p_ptr->lev;
- if (quest[leaving_quest].type == QUEST_TYPE_RANDOM)
+
+ /* Additional settings */
+ switch (quest[leaving_quest].type)
{
+ case QUEST_TYPE_TOWER:
+ quest[QUEST_TOWER1].status = QUEST_STATUS_FAILED;
+ quest[QUEST_TOWER1].complev = (byte)p_ptr->lev;
+ break;
+ case QUEST_TYPE_FIND_ARTIFACT:
+ a_info[quest[leaving_quest].k_idx].gen_flags &= ~(TRG_QUESTITEM);
+ break;
+ case QUEST_TYPE_RANDOM:
r_info[quest[leaving_quest].r_idx].flags1 &= ~(RF1_QUESTOR);
- if (record_rand_quest)
- do_cmd_write_nikki(NIKKI_RAND_QUEST_F, leaving_quest, NULL);
/* Floor of random quest will be blocked */
prepare_change_floor_mode(CFM_NO_RETURN);
+ break;
+ }
+
+ /* Record finishing a quest */
+ if (quest[leaving_quest].type == QUEST_TYPE_RANDOM)
+ {
+ if (record_rand_quest) do_cmd_write_nikki(NIKKI_RAND_QUEST_F, leaving_quest, NULL);
+ }
+ else
+ {
+ if (record_fix_quest) do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL);
+ }
+ }
+}
+
+void leave_tower_check(void)
+{
+ leaving_quest = p_ptr->inside_quest;
+ /* Check for Tower Quest */
+ if (leaving_quest &&
+ (quest[leaving_quest].type == QUEST_TYPE_TOWER) &&
+ (quest[QUEST_TOWER1].status != QUEST_STATUS_COMPLETED))
+ {
+ if(quest[leaving_quest].type == QUEST_TYPE_TOWER)
+ {
+ quest[QUEST_TOWER1].status = QUEST_STATUS_FAILED;
+ quest[QUEST_TOWER1].complev = (byte)p_ptr->lev;
}
- else if (record_fix_quest)
- do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL);
}
}
static void check_music(void)
{
- magic_type *s_ptr;
+ const magic_type *s_ptr;
int spell;
s32b need_mana;
u32b need_mana_frac;
choices[number] = i;
number++;
}
+ else if ((flag == TRC_ADD_L_CURSE) || (flag == TRC_ADD_H_CURSE))
+ {
+ u32b cf = (flag == TRC_ADD_L_CURSE) ? TR_ADD_L_CURSE : TR_ADD_H_CURSE;
+ u32b flgs[4];
+ object_flags(o_ptr, flgs);
+ if (have_flag(flgs, cf))
+ {
+ choices[number] = i;
+ number++;
+ }
+ }
}
/* Choice one of them */
msg_print(NULL);
set_food(PY_FOOD_WEAK);
if (music_singing_any()) stop_singing();
+ if (hex_spelling_any()) stop_hex_spell_all();
}
if ((p_ptr->muta2 & MUT2_WALK_SHAD) &&
}
}
-
/*
* Handle curse effects once every 10 game turns
*/
dungeon_type = 0;
leave_quest_check();
+ leave_tower_check();
p_ptr->inside_quest = 0;
now_message = 0;
+ /* Sniper */
+ if ((p_ptr->pclass == CLASS_SNIPER) && (p_ptr->concent))
+ reset_concent = TRUE;
+
/* Parse the command */
switch (command_cmd)
{
else if (p_ptr->pclass == CLASS_SMITH)
do_cmd_kaji(TRUE);
else if (p_ptr->pclass == CLASS_MAGIC_EATER)
- do_cmd_magic_eater(TRUE);
+ do_cmd_magic_eater(TRUE, FALSE);
+ else if (p_ptr->pclass == CLASS_SNIPER)
+ do_cmd_snipe_browse();
else do_cmd_browse();
break;
}
else if (p_ptr->pclass == CLASS_IMITATOR)
do_cmd_mane(FALSE);
else if (p_ptr->pclass == CLASS_MAGIC_EATER)
- do_cmd_magic_eater(FALSE);
+ do_cmd_magic_eater(FALSE, FALSE);
else if (p_ptr->pclass == CLASS_SAMURAI)
do_cmd_hissatsu();
else if (p_ptr->pclass == CLASS_BLUE_MAGE)
do_cmd_cast_learned();
else if (p_ptr->pclass == CLASS_SMITH)
do_cmd_kaji(FALSE);
+ else if (p_ptr->pclass == CLASS_SNIPER)
+ do_cmd_snipe();
else
do_cmd_cast();
}
break;
}
+ /* Record/stop "Movie" */
+ case ']':
+ {
+ prepare_movie_hooks();
+ break;
+ }
+
/* Make random artifact list */
case KTRL('V'):
{
#ifdef TRAVEL
case '`':
{
- do_cmd_travel();
+ if (!p_ptr->wild_mode) do_cmd_travel();
+ if (p_ptr->special_defense & KATA_MUSOU)
+ {
+ set_action(ACTION_NONE);
+ }
break;
}
#endif
/* Handle the player song */
if (!load) check_music();
+ /* Hex - Handle the hex spells */
+ if (!load) check_hex();
+ if (!load) revenge_spell();
+
load = FALSE;
/* Fast */
break;
}
+ /* Sniper */
+ if (energy_use && reset_concent) reset_concentration(TRUE);
+
/* Handle "leaving" */
if (p_ptr->leaving) break;
}
}
#endif
+ if (browsing_movie)
+ {
+ reset_visuals();
+ browse_movie();
+ return;
+ }
+
hack_mutation = FALSE;
/* Hack -- Character is "icky" */