X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fbldg.c;h=73175860d3d0927ed02f77777943e6bdac904a2c;hb=b87eb07f1d5fe0bc3923868e2609b966a9c68a44;hp=c07ef6affa87b29824c6d8285c8485c035b7ae6c;hpb=ad7d76ed388686c6869d7e3d0467122e23f87f7e;p=hengband%2Fhengband.git diff --git a/src/bldg.c b/src/bldg.c index c07ef6aff..73175860d 100644 --- a/src/bldg.c +++ b/src/bldg.c @@ -16,9 +16,6 @@ /* hack as in leave_store in store.c */ static bool leave_bldg = FALSE; -/* remember building location */ -static int building_loc = 0; - static bool is_owner(building_type *bldg) { if (bldg->member_class[p_ptr->pclass] == BUILDING_OWNER) @@ -132,9 +129,9 @@ static void show_building(building_type* bldg) { action_color = TERM_YELLOW; #ifdef JP -sprintf(buff, "($%ld)", bldg->member_costs[i]); +sprintf(buff, "($%ld)", (long int)bldg->member_costs[i]); #else - sprintf(buff, "(%ldgp)", bldg->member_costs[i]); + sprintf(buff, "(%ldgp)", (long int)bldg->member_costs[i]); #endif } @@ -142,9 +139,9 @@ sprintf(buff, "($%ld)", bldg->member_costs[i]); { action_color = TERM_YELLOW; #ifdef JP -sprintf(buff, "($%ld)", bldg->other_costs[i]); +sprintf(buff, "($%ld)", (long int)bldg->other_costs[i]); #else - sprintf(buff, "(%ldgp)", bldg->other_costs[i]); + sprintf(buff, "(%ldgp)", (long int)bldg->other_costs[i]); #endif } @@ -171,9 +168,9 @@ strcpy(buff, "( { action_color = TERM_YELLOW; #ifdef JP -sprintf(buff, "($%ld)", bldg->member_costs[i]); +sprintf(buff, "($%ld)", (long int)bldg->member_costs[i]); #else - sprintf(buff, "(%ldgp)", bldg->member_costs[i]); + sprintf(buff, "(%ldgp)", (long int)bldg->member_costs[i]); #endif } @@ -181,9 +178,9 @@ sprintf(buff, "($%ld)", bldg->member_costs[i]); { action_color = TERM_YELLOW; #ifdef JP -sprintf(buff, "($%ld)", bldg->other_costs[i]); +sprintf(buff, "($%ld)", (long int)bldg->other_costs[i]); #else - sprintf(buff, "(%ldgp)", bldg->other_costs[i]); + sprintf(buff, "(%ldgp)", (long int)bldg->other_costs[i]); #endif } @@ -204,9 +201,9 @@ strcpy(buff, "( { action_color = TERM_YELLOW; #ifdef JP -sprintf(buff, "($%ld)", bldg->member_costs[i]); +sprintf(buff, "($%ld)", (long int)bldg->member_costs[i]); #else - sprintf(buff, "(%ldgp)", bldg->member_costs[i]); + sprintf(buff, "(%ldgp)", (long int)bldg->member_costs[i]); #endif } @@ -285,10 +282,13 @@ msg_print(" if (get_check("Do you fight? ")) #endif { - p_ptr->leftbldg = TRUE; - p_ptr->inside_arena = TRUE; p_ptr->exit_bldg = FALSE; reset_tim_flags(); + + /* Save the surface floor as saved floor */ + prepare_change_floor_mode(CFM_SAVE_FLOORS); + + p_ptr->inside_arena = TRUE; p_ptr->leaving = TRUE; leave_bldg = TRUE; } @@ -324,10 +324,13 @@ msg_print(" } else { - p_ptr->leftbldg = TRUE; - p_ptr->inside_arena = TRUE; p_ptr->exit_bldg = FALSE; reset_tim_flags(); + + /* Save the surface floor as saved floor */ + prepare_change_floor_mode(CFM_SAVE_FLOORS); + + p_ptr->inside_arena = TRUE; p_ptr->leaving = TRUE; leave_bldg = TRUE; } @@ -350,7 +353,7 @@ msg_print(" } else { - r_ptr = &r_info[arena_monsters[p_ptr->arena_number]]; + r_ptr = &r_info[arena_info[p_ptr->arena_number].r_idx]; name = (r_name + r_ptr->name); #ifdef JP msg_format("%s ¤ËÄ©À魯¤ë¤â¤Î¤Ï¤¤¤Ê¤¤¤«¡©", name); @@ -644,7 +647,7 @@ static int yaku_check_straight(void) joker_is_used = FALSE; for (i = 0; i < 5; i++) { - if (!find_card_num(lowest + i)){ + if (!find_card_num(lowest + i)){ if( have_joker() && !joker_is_used ) joker_is_used = TRUE; else @@ -1267,9 +1270,9 @@ static bool gamble_comm(int cmd) /* Get the wager */ strcpy(out_val, ""); #ifdef JP -sprintf(tmp_str,"ÅÒ¤±¶â (1-%ld)¡©", maxbet); +sprintf(tmp_str,"ÅÒ¤±¶â (1-%ld)¡©", (long int)maxbet); #else - sprintf(tmp_str,"Your wager (1-%ld) ? ", maxbet); + sprintf(tmp_str,"Your wager (1-%ld) ? ", (long int)maxbet); #endif @@ -1300,9 +1303,9 @@ msg_print(" else if (wager > maxbet) { #ifdef JP -msg_format("%ld¥´¡¼¥ë¥É¤À¤±¼õ¤±¤è¤¦¡£»Ä¤ê¤Ï¼è¤Ã¤È¤­¤Ê¡£", maxbet); +msg_format("%ld¥´¡¼¥ë¥É¤À¤±¼õ¤±¤è¤¦¡£»Ä¤ê¤Ï¼è¤Ã¤È¤­¤Ê¡£", (long int)maxbet); #else - msg_format("I'll take %ld gold of that. Keep the rest.", maxbet); + msg_format("I'll take %ld gold of that. Keep the rest.", (long int)maxbet); #endif wager = maxbet; @@ -1324,17 +1327,17 @@ msg_print(" oldgold = p_ptr->au; #ifdef JP -sprintf(tmp_str, "¥²¡¼¥àÁ°¤Î½ê»ý¶â: %9ld", oldgold); +sprintf(tmp_str, "¥²¡¼¥àÁ°¤Î½ê»ý¶â: %9ld", (long int)oldgold); #else - sprintf(tmp_str, "Gold before game: %9ld", oldgold); + sprintf(tmp_str, "Gold before game: %9ld", (long int)oldgold); #endif prt(tmp_str, 20, 2); #ifdef JP -sprintf(tmp_str, "¸½ºß¤Î³Ý¤±¶â: %9ld", wager); +sprintf(tmp_str, "¸½ºß¤Î³Ý¤±¶â: %9ld", (long int)wager); #else - sprintf(tmp_str, "Current Wager: %9ld", wager); + sprintf(tmp_str, "Current Wager: %9ld", (long int)wager); #endif prt(tmp_str, 21, 2); @@ -1603,9 +1606,9 @@ prt(" prt("", 17, 37); } #ifdef JP -sprintf(tmp_str, "¸½ºß¤Î½ê»ý¶â: %9ld", p_ptr->au); +sprintf(tmp_str, "¸½ºß¤Î½ê»ý¶â: %9ld", (long int)p_ptr->au); #else - sprintf(tmp_str, "Current Gold: %9ld", p_ptr->au); + sprintf(tmp_str, "Current Gold: %9ld", (long int)p_ptr->au); #endif prt(tmp_str, 22, 2); @@ -1672,11 +1675,11 @@ static bool vault_aux_battle(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline town monsters */ -/* if (!monster_dungeon(r_idx)) return FALSE; */ +/* if (!mon_hook_dungeon(r_idx)) return FALSE; */ /* Decline unique monsters */ /* if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); */ -/* if (r_ptr->flags7 & (RF7_UNIQUE_7)) return (FALSE); */ +/* if (r_ptr->flags7 & (RF7_NAZGUL)) return (FALSE); */ if (r_ptr->flags1 & (RF1_NEVER_MOVE)) return (FALSE); if (r_ptr->flags2 & (RF2_MULTIPLY)) return (FALSE); @@ -1752,7 +1755,7 @@ void battle_monsters(void) for (i=0;i<4;i++) { monster_race *r_ptr = &r_info[battle_mon[i]]; - int num_taisei = count_bits(r_ptr->flags3 & (RF3_IM_ACID | RF3_IM_ELEC | RF3_IM_FIRE | RF3_IM_COLD | RF3_IM_POIS)); + int num_taisei = count_bits(r_ptr->flagsr & (RFR_IM_ACID | RFR_IM_ELEC | RFR_IM_FIRE | RFR_IM_COLD | RFR_IM_POIS)); if (r_ptr->flags1 & RF1_FORCE_MAXHP) power[i] = r_ptr->hdice * r_ptr->hside * 2; @@ -1806,7 +1809,7 @@ void battle_monsters(void) case MON_SHADOWLORD: case MON_ARCHLICH: case MON_BLEYS: - case MON_CAIN: + case MON_CAINE: case MON_JULIAN: case MON_VENOM_WYRM: case MON_MASTER_MYS: @@ -1834,7 +1837,7 @@ void battle_monsters(void) case MON_BAZOOKER: case MON_GCWADL: case MON_KIRIN: - case MON_HOUOU: + case MON_FENGHUANG: power[i] = power[i] * 4 / 3; break; case MON_UMBER_HULK: @@ -1842,7 +1845,7 @@ void battle_monsters(void) case MON_WATER_VOR: case MON_COLD_VOR: case MON_ENERGY_VOR: - case MON_BARNEY: + case MON_GACHAPIN: case MON_REVENANT: case MON_NEXUS_VOR: case MON_PLASMA_VOR: @@ -1957,9 +1960,9 @@ static bool kakutoujou(void) monster_race *r_ptr = &r_info[battle_mon[i]]; #ifdef JP - sprintf(buf,"%d) %-58s %4ld.%02ldÇÜ", i+1, format("%s%s",r_name + r_ptr->name, (r_ptr->flags1 & RF1_UNIQUE) ? "¤â¤É¤­" : " "), mon_odds[i]/100, mon_odds[i]%100); + sprintf(buf,"%d) %-58s %4ld.%02ldÇÜ", i+1, format("%s%s",r_name + r_ptr->name, (r_ptr->flags1 & RF1_UNIQUE) ? "¤â¤É¤­" : " "), (long int)mon_odds[i]/100, (long int)mon_odds[i]%100); #else - sprintf(buf,"%d) %-58s %4ld.%02ld", i+1, format("%s%s", (r_ptr->flags1 & RF1_UNIQUE) ? "Fake " : "", r_name + r_ptr->name), mon_odds[i]/100, mon_odds[i]%100); + sprintf(buf,"%d) %-58s %4ld.%02ld", i+1, format("%s%s", (r_ptr->flags1 & RF1_UNIQUE) ? "Fake " : "", r_name + r_ptr->name), (long int)mon_odds[i]/100, (long int)mon_odds[i]%100); #endif prt(buf, 5+i, 1); } @@ -1999,9 +2002,9 @@ static bool kakutoujou(void) /* Get the wager */ strcpy(out_val, ""); #ifdef JP -sprintf(tmp_str,"ÅÒ¤±¶â (1-%ld)¡©", maxbet); +sprintf(tmp_str,"ÅÒ¤±¶â (1-%ld)¡©", (long int)maxbet); #else - sprintf(tmp_str,"Your wager (1-%ld) ? ", maxbet); + sprintf(tmp_str,"Your wager (1-%ld) ? ", (long int)maxbet); #endif @@ -2032,9 +2035,9 @@ msg_print(" else if (wager > maxbet) { #ifdef JP -msg_format("%ld¥´¡¼¥ë¥É¤À¤±¼õ¤±¤è¤¦¡£»Ä¤ê¤Ï¼è¤Ã¤È¤­¤Ê¡£", maxbet); +msg_format("%ld¥´¡¼¥ë¥É¤À¤±¼õ¤±¤è¤¦¡£»Ä¤ê¤Ï¼è¤Ã¤È¤­¤Ê¡£", (long int)maxbet); #else - msg_format("I'll take %ld gold of that. Keep the rest.", maxbet); + msg_format("I'll take %ld gold of that. Keep the rest.",(long int) maxbet); #endif wager = maxbet; @@ -2054,10 +2057,14 @@ msg_print(" battle_odds = MAX(wager+1, wager * battle_odds / 100); kakekin = wager; p_ptr->au -= wager; - p_ptr->leftbldg = TRUE; - p_ptr->inside_battle = TRUE; reset_tim_flags(); + + /* Save the surface floor as saved floor */ + prepare_change_floor_mode(CFM_SAVE_FLOORS); + + p_ptr->inside_battle = TRUE; p_ptr->leaving = TRUE; + leave_bldg = TRUE; screen_load(); @@ -2127,7 +2134,7 @@ static void shoukinkubi(void) clear_bldg(4,18); #ifdef JP - prt("»àÂΤò»ý¤Áµ¢¤ë¤È¾Þ¶â¤òº¹¤·¾å¤²¤Þ¤¹¡£",4 ,10); + prt("»àÂΤò»ý¤Áµ¢¤ì¤ÐÊó½·¤òº¹¤·¾å¤²¤Þ¤¹¡£",4 ,10); c_put_str(TERM_YELLOW, "¸½ºß¤Î¾Þ¶â¼ó", 6, 10); #else prt("Offer a prize when you bring a wanted monster's corpse",4 ,10); @@ -2136,22 +2143,27 @@ c_put_str(TERM_YELLOW, "Wanted monsters", 6, 10); for (i = 0; i < MAX_KUBI; i++) { - char buf[160]; + byte color; + cptr done_mark; monster_race *r_ptr = &r_info[(kubi_r_idx[i] > 10000 ? kubi_r_idx[i] - 10000 : kubi_r_idx[i])]; - sprintf(buf,"%-40s ---- ",r_name + r_ptr->name); - prt(buf, y+7, 10); if (kubi_r_idx[i] > 10000) + { + color = TERM_RED; #ifdef JP - c_put_str(TERM_RED,"ºÑ", y+7, 56); + done_mark = "(ºÑ)"; #else - c_put_str(TERM_RED,"done", y+7, 56); + done_mark = "(done)"; #endif + } else { - sprintf(buf,"$%d", 300 * (r_ptr->level + 1)); - prt(buf, y+7, 56); + color = TERM_WHITE; + done_mark = ""; } + + c_prt(color, format("%s %s", r_name + r_ptr->name, done_mark), y+7, 10); + y = (y+1) % 10; if (!y && (i < MAX_KUBI -1)) { @@ -2167,6 +2179,40 @@ c_put_str(TERM_YELLOW, "Wanted monsters", 6, 10); } } + +/* List of prize object */ +static struct { + s16b tval; + s16b sval; +} prize_list[MAX_KUBI] = +{ + {TV_POTION, SV_POTION_CURING}, + {TV_POTION, SV_POTION_SPEED}, + {TV_POTION, SV_POTION_SPEED}, + {TV_POTION, SV_POTION_RESISTANCE}, + {TV_POTION, SV_POTION_ENLIGHTENMENT}, + + {TV_POTION, SV_POTION_HEALING}, + {TV_POTION, SV_POTION_RESTORE_MANA}, + {TV_SCROLL, SV_SCROLL_STAR_DESTRUCTION}, + {TV_POTION, SV_POTION_STAR_ENLIGHTENMENT}, + {TV_SCROLL, SV_SCROLL_SUMMON_PET}, + + {TV_SCROLL, SV_SCROLL_GENOCIDE}, + {TV_POTION, SV_POTION_STAR_HEALING}, + {TV_POTION, SV_POTION_STAR_HEALING}, + {TV_POTION, SV_POTION_NEW_LIFE}, + {TV_SCROLL, SV_SCROLL_MASS_GENOCIDE}, + + {TV_POTION, SV_POTION_LIFE}, + {TV_POTION, SV_POTION_LIFE}, + {TV_POTION, SV_POTION_AUGMENTATION}, + {TV_POTION, SV_POTION_INVULNERABILITY}, + {TV_SCROLL, SV_SCROLL_ARTIFACT}, +}; + + +/* Get prize */ static bool kankin(void) { int i, j; @@ -2174,13 +2220,16 @@ static bool kankin(void) char o_name[MAX_NLEN]; object_type *o_ptr; - for (i = 0;i <= INVEN_LARM; i++) + /* Loop for inventory and right/left arm */ + for (i = 0; i <= INVEN_LARM; i++) { o_ptr = &inventory[i]; + + /* Living Tsuchinoko worthes $1000000 */ if ((o_ptr->tval == TV_CAPTURE) && (o_ptr->pval == MON_TSUCHINOKO)) { char buf[MAX_NLEN+20]; - object_desc(o_name, o_ptr, TRUE, 3); + object_desc(o_name, o_ptr, 0); #ifdef JP sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name); #else @@ -2189,9 +2238,9 @@ static bool kankin(void) if (get_check(buf)) { #ifdef JP - msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", 1000000L * o_ptr->number); + msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (long int)(1000000L * o_ptr->number)); #else - msg_format("You get %ldgp.", 1000000L * o_ptr->number); + msg_format("You get %ldgp.", (long int)(1000000L * o_ptr->number)); #endif p_ptr->au += 1000000L * o_ptr->number; p_ptr->redraw |= (PR_GOLD); @@ -2202,13 +2251,16 @@ static bool kankin(void) change = TRUE; } } - for (i = 0;i <= INVEN_LARM; i++) + + for (i = 0; i < INVEN_PACK; i++) { o_ptr = &inventory[i]; + + /* Corpse of Tsuchinoko worthes $200000 */ if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == MON_TSUCHINOKO)) { char buf[MAX_NLEN+20]; - object_desc(o_name, o_ptr, TRUE, 3); + object_desc(o_name, o_ptr, 0); #ifdef JP sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name); #else @@ -2217,9 +2269,9 @@ static bool kankin(void) if (get_check(buf)) { #ifdef JP - msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", 200000L * o_ptr->number); + msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (long int)(200000L * o_ptr->number)); #else - msg_format("You get %ldgp.", 200000L * o_ptr->number); + msg_format("You get %ldgp.", (long int)(200000L * o_ptr->number)); #endif p_ptr->au += 200000L * o_ptr->number; p_ptr->redraw |= (PR_GOLD); @@ -2230,13 +2282,16 @@ static bool kankin(void) change = TRUE; } } - for (i = 0;i <= INVEN_LARM; i++) + + for (i = 0; i < INVEN_PACK; i++) { o_ptr = &inventory[i]; + + /* Bones of Tsuchinoko worthes $100000 */ if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (o_ptr->pval == MON_TSUCHINOKO)) { char buf[MAX_NLEN+20]; - object_desc(o_name, o_ptr, TRUE, 3); + object_desc(o_name, o_ptr, 0); #ifdef JP sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name); #else @@ -2245,9 +2300,9 @@ static bool kankin(void) if (get_check(buf)) { #ifdef JP - msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", 100000L * o_ptr->number); + msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (long int)(100000L * o_ptr->number)); #else - msg_format("You get %ldgp.", 100000L * o_ptr->number); + msg_format("You get %ldgp.", (long int)(100000L * o_ptr->number)); #endif p_ptr->au += 100000L * o_ptr->number; p_ptr->redraw |= (PR_GOLD); @@ -2259,13 +2314,13 @@ static bool kankin(void) } } - for (i = 0;i <= INVEN_LARM; i++) + for (i = 0; i < INVEN_PACK; i++) { o_ptr = &inventory[i]; - if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == today_mon)) + if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[today_mon].name))) { char buf[MAX_NLEN+20]; - object_desc(o_name, o_ptr, TRUE, 3); + object_desc(o_name, o_ptr, 0); #ifdef JP sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name); #else @@ -2274,9 +2329,9 @@ static bool kankin(void) if (get_check(buf)) { #ifdef JP - msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[today_mon].level * 50 + 100) * o_ptr->number); + msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (long int)((r_info[today_mon].level * 50 + 100) * o_ptr->number)); #else - msg_format("You get %ldgp.", (r_info[today_mon].level * 50 + 100) * o_ptr->number); + msg_format("You get %ldgp.", (long int)((r_info[today_mon].level * 50 + 100) * o_ptr->number)); #endif p_ptr->au += (r_info[today_mon].level * 50 + 100) * o_ptr->number; p_ptr->redraw |= (PR_GOLD); @@ -2287,13 +2342,15 @@ static bool kankin(void) change = TRUE; } } - for (i = 0;i <= INVEN_LARM; i++) + + for (i = 0; i < INVEN_PACK; i++) { o_ptr = &inventory[i]; - if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (o_ptr->pval == today_mon)) + + if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[today_mon].name))) { char buf[MAX_NLEN+20]; - object_desc(o_name, o_ptr, TRUE, 3); + object_desc(o_name, o_ptr, 0); #ifdef JP sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name); #else @@ -2302,9 +2359,9 @@ static bool kankin(void) if (get_check(buf)) { #ifdef JP - msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[today_mon].level * 30 + 60) * o_ptr->number); + msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (long int)((r_info[today_mon].level * 30 + 60) * o_ptr->number)); #else - msg_format("You get %ldgp.", (r_info[today_mon].level * 30 + 60) * o_ptr->number); + msg_format("You get %ldgp.", (long int)((r_info[today_mon].level * 30 + 60) * o_ptr->number)); #endif p_ptr->au += (r_info[today_mon].level * 30 + 60) * o_ptr->number; p_ptr->redraw |= (PR_GOLD); @@ -2318,33 +2375,90 @@ static bool kankin(void) for (j = 0; j < MAX_KUBI; j++) { - for (i = 0;i <= INVEN_LARM; i++) + /* Need reverse order --- Positions will be changed in the loop */ + for (i = INVEN_PACK-1; i >= 0; i--) { o_ptr = &inventory[i]; - if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == kubi_r_idx[j])) + if ((o_ptr->tval == TV_CORPSE) && (o_ptr->pval == kubi_r_idx[j])) { char buf[MAX_NLEN+20]; - object_desc(o_name, o_ptr, TRUE, 3); + int num, k, item_new; + object_type forge; + + object_desc(o_name, o_ptr, 0); #ifdef JP - sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name); + sprintf(buf, "%s¤òÅϤ·¤Þ¤¹¤«¡©",o_name); #else - sprintf(buf, "Convert %s into money? ",o_name); + sprintf(buf, "Hand %s over? ",o_name); #endif - if (get_check(buf)) - { + if (!get_check(buf)) continue; + +#if 0 /* Obsoleted */ #ifdef JP - msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number); + msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number); #else - msg_format("You get %ldgp.", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number); + msg_format("You get %ldgp.", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number); #endif - p_ptr->au += (r_info[kubi_r_idx[j]].level+1) * 300 * o_ptr->number; - p_ptr->redraw |= (PR_GOLD); - inven_item_increase(i, -o_ptr->number); - inven_item_describe(i); - inven_item_optimize(i); - chg_virtue(V_JUSTICE, 5); - kubi_r_idx[j] += 10000; + p_ptr->au += (r_info[kubi_r_idx[j]].level+1) * 300 * o_ptr->number; + p_ptr->redraw |= (PR_GOLD); + inven_item_increase(i, -o_ptr->number); + inven_item_describe(i); + inven_item_optimize(i); + chg_virtue(V_JUSTICE, 5); + kubi_r_idx[j] += 10000; + + change = TRUE; +#endif /* Obsoleted */ + + /* Hand it first */ + inven_item_increase(i, -o_ptr->number); + inven_item_describe(i); + inven_item_optimize(i); + + chg_virtue(V_JUSTICE, 5); + kubi_r_idx[j] += 10000; + + /* Count number of unique corpses already handed */ + for (num = 0, k = 0; k < MAX_KUBI; k++) + { + if (kubi_r_idx[k] >= 10000) num++; } + +#ifdef JP + msg_format("¤³¤ì¤Ç¹ç·× %d ¥Ý¥¤¥ó¥È³ÍÆÀ¤·¤Þ¤·¤¿¡£", num); +#else + msg_format("You earned %d point%s total.", num, (num > 1 ? "s" : "")); +#endif + + /* Prepare to make a prize */ + object_prep(&forge, lookup_kind(prize_list[num-1].tval, prize_list[num-1].sval)); + apply_magic(&forge, object_level, AM_NO_FIXED_ART); + + /* Identify it fully */ + object_aware(&forge); + object_known(&forge); + + /* + * Hand it --- Assume there is an empty slot. + * Since a corpse is handed at first, + * there is at least one empty slot. + */ + item_new = inven_carry(&forge); + + /* Describe the object */ + object_desc(o_name, &forge, 0); +#ifdef JP + msg_format("%s(%c)¤òÌã¤Ã¤¿¡£", o_name, index_to_label(item_new)); +#else + msg_format("You get %s (%c). ", o_name, index_to_label(item_new)); +#endif + + /* Auto-inscription */ + autopick_alter_item(item_new, FALSE); + + /* Handle stuff */ + handle_stuff(); + change = TRUE; } } @@ -2381,49 +2495,33 @@ bool get_nightmare(int r_idx) void have_nightmare(int r_idx) { bool happened = FALSE; - - int power = 100; - monster_race *r_ptr = &r_info[r_idx]; - + int power = r_ptr->level + 10; char m_name[80]; cptr desc = r_name + r_ptr->name; - - power = r_ptr->level + 10; - -#ifdef JP - if (0) -#else + /* Describe it */ +#ifndef JP if (!(r_ptr->flags1 & RF1_UNIQUE)) -#endif - - { - /* Describe it */ sprintf(m_name, "%s %s", (is_a_vowel(desc[0]) ? "an" : "a"), desc); - - if (r_ptr->flags1 & RF1_FRIENDS) - { - power /= 2; - } - } else - { - /* Describe it */ +#endif sprintf(m_name, "%s", desc); - power *= 2; + if (!(r_ptr->flags1 & RF1_UNIQUE)) + { + if (r_ptr->flags1 & RF1_FRIENDS) power /= 2; } + else power *= 2; if (saving_throw(p_ptr->skill_sav * 100 / power)) { #ifdef JP - msg_format("Ì´¤ÎÃæ¤Ç%s¤ËÄɤ¤¤«¤±¤é¤ì¤¿¡£", m_name); + msg_format("Ì´¤ÎÃæ¤Ç%s¤ËÄɤ¤¤«¤±¤é¤ì¤¿¡£", m_name); #else - msg_format("%^s chases you through your dreams.", m_name); + msg_format("%^s chases you through your dreams.", m_name); #endif - /* Safe */ return; } @@ -2432,7 +2530,7 @@ void have_nightmare(int r_idx) { /* Something silly happens... */ #ifdef JP -msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª", + msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª", #else msg_format("You behold the %s visage of %s!", #endif @@ -2451,7 +2549,7 @@ msg_format("%s%s /* Something frightening happens... */ #ifdef JP -msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª", + msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª", #else msg_format("You behold the %s visage of %s!", #endif @@ -2460,19 +2558,33 @@ msg_format("%s%s r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR; - switch(p_ptr->prace) + if (!p_ptr->mimic_form) { - /* Imps may make a saving throw */ + switch (p_ptr->prace) + { + /* Demons may make a saving throw */ case RACE_IMP: case RACE_DEMON: - { if (saving_throw(20 + p_ptr->lev)) return; - } + break; /* Undead may make a saving throw */ case RACE_SKELETON: case RACE_ZOMBIE: case RACE_SPECTRE: case RACE_VAMPIRE: + if (saving_throw(10 + p_ptr->lev)) return; + break; + } + } + else + { + /* Demons may make a saving throw */ + if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON) + { + if (saving_throw(20 + p_ptr->lev)) return; + } + /* Undead may make a saving throw */ + else if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_UNDEAD) { if (saving_throw(10 + p_ptr->lev)) return; } @@ -2668,11 +2780,19 @@ msg_print(" */ static bool inn_comm(int cmd) { - int dawnval; - switch (cmd) { case BACT_FOOD: /* Buy food & drink */ + if (p_ptr->food >= PY_FOOD_FULL) + { +#ifdef JP + msg_print("º£¤ÏËþÊ¢¤À¡£"); +#else + msg_print("You are full now."); +#endif + return FALSE; + } + #ifdef JP msg_print("¥Ð¡¼¥Æ¥ó¤Ï¤¤¤¯¤é¤«¤Î¿©¤Ùʪ¤È¥Ó¡¼¥ë¤ò¤¯¤ì¤¿¡£"); #else @@ -2683,121 +2803,119 @@ msg_print(" break; case BACT_REST: /* Rest for the night */ - dawnval = ((turn % (TURNS_PER_TICK * TOWN_DAWN))); - if (dawnval > (TURNS_PER_TICK * TOWN_DAWN)/4) - { /* nighttime */ - if ((p_ptr->poisoned) || (p_ptr->cut)) - { + if ((p_ptr->poisoned) || (p_ptr->cut)) + { #ifdef JP -msg_print("¤¢¤Ê¤¿¤ËɬÍפʤΤÏÉô²°¤Ç¤Ï¤Ê¤¯¡¢¼£ÎżԤǤ¹¡£"); + msg_print("¤¢¤Ê¤¿¤ËɬÍפʤΤÏÉô²°¤Ç¤Ï¤Ê¤¯¡¢¼£ÎżԤǤ¹¡£"); #else - msg_print("You need a healer, not a room."); + msg_print("You need a healer, not a room."); #endif - msg_print(NULL); + msg_print(NULL); #ifdef JP -msg_print("¤¹¤ß¤Þ¤»¤ó¡¢¤Ç¤â¤¦¤Á¤Ç狼¤Ë»à¤Ê¤ì¤Á¤ãº¤¤ê¤Þ¤¹¤ó¤Ç¡£"); + msg_print("¤¹¤ß¤Þ¤»¤ó¡¢¤Ç¤â¤¦¤Á¤Ç狼¤Ë»à¤Ê¤ì¤Á¤ãº¤¤ê¤Þ¤¹¤ó¤Ç¡£"); #else - msg_print("Sorry, but don't want anyone dying in here."); + msg_print("Sorry, but don't want anyone dying in here."); #endif + } + else + { + s32b oldturn = turn; + int prev_day, prev_hour, prev_min; - } - else - { - int oldturn = turn; + extract_day_hour_min(&prev_day, &prev_hour, &prev_min); #ifdef JP - do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "½É²°¤ËÇñ¤Þ¤Ã¤¿¡£"); + do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "½É²°¤ËÇñ¤Þ¤Ã¤¿¡£"); #else - do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "stay over night at the inn"); + if ((prev_hour >= 6) && (prev_hour <= 17)) do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "stay over daytime at the inn."); + else do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "stay over night at the inn."); #endif - turn = (turn / (TURNS_PER_TICK*TOWN_DAWN/2) + 1) * (TURNS_PER_TICK*TOWN_DAWN/2); - if (((oldturn + TURNS_PER_TICK * TOWN_DAWN / 4) % (TURNS_PER_TICK * TOWN_DAWN)) > TURNS_PER_TICK * TOWN_DAWN/4) do_cmd_write_nikki(NIKKI_HIGAWARI, 0, NULL); - p_ptr->chp = p_ptr->mhp; + turn = (turn / (TURNS_PER_TICK*TOWN_DAWN/2) + 1) * (TURNS_PER_TICK*TOWN_DAWN/2); + if (dungeon_turn < dungeon_turn_limit) + { + dungeon_turn += MIN(turn - oldturn, TURNS_PER_TICK * 250); + if (dungeon_turn > dungeon_turn_limit) dungeon_turn = dungeon_turn_limit; + } - dungeon_turn += MIN(turn - oldturn, TURNS_PER_TICK*250); + prevent_turn_overflow(); - if (ironman_nightmare) - { + if ((prev_hour >= 18) && (prev_hour <= 23)) do_cmd_write_nikki(NIKKI_HIGAWARI, 0, NULL); + p_ptr->chp = p_ptr->mhp; + + if (ironman_nightmare) + { #ifdef JP -msg_print("̲¤ê¤Ë½¢¤¯¤È¶²¤í¤·¤¤¸÷·Ê¤¬¿´¤ò¤è¤®¤Ã¤¿¡£"); + msg_print("̲¤ê¤Ë½¢¤¯¤È¶²¤í¤·¤¤¸÷·Ê¤¬¿´¤ò¤è¤®¤Ã¤¿¡£"); #else - msg_print("Horrible visions flit through your mind as you sleep."); + msg_print("Horrible visions flit through your mind as you sleep."); #endif + /* Pick a nightmare */ + get_mon_num_prep(get_nightmare, NULL); - /* Pick a nightmare */ - get_mon_num_prep(get_nightmare, NULL); - - /* Have some nightmares */ - while(1) - { - have_nightmare(get_mon_num(MAX_DEPTH)); + /* Have some nightmares */ + while(1) + { + have_nightmare(get_mon_num(MAX_DEPTH)); - if (!one_in_(3)) break; - } + if (!one_in_(3)) break; + } - /* Remove the monster restriction */ - get_mon_num_prep(NULL, NULL); + /* Remove the monster restriction */ + get_mon_num_prep(NULL, NULL); #ifdef JP -msg_print("¤¢¤Ê¤¿¤ÏÀ䶫¤·¤ÆÌܤò³Ð¤Þ¤·¤¿¡£"); + msg_print("¤¢¤Ê¤¿¤ÏÀ䶫¤·¤ÆÌܤò³Ð¤Þ¤·¤¿¡£"); + do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "°­Ì´¤Ë¤¦¤Ê¤µ¤ì¤Æ¤è¤¯Ì²¤ì¤Ê¤«¤Ã¤¿¡£"); #else - msg_print("You awake screaming."); + msg_print("You awake screaming."); + do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "be troubled by a nightmare."); #endif + } + else + { + set_blind(0); + set_confused(0); + p_ptr->stun = 0; + p_ptr->chp = p_ptr->mhp; + p_ptr->csp = p_ptr->msp; + if (p_ptr->pclass == CLASS_MAGIC_EATER) + { + int i; + for (i = 0; i < 72; i++) + { + p_ptr->magic_num1[i] = p_ptr->magic_num2[i]*EATER_CHARGE; + } + for (; i < 108; i++) + { + p_ptr->magic_num1[i] = 0; + } + } + if ((prev_hour >= 6) && (prev_hour <= 17)) + { #ifdef JP - do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "°­Ì´¤Ë¤¦¤Ê¤µ¤ì¤Æ¤è¤¯Ì²¤ì¤Ê¤«¤Ã¤¿¡£"); + msg_print("¤¢¤Ê¤¿¤Ï¥ê¥Õ¥ì¥Ã¥·¥å¤·¤ÆÌܳФᡢͼÊý¤ò·Þ¤¨¤¿¡£"); + do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "ͼÊý¤ò·Þ¤¨¤¿¡£"); #else - do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "be troubled by a nightmare."); + msg_print("You awake refreshed for the evening."); + do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "awake refreshed."); #endif } else { - set_blind(0); - set_confused(0); - p_ptr->stun = 0; - p_ptr->chp = p_ptr->mhp; - p_ptr->csp = p_ptr->msp; - if (p_ptr->pclass == CLASS_MAGIC_EATER) - { - int i; - for (i = 0; i < 72; i++) - { - p_ptr->magic_num1[i] = p_ptr->magic_num2[i]*EATER_CHARGE; - } - for (; i < 108; i++) - { - p_ptr->magic_num1[i] = 0; - } - } - #ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¥ê¥Õ¥ì¥Ã¥·¥å¤·¤ÆÌܳФᡢ¿·¤¿¤ÊÆü¤ò·Þ¤¨¤¿¡£"); + msg_print("¤¢¤Ê¤¿¤Ï¥ê¥Õ¥ì¥Ã¥·¥å¤·¤ÆÌܳФᡢ¿·¤¿¤ÊÆü¤ò·Þ¤¨¤¿¡£"); + do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "¤¹¤¬¤¹¤¬¤·¤¤Ä«¤ò·Þ¤¨¤¿¡£"); #else msg_print("You awake refreshed for the new day."); -#endif - -#ifdef JP - do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "¤¹¤¬¤¹¤¬¤·¤¤Ä«¤ò¤à¤«¤¨¤¿¡£"); -#else do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "awake refreshed."); #endif } - - p_ptr->leftbldg = TRUE; } } - else - { -#ifdef JP -msg_print("Éô²°¤ÏÌë¤À¤±»ÈÍѲÄǽ¤Ç¤¹¡£"); -#else - msg_print("The rooms are available only at night."); -#endif - - return (FALSE); - } break; + case BACT_RUMORS: /* Listen for rumors */ { char Rumor[1024]; @@ -2818,22 +2936,6 @@ msg_print(" /* - * Share gold for thieves - */ -static void share_gold(void) -{ - int i = (p_ptr->lev * 2) * 10; -#ifdef JP -msg_format("¡ð%d ¤ò¼ê¤ËÆþ¤ì¤¿¡£", i); -#else - msg_format("You collect %d gold pieces", i); -#endif - - p_ptr->au += i; -} - - -/* * Display quest information */ static void get_questinfo(int questnum) @@ -2858,7 +2960,7 @@ static void get_questinfo(int questnum) /* Get the quest text */ init_flags = INIT_SHOW_TEXT | INIT_ASSIGN; -process_dungeon_file("q_info_j.txt", 0, 0, 0, 0); + process_dungeon_file("q_info.txt", 0, 0, 0, 0); /* Reset the old quest number */ p_ptr->inside_quest = old_quest; @@ -3032,11 +3134,15 @@ static void town_history(void) * the current +dam of the player. */ static void compare_weapon_aux2(object_type *o_ptr, int numblows, - int r, int c, int mult, cptr attr, + int r, int c, int mult, cptr attr, byte color) { char tmp_str[80]; + /* Effective dices */ + int eff_dd = o_ptr->dd + p_ptr->to_dd[0]; + int eff_ds = o_ptr->ds + p_ptr->to_ds[0]; + /* Print the intro text */ c_put_str(color, attr, r, c); @@ -3047,8 +3153,8 @@ sprintf(tmp_str, " sprintf(tmp_str, "Attack: %d-%d damage", #endif - (numblows * (mult * o_ptr->dd /60 + o_ptr->to_d + p_ptr->to_d[0])), - (numblows * (mult * o_ptr->ds * o_ptr->dd /60 + o_ptr->to_d + p_ptr->to_d[0]))); + (numblows * (mult * eff_dd / 60 + o_ptr->to_d + p_ptr->to_d[0])), + (numblows * (mult * eff_ds * eff_dd / 60 + o_ptr->to_d + p_ptr->to_d[0]))); /* Print the damage */ put_str(tmp_str, r, c + 8); @@ -3066,45 +3172,45 @@ static void compare_weapon_aux1(object_type *o_ptr, int col, int r) int mult = 60; u32b flgs[TR_FLAG_SIZE]; int blow = p_ptr->num_blow[0]; + bool print_force_weapon = FALSE; /* Get the flags of the weapon */ object_flags(o_ptr, flgs); - if (p_ptr->riding) + if ((p_ptr->pclass != CLASS_SAMURAI) && have_flag(flgs, TR_FORCE_WEAPON) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5))) { - if ((o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))) - mult = mult * (o_ptr->dd + 2) / o_ptr->dd; + mult = mult * 7 / 2; + print_force_weapon = TRUE; } - if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5))) mult = mult * 7 / 2; /* Print the relevant lines */ #ifdef JP -if (have_flag(flgs, TR_FORCE_WEAPON)) compare_weapon_aux2(o_ptr, blow, r++, col, 1*mult, "ÍýÎÏ:", TERM_L_BLUE); -if (have_flag(flgs, TR_KILL_ANIMAL)) compare_weapon_aux2(o_ptr, blow, r++, col, 4*mult, "ưʪ:", TERM_YELLOW); - else if (have_flag(flgs, TR_SLAY_ANIMAL)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "ưʪ:", TERM_YELLOW); -if (have_flag(flgs, TR_KILL_EVIL)) compare_weapon_aux2(o_ptr, blow, r++, col, 7*mult/2, "¼Ù°­:", TERM_YELLOW); - else if (have_flag(flgs, TR_SLAY_EVIL)) compare_weapon_aux2(o_ptr, blow, r++, col, 2*mult, "¼Ù°­:", TERM_YELLOW); -if (have_flag(flgs, TR_KILL_HUMAN)) compare_weapon_aux2(o_ptr, blow, r++, col, 4*mult, "¿Í´Ö:", TERM_YELLOW); - else if (have_flag(flgs, TR_SLAY_HUMAN)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "¿Í´Ö:", TERM_YELLOW); -if (have_flag(flgs, TR_KILL_UNDEAD)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "ÉÔ»à:", TERM_YELLOW); - else if (have_flag(flgs, TR_SLAY_UNDEAD)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "ÉÔ»à:", TERM_YELLOW); -if (have_flag(flgs, TR_KILL_DEMON)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "°­Ëâ:", TERM_YELLOW); - else if (have_flag(flgs, TR_SLAY_DEMON)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "°­Ëâ:", TERM_YELLOW); -if (have_flag(flgs, TR_KILL_ORC)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "¥ª¡¼¥¯:", TERM_YELLOW); - else if (have_flag(flgs, TR_SLAY_ORC)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "¥ª¡¼¥¯:", TERM_YELLOW); -if (have_flag(flgs, TR_KILL_TROLL)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "¥È¥í¥ë:", TERM_YELLOW); - else if (have_flag(flgs, TR_SLAY_TROLL)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "¥È¥í¥ë:", TERM_YELLOW); -if (have_flag(flgs, TR_KILL_GIANT)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "µð¿Í:", TERM_YELLOW); - else if (have_flag(flgs, TR_SLAY_GIANT)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "µð¿Í:", TERM_YELLOW); -if (have_flag(flgs, TR_KILL_DRAGON)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "ε:", TERM_YELLOW); -else if (have_flag(flgs, TR_SLAY_DRAGON)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "ε:", TERM_YELLOW); -if (have_flag(flgs, TR_BRAND_ACID)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "»À°À­:", TERM_RED); -if (have_flag(flgs, TR_BRAND_ELEC)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "ÅÅ°À­:", TERM_RED); -if (have_flag(flgs, TR_BRAND_FIRE)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "±ê°À­:", TERM_RED); -if (have_flag(flgs, TR_BRAND_COLD)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "Îä°À­:", TERM_RED); -if (have_flag(flgs, TR_BRAND_POIS)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "ÆÇ°À­:", TERM_RED); -#else - if (have_flag(flgs, TR_FORCE_WEAPON)) compare_weapon_aux2(o_ptr, blow, r++, col, 1*mult, "Force :", TERM_L_BLUE); + if (print_force_weapon) compare_weapon_aux2(o_ptr, blow, r++, col, 1*mult, "ÍýÎÏ:", TERM_L_BLUE); + if (have_flag(flgs, TR_KILL_ANIMAL)) compare_weapon_aux2(o_ptr, blow, r++, col, 4*mult, "ưʪ:", TERM_YELLOW); + else if (have_flag(flgs, TR_SLAY_ANIMAL)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "ưʪ:", TERM_YELLOW); + if (have_flag(flgs, TR_KILL_EVIL)) compare_weapon_aux2(o_ptr, blow, r++, col, 7*mult/2, "¼Ù°­:", TERM_YELLOW); + else if (have_flag(flgs, TR_SLAY_EVIL)) compare_weapon_aux2(o_ptr, blow, r++, col, 2*mult, "¼Ù°­:", TERM_YELLOW); + if (have_flag(flgs, TR_KILL_HUMAN)) compare_weapon_aux2(o_ptr, blow, r++, col, 4*mult, "¿Í´Ö:", TERM_YELLOW); + else if (have_flag(flgs, TR_SLAY_HUMAN)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "¿Í´Ö:", TERM_YELLOW); + if (have_flag(flgs, TR_KILL_UNDEAD)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "ÉÔ»à:", TERM_YELLOW); + else if (have_flag(flgs, TR_SLAY_UNDEAD)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "ÉÔ»à:", TERM_YELLOW); + if (have_flag(flgs, TR_KILL_DEMON)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "°­Ëâ:", TERM_YELLOW); + else if (have_flag(flgs, TR_SLAY_DEMON)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "°­Ëâ:", TERM_YELLOW); + if (have_flag(flgs, TR_KILL_ORC)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "¥ª¡¼¥¯:", TERM_YELLOW); + else if (have_flag(flgs, TR_SLAY_ORC)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "¥ª¡¼¥¯:", TERM_YELLOW); + if (have_flag(flgs, TR_KILL_TROLL)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "¥È¥í¥ë:", TERM_YELLOW); + else if (have_flag(flgs, TR_SLAY_TROLL)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "¥È¥í¥ë:", TERM_YELLOW); + if (have_flag(flgs, TR_KILL_GIANT)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "µð¿Í:", TERM_YELLOW); + else if (have_flag(flgs, TR_SLAY_GIANT)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "µð¿Í:", TERM_YELLOW); + if (have_flag(flgs, TR_KILL_DRAGON)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "ε:", TERM_YELLOW); + else if (have_flag(flgs, TR_SLAY_DRAGON)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "ε:", TERM_YELLOW); + if (have_flag(flgs, TR_BRAND_ACID)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "»À°À­:", TERM_RED); + if (have_flag(flgs, TR_BRAND_ELEC)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "ÅÅ°À­:", TERM_RED); + if (have_flag(flgs, TR_BRAND_FIRE)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "±ê°À­:", TERM_RED); + if (have_flag(flgs, TR_BRAND_COLD)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "Îä°À­:", TERM_RED); + if (have_flag(flgs, TR_BRAND_POIS)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "ÆÇ°À­:", TERM_RED); +#else + if (print_force_weapon) compare_weapon_aux2(o_ptr, blow, r++, col, 1*mult, "Force :", TERM_L_BLUE); if (have_flag(flgs, TR_KILL_ANIMAL)) compare_weapon_aux2(o_ptr, blow, r++, col, 4*mult, "Animals:", TERM_YELLOW); else if (have_flag(flgs, TR_SLAY_ANIMAL)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "Animals:", TERM_YELLOW); if (have_flag(flgs, TR_KILL_EVIL)) compare_weapon_aux2(o_ptr, blow, r++, col, 7*mult/2, "Evil:", TERM_YELLOW); @@ -3159,8 +3265,12 @@ static void list_weapon(object_type *o_ptr, int row, int col) char o_name[MAX_NLEN]; char tmp_str[80]; + /* Effective dices */ + int eff_dd = o_ptr->dd + p_ptr->to_dd[0]; + int eff_ds = o_ptr->ds + p_ptr->to_ds[0]; + /* Print the weapon name */ - object_desc(o_name, o_ptr, TRUE, 0); + object_desc(o_name, o_ptr, OD_NAME_ONLY); c_put_str(TERM_YELLOW, o_name, row, col); /* Print the player's number of blows */ @@ -3204,8 +3314,8 @@ sprintf(tmp_str, " sprintf(tmp_str, "One Strike: %d-%d damage", #endif - o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0], - o_ptr->ds * o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]); + eff_dd + o_ptr->to_d + p_ptr->to_d[0], + eff_ds * eff_dd + o_ptr->to_d + p_ptr->to_d[0]); put_str(tmp_str, row+6, col+1); /* Damage for the complete attack (if all blows hit) */ @@ -3215,8 +3325,8 @@ sprintf(tmp_str, " sprintf(tmp_str, "One Attack: %d-%d damage", #endif - p_ptr->num_blow[0] * (o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]), - p_ptr->num_blow[0] * (o_ptr->ds * o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0])); + p_ptr->num_blow[0] * (eff_dd + o_ptr->to_d + p_ptr->to_d[0]), + p_ptr->num_blow[0] * (eff_ds * eff_dd + o_ptr->to_d + p_ptr->to_d[0])); put_str(tmp_str, row+7, col+1); } @@ -3277,6 +3387,7 @@ static bool compare_weapons(void) object_type *i_ptr; cptr q, s; int row = 2; + bool old_character_xtra = character_xtra; screen_save(); /* Clear the screen */ @@ -3340,9 +3451,14 @@ s = " if (o1_ptr != i_ptr) object_copy(i_ptr, o1_ptr); + /* Hack -- prevent "icky" message */ + character_xtra = TRUE; + /* Get the new values */ calc_bonuses(); + character_xtra = old_character_xtra; + /* List the new values */ list_weapon(o1_ptr, row, 2); compare_weapon_aux1(o1_ptr, 2, row + 8); @@ -3353,9 +3469,14 @@ s = " else object_copy(i_ptr, &orig_weapon); + /* Hack -- prevent "icky" message */ + character_xtra = TRUE; + /* Get the new values */ calc_bonuses(); + character_xtra = old_character_xtra; + /* List the new values */ list_weapon(o2_ptr, row, 40); compare_weapon_aux1(o2_ptr, 40, row + 8); @@ -3389,6 +3510,109 @@ msg_print(" /* + * Evaluate AC + * + * AC¤«¤é²óÈòΨ¡¢¥À¥á¡¼¥¸¸º¾¯Î¨¤ò·×»»¤·É½¼¨¤¹¤ë + * Calculate and display the dodge-rate and the protection-rate + * based on AC + */ +static bool eval_ac(int iAC) +{ +#ifdef JP + const char memo[] = + "¥À¥á¡¼¥¸·Ú¸ºÎ¨¤È¤Ï¡¢Å¨¤Î¹¶·â¤¬Åö¤¿¤Ã¤¿»þ¤½¤Î¥À¥á¡¼¥¸¤ò\n" + "²¿¥Ñ¡¼¥»¥ó¥È·Ú¸º¤¹¤ë¤«¤ò¼¨¤·¤Þ¤¹¡£\n" + "¥À¥á¡¼¥¸·Ú¸º¤ÏÄ̾ï¤ÎľÀܹ¶·â(¼ïÎब¡Ö¹¶·â¤¹¤ë¡×¤È¡ÖÊ´ºÕ¤¹¤ë¡×¤Îʪ)\n" + "¤ËÂФ·¤Æ¤Î¤ß¸ú²Ì¤¬¤¢¤ê¤Þ¤¹¡£\n \n" + "Ũ¤Î¥ì¥Ù¥ë¤È¤Ï¡¢¤½¤ÎŨ¤¬Ä̾ﲿ³¬¤Ë¸½¤ì¤ë¤«¤ò¼¨¤·¤Þ¤¹¡£\n \n" + "²óÈòΨ¤ÏŨ¤ÎľÀܹ¶·â¤ò²¿¥Ñ¡¼¥»¥ó¥È¤Î³ÎΨ¤ÇÈò¤±¤ë¤«¤ò¼¨¤·¡¢\n" + "Ũ¤Î¥ì¥Ù¥ë¤È¤¢¤Ê¤¿¤ÎAC¤Ë¤è¤Ã¤Æ·èÄꤵ¤ì¤Þ¤¹¡£\n \n" + "¥À¥á¡¼¥¸´üÂÔÃͤȤϡ¢Å¨¤Î£±£°£°¥Ý¥¤¥ó¥È¤ÎÄ̾ﹶ·â¤ËÂФ·¡¢\n" + "²óÈòΨ¤È¥À¥á¡¼¥¸·Ú¸ºÎ¨¤ò¹Íθ¤·¤¿¥À¥á¡¼¥¸¤Î´üÂÔÃͤò¼¨¤·¤Þ¤¹¡£\n"; +#else + const char memo[] = + "'Protection Rate' means how much damage is reduced by your armor.\n" + "Note that the Protection rate is effective only against normal " + "'attack' and 'shatter' type melee attacks, " + "and has no effect against any other types such as 'poison'.\n \n" + "'Dodge Rate' indicates the success rate on dodging the " + "monster's melee attacks. " + "It is depend on the level of the monster and your AC.\n \n" + "'Average Damage' indicates the expected amount of damage " + "when you are attacked by normal melee attacks with power=100."; +#endif + + int protection; + int col, row = 2; + int lvl; + char buf[80*20], *t; + + /* AC lower than zero has no effect */ + if (iAC < 0) iAC = 0; + + /* ¥À¥á¡¼¥¸·Ú¸ºÎ¨¤ò·×»» */ + protection = 100 * MIN(iAC, 150) / 250; + + screen_save(); + clear_bldg(0, 22); + +#ifdef JP + put_str(format("¤¢¤Ê¤¿¤Î¸½ºß¤ÎAC: %3d", iAC), row++, 0); + put_str(format("¥À¥á¡¼¥¸·Ú¸ºÎ¨ : %3d%%", protection), row++, 0); + row++; + + put_str("Ũ¤Î¥ì¥Ù¥ë :", row + 0, 0); + put_str("²óÈòΨ :", row + 1, 0); + put_str("¥À¥á¡¼¥¸´üÂÔÃÍ :", row + 2, 0); +#else + put_str(format("Your current AC : %3d", iAC), row++, 0); + put_str(format("Protection rate : %3d%%", protection), row++, 0); + row++; + + put_str("Level of Monster:", row + 0, 0); + put_str("Dodge Rate :", row + 1, 0); + put_str("Average Damage :", row + 2, 0); +#endif + + for (col = 17 + 1, lvl = 0; lvl <= 100; lvl += 10, col += 5) + { + int quality = 60 + lvl * 3; /* attack quality with power 60 */ + int dodge; /* ²óÈòΨ(%) */ + int average; /* ¥À¥á¡¼¥¸´üÂÔÃÍ */ + + put_str(format("%3d", lvl), row + 0, col); + + /* ²óÈòΨ¤ò·×»» */ + dodge = 5 + (MIN(100, 100 * (iAC * 3 / 4) / quality) * 9 + 5) / 10; + put_str(format("%3d%%", dodge), row + 1, col); + + /* 100ÅÀ¤Î¹¶·â¤ËÂФ·¤Æ¤Î¥À¥á¡¼¥¸´üÂÔÃͤò·×»» */ + average = (100 - dodge) * (100 - protection) / 100; + put_str(format("%3d", average), row + 2, col); + } + + /* Display note */ + roff_to_buf(memo, 70, buf, sizeof(buf)); + for (t = buf; t[0]; t += strlen(t) + 1) + put_str(t, (row++) + 4, 4); + +#ifdef JP + prt("¸½ºß¤Î¤¢¤Ê¤¿¤ÎÁõÈ÷¤«¤é¤¹¤ë¤È¡¢¤¢¤Ê¤¿¤ÎËɸæÎϤÏ" + "¤³¤ì¤¯¤é¤¤¤Ç¤¹:", 0, 0); +#else + prt("Defense abilities from your current Armor Class are evaluated below.", 0, 0); +#endif + + flush(); + (void)inkey(); + screen_load(); + + /* Done */ + return (TRUE); +} + + +/* * Enchant item */ static bool enchant_item(int cost, int to_hit, int to_dam, int to_ac) @@ -3400,11 +3624,10 @@ static bool enchant_item(int cost, int to_hit, int to_dam, int to_ac) int maxenchant = (p_ptr->lev / 5); char tmp_str[MAX_NLEN]; - clear_bldg(4, 18); #ifdef JP -prt(format("¸½ºß¤Î¤¢¤Ê¤¿¤Îµ»Î̤À¤È¡¢+%d ¤Þ¤Ç²þÎɤǤ­¤Þ¤¹¡£", maxenchant), 5, 0); -prt(format(" ²þÎɤÎÎÁ¶â¤Ï°ì¸Ä¤Ë¤Ä¤­¡ð%d ¤Ç¤¹¡£", cost), 7, 0); + prt(format("¸½ºß¤Î¤¢¤Ê¤¿¤Îµ»Î̤À¤È¡¢+%d ¤Þ¤Ç²þÎɤǤ­¤Þ¤¹¡£", maxenchant), 5, 0); + prt(format(" ²þÎɤÎÎÁ¶â¤Ï°ì¸Ä¤Ë¤Ä¤­¡ð%d ¤Ç¤¹¡£", cost), 7, 0); #else prt(format(" Based on your skill, we can improve up to +%d.", maxenchant), 5, 0); prt(format(" The price for the service is %d gold per item.", cost), 7, 0); @@ -3414,8 +3637,8 @@ prt(format(" /* Get an item */ #ifdef JP -q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò²þÎɤ·¤Þ¤¹¤«¡©"; -s = "²þÎɤǤ­¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£"; + q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò²þÎɤ·¤Þ¤¹¤«¡©"; + s = "²þÎɤǤ­¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£"; #else q = "Improve which item? "; s = "You have nothing to improve."; @@ -3429,9 +3652,9 @@ s = " /* Check if the player has enough money */ if (p_ptr->au < (cost * o_ptr->number)) { - object_desc(tmp_str, o_ptr, TRUE, 0); + object_desc(tmp_str, o_ptr, OD_NAME_ONLY); #ifdef JP -msg_format("%s¤ò²þÎɤ¹¤ë¤À¤±¤Î¥´¡¼¥ë¥É¤¬¤¢¤ê¤Þ¤»¤ó¡ª", tmp_str); + msg_format("%s¤ò²þÎɤ¹¤ë¤À¤±¤Î¥´¡¼¥ë¥É¤¬¤¢¤ê¤Þ¤»¤ó¡ª", tmp_str); #else msg_format("You do not have the gold to improve %s!", tmp_str); #endif @@ -3486,21 +3709,20 @@ msg_format("%s /* Message */ #ifdef JP -msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£"); + msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£"); #else msg_print("The improvement failed."); #endif - return (FALSE); } else { - object_desc(tmp_str, o_ptr, TRUE, 1); + object_desc(tmp_str, o_ptr, OD_NAME_AND_ENCHANT); #ifdef JP -msg_format("¡ð%d ¤Ç%s¤ò²þÎɤ·¤Þ¤·¤¿¡£", cost * o_ptr->number, tmp_str ); + msg_format("¡ð%d¤Ç%s¤Ë²þÎɤ·¤Þ¤·¤¿¡£", cost * o_ptr->number, tmp_str); #else - msg_format("Improved %s for %d gold.", tmp_str, cost * o_ptr->number); + msg_format("Improved into %s for %d gold.", tmp_str, cost * o_ptr->number); #endif /* Charge the money */ @@ -3579,7 +3801,7 @@ s = " * the level of the item or the number of charges. */ /* The item must be "known" */ - if (!object_known_p(o_ptr)) + if (!object_is_known(o_ptr)) { #ifdef JP msg_format("½¼Å¶¤¹¤ëÁ°¤Ë´ÕÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡ª"); @@ -3604,7 +3826,7 @@ get_check(" identify_item(o_ptr); /* Description */ - object_desc(tmp_str, o_ptr, TRUE, 3); + object_desc(tmp_str, o_ptr, 0); #ifdef JP msg_format("%s ¤Ç¤¹¡£", tmp_str); @@ -3612,6 +3834,8 @@ msg_format("%s msg_format("You have: %s.", tmp_str); #endif + /* Auto-inscription */ + autopick_alter_item(item, FALSE); /* Update the gold display */ building_prt_gold(); @@ -3623,7 +3847,7 @@ msg_format("%s } /* Extract the object "level" */ - lev = get_object_level(o_ptr); + lev = k_info[o_ptr->k_idx].level; /* Price for a rod */ if (o_ptr->tval == TV_ROD) @@ -3649,7 +3873,7 @@ msg_format(" else if (o_ptr->tval == TV_STAFF) { /* Price per charge ( = double the price paid by shopkeepers for the charge) */ - price = (get_object_cost(o_ptr) / 10) * o_ptr->number; + price = (k_info[o_ptr->k_idx].cost / 10) * o_ptr->number; /* Pay at least 10 gold per charge */ price = MAX(10, price); @@ -3657,7 +3881,7 @@ msg_format(" else { /* Price per charge ( = double the price paid by shopkeepers for the charge) */ - price = (get_object_cost(o_ptr) / 10); + price = (k_info[o_ptr->k_idx].cost / 10); /* Pay at least 10 gold per charge */ price = MAX(10, price); @@ -3709,7 +3933,7 @@ msg_print(" /* Check if the player has enough money */ if (p_ptr->au < price) { - object_desc(tmp_str, o_ptr, TRUE, 0); + object_desc(tmp_str, o_ptr, OD_NAME_ONLY); #ifdef JP msg_format("%s¤òºÆ½¼Å¶¤¹¤ë¤Ë¤Ï¡ð%d ɬÍפǤ¹¡ª", tmp_str,price ); #else @@ -3752,7 +3976,7 @@ charges = get_quantity(format(" charges = get_quantity(format("Add how many charges for %d gold? ", #endif - price), MIN(p_ptr->au / price, max_charges)); + price), MIN(p_ptr->au / price, max_charges)); /* Do nothing */ if (charges < 1) return; @@ -3768,7 +3992,7 @@ charges = get_quantity(format(" } /* Give feedback */ - object_desc(tmp_str, o_ptr, TRUE, 3); + object_desc(tmp_str, o_ptr, 0); #ifdef JP msg_format("%s¤ò¡ð%d ¤ÇºÆ½¼Å¶¤·¤Þ¤·¤¿¡£", tmp_str, price); #else @@ -3810,7 +4034,7 @@ static void building_recharge_all(void) /* Display some info */ - msg_flag = FALSE; + msg_flag = FALSE; clear_bldg(4, 18); #ifdef JP prt(" ºÆ½¼Å¶¤ÎÈñÍѤϥ¢¥¤¥Æ¥à¤Î¼ïÎà¤Ë¤è¤ê¤Þ¤¹¡£", 6, 0); @@ -3827,10 +4051,10 @@ static void building_recharge_all(void) if (o_ptr->tval < TV_STAFF || o_ptr->tval > TV_ROD) continue; /* need identified */ - if (!object_known_p(o_ptr)) total_cost += 50; + if (!object_is_known(o_ptr)) total_cost += 50; /* Extract the object "level" */ - lev = get_object_level(o_ptr); + lev = k_info[o_ptr->k_idx].level; k_ptr = &k_info[o_ptr->k_idx]; @@ -3842,7 +4066,7 @@ static void building_recharge_all(void) case TV_STAFF: /* Price per charge ( = double the price paid by shopkeepers for the charge) */ - price = (get_object_cost(o_ptr) / 10) * o_ptr->number; + price = (k_info[o_ptr->k_idx].cost / 10) * o_ptr->number; /* Pay at least 10 gold per charge */ price = MAX(10, price); @@ -3853,7 +4077,7 @@ static void building_recharge_all(void) case TV_WAND: /* Price per charge ( = double the price paid by shopkeepers for the charge) */ - price = (get_object_cost(o_ptr) / 10); + price = (k_info[o_ptr->k_idx].cost / 10); /* Pay at least 10 gold per charge */ price = MAX(10, price); @@ -3902,12 +4126,18 @@ static void building_recharge_all(void) { o_ptr = &inventory[i]; k_ptr = &k_info[o_ptr->k_idx]; - + /* skip non magic device */ if (o_ptr->tval < TV_STAFF || o_ptr->tval > TV_ROD) continue; /* Identify it */ - if (!object_known_p(o_ptr)) identify_item(o_ptr); + if (!object_is_known(o_ptr)) + { + identify_item(o_ptr); + + /* Auto-inscription */ + autopick_alter_item(i, FALSE); + } /* Recharge */ switch (o_ptr->tval) @@ -4034,7 +4264,7 @@ bool tele_town(void) } } } - p_ptr->leftbldg = TRUE; + p_ptr->leaving = TRUE; leave_bldg = TRUE; p_ptr->teleport_town = TRUE; @@ -4044,6 +4274,306 @@ bool tele_town(void) /* + * research_mon + * -KMW- + */ +static bool research_mon(void) +{ + int i, n, r_idx; + char sym, query; + char buf[128]; + + bool notpicked; + + bool recall = FALSE; + + u16b why = 0; + + u16b *who; + + /* XTRA HACK WHATSEARCH */ + bool all = FALSE; + bool uniq = FALSE; + bool norm = FALSE; + char temp[80] = ""; + + /* XTRA HACK REMEMBER_IDX */ + static int old_sym = '\0'; + static int old_i = 0; + + + /* Save the screen */ + screen_save(); + + /* Get a character, or abort */ +#ifdef JP +if (!get_com("¥â¥ó¥¹¥¿¡¼¤Îʸ»ú¤òÆþÎϤ·¤Æ²¼¤µ¤¤(µ­¹æ or ^AÁ´,^U¥æ,^NÈó¥æ,^M̾Á°):", &sym, FALSE)) +#else + if (!get_com("Enter character to be identified(^A:All,^U:Uniqs,^N:Non uniqs,^M:Name): ", &sym, FALSE)) +#endif + + { + /* Restore */ + screen_load(); + + return (FALSE); + } + + /* Find that character info, and describe it */ + for (i = 0; ident_info[i]; ++i) + { + if (sym == ident_info[i][0]) break; + } + + /* XTRA HACK WHATSEARCH */ + if (sym == KTRL('A')) + { + all = TRUE; +#ifdef JP + strcpy(buf, "Á´¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È"); +#else + strcpy(buf, "Full monster list."); +#endif + } + else if (sym == KTRL('U')) + { + all = uniq = TRUE; +#ifdef JP + strcpy(buf, "¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È"); +#else + strcpy(buf, "Unique monster list."); +#endif + } + else if (sym == KTRL('N')) + { + all = norm = TRUE; +#ifdef JP + strcpy(buf, "¥æ¥Ë¡¼¥¯³°¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È"); +#else + strcpy(buf, "Non-unique monster list."); +#endif + } + else if (sym == KTRL('M')) + { + all = TRUE; +#ifdef JP + if (!get_string("̾Á°(±Ñ¸ì¤Î¾ì¹ç¾®Ê¸»ú¤Ç²Ä)",temp, 70)) +#else + if (!get_string("Enter name:",temp, 70)) +#endif + { + temp[0]=0; + + /* Restore */ + screen_load(); + + return FALSE; + } +#ifdef JP + sprintf(buf, "̾Á°:%s¤Ë¥Þ¥Ã¥Á",temp); +#else + sprintf(buf, "Monsters with a name \"%s\"",temp); +#endif + } + else if (ident_info[i]) + { + sprintf(buf, "%c - %s.", sym, ident_info[i] + 2); + } + else + { +#ifdef JP +sprintf(buf, "%c - %s", sym, "̵¸ú¤Êʸ»ú"); +#else + sprintf(buf, "%c - %s.", sym, "Unknown Symbol"); +#endif + + } + + /* Display the result */ + prt(buf, 16, 10); + + + /* Allocate the "who" array */ + C_MAKE(who, max_r_idx, u16b); + + /* Collect matching monsters */ + for (n = 0, i = 1; i < max_r_idx; i++) + { + monster_race *r_ptr = &r_info[i]; + + /* Empty monster */ + if (!r_ptr->name) continue; + + /* XTRA HACK WHATSEARCH */ + /* Require non-unique monsters if needed */ + if (norm && (r_ptr->flags1 & (RF1_UNIQUE))) continue; + + /* Require unique monsters if needed */ + if (uniq && !(r_ptr->flags1 & (RF1_UNIQUE))) continue; + + /* ̾Á°¸¡º÷ */ + if (temp[0]) + { + int xx; + char temp2[80]; + + for (xx = 0; temp[xx] && xx < 80; xx++) + { +#ifdef JP + if (iskanji(temp[xx])) + { + xx++; + continue; + } +#endif + if (isupper(temp[xx])) temp[xx] = tolower(temp[xx]); + } + +#ifdef JP + strcpy(temp2, r_name + r_ptr->E_name); +#else + strcpy(temp2, r_name + r_ptr->name); +#endif + for (xx = 0; temp2[xx] && xx < 80; xx++) + if (isupper(temp2[xx])) temp2[xx] = tolower(temp2[xx]); + +#ifdef JP + if (my_strstr(temp2, temp) || my_strstr(r_name + r_ptr->name, temp)) +#else + if (my_strstr(temp2, temp)) +#endif + who[n++] = i; + } + else if (all || (r_ptr->d_char == sym)) who[n++] = i; + } + + /* Nothing to recall */ + if (!n) + { + /* Free the "who" array */ + C_KILL(who, max_r_idx, u16b); + + /* Restore */ + screen_load(); + + return (FALSE); + } + + /* Sort by level */ + why = 2; + query = 'y'; + + /* Sort if needed */ + if (why) + { + /* Select the sort method */ + ang_sort_comp = ang_sort_comp_hook; + ang_sort_swap = ang_sort_swap_hook; + + /* Sort the array */ + ang_sort(who, &why, n); + } + + + /* Start at the end */ + /* XTRA HACK REMEMBER_IDX */ + if (old_sym == sym && old_i < n) i = old_i; + else i = n - 1; + + notpicked = TRUE; + + /* Scan the monster memory */ + while (notpicked) + { + /* Extract a race */ + r_idx = who[i]; + + /* Hack -- Begin the prompt */ + roff_top(r_idx); + + /* Hack -- Complete the prompt */ +#ifdef JP +Term_addstr(-1, TERM_WHITE, " ['r'»×¤¤½Ð, ' '¤Ç³¹Ô, ESC]"); +#else + Term_addstr(-1, TERM_WHITE, " [(r)ecall, ESC, space to continue]"); +#endif + + + /* Interact */ + while (1) + { + /* Recall */ + if (recall) + { + /*** Recall on screen ***/ + + /* Get maximal info about this monster */ + lore_do_probe(r_idx); + + /* Save this monster ID */ + monster_race_track(r_idx); + + /* Hack -- Handle stuff */ + handle_stuff(); + + /* know every thing mode */ + screen_roff(r_idx, 0x01); + notpicked = FALSE; + + /* XTRA HACK REMEMBER_IDX */ + old_sym = sym; + old_i = i; + } + + /* Command */ + query = inkey(); + + /* Normal commands */ + if (query != 'r') break; + + /* Toggle recall */ + recall = !recall; + } + + /* Stop scanning */ + if (query == ESCAPE) break; + + /* Move to "prev" monster */ + if (query == '-') + { + if (++i == n) + { + i = 0; + if (!expand_list) break; + } + } + + /* Move to "next" monster */ + else + { + if (i-- == 0) + { + i = n - 1; + if (!expand_list) break; + } + } + } + + + /* Re-display the identity */ + /* prt(buf, 5, 5);*/ + + /* Free the "who" array */ + C_KILL(who, max_r_idx, u16b); + + /* Restore */ + screen_load(); + + return (!notpicked); +} + + +/* * Execute a building command */ static void bldg_process_command(building_type *bldg, int i) @@ -4051,7 +4581,6 @@ static void bldg_process_command(building_type *bldg, int i) int bact = bldg->actions[i]; int bcost; bool paid = FALSE; - bool set_reward = FALSE; int amt; /* Flush messages XXX XXX XXX */ @@ -4088,12 +4617,10 @@ msg_print(" return; } - if (!bcost) set_reward = TRUE; - switch (bact) { case BACT_NOTHING: - /* Do nothing */ + /* Do nothing */ break; case BACT_RESEARCH_ITEM: paid = identify_fully(FALSE); @@ -4110,7 +4637,7 @@ msg_print(" case BACT_KING_LEGENDS: case BACT_ARENA_LEGENDS: case BACT_LEGENDS: - show_highclass(building_loc); + show_highclass(); break; case BACT_POSTER: case BACT_ARENA_RULES: @@ -4137,11 +4664,11 @@ msg_print(" paid = compare_weapons(); break; case BACT_ENCHANT_WEAPON: - item_tester_hook = item_tester_hook_melee_weapon; + item_tester_hook = object_allow_enchant_melee_weapon; enchant_item(bcost, 1, 1, 0); break; case BACT_ENCHANT_ARMOR: - item_tester_hook = item_tester_hook_armour; + item_tester_hook = object_is_armour; enchant_item(bcost, 0, 0, 1); break; case BACT_RECHARGE: @@ -4186,21 +4713,6 @@ msg_print(" if (do_res_stat(A_CON)) paid = TRUE; if (do_res_stat(A_CHR)) paid = TRUE; break; - case BACT_GOLD: /* set timed reward flag */ - if (!p_ptr->rewards[BACT_GOLD]) - { - share_gold(); - p_ptr->rewards[BACT_GOLD] = TRUE; - } - else - { -#ifdef JP - msg_print("º£Æü¤Îʬ¤±Á°¤Ï¤¹¤Ç¤Ë»Ùʧ¤Ã¤¿¤¾¡ª"); -#else - msg_print("You just had your daily allowance!"); -#endif - } - break; case BACT_ENCHANT_ARROWS: item_tester_hook = item_tester_hook_ammo; enchant_item(bcost, 1, 1, 0); @@ -4215,66 +4727,16 @@ msg_print(" case BACT_TELEPORT_LEVEL: { int select_dungeon; - int i, num = 0; - s16b *dun; int max_depth; - /* Allocate the "dun" array */ - C_MAKE(dun, max_d_idx, s16b); - - screen_save(); clear_bldg(4, 20); - - for(i = 1; i < max_d_idx; i++) - { - char buf[80]; - bool seiha = FALSE; - - if (!d_info[i].maxdepth) continue; - if (!max_dlv[i]) continue; - if (d_info[i].final_guardian) - { - if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE; - } - else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE; - -#ifdef JP - sprintf(buf,"%c) %c%-12s : ºÇÂç %d ³¬", 'a'+num, seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]); -#else - sprintf(buf,"%c) %c%-12s : Max level %d", 'a'+num, seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]); -#endif - put_str(buf, 4+num, 5); - dun[num] = i; - num++; - } #ifdef JP - prt("¤É¤Î¥À¥ó¥¸¥ç¥ó¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«:", 0, 0); + select_dungeon = choose_dungeon("¤Ë¥Æ¥ì¥Ý¡¼¥È", 4, 0); #else - prt("Which dungeon do you teleport?: ", 0, 0); + select_dungeon = choose_dungeon("teleport", 4, 0); #endif - while(1) - { - i = inkey(); - - if (i == ESCAPE) - { - /* Free the "dun" array */ - C_KILL(dun, max_d_idx, s16b); - - screen_load(); - return; - } - if (i >= 'a' && i <('a'+num)) - { - select_dungeon = dun[i-'a']; - break; - } - else bell(); - } - screen_load(); - - /* Free the "dun" array */ - C_KILL(dun, max_d_idx, s16b); + show_building(bldg); + if (!select_dungeon) return; max_depth = d_info[select_dungeon].maxdepth; @@ -4296,7 +4758,7 @@ msg_print(" p_ptr->word_recall = 1; p_ptr->recall_dungeon = select_dungeon; max_dlv[p_ptr->recall_dungeon] = ((amt > d_info[select_dungeon].maxdepth) ? d_info[select_dungeon].maxdepth : ((amt < d_info[select_dungeon].mindepth) ? d_info[select_dungeon].mindepth : amt)); - if (record_maxdeapth) + if (record_maxdepth) #ifdef JP do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, "¥È¥é¥ó¥×¥¿¥ï¡¼¤Ç"); #else @@ -4314,16 +4776,23 @@ msg_print(" break; } case BACT_LOSE_MUTATION: - paid = lose_mutation(0); - /* ToDo: Better message text. */ - if (!paid) + if (p_ptr->muta1 || p_ptr->muta2 || + (p_ptr->muta3 & ~MUT3_GOOD_LUCK) || + (p_ptr->pseikaku != SEIKAKU_LUCKY && + (p_ptr->muta3 & MUT3_GOOD_LUCK))) + { + while(!lose_mutation(0)); + paid = TRUE; + } + else + { #ifdef JP - msg_print("´ñ̯¤Ê¤¯¤é¤¤ÉáÄ̤ˤʤ俵¤¤¬¤¹¤ë¡£"); + msg_print("¼£¤¹¤Ù¤­ÆÍÁ³ÊÑ°Û¤¬Ìµ¤¤¡£"); #else - msg_print("You feel oddly normal."); + msg_print("You have no mutations."); #endif - - + msg_print(NULL); + } break; case BACT_BATTLE: kakutoujou(); @@ -4370,6 +4839,9 @@ msg_print(" case BACT_TELE_TOWN: paid = tele_town(); break; + case BACT_EVAL_AC: + paid = eval_ac(p_ptr->dis_ac + p_ptr->dis_to_a); + break; } if (paid) @@ -4386,7 +4858,7 @@ void do_cmd_quest(void) { energy_use = 100; - if (cave[py][px].feat != FEAT_QUEST_ENTER) + if (!cave_have_flag_bold(py, px, FF_QUEST_ENTER)) { #ifdef JP msg_print("¤³¤³¤Ë¤Ï¥¯¥¨¥¹¥È¤ÎÆþ¸ý¤Ï¤Ê¤¤¡£"); @@ -4414,9 +4886,9 @@ msg_print(" leave_quest_check(); + if (quest[p_ptr->inside_quest].type != QUEST_TYPE_RANDOM) dun_level = 1; p_ptr->inside_quest = cave[py][px].special; - if(quest[leaving_quest].type != QUEST_TYPE_RANDOM) dun_level = 1; - p_ptr->leftbldg = TRUE; + p_ptr->leaving = TRUE; } } @@ -4435,11 +4907,10 @@ void do_cmd_bldg(void) energy_use = 100; - if (!((cave[py][px].feat >= FEAT_BLDG_HEAD) && - (cave[py][px].feat <= FEAT_BLDG_TAIL))) + if (!cave_have_flag_bold(py, px, FF_BLDG)) { #ifdef JP -msg_print("¤³¤³¤Ë¤Ï·úʪ¤Ï¤Ê¤¤¡£"); + msg_print("¤³¤³¤Ë¤Ï·úʪ¤Ï¤Ê¤¤¡£"); #else msg_print("You see no building here."); #endif @@ -4447,42 +4918,64 @@ msg_print(" return; } - which = (cave[py][px].feat - FEAT_BLDG_HEAD); - building_loc = which; + which = f_info[cave[py][px].feat].subtype; bldg = &building[which]; /* Don't re-init the wilderness */ reinit_wilderness = FALSE; - if ((which == 2) && (p_ptr->arena_number == 99)) + if ((which == 2) && (p_ptr->arena_number < 0)) { #ifdef JP -msg_print("¡ÖÇÔ¼Ô¤ËÍѤϤʤ¤¡£¡×"); + msg_print("¡ÖÇÔ¼Ô¤ËÍѤϤʤ¤¡£¡×"); #else msg_print("'There's no place here for a LOSER like you!'"); #endif return; } - else if ((which == 2) && p_ptr->inside_arena && !p_ptr->exit_bldg) + else if ((which == 2) && p_ptr->inside_arena) { + if (!p_ptr->exit_bldg) + { #ifdef JP -prt("¥²¡¼¥È¤ÏÊĤޤäƤ¤¤ë¡£¥â¥ó¥¹¥¿¡¼¤¬¤¢¤Ê¤¿¤òÂԤäƤ¤¤ë¡ª",0,0); + prt("¥²¡¼¥È¤ÏÊĤޤäƤ¤¤ë¡£¥â¥ó¥¹¥¿¡¼¤¬¤¢¤Ê¤¿¤òÂԤäƤ¤¤ë¡ª", 0, 0); #else - prt("The gates are closed. The monster awaits!", 0, 0); + prt("The gates are closed. The monster awaits!", 0, 0); #endif + } + else + { + /* Don't save the arena as saved floor */ + prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_NO_RETURN); + + p_ptr->inside_arena = FALSE; + p_ptr->leaving = TRUE; + + /* Re-enter the arena */ + command_new = SPECIAL_KEY_BUILDING; + + /* No energy needed to re-enter the arena */ + energy_use = 0; + } return; } - else if ((which == 2) && p_ptr->inside_arena) - { - p_ptr->leaving = TRUE; - p_ptr->inside_arena = FALSE; - } else if (p_ptr->inside_battle) { + /* Don't save the arena as saved floor */ + prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_NO_RETURN); + p_ptr->leaving = TRUE; p_ptr->inside_battle = FALSE; + + /* Re-enter the monster arena */ + command_new = SPECIAL_KEY_BUILDING; + + /* No energy needed to re-enter the arena */ + energy_use = 0; + + return; } else { @@ -4551,7 +5044,9 @@ prt(" /* Reinit wilderness to activate quests ... */ if (reinit_wilderness) + { p_ptr->leaving = TRUE; + } /* Hack -- Decrease "icky" depth */ character_icky--; @@ -4628,26 +5123,26 @@ void quest_discovery(int q_idx) { /* Unique */ - /* Hack -- "unique" monsters must be "unique" */ - if ((r_ptr->flags1 & RF1_UNIQUE) && - (0 == r_ptr->max_num)) - { + /* Hack -- "unique" monsters must be "unique" */ + if ((r_ptr->flags1 & RF1_UNIQUE) && + (0 == r_ptr->max_num)) + { #ifdef JP - msg_print("¤³¤Î³¬¤Ï°ÊÁ°¤Ï狼¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤¿¤è¤¦¤À¡Ä¡£"); + msg_print("¤³¤Î³¬¤Ï°ÊÁ°¤Ï狼¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤¿¤è¤¦¤À¡Ä¡£"); #else - msg_print("It seems that this level was protected by someone before..."); + msg_print("It seems that this level was protected by someone before..."); #endif - /* The unique is already dead */ - quest[q_idx].status = QUEST_STATUS_FINISHED; - } - else - { + /* The unique is already dead */ + quest[q_idx].status = QUEST_STATUS_FINISHED; + } + else + { #ifdef JP - msg_format("Ãí°Õ¤»¤è¡ª¤³¤Î³¬¤Ï%s¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤ë¡ª", name); + msg_format("Ãí°Õ¤»¤è¡ª¤³¤Î³¬¤Ï%s¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤ë¡ª", name); #else - msg_format("Beware, this level is protected by %s!", name); + msg_format("Beware, this level is protected by %s!", name); #endif - } + } } else {