bool mut_gain_random(mut_pred pred) { int which = mut_gain_random_aux(pred); if (which >= 0 && !mut_present(which)) { chg_virtue(V_CHANCE, 1); return mut_gain(which); } msg_print("You feel normal."); return FALSE; }
void mut_lose_all(void) { if (mut_count(mut_unlocked_pred)) { int i; chg_virtue(V_CHANCE, -5); msg_print(T("You are cured of all mutations.", "全ての突然変異が治った。")); for (i = 0; i < MUT_FLAG_SIZE; ++i) p_ptr->muta[i] = p_ptr->muta_lock[i]; _mut_refresh(); } }
static byte extract_feeling(void) { /* Hack -- no feeling in the town */ if (!p_ptr->depth) return 0; /* Hack -- Have a special feeling sometimes */ if (good_item_flag && !preserve_mode) return 1; if (rating > 100) return 2; if (rating > 80) return 3; if (rating > 60) return 4; if (rating > 40) return 5; if (rating > 30) return 6; if (rating > 20) return 7; if (rating > 10) return 8; if (rating > 0) return 9; if ((turn - old_turn) > 50000L) chg_virtue(V_PATIENCE, 1); return 10; }
/* * Wield or wear a single item from the pack or floor */ void do_cmd_wield(void) { int i, item, slot; object_type forge; object_type *q_ptr; object_type *o_ptr; cptr act; char o_name[MAX_NLEN]; cptr q, s; int need_switch_wielding = 0; if (p_ptr->special_defense & KATA_MUSOU) { set_action(ACTION_NONE); } /* Restrict the choices */ item_tester_hook = item_tester_hook_wear; /* Get an item */ #ifdef JP q = "どれを装備しますか? "; s = "装備可能なアイテムがない。"; #else q = "Wear/Wield which item? "; s = "You have nothing you can wear or wield."; #endif if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return; /* Get the item (in the pack) */ if (item >= 0) { o_ptr = &inventory[item]; } /* Get the item (on the floor) */ else { o_ptr = &o_list[0 - item]; } /* Check the slot */ slot = wield_slot(o_ptr); /* Ugly hack! */ if ( object_is_melee_weapon(o_ptr) && p_ptr->pclass == CLASS_PSION && psion_weapon_graft() ) { msg_print("Failed! Your weapon is currently grafted to your arm!"); return; } switch (o_ptr->tval) { /* Shields and some misc. items */ case TV_CAPTURE: case TV_SHIELD: case TV_CARD: /* Dual wielding */ if (buki_motteruka(INVEN_RARM) && buki_motteruka(INVEN_LARM)) { /* Restrict the choices */ item_tester_hook = item_tester_hook_melee_weapon; item_tester_no_ryoute = TRUE; /* Choose a weapon from the equipment only */ #ifdef JP q = "どちらの武器と取り替えますか?"; s = "おっと。"; #else q = "Replace which weapon? "; s = "Oops."; #endif if (!get_item(&slot, q, s, (USE_EQUIP))) return; if (slot == INVEN_RARM) need_switch_wielding = INVEN_LARM; } else if (buki_motteruka(INVEN_LARM)) slot = INVEN_RARM; /* Both arms are already used by non-weapon */ else if (inventory[INVEN_RARM].k_idx && !object_is_melee_weapon(&inventory[INVEN_RARM]) && inventory[INVEN_LARM].k_idx && !object_is_melee_weapon(&inventory[INVEN_LARM])) { /* Restrict the choices */ item_tester_hook = item_tester_hook_mochikae; /* Choose a hand */ #ifdef JP q = "どちらの手に装備しますか?"; s = "おっと。"; #else q = "Equip which hand? "; s = "Oops."; #endif if (!get_item(&slot, q, s, (USE_EQUIP))) return; } break; /* Melee weapons */ case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: /* Asking for dual wielding */ if (slot == INVEN_LARM) { #ifdef JP if (!get_check("二刀流で戦いますか?")) slot = INVEN_RARM; #else if (!get_check("Dual wielding? ")) slot = INVEN_RARM; #endif } else if (!inventory[INVEN_RARM].k_idx && buki_motteruka(INVEN_LARM)) { #ifdef JP if (!get_check("二刀流で戦いますか?")) slot = INVEN_LARM; #else if (!get_check("Dual wielding? ")) slot = INVEN_LARM; #endif } /* Both arms are already used */ else if (inventory[INVEN_LARM].k_idx && inventory[INVEN_RARM].k_idx) { /* Restrict the choices */ item_tester_hook = item_tester_hook_mochikae; /* Choose a hand */ #ifdef JP q = "どちらの手に装備しますか?"; s = "おっと。"; #else q = "Equip which hand? "; s = "Oops."; #endif if (!get_item(&slot, q, s, (USE_EQUIP))) return; if ((slot == INVEN_LARM) && !buki_motteruka(INVEN_RARM)) need_switch_wielding = INVEN_RARM; } break; /* Rings */ case TV_RING: /* Choose a ring slot */ if (inventory[INVEN_LEFT].k_idx && inventory[INVEN_RIGHT].k_idx) { #ifdef JP q = "どちらの指輪と取り替えますか?"; #else q = "Replace which ring? "; #endif } else { #ifdef JP q = "どちらの手に装備しますか?"; #else q = "Equip which hand? "; #endif } #ifdef JP s = "おっと。"; #else s = "Oops."; #endif /* Restrict the choices */ select_ring_slot = TRUE; item_tester_no_ryoute = TRUE; if (!get_item(&slot, q, s, (USE_EQUIP))) { select_ring_slot = FALSE; return; } select_ring_slot = FALSE; break; } /* Prevent wielding into a cursed slot */ if (object_is_cursed(&inventory[slot])) { /* Describe it */ object_desc(o_name, &inventory[slot], (OD_OMIT_PREFIX | OD_NAME_ONLY)); /* Message */ #ifdef JP msg_format("%s%sは呪われているようだ。", describe_use(slot) , o_name ); #else msg_format("The %s you are %s appears to be cursed.", o_name, describe_use(slot)); #endif /* Cancel the command */ return; } if (have_flag(inventory[slot].art_flags, TR_SIGNATURE)) { object_desc(o_name, &inventory[slot], (OD_OMIT_PREFIX | OD_NAME_ONLY)); msg_format("The %s you are %s is your signature item and may not be removed.", o_name, describe_use(slot)); return; } if (confirm_wear && ((object_is_cursed(o_ptr) && object_is_known(o_ptr)) || ((o_ptr->ident & IDENT_SENSE) && (FEEL_BROKEN <= o_ptr->feeling) && (o_ptr->feeling <= FEEL_CURSED)))) { char dummy[MAX_NLEN+80]; /* Describe it */ object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); #ifdef JP sprintf(dummy, "本当に%s{呪われている}を使いますか?", o_name); #else sprintf(dummy, "Really use the %s {cursed}? ", o_name); #endif if (!get_check(dummy)) return; } if ((o_ptr->name1 == ART_STONEMASK) && object_is_known(o_ptr) && (p_ptr->prace != RACE_VAMPIRE) && (p_ptr->prace != RACE_ANDROID) && (p_ptr->pclass != CLASS_BLOOD_KNIGHT)) { char dummy[MAX_NLEN+80]; /* Describe it */ object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); #ifdef JP sprintf(dummy, "%sを装備すると吸血鬼になります。よろしいですか?", o_name); #else msg_format("%s will transforms you into a vampire permanently when equiped.", o_name); sprintf(dummy, "Do you become a vampire?"); #endif if (!get_check(dummy)) return; } if (need_switch_wielding && !object_is_cursed(&inventory[need_switch_wielding])) { object_type *slot_o_ptr = &inventory[slot]; object_type *switch_o_ptr = &inventory[need_switch_wielding]; object_type object_tmp; object_type *otmp_ptr = &object_tmp; char switch_name[MAX_NLEN]; object_desc(switch_name, switch_o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); object_copy(otmp_ptr, switch_o_ptr); object_copy(switch_o_ptr, slot_o_ptr); object_copy(slot_o_ptr, otmp_ptr); #ifdef JP msg_format("%sを%sに構えなおした。", switch_name, (slot == INVEN_RARM) ? (left_hander ? "左手" : "右手") : (left_hander ? "右手" : "左手")); #else msg_format("You wield %s at %s hand.", switch_name, (slot == INVEN_RARM) ? (left_hander ? "left" : "right") : (left_hander ? "right" : "left")); #endif slot = need_switch_wielding; } /* Check if completed a quest */ for (i = 0; i < max_quests; i++) { if ((quest[i].type == QUEST_TYPE_FIND_ARTIFACT) && (quest[i].status == QUEST_STATUS_TAKEN) && (quest[i].k_idx == o_ptr->name1 || quest[i].k_idx == o_ptr->name3)) { if (record_fix_quest) do_cmd_write_nikki(NIKKI_FIX_QUEST_C, i, NULL); quest[i].status = QUEST_STATUS_COMPLETED; quest[i].complev = (byte)p_ptr->lev; #ifdef JP msg_print("クエストを達成した!"); #else msg_print("You completed the quest!"); #endif msg_print(NULL); } } if (p_ptr->personality == PERS_MUNCHKIN) { identify_item(o_ptr); /* Auto-inscription */ autopick_alter_item(item, FALSE); } /* Take a turn */ energy_use = weaponmaster_wield_hack(o_ptr); /* Get local object */ q_ptr = &forge; /* Obtain local object */ object_copy(q_ptr, o_ptr); /* Modify quantity */ q_ptr->number = 1; /* Decrease the item (from the pack) */ if (item >= 0) { inven_item_increase(item, -1); inven_item_optimize(item); } /* Decrease the item (from the floor) */ else { floor_item_increase(0 - item, -1); floor_item_optimize(0 - item); } /* Access the wield slot */ o_ptr = &inventory[slot]; /* Take off existing item */ if (o_ptr->k_idx) { /* Take off existing item */ (void)inven_takeoff(slot, 255); } /* Wear the new stuff */ object_copy(o_ptr, q_ptr); /* Player touches it */ o_ptr->marked |= OM_TOUCHED; /* Increase the weight */ p_ptr->total_weight += q_ptr->weight; /* Increment the equip counter by hand */ equip_cnt++; #ifdef JP #define STR_WIELD_RARM "%s(%c)を右手に装備した。" #define STR_WIELD_LARM "%s(%c)を左手に装備した。" #define STR_WIELD_ARMS "%s(%c)を両手で構えた。" #else #define STR_WIELD_RARM "You are wielding %s (%c) in your right hand." #define STR_WIELD_LARM "You are wielding %s (%c) in your left hand." #define STR_WIELD_ARMS "You are wielding %s (%c) with both hands." #endif /* Where is the item now */ switch (slot) { case INVEN_RARM: if (object_allow_two_hands_wielding(o_ptr) && (empty_hands(FALSE) == EMPTY_HAND_LARM) && CAN_TWO_HANDS_WIELDING()) act = STR_WIELD_ARMS; else act = (left_hander ? STR_WIELD_LARM : STR_WIELD_RARM); break; case INVEN_LARM: if (object_allow_two_hands_wielding(o_ptr) && (empty_hands(FALSE) == EMPTY_HAND_RARM) && CAN_TWO_HANDS_WIELDING()) act = STR_WIELD_ARMS; else act = (left_hander ? STR_WIELD_RARM : STR_WIELD_LARM); break; case INVEN_BOW: #ifdef JP act = "%s(%c)を射撃用に装備した。"; #else act = "You are shooting with %s (%c)."; #endif break; case INVEN_LITE: #ifdef JP act = "%s(%c)を光源にした。"; #else act = "Your light source is %s (%c)."; #endif break; default: #ifdef JP act = "%s(%c)を装備した。"; #else act = "You are wearing %s (%c)."; #endif break; } /* Describe the result */ object_desc(o_name, o_ptr, 0); /* Message */ msg_format(act, o_name, index_to_label(slot)); /* Cursed! */ if (object_is_cursed(o_ptr)) { /* Warn the player */ #ifdef JP msg_print("うわ! すさまじく冷たい!"); #else msg_print("Oops! It feels deathly cold!"); #endif chg_virtue(V_HARMONY, -1); /* Note the curse */ o_ptr->ident |= (IDENT_SENSE); } if (o_ptr->name1 == ART_HAND_OF_VECNA) { msg_print("You chop off your own hand to wield the Hand of Vecna!"); set_cut(CUT_MORTAL_WOUND, FALSE); } if (o_ptr->name1 == ART_EYE_OF_VECNA) { msg_print("You pluck out your own eye to wield the Eye of Vecna!"); set_cut(CUT_MORTAL_WOUND, FALSE); } /* The Stone Mask make the player turn into a vampire! */ if ((o_ptr->name1 == ART_STONEMASK) && (p_ptr->prace != RACE_VAMPIRE) && (p_ptr->prace != RACE_ANDROID) && (p_ptr->pclass != CLASS_BLOOD_KNIGHT) && (p_ptr->pclass != CLASS_BLOOD_MAGE)) { /* Turn into a vampire */ change_race(RACE_VAMPIRE, ""); } /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Recalculate torch */ p_ptr->update |= (PU_TORCH); /* Recalculate mana */ p_ptr->update |= (PU_MANA); p_ptr->redraw |= (PR_EQUIPPY); /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); calc_android_exp(); }
/*! * @brief 青魔法コマンドのメインルーチン / * do_cmd_cast calls this function if the player's class is 'Blue-Mage'. * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。 */ bool do_cmd_cast_learned(void) { int n = 0; int chance; int minfail = 0; int plev = p_ptr->lev; monster_power spell; bool cast; int need_mana; /* not if confused */ if (p_ptr->confused) { msg_print(_("混乱していて唱えられない!", "You are too confused!")); return TRUE; } /* get power */ if (!get_learned_power(&n)) return FALSE; spell = monster_powers[n]; need_mana = mod_need_mana(spell.smana, 0, REALM_NONE); /* Verify "dangerous" spells */ if (need_mana > p_ptr->csp) { /* Warning */ msg_print(_("MPが足りません。", "You do not have enough mana to use this power.")); if (!over_exert) return FALSE; /* Verify */ if (!get_check(_("それでも挑戦しますか? ", "Attempt it anyway? "))) return FALSE; } /* Spell failure chance */ chance = spell.fail; /* Reduce failure rate by "effective" level adjustment */ if (plev > spell.level) chance -= 3 * (plev - spell.level); else chance += (spell.level - plev); /* Reduce failure rate by INT/WIS adjustment */ chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[A_INT]] - 1); chance = mod_spell_chance_1(chance); /* Not enough mana to cast */ if (need_mana > p_ptr->csp) { chance += 5 * (need_mana - p_ptr->csp); } /* Extract the minimum failure rate */ minfail = adj_mag_fail[p_ptr->stat_ind[A_INT]]; /* Minimum failure rate */ if (chance < minfail) chance = minfail; /* Stunning makes spells harder */ if (p_ptr->stun > 50) chance += 25; else if (p_ptr->stun) chance += 15; /* Always a 5 percent chance of working */ if (chance > 95) chance = 95; chance = mod_spell_chance_2(chance); /* Failed spell */ if (randint0(100) < chance) { if (flush_failure) flush(); msg_print(_("魔法をうまく唱えられなかった。", "You failed to concentrate hard enough!")); sound(SOUND_FAIL); if (n >= MS_S_KIN) /* Cast the spell */ cast = cast_learned_spell(n, FALSE); } else { sound(SOUND_ZAP); /* Cast the spell */ cast = cast_learned_spell(n, TRUE); if (!cast) return FALSE; } /* Sufficient mana */ if (need_mana <= p_ptr->csp) { /* Use some mana */ p_ptr->csp -= need_mana; } else { int oops = need_mana; /* No mana left */ p_ptr->csp = 0; p_ptr->csp_frac = 0; /* Message */ msg_print(_("精神を集中しすぎて気を失ってしまった!", "You faint from the effort!")); /* Hack -- Bypass free action */ (void)set_paralyzed(p_ptr->paralyzed + randint1(5 * oops + 1)); chg_virtue(V_KNOWLEDGE, -10); /* Damage CON (possibly permanently) */ if (randint0(100) < 50) { bool perm = (randint0(100) < 25); /* Message */ msg_print(_("体を悪くしてしまった!", "You have damaged your health!")); /* Reduce constitution */ (void)dec_stat(A_CON, 15 + randint1(10), perm); } } /* Take a turn */ p_ptr->energy_use = 100; /* Window stuff */ p_ptr->redraw |= (PR_MANA); p_ptr->window |= (PW_PLAYER); p_ptr->window |= (PW_SPELL); return TRUE; }