/* * Generates a random dungeon level -RAK- * * Hack -- regenerate any "overflow" levels */ void generate_cave(void) { int num; /* Fill the arrays of floors and walls in the good proportions */ set_floor_and_wall(dungeon_type); /* Generate */ for (num = 0; TRUE; num++) { bool okay = TRUE; cptr why = NULL; clear_cave(); /* Build the arena -KMW- */ if (p_ptr->inside_arena) { arena_gen(); } /* Build the battle -KMW- */ else if (p_ptr->inside_battle) { battle_gen(); } /* Enter a special quest level from the wilderness (QUEST_ENTER(id)) */ else if (enter_quest) { quests_generate(enter_quest); enter_quest = 0; } /* Build the town */ else if (!dun_level) { /* Make the wilderness */ if (p_ptr->wild_mode) wilderness_gen_small(); else wilderness_gen(); } /* Build a real level, possibly a quest level. * The quest level might want to generate itself * or it might simply need to 'place quest monsters' */ else { quest_ptr q; quests_on_generate(dungeon_type, dun_level); q = quests_get_current(); if (q && (q->flags & QF_GENERATE)) quest_generate(q); else { okay = level_gen(&why); if (okay && q) okay = quest_post_generate(q); } } if (o_max >= max_o_idx) { why = "too many objects"; okay = FALSE; } else if (m_max >= max_m_idx) { why = "too many monsters"; okay = FALSE; } if (okay) break; if (why) msg_format("Generation restarted (%s)", why); wipe_o_list(); wipe_m_list(); } glow_deep_lava_and_bldg(); p_ptr->enter_dungeon = FALSE; wipe_generate_cave_flags(); #if 0 wiz_lite(FALSE); detect_all(255); if (1) { int i, ct = 0; char buf[MAX_NLEN]; for (i = 0; i < max_o_idx; i++) { if (!o_list[i].k_idx) continue; ct++; identify_item(&o_list[i]); o_list[i].ident |= IDENT_MENTAL; if (o_list[i].name1 || o_list[i].name2) { object_desc(buf, &o_list[i], 0); msg_print(buf); } } msg_format("Objects=%d", ct); } { int i; int lvl = 0, ct = 0, uniques = 0, ct_drops = 0; for (i = 1; i < max_m_idx; i++) { monster_type *m_ptr = &m_list[i]; monster_race *r_ptr; if (!m_ptr->r_idx) continue; r_ptr = real_r_ptr(m_ptr); ct++; ct_drops += m_ptr->drop_ct; lvl += r_ptr->level; if (r_ptr->flags1 & RF1_UNIQUE) uniques++; } msg_format("DL=%d, Monsters=%d, Drops=%d, <ML>= %d, Uniques=%d", dun_level, ct, ct_drops, lvl/MAX(ct, 1), uniques); for (i = 0; i < ct_drops; i++) { object_type forge; char buf[MAX_NLEN]; make_object(&forge, 0); /* TODO: DROP_GOOD? */ /*if (forge.name1 || forge.name2)*/ if (forge.curse_flags) { identify_item(&forge); forge.ident |= IDENT_MENTAL; object_desc(buf, &forge, 0); msg_print(buf); } } } #endif }
/* * 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(); }
void read_scroll(void) { short ch; object *obj; char msg[DCOLS]; if(blind) { message("You can't see to read the scroll.",0); return; } ch = pack_letter("Read what?", SCROLL); if (ch == ROGUE_KEY_CANCEL) { return; } if (!(obj = get_letter_object(ch))) { message("No such item.", 0); return; } if (obj->what_is != SCROLL) { message("You can't read that!", 0); return; } switch(obj->which_kind) { case SCARE_MONSTER: message("You hear a maniacal laughter in the distance.", 0); break; case HOLD_MONSTER: hold_monster(); break; case ENCH_WEAPON: if (rogue.weapon) { if (rogue.weapon->what_is == WEAPON) { sprintf(msg, "Your %sglow%s %sfor a moment.", name_of(rogue.weapon), ((rogue.weapon->quantity <= 1) ? "s" : ""), get_ench_color()); message(msg, 0); if (coin_toss()) { rogue.weapon->hit_enchant++; } else { rogue.weapon->d_enchant++; } } rogue.weapon->is_cursed = 0; } else { message("Your hands tingle.", 0); } break; case ENCH_ARMOR: if (rogue.armor) { sprintf(msg, "Your armor glows %sfor a moment.", get_ench_color()); message(msg, 0); rogue.armor->d_enchant++; rogue.armor->is_cursed = 0; print_stats(STAT_ARMOR); } else { message("Your skin crawls.", 0); } break; case IDENTIFY: message("This is a scroll of identify.", 0); obj->identified = 1; id_scrolls[obj->which_kind].id_status = IDENTIFIED; identify_item(0) ; break; case TELEPORT: tele(); /* (zerogue 0.4.0) The first time a rogue uses this scroll, * he is briefly confused. */ if( ! obj->identified && id_scrolls[obj->which_kind].id_status != IDENTIFIED ) confused += get_rand(0,5) ; break; case SLEEP: sleepify(obj) ; break ; case PROTECT_ARMOR: if (rogue.armor) { message("Your armor is covered by a shimmering gold shield.", 0); rogue.armor->is_protected = 1; rogue.armor->is_cursed = 0; } else { message("Your acne seems to have disappeared.", 0); } break; case REMOVE_CURSE: message((!halluc) ? "You feel as though someone is watching over you." : "You feel in touch with the universal oneness.", 0); uncurse_all(); break; case CREATE_MONSTER: /* (zerogue 0.4.0) A summoned monster is briefly confused. */ create_monster(1) ; break; case AGGRAVATE_MONSTER: aggravate(); break; case MAGIC_MAPPING: message("This scroll seems to have a map on it.", 0); draw_magic_map(); break; } if (id_scrolls[obj->which_kind].id_status != CALLED) { id_scrolls[obj->which_kind].id_status = IDENTIFIED; } vanish(obj, (obj->which_kind != SLEEP), &rogue.pack); }