From 47d00a1d953f0a48a4485af40281325de1a190a5 Mon Sep 17 00:00:00 2001 From: Hourier Date: Mon, 6 Jul 2020 22:02:43 +0900 Subject: [PATCH] [Refactor] #40534 Separated flavor-describer.c/h from object-flavor.c/h --- Hengband/Hengband/Hengband.vcxproj | 2 + Hengband/Hengband/Hengband.vcxproj.filters | 6 + src/Makefile.am | 1 + src/autopick/autopick-destroyer.c | 151 +- src/autopick/autopick-entry.c | 1097 ++++++------ src/autopick/autopick-finder.c | 626 ++++--- src/autopick/autopick-registry.c | 350 ++-- src/autopick/autopick.c | 8 +- src/cmd-item/cmd-eat.c | 4 +- src/cmd-item/cmd-item.c | 24 +- src/cmd-item/cmd-read.c | 4 +- src/cmd-item/cmd-smith.c | 2469 ++++++++++++---------------- src/cmd-visual/cmd-visuals.c | 807 +++++---- src/cmd/cmd-basic.c | 6 +- src/combat/shoot.c | 2039 +++++++++++------------ src/core/hp-mp-processor.c | 6 +- src/effect/effect-item.c | 451 +++-- src/flavor/flavor-describer.c | 1039 ++++++++++++ src/flavor/flavor-describer.h | 5 + src/floor/floor-object.c | 8 +- src/floor/floor-streams.c | 795 +++++---- src/floor/object-scanner.c | 4 +- src/inventory/inventory-curse.c | 66 +- src/inventory/inventory-damage.c | 6 +- src/inventory/inventory-object.c | 8 +- src/inventory/inventory-util.c | 4 +- src/inventory/pack-overflow.c | 4 +- src/inventory/player-inventory.c | 12 +- src/inventory/recharge-processor.c | 4 +- src/io-dump/character-dump.c | 732 ++++----- src/io/targeting.c | 8 +- src/knowledge/knowledge-inventory.c | 292 ++-- src/knowledge/knowledge-items.c | 771 ++++----- src/knowledge/knowledge-quests.c | 500 +++--- src/knowledge/knowledge-self.c | 6 +- src/market/bounty.c | 20 +- src/market/building-craft-fix.c | 12 +- src/market/building-craft-weapon.c | 6 +- src/market/building-enchanter.c | 6 +- src/market/building-recharger.c | 10 +- src/mind/mind-mage.c | 8 +- src/mind/mind-mindcrafter.c | 4 +- src/monster-attack/monster-eating.c | 8 +- src/monster-floor/monster-object.c | 233 +-- src/monster-floor/one-monster-placer.c | 4 +- src/object-enchant/object-curse.c | 130 +- src/object/object-flavor.c | 1006 ------------ src/object/object-flavor.h | 1 - src/object/warning.c | 966 +++++------ src/perception/identification.c | 6 +- src/perception/object-perception.c | 6 +- src/perception/simple-perception.c | 4 +- src/player-attack/attack-chaos-effect.c | 4 +- src/player/patron.c | 1096 ++++++------ src/player/player-damage.c | 4 +- src/player/player-move.c | 8 +- src/player/process-death.c | 485 +++--- src/realm/realm-hex.c | 6 +- src/spell-kind/magic-item-recharger.c | 6 +- src/spell-kind/spells-enchant.c | 6 +- src/spell-kind/spells-equipment.c | 4 +- src/spell-kind/spells-fetcher.c | 6 +- src/spell-kind/spells-floor.c | 807 +++++---- src/spell-kind/spells-perception.c | 12 +- src/spell-realm/spells-sorcery.c | 4 +- src/spell/spells-object.c | 2185 ++++++++++++------------ src/spell/spells-status.c | 4 +- src/store/rumor.c | 223 ++- src/store/store.c | 28 +- src/view/display-inventory.c | 6 +- src/view/display-sub-windows.c | 4 +- src/view/main-window-util.c | 4 +- src/view/object-describer.c | 10 +- src/wizard/wizard-special-process.c | 3 +- src/wizard/wizard-spoiler.c | 13 +- 75 files changed, 9440 insertions(+), 10233 deletions(-) create mode 100644 src/flavor/flavor-describer.c create mode 100644 src/flavor/flavor-describer.h diff --git a/Hengband/Hengband/Hengband.vcxproj b/Hengband/Hengband/Hengband.vcxproj index 454ee8f46..ea976d15d 100644 --- a/Hengband/Hengband/Hengband.vcxproj +++ b/Hengband/Hengband/Hengband.vcxproj @@ -177,6 +177,7 @@ + @@ -646,6 +647,7 @@ + diff --git a/Hengband/Hengband/Hengband.vcxproj.filters b/Hengband/Hengband/Hengband.vcxproj.filters index 7739f94e0..5f2b9cde4 100644 --- a/Hengband/Hengband/Hengband.vcxproj.filters +++ b/Hengband/Hengband/Hengband.vcxproj.filters @@ -1664,6 +1664,9 @@ flavor + + flavor + @@ -3643,6 +3646,9 @@ flavor + + flavor + diff --git a/src/Makefile.am b/src/Makefile.am index fecaf53c1..69d1696b7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -153,6 +153,7 @@ hengband_SOURCES = \ effect/effect-characteristics.h \ \ flavor/flag-inscriptions-table.c flavor/flag-inscriptions-table.h \ + flavor/flavor-describer.c flavor/flavor-describer.h \ flavor/flavor-util.c flavor/flavor-util.h \ flavor/object-flavor-types.h \ \ diff --git a/src/autopick/autopick-destroyer.c b/src/autopick/autopick-destroyer.c index ce00d17f4..96ed795a7 100644 --- a/src/autopick/autopick-destroyer.c +++ b/src/autopick/autopick-destroyer.c @@ -7,7 +7,8 @@ #include "autopick/autopick-destroyer.h" #include "autopick-methods-table.h" #include "autopick/autopick-util.h" -#include "player/player-race-types.h" +#include "core/player-update-types.h" +#include "flavor/flavor-describer.h" #include "game-option/auto-destruction-options.h" #include "game-option/input-options.h" #include "monster-race/monster-race.h" @@ -16,12 +17,11 @@ #include "object-hook/hook-expendable.h" #include "object-hook/hook-quest.h" #include "object-hook/hook-weapon.h" -#include "object/object-flavor.h" #include "object/object-mark-types.h" #include "object/object-value.h" #include "perception/object-perception.h" #include "player/player-move.h" -#include "core/player-update-types.h" +#include "player/player-race-types.h" #include "sv-definition/sv-other-types.h" #include "sv-definition/sv-wand-types.h" #include "util/string-processor.h" @@ -35,100 +35,93 @@ */ static bool is_leave_special_item(player_type *player_ptr, object_type *o_ptr) { - if (!leave_special) return TRUE; - - if (player_ptr->prace == RACE_BALROG) - { - if (o_ptr->tval == TV_CORPSE && - o_ptr->sval == SV_CORPSE && - angband_strchr("pht", r_info[o_ptr->pval].d_char)) - return FALSE; - } - else if (player_ptr->pclass == CLASS_ARCHER) - { - if (o_ptr->tval == TV_SKELETON || - (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_SKELETON)) - return FALSE; - } - else if (player_ptr->pclass == CLASS_NINJA) - { - if (o_ptr->tval == TV_LITE && - o_ptr->name2 == EGO_LITE_DARKNESS && object_is_known(o_ptr)) - return FALSE; - } - else if (player_ptr->pclass == CLASS_BEASTMASTER || - player_ptr->pclass == CLASS_CAVALRY) - { - if (o_ptr->tval == TV_WAND && - o_ptr->sval == SV_WAND_HEAL_MONSTER && object_is_aware(o_ptr)) - return FALSE; - } - - return TRUE; + if (!leave_special) + return TRUE; + + if (player_ptr->prace == RACE_BALROG) { + if (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_CORPSE && angband_strchr("pht", r_info[o_ptr->pval].d_char)) + return FALSE; + } else if (player_ptr->pclass == CLASS_ARCHER) { + if (o_ptr->tval == TV_SKELETON || (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_SKELETON)) + return FALSE; + } else if (player_ptr->pclass == CLASS_NINJA) { + if (o_ptr->tval == TV_LITE && o_ptr->name2 == EGO_LITE_DARKNESS && object_is_known(o_ptr)) + return FALSE; + } else if (player_ptr->pclass == CLASS_BEASTMASTER || player_ptr->pclass == CLASS_CAVALRY) { + if (o_ptr->tval == TV_WAND && o_ptr->sval == SV_WAND_HEAL_MONSTER && object_is_aware(o_ptr)) + return FALSE; + } + + return TRUE; } - /* * Automatically destroy items in this grid. */ static bool is_opt_confirm_destroy(player_type *player_ptr, object_type *o_ptr) { - if (!destroy_items) return FALSE; + if (!destroy_items) + return FALSE; - if (leave_worth) - if (object_value(player_ptr, o_ptr) > 0) return FALSE; + if (leave_worth) + if (object_value(player_ptr, o_ptr) > 0) + return FALSE; - if (leave_equip) - if (object_is_weapon_armour_ammo(player_ptr, o_ptr)) return FALSE; + if (leave_equip) + if (object_is_weapon_armour_ammo(player_ptr, o_ptr)) + return FALSE; - if (leave_chest) - if ((o_ptr->tval == TV_CHEST) && o_ptr->pval) return FALSE; + if (leave_chest) + if ((o_ptr->tval == TV_CHEST) && o_ptr->pval) + return FALSE; - if (leave_wanted) - if (object_is_bounty(player_ptr, o_ptr)) return FALSE; + if (leave_wanted) + if (object_is_bounty(player_ptr, o_ptr)) + return FALSE; - if (leave_corpse) - if (o_ptr->tval == TV_CORPSE) return FALSE; + if (leave_corpse) + if (o_ptr->tval == TV_CORPSE) + return FALSE; - if (leave_junk) - if ((o_ptr->tval == TV_SKELETON) || (o_ptr->tval == TV_BOTTLE) || (o_ptr->tval == TV_JUNK) || (o_ptr->tval == TV_STATUE)) return FALSE; + if (leave_junk) + if ((o_ptr->tval == TV_SKELETON) || (o_ptr->tval == TV_BOTTLE) || (o_ptr->tval == TV_JUNK) || (o_ptr->tval == TV_STATUE)) + return FALSE; - if (!is_leave_special_item(player_ptr, o_ptr)) return FALSE; + if (!is_leave_special_item(player_ptr, o_ptr)) + return FALSE; - if (o_ptr->tval == TV_GOLD) return FALSE; + if (o_ptr->tval == TV_GOLD) + return FALSE; - return TRUE; + return TRUE; } - void auto_destroy_item(player_type *player_ptr, object_type *o_ptr, int autopick_idx) { - bool destroy = FALSE; - if (is_opt_confirm_destroy(player_ptr, o_ptr)) destroy = TRUE; - - if (autopick_idx >= 0 && - !(autopick_list[autopick_idx].action & DO_AUTODESTROY)) - destroy = FALSE; - - if (!always_pickup) - { - if (autopick_idx >= 0 && - (autopick_list[autopick_idx].action & DO_AUTODESTROY)) - destroy = TRUE; - } - - if (!destroy) return; - - disturb(player_ptr, FALSE, FALSE); - if (!can_player_destroy_object(player_ptr, o_ptr)) - { - GAME_TEXT o_name[MAX_NLEN]; - object_desc(player_ptr, o_name, o_ptr, 0); - msg_format(_("%sは破壊不能だ。", "You cannot auto-destroy %s."), o_name); - return; - } - - (void)COPY(&autopick_last_destroyed_object, o_ptr, object_type); - o_ptr->marked |= OM_AUTODESTROY; - player_ptr->update |= PU_AUTODESTROY; + bool destroy = FALSE; + if (is_opt_confirm_destroy(player_ptr, o_ptr)) + destroy = TRUE; + + if (autopick_idx >= 0 && !(autopick_list[autopick_idx].action & DO_AUTODESTROY)) + destroy = FALSE; + + if (!always_pickup) { + if (autopick_idx >= 0 && (autopick_list[autopick_idx].action & DO_AUTODESTROY)) + destroy = TRUE; + } + + if (!destroy) + return; + + disturb(player_ptr, FALSE, FALSE); + if (!can_player_destroy_object(player_ptr, o_ptr)) { + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(player_ptr, o_name, o_ptr, 0); + msg_format(_("%sは破壊不能だ。", "You cannot auto-destroy %s."), o_name); + return; + } + + (void)COPY(&autopick_last_destroyed_object, o_ptr, object_type); + o_ptr->marked |= OM_AUTODESTROY; + player_ptr->update |= PU_AUTODESTROY; } diff --git a/src/autopick/autopick-entry.c b/src/autopick/autopick-entry.c index 0e7a56bdc..b2b98c9b7 100644 --- a/src/autopick/autopick-entry.c +++ b/src/autopick/autopick-entry.c @@ -4,6 +4,7 @@ #include "autopick/autopick-keys-table.h" #include "autopick/autopick-methods-table.h" #include "core/show-file.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "monster-race/monster-race.h" @@ -16,9 +17,8 @@ #include "object-hook/hook-quest.h" #include "object-hook/hook-weapon.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" -#include "object/object-kind.h" #include "object/object-info.h" +#include "object/object-kind.h" #include "perception/object-perception.h" #include "player/player-realm.h" #include "util/quarks.h" @@ -33,573 +33,620 @@ static char kanji_colon[] = ":"; */ bool autopick_new_entry(autopick_type *entry, concptr str, bool allow_default) { - if (str[0] && str[1] == ':') switch (str[0]) - { - case '?': case '%': - case 'A': case 'P': case 'C': - return FALSE; - } - - entry->flag[0] = entry->flag[1] = 0L; - entry->dice = 0; - entry->bonus = 0; - - byte act = DO_AUTOPICK | DO_DISPLAY; - while (TRUE) - { - if ((act & DO_AUTOPICK) && *str == '!') - { - act &= ~DO_AUTOPICK; - act |= DO_AUTODESTROY; - str++; - continue; - } - - if ((act & DO_AUTOPICK) && *str == '~') - { - act &= ~DO_AUTOPICK; - act |= DONT_AUTOPICK; - str++; - continue; - } - - if ((act & DO_AUTOPICK) && *str == ';') - { - act &= ~DO_AUTOPICK; - act |= DO_QUERY_AUTOPICK; - str++; - continue; - } - - if ((act & DO_DISPLAY) && *str == '(') - { - act &= ~DO_DISPLAY; - str++; - continue; - } - - break; - } - - concptr insc = NULL; - char buf[MAX_LINELEN]; - int i; - for (i = 0; *str; i++) - { - char c = *str++; + if (str[0] && str[1] == ':') + switch (str[0]) { + case '?': + case '%': + case 'A': + case 'P': + case 'C': + return FALSE; + } + + entry->flag[0] = entry->flag[1] = 0L; + entry->dice = 0; + entry->bonus = 0; + + byte act = DO_AUTOPICK | DO_DISPLAY; + while (TRUE) { + if ((act & DO_AUTOPICK) && *str == '!') { + act &= ~DO_AUTOPICK; + act |= DO_AUTODESTROY; + str++; + continue; + } + + if ((act & DO_AUTOPICK) && *str == '~') { + act &= ~DO_AUTOPICK; + act |= DONT_AUTOPICK; + str++; + continue; + } + + if ((act & DO_AUTOPICK) && *str == ';') { + act &= ~DO_AUTOPICK; + act |= DO_QUERY_AUTOPICK; + str++; + continue; + } + + if ((act & DO_DISPLAY) && *str == '(') { + act &= ~DO_DISPLAY; + str++; + continue; + } + + break; + } + + concptr insc = NULL; + char buf[MAX_LINELEN]; + int i; + for (i = 0; *str; i++) { + char c = *str++; #ifdef JP - if (iskanji(c)) - { - buf[i++] = c; - buf[i] = *str++; - continue; - } + if (iskanji(c)) { + buf[i++] = c; + buf[i] = *str++; + continue; + } #endif - if (c == '#') - { - buf[i] = '\0'; - insc = str; - break; - } - - if (isupper(c)) c = (char)tolower(c); - - buf[i] = c; - } - - buf[i] = '\0'; - if (!allow_default && *buf == 0) return FALSE; - if (*buf == 0 && insc) return FALSE; - - concptr prev_ptr, ptr; - ptr = prev_ptr = buf; - concptr old_ptr = NULL; - while (old_ptr != ptr) - { - old_ptr = ptr; - if (MATCH_KEY(KEY_ALL)) ADD_FLG(FLG_ALL); - if (MATCH_KEY(KEY_COLLECTING)) ADD_FLG(FLG_COLLECTING); - if (MATCH_KEY(KEY_UNAWARE)) ADD_FLG(FLG_UNAWARE); - if (MATCH_KEY(KEY_UNIDENTIFIED)) ADD_FLG(FLG_UNIDENTIFIED); - if (MATCH_KEY(KEY_IDENTIFIED)) ADD_FLG(FLG_IDENTIFIED); - if (MATCH_KEY(KEY_STAR_IDENTIFIED)) ADD_FLG(FLG_STAR_IDENTIFIED); - if (MATCH_KEY(KEY_BOOSTED)) ADD_FLG(FLG_BOOSTED); - - /*** Weapons whose dd*ds is more than nn ***/ - if (MATCH_KEY2(KEY_MORE_THAN)) - { - int k = 0; - entry->dice = 0; - - while (' ' == *ptr) ptr++; - - while ('0' <= *ptr && *ptr <= '9') - { - entry->dice = 10 * entry->dice + (*ptr - '0'); - ptr++; - k++; - } - - if (k > 0 && k <= 2) - { - (void)MATCH_KEY(KEY_DICE); - ADD_FLG(FLG_MORE_DICE); - } - else - ptr = prev_ptr; - } - - /*** Items whose magical bonus is more than n ***/ - if (MATCH_KEY2(KEY_MORE_BONUS)) - { - int k = 0; - entry->bonus = 0; - - while (' ' == *ptr) ptr++; - - while ('0' <= *ptr && *ptr <= '9') - { - entry->bonus = 10 * entry->bonus + (*ptr - '0'); - ptr++; - k++; - } - - if (k > 0 && k <= 2) - { + if (c == '#') { + buf[i] = '\0'; + insc = str; + break; + } + + if (isupper(c)) + c = (char)tolower(c); + + buf[i] = c; + } + + buf[i] = '\0'; + if (!allow_default && *buf == 0) + return FALSE; + if (*buf == 0 && insc) + return FALSE; + + concptr prev_ptr, ptr; + ptr = prev_ptr = buf; + concptr old_ptr = NULL; + while (old_ptr != ptr) { + old_ptr = ptr; + if (MATCH_KEY(KEY_ALL)) + ADD_FLG(FLG_ALL); + if (MATCH_KEY(KEY_COLLECTING)) + ADD_FLG(FLG_COLLECTING); + if (MATCH_KEY(KEY_UNAWARE)) + ADD_FLG(FLG_UNAWARE); + if (MATCH_KEY(KEY_UNIDENTIFIED)) + ADD_FLG(FLG_UNIDENTIFIED); + if (MATCH_KEY(KEY_IDENTIFIED)) + ADD_FLG(FLG_IDENTIFIED); + if (MATCH_KEY(KEY_STAR_IDENTIFIED)) + ADD_FLG(FLG_STAR_IDENTIFIED); + if (MATCH_KEY(KEY_BOOSTED)) + ADD_FLG(FLG_BOOSTED); + + /*** Weapons whose dd*ds is more than nn ***/ + if (MATCH_KEY2(KEY_MORE_THAN)) { + int k = 0; + entry->dice = 0; + + while (' ' == *ptr) + ptr++; + + while ('0' <= *ptr && *ptr <= '9') { + entry->dice = 10 * entry->dice + (*ptr - '0'); + ptr++; + k++; + } + + if (k > 0 && k <= 2) { + (void)MATCH_KEY(KEY_DICE); + ADD_FLG(FLG_MORE_DICE); + } else + ptr = prev_ptr; + } + + /*** Items whose magical bonus is more than n ***/ + if (MATCH_KEY2(KEY_MORE_BONUS)) { + int k = 0; + entry->bonus = 0; + + while (' ' == *ptr) + ptr++; + + while ('0' <= *ptr && *ptr <= '9') { + entry->bonus = 10 * entry->bonus + (*ptr - '0'); + ptr++; + k++; + } + + if (k > 0 && k <= 2) { #ifdef JP - (void)MATCH_KEY(KEY_MORE_BONUS2); + (void)MATCH_KEY(KEY_MORE_BONUS2); #else - if (' ' == *ptr) ptr++; + if (' ' == *ptr) + ptr++; #endif - ADD_FLG(FLG_MORE_BONUS); - } - else - ptr = prev_ptr; - } - - if (MATCH_KEY(KEY_WORTHLESS)) ADD_FLG(FLG_WORTHLESS); - if (MATCH_KEY(KEY_EGO)) ADD_FLG(FLG_EGO); - if (MATCH_KEY(KEY_GOOD)) ADD_FLG(FLG_GOOD); - if (MATCH_KEY(KEY_NAMELESS)) ADD_FLG(FLG_NAMELESS); - if (MATCH_KEY(KEY_AVERAGE)) ADD_FLG(FLG_AVERAGE); - if (MATCH_KEY(KEY_RARE)) ADD_FLG(FLG_RARE); - if (MATCH_KEY(KEY_COMMON)) ADD_FLG(FLG_COMMON); - if (MATCH_KEY(KEY_WANTED)) ADD_FLG(FLG_WANTED); - if (MATCH_KEY(KEY_UNIQUE)) ADD_FLG(FLG_UNIQUE); - if (MATCH_KEY(KEY_HUMAN)) ADD_FLG(FLG_HUMAN); - if (MATCH_KEY(KEY_UNREADABLE)) ADD_FLG(FLG_UNREADABLE); - if (MATCH_KEY(KEY_REALM1)) ADD_FLG(FLG_REALM1); - if (MATCH_KEY(KEY_REALM2)) ADD_FLG(FLG_REALM2); - if (MATCH_KEY(KEY_FIRST)) ADD_FLG(FLG_FIRST); - if (MATCH_KEY(KEY_SECOND)) ADD_FLG(FLG_SECOND); - if (MATCH_KEY(KEY_THIRD)) ADD_FLG(FLG_THIRD); - if (MATCH_KEY(KEY_FOURTH)) ADD_FLG(FLG_FOURTH); - } - - int prev_flg = -1; - if (MATCH_KEY2(KEY_ARTIFACT)) ADD_FLG_NOUN(FLG_ARTIFACT); - - if (MATCH_KEY2(KEY_ITEMS)) ADD_FLG_NOUN(FLG_ITEMS); - else if (MATCH_KEY2(KEY_WEAPONS)) ADD_FLG_NOUN(FLG_WEAPONS); - else if (MATCH_KEY2(KEY_FAVORITE_WEAPONS)) ADD_FLG_NOUN(FLG_FAVORITE_WEAPONS); - else if (MATCH_KEY2(KEY_ARMORS)) ADD_FLG_NOUN(FLG_ARMORS); - else if (MATCH_KEY2(KEY_MISSILES)) ADD_FLG_NOUN(FLG_MISSILES); - else if (MATCH_KEY2(KEY_DEVICES)) ADD_FLG_NOUN(FLG_DEVICES); - else if (MATCH_KEY2(KEY_LIGHTS)) ADD_FLG_NOUN(FLG_LIGHTS); - else if (MATCH_KEY2(KEY_JUNKS)) ADD_FLG_NOUN(FLG_JUNKS); - else if (MATCH_KEY2(KEY_CORPSES)) ADD_FLG_NOUN(FLG_CORPSES); - else if (MATCH_KEY2(KEY_SPELLBOOKS)) ADD_FLG_NOUN(FLG_SPELLBOOKS); - else if (MATCH_KEY2(KEY_HAFTED)) ADD_FLG_NOUN(FLG_HAFTED); - else if (MATCH_KEY2(KEY_SHIELDS)) ADD_FLG_NOUN(FLG_SHIELDS); - else if (MATCH_KEY2(KEY_BOWS)) ADD_FLG_NOUN(FLG_BOWS); - else if (MATCH_KEY2(KEY_RINGS)) ADD_FLG_NOUN(FLG_RINGS); - else if (MATCH_KEY2(KEY_AMULETS)) ADD_FLG_NOUN(FLG_AMULETS); - else if (MATCH_KEY2(KEY_SUITS)) ADD_FLG_NOUN(FLG_SUITS); - else if (MATCH_KEY2(KEY_CLOAKS)) ADD_FLG_NOUN(FLG_CLOAKS); - else if (MATCH_KEY2(KEY_HELMS)) ADD_FLG_NOUN(FLG_HELMS); - else if (MATCH_KEY2(KEY_GLOVES)) ADD_FLG_NOUN(FLG_GLOVES); - else if (MATCH_KEY2(KEY_BOOTS)) ADD_FLG_NOUN(FLG_BOOTS); - - if (*ptr == ':') - ptr++; + ADD_FLG(FLG_MORE_BONUS); + } else + ptr = prev_ptr; + } + + if (MATCH_KEY(KEY_WORTHLESS)) + ADD_FLG(FLG_WORTHLESS); + if (MATCH_KEY(KEY_EGO)) + ADD_FLG(FLG_EGO); + if (MATCH_KEY(KEY_GOOD)) + ADD_FLG(FLG_GOOD); + if (MATCH_KEY(KEY_NAMELESS)) + ADD_FLG(FLG_NAMELESS); + if (MATCH_KEY(KEY_AVERAGE)) + ADD_FLG(FLG_AVERAGE); + if (MATCH_KEY(KEY_RARE)) + ADD_FLG(FLG_RARE); + if (MATCH_KEY(KEY_COMMON)) + ADD_FLG(FLG_COMMON); + if (MATCH_KEY(KEY_WANTED)) + ADD_FLG(FLG_WANTED); + if (MATCH_KEY(KEY_UNIQUE)) + ADD_FLG(FLG_UNIQUE); + if (MATCH_KEY(KEY_HUMAN)) + ADD_FLG(FLG_HUMAN); + if (MATCH_KEY(KEY_UNREADABLE)) + ADD_FLG(FLG_UNREADABLE); + if (MATCH_KEY(KEY_REALM1)) + ADD_FLG(FLG_REALM1); + if (MATCH_KEY(KEY_REALM2)) + ADD_FLG(FLG_REALM2); + if (MATCH_KEY(KEY_FIRST)) + ADD_FLG(FLG_FIRST); + if (MATCH_KEY(KEY_SECOND)) + ADD_FLG(FLG_SECOND); + if (MATCH_KEY(KEY_THIRD)) + ADD_FLG(FLG_THIRD); + if (MATCH_KEY(KEY_FOURTH)) + ADD_FLG(FLG_FOURTH); + } + + int prev_flg = -1; + if (MATCH_KEY2(KEY_ARTIFACT)) + ADD_FLG_NOUN(FLG_ARTIFACT); + + if (MATCH_KEY2(KEY_ITEMS)) + ADD_FLG_NOUN(FLG_ITEMS); + else if (MATCH_KEY2(KEY_WEAPONS)) + ADD_FLG_NOUN(FLG_WEAPONS); + else if (MATCH_KEY2(KEY_FAVORITE_WEAPONS)) + ADD_FLG_NOUN(FLG_FAVORITE_WEAPONS); + else if (MATCH_KEY2(KEY_ARMORS)) + ADD_FLG_NOUN(FLG_ARMORS); + else if (MATCH_KEY2(KEY_MISSILES)) + ADD_FLG_NOUN(FLG_MISSILES); + else if (MATCH_KEY2(KEY_DEVICES)) + ADD_FLG_NOUN(FLG_DEVICES); + else if (MATCH_KEY2(KEY_LIGHTS)) + ADD_FLG_NOUN(FLG_LIGHTS); + else if (MATCH_KEY2(KEY_JUNKS)) + ADD_FLG_NOUN(FLG_JUNKS); + else if (MATCH_KEY2(KEY_CORPSES)) + ADD_FLG_NOUN(FLG_CORPSES); + else if (MATCH_KEY2(KEY_SPELLBOOKS)) + ADD_FLG_NOUN(FLG_SPELLBOOKS); + else if (MATCH_KEY2(KEY_HAFTED)) + ADD_FLG_NOUN(FLG_HAFTED); + else if (MATCH_KEY2(KEY_SHIELDS)) + ADD_FLG_NOUN(FLG_SHIELDS); + else if (MATCH_KEY2(KEY_BOWS)) + ADD_FLG_NOUN(FLG_BOWS); + else if (MATCH_KEY2(KEY_RINGS)) + ADD_FLG_NOUN(FLG_RINGS); + else if (MATCH_KEY2(KEY_AMULETS)) + ADD_FLG_NOUN(FLG_AMULETS); + else if (MATCH_KEY2(KEY_SUITS)) + ADD_FLG_NOUN(FLG_SUITS); + else if (MATCH_KEY2(KEY_CLOAKS)) + ADD_FLG_NOUN(FLG_CLOAKS); + else if (MATCH_KEY2(KEY_HELMS)) + ADD_FLG_NOUN(FLG_HELMS); + else if (MATCH_KEY2(KEY_GLOVES)) + ADD_FLG_NOUN(FLG_GLOVES); + else if (MATCH_KEY2(KEY_BOOTS)) + ADD_FLG_NOUN(FLG_BOOTS); + + if (*ptr == ':') + ptr++; #ifdef JP - else if (ptr[0] == kanji_colon[0] && ptr[1] == kanji_colon[1]) - ptr += 2; + else if (ptr[0] == kanji_colon[0] && ptr[1] == kanji_colon[1]) + ptr += 2; #endif - else if (*ptr == '\0') - { - if (prev_flg == -1) - ADD_FLG_NOUN(FLG_ITEMS); - } - else - { - if (prev_flg != -1) - { - entry->flag[prev_flg / 32] &= ~(1L << (prev_flg % 32)); - ptr = prev_ptr; - } - } - - entry->name = string_make(ptr); - entry->action = act; - entry->insc = string_make(insc); - - return TRUE; + else if (*ptr == '\0') { + if (prev_flg == -1) + ADD_FLG_NOUN(FLG_ITEMS); + } else { + if (prev_flg != -1) { + entry->flag[prev_flg / 32] &= ~(1L << (prev_flg % 32)); + ptr = prev_ptr; + } + } + + entry->name = string_make(ptr); + entry->action = act; + entry->insc = string_make(insc); + + return TRUE; } - /* * Get auto-picker entry from o_ptr. */ void autopick_entry_from_object(player_type *player_ptr, autopick_type *entry, object_type *o_ptr) { - /* Assume that object name is to be added */ - bool name = TRUE; - GAME_TEXT name_str[MAX_NLEN]; - name_str[0] = '\0'; - entry->insc = string_make(quark_str(o_ptr->inscription)); - entry->action = DO_AUTOPICK | DO_DISPLAY; - entry->flag[0] = entry->flag[1] = 0L; - entry->dice = 0; - - // エゴ銘が邪魔かもしれないので、デフォルトで「^」は付けない. - // We can always use the ^ mark in English. - bool is_hat_added = _(FALSE, TRUE); - if (!object_is_aware(o_ptr)) - { - ADD_FLG(FLG_UNAWARE); - is_hat_added = TRUE; - } - else if (!object_is_known(o_ptr)) - { - if (!(o_ptr->ident & IDENT_SENSE)) - { - ADD_FLG(FLG_UNIDENTIFIED); - is_hat_added = TRUE; - } - else - { - switch (o_ptr->feeling) - { - case FEEL_AVERAGE: - case FEEL_GOOD: - ADD_FLG(FLG_NAMELESS); - is_hat_added = TRUE; - break; - - case FEEL_BROKEN: - case FEEL_CURSED: - ADD_FLG(FLG_NAMELESS); - ADD_FLG(FLG_WORTHLESS); - is_hat_added = TRUE; - break; - - case FEEL_TERRIBLE: - case FEEL_WORTHLESS: - ADD_FLG(FLG_WORTHLESS); - break; - - case FEEL_EXCELLENT: - ADD_FLG(FLG_EGO); - break; - - case FEEL_UNCURSED: - break; - - default: - break; - } - } - } - else - { - if (object_is_ego(o_ptr)) - { - if (object_is_weapon_armour_ammo(player_ptr, o_ptr)) - { - /* - * Base name of ego weapons and armors - * are almost meaningless. - * Register the ego type only. - */ - ego_item_type *e_ptr = &e_info[o_ptr->name2]; + /* Assume that object name is to be added */ + bool name = TRUE; + GAME_TEXT name_str[MAX_NLEN]; + name_str[0] = '\0'; + entry->insc = string_make(quark_str(o_ptr->inscription)); + entry->action = DO_AUTOPICK | DO_DISPLAY; + entry->flag[0] = entry->flag[1] = 0L; + entry->dice = 0; + + // エゴ銘が邪魔かもしれないので、デフォルトで「^」は付けない. + // We can always use the ^ mark in English. + bool is_hat_added = _(FALSE, TRUE); + if (!object_is_aware(o_ptr)) { + ADD_FLG(FLG_UNAWARE); + is_hat_added = TRUE; + } else if (!object_is_known(o_ptr)) { + if (!(o_ptr->ident & IDENT_SENSE)) { + ADD_FLG(FLG_UNIDENTIFIED); + is_hat_added = TRUE; + } else { + switch (o_ptr->feeling) { + case FEEL_AVERAGE: + case FEEL_GOOD: + ADD_FLG(FLG_NAMELESS); + is_hat_added = TRUE; + break; + + case FEEL_BROKEN: + case FEEL_CURSED: + ADD_FLG(FLG_NAMELESS); + ADD_FLG(FLG_WORTHLESS); + is_hat_added = TRUE; + break; + + case FEEL_TERRIBLE: + case FEEL_WORTHLESS: + ADD_FLG(FLG_WORTHLESS); + break; + + case FEEL_EXCELLENT: + ADD_FLG(FLG_EGO); + break; + + case FEEL_UNCURSED: + break; + + default: + break; + } + } + } else { + if (object_is_ego(o_ptr)) { + if (object_is_weapon_armour_ammo(player_ptr, o_ptr)) { + /* + * Base name of ego weapons and armors + * are almost meaningless. + * Register the ego type only. + */ + ego_item_type *e_ptr = &e_info[o_ptr->name2]; #ifdef JP - /* エゴ銘には「^」マークが使える */ - sprintf(name_str, "^%s", e_name + e_ptr->name); + /* エゴ銘には「^」マークが使える */ + sprintf(name_str, "^%s", e_name + e_ptr->name); #else - /* We ommit the basename and cannot use the ^ mark */ - strcpy(name_str, e_name + e_ptr->name); + /* We ommit the basename and cannot use the ^ mark */ + strcpy(name_str, e_name + e_ptr->name); #endif - name = FALSE; - if (!object_is_rare(o_ptr)) ADD_FLG(FLG_COMMON); - } - - ADD_FLG(FLG_EGO); - } - else if (object_is_artifact(o_ptr)) - ADD_FLG(FLG_ARTIFACT); - else - { - if (object_is_equipment(o_ptr)) - ADD_FLG(FLG_NAMELESS); - - is_hat_added = TRUE; - } - } - - if (object_is_melee_weapon(o_ptr)) - { - object_kind *k_ptr = &k_info[o_ptr->k_idx]; - - if ((o_ptr->dd != k_ptr->dd) || (o_ptr->ds != k_ptr->ds)) - ADD_FLG(FLG_BOOSTED); - } - - if (object_is_bounty(player_ptr, o_ptr)) - { - REM_FLG(FLG_WORTHLESS); - ADD_FLG(FLG_WANTED); - } - - if ((o_ptr->tval == TV_CORPSE || o_ptr->tval == TV_STATUE) - && (r_info[o_ptr->pval].flags1 & RF1_UNIQUE)) - { - ADD_FLG(FLG_UNIQUE); - } - - if (o_ptr->tval == TV_CORPSE && angband_strchr("pht", r_info[o_ptr->pval].d_char)) - { - ADD_FLG(FLG_HUMAN); - } - - if (o_ptr->tval >= TV_LIFE_BOOK && - !check_book_realm(player_ptr, o_ptr->tval, o_ptr->sval)) - { - ADD_FLG(FLG_UNREADABLE); - if (o_ptr->tval != TV_ARCANE_BOOK) name = FALSE; - } - - if (get_realm1_book(player_ptr) == o_ptr->tval && - player_ptr->pclass != CLASS_SORCERER && - player_ptr->pclass != CLASS_RED_MAGE) - { - ADD_FLG(FLG_REALM1); - name = FALSE; - } - - if (get_realm2_book(player_ptr) == o_ptr->tval && - player_ptr->pclass != CLASS_SORCERER && - player_ptr->pclass != CLASS_RED_MAGE) - { - ADD_FLG(FLG_REALM2); - name = FALSE; - } - - if (o_ptr->tval >= TV_LIFE_BOOK && 0 == o_ptr->sval) - ADD_FLG(FLG_FIRST); - if (o_ptr->tval >= TV_LIFE_BOOK && 1 == o_ptr->sval) - ADD_FLG(FLG_SECOND); - if (o_ptr->tval >= TV_LIFE_BOOK && 2 == o_ptr->sval) - ADD_FLG(FLG_THIRD); - if (o_ptr->tval >= TV_LIFE_BOOK && 3 == o_ptr->sval) - ADD_FLG(FLG_FOURTH); - - if (object_is_ammo(o_ptr)) - ADD_FLG(FLG_MISSILES); - else if (o_ptr->tval == TV_SCROLL || o_ptr->tval == TV_STAFF - || o_ptr->tval == TV_WAND || o_ptr->tval == TV_ROD) - ADD_FLG(FLG_DEVICES); - else if (o_ptr->tval == TV_LITE) - ADD_FLG(FLG_LIGHTS); - else if (o_ptr->tval == TV_SKELETON || o_ptr->tval == TV_BOTTLE - || o_ptr->tval == TV_JUNK || o_ptr->tval == TV_STATUE) - ADD_FLG(FLG_JUNKS); - else if (o_ptr->tval == TV_CORPSE) - ADD_FLG(FLG_CORPSES); - else if (o_ptr->tval >= TV_LIFE_BOOK) - ADD_FLG(FLG_SPELLBOOKS); - else if (o_ptr->tval == TV_POLEARM || o_ptr->tval == TV_SWORD - || o_ptr->tval == TV_DIGGING || o_ptr->tval == TV_HAFTED) - ADD_FLG(FLG_WEAPONS); - else if (o_ptr->tval == TV_SHIELD) - ADD_FLG(FLG_SHIELDS); - else if (o_ptr->tval == TV_BOW) - ADD_FLG(FLG_BOWS); - else if (o_ptr->tval == TV_RING) - ADD_FLG(FLG_RINGS); - else if (o_ptr->tval == TV_AMULET) - ADD_FLG(FLG_AMULETS); - else if (o_ptr->tval == TV_DRAG_ARMOR || o_ptr->tval == TV_HARD_ARMOR || - o_ptr->tval == TV_SOFT_ARMOR) - ADD_FLG(FLG_SUITS); - else if (o_ptr->tval == TV_CLOAK) - ADD_FLG(FLG_CLOAKS); - else if (o_ptr->tval == TV_HELM) - ADD_FLG(FLG_HELMS); - else if (o_ptr->tval == TV_GLOVES) - ADD_FLG(FLG_GLOVES); - else if (o_ptr->tval == TV_BOOTS) - ADD_FLG(FLG_BOOTS); - - if (!name) - { - str_tolower(name_str); - entry->name = string_make(name_str); - return; - } - - GAME_TEXT o_name[MAX_NLEN]; - object_desc(player_ptr, o_name, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL | OD_NAME_ONLY)); - - /* - * If necessary, add a '^' which indicates the - * beginning of line. - */ - sprintf(name_str, "%s%s", is_hat_added ? "^" : "", o_name); - str_tolower(name_str); - entry->name = string_make(name_str); + name = FALSE; + if (!object_is_rare(o_ptr)) + ADD_FLG(FLG_COMMON); + } + + ADD_FLG(FLG_EGO); + } else if (object_is_artifact(o_ptr)) + ADD_FLG(FLG_ARTIFACT); + else { + if (object_is_equipment(o_ptr)) + ADD_FLG(FLG_NAMELESS); + + is_hat_added = TRUE; + } + } + + if (object_is_melee_weapon(o_ptr)) { + object_kind *k_ptr = &k_info[o_ptr->k_idx]; + + if ((o_ptr->dd != k_ptr->dd) || (o_ptr->ds != k_ptr->ds)) + ADD_FLG(FLG_BOOSTED); + } + + if (object_is_bounty(player_ptr, o_ptr)) { + REM_FLG(FLG_WORTHLESS); + ADD_FLG(FLG_WANTED); + } + + if ((o_ptr->tval == TV_CORPSE || o_ptr->tval == TV_STATUE) && (r_info[o_ptr->pval].flags1 & RF1_UNIQUE)) { + ADD_FLG(FLG_UNIQUE); + } + + if (o_ptr->tval == TV_CORPSE && angband_strchr("pht", r_info[o_ptr->pval].d_char)) { + ADD_FLG(FLG_HUMAN); + } + + if (o_ptr->tval >= TV_LIFE_BOOK && !check_book_realm(player_ptr, o_ptr->tval, o_ptr->sval)) { + ADD_FLG(FLG_UNREADABLE); + if (o_ptr->tval != TV_ARCANE_BOOK) + name = FALSE; + } + + if (get_realm1_book(player_ptr) == o_ptr->tval && player_ptr->pclass != CLASS_SORCERER && player_ptr->pclass != CLASS_RED_MAGE) { + ADD_FLG(FLG_REALM1); + name = FALSE; + } + + if (get_realm2_book(player_ptr) == o_ptr->tval && player_ptr->pclass != CLASS_SORCERER && player_ptr->pclass != CLASS_RED_MAGE) { + ADD_FLG(FLG_REALM2); + name = FALSE; + } + + if (o_ptr->tval >= TV_LIFE_BOOK && 0 == o_ptr->sval) + ADD_FLG(FLG_FIRST); + if (o_ptr->tval >= TV_LIFE_BOOK && 1 == o_ptr->sval) + ADD_FLG(FLG_SECOND); + if (o_ptr->tval >= TV_LIFE_BOOK && 2 == o_ptr->sval) + ADD_FLG(FLG_THIRD); + if (o_ptr->tval >= TV_LIFE_BOOK && 3 == o_ptr->sval) + ADD_FLG(FLG_FOURTH); + + if (object_is_ammo(o_ptr)) + ADD_FLG(FLG_MISSILES); + else if (o_ptr->tval == TV_SCROLL || o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND || o_ptr->tval == TV_ROD) + ADD_FLG(FLG_DEVICES); + else if (o_ptr->tval == TV_LITE) + ADD_FLG(FLG_LIGHTS); + else if (o_ptr->tval == TV_SKELETON || o_ptr->tval == TV_BOTTLE || o_ptr->tval == TV_JUNK || o_ptr->tval == TV_STATUE) + ADD_FLG(FLG_JUNKS); + else if (o_ptr->tval == TV_CORPSE) + ADD_FLG(FLG_CORPSES); + else if (o_ptr->tval >= TV_LIFE_BOOK) + ADD_FLG(FLG_SPELLBOOKS); + else if (o_ptr->tval == TV_POLEARM || o_ptr->tval == TV_SWORD || o_ptr->tval == TV_DIGGING || o_ptr->tval == TV_HAFTED) + ADD_FLG(FLG_WEAPONS); + else if (o_ptr->tval == TV_SHIELD) + ADD_FLG(FLG_SHIELDS); + else if (o_ptr->tval == TV_BOW) + ADD_FLG(FLG_BOWS); + else if (o_ptr->tval == TV_RING) + ADD_FLG(FLG_RINGS); + else if (o_ptr->tval == TV_AMULET) + ADD_FLG(FLG_AMULETS); + else if (o_ptr->tval == TV_DRAG_ARMOR || o_ptr->tval == TV_HARD_ARMOR || o_ptr->tval == TV_SOFT_ARMOR) + ADD_FLG(FLG_SUITS); + else if (o_ptr->tval == TV_CLOAK) + ADD_FLG(FLG_CLOAKS); + else if (o_ptr->tval == TV_HELM) + ADD_FLG(FLG_HELMS); + else if (o_ptr->tval == TV_GLOVES) + ADD_FLG(FLG_GLOVES); + else if (o_ptr->tval == TV_BOOTS) + ADD_FLG(FLG_BOOTS); + + if (!name) { + str_tolower(name_str); + entry->name = string_make(name_str); + return; + } + + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(player_ptr, o_name, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL | OD_NAME_ONLY)); + + /* + * If necessary, add a '^' which indicates the + * beginning of line. + */ + sprintf(name_str, "%s%s", is_hat_added ? "^" : "", o_name); + str_tolower(name_str); + entry->name = string_make(name_str); } - /* * Reconstruct preference line from entry */ concptr autopick_line_from_entry(autopick_type *entry) { - char buf[MAX_LINELEN]; - *buf = '\0'; - if (!(entry->action & DO_DISPLAY)) strcat(buf, "("); - if (entry->action & DO_QUERY_AUTOPICK) strcat(buf, ";"); - if (entry->action & DO_AUTODESTROY) strcat(buf, "!"); - if (entry->action & DONT_AUTOPICK) strcat(buf, "~"); - - char *ptr; - ptr = buf; - if (IS_FLG(FLG_ALL)) ADD_KEY(KEY_ALL); - if (IS_FLG(FLG_COLLECTING)) ADD_KEY(KEY_COLLECTING); - if (IS_FLG(FLG_UNAWARE)) ADD_KEY(KEY_UNAWARE); - if (IS_FLG(FLG_UNIDENTIFIED)) ADD_KEY(KEY_UNIDENTIFIED); - if (IS_FLG(FLG_IDENTIFIED)) ADD_KEY(KEY_IDENTIFIED); - if (IS_FLG(FLG_STAR_IDENTIFIED)) ADD_KEY(KEY_STAR_IDENTIFIED); - if (IS_FLG(FLG_BOOSTED)) ADD_KEY(KEY_BOOSTED); - - if (IS_FLG(FLG_MORE_DICE)) - { - ADD_KEY(KEY_MORE_THAN); - strcat(ptr, format("%d", entry->dice)); - ADD_KEY(KEY_DICE); - } - - if (IS_FLG(FLG_MORE_BONUS)) - { - ADD_KEY(KEY_MORE_BONUS); - strcat(ptr, format("%d", entry->bonus)); - ADD_KEY(KEY_MORE_BONUS2); - } - - if (IS_FLG(FLG_UNREADABLE)) ADD_KEY(KEY_UNREADABLE); - if (IS_FLG(FLG_REALM1)) ADD_KEY(KEY_REALM1); - if (IS_FLG(FLG_REALM2)) ADD_KEY(KEY_REALM2); - if (IS_FLG(FLG_FIRST)) ADD_KEY(KEY_FIRST); - if (IS_FLG(FLG_SECOND)) ADD_KEY(KEY_SECOND); - if (IS_FLG(FLG_THIRD)) ADD_KEY(KEY_THIRD); - if (IS_FLG(FLG_FOURTH)) ADD_KEY(KEY_FOURTH); - if (IS_FLG(FLG_WANTED)) ADD_KEY(KEY_WANTED); - if (IS_FLG(FLG_UNIQUE)) ADD_KEY(KEY_UNIQUE); - if (IS_FLG(FLG_HUMAN)) ADD_KEY(KEY_HUMAN); - if (IS_FLG(FLG_WORTHLESS)) ADD_KEY(KEY_WORTHLESS); - if (IS_FLG(FLG_GOOD)) ADD_KEY(KEY_GOOD); - if (IS_FLG(FLG_NAMELESS)) ADD_KEY(KEY_NAMELESS); - if (IS_FLG(FLG_AVERAGE)) ADD_KEY(KEY_AVERAGE); - if (IS_FLG(FLG_RARE)) ADD_KEY(KEY_RARE); - if (IS_FLG(FLG_COMMON)) ADD_KEY(KEY_COMMON); - if (IS_FLG(FLG_EGO)) ADD_KEY(KEY_EGO); - - if (IS_FLG(FLG_ARTIFACT)) ADD_KEY(KEY_ARTIFACT); - - bool sepa_flag = TRUE; - if (IS_FLG(FLG_ITEMS)) ADD_KEY2(KEY_ITEMS); - else if (IS_FLG(FLG_WEAPONS)) ADD_KEY2(KEY_WEAPONS); - else if (IS_FLG(FLG_FAVORITE_WEAPONS)) ADD_KEY2(KEY_FAVORITE_WEAPONS); - else if (IS_FLG(FLG_ARMORS)) ADD_KEY2(KEY_ARMORS); - else if (IS_FLG(FLG_MISSILES)) ADD_KEY2(KEY_MISSILES); - else if (IS_FLG(FLG_DEVICES)) ADD_KEY2(KEY_DEVICES); - else if (IS_FLG(FLG_LIGHTS)) ADD_KEY2(KEY_LIGHTS); - else if (IS_FLG(FLG_JUNKS)) ADD_KEY2(KEY_JUNKS); - else if (IS_FLG(FLG_CORPSES)) ADD_KEY2(KEY_CORPSES); - else if (IS_FLG(FLG_SPELLBOOKS)) ADD_KEY2(KEY_SPELLBOOKS); - else if (IS_FLG(FLG_HAFTED)) ADD_KEY2(KEY_HAFTED); - else if (IS_FLG(FLG_SHIELDS)) ADD_KEY2(KEY_SHIELDS); - else if (IS_FLG(FLG_BOWS)) ADD_KEY2(KEY_BOWS); - else if (IS_FLG(FLG_RINGS)) ADD_KEY2(KEY_RINGS); - else if (IS_FLG(FLG_AMULETS)) ADD_KEY2(KEY_AMULETS); - else if (IS_FLG(FLG_SUITS)) ADD_KEY2(KEY_SUITS); - else if (IS_FLG(FLG_CLOAKS)) ADD_KEY2(KEY_CLOAKS); - else if (IS_FLG(FLG_HELMS)) ADD_KEY2(KEY_HELMS); - else if (IS_FLG(FLG_GLOVES)) ADD_KEY2(KEY_GLOVES); - else if (IS_FLG(FLG_BOOTS)) ADD_KEY2(KEY_BOOTS); - else if (!IS_FLG(FLG_ARTIFACT)) - sepa_flag = FALSE; - - if (entry->name && entry->name[0]) - { - if (sepa_flag) strcat(buf, ":"); - - int i = strlen(buf); - int j = 0; - while (entry->name[j] && i < MAX_LINELEN - 2 - 1) - { + char buf[MAX_LINELEN]; + *buf = '\0'; + if (!(entry->action & DO_DISPLAY)) + strcat(buf, "("); + if (entry->action & DO_QUERY_AUTOPICK) + strcat(buf, ";"); + if (entry->action & DO_AUTODESTROY) + strcat(buf, "!"); + if (entry->action & DONT_AUTOPICK) + strcat(buf, "~"); + + char *ptr; + ptr = buf; + if (IS_FLG(FLG_ALL)) + ADD_KEY(KEY_ALL); + if (IS_FLG(FLG_COLLECTING)) + ADD_KEY(KEY_COLLECTING); + if (IS_FLG(FLG_UNAWARE)) + ADD_KEY(KEY_UNAWARE); + if (IS_FLG(FLG_UNIDENTIFIED)) + ADD_KEY(KEY_UNIDENTIFIED); + if (IS_FLG(FLG_IDENTIFIED)) + ADD_KEY(KEY_IDENTIFIED); + if (IS_FLG(FLG_STAR_IDENTIFIED)) + ADD_KEY(KEY_STAR_IDENTIFIED); + if (IS_FLG(FLG_BOOSTED)) + ADD_KEY(KEY_BOOSTED); + + if (IS_FLG(FLG_MORE_DICE)) { + ADD_KEY(KEY_MORE_THAN); + strcat(ptr, format("%d", entry->dice)); + ADD_KEY(KEY_DICE); + } + + if (IS_FLG(FLG_MORE_BONUS)) { + ADD_KEY(KEY_MORE_BONUS); + strcat(ptr, format("%d", entry->bonus)); + ADD_KEY(KEY_MORE_BONUS2); + } + + if (IS_FLG(FLG_UNREADABLE)) + ADD_KEY(KEY_UNREADABLE); + if (IS_FLG(FLG_REALM1)) + ADD_KEY(KEY_REALM1); + if (IS_FLG(FLG_REALM2)) + ADD_KEY(KEY_REALM2); + if (IS_FLG(FLG_FIRST)) + ADD_KEY(KEY_FIRST); + if (IS_FLG(FLG_SECOND)) + ADD_KEY(KEY_SECOND); + if (IS_FLG(FLG_THIRD)) + ADD_KEY(KEY_THIRD); + if (IS_FLG(FLG_FOURTH)) + ADD_KEY(KEY_FOURTH); + if (IS_FLG(FLG_WANTED)) + ADD_KEY(KEY_WANTED); + if (IS_FLG(FLG_UNIQUE)) + ADD_KEY(KEY_UNIQUE); + if (IS_FLG(FLG_HUMAN)) + ADD_KEY(KEY_HUMAN); + if (IS_FLG(FLG_WORTHLESS)) + ADD_KEY(KEY_WORTHLESS); + if (IS_FLG(FLG_GOOD)) + ADD_KEY(KEY_GOOD); + if (IS_FLG(FLG_NAMELESS)) + ADD_KEY(KEY_NAMELESS); + if (IS_FLG(FLG_AVERAGE)) + ADD_KEY(KEY_AVERAGE); + if (IS_FLG(FLG_RARE)) + ADD_KEY(KEY_RARE); + if (IS_FLG(FLG_COMMON)) + ADD_KEY(KEY_COMMON); + if (IS_FLG(FLG_EGO)) + ADD_KEY(KEY_EGO); + + if (IS_FLG(FLG_ARTIFACT)) + ADD_KEY(KEY_ARTIFACT); + + bool sepa_flag = TRUE; + if (IS_FLG(FLG_ITEMS)) + ADD_KEY2(KEY_ITEMS); + else if (IS_FLG(FLG_WEAPONS)) + ADD_KEY2(KEY_WEAPONS); + else if (IS_FLG(FLG_FAVORITE_WEAPONS)) + ADD_KEY2(KEY_FAVORITE_WEAPONS); + else if (IS_FLG(FLG_ARMORS)) + ADD_KEY2(KEY_ARMORS); + else if (IS_FLG(FLG_MISSILES)) + ADD_KEY2(KEY_MISSILES); + else if (IS_FLG(FLG_DEVICES)) + ADD_KEY2(KEY_DEVICES); + else if (IS_FLG(FLG_LIGHTS)) + ADD_KEY2(KEY_LIGHTS); + else if (IS_FLG(FLG_JUNKS)) + ADD_KEY2(KEY_JUNKS); + else if (IS_FLG(FLG_CORPSES)) + ADD_KEY2(KEY_CORPSES); + else if (IS_FLG(FLG_SPELLBOOKS)) + ADD_KEY2(KEY_SPELLBOOKS); + else if (IS_FLG(FLG_HAFTED)) + ADD_KEY2(KEY_HAFTED); + else if (IS_FLG(FLG_SHIELDS)) + ADD_KEY2(KEY_SHIELDS); + else if (IS_FLG(FLG_BOWS)) + ADD_KEY2(KEY_BOWS); + else if (IS_FLG(FLG_RINGS)) + ADD_KEY2(KEY_RINGS); + else if (IS_FLG(FLG_AMULETS)) + ADD_KEY2(KEY_AMULETS); + else if (IS_FLG(FLG_SUITS)) + ADD_KEY2(KEY_SUITS); + else if (IS_FLG(FLG_CLOAKS)) + ADD_KEY2(KEY_CLOAKS); + else if (IS_FLG(FLG_HELMS)) + ADD_KEY2(KEY_HELMS); + else if (IS_FLG(FLG_GLOVES)) + ADD_KEY2(KEY_GLOVES); + else if (IS_FLG(FLG_BOOTS)) + ADD_KEY2(KEY_BOOTS); + else if (!IS_FLG(FLG_ARTIFACT)) + sepa_flag = FALSE; + + if (entry->name && entry->name[0]) { + if (sepa_flag) + strcat(buf, ":"); + + int i = strlen(buf); + int j = 0; + while (entry->name[j] && i < MAX_LINELEN - 2 - 1) { #ifdef JP - if (iskanji(entry->name[j])) - buf[i++] = entry->name[j++]; + if (iskanji(entry->name[j])) + buf[i++] = entry->name[j++]; #endif - buf[i++] = entry->name[j++]; - } - buf[i] = '\0'; - } + buf[i++] = entry->name[j++]; + } + buf[i] = '\0'; + } - if (!entry->insc) return string_make(buf); + if (!entry->insc) + return string_make(buf); - int i, j = 0; - strcat(buf, "#"); - i = strlen(buf); + int i, j = 0; + strcat(buf, "#"); + i = strlen(buf); - while (entry->insc[j] && i < MAX_LINELEN - 2) - { + while (entry->insc[j] && i < MAX_LINELEN - 2) { #ifdef JP - if (iskanji(entry->insc[j])) - buf[i++] = entry->insc[j++]; + if (iskanji(entry->insc[j])) + buf[i++] = entry->insc[j++]; #endif - buf[i++] = entry->insc[j++]; - } + buf[i++] = entry->insc[j++]; + } - buf[i] = '\0'; - return string_make(buf); + buf[i] = '\0'; + return string_make(buf); } - /* * Reconstruct preference line from entry and kill entry */ concptr autopick_line_from_entry_kill(autopick_type *entry) { - concptr ptr = autopick_line_from_entry(entry); - autopick_free_entry(entry); - return ptr; + concptr ptr = autopick_line_from_entry(entry); + autopick_free_entry(entry); + return ptr; } - /* * Choose an item and get auto-picker entry from it. */ bool entry_from_choosed_object(player_type *player_ptr, autopick_type *entry) { - concptr q = _("どのアイテムを登録しますか? ", "Enter which item? "); - concptr s = _("アイテムを持っていない。", "You have nothing to enter."); - object_type *o_ptr; - o_ptr = choose_object(player_ptr, NULL, q, s, USE_INVEN | USE_FLOOR | USE_EQUIP, 0); - if (!o_ptr) return FALSE; - - autopick_entry_from_object(player_ptr, entry, o_ptr); - return TRUE; + concptr q = _("どのアイテムを登録しますか? ", "Enter which item? "); + concptr s = _("アイテムを持っていない。", "You have nothing to enter."); + object_type *o_ptr; + o_ptr = choose_object(player_ptr, NULL, q, s, USE_INVEN | USE_FLOOR | USE_EQUIP, 0); + if (!o_ptr) + return FALSE; + + autopick_entry_from_object(player_ptr, entry, o_ptr); + return TRUE; } diff --git a/src/autopick/autopick-finder.c b/src/autopick/autopick-finder.c index ff96a8e55..3a6378cff 100644 --- a/src/autopick/autopick-finder.c +++ b/src/autopick/autopick-finder.c @@ -10,392 +10,382 @@ #include "autopick/autopick-entry.h" #include "autopick/autopick-matcher.h" #include "core/show-file.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "io/input-key-acceptor.h" #include "main/sound-of-music.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "term/screen-processor.h" #include "term/term-color-types.h" #include "util/int-char-converter.h" #include "util/string-processor.h" - /* - * @brief —^‚¦‚ç‚ꂽƒAƒCƒeƒ€‚ªŽ©“®E‚¢‚̃ŠƒXƒg‚É“o˜^‚³‚ê‚Ä‚¢‚é‚©‚Ç‚¤‚©‚ðŒŸõ‚·‚é - * @param player_ptr ƒvƒŒ[ƒ„[‚Ö‚ÌŽQÆƒ|ƒCƒ“ƒ^ - * @o_ptr ƒAƒCƒeƒ€‚Ö‚ÌŽQÆƒ|ƒCƒ“ƒ^ - * @return Ž©“®E‚¢‚̃ŠƒXƒg‚É“o˜^‚³‚ê‚Ä‚¢‚½‚ç‚»‚Ì“o˜^”ԍ†A‚È‚©‚Á‚½‚ç-1 - * @details - * A function for Auto-picker/destroyer - * Examine whether the object matches to the list of keywords or not. - */ +/* + * @brief —^‚¦‚ç‚ꂽƒAƒCƒeƒ€‚ªŽ©“®E‚¢‚̃ŠƒXƒg‚É“o˜^‚³‚ê‚Ä‚¢‚é‚©‚Ç‚¤‚©‚ðŒŸõ‚·‚é + * @param player_ptr ƒvƒŒ[ƒ„[‚Ö‚ÌŽQÆƒ|ƒCƒ“ƒ^ + * @o_ptr ƒAƒCƒeƒ€‚Ö‚ÌŽQÆƒ|ƒCƒ“ƒ^ + * @return Ž©“®E‚¢‚̃ŠƒXƒg‚É“o˜^‚³‚ê‚Ä‚¢‚½‚ç‚»‚Ì“o˜^”ԍ†A‚È‚©‚Á‚½‚ç-1 + * @details + * A function for Auto-picker/destroyer + * Examine whether the object matches to the list of keywords or not. + */ int find_autopick_list(player_type *player_ptr, object_type *o_ptr) { - GAME_TEXT o_name[MAX_NLEN]; - if (o_ptr->tval == TV_GOLD) return -1; - - object_desc(player_ptr, o_name, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL)); - str_tolower(o_name); - for (int i = 0; i < max_autopick; i++) - { - autopick_type *entry = &autopick_list[i]; - if (is_autopick_match(player_ptr, o_ptr, entry, o_name)) - return i; - } - - return -1; + GAME_TEXT o_name[MAX_NLEN]; + if (o_ptr->tval == TV_GOLD) + return -1; + + describe_flavor(player_ptr, o_name, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL)); + str_tolower(o_name); + for (int i = 0; i < max_autopick; i++) { + autopick_type *entry = &autopick_list[i]; + if (is_autopick_match(player_ptr, o_ptr, entry, o_name)) + return i; + } + + return -1; } - /* * Choose an item for search */ bool get_object_for_search(player_type *player_ptr, object_type **o_handle, concptr *search_strp) { - concptr q = _("‚ǂ̃AƒCƒeƒ€‚ðŒŸõ‚µ‚Ü‚·‚©? ", "Enter which item? "); - concptr s = _("ƒAƒCƒeƒ€‚ðŽ‚Á‚Ä‚¢‚È‚¢B", "You have nothing to enter."); - object_type *o_ptr; - o_ptr = choose_object(player_ptr, NULL, q, s, USE_INVEN | USE_FLOOR | USE_EQUIP, 0); - if (!o_ptr) return FALSE; - - *o_handle = o_ptr; - string_free(*search_strp); - char buf[MAX_NLEN + 20]; - object_desc(player_ptr, buf, *o_handle, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL)); - *search_strp = string_make(format("<%s>", buf)); - return TRUE; + concptr q = _("‚ǂ̃AƒCƒeƒ€‚ðŒŸõ‚µ‚Ü‚·‚©? ", "Enter which item? "); + concptr s = _("ƒAƒCƒeƒ€‚ðŽ‚Á‚Ä‚¢‚È‚¢B", "You have nothing to enter."); + object_type *o_ptr; + o_ptr = choose_object(player_ptr, NULL, q, s, USE_INVEN | USE_FLOOR | USE_EQUIP, 0); + if (!o_ptr) + return FALSE; + + *o_handle = o_ptr; + string_free(*search_strp); + char buf[MAX_NLEN + 20]; + describe_flavor(player_ptr, buf, *o_handle, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL)); + *search_strp = string_make(format("<%s>", buf)); + return TRUE; } - /* * Prepare for search by destroyed object */ bool get_destroyed_object_for_search(player_type *player_ptr, object_type **o_handle, concptr *search_strp) { - if (!autopick_last_destroyed_object.k_idx) return FALSE; - - *o_handle = &autopick_last_destroyed_object; - string_free(*search_strp); - char buf[MAX_NLEN + 20]; - object_desc(player_ptr, buf, *o_handle, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL)); - *search_strp = string_make(format("<%s>", buf)); - return TRUE; + if (!autopick_last_destroyed_object.k_idx) + return FALSE; + + *o_handle = &autopick_last_destroyed_object; + string_free(*search_strp); + char buf[MAX_NLEN + 20]; + describe_flavor(player_ptr, buf, *o_handle, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL)); + *search_strp = string_make(format("<%s>", buf)); + return TRUE; } - /* * Choose an item or string for search */ byte get_string_for_search(player_type *player_ptr, object_type **o_handle, concptr *search_strp) { - /* - * Text color - * TERM_YELLOW : Overwrite mode - * TERM_WHITE : Insert mode - */ - byte color = TERM_YELLOW; - char buf[MAX_NLEN + 20]; - const int len = 80; - char prompt[] = _("ŒŸõ(^I:Ž‚¿•¨ ^L:”j‰ó‚³‚ꂽ•¨): ", "Search key(^I:inven ^L:destroyed): "); - int col = sizeof(prompt) - 1; - if (*search_strp) strcpy(buf, *search_strp); - else buf[0] = '\0'; - - if (*o_handle) color = TERM_L_GREEN; - - prt(prompt, 0, 0); - int pos = 0; - while (TRUE) - { - bool back = FALSE; - Term_erase(col, 0, 255); - Term_putstr(col, 0, -1, color, buf); - Term_gotoxy(col + pos, 0); - - int skey = inkey_special(TRUE); - switch (skey) - { - case SKEY_LEFT: - case KTRL('b'): - { - int i = 0; - color = TERM_WHITE; - if (pos == 0) break; - - while (TRUE) - { - int next_pos = i + 1; + /* + * Text color + * TERM_YELLOW : Overwrite mode + * TERM_WHITE : Insert mode + */ + byte color = TERM_YELLOW; + char buf[MAX_NLEN + 20]; + const int len = 80; + char prompt[] = _("ŒŸõ(^I:Ž‚¿•¨ ^L:”j‰ó‚³‚ꂽ•¨): ", "Search key(^I:inven ^L:destroyed): "); + int col = sizeof(prompt) - 1; + if (*search_strp) + strcpy(buf, *search_strp); + else + buf[0] = '\0'; + + if (*o_handle) + color = TERM_L_GREEN; + + prt(prompt, 0, 0); + int pos = 0; + while (TRUE) { + bool back = FALSE; + Term_erase(col, 0, 255); + Term_putstr(col, 0, -1, color, buf); + Term_gotoxy(col + pos, 0); + + int skey = inkey_special(TRUE); + switch (skey) { + case SKEY_LEFT: + case KTRL('b'): { + int i = 0; + color = TERM_WHITE; + if (pos == 0) + break; + + while (TRUE) { + int next_pos = i + 1; #ifdef JP - if (iskanji(buf[i])) next_pos++; + if (iskanji(buf[i])) + next_pos++; #endif - if (next_pos >= pos) break; + if (next_pos >= pos) + break; - i = next_pos; - } + i = next_pos; + } - pos = i; - break; - } + pos = i; + break; + } - case SKEY_RIGHT: - case KTRL('f'): - color = TERM_WHITE; - if ('\0' == buf[pos]) break; + case SKEY_RIGHT: + case KTRL('f'): + color = TERM_WHITE; + if ('\0' == buf[pos]) + break; #ifdef JP - if (iskanji(buf[pos])) pos += 2; - else pos++; + if (iskanji(buf[pos])) + pos += 2; + else + pos++; #else - pos++; + pos++; #endif - break; - - case ESCAPE: - return 0; - - case KTRL('r'): - back = TRUE; - /* Fall through */ - - case '\n': - case '\r': - case KTRL('s'): - if (*o_handle) return (back ? -1 : 1); - string_free(*search_strp); - *search_strp = string_make(buf); - *o_handle = NULL; - return (back ? -1 : 1); - - case KTRL('i'): - return get_object_for_search(player_ptr, o_handle, search_strp); - - case KTRL('l'): - if (get_destroyed_object_for_search(player_ptr, o_handle, search_strp)) - return 1; - break; - - case '\010': - { - int i = 0; - color = TERM_WHITE; - if (pos == 0) break; - - while (TRUE) - { - int next_pos = i + 1; + break; + + case ESCAPE: + return 0; + + case KTRL('r'): + back = TRUE; + /* Fall through */ + + case '\n': + case '\r': + case KTRL('s'): + if (*o_handle) + return (back ? -1 : 1); + string_free(*search_strp); + *search_strp = string_make(buf); + *o_handle = NULL; + return (back ? -1 : 1); + + case KTRL('i'): + return get_object_for_search(player_ptr, o_handle, search_strp); + + case KTRL('l'): + if (get_destroyed_object_for_search(player_ptr, o_handle, search_strp)) + return 1; + break; + + case '\010': { + int i = 0; + color = TERM_WHITE; + if (pos == 0) + break; + + while (TRUE) { + int next_pos = i + 1; #ifdef JP - if (iskanji(buf[i])) next_pos++; + if (iskanji(buf[i])) + next_pos++; #endif - if (next_pos >= pos) break; + if (next_pos >= pos) + break; - i = next_pos; - } + i = next_pos; + } - pos = i; - } - /* Fall through */ + pos = i; + } + /* Fall through */ - case 0x7F: - case KTRL('d'): - { - int dst, src; - color = TERM_WHITE; - if (buf[pos] == '\0') break; + case 0x7F: + case KTRL('d'): { + int dst, src; + color = TERM_WHITE; + if (buf[pos] == '\0') + break; - src = pos + 1; + src = pos + 1; #ifdef JP - if (iskanji(buf[pos])) src++; + if (iskanji(buf[pos])) + src++; #endif - dst = pos; - while ('\0' != (buf[dst++] = buf[src++])); - - break; - } - - default: - { - char tmp[100]; - char c; - if (skey & SKEY_MASK) break; - - c = (char)skey; - if (color != TERM_WHITE) - { - if (color == TERM_L_GREEN) - { - *o_handle = NULL; - string_free(*search_strp); - *search_strp = NULL; - } - - buf[0] = '\0'; - color = TERM_WHITE; - } - - strcpy(tmp, buf + pos); + dst = pos; + while ('\0' != (buf[dst++] = buf[src++])) + ; + + break; + } + + default: { + char tmp[100]; + char c; + if (skey & SKEY_MASK) + break; + + c = (char)skey; + if (color != TERM_WHITE) { + if (color == TERM_L_GREEN) { + *o_handle = NULL; + string_free(*search_strp); + *search_strp = NULL; + } + + buf[0] = '\0'; + color = TERM_WHITE; + } + + strcpy(tmp, buf + pos); #ifdef JP - if (iskanji(c)) - { - char next; - inkey_base = TRUE; - next = inkey(); - - if (pos + 1 < len) - { - buf[pos++] = c; - buf[pos++] = next; - } - else - { - bell(); - } - } - else + if (iskanji(c)) { + char next; + inkey_base = TRUE; + next = inkey(); + + if (pos + 1 < len) { + buf[pos++] = c; + buf[pos++] = next; + } else { + bell(); + } + } else #endif #ifdef JP - if (pos < len && (isprint(c) || iskana(c))) + if (pos < len && (isprint(c) || iskana(c))) #else - if (pos < len && isprint(c)) + if (pos < len && isprint(c)) #endif - { - buf[pos++] = c; - } - else - { - bell(); - } - - buf[pos] = '\0'; - angband_strcat(buf, tmp, len + 1); - - break; - } - } - - if (*o_handle == NULL || color == TERM_L_GREEN) continue; - - *o_handle = NULL; - buf[0] = '\0'; - string_free(*search_strp); - *search_strp = NULL; - } + { + buf[pos++] = c; + } else { + bell(); + } + + buf[pos] = '\0'; + angband_strcat(buf, tmp, len + 1); + + break; + } + } + + if (*o_handle == NULL || color == TERM_L_GREEN) + continue; + + *o_handle = NULL; + buf[0] = '\0'; + string_free(*search_strp); + *search_strp = NULL; + } } - /* * Search next line matches for o_ptr */ void search_for_object(player_type *player_ptr, text_body_type *tb, object_type *o_ptr, bool forward) { - autopick_type an_entry, *entry = &an_entry; - GAME_TEXT o_name[MAX_NLEN]; - int bypassed_cy = -1; - int i = tb->cy; - object_desc(player_ptr, o_name, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL)); - str_tolower(o_name); - - while (TRUE) - { - bool match; - if (forward) - { - if (!tb->lines_list[++i]) break; - } - else - { - if (--i < 0) break; - } - - if (!autopick_new_entry(entry, tb->lines_list[i], FALSE)) continue; - - match = is_autopick_match(player_ptr, o_ptr, entry, o_name); - autopick_free_entry(entry); - if (!match) continue; - - if (tb->states[i] & LSTAT_BYPASS) - { - if (bypassed_cy == -1) bypassed_cy = i; - continue; - } - - tb->cx = 0; - tb->cy = i; - if (bypassed_cy != -1) - { - tb->dirty_flags |= DIRTY_SKIP_INACTIVE; - } - - return; - } - - if (bypassed_cy == -1) - { - tb->dirty_flags |= DIRTY_NOT_FOUND; - return; - } - - tb->cx = 0; - tb->cy = bypassed_cy; - tb->dirty_flags |= DIRTY_INACTIVE; + autopick_type an_entry, *entry = &an_entry; + GAME_TEXT o_name[MAX_NLEN]; + int bypassed_cy = -1; + int i = tb->cy; + describe_flavor(player_ptr, o_name, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL)); + str_tolower(o_name); + + while (TRUE) { + bool match; + if (forward) { + if (!tb->lines_list[++i]) + break; + } else { + if (--i < 0) + break; + } + + if (!autopick_new_entry(entry, tb->lines_list[i], FALSE)) + continue; + + match = is_autopick_match(player_ptr, o_ptr, entry, o_name); + autopick_free_entry(entry); + if (!match) + continue; + + if (tb->states[i] & LSTAT_BYPASS) { + if (bypassed_cy == -1) + bypassed_cy = i; + continue; + } + + tb->cx = 0; + tb->cy = i; + if (bypassed_cy != -1) { + tb->dirty_flags |= DIRTY_SKIP_INACTIVE; + } + + return; + } + + if (bypassed_cy == -1) { + tb->dirty_flags |= DIRTY_NOT_FOUND; + return; + } + + tb->cx = 0; + tb->cy = bypassed_cy; + tb->dirty_flags |= DIRTY_INACTIVE; } - /* * Search next line matches to the string */ void search_for_string(text_body_type *tb, concptr search_str, bool forward) { - int bypassed_cy = -1; - int bypassed_cx = 0; - - int i = tb->cy; - while (TRUE) - { - concptr pos; - if (forward) - { - if (!tb->lines_list[++i]) break; - } - else - { - if (--i < 0) break; - } - - pos = angband_strstr(tb->lines_list[i], search_str); - if (!pos) continue; - - if ((tb->states[i] & LSTAT_BYPASS) && - !(tb->states[i] & LSTAT_EXPRESSION)) - { - if (bypassed_cy == -1) - { - bypassed_cy = i; - bypassed_cx = (int)(pos - tb->lines_list[i]); - } - - continue; - } - - tb->cx = (int)(pos - tb->lines_list[i]); - tb->cy = i; - - if (bypassed_cy != -1) - { - tb->dirty_flags |= DIRTY_SKIP_INACTIVE; - } - - return; - } - - if (bypassed_cy == -1) - { - tb->dirty_flags |= DIRTY_NOT_FOUND; - return; - } - - tb->cx = bypassed_cx; - tb->cy = bypassed_cy; - tb->dirty_flags |= DIRTY_INACTIVE; + int bypassed_cy = -1; + int bypassed_cx = 0; + + int i = tb->cy; + while (TRUE) { + concptr pos; + if (forward) { + if (!tb->lines_list[++i]) + break; + } else { + if (--i < 0) + break; + } + + pos = angband_strstr(tb->lines_list[i], search_str); + if (!pos) + continue; + + if ((tb->states[i] & LSTAT_BYPASS) && !(tb->states[i] & LSTAT_EXPRESSION)) { + if (bypassed_cy == -1) { + bypassed_cy = i; + bypassed_cx = (int)(pos - tb->lines_list[i]); + } + + continue; + } + + tb->cx = (int)(pos - tb->lines_list[i]); + tb->cy = i; + + if (bypassed_cy != -1) { + tb->dirty_flags |= DIRTY_SKIP_INACTIVE; + } + + return; + } + + if (bypassed_cy == -1) { + tb->dirty_flags |= DIRTY_NOT_FOUND; + return; + } + + tb->cx = bypassed_cx; + tb->cy = bypassed_cy; + tb->dirty_flags |= DIRTY_INACTIVE; } diff --git a/src/autopick/autopick-registry.c b/src/autopick/autopick-registry.c index 07589a7e7..cfbeb34de 100644 --- a/src/autopick/autopick-registry.c +++ b/src/autopick/autopick-registry.c @@ -3,18 +3,18 @@ * @date 2020/04/26 * @author Hourier */ - + #include "autopick/autopick-registry.h" #include "autopick/autopick-entry.h" #include "autopick/autopick-finder.h" #include "autopick/autopick-methods-table.h" #include "autopick/autopick-reader-writer.h" #include "core/asking-player.h" +#include "flavor/flavor-describer.h" #include "io/files-util.h" #include "object-enchant/item-feeling.h" #include "object-enchant/special-object-flags.h" #include "object-hook/hook-enchant.h" -#include "object/object-flavor.h" #include "perception/object-perception.h" #include "util/angband-files.h" #include "view/display-messages.h" @@ -26,194 +26,174 @@ static const char autoregister_header[] = "?:$AUTOREGISTER"; */ static bool clear_auto_register(player_type *player_ptr) { - char pref_file[1024]; - path_build(pref_file, sizeof(pref_file), ANGBAND_DIR_USER, pickpref_filename(player_ptr, PT_WITH_PNAME)); - FILE *pref_fff; - pref_fff = angband_fopen(pref_file, "r"); - - if (!pref_fff) - { - path_build(pref_file, sizeof(pref_file), ANGBAND_DIR_USER, pickpref_filename(player_ptr, PT_DEFAULT)); - pref_fff = angband_fopen(pref_file, "r"); - } - - if (!pref_fff) - { - return TRUE; - } - - char tmp_file[1024]; - FILE *tmp_fff; - tmp_fff = angband_fopen_temp(tmp_file, sizeof(tmp_file)); - if (!tmp_fff) - { - fclose(pref_fff); - msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), tmp_file); - msg_print(NULL); - return FALSE; - } - - bool autoregister = FALSE; - int num = 0; - char buf[1024]; - while (TRUE) - { - if (angband_fgets(pref_fff, buf, sizeof(buf))) break; - - if (autoregister) - { - if (buf[0] != '#' && buf[0] != '?') num++; - continue; - } - - if (streq(buf, autoregister_header)) - { - autoregister = TRUE; - } - else - { - fprintf(tmp_fff, "%s\n", buf); - } - } - - angband_fclose(pref_fff); - angband_fclose(tmp_fff); - - bool okay = TRUE; - if (num) - { - msg_format(_("以前のキャラクター用の自動設定(%d行)が残っています。", - "Auto registered lines (%d lines) for previous character are remaining."), num); - strcpy(buf, _("古い設定行は削除します。よろしいですか?", "These lines will be deleted. Are you sure? ")); - - if (!get_check(buf)) - { - okay = FALSE; - autoregister = FALSE; - - msg_print(_("エディタのカット&ペースト等を使って必要な行を避難してください。", - "Use cut & paste of auto picker editor (_) to keep old prefs.")); - } - } - - if (autoregister) - { - tmp_fff = angband_fopen(tmp_file, "r"); - pref_fff = angband_fopen(pref_file, "w"); - - while (!angband_fgets(tmp_fff, buf, sizeof(buf))) - fprintf(pref_fff, "%s\n", buf); - - angband_fclose(pref_fff); - angband_fclose(tmp_fff); - } - - fd_kill(tmp_file); - return okay; + char pref_file[1024]; + path_build(pref_file, sizeof(pref_file), ANGBAND_DIR_USER, pickpref_filename(player_ptr, PT_WITH_PNAME)); + FILE *pref_fff; + pref_fff = angband_fopen(pref_file, "r"); + + if (!pref_fff) { + path_build(pref_file, sizeof(pref_file), ANGBAND_DIR_USER, pickpref_filename(player_ptr, PT_DEFAULT)); + pref_fff = angband_fopen(pref_file, "r"); + } + + if (!pref_fff) { + return TRUE; + } + + char tmp_file[1024]; + FILE *tmp_fff; + tmp_fff = angband_fopen_temp(tmp_file, sizeof(tmp_file)); + if (!tmp_fff) { + fclose(pref_fff); + msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), tmp_file); + msg_print(NULL); + return FALSE; + } + + bool autoregister = FALSE; + int num = 0; + char buf[1024]; + while (TRUE) { + if (angband_fgets(pref_fff, buf, sizeof(buf))) + break; + + if (autoregister) { + if (buf[0] != '#' && buf[0] != '?') + num++; + continue; + } + + if (streq(buf, autoregister_header)) { + autoregister = TRUE; + } else { + fprintf(tmp_fff, "%s\n", buf); + } + } + + angband_fclose(pref_fff); + angband_fclose(tmp_fff); + + bool okay = TRUE; + if (num) { + msg_format(_("以前のキャラクター用の自動設定(%d行)が残っています。", "Auto registered lines (%d lines) for previous character are remaining."), num); + strcpy(buf, _("古い設定行は削除します。よろしいですか?", "These lines will be deleted. Are you sure? ")); + + if (!get_check(buf)) { + okay = FALSE; + autoregister = FALSE; + + msg_print(_("エディタのカット&ペースト等を使って必要な行を避難してください。", "Use cut & paste of auto picker editor (_) to keep old prefs.")); + } + } + + if (autoregister) { + tmp_fff = angband_fopen(tmp_file, "r"); + pref_fff = angband_fopen(pref_file, "w"); + + while (!angband_fgets(tmp_fff, buf, sizeof(buf))) + fprintf(pref_fff, "%s\n", buf); + + angband_fclose(pref_fff); + angband_fclose(tmp_fff); + } + + fd_kill(tmp_file); + return okay; } - /* * Automatically register an auto-destroy preference line */ bool autopick_autoregister(player_type *player_ptr, object_type *o_ptr) { - autopick_type an_entry, *entry = &an_entry; - int autopick_registered = find_autopick_list(player_ptr, o_ptr); - if (autopick_registered != -1) - { - concptr what; - byte act = autopick_list[autopick_registered].action; - if (act & DO_AUTOPICK) what = _("自動で拾う", "auto-pickup"); - else if (act & DO_AUTODESTROY) what = _("自動破壊する", "auto-destroy"); - else if (act & DONT_AUTOPICK) what = _("放置する", "leave on floor"); - else what = _("確認して拾う", "query auto-pickup"); - - msg_format(_("そのアイテムは既に%sように設定されています。", "The object is already registered to %s."), what); - return FALSE; - } - - if ((object_is_known(o_ptr) && object_is_artifact(o_ptr)) || - ((o_ptr->ident & IDENT_SENSE) && - (o_ptr->feeling == FEEL_TERRIBLE || o_ptr->feeling == FEEL_SPECIAL))) - { - GAME_TEXT o_name[MAX_NLEN]; - object_desc(player_ptr, o_name, o_ptr, 0); - msg_format(_("%sは破壊不能だ。", "You cannot auto-destroy %s."), o_name); - return FALSE; - } - - if (!player_ptr->autopick_autoregister) - { - if (!clear_auto_register(player_ptr)) return FALSE; - } - - char buf[1024]; - char pref_file[1024]; - FILE *pref_fff; - path_build(pref_file, sizeof(pref_file), ANGBAND_DIR_USER, pickpref_filename(player_ptr, PT_WITH_PNAME)); - pref_fff = angband_fopen(pref_file, "r"); - - if (!pref_fff) - { - path_build(pref_file, sizeof(pref_file), ANGBAND_DIR_USER, pickpref_filename(player_ptr, PT_DEFAULT)); - pref_fff = angband_fopen(pref_file, "r"); - } - - if (pref_fff) - { - while (TRUE) - { - if (angband_fgets(pref_fff, buf, sizeof(buf))) - { - player_ptr->autopick_autoregister = FALSE; - break; - } - - if (streq(buf, autoregister_header)) - { - player_ptr->autopick_autoregister = TRUE; - break; - } - } - - fclose(pref_fff); - } - else - { - /* - * File could not be opened for reading. Assume header not - * present. - */ - player_ptr->autopick_autoregister = FALSE; - } - - pref_fff = angband_fopen(pref_file, "a"); - if (!pref_fff) - { - msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), pref_file); - msg_print(NULL); - return FALSE; - } - - if (!player_ptr->autopick_autoregister) - { - fprintf(pref_fff, "%s\n", autoregister_header); - - fprintf(pref_fff, "%s\n", _("# *警告!!* 以降の行は自動登録されたものです。", - "# *Warning!* The lines below will be deleted later.")); - fprintf(pref_fff, "%s\n", _("# 後で自動的に削除されますので、必要な行は上の方へ移動しておいてください。", - "# Keep it by cut & paste if you need these lines for future characters.")); - player_ptr->autopick_autoregister = TRUE; - } - - autopick_entry_from_object(player_ptr, entry, o_ptr); - entry->action = DO_AUTODESTROY; - add_autopick_list(entry); - - concptr tmp = autopick_line_from_entry(entry); - fprintf(pref_fff, "%s\n", tmp); - string_free(tmp); - fclose(pref_fff); - return TRUE; + autopick_type an_entry, *entry = &an_entry; + int autopick_registered = find_autopick_list(player_ptr, o_ptr); + if (autopick_registered != -1) { + concptr what; + byte act = autopick_list[autopick_registered].action; + if (act & DO_AUTOPICK) + what = _("自動で拾う", "auto-pickup"); + else if (act & DO_AUTODESTROY) + what = _("自動破壊する", "auto-destroy"); + else if (act & DONT_AUTOPICK) + what = _("放置する", "leave on floor"); + else + what = _("確認して拾う", "query auto-pickup"); + + msg_format(_("そのアイテムは既に%sように設定されています。", "The object is already registered to %s."), what); + return FALSE; + } + + if ((object_is_known(o_ptr) && object_is_artifact(o_ptr)) + || ((o_ptr->ident & IDENT_SENSE) && (o_ptr->feeling == FEEL_TERRIBLE || o_ptr->feeling == FEEL_SPECIAL))) { + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(player_ptr, o_name, o_ptr, 0); + msg_format(_("%sは破壊不能だ。", "You cannot auto-destroy %s."), o_name); + return FALSE; + } + + if (!player_ptr->autopick_autoregister) { + if (!clear_auto_register(player_ptr)) + return FALSE; + } + + char buf[1024]; + char pref_file[1024]; + FILE *pref_fff; + path_build(pref_file, sizeof(pref_file), ANGBAND_DIR_USER, pickpref_filename(player_ptr, PT_WITH_PNAME)); + pref_fff = angband_fopen(pref_file, "r"); + + if (!pref_fff) { + path_build(pref_file, sizeof(pref_file), ANGBAND_DIR_USER, pickpref_filename(player_ptr, PT_DEFAULT)); + pref_fff = angband_fopen(pref_file, "r"); + } + + if (pref_fff) { + while (TRUE) { + if (angband_fgets(pref_fff, buf, sizeof(buf))) { + player_ptr->autopick_autoregister = FALSE; + break; + } + + if (streq(buf, autoregister_header)) { + player_ptr->autopick_autoregister = TRUE; + break; + } + } + + fclose(pref_fff); + } else { + /* + * File could not be opened for reading. Assume header not + * present. + */ + player_ptr->autopick_autoregister = FALSE; + } + + pref_fff = angband_fopen(pref_file, "a"); + if (!pref_fff) { + msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), pref_file); + msg_print(NULL); + return FALSE; + } + + if (!player_ptr->autopick_autoregister) { + fprintf(pref_fff, "%s\n", autoregister_header); + + fprintf(pref_fff, "%s\n", _("# *警告!!* 以降の行は自動登録されたものです。", "# *Warning!* The lines below will be deleted later.")); + fprintf(pref_fff, "%s\n", + _("# 後で自動的に削除されますので、必要な行は上の方へ移動しておいてください。", + "# Keep it by cut & paste if you need these lines for future characters.")); + player_ptr->autopick_autoregister = TRUE; + } + + autopick_entry_from_object(player_ptr, entry, o_ptr); + entry->action = DO_AUTODESTROY; + add_autopick_list(entry); + + concptr tmp = autopick_line_from_entry(entry); + fprintf(pref_fff, "%s\n", tmp); + string_free(tmp); + fclose(pref_fff); + return TRUE; } diff --git a/src/autopick/autopick.c b/src/autopick/autopick.c index 2b129bf39..88dd97d58 100644 --- a/src/autopick/autopick.c +++ b/src/autopick/autopick.c @@ -17,11 +17,11 @@ #include "autopick/autopick-menu-data-table.h" #include "autopick/autopick-methods-table.h" #include "core/asking-player.h" +#include "flavor/flavor-describer.h" #include "floor/floor.h" #include "floor/floor-object.h" #include "inventory/inventory-object.h" #include "inventory/inventory-slot-types.h" -#include "object/object-flavor.h" #include "object/object-mark-types.h" #include "object/object-info.h" #include "player/player-move.h" @@ -39,7 +39,7 @@ static void autopick_delayed_alter_aux(player_type *player_ptr, INVENTORY_IDX it if (o_ptr->k_idx == 0 || !(o_ptr->marked & OM_AUTODESTROY)) return; GAME_TEXT o_name[MAX_NLEN]; - object_desc(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); if (item >= 0) { inven_item_increase(player_ptr, item, -(o_ptr->number)); @@ -120,7 +120,7 @@ void autopick_pickup_items(player_type* player_ptr, grid_type *g_ptr) if (!check_store_item_to_inventory(player_ptr, o_ptr)) { GAME_TEXT o_name[MAX_NLEN]; - object_desc(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); msg_format(_("ザックには%sを入れる隙間がない。", "You have no room for %s."), o_name); o_ptr->marked |= OM_NOMSG; continue; @@ -139,7 +139,7 @@ void autopick_pickup_items(player_type* player_ptr, grid_type *g_ptr) continue; } - object_desc(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); sprintf(out_val, _("%sを拾いますか? ", "Pick up %s? "), o_name); if (!get_check(out_val)) { diff --git a/src/cmd-item/cmd-eat.c b/src/cmd-item/cmd-eat.c index c638d931a..d71ee1b32 100644 --- a/src/cmd-item/cmd-eat.c +++ b/src/cmd-item/cmd-eat.c @@ -8,6 +8,7 @@ #include "core/hp-mp-processor.h" #include "core/player-update-types.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "floor/floor.h" @@ -19,7 +20,6 @@ #include "object-hook/hook-expendable.h" #include "object/item-tester-hooker.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "object/object-generator.h" #include "object/object-info.h" #include "object/object-kind-hook.h" @@ -382,7 +382,7 @@ void exe_eat_food(player_type *creature_ptr, INVENTORY_IDX item) && (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_CORPSE && angband_strchr("pht", r_info[o_ptr->pval].d_char))) { /* Drain vitality of humanoids */ GAME_TEXT o_name[MAX_NLEN]; - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); msg_format(_("%sは燃え上り灰になった。精力を吸収した気がする。", "%^s is burnt to ashes. You absorb its vitality!"), o_name); (void)set_food(creature_ptr, PY_FOOD_MAX - 1); } else if (is_specific_player_race(creature_ptr, RACE_SKELETON)) { diff --git a/src/cmd-item/cmd-item.c b/src/cmd-item/cmd-item.c index e4a0b6abe..66703bcb8 100644 --- a/src/cmd-item/cmd-item.c +++ b/src/cmd-item/cmd-item.c @@ -28,6 +28,7 @@ #include "core/stuff-handler.h" #include "core/window-redrawer.h" #include "dungeon/quest.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "game-option/birth-options.h" @@ -57,7 +58,6 @@ #include "object-use/quaff-execution.h" #include "object/item-tester-hooker.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "object/object-generator.h" #include "object/object-info.h" #include "object/object-mark-types.h" @@ -290,7 +290,7 @@ void do_cmd_wield(player_type *creature_ptr) /* Prevent wielding into a cursed slot */ if (object_is_cursed(&creature_ptr->inventory_list[slot])) { - object_desc(creature_ptr, o_name, &creature_ptr->inventory_list[slot], (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, o_name, &creature_ptr->inventory_list[slot], (OD_OMIT_PREFIX | OD_NAME_ONLY)); #ifdef JP msg_format("%s%sは呪われているようだ。", describe_use(creature_ptr, slot), o_name); #else @@ -304,7 +304,7 @@ void do_cmd_wield(player_type *creature_ptr) || ((o_ptr->ident & IDENT_SENSE) && (FEEL_BROKEN <= o_ptr->feeling) && (o_ptr->feeling <= FEEL_CURSED)))) { char dummy[MAX_NLEN + 80]; - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); sprintf(dummy, _("本当に%s{呪われている}を使いますか?", "Really use the %s {cursed}? "), o_name); if (!get_check(dummy)) @@ -314,7 +314,7 @@ void do_cmd_wield(player_type *creature_ptr) if ((o_ptr->name1 == ART_STONEMASK) && object_is_known(o_ptr) && (creature_ptr->prace != RACE_VAMPIRE) && (creature_ptr->prace != RACE_ANDROID)) { char dummy[MAX_NLEN + 100]; - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); sprintf(dummy, _("%sを装備すると吸血鬼になります。よろしいですか?", "%s will transforms you into a vampire permanently when equiped. Do you become a vampire?"), @@ -331,7 +331,7 @@ void do_cmd_wield(player_type *creature_ptr) object_type *otmp_ptr = &object_tmp; GAME_TEXT switch_name[MAX_NLEN]; - object_desc(creature_ptr, switch_name, switch_o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, 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); @@ -423,7 +423,7 @@ void do_cmd_wield(player_type *creature_ptr) break; } - object_desc(creature_ptr, o_name, o_ptr, 0); + describe_flavor(creature_ptr, o_name, o_ptr, 0); msg_format(act, o_name, index_to_label(slot)); /* Cursed! */ @@ -464,7 +464,7 @@ void verify_equip_slot(player_type *owner_ptr, INVENTORY_IDX item) return; o_ptr = &owner_ptr->inventory_list[INVEN_LARM]; - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); if (object_is_cursed(o_ptr)) { if (object_allow_two_hands_wielding(o_ptr) && can_two_hands_wielding(owner_ptr)) @@ -489,7 +489,7 @@ void verify_equip_slot(player_type *owner_ptr, INVENTORY_IDX item) o_ptr = &owner_ptr->inventory_list[INVEN_RARM]; if (o_ptr->k_idx) - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); if (has_melee_weapon(owner_ptr, INVEN_RARM)) { if (object_allow_two_hands_wielding(o_ptr) && can_two_hands_wielding(owner_ptr)) @@ -652,7 +652,7 @@ void do_cmd_destroy(player_type *creature_ptr) /* Verify unless quantity given beforehand */ if (!force && (confirm_destroy || (object_value(creature_ptr, o_ptr) > 0))) { - object_desc(creature_ptr, o_name, o_ptr, OD_OMIT_PREFIX); + describe_flavor(creature_ptr, o_name, o_ptr, OD_OMIT_PREFIX); /* Make a verification */ sprintf(out_val, _("本当に%sを壊しますか? [y/n/Auto]", "Really destroy %s? [y/n/Auto]"), o_name); @@ -703,7 +703,7 @@ void do_cmd_destroy(player_type *creature_ptr) old_number = o_ptr->number; o_ptr->number = amt; - object_desc(creature_ptr, o_name, o_ptr, 0); + describe_flavor(creature_ptr, o_name, o_ptr, 0); o_ptr->number = old_number; take_turn(creature_ptr, 100); @@ -803,7 +803,7 @@ void do_cmd_observe(player_type *creature_ptr) return; } - object_desc(creature_ptr, o_name, o_ptr, 0); + describe_flavor(creature_ptr, o_name, o_ptr, 0); msg_format(_("%sを調べている...", "Examining %s..."), o_name); if (!screen_object(creature_ptr, o_ptr, SCROBJ_FORCE_DETAIL)) msg_print(_("特に変わったところはないようだ。", "You see nothing special.")); @@ -865,7 +865,7 @@ void do_cmd_inscribe(player_type *creature_ptr) return; /* Describe the activity */ - object_desc(creature_ptr, o_name, o_ptr, OD_OMIT_INSCRIPTION); + describe_flavor(creature_ptr, o_name, o_ptr, OD_OMIT_INSCRIPTION); msg_format(_("%sに銘を刻む。", "Inscribing %s."), o_name); msg_print(NULL); diff --git a/src/cmd-item/cmd-read.c b/src/cmd-item/cmd-read.c index 2d35dbba4..9f3ee1d33 100644 --- a/src/cmd-item/cmd-read.c +++ b/src/cmd-item/cmd-read.c @@ -12,6 +12,7 @@ #include "core/player-update-types.h" #include "core/show-file.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "floor/floor.h" @@ -25,7 +26,6 @@ #include "object-hook/hook-expendable.h" #include "object/item-tester-hooker.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "object/object-info.h" #include "object/object-kind.h" #include "perception/object-perception.h" @@ -531,7 +531,7 @@ void exe_read(player_type *creature_ptr, INVENTORY_IDX item, bool known) q = format("book-%d_jp.txt", o_ptr->sval); /* Display object description */ - object_desc(creature_ptr, o_name, o_ptr, OD_NAME_ONLY); + describe_flavor(creature_ptr, o_name, o_ptr, OD_NAME_ONLY); path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, q); /* Peruse the help file */ diff --git a/src/cmd-item/cmd-smith.c b/src/cmd-item/cmd-smith.c index f21f1ee30..a2d9f0e42 100644 --- a/src/cmd-item/cmd-smith.c +++ b/src/cmd-item/cmd-smith.c @@ -10,6 +10,7 @@ #include "core/asking-player.h" #include "core/player-update-types.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "game-option/text-display-options.h" @@ -25,11 +26,10 @@ #include "object-hook/hook-armor.h" #include "object-hook/hook-enchant.h" #include "object-hook/hook-weapon.h" +#include "object/item-tester-hooker.h" #include "object/item-use-flags.h" #include "object/object-flags.h" // todo 相互参照している. -#include "object/object-flavor.h" #include "object/object-generator.h" -#include "object/item-tester-hooker.h" #include "perception/object-perception.h" #include "player/player-status.h" #include "term/screen-processor.h" @@ -43,494 +43,179 @@ * エッセンス情報の構造体 / A structure for smithing */ typedef struct { - int add; /* TR flag number or special essence id */ - concptr add_name; /* Name of this ability */ - ESSENCE_IDX type; /* Menu number */ - int essence; /* Index for carrying essences */ - int value; /* Needed value to add this ability */ + int add; /* TR flag number or special essence id */ + concptr add_name; /* Name of this ability */ + ESSENCE_IDX type; /* Menu number */ + int essence; /* Index for carrying essences */ + int value; /* Needed value to add this ability */ } essence_type; - /*! * エッセンス情報テーブル Smithing type data for Weapon smith */ #ifdef JP -static essence_type essence_info[] = -{ - {TR_STR, "腕力", 4, TR_STR, 20}, - {TR_INT, "知能", 4, TR_INT, 20}, - {TR_WIS, "賢さ", 4, TR_WIS, 20}, - {TR_DEX, "器用さ", 4, TR_DEX, 20}, - {TR_CON, "耐久力", 4, TR_CON, 20}, - {TR_CHR, "魅力", 4, TR_CHR, 20}, - {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20}, - {TR_STEALTH, "隠密", 4, TR_STEALTH, 40}, - {TR_SEARCH, "探索", 4, TR_SEARCH, 15}, - {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15}, - {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15}, - {TR_SPEED, "スピード", 4, TR_SPEED, 12}, - {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20}, - {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15}, - {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60}, - {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15}, - {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20}, - {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20}, - {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20}, - {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20}, - {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20}, - {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15}, - {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15}, - {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15}, - {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15}, - {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15}, - {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15}, - {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20}, - {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20}, - {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20}, - {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20}, - {TR_REFLECT, "反射", 2, TR_REFLECT, 20}, - {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20}, - {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20}, - {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15}, - {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15}, - {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15}, - {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15}, - {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25}, - {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20}, - {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20}, - {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20}, - {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20}, - {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20}, - {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20}, - {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20}, - {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20}, - {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20}, - {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20}, - {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20}, - {TR_SH_FIRE, "", 0, -2, 0}, - {TR_SH_ELEC, "", 0, -2, 0}, - {TR_SH_COLD, "", 0, -2, 0}, - {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15}, - {TR_WARNING, "警告", 3, TR_WARNING, 20}, - {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20}, - {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15}, - {TR_LITE_2, "", 0, -2, 0}, - {TR_LITE_3, "", 0, -2, 0}, - {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20}, - {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15}, - {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15}, - {TR_REGEN, "急速回復", 3, TR_REGEN, 20}, - {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25}, - - {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100}, - {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60}, - {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20}, - {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60}, - {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20}, - {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60}, - {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20}, - {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60}, - {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15}, - {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60}, - {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15}, - {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60}, - {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20}, - {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60}, - {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20}, - {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60}, - {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20}, - {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60}, - - {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40}, - {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40}, - {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40}, - {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40}, - {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40}, - {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40}, - {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40}, - {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40}, - - {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30}, - {ESSENCE_AC, "防御", 10, TR_ES_AC, 15}, - {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50}, - {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50}, - {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50}, - {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50}, - {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50}, - {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50}, - {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50}, - {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150}, - {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10}, - {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200}, - - {-1, NULL, 0, -1, 0} -}; +static essence_type essence_info[] = { { TR_STR, "腕力", 4, TR_STR, 20 }, { TR_INT, "知能", 4, TR_INT, 20 }, { TR_WIS, "賢さ", 4, TR_WIS, 20 }, + { TR_DEX, "器用さ", 4, TR_DEX, 20 }, { TR_CON, "耐久力", 4, TR_CON, 20 }, { TR_CHR, "魅力", 4, TR_CHR, 20 }, + { TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20 }, { TR_STEALTH, "隠密", 4, TR_STEALTH, 40 }, { TR_SEARCH, "探索", 4, TR_SEARCH, 15 }, + { TR_INFRA, "赤外線視力", 4, TR_INFRA, 15 }, { TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15 }, { TR_SPEED, "スピード", 4, TR_SPEED, 12 }, + { TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20 }, { TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15 }, { TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60 }, + { TR_IMPACT, "地震発動", 7, TR_IMPACT, 15 }, { TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20 }, { TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20 }, + { TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20 }, { TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20 }, { TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20 }, + { TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15 }, { TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15 }, { TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15 }, + { TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15 }, { TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15 }, { TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15 }, + { TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20 }, { TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20 }, { TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20 }, + { TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20 }, { TR_REFLECT, "反射", 2, TR_REFLECT, 20 }, { TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20 }, + { TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20 }, { TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15 }, { TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15 }, + { TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15 }, { TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15 }, { TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25 }, + { TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20 }, { TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20 }, { TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20 }, + { TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20 }, { TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20 }, { TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20 }, + { TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20 }, { TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20 }, { TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20 }, + { TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20 }, { TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20 }, { TR_SH_FIRE, "", 0, -2, 0 }, + { TR_SH_ELEC, "", 0, -2, 0 }, { TR_SH_COLD, "", 0, -2, 0 }, { TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15 }, { TR_WARNING, "警告", 3, TR_WARNING, 20 }, + { TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20 }, { TR_LITE_1, "永久光源", 3, TR_LITE_1, 15 }, { TR_LITE_2, "", 0, -2, 0 }, { TR_LITE_3, "", 0, -2, 0 }, + { TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20 }, { TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15 }, { TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15 }, + { TR_REGEN, "急速回復", 3, TR_REGEN, 20 }, { TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25 }, + + { TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100 }, { TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60 }, + { TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20 }, { TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60 }, + { TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20 }, { TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60 }, + { TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20 }, { TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60 }, + { TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15 }, { TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60 }, + { TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15 }, { TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60 }, + { TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20 }, { TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60 }, + { TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20 }, { TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60 }, + { TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20 }, { TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60 }, + + { TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40 }, { TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40 }, { TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40 }, + { TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40 }, { TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40 }, { TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40 }, + { TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40 }, { TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40 }, + + { ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30 }, { ESSENCE_AC, "防御", 10, TR_ES_AC, 15 }, { ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50 }, + { ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50 }, { ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50 }, + { ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50 }, { ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50 }, { ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50 }, + { ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50 }, { ESSENCE_RESISTANCE, "全耐性", 2, -1, 150 }, { ESSENCE_SUSTAIN, "装備保持", 10, -1, 10 }, + { ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200 }, + + { -1, NULL, 0, -1, 0 } }; #else -static essence_type essence_info[] = -{ - {TR_STR, "strength", 4, TR_STR, 20}, - {TR_INT, "intelligence", 4, TR_INT, 20}, - {TR_WIS, "wisdom", 4, TR_WIS, 20}, - {TR_DEX, "dexterity", 4, TR_DEX, 20}, - {TR_CON, "constitution", 4, TR_CON, 20}, - {TR_CHR, "charisma", 4, TR_CHR, 20}, - {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20}, - {TR_STEALTH, "stealth", 4, TR_STEALTH, 40}, - {TR_SEARCH, "serching", 4, TR_SEARCH, 15}, - {TR_INFRA, "infravision", 4, TR_INFRA, 15}, - {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15}, - {TR_SPEED, "speed", 4, TR_SPEED, 12}, - {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20}, - {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15}, - {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60}, - {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15}, - {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20}, - {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20}, - {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20}, - {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20}, - {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20}, - {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15}, - {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15}, - {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15}, - {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15}, - {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15}, - {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15}, - {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20}, - {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20}, - {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20}, - {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20}, - {TR_REFLECT, "reflection", 2, TR_REFLECT, 20}, - {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20}, - {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20}, - {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15}, - {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15}, - {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15}, - {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15}, - {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25}, - {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20}, - {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20}, - {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20}, - {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20}, - {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20}, - {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20}, - {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20}, - {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20}, - {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20}, - {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20}, - {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20}, - {TR_SH_FIRE, "", 0, -2, 0}, - {TR_SH_ELEC, "", 0, -2, 0}, - {TR_SH_COLD, "", 0, -2, 0}, - {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15}, - {TR_WARNING, "warning", 3, TR_WARNING, 20}, - {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20}, - {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15}, - {TR_LITE_2, "", 0, -2, 0}, - {TR_LITE_3, "", 0, -2, 0}, - {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20}, - {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15}, - {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15}, - {TR_REGEN, "regeneration", 3, TR_REGEN, 20}, - {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25}, - - {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100}, - {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20}, - {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60}, - {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60}, - {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20}, - {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60}, - {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20}, - {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60}, - {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15}, - {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60}, - {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15}, - {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60}, - {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20}, - {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60}, - {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20}, - {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60}, - {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20}, - {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60}, - - {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40}, - {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40}, - {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40}, - {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40}, - {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40}, - {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40}, - {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40}, - {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40}, - - {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30}, - {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15}, - {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50}, - {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50}, - {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50}, - {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50}, - {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50}, - {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50}, - {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50}, - {ESSENCE_RESISTANCE, "resistance", 2, -1, 150}, - {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10}, - {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200}, - - {-1, NULL, 0, -1, 0} -}; +static essence_type essence_info[] = { { TR_STR, "strength", 4, TR_STR, 20 }, { TR_INT, "intelligence", 4, TR_INT, 20 }, { TR_WIS, "wisdom", 4, TR_WIS, 20 }, + { TR_DEX, "dexterity", 4, TR_DEX, 20 }, { TR_CON, "constitution", 4, TR_CON, 20 }, { TR_CHR, "charisma", 4, TR_CHR, 20 }, + { TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20 }, { TR_STEALTH, "stealth", 4, TR_STEALTH, 40 }, { TR_SEARCH, "serching", 4, TR_SEARCH, 15 }, + { TR_INFRA, "infravision", 4, TR_INFRA, 15 }, { TR_TUNNEL, "digging", 4, TR_TUNNEL, 15 }, { TR_SPEED, "speed", 4, TR_SPEED, 12 }, + { TR_BLOWS, "extra attack", 1, TR_BLOWS, 20 }, { TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15 }, { TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60 }, + { TR_IMPACT, "quake activation", 7, TR_IMPACT, 15 }, { TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20 }, + { TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20 }, { TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20 }, + { TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20 }, { TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20 }, + { TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15 }, { TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15 }, + { TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15 }, { TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15 }, + { TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15 }, { TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15 }, + { TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20 }, { TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20 }, + { TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20 }, { TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20 }, { TR_REFLECT, "reflection", 2, TR_REFLECT, 20 }, + { TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20 }, { TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20 }, + { TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15 }, { TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15 }, + { TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15 }, { TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15 }, + { TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25 }, { TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20 }, + { TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20 }, { TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20 }, + { TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20 }, { TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20 }, + { TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20 }, { TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20 }, + { TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20 }, { TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20 }, + { TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20 }, { TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20 }, + { TR_SH_FIRE, "", 0, -2, 0 }, { TR_SH_ELEC, "", 0, -2, 0 }, { TR_SH_COLD, "", 0, -2, 0 }, { TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15 }, + { TR_WARNING, "warning", 3, TR_WARNING, 20 }, { TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20 }, { TR_LITE_1, "permanent light", 3, TR_LITE_1, 15 }, + { TR_LITE_2, "", 0, -2, 0 }, { TR_LITE_3, "", 0, -2, 0 }, { TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20 }, + { TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15 }, { TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15 }, + { TR_REGEN, "regeneration", 3, TR_REGEN, 20 }, { TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25 }, + + { TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100 }, { TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20 }, + { TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60 }, { TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60 }, + { TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20 }, { TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60 }, + { TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20 }, { TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60 }, + { TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15 }, { TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60 }, { TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15 }, + { TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60 }, { TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20 }, + { TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60 }, { TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20 }, + { TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60 }, { TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20 }, + { TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60 }, + + { TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40 }, { TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40 }, + { TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40 }, { TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40 }, + { TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40 }, { TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40 }, + { TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40 }, { TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40 }, + + { ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30 }, { ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15 }, + { ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50 }, { ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50 }, + { ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50 }, { ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50 }, + { ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50 }, { ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50 }, { ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50 }, + { ESSENCE_RESISTANCE, "resistance", 2, -1, 150 }, { ESSENCE_SUSTAIN, "elements proof", 10, -1, 10 }, + { ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200 }, + + { -1, NULL, 0, -1, 0 } }; #endif - /*! * エッセンス名テーブル / Essense names for Weapon smith */ #ifdef JP -concptr essence_name[] = -{ - "腕力", - "知能", - "賢さ", - "器用さ", - "耐久力", - "魅力", - "魔力支配", - "", - "隠密", - "探索", - "赤外線視力", - "採掘", - "スピード", - "追加攻撃", - "カオス攻撃", - "吸血攻撃", - "動物倍打", - "邪悪倍打", - "不死倍打", - "悪魔倍打", - "オーク倍打", - "トロル倍打", - "巨人倍打", - "竜倍打", - "", - "", - "地震", - "毒殺", - "溶解", - "電撃", - "焼棄", - "凍結", - "能力維持", - "", - "", - "", - "", - "", - "", - "", - "免疫", - "", - "", - "", - "", - "反射", - "麻痺知らず", - "経験値維持", - "耐酸", - "耐電撃", - "耐火炎", - "耐冷気", - "耐毒", - "耐恐怖", - "耐閃光", - "耐暗黒", - "耐盲目", - "耐混乱", - "耐轟音", - "耐破片", - "耐地獄", - "耐因果混乱", - "耐カオス", - "耐劣化", - "", - "", - "人間倍打", - "", - "", - "反魔法", - "", - "", - "警告", - "", - "", - "", - "浮遊", - "永久光源", - "可視透明", - "テレパシー", - "遅消化", - "急速回復", - "", - "", - "", - "", - "", - "", - "", - "", - "テレポート", - "", - "", - "攻撃", - "防御", - - NULL -}; +concptr essence_name[] = { "腕力", "知能", "賢さ", "器用さ", "耐久力", "魅力", "魔力支配", "", "隠密", "探索", "赤外線視力", "採掘", "スピード", "追加攻撃", + "カオス攻撃", "吸血攻撃", "動物倍打", "邪悪倍打", "不死倍打", "悪魔倍打", "オーク倍打", "トロル倍打", "巨人倍打", "竜倍打", "", "", "地震", "毒殺", "溶解", + "電撃", "焼棄", "凍結", "能力維持", "", "", "", "", "", "", "", "免疫", "", "", "", "", "反射", "麻痺知らず", "経験値維持", "耐酸", "耐電撃", "耐火炎", + "耐冷気", "耐毒", "耐恐怖", "耐閃光", "耐暗黒", "耐盲目", "耐混乱", "耐轟音", "耐破片", "耐地獄", "耐因果混乱", "耐カオス", "耐劣化", "", "", "人間倍打", + "", "", "反魔法", "", "", "警告", "", "", "", "浮遊", "永久光源", "可視透明", "テレパシー", "遅消化", "急速回復", "", "", "", "", "", "", "", "", + "テレポート", "", "", "攻撃", "防御", + + NULL }; #else -concptr essence_name[] = -{ - "strength", - "intelligen.", - "wisdom", - "dexterity", - "constitut.", - "charisma", - "magic mast.", - "", - "stealth", - "serching", - "infravision", - "digging", - "speed", - "extra atk", - "chaos brand", - "vampiric", - "slay animal", - "slay evil", - "slay undead", - "slay demon", - "slay orc", - "slay troll", - "slay giant", - "slay dragon", - "", - "", - "quake", - "pois. brand", - "acid brand", - "elec. brand", - "fire brand", - "cold brand", - "sustain", - "", - "", - "", - "", - "", - "", - "", - "immunity", - "", - "", - "", - "", - "reflection", - "free action", - "hold exp", - "res. acid", - "res. elec.", - "res. fire", - "res. cold", - "res. poison", - "res. fear", - "res. light", - "res. dark", - "res. blind", - "res.confuse", - "res. sound", - "res. shard", - "res. nether", - "res. nexus", - "res. chaos", - "res. disen.", - "", - "", - "slay human", - "", - "", - "anti magic", - "", - "", - "warning", - "", - "", - "", - "levitation", - "perm. light", - "see invis.", - "telepathy", - "slow dige.", - "regen.", - "", - "", - "", - "", - "", - "", - "", - "", - "teleport", - "", - "", - "weapon enc.", - "armor enc.", - - NULL -}; +concptr essence_name[] = { "strength", "intelligen.", "wisdom", "dexterity", "constitut.", "charisma", "magic mast.", "", "stealth", "serching", "infravision", + "digging", "speed", "extra atk", "chaos brand", "vampiric", "slay animal", "slay evil", "slay undead", "slay demon", "slay orc", "slay troll", "slay giant", + "slay dragon", "", "", "quake", "pois. brand", "acid brand", "elec. brand", "fire brand", "cold brand", "sustain", "", "", "", "", "", "", "", "immunity", + "", "", "", "", "reflection", "free action", "hold exp", "res. acid", "res. elec.", "res. fire", "res. cold", "res. poison", "res. fear", "res. light", + "res. dark", "res. blind", "res.confuse", "res. sound", "res. shard", "res. nether", "res. nexus", "res. chaos", "res. disen.", "", "", "slay human", "", + "", "anti magic", "", "", "warning", "", "", "", "levitation", "perm. light", "see invis.", "telepathy", "slow dige.", "regen.", "", "", "", "", "", "", "", + "", "teleport", "", "", "weapon enc.", "armor enc.", + + NULL }; #endif -static concptr const kaji_tips[5] = -{ +static concptr const kaji_tips[5] = { #ifdef JP - "現在持っているエッセンスの一覧を表示する。", - "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。", - "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。", - "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。", - "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。", + "現在持っているエッセンスの一覧を表示する。", + "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。", + "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。", + "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。", + "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。", #else - "Display essences you have.", - "Extract essences from an item. The item become non magical.", - "Remove added essences from an equipment which was improved before. The removed essence will be ruined.", - "Add essences to an item. The improved items or artifacts cannot be reimprove.", - "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.", + "Display essences you have.", + "Extract essences from an item. The item become non magical.", + "Remove added essences from an equipment which was improved before. The removed essence will be ruined.", + "Add essences to an item. The improved items or artifacts cannot be reimprove.", + "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.", #endif }; - /*! * @brief 所持しているエッセンス一覧を表示する * @return なし */ static void display_essence(player_type *creature_ptr) { - int i, num = 0; - - screen_save(); - for (i = 1; i < 22; i++) - { - prt("", i, 0); - } - prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数", - "Essence Num Essence Num Essence Num "), 1, 8); - for (i = 0; essence_name[i]; i++) - { - if (!essence_name[i][0]) continue; - prt(format("%-11s %5d", essence_name[i], creature_ptr->magic_num1[i]), 2 + num % 21, 8 + num / 21 * 22); - num++; - } - prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0); - (void)inkey(); - screen_load(); - return; + int i, num = 0; + + screen_save(); + for (i = 1; i < 22; i++) { + prt("", i, 0); + } + prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数", "Essence Num Essence Num Essence Num "), 1, 8); + for (i = 0; essence_name[i]; i++) { + if (!essence_name[i][0]) + continue; + prt(format("%-11s %5d", essence_name[i], creature_ptr->magic_num1[i]), 2 + num % 21, 8 + num / 21 * 22); + num++; + } + prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0); + (void)inkey(); + screen_load(); + return; } /*! @@ -540,225 +225,235 @@ static void display_essence(player_type *creature_ptr) */ static void drain_essence(player_type *creature_ptr) { - int drain_value[sizeof(creature_ptr->magic_num1) / sizeof(s32b)]; - size_t i; - OBJECT_IDX item; - int dec = 4; - bool observe = FALSE; - int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2; - TIME_EFFECT old_timeout; - BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE]; - object_type *o_ptr; - concptr q, s; - POSITION iy, ix; - byte marked; - ITEM_NUMBER number; - OBJECT_IDX next_o_idx; - WEIGHT weight; - - for (i = 0; i < sizeof(drain_value) / sizeof(int); i++) - drain_value[i] = 0; - - item_tester_hook = object_is_weapon_armour_ammo; - - q = _("どのアイテムから抽出しますか?", "Extract from which item? "); - s = _("抽出できるアイテムがありません。", "You have nothing you can extract from."); - - o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0); - if (!o_ptr) return; - - if (object_is_known(o_ptr) && !object_is_nameless(creature_ptr, o_ptr)) - { - GAME_TEXT o_name[MAX_NLEN]; - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return; - } - - take_turn(creature_ptr, 100); - - object_flags(creature_ptr, o_ptr, old_flgs); - if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON); - if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL); - if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL); - if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD); - if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON); - if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC); - if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL); - if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT); - if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN); - - old_to_a = o_ptr->to_a; - old_ac = o_ptr->ac; - old_to_h = o_ptr->to_h; - old_to_d = o_ptr->to_d; - old_ds = o_ptr->ds; - old_dd = o_ptr->dd; - old_pval = o_ptr->pval; - old_name2 = o_ptr->name2; - old_timeout = o_ptr->timeout; - if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--; - if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--; - if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--; - if (have_flag(old_flgs, TR_AGGRAVATE)) dec--; - if (have_flag(old_flgs, TR_NO_TELE)) dec--; - if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--; - if (have_flag(old_flgs, TR_DRAIN_HP)) dec--; - if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--; - if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--; - if (have_flag(old_flgs, TR_CALL_DEMON)) dec--; - if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--; - if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--; - if (have_flag(old_flgs, TR_COWARDICE)) dec--; - if (have_flag(old_flgs, TR_LOW_MELEE)) dec--; - if (have_flag(old_flgs, TR_LOW_AC)) dec--; - if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--; - if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--; - if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--; - if (have_flag(old_flgs, TR_TY_CURSE)) dec--; - - iy = o_ptr->iy; - ix = o_ptr->ix; - next_o_idx = o_ptr->next_o_idx; - marked = o_ptr->marked; - weight = o_ptr->weight; - number = o_ptr->number; - - object_prep(creature_ptr, o_ptr, o_ptr->k_idx); - - o_ptr->iy = iy; - o_ptr->ix = ix; - o_ptr->next_o_idx = next_o_idx; - o_ptr->marked = marked; - o_ptr->number = number; - if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout; - if (item >= 0) creature_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight * number); - o_ptr->ident |= (IDENT_FULL_KNOWN); - object_aware(creature_ptr, o_ptr); - object_known(o_ptr); - - object_flags(creature_ptr, o_ptr, new_flgs); - - for (i = 0; essence_info[i].add_name; i++) - { - essence_type *es_ptr = &essence_info[i]; - PARAMETER_VALUE pval = 0; - - if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval) - pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval; - - if (es_ptr->add < TR_FLAG_MAX && - (!have_flag(new_flgs, es_ptr->add) || pval) && - have_flag(old_flgs, es_ptr->add)) - { - if (pval) - { - drain_value[es_ptr->essence] += 10 * pval; - } - else if (es_ptr->essence != -2) - { - drain_value[es_ptr->essence] += 10; - } - else if (es_ptr->add == TR_SH_FIRE) - { - drain_value[TR_BRAND_FIRE] += 10; - drain_value[TR_RES_FIRE] += 10; - } - else if (es_ptr->add == TR_SH_ELEC) - { - drain_value[TR_BRAND_ELEC] += 10; - drain_value[TR_RES_ELEC] += 10; - } - else if (es_ptr->add == TR_SH_COLD) - { - drain_value[TR_BRAND_COLD] += 10; - drain_value[TR_RES_COLD] += 10; - } - else if (es_ptr->add == TR_LITE_2) - { - drain_value[TR_LITE_1] += 20; - } - else if (es_ptr->add == TR_LITE_3) - { - drain_value[TR_LITE_1] += 30; - } - } - } - - if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON))) - { - drain_value[TR_INT] += 5; - drain_value[TR_WIS] += 5; - } - if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL))) - { - drain_value[TR_BRAND_POIS] += 5; - drain_value[TR_BRAND_ACID] += 5; - drain_value[TR_BRAND_ELEC] += 5; - drain_value[TR_BRAND_FIRE] += 5; - drain_value[TR_BRAND_COLD] += 5; - } - if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA))) - { - drain_value[TR_INT] += 10; - } - if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT))) - { - drain_value[TR_STR] += 10; - } - if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS))) - { - drain_value[TR_DEX] += 10; - } - if (old_name2 == EGO_2WEAPON) - { - drain_value[TR_DEX] += 20; - } - if (object_is_weapon_ammo(o_ptr)) - { - if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds - o_ptr->ds) * 10; - - if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd - o_ptr->dd) * 10; - } - if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h - o_ptr->to_h) * 10; - if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d - o_ptr->to_d) * 10; - if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac - o_ptr->ac) * 10; - if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a - o_ptr->to_a) * 10; - - for (i = 0; i < sizeof(drain_value) / sizeof(int); i++) - { - drain_value[i] *= number; - drain_value[i] = drain_value[i] * dec / 4; - drain_value[i] = MAX(drain_value[i], 0); - if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10; - if (drain_value[i]) - { - observe = TRUE; - } - } - if (!observe) - { - msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence.")); - } - else - { - msg_print(_("抽出したエッセンス:", "Extracted essences:")); - - for (i = 0; essence_name[i]; i++) - { - if (!essence_name[i][0]) continue; - if (!drain_value[i]) continue; - - creature_ptr->magic_num1[i] += drain_value[i]; - creature_ptr->magic_num1[i] = MIN(20000, creature_ptr->magic_num1[i]); - msg_print(NULL); - msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". ")); - } - } - - /* Apply autodestroy/inscription to the drained item */ - autopick_alter_item(creature_ptr, item, TRUE); - creature_ptr->update |= (PU_COMBINE | PU_REORDER); - creature_ptr->window |= (PW_INVEN); + int drain_value[sizeof(creature_ptr->magic_num1) / sizeof(s32b)]; + size_t i; + OBJECT_IDX item; + int dec = 4; + bool observe = FALSE; + int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2; + TIME_EFFECT old_timeout; + BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE]; + object_type *o_ptr; + concptr q, s; + POSITION iy, ix; + byte marked; + ITEM_NUMBER number; + OBJECT_IDX next_o_idx; + WEIGHT weight; + + for (i = 0; i < sizeof(drain_value) / sizeof(int); i++) + drain_value[i] = 0; + + item_tester_hook = object_is_weapon_armour_ammo; + + q = _("どのアイテムから抽出しますか?", "Extract from which item? "); + s = _("抽出できるアイテムがありません。", "You have nothing you can extract from."); + + o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0); + if (!o_ptr) + return; + + if (object_is_known(o_ptr) && !object_is_nameless(creature_ptr, o_ptr)) { + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) + return; + } + + take_turn(creature_ptr, 100); + + object_flags(creature_ptr, o_ptr, old_flgs); + if (have_flag(old_flgs, TR_KILL_DRAGON)) + add_flag(old_flgs, TR_SLAY_DRAGON); + if (have_flag(old_flgs, TR_KILL_ANIMAL)) + add_flag(old_flgs, TR_SLAY_ANIMAL); + if (have_flag(old_flgs, TR_KILL_EVIL)) + add_flag(old_flgs, TR_SLAY_EVIL); + if (have_flag(old_flgs, TR_KILL_UNDEAD)) + add_flag(old_flgs, TR_SLAY_UNDEAD); + if (have_flag(old_flgs, TR_KILL_DEMON)) + add_flag(old_flgs, TR_SLAY_DEMON); + if (have_flag(old_flgs, TR_KILL_ORC)) + add_flag(old_flgs, TR_SLAY_ORC); + if (have_flag(old_flgs, TR_KILL_TROLL)) + add_flag(old_flgs, TR_SLAY_TROLL); + if (have_flag(old_flgs, TR_KILL_GIANT)) + add_flag(old_flgs, TR_SLAY_GIANT); + if (have_flag(old_flgs, TR_KILL_HUMAN)) + add_flag(old_flgs, TR_SLAY_HUMAN); + + old_to_a = o_ptr->to_a; + old_ac = o_ptr->ac; + old_to_h = o_ptr->to_h; + old_to_d = o_ptr->to_d; + old_ds = o_ptr->ds; + old_dd = o_ptr->dd; + old_pval = o_ptr->pval; + old_name2 = o_ptr->name2; + old_timeout = o_ptr->timeout; + if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) + dec--; + if (have_flag(old_flgs, TR_ADD_L_CURSE)) + dec--; + if (have_flag(old_flgs, TR_ADD_H_CURSE)) + dec--; + if (have_flag(old_flgs, TR_AGGRAVATE)) + dec--; + if (have_flag(old_flgs, TR_NO_TELE)) + dec--; + if (have_flag(old_flgs, TR_DRAIN_EXP)) + dec--; + if (have_flag(old_flgs, TR_DRAIN_HP)) + dec--; + if (have_flag(old_flgs, TR_DRAIN_MANA)) + dec--; + if (have_flag(old_flgs, TR_CALL_ANIMAL)) + dec--; + if (have_flag(old_flgs, TR_CALL_DEMON)) + dec--; + if (have_flag(old_flgs, TR_CALL_DRAGON)) + dec--; + if (have_flag(old_flgs, TR_CALL_UNDEAD)) + dec--; + if (have_flag(old_flgs, TR_COWARDICE)) + dec--; + if (have_flag(old_flgs, TR_LOW_MELEE)) + dec--; + if (have_flag(old_flgs, TR_LOW_AC)) + dec--; + if (have_flag(old_flgs, TR_LOW_MAGIC)) + dec--; + if (have_flag(old_flgs, TR_FAST_DIGEST)) + dec--; + if (have_flag(old_flgs, TR_SLOW_REGEN)) + dec--; + if (have_flag(old_flgs, TR_TY_CURSE)) + dec--; + + iy = o_ptr->iy; + ix = o_ptr->ix; + next_o_idx = o_ptr->next_o_idx; + marked = o_ptr->marked; + weight = o_ptr->weight; + number = o_ptr->number; + + object_prep(creature_ptr, o_ptr, o_ptr->k_idx); + + o_ptr->iy = iy; + o_ptr->ix = ix; + o_ptr->next_o_idx = next_o_idx; + o_ptr->marked = marked; + o_ptr->number = number; + if (o_ptr->tval == TV_DRAG_ARMOR) + o_ptr->timeout = old_timeout; + if (item >= 0) + creature_ptr->total_weight += (o_ptr->weight * o_ptr->number - weight * number); + o_ptr->ident |= (IDENT_FULL_KNOWN); + object_aware(creature_ptr, o_ptr); + object_known(o_ptr); + + object_flags(creature_ptr, o_ptr, new_flgs); + + for (i = 0; essence_info[i].add_name; i++) { + essence_type *es_ptr = &essence_info[i]; + PARAMETER_VALUE pval = 0; + + if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval) + pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval; + + if (es_ptr->add < TR_FLAG_MAX && (!have_flag(new_flgs, es_ptr->add) || pval) && have_flag(old_flgs, es_ptr->add)) { + if (pval) { + drain_value[es_ptr->essence] += 10 * pval; + } else if (es_ptr->essence != -2) { + drain_value[es_ptr->essence] += 10; + } else if (es_ptr->add == TR_SH_FIRE) { + drain_value[TR_BRAND_FIRE] += 10; + drain_value[TR_RES_FIRE] += 10; + } else if (es_ptr->add == TR_SH_ELEC) { + drain_value[TR_BRAND_ELEC] += 10; + drain_value[TR_RES_ELEC] += 10; + } else if (es_ptr->add == TR_SH_COLD) { + drain_value[TR_BRAND_COLD] += 10; + drain_value[TR_RES_COLD] += 10; + } else if (es_ptr->add == TR_LITE_2) { + drain_value[TR_LITE_1] += 20; + } else if (es_ptr->add == TR_LITE_3) { + drain_value[TR_LITE_1] += 30; + } + } + } + + if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON))) { + drain_value[TR_INT] += 5; + drain_value[TR_WIS] += 5; + } + if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL))) { + drain_value[TR_BRAND_POIS] += 5; + drain_value[TR_BRAND_ACID] += 5; + drain_value[TR_BRAND_ELEC] += 5; + drain_value[TR_BRAND_FIRE] += 5; + drain_value[TR_BRAND_COLD] += 5; + } + if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA))) { + drain_value[TR_INT] += 10; + } + if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT))) { + drain_value[TR_STR] += 10; + } + if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS))) { + drain_value[TR_DEX] += 10; + } + if (old_name2 == EGO_2WEAPON) { + drain_value[TR_DEX] += 20; + } + if (object_is_weapon_ammo(o_ptr)) { + if (old_ds > o_ptr->ds) + drain_value[TR_ES_ATTACK] += (old_ds - o_ptr->ds) * 10; + + if (old_dd > o_ptr->dd) + drain_value[TR_ES_ATTACK] += (old_dd - o_ptr->dd) * 10; + } + if (old_to_h > o_ptr->to_h) + drain_value[TR_ES_ATTACK] += (old_to_h - o_ptr->to_h) * 10; + if (old_to_d > o_ptr->to_d) + drain_value[TR_ES_ATTACK] += (old_to_d - o_ptr->to_d) * 10; + if (old_ac > o_ptr->ac) + drain_value[TR_ES_AC] += (old_ac - o_ptr->ac) * 10; + if (old_to_a > o_ptr->to_a) + drain_value[TR_ES_AC] += (old_to_a - o_ptr->to_a) * 10; + + for (i = 0; i < sizeof(drain_value) / sizeof(int); i++) { + drain_value[i] *= number; + drain_value[i] = drain_value[i] * dec / 4; + drain_value[i] = MAX(drain_value[i], 0); + if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) + drain_value[i] /= 10; + if (drain_value[i]) { + observe = TRUE; + } + } + if (!observe) { + msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence.")); + } else { + msg_print(_("抽出したエッセンス:", "Extracted essences:")); + + for (i = 0; essence_name[i]; i++) { + if (!essence_name[i][0]) + continue; + if (!drain_value[i]) + continue; + + creature_ptr->magic_num1[i] += drain_value[i]; + creature_ptr->magic_num1[i] = MIN(20000, creature_ptr->magic_num1[i]); + msg_print(NULL); + msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". ")); + } + } + + /* Apply autodestroy/inscription to the drained item */ + autopick_alter_item(creature_ptr, item, TRUE); + creature_ptr->update |= (PU_COMBINE | PU_REORDER); + creature_ptr->window |= (PW_INVEN); } /*! @@ -767,107 +462,86 @@ static void drain_essence(player_type *creature_ptr) */ static COMMAND_CODE choose_essence(void) { - COMMAND_CODE mode = 0; - char choice; - COMMAND_CODE menu_line = (use_menu ? 1 : 0); + COMMAND_CODE mode = 0; + char choice; + COMMAND_CODE menu_line = (use_menu ? 1 : 0); #ifdef JP - concptr menu_name[] = { - "武器属性", - "耐性", - "能力", - "数値", - "スレイ", - "ESP", - "その他" - }; + concptr menu_name[] = { "武器属性", "耐性", "能力", "数値", "スレイ", "ESP", "その他" }; #else - concptr menu_name[] = { - "Brand weapon", - "Resistance", - "Ability", - "Magic number", - "Slay", - "ESP", - "Others" - }; + concptr menu_name[] = { "Brand weapon", "Resistance", "Ability", "Magic number", "Slay", "ESP", "Others" }; #endif - const COMMAND_CODE mode_max = 7; - - if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max) - return mode; - mode = 0; - if (use_menu) - { - screen_save(); - - while (!mode) - { - int i; - for (i = 0; i < mode_max; i++) + const COMMAND_CODE mode_max = 7; + + if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max) + return mode; + mode = 0; + if (use_menu) { + screen_save(); + + while (!mode) { + int i; + for (i = 0; i < mode_max; i++) #ifdef JP - prt(format(" %s %s", (menu_line == 1 + i) ? "》" : " ", menu_name[i]), 2 + i, 14); - prt("どの種類のエッセンス付加を行いますか?", 0, 0); + prt(format(" %s %s", (menu_line == 1 + i) ? "》" : " ", menu_name[i]), 2 + i, 14); + prt("どの種類のエッセンス付加を行いますか?", 0, 0); #else - prt(format(" %s %s", (menu_line == 1 + i) ? "> " : " ", menu_name[i]), 2 + i, 14); - prt("Choose from menu.", 0, 0); + prt(format(" %s %s", (menu_line == 1 + i) ? "> " : " ", menu_name[i]), 2 + i, 14); + prt("Choose from menu.", 0, 0); #endif - choice = inkey(); - switch (choice) - { - case ESCAPE: - case 'z': - case 'Z': - screen_load(); - return 0; - case '2': - case 'j': - case 'J': - menu_line++; - break; - case '8': - case 'k': - case 'K': - menu_line += mode_max - 1; - break; - case '\r': - case '\n': - case 'x': - case 'X': - mode = menu_line; - break; - } - if (menu_line > mode_max) menu_line -= mode_max; - } - screen_load(); - } - else - { - screen_save(); - while (!mode) - { - int i; - - for (i = 0; i < mode_max; i++) - prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14); - - if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE)) - { - screen_load(); - return 0; - } - - if (isupper(choice)) choice = (char)tolower(choice); - - if ('a' <= choice && choice <= 'a' + (char)mode_max - 1) - mode = (int)choice - 'a' + 1; - } - screen_load(); - } - - repeat_push(mode); - return mode; + choice = inkey(); + switch (choice) { + case ESCAPE: + case 'z': + case 'Z': + screen_load(); + return 0; + case '2': + case 'j': + case 'J': + menu_line++; + break; + case '8': + case 'k': + case 'K': + menu_line += mode_max - 1; + break; + case '\r': + case '\n': + case 'x': + case 'X': + mode = menu_line; + break; + } + if (menu_line > mode_max) + menu_line -= mode_max; + } + screen_load(); + } else { + screen_save(); + while (!mode) { + int i; + + for (i = 0; i < mode_max; i++) + prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14); + + if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE)) { + screen_load(); + return 0; + } + + if (isupper(choice)) + choice = (char)tolower(choice); + + if ('a' <= choice && choice <= 'a' + (char)mode_max - 1) + mode = (int)choice - 'a' + 1; + } + screen_load(); + } + + repeat_push(mode); + return mode; } /*! @@ -877,470 +551,443 @@ static COMMAND_CODE choose_essence(void) */ static void add_essence(player_type *creature_ptr, ESSENCE_IDX mode) { - OBJECT_IDX item; - int max_num = 0; - COMMAND_CODE i; - bool flag, redraw; - char choice; - concptr q, s; - object_type *o_ptr; - int ask = TRUE; - char out_val[160]; - int num[22]; - GAME_TEXT o_name[MAX_NLEN]; - int use_essence; - essence_type *es_ptr; - bool able[22] = { 0 }; - tval_type tval = 0; - int menu_line = (use_menu ? 1 : 0); - - for (i = 0; essence_info[i].add_name; i++) - { - es_ptr = &essence_info[i]; - - if (es_ptr->type != mode) continue; - num[max_num++] = i; - } - - if (!repeat_pull(&i) || i < 0 || i >= max_num) - { - flag = FALSE; - redraw = FALSE; - - (void)strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? ")); - if (use_menu) screen_save(); - - choice = (always_show_list || use_menu) ? ESCAPE : 1; - while (!flag) - { - if (choice == ESCAPE) choice = ' '; - else if (!get_com(out_val, &choice, FALSE))break; - - if (use_menu && choice != ' ') - { - switch (choice) - { - case '0': - { - screen_load(); - return; - } - - case '8': - case 'k': - case 'K': - { - menu_line += (max_num - 1); - break; - } - - case '2': - case 'j': - case 'J': - { - menu_line++; - break; - } - - case '4': - case 'h': - case 'H': - { - menu_line = 1; - break; - } - case '6': - case 'l': - case 'L': - { - menu_line = max_num; - break; - } - - case 'x': - case 'X': - case '\r': - case '\n': - { - i = menu_line - 1; - ask = FALSE; - break; - } - } - if (menu_line > max_num) menu_line -= max_num; - } - /* Request redraw */ - if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask)) - { - /* Show the list */ - if (!redraw || use_menu) - { - byte y, x = 10; - int ctr; - char dummy[80], dummy2[80]; - byte col; - - strcpy(dummy, ""); - redraw = TRUE; - if (!use_menu) screen_save(); - - for (y = 1; y < 24; y++) - prt("", y, x); - - /* Print header(s) */ + OBJECT_IDX item; + int max_num = 0; + COMMAND_CODE i; + bool flag, redraw; + char choice; + concptr q, s; + object_type *o_ptr; + int ask = TRUE; + char out_val[160]; + int num[22]; + GAME_TEXT o_name[MAX_NLEN]; + int use_essence; + essence_type *es_ptr; + bool able[22] = { 0 }; + tval_type tval = 0; + int menu_line = (use_menu ? 1 : 0); + + for (i = 0; essence_info[i].add_name; i++) { + es_ptr = &essence_info[i]; + + if (es_ptr->type != mode) + continue; + num[max_num++] = i; + } + + if (!repeat_pull(&i) || i < 0 || i >= max_num) { + flag = FALSE; + redraw = FALSE; + + (void)strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? ")); + if (use_menu) + screen_save(); + + choice = (always_show_list || use_menu) ? ESCAPE : 1; + while (!flag) { + if (choice == ESCAPE) + choice = ' '; + else if (!get_com(out_val, &choice, FALSE)) + break; + + if (use_menu && choice != ' ') { + switch (choice) { + case '0': { + screen_load(); + return; + } + + case '8': + case 'k': + case 'K': { + menu_line += (max_num - 1); + break; + } + + case '2': + case 'j': + case 'J': { + menu_line++; + break; + } + + case '4': + case 'h': + case 'H': { + menu_line = 1; + break; + } + case '6': + case 'l': + case 'L': { + menu_line = max_num; + break; + } + + case 'x': + case 'X': + case '\r': + case '\n': { + i = menu_line - 1; + ask = FALSE; + break; + } + } + if (menu_line > max_num) + menu_line -= max_num; + } + /* Request redraw */ + if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask)) { + /* Show the list */ + if (!redraw || use_menu) { + byte y, x = 10; + int ctr; + char dummy[80], dummy2[80]; + byte col; + + strcpy(dummy, ""); + redraw = TRUE; + if (!use_menu) + screen_save(); + + for (y = 1; y < 24; y++) + prt("", y, x); + + /* Print header(s) */ #ifdef JP - prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x); + prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x); #else - prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x); + prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x); #endif - /* Print list */ - for (ctr = 0; ctr < max_num; ctr++) - { - es_ptr = &essence_info[num[ctr]]; - - if (use_menu) - { - if (ctr == (menu_line - 1)) - strcpy(dummy, _("》 ", "> ")); - else strcpy(dummy, " "); - - } - /* letter/number for power selection */ - else - { - sprintf(dummy, "%c) ", I2A(ctr)); - } - - strcat(dummy, es_ptr->add_name); - - col = TERM_WHITE; - able[ctr] = TRUE; - - if (es_ptr->essence != -1) - { - strcat(dummy, format("(%s)", essence_name[es_ptr->essence])); - if (creature_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE; - } - else - { - switch (es_ptr->add) - { - case ESSENCE_SH_FIRE: - strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)")); - if (creature_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE; - if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE; - break; - case ESSENCE_SH_ELEC: - strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)")); - if (creature_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE; - if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE; - break; - case ESSENCE_SH_COLD: - strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)")); - if (creature_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE; - if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE; - break; - case ESSENCE_RESISTANCE: - strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)")); - if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE; - if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE; - if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE; - if (creature_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE; - break; - case ESSENCE_SUSTAIN: - strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)")); - if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE; - if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE; - if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE; - if (creature_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE; - break; - } - } - - if (!able[ctr]) col = TERM_RED; - - if (es_ptr->essence != -1) - { - sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)creature_ptr->magic_num1[es_ptr->essence]); - } - else - { - sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value); - } - - c_prt(col, dummy2, ctr + 2, x); - } - } - - /* Hide the list */ - else - { - /* Hide list */ - redraw = FALSE; - screen_load(); - } - - /* Redo asking */ - continue; - } - - if (!use_menu) - { - /* Note verify */ - ask = (isupper(choice)); - - /* Lowercase */ - if (ask) choice = (char)tolower(choice); - - /* Extract request */ - i = (islower(choice) ? A2I(choice) : -1); - } - - /* Totally Illegal */ - if ((i < 0) || (i >= max_num) || !able[i]) - { - bell(); - continue; - } - - /* Verify it */ - if (ask) - { - char tmp_val[160]; - - /* Prompt */ - (void)strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name); - - /* Belay that order */ - if (!get_check(tmp_val)) continue; - } - - /* Stop the loop */ - flag = TRUE; - } - if (redraw) screen_load(); - - if (!flag) return; - - repeat_push(i); - } - es_ptr = &essence_info[num[i]]; - - if (es_ptr->add == ESSENCE_SLAY_GLOVE) - tval = TV_GLOVES; - else if (mode == 1 || mode == 5) - item_tester_hook = item_tester_hook_melee_ammo; - else if (es_ptr->add == ESSENCE_ATTACK) - item_tester_hook = object_allow_enchant_weapon; - else if (es_ptr->add == ESSENCE_AC) - item_tester_hook = object_is_armour; - else - item_tester_hook = object_is_weapon_armour_ammo; - - q = _("どのアイテムを改良しますか?", "Improve which item? "); - s = _("改良できるアイテムがありません。", "You have nothing to improve."); - - o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), tval); - if (!o_ptr) return; - - if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(creature_ptr, o_ptr))) - { - msg_print(_("そのアイテムはこれ以上改良できない。", "This item can not be improved any further.")); - return; - } - - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - - use_essence = es_ptr->value; - if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence + 9) / 10; - if (o_ptr->number > 1) - { - use_essence *= o_ptr->number; - msg_format(_("%d個あるのでエッセンスは%d必要です。", "For %d items, it will take %d essences."), o_ptr->number, use_essence); - } - - if (es_ptr->essence != -1) - { - if (creature_ptr->magic_num1[es_ptr->essence] < use_essence) - { - msg_print(_("エッセンスが足りない。", "You don't have enough essences.")); - return; - } - if (is_pval_flag(es_ptr->add)) - { - if (o_ptr->pval < 0) - { - msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item.")); - return; - } - else if (es_ptr->add == TR_BLOWS) - { - if (o_ptr->pval > 1) - { - if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return; - } - - o_ptr->pval = 1; - msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence); - } - else if (o_ptr->pval > 0) - { - use_essence *= o_ptr->pval; - msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence); - } - else - { - char tmp[80]; - char tmp_val[160]; - PARAMETER_VALUE pval; - PARAMETER_VALUE limit = MIN(5, creature_ptr->magic_num1[es_ptr->essence] / es_ptr->value); - - sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit); - strcpy(tmp_val, "1"); - - if (!get_string(tmp, tmp_val, 1)) return; - pval = (PARAMETER_VALUE)atoi(tmp_val); - if (pval > limit) pval = limit; - else if (pval < 1) pval = 1; - o_ptr->pval += pval; - use_essence *= pval; - msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence); - } - - if (creature_ptr->magic_num1[es_ptr->essence] < use_essence) - { - msg_print(_("エッセンスが足りない。", "You don't have enough essences.")); - return; - } - } - else if (es_ptr->add == ESSENCE_SLAY_GLOVE) - { - char tmp_val[160]; - int val; - HIT_PROB get_to_h; - HIT_POINT get_to_d; - - strcpy(tmp_val, "1"); - if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), creature_ptr->lev / 7 + 3), tmp_val, 2)) return; - val = atoi(tmp_val); - if (val > creature_ptr->lev / 7 + 3) val = creature_ptr->lev / 7 + 3; - else if (val < 1) val = 1; - use_essence *= val; - msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence); - if (creature_ptr->magic_num1[es_ptr->essence] < use_essence) - { - msg_print(_("エッセンスが足りない。", "You don't have enough essences.")); - return; - } - get_to_h = ((val + 1) / 2 + randint0(val / 2 + 1)); - get_to_d = ((val + 1) / 2 + randint0(val / 2 + 1)); - o_ptr->xtra4 = (get_to_h << 8) + get_to_d; - o_ptr->to_h += get_to_h; - o_ptr->to_d += get_to_d; - } - creature_ptr->magic_num1[es_ptr->essence] -= use_essence; - if (es_ptr->add == ESSENCE_ATTACK) - { - if ((o_ptr->to_h >= creature_ptr->lev / 5 + 5) && (o_ptr->to_d >= creature_ptr->lev / 5 + 5)) - { - msg_print(_("改良に失敗した。", "You failed to enchant.")); - take_turn(creature_ptr, 100); - return; - } - else - { - if (o_ptr->to_h < creature_ptr->lev / 5 + 5) o_ptr->to_h++; - if (o_ptr->to_d < creature_ptr->lev / 5 + 5) o_ptr->to_d++; - } - } - else if (es_ptr->add == ESSENCE_AC) - { - if (o_ptr->to_a >= creature_ptr->lev / 5 + 5) - { - msg_print(_("改良に失敗した。", "You failed to enchant.")); - take_turn(creature_ptr, 100); - return; - } - else - { - if (o_ptr->to_a < creature_ptr->lev / 5 + 5) o_ptr->to_a++; - } - } - else - { - o_ptr->xtra3 = es_ptr->add + 1; - } - } - else - { - bool success = TRUE; - - switch (es_ptr->add) - { - case ESSENCE_SH_FIRE: - if ((creature_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (creature_ptr->magic_num1[TR_RES_FIRE] < use_essence)) - { - success = FALSE; - break; - } - creature_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence; - creature_ptr->magic_num1[TR_RES_FIRE] -= use_essence; - break; - case ESSENCE_SH_ELEC: - if ((creature_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (creature_ptr->magic_num1[TR_RES_ELEC] < use_essence)) - { - success = FALSE; - break; - } - creature_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence; - creature_ptr->magic_num1[TR_RES_ELEC] -= use_essence; - break; - case ESSENCE_SH_COLD: - if ((creature_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (creature_ptr->magic_num1[TR_RES_COLD] < use_essence)) - { - success = FALSE; - break; - } - creature_ptr->magic_num1[TR_BRAND_COLD] -= use_essence; - creature_ptr->magic_num1[TR_RES_COLD] -= use_essence; - break; - case ESSENCE_RESISTANCE: - case ESSENCE_SUSTAIN: - if ((creature_ptr->magic_num1[TR_RES_ACID] < use_essence) || (creature_ptr->magic_num1[TR_RES_ELEC] < use_essence) || (creature_ptr->magic_num1[TR_RES_FIRE] < use_essence) || (creature_ptr->magic_num1[TR_RES_COLD] < use_essence)) - { - success = FALSE; - break; - } - creature_ptr->magic_num1[TR_RES_ACID] -= use_essence; - creature_ptr->magic_num1[TR_RES_ELEC] -= use_essence; - creature_ptr->magic_num1[TR_RES_FIRE] -= use_essence; - creature_ptr->magic_num1[TR_RES_COLD] -= use_essence; - break; - } - if (!success) - { - msg_print(_("エッセンスが足りない。", "You don't have enough essences.")); - return; - } - if (es_ptr->add == ESSENCE_SUSTAIN) - { - add_flag(o_ptr->art_flags, TR_IGNORE_ACID); - add_flag(o_ptr->art_flags, TR_IGNORE_ELEC); - add_flag(o_ptr->art_flags, TR_IGNORE_FIRE); - add_flag(o_ptr->art_flags, TR_IGNORE_COLD); - } - else - { - o_ptr->xtra3 = es_ptr->add + 1; - } - } - - take_turn(creature_ptr, 100); - _(msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name), - msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name)); - creature_ptr->update |= (PU_COMBINE | PU_REORDER); - creature_ptr->window |= (PW_INVEN); + /* Print list */ + for (ctr = 0; ctr < max_num; ctr++) { + es_ptr = &essence_info[num[ctr]]; + + if (use_menu) { + if (ctr == (menu_line - 1)) + strcpy(dummy, _("》 ", "> ")); + else + strcpy(dummy, " "); + + } + /* letter/number for power selection */ + else { + sprintf(dummy, "%c) ", I2A(ctr)); + } + + strcat(dummy, es_ptr->add_name); + + col = TERM_WHITE; + able[ctr] = TRUE; + + if (es_ptr->essence != -1) { + strcat(dummy, format("(%s)", essence_name[es_ptr->essence])); + if (creature_ptr->magic_num1[es_ptr->essence] < es_ptr->value) + able[ctr] = FALSE; + } else { + switch (es_ptr->add) { + case ESSENCE_SH_FIRE: + strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)")); + if (creature_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) + able[ctr] = FALSE; + if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) + able[ctr] = FALSE; + break; + case ESSENCE_SH_ELEC: + strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)")); + if (creature_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) + able[ctr] = FALSE; + if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) + able[ctr] = FALSE; + break; + case ESSENCE_SH_COLD: + strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)")); + if (creature_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) + able[ctr] = FALSE; + if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) + able[ctr] = FALSE; + break; + case ESSENCE_RESISTANCE: + strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)")); + if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) + able[ctr] = FALSE; + if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) + able[ctr] = FALSE; + if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) + able[ctr] = FALSE; + if (creature_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) + able[ctr] = FALSE; + break; + case ESSENCE_SUSTAIN: + strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)")); + if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) + able[ctr] = FALSE; + if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) + able[ctr] = FALSE; + if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) + able[ctr] = FALSE; + if (creature_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) + able[ctr] = FALSE; + break; + } + } + + if (!able[ctr]) + col = TERM_RED; + + if (es_ptr->essence != -1) { + sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)creature_ptr->magic_num1[es_ptr->essence]); + } else { + sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value); + } + + c_prt(col, dummy2, ctr + 2, x); + } + } + + /* Hide the list */ + else { + /* Hide list */ + redraw = FALSE; + screen_load(); + } + + /* Redo asking */ + continue; + } + + if (!use_menu) { + /* Note verify */ + ask = (isupper(choice)); + + /* Lowercase */ + if (ask) + choice = (char)tolower(choice); + + /* Extract request */ + i = (islower(choice) ? A2I(choice) : -1); + } + + /* Totally Illegal */ + if ((i < 0) || (i >= max_num) || !able[i]) { + bell(); + continue; + } + + /* Verify it */ + if (ask) { + char tmp_val[160]; + + /* Prompt */ + (void)strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name); + + /* Belay that order */ + if (!get_check(tmp_val)) + continue; + } + + /* Stop the loop */ + flag = TRUE; + } + if (redraw) + screen_load(); + + if (!flag) + return; + + repeat_push(i); + } + es_ptr = &essence_info[num[i]]; + + if (es_ptr->add == ESSENCE_SLAY_GLOVE) + tval = TV_GLOVES; + else if (mode == 1 || mode == 5) + item_tester_hook = item_tester_hook_melee_ammo; + else if (es_ptr->add == ESSENCE_ATTACK) + item_tester_hook = object_allow_enchant_weapon; + else if (es_ptr->add == ESSENCE_AC) + item_tester_hook = object_is_armour; + else + item_tester_hook = object_is_weapon_armour_ammo; + + q = _("どのアイテムを改良しますか?", "Improve which item? "); + s = _("改良できるアイテムがありません。", "You have nothing to improve."); + + o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), tval); + if (!o_ptr) + return; + + if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(creature_ptr, o_ptr))) { + msg_print(_("そのアイテムはこれ以上改良できない。", "This item can not be improved any further.")); + return; + } + + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + + use_essence = es_ptr->value; + if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) + use_essence = (use_essence + 9) / 10; + if (o_ptr->number > 1) { + use_essence *= o_ptr->number; + msg_format(_("%d個あるのでエッセンスは%d必要です。", "For %d items, it will take %d essences."), o_ptr->number, use_essence); + } + + if (es_ptr->essence != -1) { + if (creature_ptr->magic_num1[es_ptr->essence] < use_essence) { + msg_print(_("エッセンスが足りない。", "You don't have enough essences.")); + return; + } + if (is_pval_flag(es_ptr->add)) { + if (o_ptr->pval < 0) { + msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item.")); + return; + } else if (es_ptr->add == TR_BLOWS) { + if (o_ptr->pval > 1) { + if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) + return; + } + + o_ptr->pval = 1; + msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence); + } else if (o_ptr->pval > 0) { + use_essence *= o_ptr->pval; + msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence); + } else { + char tmp[80]; + char tmp_val[160]; + PARAMETER_VALUE pval; + PARAMETER_VALUE limit = MIN(5, creature_ptr->magic_num1[es_ptr->essence] / es_ptr->value); + + sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit); + strcpy(tmp_val, "1"); + + if (!get_string(tmp, tmp_val, 1)) + return; + pval = (PARAMETER_VALUE)atoi(tmp_val); + if (pval > limit) + pval = limit; + else if (pval < 1) + pval = 1; + o_ptr->pval += pval; + use_essence *= pval; + msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence); + } + + if (creature_ptr->magic_num1[es_ptr->essence] < use_essence) { + msg_print(_("エッセンスが足りない。", "You don't have enough essences.")); + return; + } + } else if (es_ptr->add == ESSENCE_SLAY_GLOVE) { + char tmp_val[160]; + int val; + HIT_PROB get_to_h; + HIT_POINT get_to_d; + + strcpy(tmp_val, "1"); + if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), creature_ptr->lev / 7 + 3), tmp_val, 2)) + return; + val = atoi(tmp_val); + if (val > creature_ptr->lev / 7 + 3) + val = creature_ptr->lev / 7 + 3; + else if (val < 1) + val = 1; + use_essence *= val; + msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence); + if (creature_ptr->magic_num1[es_ptr->essence] < use_essence) { + msg_print(_("エッセンスが足りない。", "You don't have enough essences.")); + return; + } + get_to_h = ((val + 1) / 2 + randint0(val / 2 + 1)); + get_to_d = ((val + 1) / 2 + randint0(val / 2 + 1)); + o_ptr->xtra4 = (get_to_h << 8) + get_to_d; + o_ptr->to_h += get_to_h; + o_ptr->to_d += get_to_d; + } + creature_ptr->magic_num1[es_ptr->essence] -= use_essence; + if (es_ptr->add == ESSENCE_ATTACK) { + if ((o_ptr->to_h >= creature_ptr->lev / 5 + 5) && (o_ptr->to_d >= creature_ptr->lev / 5 + 5)) { + msg_print(_("改良に失敗した。", "You failed to enchant.")); + take_turn(creature_ptr, 100); + return; + } else { + if (o_ptr->to_h < creature_ptr->lev / 5 + 5) + o_ptr->to_h++; + if (o_ptr->to_d < creature_ptr->lev / 5 + 5) + o_ptr->to_d++; + } + } else if (es_ptr->add == ESSENCE_AC) { + if (o_ptr->to_a >= creature_ptr->lev / 5 + 5) { + msg_print(_("改良に失敗した。", "You failed to enchant.")); + take_turn(creature_ptr, 100); + return; + } else { + if (o_ptr->to_a < creature_ptr->lev / 5 + 5) + o_ptr->to_a++; + } + } else { + o_ptr->xtra3 = es_ptr->add + 1; + } + } else { + bool success = TRUE; + + switch (es_ptr->add) { + case ESSENCE_SH_FIRE: + if ((creature_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (creature_ptr->magic_num1[TR_RES_FIRE] < use_essence)) { + success = FALSE; + break; + } + creature_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence; + creature_ptr->magic_num1[TR_RES_FIRE] -= use_essence; + break; + case ESSENCE_SH_ELEC: + if ((creature_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (creature_ptr->magic_num1[TR_RES_ELEC] < use_essence)) { + success = FALSE; + break; + } + creature_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence; + creature_ptr->magic_num1[TR_RES_ELEC] -= use_essence; + break; + case ESSENCE_SH_COLD: + if ((creature_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (creature_ptr->magic_num1[TR_RES_COLD] < use_essence)) { + success = FALSE; + break; + } + creature_ptr->magic_num1[TR_BRAND_COLD] -= use_essence; + creature_ptr->magic_num1[TR_RES_COLD] -= use_essence; + break; + case ESSENCE_RESISTANCE: + case ESSENCE_SUSTAIN: + if ((creature_ptr->magic_num1[TR_RES_ACID] < use_essence) || (creature_ptr->magic_num1[TR_RES_ELEC] < use_essence) + || (creature_ptr->magic_num1[TR_RES_FIRE] < use_essence) || (creature_ptr->magic_num1[TR_RES_COLD] < use_essence)) { + success = FALSE; + break; + } + creature_ptr->magic_num1[TR_RES_ACID] -= use_essence; + creature_ptr->magic_num1[TR_RES_ELEC] -= use_essence; + creature_ptr->magic_num1[TR_RES_FIRE] -= use_essence; + creature_ptr->magic_num1[TR_RES_COLD] -= use_essence; + break; + } + if (!success) { + msg_print(_("エッセンスが足りない。", "You don't have enough essences.")); + return; + } + if (es_ptr->add == ESSENCE_SUSTAIN) { + add_flag(o_ptr->art_flags, TR_IGNORE_ACID); + add_flag(o_ptr->art_flags, TR_IGNORE_ELEC); + add_flag(o_ptr->art_flags, TR_IGNORE_FIRE); + add_flag(o_ptr->art_flags, TR_IGNORE_COLD); + } else { + o_ptr->xtra3 = es_ptr->add + 1; + } + } + + take_turn(creature_ptr, 100); + _(msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name), msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name)); + creature_ptr->update |= (PU_COMBINE | PU_REORDER); + creature_ptr->window |= (PW_INVEN); } /*! @@ -1349,39 +996,43 @@ static void add_essence(player_type *creature_ptr, ESSENCE_IDX mode) */ static void erase_essence(player_type *creature_ptr) { - OBJECT_IDX item; - concptr q, s; - object_type *o_ptr; - GAME_TEXT o_name[MAX_NLEN]; - BIT_FLAGS flgs[TR_FLAG_SIZE]; - - item_tester_hook = object_is_smith; - - q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? "); - s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence."); - - o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0); - if (!o_ptr) return; - - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return; - - take_turn(creature_ptr, 100); - - if (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE) - { - o_ptr->to_h -= (o_ptr->xtra4 >> 8); - o_ptr->to_d -= (o_ptr->xtra4 & 0x000f); - o_ptr->xtra4 = 0; - if (o_ptr->to_h < 0) o_ptr->to_h = 0; - if (o_ptr->to_d < 0) o_ptr->to_d = 0; - } - o_ptr->xtra3 = 0; - object_flags(creature_ptr, o_ptr, flgs); - if (!(have_pval_flags(flgs))) o_ptr->pval = 0; - msg_print(_("エッセンスを取り去った。", "You removed all essence you have added.")); - creature_ptr->update |= (PU_COMBINE | PU_REORDER); - creature_ptr->window |= (PW_INVEN); + OBJECT_IDX item; + concptr q, s; + object_type *o_ptr; + GAME_TEXT o_name[MAX_NLEN]; + BIT_FLAGS flgs[TR_FLAG_SIZE]; + + item_tester_hook = object_is_smith; + + q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? "); + s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence."); + + o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0); + if (!o_ptr) + return; + + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) + return; + + take_turn(creature_ptr, 100); + + if (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE) { + o_ptr->to_h -= (o_ptr->xtra4 >> 8); + o_ptr->to_d -= (o_ptr->xtra4 & 0x000f); + o_ptr->xtra4 = 0; + if (o_ptr->to_h < 0) + o_ptr->to_h = 0; + if (o_ptr->to_d < 0) + o_ptr->to_d = 0; + } + o_ptr->xtra3 = 0; + object_flags(creature_ptr, o_ptr, flgs); + if (!(have_pval_flags(flgs))) + o_ptr->pval = 0; + msg_print(_("エッセンスを取り去った。", "You removed all essence you have added.")); + creature_ptr->update |= (PU_COMBINE | PU_REORDER); + creature_ptr->window |= (PW_INVEN); } /*! @@ -1391,151 +1042,155 @@ static void erase_essence(player_type *creature_ptr) */ void do_cmd_kaji(player_type *creature_ptr, bool only_browse) { - COMMAND_CODE mode = 0; - char choice; - - COMMAND_CODE menu_line = (use_menu ? 1 : 0); - - if (!only_browse) - { - if (cmd_limit_confused(creature_ptr)) return; - if (cmd_limit_blind(creature_ptr)) return; - if (cmd_limit_image(creature_ptr)) return; - } - - if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5)) - { - if (only_browse) screen_save(); - do { - if (!only_browse) screen_save(); - if (use_menu) - { - while (!mode) - { + COMMAND_CODE mode = 0; + char choice; + + COMMAND_CODE menu_line = (use_menu ? 1 : 0); + + if (!only_browse) { + if (cmd_limit_confused(creature_ptr)) + return; + if (cmd_limit_blind(creature_ptr)) + return; + if (cmd_limit_image(creature_ptr)) + return; + } + + if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5)) { + if (only_browse) + screen_save(); + do { + if (!only_browse) + screen_save(); + if (use_menu) { + while (!mode) { #ifdef JP - prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14); - prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14); - prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14); - prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14); - prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14); - prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0); + prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14); + prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14); + prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14); + prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14); + prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14); + prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0); #else - prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14); - prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14); - prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14); - prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14); - prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14); - prt(format("Choose command from menu."), 0, 0); + prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14); + prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14); + prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14); + prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14); + prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14); + prt(format("Choose command from menu."), 0, 0); #endif - choice = inkey(); - switch (choice) - { - case ESCAPE: - case 'z': - case 'Z': - screen_load(); - return; - case '2': - case 'j': - case 'J': - menu_line++; - break; - case '8': - case 'k': - case 'K': - menu_line += 4; - break; - case '\r': - case '\n': - case 'x': - case 'X': - mode = menu_line; - break; - } - if (menu_line > 5) menu_line -= 5; - } - } - - else - { - while (!mode) - { - prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14); - prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14); - prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14); - prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14); - prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14); + choice = inkey(); + switch (choice) { + case ESCAPE: + case 'z': + case 'Z': + screen_load(); + return; + case '2': + case 'j': + case 'J': + menu_line++; + break; + case '8': + case 'k': + case 'K': + menu_line += 4; + break; + case '\r': + case '\n': + case 'x': + case 'X': + mode = menu_line; + break; + } + if (menu_line > 5) + menu_line -= 5; + } + } + + else { + while (!mode) { + prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14); + prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14); + prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14); + prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14); + prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14); #ifdef JP - if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE)) + if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE)) #else - if (!get_com("Command :", &choice, TRUE)) + if (!get_com("Command :", &choice, TRUE)) #endif - { - screen_load(); - return; - } - switch (choice) - { - case 'A': - case 'a': - mode = 1; - break; - case 'B': - case 'b': - mode = 2; - break; - case 'C': - case 'c': - mode = 3; - break; - case 'D': - case 'd': - mode = 4; - break; - case 'E': - case 'e': - mode = 5; - break; - } - } - } - - if (only_browse) - { - char temp[62 * 5]; - int line, j; - - /* Clear lines, position cursor (really should use strlen here) */ - Term_erase(14, 21, 255); - Term_erase(14, 20, 255); - Term_erase(14, 19, 255); - Term_erase(14, 18, 255); - Term_erase(14, 17, 255); - Term_erase(14, 16, 255); - - shape_buffer(kaji_tips[mode - 1], 62, temp, sizeof(temp)); - for (j = 0, line = 17; temp[j]; j += (1 + strlen(&temp[j]))) - { - prt(&temp[j], line, 15); - line++; - } - mode = 0; - } - if (!only_browse) screen_load(); - } while (only_browse); - repeat_push(mode); - } - switch (mode) - { - case 1: display_essence(creature_ptr); break; - case 2: drain_essence(creature_ptr); break; - case 3: erase_essence(creature_ptr); break; - case 4: - mode = choose_essence(); - if (mode == 0) - break; - add_essence(creature_ptr, mode); - break; - case 5: add_essence(creature_ptr, 10); break; - } + { + screen_load(); + return; + } + switch (choice) { + case 'A': + case 'a': + mode = 1; + break; + case 'B': + case 'b': + mode = 2; + break; + case 'C': + case 'c': + mode = 3; + break; + case 'D': + case 'd': + mode = 4; + break; + case 'E': + case 'e': + mode = 5; + break; + } + } + } + + if (only_browse) { + char temp[62 * 5]; + int line, j; + + /* Clear lines, position cursor (really should use strlen here) */ + Term_erase(14, 21, 255); + Term_erase(14, 20, 255); + Term_erase(14, 19, 255); + Term_erase(14, 18, 255); + Term_erase(14, 17, 255); + Term_erase(14, 16, 255); + + shape_buffer(kaji_tips[mode - 1], 62, temp, sizeof(temp)); + for (j = 0, line = 17; temp[j]; j += (1 + strlen(&temp[j]))) { + prt(&temp[j], line, 15); + line++; + } + mode = 0; + } + if (!only_browse) + screen_load(); + } while (only_browse); + repeat_push(mode); + } + switch (mode) { + case 1: + display_essence(creature_ptr); + break; + case 2: + drain_essence(creature_ptr); + break; + case 3: + erase_essence(creature_ptr); + break; + case 4: + mode = choose_essence(); + if (mode == 0) + break; + add_essence(creature_ptr, mode); + break; + case 5: + add_essence(creature_ptr, 10); + break; + } } diff --git a/src/cmd-visual/cmd-visuals.c b/src/cmd-visual/cmd-visuals.c index 644d84289..6282c9057 100644 --- a/src/cmd-visual/cmd-visuals.c +++ b/src/cmd-visual/cmd-visuals.c @@ -2,6 +2,7 @@ #include "cmd-visual/cmd-draw.h" #include "core/asking-player.h" #include "core/visuals-reseter.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "game-option/special-options.h" #include "io/files-util.h" @@ -31,23 +32,21 @@ */ static bool cmd_visuals_aux(int i, IDX *num, IDX max) { - if (iscntrl(i)) - { - char str[10] = ""; - sprintf(str, "%d", *num); - if (!get_string(format("Input new number(0-%d): ", max - 1), str, 4)) - return FALSE; - - IDX tmp = (IDX)strtol(str, NULL, 0); - if (tmp >= 0 && tmp < max) - *num = tmp; - } - else if (isupper(i)) - *num = (*num + max - 1) % max; - else - *num = (*num + 1) % max; - - return TRUE; + if (iscntrl(i)) { + char str[10] = ""; + sprintf(str, "%d", *num); + if (!get_string(format("Input new number(0-%d): ", max - 1), str, 4)) + return FALSE; + + IDX tmp = (IDX)strtol(str, NULL, 0); + if (tmp >= 0 && tmp < max) + *num = tmp; + } else if (isupper(i)) + *num = (*num + max - 1) % max; + else + *num = (*num + 1) % max; + + return TRUE; } /*! @@ -57,406 +56,388 @@ static bool cmd_visuals_aux(int i, IDX *num, IDX max) */ static void print_visuals_menu(concptr choice_msg) { - prt(_("[ 画面表示の設定 ]", "Interact with Visuals"), 1, 0); - prt(_("(0) ユーザー設定ファイルのロード", "(0) Load a user pref file"), 3, 5); - prt(_("(1) モンスターの 色/文字 をファイルに書き出す", "(1) Dump monster attr/chars"), 4, 5); - prt(_("(2) アイテムの 色/文字 をファイルに書き出す", "(2) Dump object attr/chars"), 5, 5); - prt(_("(3) 地形の 色/文字 をファイルに書き出す", "(3) Dump feature attr/chars"), 6, 5); - prt(_("(4) モンスターの 色/文字 を変更する (数値操作)", "(4) Change monster attr/chars (numeric operation)"), 7, 5); - prt(_("(5) アイテムの 色/文字 を変更する (数値操作)", "(5) Change object attr/chars (numeric operation)"), 8, 5); - prt(_("(6) 地形の 色/文字 を変更する (数値操作)", "(6) Change feature attr/chars (numeric operation)"), 9, 5); - prt(_("(7) モンスターの 色/文字 を変更する (シンボルエディタ)", "(7) Change monster attr/chars (visual mode)"), 10, 5); - prt(_("(8) アイテムの 色/文字 を変更する (シンボルエディタ)", "(8) Change object attr/chars (visual mode)"), 11, 5); - prt(_("(9) 地形の 色/文字 を変更する (シンボルエディタ)", "(9) Change feature attr/chars (visual mode)"), 12, 5); - prt(_("(R) 画面表示方法の初期化", "(R) Reset visuals"), 13, 5); - prt(format("コマンド: %s", choice_msg ? choice_msg : _("", "")), 15, 0); + prt(_("[ 画面表示の設定 ]", "Interact with Visuals"), 1, 0); + prt(_("(0) ユーザー設定ファイルのロード", "(0) Load a user pref file"), 3, 5); + prt(_("(1) モンスターの 色/文字 をファイルに書き出す", "(1) Dump monster attr/chars"), 4, 5); + prt(_("(2) アイテムの 色/文字 をファイルに書き出す", "(2) Dump object attr/chars"), 5, 5); + prt(_("(3) 地形の 色/文字 をファイルに書き出す", "(3) Dump feature attr/chars"), 6, 5); + prt(_("(4) モンスターの 色/文字 を変更する (数値操作)", "(4) Change monster attr/chars (numeric operation)"), 7, 5); + prt(_("(5) アイテムの 色/文字 を変更する (数値操作)", "(5) Change object attr/chars (numeric operation)"), 8, 5); + prt(_("(6) 地形の 色/文字 を変更する (数値操作)", "(6) Change feature attr/chars (numeric operation)"), 9, 5); + prt(_("(7) モンスターの 色/文字 を変更する (シンボルエディタ)", "(7) Change monster attr/chars (visual mode)"), 10, 5); + prt(_("(8) アイテムの 色/文字 を変更する (シンボルエディタ)", "(8) Change object attr/chars (visual mode)"), 11, 5); + prt(_("(9) 地形の 色/文字 を変更する (シンボルエディタ)", "(9) Change feature attr/chars (visual mode)"), 12, 5); + prt(_("(R) 画面表示方法の初期化", "(R) Reset visuals"), 13, 5); + prt(format("コマンド: %s", choice_msg ? choice_msg : _("", "")), 15, 0); } - /* * Interact with "visuals" */ -void do_cmd_visuals(player_type *creature_ptr, void(*process_autopick_file_command)(char*)) +void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_command)(char *)) { - FILE *auto_dump_stream; - char tmp[160]; - char buf[1024]; - bool need_redraw = FALSE; - concptr empty_symbol = "<< ? >>"; - if (use_bigtile) empty_symbol = "<< ?? >>"; - - screen_save(); - while (TRUE) - { - Term_clear(); - print_visuals_menu(NULL); - int i = inkey(); - if (i == ESCAPE) break; - - switch (i) - { - case '0': - { - prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 15, 0); - prt(_("ファイル: ", "File: "), 17, 0); - sprintf(tmp, "%s.prf", creature_ptr->base_name); - if (!askfor(tmp, 70)) continue; - - (void)process_pref_file(creature_ptr, tmp, process_autopick_file_command); - need_redraw = TRUE; - break; - } - case '1': - { - static concptr mark = "Monster attr/chars"; - prt(_("コマンド: モンスターの[色/文字]をファイルに書き出します", "Command: Dump monster attr/chars"), 15, 0); - prt(_("ファイル: ", "File: "), 17, 0); - sprintf(tmp, "%s.prf", creature_ptr->base_name); - if (!askfor(tmp, 70)) continue; - - path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp); - if (!open_auto_dump(&auto_dump_stream, buf, mark)) continue; - - auto_dump_printf(auto_dump_stream, _("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n")); - for (i = 0; i < max_r_idx; i++) - { - monster_race *r_ptr = &r_info[i]; - if (!r_ptr->name) continue; - - auto_dump_printf(auto_dump_stream, "# %s\n", (r_name + r_ptr->name)); - auto_dump_printf(auto_dump_stream, "R:%d:0x%02X/0x%02X\n\n", i, - (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char)); - } - - close_auto_dump(&auto_dump_stream, mark); - msg_print(_("モンスターの[色/文字]をファイルに書き出しました。", "Dumped monster attr/chars.")); - break; - } - case '2': - { - static concptr mark = "Object attr/chars"; - prt(_("コマンド: アイテムの[色/文字]をファイルに書き出します", "Command: Dump object attr/chars"), 15, 0); - prt(_("ファイル: ", "File: "), 17, 0); - sprintf(tmp, "%s.prf", creature_ptr->base_name); - if (!askfor(tmp, 70)) continue; - - path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp); - if (!open_auto_dump(&auto_dump_stream, buf, mark)) continue; - - auto_dump_printf(auto_dump_stream, _("\n# アイテムの[色/文字]の設定\n\n", "\n# Object attr/char definitions\n\n")); - for (KIND_OBJECT_IDX k_idx = 0; k_idx < max_k_idx; k_idx++) - { - GAME_TEXT o_name[MAX_NLEN]; - object_kind *k_ptr = &k_info[k_idx]; - if (!k_ptr->name) continue; - - if (!k_ptr->flavor) - { - strip_name(o_name, k_idx); - } - else - { - object_type forge; - object_prep(creature_ptr, &forge, k_idx); - object_desc(creature_ptr, o_name, &forge, OD_FORCE_FLAVOR); - } - - auto_dump_printf(auto_dump_stream, "# %s\n", o_name); - auto_dump_printf(auto_dump_stream, "K:%d:0x%02X/0x%02X\n\n", (int)k_idx, - (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char)); - } - - close_auto_dump(&auto_dump_stream, mark); - msg_print(_("アイテムの[色/文字]をファイルに書き出しました。", "Dumped object attr/chars.")); - break; - } - case '3': - { - static concptr mark = "Feature attr/chars"; - prt(_("コマンド: 地形の[色/文字]をファイルに書き出します", "Command: Dump feature attr/chars"), 15, 0); - prt(_("ファイル: ", "File: "), 17, 0); - sprintf(tmp, "%s.prf", creature_ptr->base_name); - if (!askfor(tmp, 70)) continue; - - path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp); - if (!open_auto_dump(&auto_dump_stream, buf, mark)) continue; - - auto_dump_printf(auto_dump_stream, _("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n")); - for (i = 0; i < max_f_idx; i++) - { - feature_type *f_ptr = &f_info[i]; - if (!f_ptr->name) continue; - if (f_ptr->mimic != i) continue; - - auto_dump_printf(auto_dump_stream, "# %s\n", (f_name + f_ptr->name)); - auto_dump_printf(auto_dump_stream, "F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i, - (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]), - (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]), - (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK])); - } - - close_auto_dump(&auto_dump_stream, mark); - msg_print(_("地形の[色/文字]をファイルに書き出しました。", "Dumped feature attr/chars.")); - break; - } - case '4': - { - static concptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars"); - static MONRACE_IDX r = 0; - prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0); - while (TRUE) - { - monster_race *r_ptr = &r_info[r]; - int c; - IDX t; - - TERM_COLOR da = r_ptr->d_attr; - byte dc = r_ptr->d_char; - TERM_COLOR ca = r_ptr->x_attr; - byte cc = r_ptr->x_char; - - Term_putstr(5, 17, -1, TERM_WHITE, - format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, (r_name + r_ptr->name))); - Term_putstr(10, 19, -1, TERM_WHITE, - format(_("初期値 色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc)); - Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol); - Term_queue_bigchar(43, 19, da, dc, 0, 0); - Term_putstr(10, 20, -1, TERM_WHITE, - format(_("現在値 色 / 文字 = %3u / %3u", "Current attr/char = %3u / %3u"), ca, cc)); - Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol); - Term_queue_bigchar(43, 20, ca, cc, 0, 0); - Term_putstr(0, 22, -1, TERM_WHITE, - _("コマンド (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ")); - i = inkey(); - if (i == ESCAPE) break; - - if (iscntrl(i)) c = 'a' + i - KTRL('A'); - else if (isupper(i)) c = 'a' + i - 'A'; - else c = i; - - switch (c) - { - case 'n': - { - IDX prev_r = r; - do - { - if (!cmd_visuals_aux(i, &r, max_r_idx)) - { - r = prev_r; - break; - } - } while (!r_info[r].name); - } - - break; - case 'a': - t = (int)r_ptr->x_attr; - (void)cmd_visuals_aux(i, &t, 256); - r_ptr->x_attr = (byte)t; - need_redraw = TRUE; - break; - case 'c': - t = (int)r_ptr->x_char; - (void)cmd_visuals_aux(i, &t, 256); - r_ptr->x_char = (byte)t; - need_redraw = TRUE; - break; - case 'v': - do_cmd_knowledge_monsters(creature_ptr, &need_redraw, TRUE, r); - Term_clear(); - print_visuals_menu(choice_msg); - break; - } - } - - break; - } - case '5': - { - static concptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars"); - static IDX k = 0; - prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0); - while (TRUE) - { - object_kind *k_ptr = &k_info[k]; - int c; - IDX t; - - TERM_COLOR da = k_ptr->d_attr; - SYMBOL_CODE dc = k_ptr->d_char; - TERM_COLOR ca = k_ptr->x_attr; - SYMBOL_CODE cc = k_ptr->x_char; - - Term_putstr(5, 17, -1, TERM_WHITE, - format(_("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"), - k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name))); - Term_putstr(10, 19, -1, TERM_WHITE, - format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc)); - Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol); - Term_queue_bigchar(43, 19, da, dc, 0, 0); - Term_putstr(10, 20, -1, TERM_WHITE, - format(_("現在値 色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc)); - Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol); - Term_queue_bigchar(43, 20, ca, cc, 0, 0); - Term_putstr(0, 22, -1, TERM_WHITE, - _("コマンド (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ")); - - i = inkey(); - if (i == ESCAPE) break; - - if (iscntrl(i)) c = 'a' + i - KTRL('A'); - else if (isupper(i)) c = 'a' + i - 'A'; - else c = i; - - switch (c) - { - case 'n': - { - IDX prev_k = k; - do - { - if (!cmd_visuals_aux(i, &k, max_k_idx)) - { - k = prev_k; - break; - } - } while (!k_info[k].name); - } - - break; - case 'a': - t = (int)k_ptr->x_attr; - (void)cmd_visuals_aux(i, &t, 256); - k_ptr->x_attr = (byte)t; - need_redraw = TRUE; - break; - case 'c': - t = (int)k_ptr->x_char; - (void)cmd_visuals_aux(i, &t, 256); - k_ptr->x_char = (byte)t; - need_redraw = TRUE; - break; - case 'v': - do_cmd_knowledge_objects(creature_ptr, &need_redraw, TRUE, k); - Term_clear(); - print_visuals_menu(choice_msg); - break; - } - } - - break; - } - case '6': - { - static concptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars"); - static IDX f = 0; - static IDX lighting_level = F_LIT_STANDARD; - prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0); - while (TRUE) - { - feature_type *f_ptr = &f_info[f]; - int c; - IDX t; - - TERM_COLOR da = f_ptr->d_attr[lighting_level]; - byte dc = f_ptr->d_char[lighting_level]; - TERM_COLOR ca = f_ptr->x_attr[lighting_level]; - byte cc = f_ptr->x_char[lighting_level]; - - prt("", 17, 5); - Term_putstr(5, 17, -1, TERM_WHITE, - format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"), - f, (f_name + f_ptr->name), lighting_level_str[lighting_level])); - Term_putstr(10, 19, -1, TERM_WHITE, - format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc)); - Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol); - Term_queue_bigchar(43, 19, da, dc, 0, 0); - Term_putstr(10, 20, -1, TERM_WHITE, - format(_("現在値 色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc)); - Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol); - Term_queue_bigchar(43, 20, ca, cc, 0, 0); - Term_putstr(0, 22, -1, TERM_WHITE, - _("コマンド (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ")); - - i = inkey(); - if (i == ESCAPE) break; - - if (iscntrl(i)) c = 'a' + i - KTRL('A'); - else if (isupper(i)) c = 'a' + i - 'A'; - else c = i; - - switch (c) - { - case 'n': - { - IDX prev_f = f; - do - { - if (!cmd_visuals_aux(i, &f, max_f_idx)) - { - f = prev_f; - break; - } - } while (!f_info[f].name || (f_info[f].mimic != f)); - } - - break; - case 'a': - t = (int)f_ptr->x_attr[lighting_level]; - (void)cmd_visuals_aux(i, &t, 256); - f_ptr->x_attr[lighting_level] = (byte)t; - need_redraw = TRUE; - break; - case 'c': - t = (int)f_ptr->x_char[lighting_level]; - (void)cmd_visuals_aux(i, &t, 256); - f_ptr->x_char[lighting_level] = (byte)t; - need_redraw = TRUE; - break; - case 'l': - (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX); - break; - case 'd': - apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char); - need_redraw = TRUE; - break; - case 'v': - do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level); - Term_clear(); - print_visuals_menu(choice_msg); - break; - } - } - - break; - } - case '7': - do_cmd_knowledge_monsters(creature_ptr, &need_redraw, TRUE, -1); - break; - case '8': - do_cmd_knowledge_objects(creature_ptr, &need_redraw, TRUE, -1); - break; - case '9': - { - IDX lighting_level = F_LIT_STANDARD; - do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level); - break; - } - case 'R': - case 'r': - reset_visuals(creature_ptr, process_autopick_file_command); - msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset.")); - need_redraw = TRUE; - break; - default: - bell(); - break; - } - - msg_erase(); - } - - screen_load(); - if (need_redraw) do_cmd_redraw(creature_ptr); + FILE *auto_dump_stream; + char tmp[160]; + char buf[1024]; + bool need_redraw = FALSE; + concptr empty_symbol = "<< ? >>"; + if (use_bigtile) + empty_symbol = "<< ?? >>"; + + screen_save(); + while (TRUE) { + Term_clear(); + print_visuals_menu(NULL); + int i = inkey(); + if (i == ESCAPE) + break; + + switch (i) { + case '0': { + prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 15, 0); + prt(_("ファイル: ", "File: "), 17, 0); + sprintf(tmp, "%s.prf", creature_ptr->base_name); + if (!askfor(tmp, 70)) + continue; + + (void)process_pref_file(creature_ptr, tmp, process_autopick_file_command); + need_redraw = TRUE; + break; + } + case '1': { + static concptr mark = "Monster attr/chars"; + prt(_("コマンド: モンスターの[色/文字]をファイルに書き出します", "Command: Dump monster attr/chars"), 15, 0); + prt(_("ファイル: ", "File: "), 17, 0); + sprintf(tmp, "%s.prf", creature_ptr->base_name); + if (!askfor(tmp, 70)) + continue; + + path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp); + if (!open_auto_dump(&auto_dump_stream, buf, mark)) + continue; + + auto_dump_printf(auto_dump_stream, _("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n")); + for (i = 0; i < max_r_idx; i++) { + monster_race *r_ptr = &r_info[i]; + if (!r_ptr->name) + continue; + + auto_dump_printf(auto_dump_stream, "# %s\n", (r_name + r_ptr->name)); + auto_dump_printf(auto_dump_stream, "R:%d:0x%02X/0x%02X\n\n", i, (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char)); + } + + close_auto_dump(&auto_dump_stream, mark); + msg_print(_("モンスターの[色/文字]をファイルに書き出しました。", "Dumped monster attr/chars.")); + break; + } + case '2': { + static concptr mark = "Object attr/chars"; + prt(_("コマンド: アイテムの[色/文字]をファイルに書き出します", "Command: Dump object attr/chars"), 15, 0); + prt(_("ファイル: ", "File: "), 17, 0); + sprintf(tmp, "%s.prf", creature_ptr->base_name); + if (!askfor(tmp, 70)) + continue; + + path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp); + if (!open_auto_dump(&auto_dump_stream, buf, mark)) + continue; + + auto_dump_printf(auto_dump_stream, _("\n# アイテムの[色/文字]の設定\n\n", "\n# Object attr/char definitions\n\n")); + for (KIND_OBJECT_IDX k_idx = 0; k_idx < max_k_idx; k_idx++) { + GAME_TEXT o_name[MAX_NLEN]; + object_kind *k_ptr = &k_info[k_idx]; + if (!k_ptr->name) + continue; + + if (!k_ptr->flavor) { + strip_name(o_name, k_idx); + } else { + object_type forge; + object_prep(creature_ptr, &forge, k_idx); + describe_flavor(creature_ptr, o_name, &forge, OD_FORCE_FLAVOR); + } + + auto_dump_printf(auto_dump_stream, "# %s\n", o_name); + auto_dump_printf(auto_dump_stream, "K:%d:0x%02X/0x%02X\n\n", (int)k_idx, (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char)); + } + + close_auto_dump(&auto_dump_stream, mark); + msg_print(_("アイテムの[色/文字]をファイルに書き出しました。", "Dumped object attr/chars.")); + break; + } + case '3': { + static concptr mark = "Feature attr/chars"; + prt(_("コマンド: 地形の[色/文字]をファイルに書き出します", "Command: Dump feature attr/chars"), 15, 0); + prt(_("ファイル: ", "File: "), 17, 0); + sprintf(tmp, "%s.prf", creature_ptr->base_name); + if (!askfor(tmp, 70)) + continue; + + path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp); + if (!open_auto_dump(&auto_dump_stream, buf, mark)) + continue; + + auto_dump_printf(auto_dump_stream, _("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n")); + for (i = 0; i < max_f_idx; i++) { + feature_type *f_ptr = &f_info[i]; + if (!f_ptr->name) + continue; + if (f_ptr->mimic != i) + continue; + + auto_dump_printf(auto_dump_stream, "# %s\n", (f_name + f_ptr->name)); + auto_dump_printf(auto_dump_stream, "F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i, (byte)(f_ptr->x_attr[F_LIT_STANDARD]), + (byte)(f_ptr->x_char[F_LIT_STANDARD]), (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]), + (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK])); + } + + close_auto_dump(&auto_dump_stream, mark); + msg_print(_("地形の[色/文字]をファイルに書き出しました。", "Dumped feature attr/chars.")); + break; + } + case '4': { + static concptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars"); + static MONRACE_IDX r = 0; + prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0); + while (TRUE) { + monster_race *r_ptr = &r_info[r]; + int c; + IDX t; + + TERM_COLOR da = r_ptr->d_attr; + byte dc = r_ptr->d_char; + TERM_COLOR ca = r_ptr->x_attr; + byte cc = r_ptr->x_char; + + Term_putstr(5, 17, -1, TERM_WHITE, format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, (r_name + r_ptr->name))); + Term_putstr(10, 19, -1, TERM_WHITE, format(_("初期値 色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc)); + Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol); + Term_queue_bigchar(43, 19, da, dc, 0, 0); + Term_putstr(10, 20, -1, TERM_WHITE, format(_("現在値 色 / 文字 = %3u / %3u", "Current attr/char = %3u / %3u"), ca, cc)); + Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol); + Term_queue_bigchar(43, 20, ca, cc, 0, 0); + Term_putstr(0, 22, -1, TERM_WHITE, _("コマンド (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ")); + i = inkey(); + if (i == ESCAPE) + break; + + if (iscntrl(i)) + c = 'a' + i - KTRL('A'); + else if (isupper(i)) + c = 'a' + i - 'A'; + else + c = i; + + switch (c) { + case 'n': { + IDX prev_r = r; + do { + if (!cmd_visuals_aux(i, &r, max_r_idx)) { + r = prev_r; + break; + } + } while (!r_info[r].name); + } + + break; + case 'a': + t = (int)r_ptr->x_attr; + (void)cmd_visuals_aux(i, &t, 256); + r_ptr->x_attr = (byte)t; + need_redraw = TRUE; + break; + case 'c': + t = (int)r_ptr->x_char; + (void)cmd_visuals_aux(i, &t, 256); + r_ptr->x_char = (byte)t; + need_redraw = TRUE; + break; + case 'v': + do_cmd_knowledge_monsters(creature_ptr, &need_redraw, TRUE, r); + Term_clear(); + print_visuals_menu(choice_msg); + break; + } + } + + break; + } + case '5': { + static concptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars"); + static IDX k = 0; + prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0); + while (TRUE) { + object_kind *k_ptr = &k_info[k]; + int c; + IDX t; + + TERM_COLOR da = k_ptr->d_attr; + SYMBOL_CODE dc = k_ptr->d_char; + TERM_COLOR ca = k_ptr->x_attr; + SYMBOL_CODE cc = k_ptr->x_char; + + Term_putstr(5, 17, -1, TERM_WHITE, + format( + _("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"), k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name))); + Term_putstr(10, 19, -1, TERM_WHITE, format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc)); + Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol); + Term_queue_bigchar(43, 19, da, dc, 0, 0); + Term_putstr(10, 20, -1, TERM_WHITE, format(_("現在値 色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc)); + Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol); + Term_queue_bigchar(43, 20, ca, cc, 0, 0); + Term_putstr(0, 22, -1, TERM_WHITE, _("コマンド (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ")); + + i = inkey(); + if (i == ESCAPE) + break; + + if (iscntrl(i)) + c = 'a' + i - KTRL('A'); + else if (isupper(i)) + c = 'a' + i - 'A'; + else + c = i; + + switch (c) { + case 'n': { + IDX prev_k = k; + do { + if (!cmd_visuals_aux(i, &k, max_k_idx)) { + k = prev_k; + break; + } + } while (!k_info[k].name); + } + + break; + case 'a': + t = (int)k_ptr->x_attr; + (void)cmd_visuals_aux(i, &t, 256); + k_ptr->x_attr = (byte)t; + need_redraw = TRUE; + break; + case 'c': + t = (int)k_ptr->x_char; + (void)cmd_visuals_aux(i, &t, 256); + k_ptr->x_char = (byte)t; + need_redraw = TRUE; + break; + case 'v': + do_cmd_knowledge_objects(creature_ptr, &need_redraw, TRUE, k); + Term_clear(); + print_visuals_menu(choice_msg); + break; + } + } + + break; + } + case '6': { + static concptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars"); + static IDX f = 0; + static IDX lighting_level = F_LIT_STANDARD; + prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0); + while (TRUE) { + feature_type *f_ptr = &f_info[f]; + int c; + IDX t; + + TERM_COLOR da = f_ptr->d_attr[lighting_level]; + byte dc = f_ptr->d_char[lighting_level]; + TERM_COLOR ca = f_ptr->x_attr[lighting_level]; + byte cc = f_ptr->x_char[lighting_level]; + + prt("", 17, 5); + Term_putstr(5, 17, -1, TERM_WHITE, + format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"), f, (f_name + f_ptr->name), + lighting_level_str[lighting_level])); + Term_putstr(10, 19, -1, TERM_WHITE, format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc)); + Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol); + Term_queue_bigchar(43, 19, da, dc, 0, 0); + Term_putstr(10, 20, -1, TERM_WHITE, format(_("現在値 色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc)); + Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol); + Term_queue_bigchar(43, 20, ca, cc, 0, 0); + Term_putstr(0, 22, -1, TERM_WHITE, + _("コマンド (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ")); + + i = inkey(); + if (i == ESCAPE) + break; + + if (iscntrl(i)) + c = 'a' + i - KTRL('A'); + else if (isupper(i)) + c = 'a' + i - 'A'; + else + c = i; + + switch (c) { + case 'n': { + IDX prev_f = f; + do { + if (!cmd_visuals_aux(i, &f, max_f_idx)) { + f = prev_f; + break; + } + } while (!f_info[f].name || (f_info[f].mimic != f)); + } + + break; + case 'a': + t = (int)f_ptr->x_attr[lighting_level]; + (void)cmd_visuals_aux(i, &t, 256); + f_ptr->x_attr[lighting_level] = (byte)t; + need_redraw = TRUE; + break; + case 'c': + t = (int)f_ptr->x_char[lighting_level]; + (void)cmd_visuals_aux(i, &t, 256); + f_ptr->x_char[lighting_level] = (byte)t; + need_redraw = TRUE; + break; + case 'l': + (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX); + break; + case 'd': + apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char); + need_redraw = TRUE; + break; + case 'v': + do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level); + Term_clear(); + print_visuals_menu(choice_msg); + break; + } + } + + break; + } + case '7': + do_cmd_knowledge_monsters(creature_ptr, &need_redraw, TRUE, -1); + break; + case '8': + do_cmd_knowledge_objects(creature_ptr, &need_redraw, TRUE, -1); + break; + case '9': { + IDX lighting_level = F_LIT_STANDARD; + do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level); + break; + } + case 'R': + case 'r': + reset_visuals(creature_ptr, process_autopick_file_command); + msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset.")); + need_redraw = TRUE; + break; + default: + bell(); + break; + } + + msg_erase(); + } + + screen_load(); + if (need_redraw) + do_cmd_redraw(creature_ptr); } diff --git a/src/cmd/cmd-basic.c b/src/cmd/cmd-basic.c index 442df7f34..2dec71e7f 100644 --- a/src/cmd/cmd-basic.c +++ b/src/cmd/cmd-basic.c @@ -26,6 +26,7 @@ #include "dungeon/dungeon.h" #include "dungeon/quest.h" #include "effect/spells-effect-util.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "floor/geometry.h" @@ -70,7 +71,6 @@ #include "object/item-use-flags.h" #include "object/object-broken.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "object/object-generator.h" #include "object/object-info.h" #include "object/object-kind.h" @@ -2279,7 +2279,7 @@ bool do_cmd_throw(player_type *creature_ptr, int mult, bool boomerang, OBJECT_ID /* Single object */ q_ptr->number = 1; - object_desc(creature_ptr, o_name, q_ptr, OD_OMIT_PREFIX); + describe_flavor(creature_ptr, o_name, q_ptr, OD_OMIT_PREFIX); if (creature_ptr->mighty_throw) mult += 3; @@ -2560,7 +2560,7 @@ bool do_cmd_throw(player_type *creature_ptr, int mult, bool boomerang, OBJECT_ID back_chance += 4 + randint1(5); if (super_boomerang) back_chance += 100; - object_desc(creature_ptr, o2_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, o2_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); if ((back_chance > 30) && (!one_in_(100) || super_boomerang)) { for (i = cur_dis - 1; i > 0; i--) { diff --git a/src/combat/shoot.c b/src/combat/shoot.c index 93cbcba36..b2cf0efef 100644 --- a/src/combat/shoot.c +++ b/src/combat/shoot.c @@ -5,6 +5,7 @@ #include "core/stuff-handler.h" #include "effect/effect-characteristics.h" #include "effect/spells-effect-util.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "game-option/cheat-types.h" @@ -38,7 +39,6 @@ #include "object-hook/hook-enchant.h" #include "object/object-broken.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "object/object-generator.h" #include "object/object-info.h" #include "object/object-kind.h" @@ -66,303 +66,260 @@ */ static MULTIPLY calc_shot_damage_with_slay(player_type *sniper_ptr, object_type *o_ptr, HIT_POINT tdam, monster_type *m_ptr, SPELL_IDX snipe_type) { - MULTIPLY mult = 10; - - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - - BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_flags(sniper_ptr, o_ptr, flgs); - - /* Some "weapons" and "ammo" do extra damage */ - switch (o_ptr->tval) - { - case TV_SHOT: - case TV_ARROW: - case TV_BOLT: - { - if ((have_flag(flgs, TR_SLAY_ANIMAL)) && (r_ptr->flags3 & RF3_ANIMAL)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_ANIMAL; - } - if (mult < 17) mult = 17; - } - - if ((have_flag(flgs, TR_KILL_ANIMAL)) && (r_ptr->flags3 & RF3_ANIMAL)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_ANIMAL; - } - if (mult < 27) mult = 27; - } - - if ((have_flag(flgs, TR_SLAY_EVIL)) && (r_ptr->flags3 & RF3_EVIL)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_EVIL; - } - if (mult < 15) mult = 15; - } - - if ((have_flag(flgs, TR_KILL_EVIL)) && (r_ptr->flags3 & RF3_EVIL)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_EVIL; - } - if (mult < 25) mult = 25; - } - - if ((have_flag(flgs, TR_SLAY_HUMAN)) && (r_ptr->flags2 & RF2_HUMAN)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags2 |= RF2_HUMAN; - } - if (mult < 17) mult = 17; - } - - if ((have_flag(flgs, TR_KILL_HUMAN)) && (r_ptr->flags2 & RF2_HUMAN)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags2 |= RF2_HUMAN; - } - if (mult < 27) mult = 27; - } - - if ((have_flag(flgs, TR_SLAY_UNDEAD)) && (r_ptr->flags3 & RF3_UNDEAD)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_UNDEAD; - } - if (mult < 20) mult = 20; - } - - if ((have_flag(flgs, TR_KILL_UNDEAD)) && (r_ptr->flags3 & RF3_UNDEAD)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_UNDEAD; - } - if (mult < 30) mult = 30; - } - - if ((have_flag(flgs, TR_SLAY_DEMON)) && (r_ptr->flags3 & RF3_DEMON)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_DEMON; - } - if (mult < 20) mult = 20; - } - - if ((have_flag(flgs, TR_KILL_DEMON)) && (r_ptr->flags3 & RF3_DEMON)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_DEMON; - } - if (mult < 30) mult = 30; - } - - if ((have_flag(flgs, TR_SLAY_ORC)) && (r_ptr->flags3 & RF3_ORC)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_ORC; - } - if (mult < 20) mult = 20; - } - - if ((have_flag(flgs, TR_KILL_ORC)) && (r_ptr->flags3 & RF3_ORC)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_ORC; - } - if (mult < 30) mult = 30; - } - - if ((have_flag(flgs, TR_SLAY_TROLL)) && (r_ptr->flags3 & RF3_TROLL)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_TROLL; - } - - if (mult < 20) mult = 20; - } - - if ((have_flag(flgs, TR_KILL_TROLL)) && (r_ptr->flags3 & RF3_TROLL)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_TROLL; - } - if (mult < 30) mult = 30; - } - - if ((have_flag(flgs, TR_SLAY_GIANT)) && (r_ptr->flags3 & RF3_GIANT)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_GIANT; - } - if (mult < 20) mult = 20; - } - - if ((have_flag(flgs, TR_KILL_GIANT)) && (r_ptr->flags3 & RF3_GIANT)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_GIANT; - } - if (mult < 30) mult = 30; - } - - if ((have_flag(flgs, TR_SLAY_DRAGON)) && (r_ptr->flags3 & RF3_DRAGON)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_DRAGON; - } - if (mult < 20) mult = 20; - } - - if ((have_flag(flgs, TR_KILL_DRAGON)) && (r_ptr->flags3 & RF3_DRAGON)) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_DRAGON; - } - if (mult < 30) mult = 30; - if ((o_ptr->name1 == ART_BARD_ARROW) && (m_ptr->r_idx == MON_SMAUG) && - (sniper_ptr->inventory_list[INVEN_BOW].name1 == ART_BARD)) - mult *= 5; - } - - if (have_flag(flgs, TR_BRAND_ACID)) - { - /* Notice immunity */ - if (r_ptr->flagsr & RFR_EFF_IM_ACID_MASK) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ACID_MASK); - } - } - else - { - if (mult < 17) mult = 17; - } - } - - if (have_flag(flgs, TR_BRAND_ELEC)) - { - /* Notice immunity */ - if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK); - } - } - else - { - if (mult < 17) mult = 17; - } - } - - if (have_flag(flgs, TR_BRAND_FIRE)) - { - /* Notice immunity */ - if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK); - } - } - /* Otherwise, take the damage */ - else - { - if (r_ptr->flags3 & RF3_HURT_FIRE) - { - if (mult < 25) mult = 25; - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_HURT_FIRE; - } - } - else if (mult < 17) mult = 17; - } - } - - if (have_flag(flgs, TR_BRAND_COLD)) - { - /* Notice immunity */ - if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK); - } - } - /* Otherwise, take the damage */ - else - { - if (r_ptr->flags3 & RF3_HURT_COLD) - { - if (mult < 25) mult = 25; - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flags3 |= RF3_HURT_COLD; - } - } - else if (mult < 17) mult = 17; - } - } - - if (have_flag(flgs, TR_BRAND_POIS)) - { - /* Notice immunity */ - if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK) - { - if (is_original_ap_and_seen(sniper_ptr, m_ptr)) - { - r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK); - } - } - /* Otherwise, take the damage */ - else - { - if (mult < 17) mult = 17; - } - } - - if ((have_flag(flgs, TR_FORCE_WEAPON)) && (sniper_ptr->csp > (sniper_ptr->msp / 30))) - { - sniper_ptr->csp -= (1 + (sniper_ptr->msp / 30)); - sniper_ptr->redraw |= (PR_MANA); - mult = mult * 5 / 2; - } - break; - } - } - - /* Sniper */ - if (snipe_type) mult = calc_snipe_damage_with_slay(sniper_ptr, mult, m_ptr, snipe_type); - - /* Return the total damage */ - return (tdam * mult / 10); + MULTIPLY mult = 10; + + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + + BIT_FLAGS flgs[TR_FLAG_SIZE]; + object_flags(sniper_ptr, o_ptr, flgs); + + /* Some "weapons" and "ammo" do extra damage */ + switch (o_ptr->tval) { + case TV_SHOT: + case TV_ARROW: + case TV_BOLT: { + if ((have_flag(flgs, TR_SLAY_ANIMAL)) && (r_ptr->flags3 & RF3_ANIMAL)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_ANIMAL; + } + if (mult < 17) + mult = 17; + } + + if ((have_flag(flgs, TR_KILL_ANIMAL)) && (r_ptr->flags3 & RF3_ANIMAL)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_ANIMAL; + } + if (mult < 27) + mult = 27; + } + + if ((have_flag(flgs, TR_SLAY_EVIL)) && (r_ptr->flags3 & RF3_EVIL)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_EVIL; + } + if (mult < 15) + mult = 15; + } + + if ((have_flag(flgs, TR_KILL_EVIL)) && (r_ptr->flags3 & RF3_EVIL)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_EVIL; + } + if (mult < 25) + mult = 25; + } + + if ((have_flag(flgs, TR_SLAY_HUMAN)) && (r_ptr->flags2 & RF2_HUMAN)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags2 |= RF2_HUMAN; + } + if (mult < 17) + mult = 17; + } + + if ((have_flag(flgs, TR_KILL_HUMAN)) && (r_ptr->flags2 & RF2_HUMAN)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags2 |= RF2_HUMAN; + } + if (mult < 27) + mult = 27; + } + + if ((have_flag(flgs, TR_SLAY_UNDEAD)) && (r_ptr->flags3 & RF3_UNDEAD)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_UNDEAD; + } + if (mult < 20) + mult = 20; + } + + if ((have_flag(flgs, TR_KILL_UNDEAD)) && (r_ptr->flags3 & RF3_UNDEAD)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_UNDEAD; + } + if (mult < 30) + mult = 30; + } + + if ((have_flag(flgs, TR_SLAY_DEMON)) && (r_ptr->flags3 & RF3_DEMON)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_DEMON; + } + if (mult < 20) + mult = 20; + } + + if ((have_flag(flgs, TR_KILL_DEMON)) && (r_ptr->flags3 & RF3_DEMON)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_DEMON; + } + if (mult < 30) + mult = 30; + } + + if ((have_flag(flgs, TR_SLAY_ORC)) && (r_ptr->flags3 & RF3_ORC)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_ORC; + } + if (mult < 20) + mult = 20; + } + + if ((have_flag(flgs, TR_KILL_ORC)) && (r_ptr->flags3 & RF3_ORC)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_ORC; + } + if (mult < 30) + mult = 30; + } + + if ((have_flag(flgs, TR_SLAY_TROLL)) && (r_ptr->flags3 & RF3_TROLL)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_TROLL; + } + + if (mult < 20) + mult = 20; + } + + if ((have_flag(flgs, TR_KILL_TROLL)) && (r_ptr->flags3 & RF3_TROLL)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_TROLL; + } + if (mult < 30) + mult = 30; + } + + if ((have_flag(flgs, TR_SLAY_GIANT)) && (r_ptr->flags3 & RF3_GIANT)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_GIANT; + } + if (mult < 20) + mult = 20; + } + + if ((have_flag(flgs, TR_KILL_GIANT)) && (r_ptr->flags3 & RF3_GIANT)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_GIANT; + } + if (mult < 30) + mult = 30; + } + + if ((have_flag(flgs, TR_SLAY_DRAGON)) && (r_ptr->flags3 & RF3_DRAGON)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_DRAGON; + } + if (mult < 20) + mult = 20; + } + + if ((have_flag(flgs, TR_KILL_DRAGON)) && (r_ptr->flags3 & RF3_DRAGON)) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_DRAGON; + } + if (mult < 30) + mult = 30; + if ((o_ptr->name1 == ART_BARD_ARROW) && (m_ptr->r_idx == MON_SMAUG) && (sniper_ptr->inventory_list[INVEN_BOW].name1 == ART_BARD)) + mult *= 5; + } + + if (have_flag(flgs, TR_BRAND_ACID)) { + /* Notice immunity */ + if (r_ptr->flagsr & RFR_EFF_IM_ACID_MASK) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ACID_MASK); + } + } else { + if (mult < 17) + mult = 17; + } + } + + if (have_flag(flgs, TR_BRAND_ELEC)) { + /* Notice immunity */ + if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK); + } + } else { + if (mult < 17) + mult = 17; + } + } + + if (have_flag(flgs, TR_BRAND_FIRE)) { + /* Notice immunity */ + if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK); + } + } + /* Otherwise, take the damage */ + else { + if (r_ptr->flags3 & RF3_HURT_FIRE) { + if (mult < 25) + mult = 25; + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_HURT_FIRE; + } + } else if (mult < 17) + mult = 17; + } + } + + if (have_flag(flgs, TR_BRAND_COLD)) { + /* Notice immunity */ + if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK); + } + } + /* Otherwise, take the damage */ + else { + if (r_ptr->flags3 & RF3_HURT_COLD) { + if (mult < 25) + mult = 25; + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flags3 |= RF3_HURT_COLD; + } + } else if (mult < 17) + mult = 17; + } + } + + if (have_flag(flgs, TR_BRAND_POIS)) { + /* Notice immunity */ + if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK) { + if (is_original_ap_and_seen(sniper_ptr, m_ptr)) { + r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK); + } + } + /* Otherwise, take the damage */ + else { + if (mult < 17) + mult = 17; + } + } + + if ((have_flag(flgs, TR_FORCE_WEAPON)) && (sniper_ptr->csp > (sniper_ptr->msp / 30))) { + sniper_ptr->csp -= (1 + (sniper_ptr->msp / 30)); + sniper_ptr->redraw |= (PR_MANA); + mult = mult * 5 / 2; + } + break; + } + } + + /* Sniper */ + if (snipe_type) + mult = calc_snipe_damage_with_slay(sniper_ptr, mult, m_ptr, snipe_type); + + /* Return the total damage */ + return (tdam * mult / 10); } - /*! * @brief 射撃処理実行 / * Fire an object from the pack or floor. @@ -389,649 +346,614 @@ static MULTIPLY calc_shot_damage_with_slay(player_type *sniper_ptr, object_type */ void exe_fire(player_type *shooter_ptr, INVENTORY_IDX item, object_type *j_ptr, SPELL_IDX snipe_type) { - DIRECTION dir; - int i; - POSITION y, x, ny, nx, ty, tx, prev_y, prev_x; - int tdam_base, tdis, thits, tmul; - int bonus, chance; - int cur_dis, visible; - PERCENTAGE j; + DIRECTION dir; + int i; + POSITION y, x, ny, nx, ty, tx, prev_y, prev_x; + int tdam_base, tdis, thits, tmul; + int bonus, chance; + int cur_dis, visible; + PERCENTAGE j; - object_type forge; - object_type *q_ptr; + object_type forge; + object_type *q_ptr; - object_type *o_ptr; + object_type *o_ptr; - bool hit_body = FALSE; + bool hit_body = FALSE; - GAME_TEXT o_name[MAX_NLEN]; + GAME_TEXT o_name[MAX_NLEN]; - u16b path_g[512]; /* For calcuration of path length */ + u16b path_g[512]; /* For calcuration of path length */ - int msec = delay_factor * delay_factor * delay_factor; + int msec = delay_factor * delay_factor * delay_factor; - /* STICK TO */ - bool stick_to = FALSE; + /* STICK TO */ + bool stick_to = FALSE; - /* Access the item (if in the pack) */ - if (item >= 0) - { - o_ptr = &shooter_ptr->inventory_list[item]; - } - else - { - o_ptr = &shooter_ptr->current_floor_ptr->o_list[0 - item]; - } + /* Access the item (if in the pack) */ + if (item >= 0) { + o_ptr = &shooter_ptr->inventory_list[item]; + } else { + o_ptr = &shooter_ptr->current_floor_ptr->o_list[0 - item]; + } - /* Sniper - Cannot shot a single arrow twice */ - if ((snipe_type == SP_DOUBLE) && (o_ptr->number < 2)) snipe_type = SP_NONE; + /* Sniper - Cannot shot a single arrow twice */ + if ((snipe_type == SP_DOUBLE) && (o_ptr->number < 2)) + snipe_type = SP_NONE; - object_desc(shooter_ptr, o_name, o_ptr, OD_OMIT_PREFIX); + describe_flavor(shooter_ptr, o_name, o_ptr, OD_OMIT_PREFIX); - /* Use the proper number of shots */ - thits = shooter_ptr->num_fire; + /* Use the proper number of shots */ + thits = shooter_ptr->num_fire; - /* Use a base distance */ - tdis = 10; + /* Use a base distance */ + tdis = 10; - /* Base damage from thrown object plus launcher bonus */ - tdam_base = damroll(o_ptr->dd, o_ptr->ds) + o_ptr->to_d + j_ptr->to_d; + /* Base damage from thrown object plus launcher bonus */ + tdam_base = damroll(o_ptr->dd, o_ptr->ds) + o_ptr->to_d + j_ptr->to_d; - /* Actually "fire" the object */ - bonus = (shooter_ptr->to_h_b + o_ptr->to_h + j_ptr->to_h); - if ((j_ptr->sval == SV_LIGHT_XBOW) || (j_ptr->sval == SV_HEAVY_XBOW)) - chance = (shooter_ptr->skill_thb + (shooter_ptr->weapon_exp[0][j_ptr->sval] / 400 + bonus) * BTH_PLUS_ADJ); - else - chance = (shooter_ptr->skill_thb + ((shooter_ptr->weapon_exp[0][j_ptr->sval] - (WEAPON_EXP_MASTER / 2)) / 200 + bonus) * BTH_PLUS_ADJ); + /* Actually "fire" the object */ + bonus = (shooter_ptr->to_h_b + o_ptr->to_h + j_ptr->to_h); + if ((j_ptr->sval == SV_LIGHT_XBOW) || (j_ptr->sval == SV_HEAVY_XBOW)) + chance = (shooter_ptr->skill_thb + (shooter_ptr->weapon_exp[0][j_ptr->sval] / 400 + bonus) * BTH_PLUS_ADJ); + else + chance = (shooter_ptr->skill_thb + ((shooter_ptr->weapon_exp[0][j_ptr->sval] - (WEAPON_EXP_MASTER / 2)) / 200 + bonus) * BTH_PLUS_ADJ); - shooter_ptr->energy_use = bow_energy(j_ptr->sval); - tmul = bow_tmul(j_ptr->sval); + shooter_ptr->energy_use = bow_energy(j_ptr->sval); + tmul = bow_tmul(j_ptr->sval); - /* Get extra "power" from "extra might" */ - if (shooter_ptr->xtra_might) tmul++; + /* Get extra "power" from "extra might" */ + if (shooter_ptr->xtra_might) + tmul++; - tmul = tmul * (100 + (int)(adj_str_td[shooter_ptr->stat_ind[A_STR]]) - 128); + tmul = tmul * (100 + (int)(adj_str_td[shooter_ptr->stat_ind[A_STR]]) - 128); - /* Boost the damage */ - tdam_base *= tmul; - tdam_base /= 100; + /* Boost the damage */ + tdam_base *= tmul; + tdam_base /= 100; - /* Base range */ - tdis = 13 + tmul / 80; - if ((j_ptr->sval == SV_LIGHT_XBOW) || (j_ptr->sval == SV_HEAVY_XBOW)) - { - if (shooter_ptr->concent) - tdis -= (5 - (shooter_ptr->concent + 1) / 2); - else - tdis -= 5; - } + /* Base range */ + tdis = 13 + tmul / 80; + if ((j_ptr->sval == SV_LIGHT_XBOW) || (j_ptr->sval == SV_HEAVY_XBOW)) { + if (shooter_ptr->concent) + tdis -= (5 - (shooter_ptr->concent + 1) / 2); + else + tdis -= 5; + } - project_length = tdis + 1; + project_length = tdis + 1; - /* Get a direction (or cancel) */ - if (!get_aim_dir(shooter_ptr, &dir)) - { - free_turn(shooter_ptr); + /* Get a direction (or cancel) */ + if (!get_aim_dir(shooter_ptr, &dir)) { + free_turn(shooter_ptr); - if (snipe_type == SP_AWAY) snipe_type = SP_NONE; + if (snipe_type == SP_AWAY) + snipe_type = SP_NONE; - /* need not to reset project_length (already did)*/ + /* need not to reset project_length (already did)*/ - return; - } + return; + } - /* Predict the "target" location */ - tx = shooter_ptr->x + 99 * ddx[dir]; - ty = shooter_ptr->y + 99 * ddy[dir]; + /* Predict the "target" location */ + tx = shooter_ptr->x + 99 * ddx[dir]; + ty = shooter_ptr->y + 99 * ddy[dir]; - /* Check for "target request" */ - if ((dir == 5) && target_okay(shooter_ptr)) - { - tx = target_col; - ty = target_row; - } + /* Check for "target request" */ + if ((dir == 5) && target_okay(shooter_ptr)) { + tx = target_col; + ty = target_row; + } - /* Get projection path length */ - tdis = project_path(shooter_ptr, path_g, project_length, shooter_ptr->y, shooter_ptr->x, ty, tx, PROJECT_PATH | PROJECT_THRU) - 1; + /* Get projection path length */ + tdis = project_path(shooter_ptr, path_g, project_length, shooter_ptr->y, shooter_ptr->x, ty, tx, PROJECT_PATH | PROJECT_THRU) - 1; - project_length = 0; /* reset to default */ + project_length = 0; /* reset to default */ - /* Don't shoot at my feet */ - if (tx == shooter_ptr->x && ty == shooter_ptr->y) - { - free_turn(shooter_ptr); + /* Don't shoot at my feet */ + if (tx == shooter_ptr->x && ty == shooter_ptr->y) { + free_turn(shooter_ptr); - /* project_length is already reset to 0 */ + /* project_length is already reset to 0 */ - return; - } + return; + } + /* Take a (partial) turn */ + shooter_ptr->energy_use = (shooter_ptr->energy_use / thits); + shooter_ptr->is_fired = TRUE; - /* Take a (partial) turn */ - shooter_ptr->energy_use = (shooter_ptr->energy_use / thits); - shooter_ptr->is_fired = TRUE; - - /* Sniper - Difficult to shot twice at 1 turn */ - if (snipe_type == SP_DOUBLE) shooter_ptr->concent = (shooter_ptr->concent + 1) / 2; - - /* Sniper - Repeat shooting when double shots */ - for (i = 0; i < ((snipe_type == SP_DOUBLE) ? 2 : 1); i++) - { - - /* Start at the player */ - y = shooter_ptr->y; - x = shooter_ptr->x; - q_ptr = &forge; - object_copy(q_ptr, o_ptr); - - /* Single object */ - q_ptr->number = 1; - - vary_item(shooter_ptr, item, -1); - - sound(SOUND_SHOOT); - handle_stuff(shooter_ptr); - - prev_y = y; - prev_x = x; - - /* The shot does not hit yet */ - hit_body = FALSE; - - /* Travel until stopped */ - for (cur_dis = 0; cur_dis <= tdis; ) - { - grid_type *g_ptr; - - /* Hack -- Stop at the target */ - if ((y == ty) && (x == tx)) break; - - /* Calculate the new location (see "project()") */ - ny = y; - nx = x; - mmove2(&ny, &nx, shooter_ptr->y, shooter_ptr->x, ty, tx); - - /* Shatter Arrow */ - if (snipe_type == SP_KILL_WALL) - { - g_ptr = &shooter_ptr->current_floor_ptr->grid_array[ny][nx]; - - if (cave_have_flag_grid(g_ptr, FF_HURT_ROCK) && !g_ptr->m_idx) - { - if (g_ptr->info & (CAVE_MARK)) msg_print(_("岩が砕け散った。", "Wall rocks were shattered.")); - /* Forget the wall */ - g_ptr->info &= ~(CAVE_MARK); - shooter_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE); - - /* Destroy the wall */ - cave_alter_feat(shooter_ptr, ny, nx, FF_HURT_ROCK); - - hit_body = TRUE; - break; - } - } - - /* Stopped by walls/doors */ - if (!cave_have_flag_bold(shooter_ptr->current_floor_ptr, ny, nx, FF_PROJECT) && !shooter_ptr->current_floor_ptr->grid_array[ny][nx].m_idx) break; - - /* Advance the distance */ - cur_dis++; - - /* Sniper */ - if (snipe_type == SP_LITE) - { - shooter_ptr->current_floor_ptr->grid_array[ny][nx].info |= (CAVE_GLOW); - note_spot(shooter_ptr, ny, nx); - lite_spot(shooter_ptr, ny, nx); - } - - /* The player can see the (on screen) missile */ - if (panel_contains(ny, nx) && player_can_see_bold(shooter_ptr, ny, nx)) - { - SYMBOL_CODE c = object_char(q_ptr); - byte a = object_attr(q_ptr); - - /* Draw, Hilite, Fresh, Pause, Erase */ - print_rel(shooter_ptr, c, a, ny, nx); - move_cursor_relative(ny, nx); - Term_fresh(); - Term_xtra(TERM_XTRA_DELAY, msec); - lite_spot(shooter_ptr, ny, nx); - Term_fresh(); - } - - /* The player cannot see the missile */ - else - { - /* Pause anyway, for consistancy */ - Term_xtra(TERM_XTRA_DELAY, msec); - } - - /* Sniper */ - if (snipe_type == SP_KILL_TRAP) - { - project(shooter_ptr, 0, 0, ny, nx, 0, GF_KILL_TRAP, - (PROJECT_JUMP | PROJECT_HIDE | PROJECT_GRID | PROJECT_ITEM), -1); - } - - /* Sniper */ - if (snipe_type == SP_EVILNESS) - { - shooter_ptr->current_floor_ptr->grid_array[ny][nx].info &= ~(CAVE_GLOW | CAVE_MARK); - note_spot(shooter_ptr, ny, nx); - lite_spot(shooter_ptr, ny, nx); - } - - prev_y = y; - prev_x = x; - - /* Save the new location */ - x = nx; - y = ny; - - /* Monster here, Try to hit it */ - if (shooter_ptr->current_floor_ptr->grid_array[y][x].m_idx) - { - grid_type *c_mon_ptr = &shooter_ptr->current_floor_ptr->grid_array[y][x]; - - monster_type *m_ptr = &shooter_ptr->current_floor_ptr->m_list[c_mon_ptr->m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - - /* Check the visibility */ - visible = m_ptr->ml; - - /* Note the collision */ - hit_body = TRUE; - - if (monster_csleep_remaining(m_ptr)) - { - if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(shooter_ptr, V_COMPASSION, -1); - if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(shooter_ptr, V_HONOUR, -1); - } - - if ((r_ptr->level + 10) > shooter_ptr->lev) - { - int now_exp = shooter_ptr->weapon_exp[0][j_ptr->sval]; - if (now_exp < s_info[shooter_ptr->pclass].w_max[0][j_ptr->sval]) - { - SUB_EXP amount = 0; - if (now_exp < WEAPON_EXP_BEGINNER) amount = 80; - else if (now_exp < WEAPON_EXP_SKILLED) amount = 25; - else if ((now_exp < WEAPON_EXP_EXPERT) && (shooter_ptr->lev > 19)) amount = 10; - else if (shooter_ptr->lev > 34) amount = 2; - shooter_ptr->weapon_exp[0][j_ptr->sval] += amount; - shooter_ptr->update |= (PU_BONUS); - } - } - - if (shooter_ptr->riding) - { - if ((shooter_ptr->skill_exp[GINOU_RIDING] < s_info[shooter_ptr->pclass].s_max[GINOU_RIDING]) - && ((shooter_ptr->skill_exp[GINOU_RIDING] - (RIDING_EXP_BEGINNER * 2)) / 200 < r_info[shooter_ptr->current_floor_ptr->m_list[shooter_ptr->riding].r_idx].level) - && one_in_(2)) - { - shooter_ptr->skill_exp[GINOU_RIDING] += 1; - shooter_ptr->update |= (PU_BONUS); - } - } - - /* Did we hit it (penalize range) */ - if (test_hit_fire(shooter_ptr, chance - cur_dis, m_ptr, m_ptr->ml, o_name)) - { - bool fear = FALSE; - int tdam = tdam_base; - - /* Get extra damage from concentration */ - if (shooter_ptr->concent) tdam = boost_concentration_damage(shooter_ptr, tdam); - - /* Handle unseen monster */ - if (!visible) - { - /* Invisible monster */ - msg_format(_("%sが敵を捕捉した。", "The %s finds a mark."), o_name); - } - - /* Handle visible monster */ - else - { - GAME_TEXT m_name[MAX_NLEN]; - - /* Get "the monster" or "it" */ - monster_desc(shooter_ptr, m_name, m_ptr, 0); - - msg_format(_("%sが%sに命中した。", "The %s hits %s."), o_name, m_name); - - if (m_ptr->ml) - { - if (!shooter_ptr->image) monster_race_track(shooter_ptr, m_ptr->ap_r_idx); - health_track(shooter_ptr, c_mon_ptr->m_idx); - } - } - - if (snipe_type == SP_NEEDLE) - { - if ((randint1(randint1(r_ptr->level / (3 + shooter_ptr->concent)) + (8 - shooter_ptr->concent)) == 1) - && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2)) - { - GAME_TEXT m_name[MAX_NLEN]; - - /* Get "the monster" or "it" */ - monster_desc(shooter_ptr, m_name, m_ptr, 0); - - tdam = m_ptr->hp + 1; - msg_format(_("%sの急所に突き刺さった!", "Your shot hit a fatal spot of %s!"), m_name); - } - else tdam = 1; - } - else - { - /* Apply special damage */ - tdam = calc_shot_damage_with_slay(shooter_ptr, q_ptr, tdam, m_ptr, snipe_type); - tdam = critical_shot(shooter_ptr, q_ptr->weight, q_ptr->to_h, j_ptr->to_h, tdam); - - /* No negative damage */ - if (tdam < 0) tdam = 0; - - /* Modify the damage */ - tdam = mon_damage_mod(shooter_ptr, m_ptr, tdam, FALSE); - } - - msg_format_wizard(shooter_ptr, CHEAT_MONSTER, - _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), - tdam, m_ptr->hp - tdam, m_ptr->maxhp, m_ptr->max_maxhp); - - /* Sniper */ - if (snipe_type == SP_EXPLODE) - { - u16b flg = (PROJECT_STOP | PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID); - - sound(SOUND_EXPLODE); /* No explode sound - use breath fire instead */ - project(shooter_ptr, 0, ((shooter_ptr->concent + 1) / 2 + 1), ny, nx, tdam, GF_MISSILE, flg, -1); - break; - } - - /* Sniper */ - if (snipe_type == SP_HOLYNESS) - { - shooter_ptr->current_floor_ptr->grid_array[ny][nx].info |= (CAVE_GLOW); - note_spot(shooter_ptr, ny, nx); - lite_spot(shooter_ptr, ny, nx); - } - - /* Hit the monster, check for death */ - if (mon_take_hit(shooter_ptr, c_mon_ptr->m_idx, tdam, &fear, extract_note_dies(real_r_idx(m_ptr)))) - { - /* Dead monster */ - } - - /* No death */ - else - { - /* STICK TO */ - if (object_is_fixed_artifact(q_ptr) && - (shooter_ptr->pclass != CLASS_SNIPER || shooter_ptr->concent == 0)) - { - GAME_TEXT m_name[MAX_NLEN]; - - monster_desc(shooter_ptr, m_name, m_ptr, 0); - - stick_to = TRUE; - msg_format(_("%sは%sに突き刺さった!", "%^s is stuck in %s!"), o_name, m_name); - } - - message_pain(shooter_ptr, c_mon_ptr->m_idx, tdam); - - /* Anger the monster */ - if (tdam > 0) anger_monster(shooter_ptr, m_ptr); - - if (fear && m_ptr->ml) - { - GAME_TEXT m_name[MAX_NLEN]; - sound(SOUND_FLEE); - monster_desc(shooter_ptr, m_name, m_ptr, 0); - msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name); - } - - set_target(m_ptr, shooter_ptr->y, shooter_ptr->x); - - /* Sniper */ - if (snipe_type == SP_RUSH) - { - int n = randint1(5) + 3; - MONSTER_IDX m_idx = c_mon_ptr->m_idx; - - for (; cur_dis <= tdis; ) - { - POSITION ox = nx; - POSITION oy = ny; - - if (!n) break; - - /* Calculate the new location (see "project()") */ - mmove2(&ny, &nx, shooter_ptr->y, shooter_ptr->x, ty, tx); - - /* Stopped by wilderness boundary */ - if (!in_bounds2(shooter_ptr->current_floor_ptr, ny, nx)) break; - - /* Stopped by walls/doors */ - if (!player_can_enter(shooter_ptr, shooter_ptr->current_floor_ptr->grid_array[ny][nx].feat, 0)) break; - - /* Stopped by monsters */ - if (!is_cave_empty_bold(shooter_ptr, ny, nx)) break; - - shooter_ptr->current_floor_ptr->grid_array[ny][nx].m_idx = m_idx; - shooter_ptr->current_floor_ptr->grid_array[oy][ox].m_idx = 0; - - m_ptr->fx = nx; - m_ptr->fy = ny; - - update_monster(shooter_ptr, c_mon_ptr->m_idx, TRUE); - - lite_spot(shooter_ptr, ny, nx); - lite_spot(shooter_ptr, oy, ox); - - Term_fresh(); - Term_xtra(TERM_XTRA_DELAY, msec); - - x = nx; - y = ny; - cur_dis++; - n--; - } - } - } - } - - /* Sniper */ - if (snipe_type == SP_PIERCE) - { - if (shooter_ptr->concent < 1) break; - shooter_ptr->concent--; - continue; - } - - /* Stop looking */ - break; - } - } - - /* Chance of breakage (during attacks) */ - j = (hit_body ? breakage_chance(shooter_ptr, q_ptr, shooter_ptr->pclass == CLASS_ARCHER, snipe_type) : 0); - - if (stick_to) - { - MONSTER_IDX m_idx = shooter_ptr->current_floor_ptr->grid_array[y][x].m_idx; - monster_type *m_ptr = &shooter_ptr->current_floor_ptr->m_list[m_idx]; - OBJECT_IDX o_idx = o_pop(shooter_ptr->current_floor_ptr); - - if (!o_idx) - { - msg_format(_("%sはどこかへ行った。", "The %s went somewhere."), o_name); - if (object_is_fixed_artifact(q_ptr)) - { - a_info[j_ptr->name1].cur_num = 0; - } - return; - } - - o_ptr = &shooter_ptr->current_floor_ptr->o_list[o_idx]; - object_copy(o_ptr, q_ptr); - - /* Forget mark */ - o_ptr->marked &= OM_TOUCHED; - - /* Forget location */ - o_ptr->iy = o_ptr->ix = 0; - - /* Memorize monster */ - o_ptr->held_m_idx = m_idx; - - /* Build a stack */ - o_ptr->next_o_idx = m_ptr->hold_o_idx; - - /* Carry object */ - m_ptr->hold_o_idx = o_idx; - } - else if (cave_have_flag_bold(shooter_ptr->current_floor_ptr, y, x, FF_PROJECT)) - { - /* Drop (or break) near that location */ - (void)drop_near(shooter_ptr, q_ptr, j, y, x); - } - else - { - /* Drop (or break) near that location */ - (void)drop_near(shooter_ptr, q_ptr, j, prev_y, prev_x); - } - - /* Sniper - Repeat shooting when double shots */ - } - - /* Sniper - Loose his/her concentration after any shot */ - if (shooter_ptr->concent) reset_concentration(shooter_ptr, FALSE); -} + /* Sniper - Difficult to shot twice at 1 turn */ + if (snipe_type == SP_DOUBLE) + shooter_ptr->concent = (shooter_ptr->concent + 1) / 2; + + /* Sniper - Repeat shooting when double shots */ + for (i = 0; i < ((snipe_type == SP_DOUBLE) ? 2 : 1); i++) { + + /* Start at the player */ + y = shooter_ptr->y; + x = shooter_ptr->x; + q_ptr = &forge; + object_copy(q_ptr, o_ptr); + + /* Single object */ + q_ptr->number = 1; + + vary_item(shooter_ptr, item, -1); + sound(SOUND_SHOOT); + handle_stuff(shooter_ptr); + + prev_y = y; + prev_x = x; + + /* The shot does not hit yet */ + hit_body = FALSE; + + /* Travel until stopped */ + for (cur_dis = 0; cur_dis <= tdis;) { + grid_type *g_ptr; + + /* Hack -- Stop at the target */ + if ((y == ty) && (x == tx)) + break; + + /* Calculate the new location (see "project()") */ + ny = y; + nx = x; + mmove2(&ny, &nx, shooter_ptr->y, shooter_ptr->x, ty, tx); + + /* Shatter Arrow */ + if (snipe_type == SP_KILL_WALL) { + g_ptr = &shooter_ptr->current_floor_ptr->grid_array[ny][nx]; + + if (cave_have_flag_grid(g_ptr, FF_HURT_ROCK) && !g_ptr->m_idx) { + if (g_ptr->info & (CAVE_MARK)) + msg_print(_("岩が砕け散った。", "Wall rocks were shattered.")); + /* Forget the wall */ + g_ptr->info &= ~(CAVE_MARK); + shooter_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE); + + /* Destroy the wall */ + cave_alter_feat(shooter_ptr, ny, nx, FF_HURT_ROCK); + + hit_body = TRUE; + break; + } + } + + /* Stopped by walls/doors */ + if (!cave_have_flag_bold(shooter_ptr->current_floor_ptr, ny, nx, FF_PROJECT) && !shooter_ptr->current_floor_ptr->grid_array[ny][nx].m_idx) + break; + + /* Advance the distance */ + cur_dis++; + + /* Sniper */ + if (snipe_type == SP_LITE) { + shooter_ptr->current_floor_ptr->grid_array[ny][nx].info |= (CAVE_GLOW); + note_spot(shooter_ptr, ny, nx); + lite_spot(shooter_ptr, ny, nx); + } + + /* The player can see the (on screen) missile */ + if (panel_contains(ny, nx) && player_can_see_bold(shooter_ptr, ny, nx)) { + SYMBOL_CODE c = object_char(q_ptr); + byte a = object_attr(q_ptr); + + /* Draw, Hilite, Fresh, Pause, Erase */ + print_rel(shooter_ptr, c, a, ny, nx); + move_cursor_relative(ny, nx); + Term_fresh(); + Term_xtra(TERM_XTRA_DELAY, msec); + lite_spot(shooter_ptr, ny, nx); + Term_fresh(); + } + + /* The player cannot see the missile */ + else { + /* Pause anyway, for consistancy */ + Term_xtra(TERM_XTRA_DELAY, msec); + } + + /* Sniper */ + if (snipe_type == SP_KILL_TRAP) { + project(shooter_ptr, 0, 0, ny, nx, 0, GF_KILL_TRAP, (PROJECT_JUMP | PROJECT_HIDE | PROJECT_GRID | PROJECT_ITEM), -1); + } + + /* Sniper */ + if (snipe_type == SP_EVILNESS) { + shooter_ptr->current_floor_ptr->grid_array[ny][nx].info &= ~(CAVE_GLOW | CAVE_MARK); + note_spot(shooter_ptr, ny, nx); + lite_spot(shooter_ptr, ny, nx); + } + + prev_y = y; + prev_x = x; + + /* Save the new location */ + x = nx; + y = ny; + + /* Monster here, Try to hit it */ + if (shooter_ptr->current_floor_ptr->grid_array[y][x].m_idx) { + grid_type *c_mon_ptr = &shooter_ptr->current_floor_ptr->grid_array[y][x]; + + monster_type *m_ptr = &shooter_ptr->current_floor_ptr->m_list[c_mon_ptr->m_idx]; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + + /* Check the visibility */ + visible = m_ptr->ml; + + /* Note the collision */ + hit_body = TRUE; + + if (monster_csleep_remaining(m_ptr)) { + if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) + chg_virtue(shooter_ptr, V_COMPASSION, -1); + if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) + chg_virtue(shooter_ptr, V_HONOUR, -1); + } + + if ((r_ptr->level + 10) > shooter_ptr->lev) { + int now_exp = shooter_ptr->weapon_exp[0][j_ptr->sval]; + if (now_exp < s_info[shooter_ptr->pclass].w_max[0][j_ptr->sval]) { + SUB_EXP amount = 0; + if (now_exp < WEAPON_EXP_BEGINNER) + amount = 80; + else if (now_exp < WEAPON_EXP_SKILLED) + amount = 25; + else if ((now_exp < WEAPON_EXP_EXPERT) && (shooter_ptr->lev > 19)) + amount = 10; + else if (shooter_ptr->lev > 34) + amount = 2; + shooter_ptr->weapon_exp[0][j_ptr->sval] += amount; + shooter_ptr->update |= (PU_BONUS); + } + } + + if (shooter_ptr->riding) { + if ((shooter_ptr->skill_exp[GINOU_RIDING] < s_info[shooter_ptr->pclass].s_max[GINOU_RIDING]) + && ((shooter_ptr->skill_exp[GINOU_RIDING] - (RIDING_EXP_BEGINNER * 2)) / 200 + < r_info[shooter_ptr->current_floor_ptr->m_list[shooter_ptr->riding].r_idx].level) + && one_in_(2)) { + shooter_ptr->skill_exp[GINOU_RIDING] += 1; + shooter_ptr->update |= (PU_BONUS); + } + } + + /* Did we hit it (penalize range) */ + if (test_hit_fire(shooter_ptr, chance - cur_dis, m_ptr, m_ptr->ml, o_name)) { + bool fear = FALSE; + int tdam = tdam_base; + + /* Get extra damage from concentration */ + if (shooter_ptr->concent) + tdam = boost_concentration_damage(shooter_ptr, tdam); + + /* Handle unseen monster */ + if (!visible) { + /* Invisible monster */ + msg_format(_("%sが敵を捕捉した。", "The %s finds a mark."), o_name); + } + + /* Handle visible monster */ + else { + GAME_TEXT m_name[MAX_NLEN]; + + /* Get "the monster" or "it" */ + monster_desc(shooter_ptr, m_name, m_ptr, 0); + + msg_format(_("%sが%sに命中した。", "The %s hits %s."), o_name, m_name); + + if (m_ptr->ml) { + if (!shooter_ptr->image) + monster_race_track(shooter_ptr, m_ptr->ap_r_idx); + health_track(shooter_ptr, c_mon_ptr->m_idx); + } + } + + if (snipe_type == SP_NEEDLE) { + if ((randint1(randint1(r_ptr->level / (3 + shooter_ptr->concent)) + (8 - shooter_ptr->concent)) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) + && !(r_ptr->flags7 & RF7_UNIQUE2)) { + GAME_TEXT m_name[MAX_NLEN]; + + /* Get "the monster" or "it" */ + monster_desc(shooter_ptr, m_name, m_ptr, 0); + + tdam = m_ptr->hp + 1; + msg_format(_("%sの急所に突き刺さった!", "Your shot hit a fatal spot of %s!"), m_name); + } else + tdam = 1; + } else { + /* Apply special damage */ + tdam = calc_shot_damage_with_slay(shooter_ptr, q_ptr, tdam, m_ptr, snipe_type); + tdam = critical_shot(shooter_ptr, q_ptr->weight, q_ptr->to_h, j_ptr->to_h, tdam); + + /* No negative damage */ + if (tdam < 0) + tdam = 0; + + /* Modify the damage */ + tdam = mon_damage_mod(shooter_ptr, m_ptr, tdam, FALSE); + } + + msg_format_wizard(shooter_ptr, CHEAT_MONSTER, _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), tdam, + m_ptr->hp - tdam, m_ptr->maxhp, m_ptr->max_maxhp); + + /* Sniper */ + if (snipe_type == SP_EXPLODE) { + u16b flg = (PROJECT_STOP | PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID); + + sound(SOUND_EXPLODE); /* No explode sound - use breath fire instead */ + project(shooter_ptr, 0, ((shooter_ptr->concent + 1) / 2 + 1), ny, nx, tdam, GF_MISSILE, flg, -1); + break; + } + + /* Sniper */ + if (snipe_type == SP_HOLYNESS) { + shooter_ptr->current_floor_ptr->grid_array[ny][nx].info |= (CAVE_GLOW); + note_spot(shooter_ptr, ny, nx); + lite_spot(shooter_ptr, ny, nx); + } + + /* Hit the monster, check for death */ + if (mon_take_hit(shooter_ptr, c_mon_ptr->m_idx, tdam, &fear, extract_note_dies(real_r_idx(m_ptr)))) { + /* Dead monster */ + } + + /* No death */ + else { + /* STICK TO */ + if (object_is_fixed_artifact(q_ptr) && (shooter_ptr->pclass != CLASS_SNIPER || shooter_ptr->concent == 0)) { + GAME_TEXT m_name[MAX_NLEN]; + + monster_desc(shooter_ptr, m_name, m_ptr, 0); + + stick_to = TRUE; + msg_format(_("%sは%sに突き刺さった!", "%^s is stuck in %s!"), o_name, m_name); + } + + message_pain(shooter_ptr, c_mon_ptr->m_idx, tdam); + + /* Anger the monster */ + if (tdam > 0) + anger_monster(shooter_ptr, m_ptr); + + if (fear && m_ptr->ml) { + GAME_TEXT m_name[MAX_NLEN]; + sound(SOUND_FLEE); + monster_desc(shooter_ptr, m_name, m_ptr, 0); + msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name); + } + + set_target(m_ptr, shooter_ptr->y, shooter_ptr->x); + + /* Sniper */ + if (snipe_type == SP_RUSH) { + int n = randint1(5) + 3; + MONSTER_IDX m_idx = c_mon_ptr->m_idx; + + for (; cur_dis <= tdis;) { + POSITION ox = nx; + POSITION oy = ny; + + if (!n) + break; + + /* Calculate the new location (see "project()") */ + mmove2(&ny, &nx, shooter_ptr->y, shooter_ptr->x, ty, tx); + + /* Stopped by wilderness boundary */ + if (!in_bounds2(shooter_ptr->current_floor_ptr, ny, nx)) + break; + + /* Stopped by walls/doors */ + if (!player_can_enter(shooter_ptr, shooter_ptr->current_floor_ptr->grid_array[ny][nx].feat, 0)) + break; + + /* Stopped by monsters */ + if (!is_cave_empty_bold(shooter_ptr, ny, nx)) + break; + + shooter_ptr->current_floor_ptr->grid_array[ny][nx].m_idx = m_idx; + shooter_ptr->current_floor_ptr->grid_array[oy][ox].m_idx = 0; + + m_ptr->fx = nx; + m_ptr->fy = ny; + + update_monster(shooter_ptr, c_mon_ptr->m_idx, TRUE); + + lite_spot(shooter_ptr, ny, nx); + lite_spot(shooter_ptr, oy, ox); + + Term_fresh(); + Term_xtra(TERM_XTRA_DELAY, msec); + + x = nx; + y = ny; + cur_dis++; + n--; + } + } + } + } + + /* Sniper */ + if (snipe_type == SP_PIERCE) { + if (shooter_ptr->concent < 1) + break; + shooter_ptr->concent--; + continue; + } + + /* Stop looking */ + break; + } + } + + /* Chance of breakage (during attacks) */ + j = (hit_body ? breakage_chance(shooter_ptr, q_ptr, shooter_ptr->pclass == CLASS_ARCHER, snipe_type) : 0); + + if (stick_to) { + MONSTER_IDX m_idx = shooter_ptr->current_floor_ptr->grid_array[y][x].m_idx; + monster_type *m_ptr = &shooter_ptr->current_floor_ptr->m_list[m_idx]; + OBJECT_IDX o_idx = o_pop(shooter_ptr->current_floor_ptr); + + if (!o_idx) { + msg_format(_("%sはどこかへ行った。", "The %s went somewhere."), o_name); + if (object_is_fixed_artifact(q_ptr)) { + a_info[j_ptr->name1].cur_num = 0; + } + return; + } + + o_ptr = &shooter_ptr->current_floor_ptr->o_list[o_idx]; + object_copy(o_ptr, q_ptr); + + /* Forget mark */ + o_ptr->marked &= OM_TOUCHED; + + /* Forget location */ + o_ptr->iy = o_ptr->ix = 0; + + /* Memorize monster */ + o_ptr->held_m_idx = m_idx; + + /* Build a stack */ + o_ptr->next_o_idx = m_ptr->hold_o_idx; + + /* Carry object */ + m_ptr->hold_o_idx = o_idx; + } else if (cave_have_flag_bold(shooter_ptr->current_floor_ptr, y, x, FF_PROJECT)) { + /* Drop (or break) near that location */ + (void)drop_near(shooter_ptr, q_ptr, j, y, x); + } else { + /* Drop (or break) near that location */ + (void)drop_near(shooter_ptr, q_ptr, j, prev_y, prev_x); + } + + /* Sniper - Repeat shooting when double shots */ + } + + /* Sniper - Loose his/her concentration after any shot */ + if (shooter_ptr->concent) + reset_concentration(shooter_ptr, FALSE); +} /*! -* @brief プレイヤーからモンスターへの射撃命中判定 / -* Determine if the player "hits" a monster (normal combat). -* @param chance 基本命中値 -* @param m_ptr モンスターの構造体参照ポインタ -* @param vis 目標を視界に捕らえているならばTRUEを指定 -* @param o_name メッセージ表示時のモンスター名 -* @return 命中と判定された場合TRUEを返す -* @note Always miss 5%, always hit 5%, otherwise random. -*/ -bool test_hit_fire(player_type *shooter_ptr, int chance, monster_type *m_ptr, int vis, char* o_name) + * @brief プレイヤーからモンスターへの射撃命中判定 / + * Determine if the player "hits" a monster (normal combat). + * @param chance 基本命中値 + * @param m_ptr モンスターの構造体参照ポインタ + * @param vis 目標を視界に捕らえているならばTRUEを指定 + * @param o_name メッセージ表示時のモンスター名 + * @return 命中と判定された場合TRUEを返す + * @note Always miss 5%, always hit 5%, otherwise random. + */ +bool test_hit_fire(player_type *shooter_ptr, int chance, monster_type *m_ptr, int vis, char *o_name) { - int k; - ARMOUR_CLASS ac; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - - /* Percentile dice */ - k = randint1(100); - - /* Snipers with high-concentration reduce instant miss percentage.*/ - k += shooter_ptr->concent; - - /* Hack -- Instant miss or hit */ - if (k <= 5) return FALSE; - if (k > 95) return TRUE; - - if (shooter_ptr->pseikaku == PERSONALITY_LAZY) - if (one_in_(20)) return FALSE; - - /* Never hit */ - if (chance <= 0) return FALSE; - - ac = r_ptr->ac; - if (shooter_ptr->concent) - { - ac *= (8 - shooter_ptr->concent); - ac /= 8; - } - - if (m_ptr->r_idx == MON_GOEMON && !monster_csleep_remaining(m_ptr)) ac *= 3; - - /* Invisible monsters are harder to hit */ - if (!vis) chance = (chance + 1) / 2; - - /* Power competes against armor */ - if (randint0(chance) < (ac * 3 / 4)) - { - if (m_ptr->r_idx == MON_GOEMON && !monster_csleep_remaining(m_ptr)) - { - GAME_TEXT m_name[MAX_NLEN]; - monster_desc(shooter_ptr, m_name, m_ptr, 0); - msg_format(_("%sは%sを斬り捨てた!", "%s cuts down %s!"), m_name, o_name); - } - return FALSE; - } - - /* Assume hit */ - return TRUE; + int k; + ARMOUR_CLASS ac; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + + /* Percentile dice */ + k = randint1(100); + + /* Snipers with high-concentration reduce instant miss percentage.*/ + k += shooter_ptr->concent; + + /* Hack -- Instant miss or hit */ + if (k <= 5) + return FALSE; + if (k > 95) + return TRUE; + + if (shooter_ptr->pseikaku == PERSONALITY_LAZY) + if (one_in_(20)) + return FALSE; + + /* Never hit */ + if (chance <= 0) + return FALSE; + + ac = r_ptr->ac; + if (shooter_ptr->concent) { + ac *= (8 - shooter_ptr->concent); + ac /= 8; + } + + if (m_ptr->r_idx == MON_GOEMON && !monster_csleep_remaining(m_ptr)) + ac *= 3; + + /* Invisible monsters are harder to hit */ + if (!vis) + chance = (chance + 1) / 2; + + /* Power competes against armor */ + if (randint0(chance) < (ac * 3 / 4)) { + if (m_ptr->r_idx == MON_GOEMON && !monster_csleep_remaining(m_ptr)) { + GAME_TEXT m_name[MAX_NLEN]; + monster_desc(shooter_ptr, m_name, m_ptr, 0); + msg_format(_("%sは%sを斬り捨てた!", "%s cuts down %s!"), m_name, o_name); + } + return FALSE; + } + + /* Assume hit */ + return TRUE; } - - - /*! -* @brief プレイヤーからモンスターへの射撃クリティカル判定 / -* Critical hits (from objects thrown by player) Factor in item weight, total plusses, and player level. -* @param weight 矢弾の重量 -* @param plus_ammo 矢弾の命中修正 -* @param plus_bow 弓の命中修正 -* @param dam 現在算出中のダメージ値 -* @return クリティカル修正が入ったダメージ値 -*/ + * @brief プレイヤーからモンスターへの射撃クリティカル判定 / + * Critical hits (from objects thrown by player) Factor in item weight, total plusses, and player level. + * @param weight 矢弾の重量 + * @param plus_ammo 矢弾の命中修正 + * @param plus_bow 弓の命中修正 + * @param dam 現在算出中のダメージ値 + * @return クリティカル修正が入ったダメージ値 + */ HIT_POINT critical_shot(player_type *shooter_ptr, WEIGHT weight, int plus_ammo, int plus_bow, HIT_POINT dam) { - int i, k; - object_type *j_ptr = &shooter_ptr->inventory_list[INVEN_BOW]; - - /* Extract "shot" power */ - i = shooter_ptr->to_h_b + plus_ammo; - - if (shooter_ptr->tval_ammo == TV_BOLT) - i = (shooter_ptr->skill_thb + (shooter_ptr->weapon_exp[0][j_ptr->sval] / 400 + i) * BTH_PLUS_ADJ); - else - i = (shooter_ptr->skill_thb + ((shooter_ptr->weapon_exp[0][j_ptr->sval] - (WEAPON_EXP_MASTER / 2)) / 200 + i) * BTH_PLUS_ADJ); - - - /* Snipers can shot more critically with crossbows */ - if (shooter_ptr->concent) i += ((i * shooter_ptr->concent) / 5); - if ((shooter_ptr->pclass == CLASS_SNIPER) && (shooter_ptr->tval_ammo == TV_BOLT)) i *= 2; - - /* Good bow makes more critical */ - i += plus_bow * 8 * (shooter_ptr->concent ? shooter_ptr->concent + 5 : 5); - - /* Critical hit */ - if (randint1(10000) <= i) - { - k = weight * randint1(500); - - if (k < 900) - { - msg_print(_("手ごたえがあった!", "It was a good hit!")); - dam += (dam / 2); - } - else if (k < 1350) - { - msg_print(_("かなりの手ごたえがあった!", "It was a great hit!")); - dam *= 2; - } - else - { - msg_print(_("会心の一撃だ!", "It was a superb hit!")); - dam *= 3; - } - } - - return (dam); + int i, k; + object_type *j_ptr = &shooter_ptr->inventory_list[INVEN_BOW]; + + /* Extract "shot" power */ + i = shooter_ptr->to_h_b + plus_ammo; + + if (shooter_ptr->tval_ammo == TV_BOLT) + i = (shooter_ptr->skill_thb + (shooter_ptr->weapon_exp[0][j_ptr->sval] / 400 + i) * BTH_PLUS_ADJ); + else + i = (shooter_ptr->skill_thb + ((shooter_ptr->weapon_exp[0][j_ptr->sval] - (WEAPON_EXP_MASTER / 2)) / 200 + i) * BTH_PLUS_ADJ); + + /* Snipers can shot more critically with crossbows */ + if (shooter_ptr->concent) + i += ((i * shooter_ptr->concent) / 5); + if ((shooter_ptr->pclass == CLASS_SNIPER) && (shooter_ptr->tval_ammo == TV_BOLT)) + i *= 2; + + /* Good bow makes more critical */ + i += plus_bow * 8 * (shooter_ptr->concent ? shooter_ptr->concent + 5 : 5); + + /* Critical hit */ + if (randint1(10000) <= i) { + k = weight * randint1(500); + + if (k < 900) { + msg_print(_("手ごたえがあった!", "It was a good hit!")); + dam += (dam / 2); + } else if (k < 1350) { + msg_print(_("かなりの手ごたえがあった!", "It was a great hit!")); + dam *= 2; + } else { + msg_print(_("会心の一撃だ!", "It was a superb hit!")); + dam *= 3; + } + } + + return (dam); } - - - /*! * @brief 射撃武器の攻撃に必要な基本消費エネルギーを返す/Return bow energy * @param sval 射撃武器のアイテム副分類ID @@ -1039,115 +961,99 @@ HIT_POINT critical_shot(player_type *shooter_ptr, WEIGHT weight, int plus_ammo, */ ENERGY bow_energy(OBJECT_SUBTYPE_VALUE sval) { - ENERGY energy = 10000; - - /* Analyze the launcher */ - switch (sval) - { - /* Sling and ammo */ - case SV_SLING: - { - energy = 8000; - break; - } - - /* Short Bow and Arrow */ - case SV_SHORT_BOW: - { - energy = 10000; - break; - } - - /* Long Bow and Arrow */ - case SV_LONG_BOW: - { - energy = 10000; - break; - } - - /* Bow of irresponsiblity and Arrow */ - case SV_NAMAKE_BOW: - { - energy = 7777; - break; - } - - /* Light Crossbow and Bolt */ - case SV_LIGHT_XBOW: - { - energy = 12000; - break; - } - - /* Heavy Crossbow and Bolt */ - case SV_HEAVY_XBOW: - { - energy = 13333; - break; - } - } - - return (energy); + ENERGY energy = 10000; + + /* Analyze the launcher */ + switch (sval) { + /* Sling and ammo */ + case SV_SLING: { + energy = 8000; + break; + } + + /* Short Bow and Arrow */ + case SV_SHORT_BOW: { + energy = 10000; + break; + } + + /* Long Bow and Arrow */ + case SV_LONG_BOW: { + energy = 10000; + break; + } + + /* Bow of irresponsiblity and Arrow */ + case SV_NAMAKE_BOW: { + energy = 7777; + break; + } + + /* Light Crossbow and Bolt */ + case SV_LIGHT_XBOW: { + energy = 12000; + break; + } + + /* Heavy Crossbow and Bolt */ + case SV_HEAVY_XBOW: { + energy = 13333; + break; + } + } + + return (energy); } - /* * Return bow tmul */ int bow_tmul(OBJECT_SUBTYPE_VALUE sval) { - int tmul = 0; - - /* Analyze the launcher */ - switch (sval) - { - /* Sling and ammo */ - case SV_SLING: - { - tmul = 2; - break; - } - - /* Short Bow and Arrow */ - case SV_SHORT_BOW: - { - tmul = 2; - break; - } - - /* Long Bow and Arrow */ - case SV_LONG_BOW: - { - tmul = 3; - break; - } - - /* Bow of irresponsiblity and Arrow */ - case SV_NAMAKE_BOW: - { - tmul = 3; - break; - } - - /* Light Crossbow and Bolt */ - case SV_LIGHT_XBOW: - { - tmul = 3; - break; - } - - /* Heavy Crossbow and Bolt */ - case SV_HEAVY_XBOW: - { - tmul = 4; - break; - } - } - - return (tmul); + int tmul = 0; + + /* Analyze the launcher */ + switch (sval) { + /* Sling and ammo */ + case SV_SLING: { + tmul = 2; + break; + } + + /* Short Bow and Arrow */ + case SV_SHORT_BOW: { + tmul = 2; + break; + } + + /* Long Bow and Arrow */ + case SV_LONG_BOW: { + tmul = 3; + break; + } + + /* Bow of irresponsiblity and Arrow */ + case SV_NAMAKE_BOW: { + tmul = 3; + break; + } + + /* Light Crossbow and Bolt */ + case SV_LIGHT_XBOW: { + tmul = 3; + break; + } + + /* Heavy Crossbow and Bolt */ + case SV_HEAVY_XBOW: { + tmul = 4; + break; + } + } + + return (tmul); } - /*! * @brief 射撃時クリティカルによるダメージ期待値修正計算(スナイパーの集中処理と武器経験値) / critical happens at i / 10000 * @param shooter_ptr 射撃を行うクリーチャー参照ポインタ @@ -1156,29 +1062,32 @@ int bow_tmul(OBJECT_SUBTYPE_VALUE sval) * @return ダメージ期待値 * @note 基本ダメージ量と重量はこの部位では計算に加わらない。 */ -HIT_POINT calc_crit_ratio_shot(player_type* shooter_ptr, HIT_POINT plus_ammo, HIT_POINT plus_bow) +HIT_POINT calc_crit_ratio_shot(player_type *shooter_ptr, HIT_POINT plus_ammo, HIT_POINT plus_bow) { - HIT_POINT i; - object_type *j_ptr = &shooter_ptr->inventory_list[INVEN_BOW]; + HIT_POINT i; + object_type *j_ptr = &shooter_ptr->inventory_list[INVEN_BOW]; - /* Extract "shot" power */ - i = shooter_ptr->to_h_b + plus_ammo; + /* Extract "shot" power */ + i = shooter_ptr->to_h_b + plus_ammo; - if (shooter_ptr->tval_ammo == TV_BOLT) - i = (shooter_ptr->skill_thb + (shooter_ptr->weapon_exp[0][j_ptr->sval] / 400 + i) * BTH_PLUS_ADJ); - else - i = (shooter_ptr->skill_thb + ((shooter_ptr->weapon_exp[0][j_ptr->sval] - (WEAPON_EXP_MASTER / 2)) / 200 + i) * BTH_PLUS_ADJ); + if (shooter_ptr->tval_ammo == TV_BOLT) + i = (shooter_ptr->skill_thb + (shooter_ptr->weapon_exp[0][j_ptr->sval] / 400 + i) * BTH_PLUS_ADJ); + else + i = (shooter_ptr->skill_thb + ((shooter_ptr->weapon_exp[0][j_ptr->sval] - (WEAPON_EXP_MASTER / 2)) / 200 + i) * BTH_PLUS_ADJ); - /* Snipers can shot more critically with crossbows */ - if (shooter_ptr->concent) i += ((i * shooter_ptr->concent) / 5); - if ((shooter_ptr->pclass == CLASS_SNIPER) && (shooter_ptr->tval_ammo == TV_BOLT)) i *= 2; + /* Snipers can shot more critically with crossbows */ + if (shooter_ptr->concent) + i += ((i * shooter_ptr->concent) / 5); + if ((shooter_ptr->pclass == CLASS_SNIPER) && (shooter_ptr->tval_ammo == TV_BOLT)) + i *= 2; - /* Good bow makes more critical */ - i += plus_bow * 8 * (shooter_ptr->concent ? shooter_ptr->concent + 5 : 5); + /* Good bow makes more critical */ + i += plus_bow * 8 * (shooter_ptr->concent ? shooter_ptr->concent + 5 : 5); - if (i < 0) i = 0; + if (i < 0) + i = 0; - return i; + return i; } /*! @@ -1191,35 +1100,34 @@ HIT_POINT calc_crit_ratio_shot(player_type* shooter_ptr, HIT_POINT plus_ammo, HI */ HIT_POINT calc_expect_crit_shot(player_type *shooter_ptr, WEIGHT weight, int plus_ammo, int plus_bow, HIT_POINT dam) { - u32b num; - int i, k, crit; - i = calc_crit_ratio_shot(shooter_ptr, plus_ammo, plus_bow); + u32b num; + int i, k, crit; + i = calc_crit_ratio_shot(shooter_ptr, plus_ammo, plus_bow); - k = 0; - num = 0; + k = 0; + num = 0; - crit = MIN(500, 900 / weight); - num += dam * 3 / 2 * crit; - k = crit; + crit = MIN(500, 900 / weight); + num += dam * 3 / 2 * crit; + k = crit; - crit = MIN(500, 1350 / weight); - crit -= k; - num += dam * 2 * crit; - k += crit; + crit = MIN(500, 1350 / weight); + crit -= k; + num += dam * 2 * crit; + k += crit; - if (k < 500) - { - crit = 500 - k; - num += dam * 3 * crit; - } + if (k < 500) { + crit = 500 - k; + num += dam * 3 * crit; + } - num /= 500; + num /= 500; - num *= i; - num += (10000 - i) * dam; - num /= 10000; + num *= i; + num += (10000 - i) * dam; + num /= 10000; - return num; + return num; } /*! @@ -1234,35 +1142,38 @@ HIT_POINT calc_expect_crit_shot(player_type *shooter_ptr, WEIGHT weight, int plu */ HIT_POINT calc_expect_crit(player_type *shooter_ptr, WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, bool dokubari) { - u32b k, num; - if (dokubari) return dam; - - int i = (weight + (meichuu * 3 + plus * 5) + shooter_ptr->skill_thn); - if (i < 0) i = 0; - - k = weight; - num = 0; - - if (k < 400) num += (2 * dam + 5) * (400 - k); - if (k < 700) num += (2 * dam + 10) * (MIN(700, k + 650) - MAX(400, k)); - if (k > (700 - 650) && k < 900) num += (3 * dam + 15) * (MIN(900, k + 650) - MAX(700, k)); - if (k > (900 - 650) && k < 1300) num += (3 * dam + 20) * (MIN(1300, k + 650) - MAX(900, k)); - if (k > (1300 - 650)) num += (7 * dam / 2 + 25) * MIN(650, k - (1300 - 650)); - - num /= 650; - if (shooter_ptr->pclass == CLASS_NINJA) - { - num *= i; - num += (4444 - i) * dam; - num /= 4444; - } - else - { - num *= i; - num += (5000 - i) * dam; - num /= 5000; - } - - return num; + u32b k, num; + if (dokubari) + return dam; + + int i = (weight + (meichuu * 3 + plus * 5) + shooter_ptr->skill_thn); + if (i < 0) + i = 0; + + k = weight; + num = 0; + + if (k < 400) + num += (2 * dam + 5) * (400 - k); + if (k < 700) + num += (2 * dam + 10) * (MIN(700, k + 650) - MAX(400, k)); + if (k > (700 - 650) && k < 900) + num += (3 * dam + 15) * (MIN(900, k + 650) - MAX(700, k)); + if (k > (900 - 650) && k < 1300) + num += (3 * dam + 20) * (MIN(1300, k + 650) - MAX(900, k)); + if (k > (1300 - 650)) + num += (7 * dam / 2 + 25) * MIN(650, k - (1300 - 650)); + + num /= 650; + if (shooter_ptr->pclass == CLASS_NINJA) { + num *= i; + num += (4444 - i) * dam; + num /= 4444; + } else { + num *= i; + num += (5000 - i) * dam; + num /= 5000; + } + + return num; } - diff --git a/src/core/hp-mp-processor.c b/src/core/hp-mp-processor.c index 3ad37b2b1..965906f3d 100644 --- a/src/core/hp-mp-processor.c +++ b/src/core/hp-mp-processor.c @@ -3,6 +3,7 @@ #include "core/hp-mp-regenerator.h" #include "core/player-redraw-types.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor.h" #include "floor/pattern-walk.h" @@ -14,7 +15,6 @@ #include "monster-race/race-flags3.h" #include "object-enchant/object-ego.h" #include "object-enchant/trc-types.h" -#include "object/object-flavor.h" #include "player/attack-defense-types.h" #include "player/avatar.h" #include "player/player-damage.h" @@ -77,11 +77,11 @@ void process_player_hp_mp(player_type *creature_ptr) object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE]; GAME_TEXT o_name[MAX_NLEN]; char ouch[MAX_NLEN + 40]; - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); msg_format(_("%sがあなたのアンデッドの肉体を焼き焦がした!", "The %s scorches your undead flesh!"), o_name); cave_no_regen = TRUE; - object_desc(creature_ptr, o_name, o_ptr, OD_NAME_ONLY); + describe_flavor(creature_ptr, o_name, o_ptr, OD_NAME_ONLY); sprintf(ouch, _("%sを装備したダメージ", "wielding %s"), o_name); if (!is_invuln(creature_ptr)) diff --git a/src/effect/effect-item.c b/src/effect/effect-item.c index ef7b67c93..7e76b32d5 100644 --- a/src/effect/effect-item.c +++ b/src/effect/effect-item.c @@ -1,5 +1,6 @@ #include "effect/effect-item.h" #include "autopick/autopick.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "floor/floor.h" @@ -12,7 +13,6 @@ #include "object-hook/hook-expendable.h" #include "object/object-broken.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "object/object-mark-types.h" #include "perception/object-perception.h" #include "spell-kind/spells-perception.h" @@ -35,244 +35,221 @@ */ bool affect_item(player_type *caster_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ) { - grid_type *g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x]; - - bool is_item_affected = FALSE; - bool known = player_has_los_bold(caster_ptr, y, x); - who = who ? who : 0; - dam = (dam + r) / (r + 1); - OBJECT_IDX next_o_idx = 0; - for (OBJECT_IDX this_o_idx = g_ptr->o_idx; this_o_idx != 0; this_o_idx = next_o_idx) - { - object_type *o_ptr = &caster_ptr->current_floor_ptr->o_list[this_o_idx]; - bool ignore = FALSE; - bool do_kill = FALSE; - concptr note_kill = NULL; + grid_type *g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x]; + + bool is_item_affected = FALSE; + bool known = player_has_los_bold(caster_ptr, y, x); + who = who ? who : 0; + dam = (dam + r) / (r + 1); + OBJECT_IDX next_o_idx = 0; + for (OBJECT_IDX this_o_idx = g_ptr->o_idx; this_o_idx != 0; this_o_idx = next_o_idx) { + object_type *o_ptr = &caster_ptr->current_floor_ptr->o_list[this_o_idx]; + bool ignore = FALSE; + bool do_kill = FALSE; + concptr note_kill = NULL; #ifdef JP #else - bool plural = (o_ptr->number > 1); + bool plural = (o_ptr->number > 1); #endif - next_o_idx = o_ptr->next_o_idx; - BIT_FLAGS flags[TR_FLAG_SIZE]; - object_flags(caster_ptr, o_ptr, flags); - bool is_artifact = object_is_artifact(o_ptr); - switch (typ) - { - case GF_ACID: - { - if (hates_acid(o_ptr)) - { - do_kill = TRUE; - note_kill = _("融けてしまった!", (plural ? " melt!" : " melts!")); - if (have_flag(flags, TR_IGNORE_ACID)) ignore = TRUE; - } - - break; - } - case GF_ELEC: - { - if (hates_elec(o_ptr)) - { - do_kill = TRUE; - note_kill = _("壊れてしまった!", (plural ? " are destroyed!" : " is destroyed!")); - if (have_flag(flags, TR_IGNORE_ELEC)) ignore = TRUE; - } - - break; - } - case GF_FIRE: - { - if (hates_fire(o_ptr)) - { - do_kill = TRUE; - note_kill = _("燃えてしまった!", (plural ? " burn up!" : " burns up!")); - if (have_flag(flags, TR_IGNORE_FIRE)) ignore = TRUE; - } - - break; - } - case GF_COLD: - { - if (hates_cold(o_ptr)) - { - note_kill = _("砕け散ってしまった!", (plural ? " shatter!" : " shatters!")); - do_kill = TRUE; - if (have_flag(flags, TR_IGNORE_COLD)) ignore = TRUE; - } - - break; - } - case GF_PLASMA: - { - if (hates_fire(o_ptr)) - { - do_kill = TRUE; - note_kill = _("燃えてしまった!", (plural ? " burn up!" : " burns up!")); - if (have_flag(flags, TR_IGNORE_FIRE)) ignore = TRUE; - } - - if (hates_elec(o_ptr)) - { - ignore = FALSE; - do_kill = TRUE; - note_kill = _("壊れてしまった!", (plural ? " are destroyed!" : " is destroyed!")); - if (have_flag(flags, TR_IGNORE_ELEC)) ignore = TRUE; - } - - break; - } - case GF_METEOR: - { - if (hates_fire(o_ptr)) - { - do_kill = TRUE; - note_kill = _("燃えてしまった!", (plural ? " burn up!" : " burns up!")); - if (have_flag(flags, TR_IGNORE_FIRE)) ignore = TRUE; - } - - if (hates_cold(o_ptr)) - { - ignore = FALSE; - do_kill = TRUE; - note_kill = _("砕け散ってしまった!", (plural ? " shatter!" : " shatters!")); - if (have_flag(flags, TR_IGNORE_COLD)) ignore = TRUE; - } - - break; - } - case GF_ICE: - case GF_SHARDS: - case GF_FORCE: - case GF_SOUND: - { - if (hates_cold(o_ptr)) - { - note_kill = _("砕け散ってしまった!", (plural ? " shatter!" : " shatters!")); - do_kill = TRUE; - } - - break; - } - case GF_MANA: - case GF_SEEKER: - case GF_SUPER_RAY: - { - do_kill = TRUE; - note_kill = _("壊れてしまった!", (plural ? " are destroyed!" : " is destroyed!")); - break; - } - case GF_DISINTEGRATE: - { - do_kill = TRUE; - note_kill = _("蒸発してしまった!", (plural ? " evaporate!" : " evaporates!")); - break; - } - case GF_CHAOS: - { - do_kill = TRUE; - note_kill = _("壊れてしまった!", (plural ? " are destroyed!" : " is destroyed!")); - if (have_flag(flags, TR_RES_CHAOS)) ignore = TRUE; - else if ((o_ptr->tval == TV_SCROLL) && (o_ptr->sval == SV_SCROLL_CHAOS)) ignore = TRUE; - break; - } - case GF_HOLY_FIRE: - case GF_HELL_FIRE: - { - if (object_is_cursed(o_ptr)) - { - do_kill = TRUE; - note_kill = _("壊れてしまった!", (plural ? " are destroyed!" : " is destroyed!")); - } - - break; - } - case GF_IDENTIFY: - { - identify_item(caster_ptr, o_ptr); - autopick_alter_item(caster_ptr, (-this_o_idx), FALSE); - break; - } - case GF_KILL_TRAP: - case GF_KILL_DOOR: - { - if (o_ptr->tval != TV_CHEST) break; - if (o_ptr->pval <= 0) break; - - o_ptr->pval = (0 - o_ptr->pval); - object_known(o_ptr); - if (known && (o_ptr->marked & OM_FOUND)) - { - msg_print(_("カチッと音がした!", "Click!")); - is_item_affected = TRUE; - } - - break; - } - case GF_ANIM_DEAD: - { - if (o_ptr->tval != TV_CORPSE) break; - - BIT_FLAGS mode = 0L; - if (!who || is_pet(&caster_ptr->current_floor_ptr->m_list[who])) - mode |= PM_FORCE_PET; - - for (int i = 0; i < o_ptr->number; i++) - { - if (((o_ptr->sval == SV_CORPSE) && (randint1(100) > 80)) || - ((o_ptr->sval == SV_SKELETON) && (randint1(100) > 60))) - { - if (!note_kill) - { - note_kill = _("灰になった。", (plural ? " become dust." : " becomes dust.")); - } - - continue; - } - else if (summon_named_creature(caster_ptr, who, y, x, o_ptr->pval, mode)) - { - note_kill = _("生き返った。", " revived."); - } - else if (!note_kill) - { - note_kill = _("灰になった。", (plural ? " become dust." : " becomes dust.")); - } - } - - do_kill = TRUE; - is_item_affected = TRUE; - break; - } - } - - if (!do_kill) continue; - - GAME_TEXT o_name[MAX_NLEN]; - if (known && (o_ptr->marked & OM_FOUND)) - { - is_item_affected = TRUE; - object_desc(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - } - - if ((is_artifact || ignore)) - { - if (known && (o_ptr->marked & OM_FOUND)) - msg_format(_("%sは影響を受けない!", (plural ? "The %s are unaffected!" : "The %s is unaffected!")), o_name); - - continue; - } - - if (known && (o_ptr->marked & OM_FOUND) && note_kill) - msg_format(_("%sは%s", "The %s%s"), o_name, note_kill); - - KIND_OBJECT_IDX k_idx = o_ptr->k_idx; - bool is_potion = object_is_potion(o_ptr); - delete_object_idx(caster_ptr, this_o_idx); - if (is_potion) - (void)potion_smash_effect(caster_ptr, who, y, x, k_idx); - - lite_spot(caster_ptr, y, x); - } - - return is_item_affected; + next_o_idx = o_ptr->next_o_idx; + BIT_FLAGS flags[TR_FLAG_SIZE]; + object_flags(caster_ptr, o_ptr, flags); + bool is_artifact = object_is_artifact(o_ptr); + switch (typ) { + case GF_ACID: { + if (hates_acid(o_ptr)) { + do_kill = TRUE; + note_kill = _("融けてしまった!", (plural ? " melt!" : " melts!")); + if (have_flag(flags, TR_IGNORE_ACID)) + ignore = TRUE; + } + + break; + } + case GF_ELEC: { + if (hates_elec(o_ptr)) { + do_kill = TRUE; + note_kill = _("壊れてしまった!", (plural ? " are destroyed!" : " is destroyed!")); + if (have_flag(flags, TR_IGNORE_ELEC)) + ignore = TRUE; + } + + break; + } + case GF_FIRE: { + if (hates_fire(o_ptr)) { + do_kill = TRUE; + note_kill = _("燃えてしまった!", (plural ? " burn up!" : " burns up!")); + if (have_flag(flags, TR_IGNORE_FIRE)) + ignore = TRUE; + } + + break; + } + case GF_COLD: { + if (hates_cold(o_ptr)) { + note_kill = _("砕け散ってしまった!", (plural ? " shatter!" : " shatters!")); + do_kill = TRUE; + if (have_flag(flags, TR_IGNORE_COLD)) + ignore = TRUE; + } + + break; + } + case GF_PLASMA: { + if (hates_fire(o_ptr)) { + do_kill = TRUE; + note_kill = _("燃えてしまった!", (plural ? " burn up!" : " burns up!")); + if (have_flag(flags, TR_IGNORE_FIRE)) + ignore = TRUE; + } + + if (hates_elec(o_ptr)) { + ignore = FALSE; + do_kill = TRUE; + note_kill = _("壊れてしまった!", (plural ? " are destroyed!" : " is destroyed!")); + if (have_flag(flags, TR_IGNORE_ELEC)) + ignore = TRUE; + } + + break; + } + case GF_METEOR: { + if (hates_fire(o_ptr)) { + do_kill = TRUE; + note_kill = _("燃えてしまった!", (plural ? " burn up!" : " burns up!")); + if (have_flag(flags, TR_IGNORE_FIRE)) + ignore = TRUE; + } + + if (hates_cold(o_ptr)) { + ignore = FALSE; + do_kill = TRUE; + note_kill = _("砕け散ってしまった!", (plural ? " shatter!" : " shatters!")); + if (have_flag(flags, TR_IGNORE_COLD)) + ignore = TRUE; + } + + break; + } + case GF_ICE: + case GF_SHARDS: + case GF_FORCE: + case GF_SOUND: { + if (hates_cold(o_ptr)) { + note_kill = _("砕け散ってしまった!", (plural ? " shatter!" : " shatters!")); + do_kill = TRUE; + } + + break; + } + case GF_MANA: + case GF_SEEKER: + case GF_SUPER_RAY: { + do_kill = TRUE; + note_kill = _("壊れてしまった!", (plural ? " are destroyed!" : " is destroyed!")); + break; + } + case GF_DISINTEGRATE: { + do_kill = TRUE; + note_kill = _("蒸発してしまった!", (plural ? " evaporate!" : " evaporates!")); + break; + } + case GF_CHAOS: { + do_kill = TRUE; + note_kill = _("壊れてしまった!", (plural ? " are destroyed!" : " is destroyed!")); + if (have_flag(flags, TR_RES_CHAOS)) + ignore = TRUE; + else if ((o_ptr->tval == TV_SCROLL) && (o_ptr->sval == SV_SCROLL_CHAOS)) + ignore = TRUE; + break; + } + case GF_HOLY_FIRE: + case GF_HELL_FIRE: { + if (object_is_cursed(o_ptr)) { + do_kill = TRUE; + note_kill = _("壊れてしまった!", (plural ? " are destroyed!" : " is destroyed!")); + } + + break; + } + case GF_IDENTIFY: { + identify_item(caster_ptr, o_ptr); + autopick_alter_item(caster_ptr, (-this_o_idx), FALSE); + break; + } + case GF_KILL_TRAP: + case GF_KILL_DOOR: { + if (o_ptr->tval != TV_CHEST) + break; + if (o_ptr->pval <= 0) + break; + + o_ptr->pval = (0 - o_ptr->pval); + object_known(o_ptr); + if (known && (o_ptr->marked & OM_FOUND)) { + msg_print(_("カチッと音がした!", "Click!")); + is_item_affected = TRUE; + } + + break; + } + case GF_ANIM_DEAD: { + if (o_ptr->tval != TV_CORPSE) + break; + + BIT_FLAGS mode = 0L; + if (!who || is_pet(&caster_ptr->current_floor_ptr->m_list[who])) + mode |= PM_FORCE_PET; + + for (int i = 0; i < o_ptr->number; i++) { + if (((o_ptr->sval == SV_CORPSE) && (randint1(100) > 80)) || ((o_ptr->sval == SV_SKELETON) && (randint1(100) > 60))) { + if (!note_kill) { + note_kill = _("灰になった。", (plural ? " become dust." : " becomes dust.")); + } + + continue; + } else if (summon_named_creature(caster_ptr, who, y, x, o_ptr->pval, mode)) { + note_kill = _("生き返った。", " revived."); + } else if (!note_kill) { + note_kill = _("灰になった。", (plural ? " become dust." : " becomes dust.")); + } + } + + do_kill = TRUE; + is_item_affected = TRUE; + break; + } + } + + if (!do_kill) + continue; + + GAME_TEXT o_name[MAX_NLEN]; + if (known && (o_ptr->marked & OM_FOUND)) { + is_item_affected = TRUE; + describe_flavor(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + } + + if ((is_artifact || ignore)) { + if (known && (o_ptr->marked & OM_FOUND)) + msg_format(_("%sは影響を受けない!", (plural ? "The %s are unaffected!" : "The %s is unaffected!")), o_name); + + continue; + } + + if (known && (o_ptr->marked & OM_FOUND) && note_kill) + msg_format(_("%sは%s", "The %s%s"), o_name, note_kill); + + KIND_OBJECT_IDX k_idx = o_ptr->k_idx; + bool is_potion = object_is_potion(o_ptr); + delete_object_idx(caster_ptr, this_o_idx); + if (is_potion) + (void)potion_smash_effect(caster_ptr, who, y, x, k_idx); + + lite_spot(caster_ptr, y, x); + } + + return is_item_affected; } diff --git a/src/flavor/flavor-describer.c b/src/flavor/flavor-describer.c new file mode 100644 index 000000000..c7e67bb1f --- /dev/null +++ b/src/flavor/flavor-describer.c @@ -0,0 +1,1039 @@ +/*! + * @brief 武器/防具/アクセサリアイテムにおける、耐性やスレイ等の表記 + * @date 2020/07/06 + * @author Hourier + */ + +#include "flavor/flavor-describer.h" +#include "cmd-item/cmd-smith.h" +#include "combat/shoot.h" +#include "flavor/flag-inscriptions-table.h" +#include "flavor/flavor-util.h" +#include "flavor/object-flavor-types.h" +#include "game-option/text-display-options.h" +#include "grid/trap.h" +#include "inventory/inventory-slot-types.h" +#include "mind/mind-sniper.h" +#include "mind/mind-weaponsmith.h" +#include "monster-race/monster-race.h" +#include "object-enchant/artifact.h" +#include "object-enchant/object-ego.h" +#include "object-enchant/special-object-flags.h" +#include "object-enchant/tr-types.h" +#include "object-enchant/trg-types.h" +#include "object-hook/hook-checker.h" +#include "object-hook/hook-enchant.h" +#include "object-hook/hook-quest.h" +#include "object/object-flags.h" +#include "object/object-kind.h" +#include "perception/object-perception.h" +#include "sv-definition/sv-lite-types.h" +#include "util/bit-flags-calculator.h" +#include "util/quarks.h" +#include "util/string-processor.h" + +/*! + * @brief オブジェクトの各表記を返すメイン関数 / Creates a description of the item "o_ptr", and stores it in "out_val". + * @param player_ptr プレーヤーへの参照ポインタ + * @param buf 表記を返すための文字列参照ポインタ + * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ + * @param mode 表記に関するオプション指定 + * @return 現在クエスト達成目的のアイテムならばTRUEを返す + */ +void describe_flavor(player_type *player_ptr, char *buf, object_type *o_ptr, BIT_FLAGS mode) +{ + concptr kindname = k_name + k_info[o_ptr->k_idx].name; + concptr basenm = kindname; + concptr modstr = ""; + int power; + int fire_rate; + bool aware = FALSE; + bool known = FALSE; + bool flavor = TRUE; + bool show_weapon = FALSE; + bool show_armour = FALSE; + concptr s, s0; + char *t; + char p1 = '(', p2 = ')'; + char b1 = '[', b2 = ']'; + char c1 = '{', c2 = '}'; + char tmp_val[MAX_NLEN + 160]; + char tmp_val2[MAX_NLEN + 10]; + char fake_insc_buf[30]; + BIT_FLAGS flgs[TR_FLAG_SIZE]; + object_type *bow_ptr; + object_kind *k_ptr = &k_info[o_ptr->k_idx]; + object_kind *flavor_k_ptr = &k_info[k_ptr->flavor]; + + object_flags(player_ptr, o_ptr, flgs); + if (object_is_aware(o_ptr)) + aware = TRUE; + + if (object_is_known(o_ptr)) + known = TRUE; + + if (aware && ((mode & OD_NO_FLAVOR) || plain_descriptions)) + flavor = FALSE; + + if ((mode & OD_STORE) || (o_ptr->ident & IDENT_STORE)) { + flavor = FALSE; + aware = TRUE; + known = TRUE; + } + + if (mode & OD_FORCE_FLAVOR) { + aware = FALSE; + flavor = TRUE; + known = FALSE; + flavor_k_ptr = k_ptr; + } + + switch (o_ptr->tval) { + case TV_SKELETON: + case TV_BOTTLE: + case TV_JUNK: + case TV_SPIKE: + case TV_FLASK: + case TV_CHEST: + case TV_WHISTLE: + break; + case TV_CAPTURE: { + monster_race *r_ptr = &r_info[o_ptr->pval]; + if (known) { + if (!o_ptr->pval) { + modstr = _(" (空)", " (empty)"); + } else { +#ifdef JP + sprintf(tmp_val2, " (%s)", r_name + r_ptr->name); + modstr = tmp_val2; +#else + t = r_name + r_ptr->name; + + if (!(r_ptr->flags1 & RF1_UNIQUE)) { + sprintf(tmp_val2, " (%s%s)", (is_a_vowel(*t) ? "an " : "a "), t); + + modstr = tmp_val2; + } else { + sprintf(tmp_val2, "(%s)", t); + + modstr = t; + } +#endif + } + } + + break; + } + case TV_FIGURINE: + case TV_STATUE: { + monster_race *r_ptr = &r_info[o_ptr->pval]; +#ifdef JP + modstr = r_name + r_ptr->name; +#else + t = r_name + r_ptr->name; + + if (!(r_ptr->flags1 & RF1_UNIQUE)) { + sprintf(tmp_val2, "%s%s", (is_a_vowel(*t) ? "an " : "a "), t); + modstr = tmp_val2; + } else + modstr = t; +#endif + + break; + } + case TV_CORPSE: { + monster_race *r_ptr = &r_info[o_ptr->pval]; + modstr = r_name + r_ptr->name; +#ifdef JP + basenm = "#%"; +#else + if (r_ptr->flags1 & RF1_UNIQUE) + basenm = "& % of #"; + else + basenm = "& # %"; +#endif + + break; + } + case TV_SHOT: + case TV_BOLT: + case TV_ARROW: + case TV_BOW: + case TV_HAFTED: + case TV_POLEARM: + case TV_SWORD: + case TV_DIGGING: { + show_weapon = TRUE; + break; + } + case TV_BOOTS: + case TV_GLOVES: + case TV_CLOAK: + case TV_CROWN: + case TV_HELM: + case TV_SHIELD: + case TV_SOFT_ARMOR: + case TV_HARD_ARMOR: + case TV_DRAG_ARMOR: { + show_armour = TRUE; + break; + } + case TV_LITE: + break; + case TV_AMULET: { + if (aware) { + if (object_is_fixed_artifact(o_ptr)) + break; + if (k_ptr->gen_flags & TRG_INSTA_ART) + break; + } + + modstr = k_name + flavor_k_ptr->flavor_name; + if (!flavor) + basenm = _("%のアミュレット", "& Amulet~ of %"); + else if (aware) + basenm = _("%の#アミュレット", "& # Amulet~ of %"); + else + basenm = _("#アミュレット", "& # Amulet~"); + + break; + } + case TV_RING: { + if (aware) { + if (object_is_fixed_artifact(o_ptr)) + break; + if (k_ptr->gen_flags & TRG_INSTA_ART) + break; + } + + modstr = k_name + flavor_k_ptr->flavor_name; + if (!flavor) + basenm = _("%の指輪", "& Ring~ of %"); + else if (aware) + basenm = _("%の#指輪", "& # Ring~ of %"); + else + basenm = _("#指輪", "& # Ring~"); + + if (!k_ptr->to_h && !k_ptr->to_d && (o_ptr->to_h || o_ptr->to_d)) + show_weapon = TRUE; + + break; + } + case TV_CARD: + break; + case TV_STAFF: { + modstr = k_name + flavor_k_ptr->flavor_name; + if (!flavor) + basenm = _("%の杖", "& Staff~ of %"); + else if (aware) + basenm = _("%の#杖", "& # Staff~ of %"); + else + basenm = _("#杖", "& # Staff~"); + + break; + } + case TV_WAND: { + modstr = k_name + flavor_k_ptr->flavor_name; + if (!flavor) + basenm = _("%の魔法棒", "& Wand~ of %"); + else if (aware) + basenm = _("%の#魔法棒", "& # Wand~ of %"); + else + basenm = _("#魔法棒", "& # Wand~"); + + break; + } + case TV_ROD: { + modstr = k_name + flavor_k_ptr->flavor_name; + if (!flavor) + basenm = _("%のロッド", "& Rod~ of %"); + else if (aware) + basenm = _("%の#ロッド", "& # Rod~ of %"); + else + basenm = _("#ロッド", "& # Rod~"); + + break; + } + case TV_SCROLL: { + modstr = k_name + flavor_k_ptr->flavor_name; + if (!flavor) + basenm = _("%の巻物", "& Scroll~ of %"); + else if (aware) + basenm = _("「#」と書かれた%の巻物", "& Scroll~ titled \"#\" of %"); + else + basenm = _("「#」と書かれた巻物", "& Scroll~ titled \"#\""); + + break; + } + case TV_POTION: { + modstr = k_name + flavor_k_ptr->flavor_name; + if (!flavor) + basenm = _("%の薬", "& Potion~ of %"); + else if (aware) + basenm = _("%の#薬", "& # Potion~ of %"); + else + basenm = _("#薬", "& # Potion~"); + + break; + } + case TV_FOOD: { + if (!k_ptr->flavor_name) + break; + + modstr = k_name + flavor_k_ptr->flavor_name; + if (!flavor) + basenm = _("%のキノコ", "& Mushroom~ of %"); + else if (aware) + basenm = _("%の#キノコ", "& # Mushroom~ of %"); + else + basenm = _("#キノコ", "& # Mushroom~"); + + break; + } + case TV_PARCHMENT: { + basenm = _("羊皮紙 - %", "& Parchment~ - %"); + break; + } + case TV_LIFE_BOOK: { +#ifdef JP + basenm = "生命の魔法書%"; +#else + if (mp_ptr->spell_book == TV_LIFE_BOOK) + basenm = "& Book~ of Life Magic %"; + else + basenm = "& Life Spellbook~ %"; +#endif + + break; + } + case TV_SORCERY_BOOK: { +#ifdef JP + basenm = "仙術の魔法書%"; +#else + if (mp_ptr->spell_book == TV_LIFE_BOOK) + basenm = "& Book~ of Sorcery %"; + else + basenm = "& Sorcery Spellbook~ %"; +#endif + + break; + } + case TV_NATURE_BOOK: { +#ifdef JP + basenm = "自然の魔法書%"; +#else + if (mp_ptr->spell_book == TV_LIFE_BOOK) + basenm = "& Book~ of Nature Magic %"; + else + basenm = "& Nature Spellbook~ %"; +#endif + + break; + } + case TV_CHAOS_BOOK: { +#ifdef JP + basenm = "カオスの魔法書%"; +#else + if (mp_ptr->spell_book == TV_LIFE_BOOK) + basenm = "& Book~ of Chaos Magic %"; + else + basenm = "& Chaos Spellbook~ %"; +#endif + + break; + } + case TV_DEATH_BOOK: { +#ifdef JP + basenm = "暗黒の魔法書%"; +#else + if (mp_ptr->spell_book == TV_LIFE_BOOK) + basenm = "& Book~ of Death Magic %"; + else + basenm = "& Death Spellbook~ %"; +#endif + + break; + } + case TV_TRUMP_BOOK: { +#ifdef JP + basenm = "トランプの魔法書%"; +#else + if (mp_ptr->spell_book == TV_LIFE_BOOK) + basenm = "& Book~ of Trump Magic %"; + else + basenm = "& Trump Spellbook~ %"; +#endif + + break; + } + case TV_ARCANE_BOOK: { +#ifdef JP + basenm = "秘術の魔法書%"; +#else + if (mp_ptr->spell_book == TV_LIFE_BOOK) + basenm = "& Book~ of Arcane Magic %"; + else + basenm = "& Arcane Spellbook~ %"; +#endif + + break; + } + case TV_CRAFT_BOOK: { +#ifdef JP + basenm = "匠の魔法書%"; +#else + if (mp_ptr->spell_book == TV_LIFE_BOOK) + basenm = "& Book~ of Craft Magic %"; + else + basenm = "& Craft Spellbook~ %"; +#endif + + break; + } + case TV_DAEMON_BOOK: { +#ifdef JP + basenm = "悪魔の魔法書%"; +#else + if (mp_ptr->spell_book == TV_LIFE_BOOK) + basenm = "& Book~ of Daemon Magic %"; + else + basenm = "& Daemon Spellbook~ %"; +#endif + + break; + } + case TV_CRUSADE_BOOK: { +#ifdef JP + basenm = "破邪の魔法書%"; +#else + if (mp_ptr->spell_book == TV_LIFE_BOOK) + basenm = "& Book~ of Crusade Magic %"; + else + basenm = "& Crusade Spellbook~ %"; +#endif + + break; + } + case TV_MUSIC_BOOK: { + basenm = _("歌集%", "& Song Book~ %"); + break; + } + case TV_HISSATSU_BOOK: { + basenm = _("& 武芸の書%", "Book~ of Kendo %"); + break; + } + case TV_HEX_BOOK: { +#ifdef JP + basenm = "呪術の魔法書%"; +#else + if (mp_ptr->spell_book == TV_LIFE_BOOK) + basenm = "& Book~ of Hex Magic %"; + else + basenm = "& Hex Spellbook~ %"; +#endif + + break; + } + case TV_GOLD: { + strcpy(buf, basenm); + return; + } + default: { + strcpy(buf, _("(なし)", "(nothing)")); + return; + } + } + + if (aware && have_flag(flgs, TR_FULL_NAME)) { + if (known && o_ptr->name1) + basenm = a_name + a_info[o_ptr->name1].name; + else + basenm = kindname; + } + + t = tmp_val; +#ifdef JP + if (basenm[0] == '&') + s = basenm + 2; + else + s = basenm; + + /* No prefix */ + if (mode & OD_OMIT_PREFIX) { + /* Nothing */ + } else if (o_ptr->number > 1) { + t = object_desc_count_japanese(t, o_ptr); + t = object_desc_str(t, "の "); + } + + // 英語の場合アーティファクトは The が付くので分かるが、日本語では分からないのでマークをつける. + if (known) { + if (object_is_fixed_artifact(o_ptr)) + t = object_desc_str(t, "★"); + else if (o_ptr->art_name) + t = object_desc_str(t, "☆"); + } +#else + + if (basenm[0] == '&') { + s = basenm + 2; + if (mode & OD_OMIT_PREFIX) { + /* Nothing */ + } else if (o_ptr->number <= 0) + t = object_desc_str(t, "no more "); + else if (o_ptr->number > 1) { + t = object_desc_num(t, o_ptr->number); + t = object_desc_chr(t, ' '); + } else if ((known && object_is_artifact(o_ptr)) || ((o_ptr->tval == TV_CORPSE) && (r_info[o_ptr->pval].flags1 & RF1_UNIQUE))) + t = object_desc_str(t, "The "); + else { + bool vowel; + switch (*s) { + case '#': + vowel = is_a_vowel(modstr[0]); + break; + case '%': + vowel = is_a_vowel(*kindname); + break; + default: + vowel = is_a_vowel(*s); + break; + } + + if (vowel) + t = object_desc_str(t, "an "); + else + t = object_desc_str(t, "a "); + } + } else { + s = basenm; + if (mode & OD_OMIT_PREFIX) { + /* Nothing */ + } else if (o_ptr->number <= 0) + t = object_desc_str(t, "no more "); + else if (o_ptr->number > 1) { + t = object_desc_num(t, o_ptr->number); + t = object_desc_chr(t, ' '); + } else if (known && object_is_artifact(o_ptr)) + t = object_desc_str(t, "The "); + } +#endif + +#ifdef JP + if (object_is_smith(player_ptr, o_ptr)) + t = object_desc_str(t, format("鍛冶師%sの", player_ptr->name)); + + /* 伝説のアイテム、名のあるアイテムの名前を付加する */ + if (known) { + /* ランダム・アーティファクト */ + if (o_ptr->art_name) { + concptr temp = quark_str(o_ptr->art_name); + + /* '『' から始まらない伝説のアイテムの名前は最初に付加する */ + /* 英語版のセーブファイルから来た 'of XXX' は,「XXXの」と表示する */ + if (strncmp(temp, "of ", 3) == 0) { + t = object_desc_str(t, &temp[3]); + t = object_desc_str(t, "の"); + } else if ((strncmp(temp, "『", 2) != 0) && (strncmp(temp, "《", 2) != 0) && (temp[0] != '\'')) + t = object_desc_str(t, temp); + } + /* 伝説のアイテム */ + else if (o_ptr->name1 && !have_flag(flgs, TR_FULL_NAME)) { + artifact_type *a_ptr = &a_info[o_ptr->name1]; + /* '『' から始まらない伝説のアイテムの名前は最初に付加する */ + if (strncmp(a_name + a_ptr->name, "『", 2) != 0) { + t = object_desc_str(t, a_name + a_ptr->name); + } + } + /* 名のあるアイテム */ + else if (object_is_ego(o_ptr)) { + ego_item_type *e_ptr = &e_info[o_ptr->name2]; + t = object_desc_str(t, e_name + e_ptr->name); + } + } +#endif + + for (s0 = NULL; *s || s0;) { + if (!*s) { + s = s0 + 1; + s0 = NULL; + } else if ((*s == '#') && !s0) { + s0 = s; + s = modstr; + modstr = ""; + } else if ((*s == '%') && !s0) { + s0 = s; + s = kindname; + kindname = ""; + } + +#ifdef JP +#else + else if (*s == '~') { + if (!(mode & OD_NO_PLURAL) && (o_ptr->number != 1)) { + char k = t[-1]; + if ((k == 's') || (k == 'h')) + *t++ = 'e'; + + *t++ = 's'; + } + + s++; + } +#endif + else + *t++ = *s++; + } + + *t = '\0'; + +#ifdef JP + /* '『'から始まる伝説のアイテムの名前は最後に付加する */ + if (known) { + // ランダムアーティファクトの名前はセーブファイルに記録されるので、英語版の名前もそれらしく変換する. + if (o_ptr->art_name) { + char temp[256]; + int itemp; + strcpy(temp, quark_str(o_ptr->art_name)); + if (strncmp(temp, "『", 2) == 0 || strncmp(temp, "《", 2) == 0) + t = object_desc_str(t, temp); + else if (temp[0] == '\'') { + itemp = strlen(temp); + temp[itemp - 1] = 0; + t = object_desc_str(t, "『"); + t = object_desc_str(t, &temp[1]); + t = object_desc_str(t, "』"); + } + } else if (object_is_fixed_artifact(o_ptr)) { + artifact_type *a_ptr = &a_info[o_ptr->name1]; + if (strncmp(a_name + a_ptr->name, "『", 2) == 0) + t = object_desc_str(t, a_name + a_ptr->name); + } else if (o_ptr->inscription) { + concptr str = quark_str(o_ptr->inscription); + while (*str) { + if (iskanji(*str)) { + str += 2; + continue; + } + + if (*str == '#') + break; + + str++; + } + + if (*str) { + concptr str_aux = angband_strchr(quark_str(o_ptr->inscription), '#'); + t = object_desc_str(t, "『"); + t = object_desc_str(t, &str_aux[1]); + t = object_desc_str(t, "』"); + } + } + } +#else + if (object_is_smith(player_ptr, o_ptr)) + t = object_desc_str(t, format(" of %s the Smith", player_ptr->name)); + + if (known && !have_flag(flgs, TR_FULL_NAME)) { + if (o_ptr->art_name) { + t = object_desc_chr(t, ' '); + t = object_desc_str(t, quark_str(o_ptr->art_name)); + } else if (object_is_fixed_artifact(o_ptr)) { + artifact_type *a_ptr = &a_info[o_ptr->name1]; + + t = object_desc_chr(t, ' '); + t = object_desc_str(t, a_name + a_ptr->name); + } else { + if (object_is_ego(o_ptr)) { + ego_item_type *e_ptr = &e_info[o_ptr->name2]; + t = object_desc_chr(t, ' '); + t = object_desc_str(t, e_name + e_ptr->name); + } + + if (o_ptr->inscription && angband_strchr(quark_str(o_ptr->inscription), '#')) { + concptr str = angband_strchr(quark_str(o_ptr->inscription), '#'); + t = object_desc_chr(t, ' '); + t = object_desc_str(t, &str[1]); + } + } + } +#endif + + if (mode & OD_NAME_ONLY) { + angband_strcpy(buf, tmp_val, MAX_NLEN); + return; + } + + if (o_ptr->tval == TV_CHEST) { + if (!known) { + /* Nothing */ + } else if (!o_ptr->pval) + t = object_desc_str(t, _("(空)", " (empty)")); + else if (o_ptr->pval < 0) + if (chest_traps[0 - o_ptr->pval]) + t = object_desc_str(t, _("(解除済)", " (disarmed)")); + else + t = object_desc_str(t, _("(非施錠)", " (unlocked)")); + else { + switch (chest_traps[o_ptr->pval]) { + case 0: { + t = object_desc_str(t, _("(施錠)", " (Locked)")); + break; + } + case CHEST_LOSE_STR: { + t = object_desc_str(t, _("(毒針)", " (Poison Needle)")); + break; + } + case CHEST_LOSE_CON: { + t = object_desc_str(t, _("(毒針)", " (Poison Needle)")); + break; + } + case CHEST_POISON: { + t = object_desc_str(t, _("(ガス・トラップ)", " (Gas Trap)")); + break; + } + case CHEST_PARALYZE: { + t = object_desc_str(t, _("(ガス・トラップ)", " (Gas Trap)")); + break; + } + case CHEST_EXPLODE: { + t = object_desc_str(t, _("(爆発装置)", " (Explosion Device)")); + break; + } + case CHEST_SUMMON: + case CHEST_BIRD_STORM: + case CHEST_E_SUMMON: + case CHEST_H_SUMMON: { + t = object_desc_str(t, _("(召喚のルーン)", " (Summoning Runes)")); + break; + } + case CHEST_RUNES_OF_EVIL: { + t = object_desc_str(t, _("(邪悪なルーン)", " (Gleaming Black Runes)")); + break; + } + case CHEST_ALARM: { + t = object_desc_str(t, _("(警報装置)", " (Alarm)")); + break; + } + default: { + t = object_desc_str(t, _("(マルチ・トラップ)", " (Multiple Traps)")); + break; + } + } + } + } + + if (have_flag(flgs, TR_SHOW_MODS)) + show_weapon = TRUE; + + if (object_is_smith(player_ptr, o_ptr) && (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE)) + show_weapon = TRUE; + + if (o_ptr->to_h && o_ptr->to_d) + show_weapon = TRUE; + + if (o_ptr->ac) + show_armour = TRUE; + + switch (o_ptr->tval) { + case TV_SHOT: + case TV_BOLT: + case TV_ARROW: + case TV_HAFTED: + case TV_POLEARM: + case TV_SWORD: + case TV_DIGGING: { + if (object_is_quest_target(player_ptr, o_ptr) && !known) + break; + + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, p1); + t = object_desc_num(t, o_ptr->dd); + t = object_desc_chr(t, 'd'); + t = object_desc_num(t, o_ptr->ds); + t = object_desc_chr(t, p2); + break; + } + case TV_BOW: { + power = bow_tmul(o_ptr->sval); + if (have_flag(flgs, TR_XTRA_MIGHT)) + power++; + + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, p1); + t = object_desc_chr(t, 'x'); + t = object_desc_num(t, power); + t = object_desc_chr(t, p2); + fire_rate = calc_num_fire(player_ptr, o_ptr); + if (fire_rate != 0 && power > 0 && known) { + fire_rate = bow_energy(o_ptr->sval) / fire_rate; + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, p1); + t = object_desc_num(t, fire_rate / 100); + t = object_desc_chr(t, '.'); + t = object_desc_num(t, fire_rate % 100); + t = object_desc_str(t, "turn"); + t = object_desc_chr(t, p2); + } + + break; + } + } + + if (known) { + if (show_weapon) { + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, p1); + t = object_desc_int(t, o_ptr->to_h); + t = object_desc_chr(t, ','); + t = object_desc_int(t, o_ptr->to_d); + t = object_desc_chr(t, p2); + } else if (o_ptr->to_h) { + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, p1); + t = object_desc_int(t, o_ptr->to_h); + t = object_desc_chr(t, p2); + } else if (o_ptr->to_d) { + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, p1); + t = object_desc_int(t, o_ptr->to_d); + t = object_desc_chr(t, p2); + } + } + + bow_ptr = &player_ptr->inventory_list[INVEN_BOW]; + if (bow_ptr->k_idx && (o_ptr->tval == player_ptr->tval_ammo)) { + int avgdam = o_ptr->dd * (o_ptr->ds + 1) * 10 / 2; + int tmul = bow_tmul(bow_ptr->sval); + ENERGY energy_fire = bow_energy(bow_ptr->sval); + if (object_is_known(bow_ptr)) + avgdam += (bow_ptr->to_d * 10); + + if (known) + avgdam += (o_ptr->to_d * 10); + + if (player_ptr->xtra_might) + tmul++; + + tmul = tmul * (100 + (int)(adj_str_td[player_ptr->stat_ind[A_STR]]) - 128); + avgdam *= tmul; + avgdam /= (100 * 10); + if (player_ptr->concent) + avgdam = boost_concentration_damage(player_ptr, avgdam); + + if (avgdam < 0) + avgdam = 0; + + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, p1); + if (show_ammo_no_crit) { + t = object_desc_num(t, avgdam); + t = object_desc_str(t, show_ammo_detail ? "/shot " : "/"); + } + + avgdam = calc_expect_crit_shot(player_ptr, o_ptr->weight, o_ptr->to_h, bow_ptr->to_h, avgdam); + t = object_desc_num(t, avgdam); + t = show_ammo_no_crit ? object_desc_str(t, show_ammo_detail ? "/crit " : "/") : object_desc_str(t, show_ammo_detail ? "/shot " : "/"); + if (player_ptr->num_fire == 0) + t = object_desc_chr(t, '0'); + else { + avgdam *= (player_ptr->num_fire * 100); + avgdam /= energy_fire; + t = object_desc_num(t, avgdam); + t = object_desc_str(t, show_ammo_detail ? "/turn" : ""); + if (show_ammo_crit_ratio) { + int percent = calc_crit_ratio_shot(player_ptr, known ? o_ptr->to_h : 0, known ? bow_ptr->to_h : 0); + t = object_desc_chr(t, '/'); + t = object_desc_num(t, percent / 100); + t = object_desc_chr(t, '.'); + if (percent % 100 < 10) + t = object_desc_chr(t, '0'); + + t = object_desc_num(t, percent % 100); + t = object_desc_str(t, show_ammo_detail ? "% crit" : "%"); + } + } + + t = object_desc_chr(t, p2); + } else if ((player_ptr->pclass == CLASS_NINJA) && (o_ptr->tval == TV_SPIKE)) { + int avgdam = player_ptr->mighty_throw ? (1 + 3) : 1; + s16b energy_fire = 100 - player_ptr->lev; + avgdam += ((player_ptr->lev + 30) * (player_ptr->lev + 30) - 900) / 55; + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, p1); + t = object_desc_num(t, avgdam); + t = object_desc_chr(t, '/'); + avgdam = 100 * avgdam / energy_fire; + t = object_desc_num(t, avgdam); + t = object_desc_chr(t, p2); + } + + if (known) { + if (show_armour) { + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, b1); + t = object_desc_num(t, o_ptr->ac); + t = object_desc_chr(t, ','); + t = object_desc_int(t, o_ptr->to_a); + t = object_desc_chr(t, b2); + } else if (o_ptr->to_a) { + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, b1); + t = object_desc_int(t, o_ptr->to_a); + t = object_desc_chr(t, b2); + } + } else if (show_armour) { + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, b1); + t = object_desc_num(t, o_ptr->ac); + t = object_desc_chr(t, b2); + } + + if (mode & OD_NAME_AND_ENCHANT) { + angband_strcpy(buf, tmp_val, MAX_NLEN); + return; + } + + if (known) { + if (((o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_WAND))) { + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, p1); + if ((o_ptr->tval == TV_STAFF) && (o_ptr->number > 1)) { + t = object_desc_num(t, o_ptr->number); + t = object_desc_str(t, "x "); + } + + t = object_desc_num(t, o_ptr->pval); + t = object_desc_str(t, _("回分", " charge")); +#ifdef JP +#else + if (o_ptr->pval != 1) + t = object_desc_chr(t, 's'); +#endif + + t = object_desc_chr(t, p2); + } else if (o_ptr->tval == TV_ROD) { + if (o_ptr->timeout) { + if (o_ptr->number > 1) { + if (k_ptr->pval == 0) + k_ptr->pval = 1; + + power = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval; + if (power > o_ptr->number) + power = o_ptr->number; + + t = object_desc_str(t, " ("); + t = object_desc_num(t, power); + t = object_desc_str(t, _("本 充填中)", " charging)")); + } else + t = object_desc_str(t, _("(充填中)", " (charging)")); + } + } + + if (have_pval_flags(flgs)) { + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, p1); + t = object_desc_int(t, o_ptr->pval); + if (have_flag(flgs, TR_HIDE_TYPE)) { + /* Nothing */ + } else if (have_flag(flgs, TR_SPEED)) + t = object_desc_str(t, _("加速", " to speed")); + else if (have_flag(flgs, TR_BLOWS)) { + t = object_desc_str(t, _("攻撃", " attack")); +#ifdef JP +#else + if (ABS(o_ptr->pval) != 1) + t = object_desc_chr(t, 's'); +#endif + } else if (have_flag(flgs, TR_STEALTH)) + t = object_desc_str(t, _("隠密", " to stealth")); + else if (have_flag(flgs, TR_SEARCH)) + t = object_desc_str(t, _("探索", " to searching")); + else if (have_flag(flgs, TR_INFRA)) + t = object_desc_str(t, _("赤外線視力", " to infravision")); + + t = object_desc_chr(t, p2); + } + + if ((o_ptr->tval == TV_LITE) && (!(object_is_fixed_artifact(o_ptr) || (o_ptr->sval == SV_LITE_FEANOR)))) { + t = object_desc_str(t, _("(", " (with ")); + if (o_ptr->name2 == EGO_LITE_LONG) + t = object_desc_num(t, o_ptr->xtra4 * 2); + else + t = object_desc_num(t, o_ptr->xtra4); + + t = object_desc_str(t, _("ターンの寿命)", " turns of light)")); + } + + if (o_ptr->timeout && (o_ptr->tval != TV_ROD)) + t = object_desc_str(t, _("(充填中)", " (charging)")); + } + + if (mode & OD_OMIT_INSCRIPTION) { + angband_strcpy(buf, tmp_val, MAX_NLEN); + return; + } + + tmp_val2[0] = '\0'; + if ((abbrev_extra || abbrev_all) && object_is_fully_known(o_ptr)) { + if (!o_ptr->inscription || !angband_strchr(quark_str(o_ptr->inscription), '%')) { + bool kanji, all; + kanji = _(TRUE, FALSE); + all = abbrev_all; + get_ability_abbreviation(player_ptr, tmp_val2, o_ptr, kanji, all); + } + } + + if (o_ptr->inscription) { + char buff[1024]; + if (tmp_val2[0]) + strcat(tmp_val2, ", "); + + get_inscription(player_ptr, buff, o_ptr); + angband_strcat(tmp_val2, buff, sizeof(tmp_val2)); + } + + fake_insc_buf[0] = '\0'; + if (o_ptr->feeling) + strcpy(fake_insc_buf, game_inscriptions[o_ptr->feeling]); + else if (object_is_cursed(o_ptr) && (known || (o_ptr->ident & IDENT_SENSE))) + strcpy(fake_insc_buf, _("呪われている", "cursed")); + else if (((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET) || (o_ptr->tval == TV_LITE) || (o_ptr->tval == TV_FIGURINE)) && aware && !known + && !(o_ptr->ident & IDENT_SENSE)) + strcpy(fake_insc_buf, _("未鑑定", "unidentified")); + else if (!known && (o_ptr->ident & IDENT_EMPTY)) + strcpy(fake_insc_buf, _("空", "empty")); + else if (!aware && object_is_tried(o_ptr)) + strcpy(fake_insc_buf, _("未判明", "tried")); + + if (o_ptr->discount) { + if (!tmp_val2[0] || (o_ptr->ident & IDENT_STORE)) { + char discount_num_buf[4]; + if (fake_insc_buf[0]) + strcat(fake_insc_buf, ", "); + + (void)object_desc_num(discount_num_buf, o_ptr->discount); + strcat(fake_insc_buf, discount_num_buf); + strcat(fake_insc_buf, _("%引き", "% off")); + } + } + + if (fake_insc_buf[0] || tmp_val2[0]) { + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, c1); + if (fake_insc_buf[0]) + t = object_desc_str(t, fake_insc_buf); + + if (fake_insc_buf[0] && tmp_val2[0]) { + t = object_desc_chr(t, ','); + t = object_desc_chr(t, ' '); + } + + if (tmp_val2[0]) + t = object_desc_str(t, tmp_val2); + + t = object_desc_chr(t, c2); + } + + angband_strcpy(buf, tmp_val, MAX_NLEN); +} diff --git a/src/flavor/flavor-describer.h b/src/flavor/flavor-describer.h new file mode 100644 index 000000000..e8e449d73 --- /dev/null +++ b/src/flavor/flavor-describer.h @@ -0,0 +1,5 @@ +#pragma once + +#include "system/angband.h" + +void describe_flavor(player_type *player_ptr, char *buf, object_type *o_ptr, BIT_FLAGS mode); diff --git a/src/floor/floor-object.c b/src/floor/floor-object.c index 5ecbd2716..01d7b4c26 100644 --- a/src/floor/floor-object.c +++ b/src/floor/floor-object.c @@ -6,6 +6,7 @@ */ #include "floor/floor-object.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor.h" #include "game-option/birth-options.h" @@ -23,7 +24,6 @@ #include "object-enchant/special-object-flags.h" #include "object-hook/hook-checker.h" #include "object-hook/hook-enchant.h" -#include "object/object-flavor.h" #include "object/object-generator.h" #include "object/object-info.h" #include "object/object-kind-hook.h" @@ -73,7 +73,7 @@ static void object_mention(player_type *owner_ptr, object_type *o_ptr) o_ptr->ident |= (IDENT_FULL_KNOWN); GAME_TEXT o_name[MAX_NLEN]; - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); msg_format_wizard(owner_ptr, CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name); } @@ -359,7 +359,7 @@ OBJECT_IDX drop_near(player_type *owner_ptr, object_type *j_ptr, PERCENTAGE chan #else bool plural = (j_ptr->number != 1); #endif - object_desc(owner_ptr, o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(owner_ptr, o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); if (!object_is_artifact(j_ptr) && (randint0(100) < chance)) { #ifdef JP msg_format("%sは消えた。", o_name); @@ -599,7 +599,7 @@ void floor_item_describe(player_type *owner_ptr, INVENTORY_IDX item) { object_type *o_ptr = &owner_ptr->current_floor_ptr->o_list[item]; GAME_TEXT o_name[MAX_NLEN]; - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); #ifdef JP if (o_ptr->number <= 0) { msg_format("床上には、もう%sはない。", o_name); diff --git a/src/floor/floor-streams.c b/src/floor/floor-streams.c index 231e78767..ca1aec5cb 100644 --- a/src/floor/floor-streams.c +++ b/src/floor/floor-streams.c @@ -15,6 +15,7 @@ #include "floor/floor-streams.h" #include "dungeon/dungeon.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-generate.h" #include "floor/floor-object.h" @@ -27,7 +28,6 @@ #include "monster/monster-info.h" #include "object-enchant/artifact.h" #include "object-hook/hook-enchant.h" -#include "object/object-flavor.h" #include "room/rooms.h" #include "spell-kind/spells-floor.h" #include "util/bit-flags-calculator.h" @@ -48,119 +48,106 @@ */ static void recursive_river(floor_type *floor_ptr, POSITION x1, POSITION y1, POSITION x2, POSITION y2, FEAT_IDX feat1, FEAT_IDX feat2, POSITION width) { - POSITION dx, dy, length, l, x, y; - POSITION changex, changey; - POSITION ty, tx; - bool done; - grid_type *g_ptr; - - length = distance(x1, y1, x2, y2); - - if (length > 4) - { - /* - * Divide path in half and call routine twice. - * There is a small chance of splitting the river - */ - dx = (x2 - x1) / 2; - dy = (y2 - y1) / 2; - - if (dy != 0) - { - /* perturbation perpendicular to path */ - changex = randint1(abs(dy)) * 2 - abs(dy); - } - else - { - changex = 0; - } - - if (dx != 0) - { - /* perturbation perpendicular to path */ - changey = randint1(abs(dx)) * 2 - abs(dx); - } - else - { - changey = 0; - } - - if (!in_bounds(floor_ptr, y1 + dy + changey, x1 + dx + changex)) - { - changex = 0; - changey = 0; - } - - /* construct river out of two smaller ones */ - recursive_river(floor_ptr, x1, y1, x1 + dx + changex, y1 + dy + changey, feat1, feat2, width); - recursive_river(floor_ptr, x1 + dx + changex, y1 + dy + changey, x2, y2, feat1, feat2, width); - - /* Split the river some of the time - junctions look cool */ - if (one_in_(DUN_WAT_CHG) && (width > 0)) - { - recursive_river(floor_ptr, x1 + dx + changex, y1 + dy + changey, - x1 + 8 * (dx + changex), y1 + 8 * (dy + changey), - feat1, feat2, width - 1); - } - } - else - { - /* Actually build the river */ - for (l = 0; l < length; l++) - { - x = x1 + l * (x2 - x1) / length; - y = y1 + l * (y2 - y1) / length; - - done = FALSE; - - while (!done) - { - for (ty = y - width - 1; ty <= y + width + 1; ty++) - { - for (tx = x - width - 1; tx <= x + width + 1; tx++) - { - if (!in_bounds2(floor_ptr, ty, tx)) continue; - - g_ptr = &floor_ptr->grid_array[ty][tx]; - - if (g_ptr->feat == feat1) continue; - if (g_ptr->feat == feat2) continue; - - if (distance(ty, tx, y, x) > rand_spread(width, 1)) continue; - - /* Do not convert permanent features */ - if (cave_perma_grid(g_ptr)) continue; - - /* - * Clear previous contents, add feature - * The border mainly gets feat2, while the center gets feat1 - */ - if (distance(ty, tx, y, x) > width) - g_ptr->feat = feat2; - else - g_ptr->feat = feat1; - - /* Clear garbage of hidden trap or door */ - g_ptr->mimic = 0; - - /* Lava terrain glows */ - if (have_flag(f_info[feat1].flags, FF_LAVA)) - { - if (!(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS)) g_ptr->info |= CAVE_GLOW; - } - - /* Hack -- don't teleport here */ - g_ptr->info |= CAVE_ICKY; - } - } - - done = TRUE; - } - } - } + POSITION dx, dy, length, l, x, y; + POSITION changex, changey; + POSITION ty, tx; + bool done; + grid_type *g_ptr; + + length = distance(x1, y1, x2, y2); + + if (length > 4) { + /* + * Divide path in half and call routine twice. + * There is a small chance of splitting the river + */ + dx = (x2 - x1) / 2; + dy = (y2 - y1) / 2; + + if (dy != 0) { + /* perturbation perpendicular to path */ + changex = randint1(abs(dy)) * 2 - abs(dy); + } else { + changex = 0; + } + + if (dx != 0) { + /* perturbation perpendicular to path */ + changey = randint1(abs(dx)) * 2 - abs(dx); + } else { + changey = 0; + } + + if (!in_bounds(floor_ptr, y1 + dy + changey, x1 + dx + changex)) { + changex = 0; + changey = 0; + } + + /* construct river out of two smaller ones */ + recursive_river(floor_ptr, x1, y1, x1 + dx + changex, y1 + dy + changey, feat1, feat2, width); + recursive_river(floor_ptr, x1 + dx + changex, y1 + dy + changey, x2, y2, feat1, feat2, width); + + /* Split the river some of the time - junctions look cool */ + if (one_in_(DUN_WAT_CHG) && (width > 0)) { + recursive_river(floor_ptr, x1 + dx + changex, y1 + dy + changey, x1 + 8 * (dx + changex), y1 + 8 * (dy + changey), feat1, feat2, width - 1); + } + } else { + /* Actually build the river */ + for (l = 0; l < length; l++) { + x = x1 + l * (x2 - x1) / length; + y = y1 + l * (y2 - y1) / length; + + done = FALSE; + + while (!done) { + for (ty = y - width - 1; ty <= y + width + 1; ty++) { + for (tx = x - width - 1; tx <= x + width + 1; tx++) { + if (!in_bounds2(floor_ptr, ty, tx)) + continue; + + g_ptr = &floor_ptr->grid_array[ty][tx]; + + if (g_ptr->feat == feat1) + continue; + if (g_ptr->feat == feat2) + continue; + + if (distance(ty, tx, y, x) > rand_spread(width, 1)) + continue; + + /* Do not convert permanent features */ + if (cave_perma_grid(g_ptr)) + continue; + + /* + * Clear previous contents, add feature + * The border mainly gets feat2, while the center gets feat1 + */ + if (distance(ty, tx, y, x) > width) + g_ptr->feat = feat2; + else + g_ptr->feat = feat1; + + /* Clear garbage of hidden trap or door */ + g_ptr->mimic = 0; + + /* Lava terrain glows */ + if (have_flag(f_info[feat1].flags, FF_LAVA)) { + if (!(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS)) + g_ptr->info |= CAVE_GLOW; + } + + /* Hack -- don't teleport here */ + g_ptr->info |= CAVE_ICKY; + } + } + + done = TRUE; + } + } + } } - /*! * @brief ランダムに川/溶岩流をダンジョンに配置する / * Places water /lava through dungeon. @@ -170,121 +157,102 @@ static void recursive_river(floor_type *floor_ptr, POSITION x1, POSITION y1, POS */ void add_river(floor_type *floor_ptr) { - dungeon_type *dungeon_ptr; - POSITION y2, x2; - POSITION y1 = 0, x1 = 0; - POSITION wid; - FEAT_IDX feat1 = 0, feat2 = 0; - - dungeon_ptr = &d_info[floor_ptr->dungeon_idx]; - - /* Choose water mainly */ - if ((randint1(MAX_DEPTH * 2) - 1 > floor_ptr->dun_level) && (dungeon_ptr->flags1 & DF1_WATER_RIVER)) - { - feat1 = feat_deep_water; - feat2 = feat_shallow_water; - } - else /* others */ - { - FEAT_IDX select_deep_feat[10]; - FEAT_IDX select_shallow_feat[10]; - int select_id_max = 0, selected; - - if (dungeon_ptr->flags1 & DF1_LAVA_RIVER) - { - select_deep_feat[select_id_max] = feat_deep_lava; - select_shallow_feat[select_id_max] = feat_shallow_lava; - select_id_max++; - } - if (dungeon_ptr->flags1 & DF1_POISONOUS_RIVER) - { - select_deep_feat[select_id_max] = feat_deep_poisonous_puddle; - select_shallow_feat[select_id_max] = feat_shallow_poisonous_puddle; - select_id_max++; - } - if (dungeon_ptr->flags1 & DF1_ACID_RIVER) - { - select_deep_feat[select_id_max] = feat_deep_acid_puddle; - select_shallow_feat[select_id_max] = feat_shallow_acid_puddle; - select_id_max++; - } - - if (select_id_max > 0) - { - selected = randint0(select_id_max); - feat1 = select_deep_feat[selected]; - feat2 = select_shallow_feat[selected]; - } - else - { - return; - } - } - - if (feat1) - { - feature_type *f_ptr = &f_info[feat1]; - - /* Only add river if matches lake type or if have no lake at all */ - if (!(((dun->laketype == LAKE_T_LAVA) && have_flag(f_ptr->flags, FF_LAVA)) || - ((dun->laketype == LAKE_T_WATER) && have_flag(f_ptr->flags, FF_WATER)) || - !dun->laketype)) - { - return; - } - } - - - /* Hack -- Choose starting point */ - y2 = randint1(floor_ptr->height / 2 - 2) + floor_ptr->height / 2; - x2 = randint1(floor_ptr->width / 2 - 2) + floor_ptr->width / 2; - - /* Hack -- Choose ending point somewhere on boundary */ - switch(randint1(4)) - { - case 1: - { - /* top boundary */ - x1 = randint1(floor_ptr->width-2)+1; - y1 = 1; - break; - } - case 2: - { - /* left boundary */ - x1 = 1; - y1 = randint1(floor_ptr->height-2)+1; - break; - } - case 3: - { - /* right boundary */ - x1 = floor_ptr->width-1; - y1 = randint1(floor_ptr->height-2)+1; - break; - } - case 4: - { - /* bottom boundary */ - x1 = randint1(floor_ptr->width-2)+1; - y1 = floor_ptr->height-1; - break; - } - } - - wid = randint1(DUN_WAT_RNG); - recursive_river(floor_ptr, x1, y1, x2, y2, feat1, feat2, wid); - - /* Hack - Save the location as a "room" */ - if (dun->cent_n < CENT_MAX) - { - dun->cent[dun->cent_n].y = y2; - dun->cent[dun->cent_n].x = x2; - dun->cent_n++; - } + dungeon_type *dungeon_ptr; + POSITION y2, x2; + POSITION y1 = 0, x1 = 0; + POSITION wid; + FEAT_IDX feat1 = 0, feat2 = 0; + + dungeon_ptr = &d_info[floor_ptr->dungeon_idx]; + + /* Choose water mainly */ + if ((randint1(MAX_DEPTH * 2) - 1 > floor_ptr->dun_level) && (dungeon_ptr->flags1 & DF1_WATER_RIVER)) { + feat1 = feat_deep_water; + feat2 = feat_shallow_water; + } else /* others */ + { + FEAT_IDX select_deep_feat[10]; + FEAT_IDX select_shallow_feat[10]; + int select_id_max = 0, selected; + + if (dungeon_ptr->flags1 & DF1_LAVA_RIVER) { + select_deep_feat[select_id_max] = feat_deep_lava; + select_shallow_feat[select_id_max] = feat_shallow_lava; + select_id_max++; + } + if (dungeon_ptr->flags1 & DF1_POISONOUS_RIVER) { + select_deep_feat[select_id_max] = feat_deep_poisonous_puddle; + select_shallow_feat[select_id_max] = feat_shallow_poisonous_puddle; + select_id_max++; + } + if (dungeon_ptr->flags1 & DF1_ACID_RIVER) { + select_deep_feat[select_id_max] = feat_deep_acid_puddle; + select_shallow_feat[select_id_max] = feat_shallow_acid_puddle; + select_id_max++; + } + + if (select_id_max > 0) { + selected = randint0(select_id_max); + feat1 = select_deep_feat[selected]; + feat2 = select_shallow_feat[selected]; + } else { + return; + } + } + + if (feat1) { + feature_type *f_ptr = &f_info[feat1]; + + /* Only add river if matches lake type or if have no lake at all */ + if (!(((dun->laketype == LAKE_T_LAVA) && have_flag(f_ptr->flags, FF_LAVA)) || ((dun->laketype == LAKE_T_WATER) && have_flag(f_ptr->flags, FF_WATER)) + || !dun->laketype)) { + return; + } + } + + /* Hack -- Choose starting point */ + y2 = randint1(floor_ptr->height / 2 - 2) + floor_ptr->height / 2; + x2 = randint1(floor_ptr->width / 2 - 2) + floor_ptr->width / 2; + + /* Hack -- Choose ending point somewhere on boundary */ + switch (randint1(4)) { + case 1: { + /* top boundary */ + x1 = randint1(floor_ptr->width - 2) + 1; + y1 = 1; + break; + } + case 2: { + /* left boundary */ + x1 = 1; + y1 = randint1(floor_ptr->height - 2) + 1; + break; + } + case 3: { + /* right boundary */ + x1 = floor_ptr->width - 1; + y1 = randint1(floor_ptr->height - 2) + 1; + break; + } + case 4: { + /* bottom boundary */ + x1 = randint1(floor_ptr->width - 2) + 1; + y1 = floor_ptr->height - 1; + break; + } + } + + wid = randint1(DUN_WAT_RNG); + recursive_river(floor_ptr, x1, y1, x2, y2, feat1, feat2, wid); + + /* Hack - Save the location as a "room" */ + if (dun->cent_n < CENT_MAX) { + dun->cent[dun->cent_n].y = y2; + dun->cent[dun->cent_n].x = x2; + dun->cent_n++; + } } - /*! * @brief ダンジョンの壁部にストリーマー(地質の変化)を与える / * Places "streamers" of rock through dungeon @@ -302,145 +270,135 @@ void add_river(floor_type *floor_ptr) */ void build_streamer(player_type *player_ptr, FEAT_IDX feat, int chance) { - int i; - POSITION y, x, tx, ty; - DIRECTION dir; - int dummy = 0; - - grid_type *g_ptr; - feature_type *f_ptr; - - feature_type *streamer_ptr = &f_info[feat]; - bool streamer_is_wall = have_flag(streamer_ptr->flags, FF_WALL) && !have_flag(streamer_ptr->flags, FF_PERMANENT); - bool streamer_may_have_gold = have_flag(streamer_ptr->flags, FF_MAY_HAVE_GOLD); - - /* Hack -- Choose starting point */ - floor_type *floor_ptr = player_ptr->current_floor_ptr; - y = rand_spread(floor_ptr->height / 2, floor_ptr->height / 6); - x = rand_spread(floor_ptr->width / 2, floor_ptr->width / 6); - - /* Choose a random compass direction */ - dir = randint0(8); - - /* Place streamer into dungeon */ - while (dummy < SAFE_MAX_ATTEMPTS) - { - dummy++; - - /* One grid per density */ - for (i = 0; i < DUN_STR_DEN; i++) - { - int d = DUN_STR_RNG; - - /* Pick a nearby grid */ - while (TRUE) - { - ty = rand_spread(y, d); - tx = rand_spread(x, d); - if (!in_bounds2(floor_ptr, ty, tx)) continue; - break; - } - g_ptr = &floor_ptr->grid_array[ty][tx]; - f_ptr = &f_info[g_ptr->feat]; - - if (have_flag(f_ptr->flags, FF_MOVE) && (have_flag(f_ptr->flags, FF_WATER) || have_flag(f_ptr->flags, FF_LAVA))) - continue; - - /* Do not convert permanent features */ - if (have_flag(f_ptr->flags, FF_PERMANENT)) continue; - - /* Only convert "granite" walls */ - if (streamer_is_wall) - { - if (!is_extra_grid(g_ptr) && !is_inner_grid(g_ptr) && !is_outer_grid(g_ptr) && !is_solid_grid(g_ptr)) continue; - if (is_closed_door(player_ptr, g_ptr->feat)) continue; - } - - if (g_ptr->m_idx && !(have_flag(streamer_ptr->flags, FF_PLACE) && monster_can_cross_terrain(player_ptr, feat, &r_info[floor_ptr->m_list[g_ptr->m_idx].r_idx], 0))) - { - /* Delete the monster (if any) */ - delete_monster(player_ptr, ty, tx); - } - - if (g_ptr->o_idx && !have_flag(streamer_ptr->flags, FF_DROP)) - { - OBJECT_IDX this_o_idx, next_o_idx = 0; - - /* Scan all objects in the grid */ - for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) - { - object_type *o_ptr = &floor_ptr->o_list[this_o_idx]; - next_o_idx = o_ptr->next_o_idx; - - /* Hack -- Preserve unknown artifacts */ - if (object_is_fixed_artifact(o_ptr)) - { - /* Mega-Hack -- Preserve the artifact */ - a_info[o_ptr->name1].cur_num = 0; - - if (cheat_peek) - { - GAME_TEXT o_name[MAX_NLEN]; - object_desc(player_ptr, o_name, o_ptr, (OD_NAME_ONLY | OD_STORE)); - msg_format(_("伝説のアイテム (%s) はストリーマーにより削除された。", - "Artifact (%s) was deleted by streamer."), o_name); - } - } - else if (cheat_peek && o_ptr->art_name) - { - msg_print(_("ランダム・アーティファクトの1つはストリーマーにより削除された。", - "One of the random artifacts was deleted by streamer.")); - } - } - - delete_all_items_from_floor(player_ptr, ty, tx); - } - - /* Clear previous contents, add proper vein type */ - g_ptr->feat = feat; - - /* Paranoia: Clear mimic field */ - g_ptr->mimic = 0; - - if (streamer_may_have_gold) - { - /* Hack -- Add some known treasure */ - if (one_in_(chance)) - { - cave_alter_feat(player_ptr, ty, tx, FF_MAY_HAVE_GOLD); - } - - /* Hack -- Add some hidden treasure */ - else if (one_in_(chance / 4)) - { - cave_alter_feat(player_ptr, ty, tx, FF_MAY_HAVE_GOLD); - cave_alter_feat(player_ptr, ty, tx, FF_ENSECRET); - } - } - } - - if (dummy >= SAFE_MAX_ATTEMPTS) - { - msg_print_wizard(player_ptr, CHEAT_DUNGEON, _("地形のストリーマー処理に失敗しました。", "Failed to place streamer.")); - return; - } - - /* Advance the streamer */ - y += ddy[cdd[dir]]; - x += ddx[cdd[dir]]; - - if(one_in_(10)) - { - if(one_in_(2)) dir = (dir + 1) % 8; - else dir = (dir > 0) ? dir - 1 : 7; - } - - /* Quit before leaving the dungeon */ - if (!in_bounds(floor_ptr, y, x)) break; - } + int i; + POSITION y, x, tx, ty; + DIRECTION dir; + int dummy = 0; + + grid_type *g_ptr; + feature_type *f_ptr; + + feature_type *streamer_ptr = &f_info[feat]; + bool streamer_is_wall = have_flag(streamer_ptr->flags, FF_WALL) && !have_flag(streamer_ptr->flags, FF_PERMANENT); + bool streamer_may_have_gold = have_flag(streamer_ptr->flags, FF_MAY_HAVE_GOLD); + + /* Hack -- Choose starting point */ + floor_type *floor_ptr = player_ptr->current_floor_ptr; + y = rand_spread(floor_ptr->height / 2, floor_ptr->height / 6); + x = rand_spread(floor_ptr->width / 2, floor_ptr->width / 6); + + /* Choose a random compass direction */ + dir = randint0(8); + + /* Place streamer into dungeon */ + while (dummy < SAFE_MAX_ATTEMPTS) { + dummy++; + + /* One grid per density */ + for (i = 0; i < DUN_STR_DEN; i++) { + int d = DUN_STR_RNG; + + /* Pick a nearby grid */ + while (TRUE) { + ty = rand_spread(y, d); + tx = rand_spread(x, d); + if (!in_bounds2(floor_ptr, ty, tx)) + continue; + break; + } + g_ptr = &floor_ptr->grid_array[ty][tx]; + f_ptr = &f_info[g_ptr->feat]; + + if (have_flag(f_ptr->flags, FF_MOVE) && (have_flag(f_ptr->flags, FF_WATER) || have_flag(f_ptr->flags, FF_LAVA))) + continue; + + /* Do not convert permanent features */ + if (have_flag(f_ptr->flags, FF_PERMANENT)) + continue; + + /* Only convert "granite" walls */ + if (streamer_is_wall) { + if (!is_extra_grid(g_ptr) && !is_inner_grid(g_ptr) && !is_outer_grid(g_ptr) && !is_solid_grid(g_ptr)) + continue; + if (is_closed_door(player_ptr, g_ptr->feat)) + continue; + } + + if (g_ptr->m_idx + && !(have_flag(streamer_ptr->flags, FF_PLACE) + && monster_can_cross_terrain(player_ptr, feat, &r_info[floor_ptr->m_list[g_ptr->m_idx].r_idx], 0))) { + /* Delete the monster (if any) */ + delete_monster(player_ptr, ty, tx); + } + + if (g_ptr->o_idx && !have_flag(streamer_ptr->flags, FF_DROP)) { + OBJECT_IDX this_o_idx, next_o_idx = 0; + + /* Scan all objects in the grid */ + for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) { + object_type *o_ptr = &floor_ptr->o_list[this_o_idx]; + next_o_idx = o_ptr->next_o_idx; + + /* Hack -- Preserve unknown artifacts */ + if (object_is_fixed_artifact(o_ptr)) { + /* Mega-Hack -- Preserve the artifact */ + a_info[o_ptr->name1].cur_num = 0; + + if (cheat_peek) { + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(player_ptr, o_name, o_ptr, (OD_NAME_ONLY | OD_STORE)); + msg_format(_("伝説のアイテム (%s) はストリーマーにより削除された。", "Artifact (%s) was deleted by streamer."), o_name); + } + } else if (cheat_peek && o_ptr->art_name) { + msg_print(_("ランダム・アーティファクトの1つはストリーマーにより削除された。", "One of the random artifacts was deleted by streamer.")); + } + } + + delete_all_items_from_floor(player_ptr, ty, tx); + } + + /* Clear previous contents, add proper vein type */ + g_ptr->feat = feat; + + /* Paranoia: Clear mimic field */ + g_ptr->mimic = 0; + + if (streamer_may_have_gold) { + /* Hack -- Add some known treasure */ + if (one_in_(chance)) { + cave_alter_feat(player_ptr, ty, tx, FF_MAY_HAVE_GOLD); + } + + /* Hack -- Add some hidden treasure */ + else if (one_in_(chance / 4)) { + cave_alter_feat(player_ptr, ty, tx, FF_MAY_HAVE_GOLD); + cave_alter_feat(player_ptr, ty, tx, FF_ENSECRET); + } + } + } + + if (dummy >= SAFE_MAX_ATTEMPTS) { + msg_print_wizard(player_ptr, CHEAT_DUNGEON, _("地形のストリーマー処理に失敗しました。", "Failed to place streamer.")); + return; + } + + /* Advance the streamer */ + y += ddy[cdd[dir]]; + x += ddx[cdd[dir]]; + + if (one_in_(10)) { + if (one_in_(2)) + dir = (dir + 1) % 8; + else + dir = (dir > 0) ? dir - 1 : 7; + } + + /* Quit before leaving the dungeon */ + if (!in_bounds(floor_ptr, y, x)) + break; + } } - /*! * @brief ダンジョンの指定位置近辺に森林を配置する / * Places "streamers" of rock through dungeon @@ -455,56 +413,52 @@ void build_streamer(player_type *player_ptr, FEAT_IDX feat, int chance) */ void place_trees(player_type *player_ptr, POSITION x, POSITION y) { - int i, j; - grid_type *g_ptr; - - /* place trees/ rubble in ovalish distribution */ - floor_type *floor_ptr = player_ptr->current_floor_ptr; - for (i = x - 3; i < x + 4; i++) - { - for (j = y - 3; j < y + 4; j++) - { - if (!in_bounds(floor_ptr, j, i)) continue; - g_ptr = &floor_ptr->grid_array[j][i]; - - if (g_ptr->info & CAVE_ICKY) continue; - if (g_ptr->o_idx) continue; - - /* Want square to be in the circle and accessable. */ - if ((distance(j, i, y, x) < 4) && !cave_perma_grid(g_ptr)) - { - /* - * Clear previous contents, add feature - * The border mainly gets trees, while the center gets rubble - */ - if ((distance(j, i, y, x) > 1) || (randint1(100) < 25)) - { - if (randint1(100) < 75) - floor_ptr->grid_array[j][i].feat = feat_tree; - } - else - { - floor_ptr->grid_array[j][i].feat = feat_rubble; - } - - /* Clear garbage of hidden trap or door */ - g_ptr->mimic = 0; - - /* Light area since is open above */ - if (!(d_info[player_ptr->dungeon_idx].flags1 & DF1_DARKNESS)) floor_ptr->grid_array[j][i].info |= (CAVE_GLOW | CAVE_ROOM); - } - } - } - - /* No up stairs in ironman mode */ - if (!ironman_downward && one_in_(3)) - { - /* up stair */ - floor_ptr->grid_array[y][x].feat = feat_up_stair; - } + int i, j; + grid_type *g_ptr; + + /* place trees/ rubble in ovalish distribution */ + floor_type *floor_ptr = player_ptr->current_floor_ptr; + for (i = x - 3; i < x + 4; i++) { + for (j = y - 3; j < y + 4; j++) { + if (!in_bounds(floor_ptr, j, i)) + continue; + g_ptr = &floor_ptr->grid_array[j][i]; + + if (g_ptr->info & CAVE_ICKY) + continue; + if (g_ptr->o_idx) + continue; + + /* Want square to be in the circle and accessable. */ + if ((distance(j, i, y, x) < 4) && !cave_perma_grid(g_ptr)) { + /* + * Clear previous contents, add feature + * The border mainly gets trees, while the center gets rubble + */ + if ((distance(j, i, y, x) > 1) || (randint1(100) < 25)) { + if (randint1(100) < 75) + floor_ptr->grid_array[j][i].feat = feat_tree; + } else { + floor_ptr->grid_array[j][i].feat = feat_rubble; + } + + /* Clear garbage of hidden trap or door */ + g_ptr->mimic = 0; + + /* Light area since is open above */ + if (!(d_info[player_ptr->dungeon_idx].flags1 & DF1_DARKNESS)) + floor_ptr->grid_array[j][i].info |= (CAVE_GLOW | CAVE_ROOM); + } + } + } + + /* No up stairs in ironman mode */ + if (!ironman_downward && one_in_(3)) { + /* up stair */ + floor_ptr->grid_array[y][x].feat = feat_up_stair; + } } - /*! * @brief ダンジョンに*破壊*済み地形ランダムに施す / * Build a destroyed level @@ -514,15 +468,14 @@ void destroy_level(player_type *player_ptr) { msg_print_wizard(player_ptr, CHEAT_DUNGEON, _("階に*破壊*の痕跡を生成しました。", "Destroyed Level.")); - /* Drop a few epi-centers (usually about two) */ - POSITION y1, x1; - floor_type *floor_ptr = player_ptr->current_floor_ptr; - for (int n = 0; n < randint1(5); n++) - { - /* Pick an epi-center */ - x1 = rand_range(5, floor_ptr->width - 1 - 5); - y1 = rand_range(5, floor_ptr->height - 1 - 5); - - (void)destroy_area(player_ptr, y1, x1, 15, TRUE); - } + /* Drop a few epi-centers (usually about two) */ + POSITION y1, x1; + floor_type *floor_ptr = player_ptr->current_floor_ptr; + for (int n = 0; n < randint1(5); n++) { + /* Pick an epi-center */ + x1 = rand_range(5, floor_ptr->width - 1 - 5); + y1 = rand_range(5, floor_ptr->height - 1 - 5); + + (void)destroy_area(player_ptr, y1, x1, 15, TRUE); + } } diff --git a/src/floor/object-scanner.c b/src/floor/object-scanner.c index 161a3c83f..dbbf2fe47 100644 --- a/src/floor/object-scanner.c +++ b/src/floor/object-scanner.c @@ -1,11 +1,11 @@ #include "floor/object-scanner.h" +#include "flavor/flavor-describer.h" #include "floor/floor.h" #include "game-option/text-display-options.h" #include "grid/grid.h" #include "inventory/inventory-util.h" #include "io/input-key-requester.h" #include "object/item-tester-hooker.h" -#include "object/object-flavor.h" #include "object/object-mark-types.h" #include "system/object-type-definition.h" #include "term/gameterm.h" @@ -113,7 +113,7 @@ COMMAND_CODE show_floor_items(player_type *owner_ptr, int target_item, POSITION floor_type *floor_ptr = owner_ptr->current_floor_ptr; for (k = 0, i = 0; i < floor_num && i < 23; i++) { o_ptr = &floor_ptr->o_list[floor_list[i]]; - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); out_index[k] = i; out_color[k] = tval_to_attr[o_ptr->tval & 0x7F]; strcpy(out_desc[k], o_name); diff --git a/src/inventory/inventory-curse.c b/src/inventory/inventory-curse.c index 052b6a822..a226e5529 100644 --- a/src/inventory/inventory-curse.c +++ b/src/inventory/inventory-curse.c @@ -3,6 +3,7 @@ #include "core/asking-player.h" #include "core/player-redraw-types.h" #include "core/player-update-types.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "inventory/inventory-slot-types.h" #include "io/files-util.h" @@ -14,40 +15,28 @@ #include "object-enchant/tr-types.h" #include "object-enchant/trc-types.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "perception/object-perception.h" -#include "status/bad-status-setter.h" #include "player/player-damage.h" #include "player/player-move.h" #include "player/player-race-types.h" #include "spell-kind/spells-random.h" #include "spell-kind/spells-teleport.h" #include "spell/spells-summon.h" +#include "status/bad-status-setter.h" #include "util/bit-flags-calculator.h" -#include "util/string-processor.h" #include "util/quarks.h" +#include "util/string-processor.h" #include "view/display-messages.h" -#define TRC_P_FLAG_MASK \ - (TRC_TELEPORT_SELF | TRC_CHAINSWORD | TRC_TY_CURSE | TRC_DRAIN_EXP | TRC_ADD_L_CURSE | TRC_ADD_H_CURSE | TRC_CALL_ANIMAL | TRC_CALL_DEMON \ +#define TRC_P_FLAG_MASK \ + (TRC_TELEPORT_SELF | TRC_CHAINSWORD | TRC_TY_CURSE | TRC_DRAIN_EXP | TRC_ADD_L_CURSE | TRC_ADD_H_CURSE | TRC_CALL_ANIMAL | TRC_CALL_DEMON \ | TRC_CALL_DRAGON | TRC_COWARDICE | TRC_TELEPORT | TRC_DRAIN_HP | TRC_DRAIN_MANA | TRC_CALL_UNDEAD) static bool is_specific_curse(BIT_FLAGS flag) { - return (flag == TRC_ADD_L_CURSE) || - (flag == TRC_ADD_H_CURSE) || - (flag == TRC_DRAIN_HP) || - (flag == TRC_DRAIN_MANA) || - (flag == TRC_CALL_ANIMAL) || - (flag == TRC_CALL_DEMON) || - (flag == TRC_CALL_DRAGON) || - (flag == TRC_CALL_UNDEAD) || - (flag == TRC_COWARDICE) || - (flag == TRC_LOW_MELEE) || - (flag == TRC_LOW_AC) || - (flag == TRC_LOW_MAGIC) || - (flag == TRC_FAST_DIGEST) || - (flag == TRC_SLOW_REGEN); + return (flag == TRC_ADD_L_CURSE) || (flag == TRC_ADD_H_CURSE) || (flag == TRC_DRAIN_HP) || (flag == TRC_DRAIN_MANA) || (flag == TRC_CALL_ANIMAL) + || (flag == TRC_CALL_DEMON) || (flag == TRC_CALL_DRAGON) || (flag == TRC_CALL_UNDEAD) || (flag == TRC_COWARDICE) || (flag == TRC_LOW_MELEE) + || (flag == TRC_LOW_AC) || (flag == TRC_LOW_MAGIC) || (flag == TRC_FAST_DIGEST) || (flag == TRC_SLOW_REGEN); } static void choise_cursed_item(player_type *creature_ptr, BIT_FLAGS flag, object_type *o_ptr, int *choices, int *number, int item_num) @@ -118,7 +107,7 @@ static void choise_cursed_item(player_type *creature_ptr, BIT_FLAGS flag, object * @return 該当の呪いが一つでもあった場合にランダムに選ばれた装備品のオブジェクト構造体参照ポインタを返す。\n * 呪いがない場合NULLを返す。 */ -object_type *choose_cursed_obj_name(player_type* creature_ptr, BIT_FLAGS flag) +object_type *choose_cursed_obj_name(player_type *creature_ptr, BIT_FLAGS flag) { int choices[INVEN_TOTAL - INVEN_RARM]; int number = 0; @@ -126,13 +115,13 @@ object_type *choose_cursed_obj_name(player_type* creature_ptr, BIT_FLAGS flag) return NULL; for (int i = INVEN_RARM; i < INVEN_TOTAL; i++) { - object_type* o_ptr = &creature_ptr->inventory_list[i]; + object_type *o_ptr = &creature_ptr->inventory_list[i]; if (o_ptr->curse_flags & flag) { choices[number] = i; number++; continue; - } - + } + choise_cursed_item(creature_ptr, flag, o_ptr, choices, &number, i); } @@ -150,7 +139,7 @@ static void curse_teleport(player_type *creature_ptr) return; GAME_TEXT o_name[MAX_NLEN]; - object_type* o_ptr; + object_type *o_ptr; int i_keep = 0, count = 0; for (int i = INVEN_RARM; i < INVEN_TOTAL; i++) { BIT_FLAGS flgs[TR_FLAG_SIZE]; @@ -172,14 +161,13 @@ static void curse_teleport(player_type *creature_ptr) } o_ptr = &creature_ptr->inventory_list[i_keep]; - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); msg_format(_("%sがテレポートの能力を発動させようとしている。", "Your %s is activating teleportation."), o_name); if (get_check_strict(creature_ptr, _("テレポートしますか?", "Teleport? "), CHECK_OKAY_CANCEL)) { disturb(creature_ptr, FALSE, TRUE); teleport_player(creature_ptr, 50, TELEPORT_SPONTANEOUS); } else { - msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。", - "You can inscribe {.} on your %s to disable random teleportation. "), o_name); + msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。", "You can inscribe {.} on your %s to disable random teleportation. "), o_name); disturb(creature_ptr, TRUE, TRUE); } } @@ -219,14 +207,14 @@ static void multiply_low_curse(player_type *creature_ptr) if (((creature_ptr->cursed & TRC_ADD_L_CURSE) == 0) || !one_in_(2000)) return; - object_type* o_ptr; + object_type *o_ptr; o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_L_CURSE); BIT_FLAGS new_curse = get_curse(creature_ptr, 0, o_ptr); if ((o_ptr->curse_flags & new_curse)) return; GAME_TEXT o_name[MAX_NLEN]; - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); o_ptr->curse_flags |= new_curse; msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name); o_ptr->feeling = FEEL_NONE; @@ -238,14 +226,14 @@ static void multiply_high_curse(player_type *creature_ptr) if (((creature_ptr->cursed & TRC_ADD_H_CURSE) == 0) || !one_in_(2000)) return; - object_type* o_ptr; + object_type *o_ptr; o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_H_CURSE); BIT_FLAGS new_curse = get_curse(creature_ptr, 1, o_ptr); if ((o_ptr->curse_flags & new_curse)) return; GAME_TEXT o_name[MAX_NLEN]; - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); o_ptr->curse_flags |= new_curse; msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name); o_ptr->feeling = FEEL_NONE; @@ -256,11 +244,11 @@ static void curse_call_monster(player_type *creature_ptr) { const int call_type = PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET; const int obj_desc_type = OD_OMIT_PREFIX | OD_NAME_ONLY; - floor_type* floor_ptr = creature_ptr->current_floor_ptr; + floor_type *floor_ptr = creature_ptr->current_floor_ptr; if ((creature_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500)) { if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, floor_ptr->dun_level, SUMMON_ANIMAL, call_type)) { GAME_TEXT o_name[MAX_NLEN]; - object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_ANIMAL), obj_desc_type); + describe_flavor(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_ANIMAL), obj_desc_type); msg_format(_("%sが動物を引き寄せた!", "Your %s has attracted an animal!"), o_name); disturb(creature_ptr, FALSE, TRUE); } @@ -269,7 +257,7 @@ static void curse_call_monster(player_type *creature_ptr) if ((creature_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111)) { if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, floor_ptr->dun_level, SUMMON_DEMON, call_type)) { GAME_TEXT o_name[MAX_NLEN]; - object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DEMON), obj_desc_type); + describe_flavor(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DEMON), obj_desc_type); msg_format(_("%sが悪魔を引き寄せた!", "Your %s has attracted a demon!"), o_name); disturb(creature_ptr, FALSE, TRUE); } @@ -278,7 +266,7 @@ static void curse_call_monster(player_type *creature_ptr) if ((creature_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800)) { if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, floor_ptr->dun_level, SUMMON_DRAGON, call_type)) { GAME_TEXT o_name[MAX_NLEN]; - object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DRAGON), obj_desc_type); + describe_flavor(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DRAGON), obj_desc_type); msg_format(_("%sがドラゴンを引き寄せた!", "Your %s has attracted an dragon!"), o_name); disturb(creature_ptr, FALSE, TRUE); } @@ -287,7 +275,7 @@ static void curse_call_monster(player_type *creature_ptr) if ((creature_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111)) { if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, floor_ptr->dun_level, SUMMON_UNDEAD, call_type)) { GAME_TEXT o_name[MAX_NLEN]; - object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_UNDEAD), obj_desc_type); + describe_flavor(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_UNDEAD), obj_desc_type); msg_format(_("%sが死霊を引き寄せた!", "Your %s has attracted an undead!"), o_name); disturb(creature_ptr, FALSE, TRUE); } @@ -313,7 +301,7 @@ static void curse_drain_hp(player_type *creature_ptr) return; GAME_TEXT o_name[MAX_NLEN]; - object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY)); msg_format(_("%sはあなたの体力を吸収した!", "Your %s drains HP from you!"), o_name); take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev * 2, 100), o_name, -1); } @@ -324,7 +312,7 @@ static void curse_drain_mp(player_type *creature_ptr) return; GAME_TEXT o_name[MAX_NLEN]; - object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY)); msg_format(_("%sはあなたの魔力を吸収した!", "Your %s drains mana from you!"), o_name); creature_ptr->csp -= MIN(creature_ptr->lev, 50); if (creature_ptr->csp < 0) { @@ -373,7 +361,7 @@ void execute_cursed_items_effect(player_type *creature_ptr) if (!one_in_(999) || creature_ptr->anti_magic) return; - object_type* o_ptr = &creature_ptr->inventory_list[INVEN_LITE]; + object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE]; if (o_ptr->name1 != ART_JUDGE) return; diff --git a/src/inventory/inventory-damage.c b/src/inventory/inventory-damage.c index 8d048d0ff..e67f7130b 100644 --- a/src/inventory/inventory-damage.c +++ b/src/inventory/inventory-damage.c @@ -1,4 +1,5 @@ #include "inventory/inventory-damage.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor.h" #include "inventory/inventory-object.h" @@ -7,9 +8,8 @@ #include "object-hook/hook-enchant.h" #include "object-hook/hook-expendable.h" #include "object/object-broken.h" -#include "object/object-flavor.h" -#include "object/object-stack.h" #include "object/object-info.h" +#include "object/object-stack.h" #include "view/display-messages.h" /*! @@ -58,7 +58,7 @@ void inventory_damage(player_type *player_ptr, inven_func typ, int perc) if (!amt) continue; - object_desc(player_ptr, o_name, o_ptr, OD_OMIT_PREFIX); + describe_flavor(player_ptr, o_name, o_ptr, OD_OMIT_PREFIX); msg_format(_("%s(%c)が%s壊れてしまった!", "%sour %s (%c) %s destroyed!"), #ifdef JP diff --git a/src/inventory/inventory-object.c b/src/inventory/inventory-object.c index eddb9ae67..fa76467ca 100644 --- a/src/inventory/inventory-object.c +++ b/src/inventory/inventory-object.c @@ -1,15 +1,15 @@ #include "inventory/inventory-object.h" #include "core/player-update-types.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "floor/floor-object.h" #include "inventory/inventory-slot-types.h" #include "object-hook/hook-weapon.h" -#include "object/object-flavor.h" #include "object/object-generator.h" +#include "object/object-info.h" #include "object/object-mark-types.h" #include "object/object-stack.h" #include "object/object-value.h" -#include "object/object-info.h" #include "spell-realm/spells-craft.h" #include "util/object-sort.h" #include "view/display-messages.h" @@ -139,7 +139,7 @@ void drop_from_inventory(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER distribute_charges(o_ptr, q_ptr, amt); q_ptr->number = amt; - object_desc(owner_ptr, o_name, q_ptr, 0); + describe_flavor(owner_ptr, o_name, q_ptr, 0); msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item)); (void)drop_near(owner_ptr, q_ptr, 0, owner_ptr->y, owner_ptr->x); vary_item(owner_ptr, item, -amt); @@ -406,7 +406,7 @@ INVENTORY_IDX inven_takeoff(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUM q_ptr = &forge; object_copy(q_ptr, o_ptr); q_ptr->number = amt; - object_desc(owner_ptr, o_name, q_ptr, 0); + describe_flavor(owner_ptr, o_name, q_ptr, 0); if (((item == INVEN_RARM) || (item == INVEN_LARM)) && object_is_melee_weapon(o_ptr)) { act = _("を装備からはずした", "You were wielding"); } else if (item == INVEN_BOW) { diff --git a/src/inventory/inventory-util.c b/src/inventory/inventory-util.c index 1041c7a76..7b270f99c 100644 --- a/src/inventory/inventory-util.c +++ b/src/inventory/inventory-util.c @@ -7,12 +7,12 @@ #include "inventory/inventory-util.h" #include "core/asking-player.h" +#include "flavor/flavor-describer.h" #include "floor/floor.h" #include "inventory/inventory-slot-types.h" #include "io/input-key-requester.h" #include "object/item-tester-hooker.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "system/object-type-definition.h" #include "util/int-char-converter.h" #include "util/quarks.h" @@ -272,7 +272,7 @@ bool verify(player_type *owner_ptr, concptr prompt, INVENTORY_IDX item) else o_ptr = &owner_ptr->current_floor_ptr->o_list[0 - item]; - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); (void)sprintf(out_val, _("%s%sですか? ", "%s %s? "), prompt, o_name); return get_check(out_val); } diff --git a/src/inventory/pack-overflow.c b/src/inventory/pack-overflow.c index a2e5954c6..5c6a6e443 100644 --- a/src/inventory/pack-overflow.c +++ b/src/inventory/pack-overflow.c @@ -1,9 +1,9 @@ #include "inventory/pack-overflow.h" #include "core/stuff-handler.h" +#include "flavor/flavor-describer.h" #include "floor/floor-object.h" #include "inventory/inventory-object.h" #include "inventory/inventory-slot-types.h" -#include "object/object-flavor.h" #include "object/object-info.h" #include "player/player-move.h" #include "view/display-messages.h" @@ -27,7 +27,7 @@ void pack_overflow(player_type *owner_ptr) disturb(owner_ptr, FALSE, TRUE); msg_print(_("ザックからアイテムがあふれた!", "Your pack overflows!")); - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(INVEN_PACK)); (void)drop_near(owner_ptr, o_ptr, 0, owner_ptr->y, owner_ptr->x); diff --git a/src/inventory/player-inventory.c b/src/inventory/player-inventory.c index b387dfc5f..8d0ec71d0 100644 --- a/src/inventory/player-inventory.c +++ b/src/inventory/player-inventory.c @@ -2,6 +2,7 @@ #include "core/asking-player.h" #include "core/player-redraw-types.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "floor/floor-object.h" #include "floor/object-scanner.h" #include "game-option/birth-options.h" @@ -16,7 +17,6 @@ #include "io/input-key-requester.h" #include "object/item-tester-hooker.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "object/object-info.h" #include "object/object-kind.h" #include "object/object-mark-types.h" @@ -80,7 +80,7 @@ void py_pickup_floor(player_type *owner_ptr, bool pickup) int can_pickup = 0; for (this_o_idx = owner_ptr->current_floor_ptr->grid_array[owner_ptr->y][owner_ptr->x].o_idx; this_o_idx; this_o_idx = next_o_idx) { o_ptr = &owner_ptr->current_floor_ptr->o_list[this_o_idx]; - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); next_o_idx = o_ptr->next_o_idx; disturb(owner_ptr, FALSE, FALSE); if (o_ptr->tval == TV_GOLD) { @@ -108,7 +108,7 @@ void py_pickup_floor(player_type *owner_ptr, bool pickup) if (!pickup) { if (floor_num == 1) { o_ptr = &owner_ptr->current_floor_ptr->o_list[floor_o_idx]; - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); msg_format(_("%sがある。", "You see %s."), o_name); } else msg_format(_("%d 個のアイテムの山がある。", "You see a pile of %d items."), floor_num); @@ -119,7 +119,7 @@ void py_pickup_floor(player_type *owner_ptr, bool pickup) if (!can_pickup) { if (floor_num == 1) { o_ptr = &owner_ptr->current_floor_ptr->o_list[floor_o_idx]; - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); msg_format(_("ザックには%sを入れる隙間がない。", "You have no room for %s."), o_name); } else msg_print(_("ザックには床にあるどのアイテムも入らない。", "You have no room for any of the objects on the floor.")); @@ -138,7 +138,7 @@ void py_pickup_floor(player_type *owner_ptr, bool pickup) if (carry_query_flag) { char out_val[MAX_NLEN + 20]; o_ptr = &owner_ptr->current_floor_ptr->o_list[floor_o_idx]; - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); (void)sprintf(out_val, _("%sを拾いますか? ", "Pick up %s? "), o_name); if (!get_check(out_val)) return; @@ -177,7 +177,7 @@ COMMAND_CODE show_equipment(player_type *owner_ptr, int target_item, BIT_FLAGS m || (mode & IGNORE_BOTHHAND_SLOT))) continue; - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); if ((((i == INVEN_RARM) && owner_ptr->hidarite) || ((i == INVEN_LARM) && owner_ptr->migite)) && owner_ptr->ryoute) { (void)strcpy(out_desc[k], _("(武器を両手持ち)", "(wielding with two-hands)")); out_color[k] = TERM_WHITE; diff --git a/src/inventory/recharge-processor.c b/src/inventory/recharge-processor.c index 952ab2406..9c1e6d2ed 100644 --- a/src/inventory/recharge-processor.c +++ b/src/inventory/recharge-processor.c @@ -1,10 +1,10 @@ #include "inventory/recharge-processor.h" #include "core/hp-mp-regenerator.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "inventory/inventory-slot-types.h" #include "object-hook/hook-checker.h" -#include "object/object-flavor.h" #include "object/object-kind.h" #include "player/player-move.h" #include "util/quarks.h" @@ -27,7 +27,7 @@ static void recharged_notice(player_type *owner_ptr, object_type *o_ptr) while (s) { if (s[1] == '!') { GAME_TEXT o_name[MAX_NLEN]; - object_desc(owner_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(owner_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); #ifdef JP msg_format("%sは再充填された。", o_name); #else diff --git a/src/io-dump/character-dump.c b/src/io-dump/character-dump.c index c9f9c5163..b9a0a4c7b 100644 --- a/src/io-dump/character-dump.c +++ b/src/io-dump/character-dump.c @@ -1,8 +1,8 @@ #include "io-dump/character-dump.h" #include "art-definition/art-bow-types.h" -#include "util/sort.h" #include "dungeon/dungeon.h" #include "dungeon/quest.h" +#include "flavor/flavor-describer.h" #include "floor/floor-town.h" #include "floor/floor.h" #include "game-option/birth-options.h" @@ -22,7 +22,6 @@ #include "monster/monster-info.h" #include "monster/monster-status.h" #include "monster/smart-learn-types.h" -#include "object/object-flavor.h" #include "object/object-info.h" #include "pet/pet-util.h" #include "player/avatar.h" @@ -32,6 +31,7 @@ #include "store/store.h" #include "system/angband-version.h" #include "util/int-char-converter.h" +#include "util/sort.h" #include "view/display-messages.h" #include "world/world.h" @@ -43,53 +43,54 @@ */ static void dump_aux_pet(player_type *master_ptr, FILE *fff) { - bool pet = FALSE; - bool pet_settings = FALSE; - for (int i = master_ptr->current_floor_ptr->m_max - 1; i >= 1; i--) - { - monster_type *m_ptr = &master_ptr->current_floor_ptr->m_list[i]; + bool pet = FALSE; + bool pet_settings = FALSE; + for (int i = master_ptr->current_floor_ptr->m_max - 1; i >= 1; i--) { + monster_type *m_ptr = &master_ptr->current_floor_ptr->m_list[i]; - if (!monster_is_valid(m_ptr)) continue; - if (!is_pet(m_ptr)) continue; - pet_settings = TRUE; - if (!m_ptr->nickname && (master_ptr->riding != i)) continue; - if (!pet) - { - fprintf(fff, _("\n\n [主なペット]\n\n", "\n\n [Leading Pets]\n\n")); - pet = TRUE; - } + if (!monster_is_valid(m_ptr)) + continue; + if (!is_pet(m_ptr)) + continue; + pet_settings = TRUE; + if (!m_ptr->nickname && (master_ptr->riding != i)) + continue; + if (!pet) { + fprintf(fff, _("\n\n [主なペット]\n\n", "\n\n [Leading Pets]\n\n")); + pet = TRUE; + } - GAME_TEXT pet_name[MAX_NLEN]; - monster_desc(master_ptr, pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE); - fprintf(fff, "%s\n", pet_name); - } + GAME_TEXT pet_name[MAX_NLEN]; + monster_desc(master_ptr, pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE); + fprintf(fff, "%s\n", pet_name); + } - if (!pet_settings) return; + if (!pet_settings) + return; - fprintf(fff, _("\n\n [ペットへの命令]\n", "\n\n [Command for Pets]\n")); + fprintf(fff, _("\n\n [ペットへの命令]\n", "\n\n [Command for Pets]\n")); - fprintf(fff, _("\n ドアを開ける: %s", "\n Pets open doors: %s"), - (master_ptr->pet_extra_flags & PF_OPEN_DOORS) ? "ON" : "OFF"); + fprintf(fff, _("\n ドアを開ける: %s", "\n Pets open doors: %s"), + (master_ptr->pet_extra_flags & PF_OPEN_DOORS) ? "ON" : "OFF"); - fprintf(fff, _("\n アイテムを拾う: %s", "\n Pets pick up items: %s"), - (master_ptr->pet_extra_flags & PF_PICKUP_ITEMS) ? "ON" : "OFF"); + fprintf(fff, _("\n アイテムを拾う: %s", "\n Pets pick up items: %s"), + (master_ptr->pet_extra_flags & PF_PICKUP_ITEMS) ? "ON" : "OFF"); - fprintf(fff, _("\n テレポート系魔法を使う: %s", "\n Allow teleport: %s"), - (master_ptr->pet_extra_flags & PF_TELEPORT) ? "ON" : "OFF"); + fprintf(fff, _("\n テレポート系魔法を使う: %s", "\n Allow teleport: %s"), + (master_ptr->pet_extra_flags & PF_TELEPORT) ? "ON" : "OFF"); - fprintf(fff, _("\n 攻撃魔法を使う: %s", "\n Allow cast attack spell: %s"), - (master_ptr->pet_extra_flags & PF_ATTACK_SPELL) ? "ON" : "OFF"); + fprintf(fff, _("\n 攻撃魔法を使う: %s", "\n Allow cast attack spell: %s"), + (master_ptr->pet_extra_flags & PF_ATTACK_SPELL) ? "ON" : "OFF"); - fprintf(fff, _("\n 召喚魔法を使う: %s", "\n Allow cast summon spell: %s"), - (master_ptr->pet_extra_flags & PF_SUMMON_SPELL) ? "ON" : "OFF"); + fprintf(fff, _("\n 召喚魔法を使う: %s", "\n Allow cast summon spell: %s"), + (master_ptr->pet_extra_flags & PF_SUMMON_SPELL) ? "ON" : "OFF"); - fprintf(fff, _("\n プレイヤーを巻き込む範囲魔法を使う: %s", "\n Allow involve player in area spell: %s"), - (master_ptr->pet_extra_flags & PF_BALL_SPELL) ? "ON" : "OFF"); + fprintf(fff, _("\n プレイヤーを巻き込む範囲魔法を使う: %s", "\n Allow involve player in area spell: %s"), + (master_ptr->pet_extra_flags & PF_BALL_SPELL) ? "ON" : "OFF"); - fputc('\n', fff); + fputc('\n', fff); } - /*! * @brief クエスト情報をファイルにダンプする * @param creature_ptr プレーヤーへの参照ポインタ @@ -98,25 +99,24 @@ static void dump_aux_pet(player_type *master_ptr, FILE *fff) */ static void dump_aux_quest(player_type *creature_ptr, FILE *fff) { - fprintf(fff, _("\n\n [クエスト情報]\n", "\n\n [Quest Information]\n")); - QUEST_IDX *quest_num; - C_MAKE(quest_num, max_q_idx, QUEST_IDX); - - for (QUEST_IDX i = 1; i < max_q_idx; i++) - quest_num[i] = i; - int dummy; - ang_sort(creature_ptr, quest_num, &dummy, max_q_idx, ang_sort_comp_quest_num, ang_sort_swap_quest_num); - - fputc('\n', fff); - do_cmd_knowledge_quests_completed(creature_ptr, fff, quest_num); - fputc('\n', fff); - do_cmd_knowledge_quests_failed(creature_ptr, fff, quest_num); - fputc('\n', fff); - - C_KILL(quest_num, max_q_idx, QUEST_IDX); + fprintf(fff, _("\n\n [クエスト情報]\n", "\n\n [Quest Information]\n")); + QUEST_IDX *quest_num; + C_MAKE(quest_num, max_q_idx, QUEST_IDX); + + for (QUEST_IDX i = 1; i < max_q_idx; i++) + quest_num[i] = i; + int dummy; + ang_sort(creature_ptr, quest_num, &dummy, max_q_idx, ang_sort_comp_quest_num, ang_sort_swap_quest_num); + + fputc('\n', fff); + do_cmd_knowledge_quests_completed(creature_ptr, fff, quest_num); + fputc('\n', fff); + do_cmd_knowledge_quests_failed(creature_ptr, fff, quest_num); + fputc('\n', fff); + + C_KILL(quest_num, max_q_idx, QUEST_IDX); } - /*! * @brief 死の直前メッセージ並びに遺言をファイルにダンプする * @param creature_ptr プレーヤーへの参照ポインタ @@ -125,29 +125,26 @@ static void dump_aux_quest(player_type *creature_ptr, FILE *fff) */ static void dump_aux_last_message(player_type *creature_ptr, FILE *fff) { - if (!creature_ptr->is_dead) return; - - if (!current_world_ptr->total_winner) - { - fprintf(fff, _("\n [死ぬ直前のメッセージ]\n\n", "\n [Last Messages]\n\n")); - for (int i = MIN(message_num(), 30); i >= 0; i--) - { - fprintf(fff, "> %s\n", message_str((s16b)i)); - } - - fputc('\n', fff); - return; - } - - if (creature_ptr->last_message) - { - fprintf(fff, _("\n [*勝利*メッセージ]\n\n", "\n [*Winning* Message]\n\n")); - fprintf(fff, " %s\n", creature_ptr->last_message); - fputc('\n', fff); - } + if (!creature_ptr->is_dead) + return; + + if (!current_world_ptr->total_winner) { + fprintf(fff, _("\n [死ぬ直前のメッセージ]\n\n", "\n [Last Messages]\n\n")); + for (int i = MIN(message_num(), 30); i >= 0; i--) { + fprintf(fff, "> %s\n", message_str((s16b)i)); + } + + fputc('\n', fff); + return; + } + + if (creature_ptr->last_message) { + fprintf(fff, _("\n [*勝利*メッセージ]\n\n", "\n [*Winning* Message]\n\n")); + fprintf(fff, " %s\n", creature_ptr->last_message); + fputc('\n', fff); + } } - /*! * @brief 帰還場所情報をファイルにダンプする * @param fff ファイルポインタ @@ -155,25 +152,24 @@ static void dump_aux_last_message(player_type *creature_ptr, FILE *fff) */ static void dump_aux_recall(FILE *fff) { - fprintf(fff, _("\n [帰還場所]\n\n", "\n [Recall Depth]\n\n")); - for (int y = 1; y < current_world_ptr->max_d_idx; y++) - { - bool seiha = FALSE; - - if (!d_info[y].maxdepth) continue; - if (!max_dlv[y]) continue; - if (d_info[y].final_guardian) - { - if (!r_info[d_info[y].final_guardian].max_num) seiha = TRUE; - } - else if (max_dlv[y] == d_info[y].maxdepth) seiha = TRUE; - - fprintf(fff, _(" %c%-12s: %3d 階\n", " %c%-16s: level %3d\n"), - seiha ? '!' : ' ', d_name + d_info[y].name, (int)max_dlv[y]); - } + fprintf(fff, _("\n [帰還場所]\n\n", "\n [Recall Depth]\n\n")); + for (int y = 1; y < current_world_ptr->max_d_idx; y++) { + bool seiha = FALSE; + + if (!d_info[y].maxdepth) + continue; + if (!max_dlv[y]) + continue; + if (d_info[y].final_guardian) { + if (!r_info[d_info[y].final_guardian].max_num) + seiha = TRUE; + } else if (max_dlv[y] == d_info[y].maxdepth) + seiha = TRUE; + + fprintf(fff, _(" %c%-12s: %3d 階\n", " %c%-16s: level %3d\n"), seiha ? '!' : ' ', d_name + d_info[y].name, (int)max_dlv[y]); + } } - /*! * @brief オプション情報をファイルにダンプする * @param fff ファイルポインタ @@ -181,54 +177,53 @@ static void dump_aux_recall(FILE *fff) */ static void dump_aux_options(FILE *fff) { - fprintf(fff, _("\n [オプション設定]\n", "\n [Option Settings]\n")); - if (preserve_mode) - fprintf(fff, _("\n 保存モード: ON", "\n Preserve Mode: ON")); - else - fprintf(fff, _("\n 保存モード: OFF", "\n Preserve Mode: OFF")); - - if (ironman_small_levels) - fprintf(fff, _("\n 小さいダンジョン: ALWAYS", "\n Small Levels: ALWAYS")); - else if (always_small_levels) - fprintf(fff, _("\n 小さいダンジョン: ON", "\n Small Levels: ON")); - else if (small_levels) - fprintf(fff, _("\n 小さいダンジョン: ENABLED", "\n Small Levels: ENABLED")); - else - fprintf(fff, _("\n 小さいダンジョン: OFF", "\n Small Levels: OFF")); - - if (vanilla_town) - fprintf(fff, _("\n 元祖の町のみ: ON", "\n Vanilla Town: ON")); - else if (lite_town) - fprintf(fff, _("\n 小規模な町: ON", "\n Lite Town: ON")); - - if (ironman_shops) - fprintf(fff, _("\n 店なし: ON", "\n No Shops: ON")); - - if (ironman_downward) - fprintf(fff, _("\n 階段を上がれない: ON", "\n Diving Only: ON")); - - if (ironman_rooms) - fprintf(fff, _("\n 普通でない部屋: ON", "\n Unusual Rooms: ON")); - - if (ironman_nightmare) - fprintf(fff, _("\n 悪夢モード: ON", "\n Nightmare Mode: ON")); - - if (ironman_empty_levels) - fprintf(fff, _("\n アリーナ: ALWAYS", "\n Arena Levels: ALWAYS")); - else if (empty_levels) - fprintf(fff, _("\n アリーナ: ENABLED", "\n Arena Levels: ENABLED")); - else - fprintf(fff, _("\n アリーナ: OFF", "\n Arena Levels: OFF")); - - fputc('\n', fff); - - if (current_world_ptr->noscore) - fprintf(fff, _("\n 何か不正なことをしてしまっています。\n", "\n You have done something illegal.\n")); - - fputc('\n', fff); + fprintf(fff, _("\n [オプション設定]\n", "\n [Option Settings]\n")); + if (preserve_mode) + fprintf(fff, _("\n 保存モード: ON", "\n Preserve Mode: ON")); + else + fprintf(fff, _("\n 保存モード: OFF", "\n Preserve Mode: OFF")); + + if (ironman_small_levels) + fprintf(fff, _("\n 小さいダンジョン: ALWAYS", "\n Small Levels: ALWAYS")); + else if (always_small_levels) + fprintf(fff, _("\n 小さいダンジョン: ON", "\n Small Levels: ON")); + else if (small_levels) + fprintf(fff, _("\n 小さいダンジョン: ENABLED", "\n Small Levels: ENABLED")); + else + fprintf(fff, _("\n 小さいダンジョン: OFF", "\n Small Levels: OFF")); + + if (vanilla_town) + fprintf(fff, _("\n 元祖の町のみ: ON", "\n Vanilla Town: ON")); + else if (lite_town) + fprintf(fff, _("\n 小規模な町: ON", "\n Lite Town: ON")); + + if (ironman_shops) + fprintf(fff, _("\n 店なし: ON", "\n No Shops: ON")); + + if (ironman_downward) + fprintf(fff, _("\n 階段を上がれない: ON", "\n Diving Only: ON")); + + if (ironman_rooms) + fprintf(fff, _("\n 普通でない部屋: ON", "\n Unusual Rooms: ON")); + + if (ironman_nightmare) + fprintf(fff, _("\n 悪夢モード: ON", "\n Nightmare Mode: ON")); + + if (ironman_empty_levels) + fprintf(fff, _("\n アリーナ: ALWAYS", "\n Arena Levels: ALWAYS")); + else if (empty_levels) + fprintf(fff, _("\n アリーナ: ENABLED", "\n Arena Levels: ENABLED")); + else + fprintf(fff, _("\n アリーナ: OFF", "\n Arena Levels: OFF")); + + fputc('\n', fff); + + if (current_world_ptr->noscore) + fprintf(fff, _("\n 何か不正なことをしてしまっています。\n", "\n You have done something illegal.\n")); + + fputc('\n', fff); } - /*! * @brief 闘技場の情報をファイルにダンプする * @param creature_ptr プレーヤーへの参照ポインタ @@ -237,53 +232,47 @@ static void dump_aux_options(FILE *fff) */ static void dump_aux_arena(player_type *creature_ptr, FILE *fff) { - if (lite_town || vanilla_town) return; - - if (creature_ptr->arena_number < 0) - { - if (creature_ptr->arena_number <= ARENA_DEFEATED_OLD_VER) - { - fprintf(fff, _("\n 闘技場: 敗北\n", "\n Arena: Defeated\n")); - } - else - { + if (lite_town || vanilla_town) + return; + + if (creature_ptr->arena_number < 0) { + if (creature_ptr->arena_number <= ARENA_DEFEATED_OLD_VER) { + fprintf(fff, _("\n 闘技場: 敗北\n", "\n Arena: Defeated\n")); + } else { #ifdef JP - fprintf(fff, "\n 闘技場: %d回戦で%sの前に敗北\n", -creature_ptr->arena_number, - r_name + r_info[arena_info[-1 - creature_ptr->arena_number].r_idx].name); + fprintf( + fff, "\n 闘技場: %d回戦で%sの前に敗北\n", -creature_ptr->arena_number, r_name + r_info[arena_info[-1 - creature_ptr->arena_number].r_idx].name); #else - fprintf(fff, "\n Arena: Defeated by %s in the %d%s fight\n", - r_name + r_info[arena_info[-1 - creature_ptr->arena_number].r_idx].name, - -creature_ptr->arena_number, get_ordinal_number_suffix(-creature_ptr->arena_number)); + fprintf(fff, "\n Arena: Defeated by %s in the %d%s fight\n", r_name + r_info[arena_info[-1 - creature_ptr->arena_number].r_idx].name, + -creature_ptr->arena_number, get_ordinal_number_suffix(-creature_ptr->arena_number)); #endif - } - - fprintf(fff, "\n"); - return; - } - - if (creature_ptr->arena_number > MAX_ARENA_MONS + 2) - { - fprintf(fff, _("\n 闘技場: 真のチャンピオン\n", "\n Arena: True Champion\n")); - fprintf(fff, "\n"); - return; - } - - if (creature_ptr->arena_number > MAX_ARENA_MONS - 1) - { - fprintf(fff, _("\n 闘技場: チャンピオン\n", "\n Arena: Champion\n")); - fprintf(fff, "\n"); - return; - } + } + + fprintf(fff, "\n"); + return; + } + + if (creature_ptr->arena_number > MAX_ARENA_MONS + 2) { + fprintf(fff, _("\n 闘技場: 真のチャンピオン\n", "\n Arena: True Champion\n")); + fprintf(fff, "\n"); + return; + } + + if (creature_ptr->arena_number > MAX_ARENA_MONS - 1) { + fprintf(fff, _("\n 闘技場: チャンピオン\n", "\n Arena: Champion\n")); + fprintf(fff, "\n"); + return; + } #ifdef JP - fprintf(fff, "\n 闘技場: %2d勝\n", (creature_ptr->arena_number > MAX_ARENA_MONS ? MAX_ARENA_MONS : creature_ptr->arena_number)); + fprintf(fff, "\n 闘技場: %2d勝\n", (creature_ptr->arena_number > MAX_ARENA_MONS ? MAX_ARENA_MONS : creature_ptr->arena_number)); #else - fprintf(fff, "\n Arena: %2d Victor%s\n", (creature_ptr->arena_number > MAX_ARENA_MONS ? MAX_ARENA_MONS : creature_ptr->arena_number), (creature_ptr->arena_number > 1) ? "ies" : "y"); + fprintf(fff, "\n Arena: %2d Victor%s\n", (creature_ptr->arena_number > MAX_ARENA_MONS ? MAX_ARENA_MONS : creature_ptr->arena_number), + (creature_ptr->arena_number > 1) ? "ies" : "y"); #endif - fprintf(fff, "\n"); + fprintf(fff, "\n"); } - /*! * @brief 撃破モンスターの情報をファイルにダンプする * @param fff ファイルポインタ @@ -291,83 +280,77 @@ static void dump_aux_arena(player_type *creature_ptr, FILE *fff) */ static void dump_aux_monsters(player_type *creature_ptr, FILE *fff) { - fprintf(fff, _("\n [倒したモンスター]\n\n", "\n [Defeated Monsters]\n\n")); - - /* Allocate the "who" array */ - MONRACE_IDX *who; - u16b why = 2; - C_MAKE(who, max_r_idx, MONRACE_IDX); - - /* Count monster kills */ - long uniq_total = 0; - long norm_total = 0; - for (IDX k = 1; k < max_r_idx; k++) - { - /* Ignore unused index */ - monster_race *r_ptr = &r_info[k]; - if (!r_ptr->name) continue; - - if (r_ptr->flags1 & RF1_UNIQUE) - { - bool dead = (r_ptr->max_num == 0); - if (dead) - { - norm_total++; - - /* Add a unique monster to the list */ - who[uniq_total++] = k; - } - - continue; - } - - if (r_ptr->r_pkills > 0) - { - norm_total += r_ptr->r_pkills; - } - } - - /* No monsters is defeated */ - if (norm_total < 1) - { - fprintf(fff, _("まだ敵を倒していません。\n", "You have defeated no enemies yet.\n")); - C_KILL(who, max_r_idx, s16b); - return; - } - - /* Defeated more than one normal monsters */ - if (uniq_total == 0) - { + fprintf(fff, _("\n [倒したモンスター]\n\n", "\n [Defeated Monsters]\n\n")); + + /* Allocate the "who" array */ + MONRACE_IDX *who; + u16b why = 2; + C_MAKE(who, max_r_idx, MONRACE_IDX); + + /* Count monster kills */ + long uniq_total = 0; + long norm_total = 0; + for (IDX k = 1; k < max_r_idx; k++) { + /* Ignore unused index */ + monster_race *r_ptr = &r_info[k]; + if (!r_ptr->name) + continue; + + if (r_ptr->flags1 & RF1_UNIQUE) { + bool dead = (r_ptr->max_num == 0); + if (dead) { + norm_total++; + + /* Add a unique monster to the list */ + who[uniq_total++] = k; + } + + continue; + } + + if (r_ptr->r_pkills > 0) { + norm_total += r_ptr->r_pkills; + } + } + + /* No monsters is defeated */ + if (norm_total < 1) { + fprintf(fff, _("まだ敵を倒していません。\n", "You have defeated no enemies yet.\n")); + C_KILL(who, max_r_idx, s16b); + return; + } + + /* Defeated more than one normal monsters */ + if (uniq_total == 0) { #ifdef JP - fprintf(fff, "%ld体の敵を倒しています。\n", norm_total); + fprintf(fff, "%ld体の敵を倒しています。\n", norm_total); #else - fprintf(fff, "You have defeated %ld %s.\n", norm_total, norm_total == 1 ? "enemy" : "enemies"); + fprintf(fff, "You have defeated %ld %s.\n", norm_total, norm_total == 1 ? "enemy" : "enemies"); #endif - C_KILL(who, max_r_idx, s16b); - return; - } + C_KILL(who, max_r_idx, s16b); + return; + } - /* Defeated more than one unique monsters */ + /* Defeated more than one unique monsters */ #ifdef JP - fprintf(fff, "%ld体のユニーク・モンスターを含む、合計%ld体の敵を倒しています。\n", uniq_total, norm_total); + fprintf(fff, "%ld体のユニーク・モンスターを含む、合計%ld体の敵を倒しています。\n", uniq_total, norm_total); #else - fprintf(fff, "You have defeated %ld %s including %ld unique monster%s in total.\n", norm_total, norm_total == 1 ? "enemy" : "enemies", uniq_total, (uniq_total == 1 ? "" : "s")); + fprintf(fff, "You have defeated %ld %s including %ld unique monster%s in total.\n", norm_total, norm_total == 1 ? "enemy" : "enemies", uniq_total, + (uniq_total == 1 ? "" : "s")); #endif - /* Sort the array by dungeon depth of monsters */ - ang_sort(creature_ptr, who, &why, uniq_total, ang_sort_comp_hook, ang_sort_swap_hook); - fprintf(fff, _("\n《上位%ld体のユニーク・モンスター》\n", "\n< Unique monsters top %ld >\n"), MIN(uniq_total, 10)); + /* Sort the array by dungeon depth of monsters */ + ang_sort(creature_ptr, who, &why, uniq_total, ang_sort_comp_hook, ang_sort_swap_hook); + fprintf(fff, _("\n《上位%ld体のユニーク・モンスター》\n", "\n< Unique monsters top %ld >\n"), MIN(uniq_total, 10)); - for (IDX k = uniq_total - 1; k >= 0 && k >= uniq_total - 10; k--) - { - monster_race *r_ptr = &r_info[who[k]]; - fprintf(fff, _(" %-40s (レベル%3d)\n", " %-40s (level %3d)\n"), (r_name + r_ptr->name), (int)r_ptr->level); - } + for (IDX k = uniq_total - 1; k >= 0 && k >= uniq_total - 10; k--) { + monster_race *r_ptr = &r_info[who[k]]; + fprintf(fff, _(" %-40s (レベル%3d)\n", " %-40s (level %3d)\n"), (r_name + r_ptr->name), (int)r_ptr->level); + } - C_KILL(who, max_r_idx, s16b); + C_KILL(who, max_r_idx, s16b); } - /*! * @brief 元種族情報をファイルにダンプする * @param creature_ptr プレーヤーへの参照ポインタ @@ -376,28 +359,27 @@ static void dump_aux_monsters(player_type *creature_ptr, FILE *fff) */ static void dump_aux_race_history(player_type *creature_ptr, FILE *fff) { - if (!creature_ptr->old_race1 && !creature_ptr->old_race2) return; - - fprintf(fff, _("\n\n あなたは%sとして生まれた。", "\n\n You were born as %s."), race_info[creature_ptr->start_race].title); - for (int i = 0; i < MAX_RACES; i++) - { - if (creature_ptr->start_race == i) continue; - if (i < 32) - { - if (!(creature_ptr->old_race1 & 1L << i)) continue; - } - else - { - if (!(creature_ptr->old_race2 & 1L << (i - 32))) continue; - } - - fprintf(fff, _("\n あなたはかつて%sだった。", "\n You were a %s before."), race_info[i].title); - } - - fputc('\n', fff); + if (!creature_ptr->old_race1 && !creature_ptr->old_race2) + return; + + fprintf(fff, _("\n\n あなたは%sとして生まれた。", "\n\n You were born as %s."), race_info[creature_ptr->start_race].title); + for (int i = 0; i < MAX_RACES; i++) { + if (creature_ptr->start_race == i) + continue; + if (i < 32) { + if (!(creature_ptr->old_race1 & 1L << i)) + continue; + } else { + if (!(creature_ptr->old_race2 & 1L << (i - 32))) + continue; + } + + fprintf(fff, _("\n あなたはかつて%sだった。", "\n You were a %s before."), race_info[i].title); + } + + fputc('\n', fff); } - /*! * @brief 元魔法領域情報をファイルにダンプする * @param creature_ptr プレーヤーへの参照ポインタ @@ -406,19 +388,19 @@ static void dump_aux_race_history(player_type *creature_ptr, FILE *fff) */ static void dump_aux_realm_history(player_type *creature_ptr, FILE *fff) { - if (creature_ptr->old_realm) return; + if (creature_ptr->old_realm) + return; - fputc('\n', fff); - for (int i = 0; i < MAX_MAGIC; i++) - { - if (!(creature_ptr->old_realm & 1L << i)) continue; - fprintf(fff, _("\n あなたはかつて%s魔法を使えた。", "\n You were able to use %s magic before."), realm_names[i + 1]); - } + fputc('\n', fff); + for (int i = 0; i < MAX_MAGIC; i++) { + if (!(creature_ptr->old_realm & 1L << i)) + continue; + fprintf(fff, _("\n あなたはかつて%s魔法を使えた。", "\n You were able to use %s magic before."), realm_names[i + 1]); + } - fputc('\n', fff); + fputc('\n', fff); } - /*! * @brief 徳の情報をファイルにダンプする * @param creature_ptr プレーヤーへの参照ポインタ @@ -427,33 +409,36 @@ static void dump_aux_realm_history(player_type *creature_ptr, FILE *fff) */ static void dump_aux_virtues(player_type *creature_ptr, FILE *fff) { - fprintf(fff, _("\n\n [自分に関する情報]\n\n", "\n\n [HP-rate & Max stat & Virtues]\n\n")); + fprintf(fff, _("\n\n [自分に関する情報]\n\n", "\n\n [HP-rate & Max stat & Virtues]\n\n")); - int percent = (int)(((long)creature_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) / - (2 * creature_ptr->hitdie + - ((PY_MAX_LEVEL - 1 + 3) * (creature_ptr->hitdie + 1)))); + int percent + = (int)(((long)creature_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) / (2 * creature_ptr->hitdie + ((PY_MAX_LEVEL - 1 + 3) * (creature_ptr->hitdie + 1)))); #ifdef JP - if (creature_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "現在の体力ランク : %d/100\n\n", percent); - else fprintf(fff, "現在の体力ランク : ???\n\n"); - fprintf(fff, "能力の最大値\n"); + if (creature_ptr->knowledge & KNOW_HPRATE) + fprintf(fff, "現在の体力ランク : %d/100\n\n", percent); + else + fprintf(fff, "現在の体力ランク : ???\n\n"); + fprintf(fff, "能力の最大値\n"); #else - if (creature_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent); - else fprintf(fff, "Your current Life Rating is ???.\n\n"); - fprintf(fff, "Limits of maximum stats\n"); + if (creature_ptr->knowledge & KNOW_HPRATE) + fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent); + else + fprintf(fff, "Your current Life Rating is ???.\n\n"); + fprintf(fff, "Limits of maximum stats\n"); #endif - for (int v_nr = 0; v_nr < A_MAX; v_nr++) - { - if ((creature_ptr->knowledge & KNOW_STAT) || creature_ptr->stat_max[v_nr] == creature_ptr->stat_max_max[v_nr]) fprintf(fff, "%s 18/%d\n", stat_names[v_nr], creature_ptr->stat_max_max[v_nr] - 18); - else fprintf(fff, "%s ???\n", stat_names[v_nr]); - } - - fprintf(fff, _("\n属性 : %s\n", "\nYour alignment : %s\n"), your_alignment(creature_ptr)); - fprintf(fff, "\n"); - dump_virtues(creature_ptr, fff); + for (int v_nr = 0; v_nr < A_MAX; v_nr++) { + if ((creature_ptr->knowledge & KNOW_STAT) || creature_ptr->stat_max[v_nr] == creature_ptr->stat_max_max[v_nr]) + fprintf(fff, "%s 18/%d\n", stat_names[v_nr], creature_ptr->stat_max_max[v_nr] - 18); + else + fprintf(fff, "%s ???\n", stat_names[v_nr]); + } + + fprintf(fff, _("\n属性 : %s\n", "\nYour alignment : %s\n"), your_alignment(creature_ptr)); + fprintf(fff, "\n"); + dump_virtues(creature_ptr, fff); } - /*! * @brief 突然変異の情報をファイルにダンプする * @param creature_ptr プレーヤーへの参照ポインタ @@ -462,14 +447,12 @@ static void dump_aux_virtues(player_type *creature_ptr, FILE *fff) */ static void dump_aux_mutations(player_type *creature_ptr, FILE *fff) { - if (creature_ptr->muta1 || creature_ptr->muta2 || creature_ptr->muta3) - { - fprintf(fff, _("\n\n [突然変異]\n\n", "\n\n [Mutations]\n\n")); - dump_mutations(creature_ptr, fff); - } + if (creature_ptr->muta1 || creature_ptr->muta2 || creature_ptr->muta3) { + fprintf(fff, _("\n\n [突然変異]\n\n", "\n\n [Mutations]\n\n")); + dump_mutations(creature_ptr, fff); + } } - /*! * @brief 所持品の情報をファイルにダンプする * @param creature_ptr プレーヤーへの参照ポインタ @@ -478,36 +461,32 @@ static void dump_aux_mutations(player_type *creature_ptr, FILE *fff) */ static void dump_aux_equipment_inventory(player_type *creature_ptr, FILE *fff) { - GAME_TEXT o_name[MAX_NLEN]; - if (creature_ptr->equip_cnt) - { - fprintf(fff, _(" [キャラクタの装備]\n\n", " [Character Equipment]\n\n")); - for (int i = INVEN_RARM; i < INVEN_TOTAL; i++) - { - object_desc(creature_ptr, o_name, &creature_ptr->inventory_list[i], 0); - if ((((i == INVEN_RARM) && creature_ptr->hidarite) || ((i == INVEN_LARM) && creature_ptr->migite)) && creature_ptr->ryoute) - strcpy(o_name, _("(武器を両手持ち)", "(wielding with two-hands)")); - - fprintf(fff, "%c) %s\n", - index_to_label(i), o_name); - } - - fprintf(fff, "\n\n"); - } - - fprintf(fff, _(" [キャラクタの持ち物]\n\n", " [Character Inventory]\n\n")); - - for (int i = 0; i < INVEN_PACK; i++) - { - if (!creature_ptr->inventory_list[i].k_idx) break; - object_desc(creature_ptr, o_name, &creature_ptr->inventory_list[i], 0); - fprintf(fff, "%c) %s\n", index_to_label(i), o_name); - } - - fprintf(fff, "\n\n"); + GAME_TEXT o_name[MAX_NLEN]; + if (creature_ptr->equip_cnt) { + fprintf(fff, _(" [キャラクタの装備]\n\n", " [Character Equipment]\n\n")); + for (int i = INVEN_RARM; i < INVEN_TOTAL; i++) { + describe_flavor(creature_ptr, o_name, &creature_ptr->inventory_list[i], 0); + if ((((i == INVEN_RARM) && creature_ptr->hidarite) || ((i == INVEN_LARM) && creature_ptr->migite)) && creature_ptr->ryoute) + strcpy(o_name, _("(武器を両手持ち)", "(wielding with two-hands)")); + + fprintf(fff, "%c) %s\n", index_to_label(i), o_name); + } + + fprintf(fff, "\n\n"); + } + + fprintf(fff, _(" [キャラクタの持ち物]\n\n", " [Character Inventory]\n\n")); + + for (int i = 0; i < INVEN_PACK; i++) { + if (!creature_ptr->inventory_list[i].k_idx) + break; + describe_flavor(creature_ptr, o_name, &creature_ptr->inventory_list[i], 0); + fprintf(fff, "%c) %s\n", index_to_label(i), o_name); + } + + fprintf(fff, "\n\n"); } - /*! * @brief 我が家と博物館のオブジェクト情報をファイルにダンプする * @param fff ファイルポインタ @@ -515,50 +494,49 @@ static void dump_aux_equipment_inventory(player_type *creature_ptr, FILE *fff) */ static void dump_aux_home_museum(player_type *creature_ptr, FILE *fff) { - store_type *store_ptr; - store_ptr = &town_info[1].store[STORE_HOME]; + store_type *store_ptr; + store_ptr = &town_info[1].store[STORE_HOME]; - GAME_TEXT o_name[MAX_NLEN]; - if (store_ptr->stock_num) - { - fprintf(fff, _(" [我が家のアイテム]\n", " [Home Inventory]\n")); + GAME_TEXT o_name[MAX_NLEN]; + if (store_ptr->stock_num) { + fprintf(fff, _(" [我が家のアイテム]\n", " [Home Inventory]\n")); - TERM_LEN x = 1; - for (int i = 0; i < store_ptr->stock_num; i++) - { - if ((i % 12) == 0) - fprintf(fff, _("\n ( %d ページ )\n", "\n ( page %d )\n"), x++); - object_desc(creature_ptr, o_name, &store_ptr->stock[i], 0); - fprintf(fff, "%c) %s\n", I2A(i % 12), o_name); - } + TERM_LEN x = 1; + for (int i = 0; i < store_ptr->stock_num; i++) { + if ((i % 12) == 0) + fprintf(fff, _("\n ( %d ページ )\n", "\n ( page %d )\n"), x++); + describe_flavor(creature_ptr, o_name, &store_ptr->stock[i], 0); + fprintf(fff, "%c) %s\n", I2A(i % 12), o_name); + } - fprintf(fff, "\n\n"); - } + fprintf(fff, "\n\n"); + } - store_ptr = &town_info[1].store[STORE_MUSEUM]; + store_ptr = &town_info[1].store[STORE_MUSEUM]; - if (store_ptr->stock_num == 0) return; + if (store_ptr->stock_num == 0) + return; - fprintf(fff, _(" [博物館のアイテム]\n", " [Museum]\n")); + fprintf(fff, _(" [博物館のアイテム]\n", " [Museum]\n")); - TERM_LEN x = 1; - for (int i = 0; i < store_ptr->stock_num; i++) - { + TERM_LEN x = 1; + for (int i = 0; i < store_ptr->stock_num; i++) { #ifdef JP - if ((i % 12) == 0) fprintf(fff, "\n ( %d ページ )\n", x++); - object_desc(creature_ptr, o_name, &store_ptr->stock[i], 0); - fprintf(fff, "%c) %s\n", I2A(i % 12), o_name); + if ((i % 12) == 0) + fprintf(fff, "\n ( %d ページ )\n", x++); + describe_flavor(creature_ptr, o_name, &store_ptr->stock[i], 0); + fprintf(fff, "%c) %s\n", I2A(i % 12), o_name); #else - if ((i % 12) == 0) fprintf(fff, "\n ( page %d )\n", x++); - object_desc(creature_ptr, o_name, &st_ptr->stock[i], 0); - fprintf(fff, "%c) %s\n", I2A(i % 12), o_name); + if ((i % 12) == 0) + fprintf(fff, "\n ( page %d )\n", x++); + describe_flavor(creature_ptr, o_name, &st_ptr->stock[i], 0); + fprintf(fff, "%c) %s\n", I2A(i % 12), o_name); #endif - } + } - fprintf(fff, "\n\n"); + fprintf(fff, "\n\n"); } - /*! * @brief ダンプ出力のメインルーチン * Output the character dump to a file @@ -566,28 +544,28 @@ static void dump_aux_home_museum(player_type *creature_ptr, FILE *fff) * @param fff ファイルポインタ * @return エラーコード */ -void make_character_dump(player_type *creature_ptr, FILE *fff, void(*update_playtime)(void), display_player_pf display_player) +void make_character_dump(player_type *creature_ptr, FILE *fff, void (*update_playtime)(void), display_player_pf display_player) { - fprintf(fff, _(" [変愚蛮怒 %d.%d.%d キャラクタ情報]\n\n", " [Hengband %d.%d.%d Character Dump]\n\n"), - FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH); - (*update_playtime)(); - - dump_aux_player_status(creature_ptr, fff, display_player); - dump_aux_last_message(creature_ptr, fff); - dump_aux_options(fff); - dump_aux_recall(fff); - dump_aux_quest(creature_ptr, fff); - dump_aux_arena(creature_ptr, fff); - dump_aux_monsters(creature_ptr, fff); - dump_aux_virtues(creature_ptr, fff); - dump_aux_race_history(creature_ptr, fff); - dump_aux_realm_history(creature_ptr, fff); - dump_aux_class_special(creature_ptr, fff); - dump_aux_mutations(creature_ptr, fff); - dump_aux_pet(creature_ptr, fff); - fputs("\n\n", fff); - dump_aux_equipment_inventory(creature_ptr, fff); - dump_aux_home_museum(creature_ptr, fff); - - fprintf(fff, _(" [チェックサム: \"%s\"]\n\n", " [Check Sum: \"%s\"]\n\n"), get_check_sum()); + fprintf( + fff, _(" [変愚蛮怒 %d.%d.%d キャラクタ情報]\n\n", " [Hengband %d.%d.%d Character Dump]\n\n"), FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH); + (*update_playtime)(); + + dump_aux_player_status(creature_ptr, fff, display_player); + dump_aux_last_message(creature_ptr, fff); + dump_aux_options(fff); + dump_aux_recall(fff); + dump_aux_quest(creature_ptr, fff); + dump_aux_arena(creature_ptr, fff); + dump_aux_monsters(creature_ptr, fff); + dump_aux_virtues(creature_ptr, fff); + dump_aux_race_history(creature_ptr, fff); + dump_aux_realm_history(creature_ptr, fff); + dump_aux_class_special(creature_ptr, fff); + dump_aux_mutations(creature_ptr, fff); + dump_aux_pet(creature_ptr, fff); + fputs("\n\n", fff); + dump_aux_equipment_inventory(creature_ptr, fff); + dump_aux_home_museum(creature_ptr, fff); + + fprintf(fff, _(" [チェックサム: \"%s\"]\n\n", " [Check Sum: \"%s\"]\n\n"), get_check_sum()); } diff --git a/src/io/targeting.c b/src/io/targeting.c index 3f03c901f..023a3bd84 100644 --- a/src/io/targeting.c +++ b/src/io/targeting.c @@ -20,6 +20,7 @@ #include "dungeon/dungeon.h" #include "dungeon/quest.h" #include "effect/spells-effect-util.h" +#include "flavor/flavor-describer.h" #include "floor/floor-events.h" #include "floor/floor-object.h" #include "floor/floor-town.h" @@ -52,7 +53,6 @@ #include "monster/monster-update.h" #include "monster/smart-learn-types.h" #include "object-enchant/object-curse.h" -#include "object/object-flavor.h" #include "object/object-kind-hook.h" #include "object/object-mark-types.h" #include "player/player-move.h" @@ -704,7 +704,7 @@ static char target_set_aux(player_type *subject_ptr, POSITION y, POSITION x, BIT o_ptr = &subject_ptr->current_floor_ptr->o_list[this_o_idx]; next_o_idx = o_ptr->next_o_idx; - object_desc(subject_ptr, o_name, o_ptr, 0); + describe_flavor(subject_ptr, o_name, o_ptr, 0); #ifdef JP sprintf(out_val, "%s%s%s%s[%s]", s1, o_name, s2, s3, info); @@ -747,7 +747,7 @@ static char target_set_aux(player_type *subject_ptr, POSITION y, POSITION x, BIT object_type *o_ptr; o_ptr = &subject_ptr->current_floor_ptr->o_list[floor_list[0]]; - object_desc(subject_ptr, o_name, o_ptr, 0); + describe_flavor(subject_ptr, o_name, o_ptr, 0); #ifdef JP sprintf(out_val, "%s%s%s%s[%s]", s1, o_name, s2, s3, info); @@ -849,7 +849,7 @@ static char target_set_aux(player_type *subject_ptr, POSITION y, POSITION x, BIT /* Not boring */ boring = FALSE; - object_desc(subject_ptr, o_name, o_ptr, 0); + describe_flavor(subject_ptr, o_name, o_ptr, 0); #ifdef JP sprintf(out_val, "%s%s%s%s[%s]", s1, o_name, s2, s3, info); diff --git a/src/knowledge/knowledge-inventory.c b/src/knowledge/knowledge-inventory.c index 791088816..8b0008c03 100644 --- a/src/knowledge/knowledge-inventory.c +++ b/src/knowledge/knowledge-inventory.c @@ -6,6 +6,7 @@ #include "knowledge/knowledge-inventory.h" #include "core/show-file.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-town.h" #include "inventory/inventory-slot-types.h" @@ -15,7 +16,6 @@ #include "object-hook/hook-enchant.h" #include "object-hook/hook-weapon.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "perception/object-perception.h" #include "store/store-util.h" #include "sv-definition/sv-amulet-types.h" @@ -24,14 +24,12 @@ #include "util/angband-files.h" #include "util/bit-flags-calculator.h" -static concptr inven_res_label = _( - " 酸電火冷毒光闇破轟獄因沌劣 盲怖乱痺透命感消復浮", - " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv"); +static concptr inven_res_label = _(" 酸電火冷毒光闇破轟獄因沌劣 盲怖乱痺透命感消復浮", + " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv"); -#define IM_FLAG_STR _("*", "* ") +#define IM_FLAG_STR _("*", "* ") #define HAS_FLAG_STR _("+", "+ ") -#define NO_FLAG_STR _("・", ". ") - +#define NO_FLAG_STR _("・", ". ") /*! * @brief 4元素耐性を表示する @@ -43,11 +41,9 @@ static concptr inven_res_label = _( */ static void print_im_or_res_flag(int immunity, int resistance, BIT_FLAGS *flags, FILE *fff) { - fputs(have_flag(flags, immunity) ? IM_FLAG_STR : - (have_flag(flags, resistance) ? HAS_FLAG_STR : NO_FLAG_STR), fff); + fputs(have_flag(flags, immunity) ? IM_FLAG_STR : (have_flag(flags, resistance) ? HAS_FLAG_STR : NO_FLAG_STR), fff); } - /*! * @brief 4元素以外の耐性を表示する * @param tr 耐性 @@ -55,11 +51,7 @@ static void print_im_or_res_flag(int immunity, int resistance, BIT_FLAGS *flags, * @param fff 一時ファイルへのポインタ * @return なし */ -static void print_flag(int tr, BIT_FLAGS *flags, FILE *fff) -{ - fputs(have_flag(flags, tr) ? HAS_FLAG_STR : NO_FLAG_STR, fff); -} - +static void print_flag(int tr, BIT_FLAGS *flags, FILE *fff) { fputs(have_flag(flags, tr) ? HAS_FLAG_STR : NO_FLAG_STR, fff); } /*! * @brief 特殊なアイテムかどうかを調べる @@ -69,18 +61,13 @@ static void print_flag(int tr, BIT_FLAGS *flags, FILE *fff) */ static bool determine_spcial_item_type(object_type *o_ptr, tval_type tval) { - bool is_special_item_type = (object_is_wearable(o_ptr) && object_is_ego(o_ptr)) - || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE)) - || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY)) - || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) - || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) - || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) - || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)) - || object_is_artifact(o_ptr); - - return is_special_item_type; -} + bool is_special_item_type = (object_is_wearable(o_ptr) && object_is_ego(o_ptr)) || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE)) + || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY)) || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) + || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) + || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)) || object_is_artifact(o_ptr); + return is_special_item_type; +} /*! * @brief アイテムに耐性の表示をする必要があるかを判定する @@ -90,15 +77,18 @@ static bool determine_spcial_item_type(object_type *o_ptr, tval_type tval) */ static bool check_item_knowledge(object_type *o_ptr, tval_type tval) { - if (o_ptr->k_idx == 0) return FALSE; - if (o_ptr->tval != tval) return FALSE; - if (!object_is_known(o_ptr)) return FALSE; - if (!determine_spcial_item_type(o_ptr, tval)) return FALSE; - - return TRUE; + if (o_ptr->k_idx == 0) + return FALSE; + if (o_ptr->tval != tval) + return FALSE; + if (!object_is_known(o_ptr)) + return FALSE; + if (!determine_spcial_item_type(o_ptr, tval)) + return FALSE; + + return TRUE; } - /*! * todo ここの関数から表示用の関数に移したい * @brief 鑑定済アイテムの耐性を表示する @@ -108,40 +98,39 @@ static bool check_item_knowledge(object_type *o_ptr, tval_type tval) */ static void display_identified_resistances_flag(player_type *creature_ptr, object_type *o_ptr, FILE *fff) { - BIT_FLAGS flags[TR_FLAG_SIZE]; + BIT_FLAGS flags[TR_FLAG_SIZE]; object_flags_known(creature_ptr, o_ptr, flags); - print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID, flags, fff); - print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC, flags, fff); - print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE, flags, fff); - print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD, flags, fff); - print_flag(TR_RES_POIS, flags, fff); - print_flag(TR_RES_LITE, flags, fff); - print_flag(TR_RES_DARK, flags, fff); - print_flag(TR_RES_SHARDS, flags, fff); - print_flag(TR_RES_SOUND, flags, fff); - print_flag(TR_RES_NETHER, flags, fff); - print_flag(TR_RES_NEXUS, flags, fff); - print_flag(TR_RES_CHAOS, flags, fff); - print_flag(TR_RES_DISEN, flags, fff); - - fputs(" ", fff); - - print_flag(TR_RES_BLIND, flags, fff); - print_flag(TR_RES_FEAR, flags, fff); - print_flag(TR_RES_CONF, flags, fff); - print_flag(TR_FREE_ACT, flags, fff); - print_flag(TR_SEE_INVIS, flags, fff); - print_flag(TR_HOLD_EXP, flags, fff); - print_flag(TR_TELEPATHY, flags, fff); - print_flag(TR_SLOW_DIGEST, flags, fff); - print_flag(TR_REGEN, flags, fff); - print_flag(TR_LEVITATION, flags, fff); - - fputc('\n', fff); + print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID, flags, fff); + print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC, flags, fff); + print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE, flags, fff); + print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD, flags, fff); + print_flag(TR_RES_POIS, flags, fff); + print_flag(TR_RES_LITE, flags, fff); + print_flag(TR_RES_DARK, flags, fff); + print_flag(TR_RES_SHARDS, flags, fff); + print_flag(TR_RES_SOUND, flags, fff); + print_flag(TR_RES_NETHER, flags, fff); + print_flag(TR_RES_NEXUS, flags, fff); + print_flag(TR_RES_CHAOS, flags, fff); + print_flag(TR_RES_DISEN, flags, fff); + + fputs(" ", fff); + + print_flag(TR_RES_BLIND, flags, fff); + print_flag(TR_RES_FEAR, flags, fff); + print_flag(TR_RES_CONF, flags, fff); + print_flag(TR_FREE_ACT, flags, fff); + print_flag(TR_SEE_INVIS, flags, fff); + print_flag(TR_HOLD_EXP, flags, fff); + print_flag(TR_TELEPATHY, flags, fff); + print_flag(TR_SLOW_DIGEST, flags, fff); + print_flag(TR_REGEN, flags, fff); + print_flag(TR_LEVITATION, flags, fff); + + fputc('\n', fff); } - /*! * @brief アイテム1つ当たりの耐性を表示する * @param creature_ptr プレーヤーへの参照ポインタ @@ -152,40 +141,36 @@ static void display_identified_resistances_flag(player_type *creature_ptr, objec */ static void do_cmd_knowledge_inventory_aux(player_type *creature_ptr, FILE *fff, object_type *o_ptr, char *where) { - int i = 0; - GAME_TEXT o_name[MAX_NLEN]; - object_desc(creature_ptr, o_name, o_ptr, OD_NAME_ONLY); - while (o_name[i] && (i < 26)) - { + int i = 0; + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(creature_ptr, o_name, o_ptr, OD_NAME_ONLY); + while (o_name[i] && (i < 26)) { #ifdef JP - if (iskanji(o_name[i])) i++; + if (iskanji(o_name[i])) + i++; #endif - i++; - } + i++; + } - if (i < 28) - { - while (i < 28) - { - o_name[i] = ' '; i++; - } - } + if (i < 28) { + while (i < 28) { + o_name[i] = ' '; + i++; + } + } - o_name[i] = '\0'; + o_name[i] = '\0'; - fprintf(fff, "%s %s", where, o_name); + fprintf(fff, "%s %s", where, o_name); - if (!object_is_fully_known(o_ptr)) - { - fputs(_("-------不明--------------- -------不明---------\n", - "-------unknown------------ -------unknown------\n"), fff); - return; - } + if (!object_is_fully_known(o_ptr)) { + fputs(_("-------不明--------------- -------不明---------\n", "-------unknown------------ -------unknown------\n"), fff); + return; + } - display_identified_resistances_flag(creature_ptr, o_ptr, fff); + display_identified_resistances_flag(creature_ptr, o_ptr, fff); } - /*! * @brief 9行おきにラベルを追加する * @param label_number 現在の行数 @@ -194,15 +179,13 @@ static void do_cmd_knowledge_inventory_aux(player_type *creature_ptr, FILE *fff, */ static void add_res_label(int *label_number, FILE *fff) { - (*label_number)++; - if (*label_number == 9) - { - *label_number = 0; - fprintf(fff, "%s\n", inven_res_label); - } + (*label_number)++; + if (*label_number == 9) { + *label_number = 0; + fprintf(fff, "%s\n", inven_res_label); + } } - /*! * @brief 9行ごとに行数をリセットする * @param label_number 現在の行数 @@ -211,18 +194,17 @@ static void add_res_label(int *label_number, FILE *fff) */ static void reset_label_number(int *label_number, FILE *fff) { - if (*label_number == 0) return; + if (*label_number == 0) + return; - for (; *label_number < 9; (*label_number)++) - { - fputc('\n', fff); - } + for (; *label_number < 9; (*label_number)++) { + fputc('\n', fff); + } - *label_number = 0; - fprintf(fff, "%s\n", inven_res_label); + *label_number = 0; + fprintf(fff, "%s\n", inven_res_label); } - /*! * 装備中のアイテムについて、耐性を表示する * @param creature_ptr プレーヤーへの参照ポインタ @@ -233,20 +215,18 @@ static void reset_label_number(int *label_number, FILE *fff) */ static void show_wearing_equipment_resistances(player_type *creature_ptr, tval_type tval, int *label_number, FILE *fff) { - char where[32]; - strcpy(where, _("装", "E ")); - for (int i = INVEN_RARM; i < INVEN_TOTAL; i++) - { - object_type *o_ptr = &creature_ptr->inventory_list[i]; - if (!check_item_knowledge(o_ptr, tval)) - continue; - - do_cmd_knowledge_inventory_aux(creature_ptr, fff, o_ptr, where); - add_res_label(label_number, fff); - } + char where[32]; + strcpy(where, _("装", "E ")); + for (int i = INVEN_RARM; i < INVEN_TOTAL; i++) { + object_type *o_ptr = &creature_ptr->inventory_list[i]; + if (!check_item_knowledge(o_ptr, tval)) + continue; + + do_cmd_knowledge_inventory_aux(creature_ptr, fff, o_ptr, where); + add_res_label(label_number, fff); + } } - /*! * 手持ち中のアイテムについて、耐性を表示する * @param creature_ptr プレーヤーへの参照ポインタ @@ -257,20 +237,18 @@ static void show_wearing_equipment_resistances(player_type *creature_ptr, tval_t */ static void show_holding_equipment_resistances(player_type *creature_ptr, tval_type tval, int *label_number, FILE *fff) { - char where[32]; - strcpy(where, _("持", "I ")); - for (int i = 0; i < INVEN_PACK; i++) - { - object_type *o_ptr = &creature_ptr->inventory_list[i]; - if (!check_item_knowledge(o_ptr, tval)) - continue; - - do_cmd_knowledge_inventory_aux(creature_ptr, fff, o_ptr, where); - add_res_label(label_number, fff); - } + char where[32]; + strcpy(where, _("持", "I ")); + for (int i = 0; i < INVEN_PACK; i++) { + object_type *o_ptr = &creature_ptr->inventory_list[i]; + if (!check_item_knowledge(o_ptr, tval)) + continue; + + do_cmd_knowledge_inventory_aux(creature_ptr, fff, o_ptr, where); + add_res_label(label_number, fff); + } } - /*! * 我が家のアイテムについて、耐性を表示する * @param creature_ptr プレーヤーへの参照ポインタ @@ -281,22 +259,20 @@ static void show_holding_equipment_resistances(player_type *creature_ptr, tval_t */ static void show_home_equipment_resistances(player_type *creature_ptr, tval_type tval, int *label_number, FILE *fff) { - store_type *store_ptr; - store_ptr = &town_info[1].store[STORE_HOME]; - char where[32]; - strcpy(where, _("家", "H ")); - for (int i = 0; i < store_ptr->stock_num; i++) - { - object_type *o_ptr = &store_ptr->stock[i]; - if (!check_item_knowledge(o_ptr, tval)) - continue; - - do_cmd_knowledge_inventory_aux(creature_ptr, fff, o_ptr, where); - add_res_label(label_number, fff); - } + store_type *store_ptr; + store_ptr = &town_info[1].store[STORE_HOME]; + char where[32]; + strcpy(where, _("家", "H ")); + for (int i = 0; i < store_ptr->stock_num; i++) { + object_type *o_ptr = &store_ptr->stock[i]; + if (!check_item_knowledge(o_ptr, tval)) + continue; + + do_cmd_knowledge_inventory_aux(creature_ptr, fff, o_ptr, where); + add_res_label(label_number, fff); + } } - /* * @brief Display *ID* ed weapons/armors's resistances * @param creature_ptr プレーヤーへの参照ポインタ @@ -304,21 +280,21 @@ static void show_home_equipment_resistances(player_type *creature_ptr, tval_type */ void do_cmd_knowledge_inventory(player_type *creature_ptr) { - FILE *fff = NULL; - GAME_TEXT file_name[FILE_NAME_SIZE]; - if (!open_temporary_file(&fff, file_name)) return; - - fprintf(fff, "%s\n", inven_res_label); - int label_number = 0; - for (tval_type tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++) - { - reset_label_number(&label_number, fff); - show_wearing_equipment_resistances(creature_ptr, tval, &label_number, fff); - show_holding_equipment_resistances(creature_ptr, tval, &label_number, fff); - show_home_equipment_resistances(creature_ptr, tval, &label_number, fff); - } - - angband_fclose(fff); - (void)show_file(creature_ptr, TRUE, file_name, _("*鑑定*済み武器/防具の耐性リスト", "Resistances of *identified* equipment"), 0, 0); - fd_kill(file_name); + FILE *fff = NULL; + GAME_TEXT file_name[FILE_NAME_SIZE]; + if (!open_temporary_file(&fff, file_name)) + return; + + fprintf(fff, "%s\n", inven_res_label); + int label_number = 0; + for (tval_type tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++) { + reset_label_number(&label_number, fff); + show_wearing_equipment_resistances(creature_ptr, tval, &label_number, fff); + show_holding_equipment_resistances(creature_ptr, tval, &label_number, fff); + show_home_equipment_resistances(creature_ptr, tval, &label_number, fff); + } + + angband_fclose(fff); + (void)show_file(creature_ptr, TRUE, file_name, _("*鑑定*済み武器/防具の耐性リスト", "Resistances of *identified* equipment"), 0, 0); + fd_kill(file_name); } diff --git a/src/knowledge/knowledge-items.c b/src/knowledge/knowledge-items.c index b5022d2a7..d22ee0faf 100644 --- a/src/knowledge/knowledge-items.c +++ b/src/knowledge/knowledge-items.c @@ -7,6 +7,7 @@ #include "knowledge/knowledge-items.h" #include "core/show-file.h" #include "core/stuff-handler.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor.h" #include "game-option/special-options.h" @@ -41,90 +42,90 @@ */ void do_cmd_knowledge_artifacts(player_type *player_ptr) { - FILE *fff = NULL; - GAME_TEXT file_name[FILE_NAME_SIZE]; - if (!open_temporary_file(&fff, file_name)) return; - - ARTIFACT_IDX *who; - C_MAKE(who, max_a_idx, ARTIFACT_IDX); - bool *okay; - C_MAKE(okay, max_a_idx, bool); - - for (ARTIFACT_IDX k = 0; k < max_a_idx; k++) - { - artifact_type *a_ptr = &a_info[k]; - okay[k] = FALSE; - if (!a_ptr->name) continue; - if (!a_ptr->cur_num) continue; - - okay[k] = TRUE; - } - - for (POSITION y = 0; y < player_ptr->current_floor_ptr->height; y++) - { - for (POSITION x = 0; x < player_ptr->current_floor_ptr->width; x++) - { - grid_type *g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x]; - OBJECT_IDX this_o_idx, next_o_idx = 0; - for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) - { - object_type *o_ptr; - o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx]; - next_o_idx = o_ptr->next_o_idx; - if (!object_is_fixed_artifact(o_ptr)) continue; - if (object_is_known(o_ptr)) continue; - - okay[o_ptr->name1] = FALSE; - } - } - } - - for (ARTIFACT_IDX i = 0; i < INVEN_TOTAL; i++) - { - object_type *o_ptr = &player_ptr->inventory_list[i]; - if (!o_ptr->k_idx) continue; - if (!object_is_fixed_artifact(o_ptr)) continue; - if (object_is_known(o_ptr)) continue; - - okay[o_ptr->name1] = FALSE; - } - - int n = 0; - for (ARTIFACT_IDX k = 0; k < max_a_idx; k++) - { - if (okay[k]) who[n++] = k; - } - - u16b why = 3; - ang_sort(player_ptr, who, &why, n, ang_sort_art_comp, ang_sort_art_swap); - for (ARTIFACT_IDX k = 0; k < n; k++) - { - artifact_type *a_ptr = &a_info[who[k]]; - GAME_TEXT base_name[MAX_NLEN]; - strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact")); - ARTIFACT_IDX z = lookup_kind(a_ptr->tval, a_ptr->sval); - if (z) - { - object_type forge; - object_type *q_ptr; - q_ptr = &forge; - object_prep(player_ptr, q_ptr, z); - q_ptr->name1 = (byte)who[k]; - q_ptr->ident |= IDENT_STORE; - object_desc(player_ptr, base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - } - - fprintf(fff, _(" %s\n", " The %s\n"), base_name); - } - - C_KILL(who, max_a_idx, ARTIFACT_IDX); - C_KILL(okay, max_a_idx, bool); - angband_fclose(fff); - (void)show_file(player_ptr, TRUE, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0); - fd_kill(file_name); + FILE *fff = NULL; + GAME_TEXT file_name[FILE_NAME_SIZE]; + if (!open_temporary_file(&fff, file_name)) + return; + + ARTIFACT_IDX *who; + C_MAKE(who, max_a_idx, ARTIFACT_IDX); + bool *okay; + C_MAKE(okay, max_a_idx, bool); + + for (ARTIFACT_IDX k = 0; k < max_a_idx; k++) { + artifact_type *a_ptr = &a_info[k]; + okay[k] = FALSE; + if (!a_ptr->name) + continue; + if (!a_ptr->cur_num) + continue; + + okay[k] = TRUE; + } + + for (POSITION y = 0; y < player_ptr->current_floor_ptr->height; y++) { + for (POSITION x = 0; x < player_ptr->current_floor_ptr->width; x++) { + grid_type *g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x]; + OBJECT_IDX this_o_idx, next_o_idx = 0; + for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) { + object_type *o_ptr; + o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx]; + next_o_idx = o_ptr->next_o_idx; + if (!object_is_fixed_artifact(o_ptr)) + continue; + if (object_is_known(o_ptr)) + continue; + + okay[o_ptr->name1] = FALSE; + } + } + } + + for (ARTIFACT_IDX i = 0; i < INVEN_TOTAL; i++) { + object_type *o_ptr = &player_ptr->inventory_list[i]; + if (!o_ptr->k_idx) + continue; + if (!object_is_fixed_artifact(o_ptr)) + continue; + if (object_is_known(o_ptr)) + continue; + + okay[o_ptr->name1] = FALSE; + } + + int n = 0; + for (ARTIFACT_IDX k = 0; k < max_a_idx; k++) { + if (okay[k]) + who[n++] = k; + } + + u16b why = 3; + ang_sort(player_ptr, who, &why, n, ang_sort_art_comp, ang_sort_art_swap); + for (ARTIFACT_IDX k = 0; k < n; k++) { + artifact_type *a_ptr = &a_info[who[k]]; + GAME_TEXT base_name[MAX_NLEN]; + strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact")); + ARTIFACT_IDX z = lookup_kind(a_ptr->tval, a_ptr->sval); + if (z) { + object_type forge; + object_type *q_ptr; + q_ptr = &forge; + object_prep(player_ptr, q_ptr, z); + q_ptr->name1 = (byte)who[k]; + q_ptr->ident |= IDENT_STORE; + describe_flavor(player_ptr, base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + } + + fprintf(fff, _(" %s\n", " The %s\n"), base_name); + } + + C_KILL(who, max_a_idx, ARTIFACT_IDX); + C_KILL(okay, max_a_idx, bool); + angband_fclose(fff); + (void)show_file(player_ptr, TRUE, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0); + fd_kill(file_name); } - /* * Build a list of object indexes in the given group. Return the number * of objects in the group. @@ -134,364 +135,316 @@ void do_cmd_knowledge_artifacts(player_type *player_ptr) */ static KIND_OBJECT_IDX collect_objects(int grp_cur, KIND_OBJECT_IDX object_idx[], BIT_FLAGS8 mode) { - KIND_OBJECT_IDX object_cnt = 0; - byte group_tval = object_group_tval[grp_cur]; - for (KIND_OBJECT_IDX i = 0; i < max_k_idx; i++) - { - object_kind *k_ptr = &k_info[i]; - if (!k_ptr->name) continue; - - if (!(mode & 0x02)) - { - if (!current_world_ptr->wizard) - { - if (!k_ptr->flavor) continue; - if (!k_ptr->aware) continue; - } - - int k = 0; - for (int j = 0; j < 4; j++) - k += k_ptr->chance[j]; - if (!k) continue; - } - - if (TV_LIFE_BOOK == group_tval) - { - if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HEX_BOOK) - { - object_idx[object_cnt++] = i; - } - else - continue; - } - else if (k_ptr->tval == group_tval) - { - object_idx[object_cnt++] = i; - } - else - continue; - - if (mode & 0x01) break; - } - - object_idx[object_cnt] = -1; - return object_cnt; + KIND_OBJECT_IDX object_cnt = 0; + byte group_tval = object_group_tval[grp_cur]; + for (KIND_OBJECT_IDX i = 0; i < max_k_idx; i++) { + object_kind *k_ptr = &k_info[i]; + if (!k_ptr->name) + continue; + + if (!(mode & 0x02)) { + if (!current_world_ptr->wizard) { + if (!k_ptr->flavor) + continue; + if (!k_ptr->aware) + continue; + } + + int k = 0; + for (int j = 0; j < 4; j++) + k += k_ptr->chance[j]; + if (!k) + continue; + } + + if (TV_LIFE_BOOK == group_tval) { + if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HEX_BOOK) { + object_idx[object_cnt++] = i; + } else + continue; + } else if (k_ptr->tval == group_tval) { + object_idx[object_cnt++] = i; + } else + continue; + + if (mode & 0x01) + break; + } + + object_idx[object_cnt] = -1; + return object_cnt; } - /* * Display the objects in a group. */ -static void display_object_list(int col, int row, int per_page, IDX object_idx[], - int object_cur, int object_top, bool visual_only) +static void display_object_list(int col, int row, int per_page, IDX object_idx[], int object_cur, int object_top, bool visual_only) { - int i; - for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++) - { - GAME_TEXT o_name[MAX_NLEN]; - TERM_COLOR a; - SYMBOL_CODE c; - object_kind *flavor_k_ptr; - KIND_OBJECT_IDX k_idx = object_idx[object_top + i]; - object_kind *k_ptr = &k_info[k_idx]; - TERM_COLOR attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE); - byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE); - if (!visual_only && k_ptr->flavor) - { - flavor_k_ptr = &k_info[k_ptr->flavor]; - } - else - { - flavor_k_ptr = k_ptr; - } - - attr = ((i + object_top == object_cur) ? cursor : attr); - if (!k_ptr->flavor || (!visual_only && k_ptr->aware)) - { - strip_name(o_name, k_idx); - } - else - { - strcpy(o_name, k_name + flavor_k_ptr->flavor_name); - } - - c_prt(attr, o_name, row + i, col); - if (per_page == 1) - { - c_prt(attr, format("%02x/%02x", flavor_k_ptr->x_attr, flavor_k_ptr->x_char), row + i, (current_world_ptr->wizard || visual_only) ? 64 : 68); - } - - if (current_world_ptr->wizard || visual_only) - { - c_prt(attr, format("%d", k_idx), row + i, 70); - } - - a = flavor_k_ptr->x_attr; - c = flavor_k_ptr->x_char; - - Term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0); - } - - for (; i < per_page; i++) - { - Term_erase(col, row + i, 255); - } + int i; + for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++) { + GAME_TEXT o_name[MAX_NLEN]; + TERM_COLOR a; + SYMBOL_CODE c; + object_kind *flavor_k_ptr; + KIND_OBJECT_IDX k_idx = object_idx[object_top + i]; + object_kind *k_ptr = &k_info[k_idx]; + TERM_COLOR attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE); + byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE); + if (!visual_only && k_ptr->flavor) { + flavor_k_ptr = &k_info[k_ptr->flavor]; + } else { + flavor_k_ptr = k_ptr; + } + + attr = ((i + object_top == object_cur) ? cursor : attr); + if (!k_ptr->flavor || (!visual_only && k_ptr->aware)) { + strip_name(o_name, k_idx); + } else { + strcpy(o_name, k_name + flavor_k_ptr->flavor_name); + } + + c_prt(attr, o_name, row + i, col); + if (per_page == 1) { + c_prt(attr, format("%02x/%02x", flavor_k_ptr->x_attr, flavor_k_ptr->x_char), row + i, (current_world_ptr->wizard || visual_only) ? 64 : 68); + } + + if (current_world_ptr->wizard || visual_only) { + c_prt(attr, format("%d", k_idx), row + i, 70); + } + + a = flavor_k_ptr->x_attr; + c = flavor_k_ptr->x_char; + + Term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0); + } + + for (; i < per_page; i++) { + Term_erase(col, row + i, 255); + } } - /* * Describe fake object */ static void desc_obj_fake(player_type *creature_ptr, KIND_OBJECT_IDX k_idx) { - object_type *o_ptr; - object_type object_type_body; - o_ptr = &object_type_body; - object_wipe(o_ptr); - object_prep(creature_ptr, o_ptr, k_idx); + object_type *o_ptr; + object_type object_type_body; + o_ptr = &object_type_body; + object_wipe(o_ptr); + object_prep(creature_ptr, o_ptr, k_idx); - o_ptr->ident |= IDENT_KNOWN; - handle_stuff(creature_ptr); + o_ptr->ident |= IDENT_KNOWN; + handle_stuff(creature_ptr); - if (screen_object(creature_ptr, o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL)) return; + if (screen_object(creature_ptr, o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL)) + return; - msg_print(_("特に変わったところはないようだ。", "You see nothing special.")); - msg_print(NULL); + msg_print(_("特に変わったところはないようだ。", "You see nothing special.")); + msg_print(NULL); } - /* * Display known objects */ void do_cmd_knowledge_objects(player_type *creature_ptr, bool *need_redraw, bool visual_only, IDX direct_k_idx) { - IDX object_old, object_top; - IDX grp_idx[100]; - int object_cnt; - OBJECT_IDX *object_idx; - - bool visual_list = FALSE; - TERM_COLOR attr_top = 0; - byte char_left = 0; - byte mode; - - TERM_LEN wid, hgt; - Term_get_size(&wid, &hgt); - - int browser_rows = hgt - 8; - C_MAKE(object_idx, max_k_idx, KIND_OBJECT_IDX); - - int len; - int max = 0; - int grp_cnt = 0; - if (direct_k_idx < 0) - { - mode = visual_only ? 0x03 : 0x01; - for (IDX i = 0; object_group_text[i] != NULL; i++) - { - len = strlen(object_group_text[i]); - if (len > max) max = len; - - if (collect_objects(i, object_idx, mode)) - { - grp_idx[grp_cnt++] = i; - } - } - - object_old = -1; - object_cnt = 0; - } - else - { - object_kind *k_ptr = &k_info[direct_k_idx]; - object_kind *flavor_k_ptr; - - if (!visual_only && k_ptr->flavor) - { - flavor_k_ptr = &k_info[k_ptr->flavor]; - } - else - { - flavor_k_ptr = k_ptr; - } - - object_idx[0] = direct_k_idx; - object_old = direct_k_idx; - object_cnt = 1; - object_idx[1] = -1; - (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3), - &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw); - } - - grp_idx[grp_cnt] = -1; - mode = visual_only ? 0x02 : 0x00; - IDX old_grp_cur = -1; - IDX grp_cur = 0; - IDX grp_top = 0; - IDX object_cur = object_top = 0; - bool flag = FALSE; - bool redraw = TRUE; - int column = 0; - while (!flag) - { - object_kind *k_ptr, *flavor_k_ptr; - - if (redraw) - { - clear_from(0); + IDX object_old, object_top; + IDX grp_idx[100]; + int object_cnt; + OBJECT_IDX *object_idx; + + bool visual_list = FALSE; + TERM_COLOR attr_top = 0; + byte char_left = 0; + byte mode; + + TERM_LEN wid, hgt; + Term_get_size(&wid, &hgt); + + int browser_rows = hgt - 8; + C_MAKE(object_idx, max_k_idx, KIND_OBJECT_IDX); + + int len; + int max = 0; + int grp_cnt = 0; + if (direct_k_idx < 0) { + mode = visual_only ? 0x03 : 0x01; + for (IDX i = 0; object_group_text[i] != NULL; i++) { + len = strlen(object_group_text[i]); + if (len > max) + max = len; + + if (collect_objects(i, object_idx, mode)) { + grp_idx[grp_cnt++] = i; + } + } + + object_old = -1; + object_cnt = 0; + } else { + object_kind *k_ptr = &k_info[direct_k_idx]; + object_kind *flavor_k_ptr; + + if (!visual_only && k_ptr->flavor) { + flavor_k_ptr = &k_info[k_ptr->flavor]; + } else { + flavor_k_ptr = k_ptr; + } + + object_idx[0] = direct_k_idx; + object_old = direct_k_idx; + object_cnt = 1; + object_idx[1] = -1; + (void)visual_mode_command( + 'v', &visual_list, browser_rows - 1, wid - (max + 3), &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw); + } + + grp_idx[grp_cnt] = -1; + mode = visual_only ? 0x02 : 0x00; + IDX old_grp_cur = -1; + IDX grp_cur = 0; + IDX grp_top = 0; + IDX object_cur = object_top = 0; + bool flag = FALSE; + bool redraw = TRUE; + int column = 0; + while (!flag) { + object_kind *k_ptr, *flavor_k_ptr; + + if (redraw) { + clear_from(0); #ifdef JP - prt(format("%s - アイテム", !visual_only ? "知識" : "表示"), 2, 0); - if (direct_k_idx < 0) prt("グループ", 4, 0); - prt("名前", 4, max + 3); - if (current_world_ptr->wizard || visual_only) prt("Idx", 4, 70); - prt("文字", 4, 74); + prt(format("%s - アイテム", !visual_only ? "知識" : "表示"), 2, 0); + if (direct_k_idx < 0) + prt("グループ", 4, 0); + prt("名前", 4, max + 3); + if (current_world_ptr->wizard || visual_only) + prt("Idx", 4, 70); + prt("文字", 4, 74); #else - prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0); - if (direct_k_idx < 0) prt("Group", 4, 0); - prt("Name", 4, max + 3); - if (current_world_ptr->wizard || visual_only) prt("Idx", 4, 70); - prt("Sym", 4, 75); + prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0); + if (direct_k_idx < 0) + prt("Group", 4, 0); + prt("Name", 4, max + 3); + if (current_world_ptr->wizard || visual_only) + prt("Idx", 4, 70); + prt("Sym", 4, 75); #endif - for (IDX i = 0; i < 78; i++) - { - Term_putch(i, 5, TERM_WHITE, '='); - } - - if (direct_k_idx < 0) - { - for (IDX i = 0; i < browser_rows; i++) - { - Term_putch(max + 1, 6 + i, TERM_WHITE, '|'); - } - } - - redraw = FALSE; - } - - if (direct_k_idx < 0) - { - if (grp_cur < grp_top) grp_top = grp_cur; - if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1; - - display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top); - if (old_grp_cur != grp_cur) - { - old_grp_cur = grp_cur; - object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode); - } - - while (object_cur < object_top) - object_top = MAX(0, object_top - browser_rows / 2); - while (object_cur >= object_top + browser_rows) - object_top = MIN(object_cnt - browser_rows, object_top + browser_rows / 2); - } - - if (!visual_list) - { - display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only); - } - else - { - object_top = object_cur; - display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only); - display_visual_list(max + 3, 7, browser_rows - 1, wid - (max + 3), attr_top, char_left); - } - - k_ptr = &k_info[object_idx[object_cur]]; - - if (!visual_only && k_ptr->flavor) - { - flavor_k_ptr = &k_info[k_ptr->flavor]; - } - else - { - flavor_k_ptr = k_ptr; - } + for (IDX i = 0; i < 78; i++) { + Term_putch(i, 5, TERM_WHITE, '='); + } + + if (direct_k_idx < 0) { + for (IDX i = 0; i < browser_rows; i++) { + Term_putch(max + 1, 6 + i, TERM_WHITE, '|'); + } + } + + redraw = FALSE; + } + + if (direct_k_idx < 0) { + if (grp_cur < grp_top) + grp_top = grp_cur; + if (grp_cur >= grp_top + browser_rows) + grp_top = grp_cur - browser_rows + 1; + + display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top); + if (old_grp_cur != grp_cur) { + old_grp_cur = grp_cur; + object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode); + } + + while (object_cur < object_top) + object_top = MAX(0, object_top - browser_rows / 2); + while (object_cur >= object_top + browser_rows) + object_top = MIN(object_cnt - browser_rows, object_top + browser_rows / 2); + } + + if (!visual_list) { + display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only); + } else { + object_top = object_cur; + display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only); + display_visual_list(max + 3, 7, browser_rows - 1, wid - (max + 3), attr_top, char_left); + } + + k_ptr = &k_info[object_idx[object_cur]]; + + if (!visual_only && k_ptr->flavor) { + flavor_k_ptr = &k_info[k_ptr->flavor]; + } else { + flavor_k_ptr = k_ptr; + } #ifdef JP - prt(format("<方向>%s%s%s, ESC", - (!visual_list && !visual_only) ? ", 'r'で詳細を見る" : "", - visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更", - (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"), - hgt - 1, 0); + prt(format("<方向>%s%s%s, ESC", (!visual_list && !visual_only) ? ", 'r'で詳細を見る" : "", visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更", + (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"), + hgt - 1, 0); #else - prt(format("%s%s%s, ESC", - (!visual_list && !visual_only) ? ", 'r' to recall" : "", - visual_list ? ", ENTER to accept" : ", 'v' for visuals", - (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), - hgt - 1, 0); + prt(format("%s%s%s, ESC", (!visual_list && !visual_only) ? ", 'r' to recall" : "", visual_list ? ", ENTER to accept" : ", 'v' for visuals", + (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), + hgt - 1, 0); #endif - if (!visual_only) - { - if (object_cnt) object_kind_track(creature_ptr, object_idx[object_cur]); - - if (object_old != object_idx[object_cur]) - { - handle_stuff(creature_ptr); - object_old = object_idx[object_cur]; - } - } - - if (visual_list) - { - place_visual_list_cursor(max + 3, 7, flavor_k_ptr->x_attr, flavor_k_ptr->x_char, attr_top, char_left); - } - else if (!column) - { - Term_gotoxy(0, 6 + (grp_cur - grp_top)); - } - else - { - Term_gotoxy(max + 3, 6 + (object_cur - object_top)); - } - - char ch = inkey(); - if (visual_mode_command(ch, &visual_list, browser_rows - 1, wid - (max + 3), &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw)) - { - if (direct_k_idx >= 0) - { - switch (ch) - { - case '\n': - case '\r': - case ESCAPE: - flag = TRUE; - break; - } - } - continue; - } - - switch (ch) - { - case ESCAPE: - { - flag = TRUE; - break; - } - - case 'R': - case 'r': - { - if (!visual_list && !visual_only && (grp_cnt > 0)) - { - desc_obj_fake(creature_ptr, object_idx[object_cur]); - redraw = TRUE; - } - - break; - } - - default: - { - browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt); - break; - } - } - } - - C_KILL(object_idx, max_k_idx, KIND_OBJECT_IDX); + if (!visual_only) { + if (object_cnt) + object_kind_track(creature_ptr, object_idx[object_cur]); + + if (object_old != object_idx[object_cur]) { + handle_stuff(creature_ptr); + object_old = object_idx[object_cur]; + } + } + + if (visual_list) { + place_visual_list_cursor(max + 3, 7, flavor_k_ptr->x_attr, flavor_k_ptr->x_char, attr_top, char_left); + } else if (!column) { + Term_gotoxy(0, 6 + (grp_cur - grp_top)); + } else { + Term_gotoxy(max + 3, 6 + (object_cur - object_top)); + } + + char ch = inkey(); + if (visual_mode_command( + ch, &visual_list, browser_rows - 1, wid - (max + 3), &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw)) { + if (direct_k_idx >= 0) { + switch (ch) { + case '\n': + case '\r': + case ESCAPE: + flag = TRUE; + break; + } + } + continue; + } + + switch (ch) { + case ESCAPE: { + flag = TRUE; + break; + } + + case 'R': + case 'r': { + if (!visual_list && !visual_only && (grp_cnt > 0)) { + desc_obj_fake(creature_ptr, object_idx[object_cur]); + redraw = TRUE; + } + + break; + } + + default: { + browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt); + break; + } + } + } + + C_KILL(object_idx, max_k_idx, KIND_OBJECT_IDX); } diff --git a/src/knowledge/knowledge-quests.c b/src/knowledge/knowledge-quests.c index 4fb7e96a3..dd6c5f651 100644 --- a/src/knowledge/knowledge-quests.c +++ b/src/knowledge/knowledge-quests.c @@ -6,10 +6,10 @@ #include "knowledge-quests.h" #include "core/show-file.h" -#include "flavor/object-flavor-types.h" -#include "util/sort.h" #include "dungeon/dungeon.h" #include "dungeon/quest.h" +#include "flavor/flavor-describer.h" +#include "flavor/object-flavor-types.h" #include "floor/floor.h" #include "info-reader/fixed-map-parser.h" #include "io-dump/dump-util.h" @@ -17,27 +17,26 @@ #include "monster-race/monster-race.h" #include "object-enchant/artifact.h" #include "object-enchant/special-object-flags.h" -#include "object/object-flavor.h" #include "object/object-generator.h" #include "object/object-kind-hook.h" #include "system/system-variables.h" // 暫定、init_flagsのため。後で消すかも. #include "term/screen-processor.h" #include "util/angband-files.h" +#include "util/sort.h" #include "world/world.h" - /* - * Check on the status of an active quest - * @param creature_ptr プレーヤーへの参照ポインタ - * @return なし - */ +/* + * Check on the status of an active quest + * @param creature_ptr プレーヤーへの参照ポインタ + * @return なし + */ void do_cmd_checkquest(player_type *creature_ptr) { - screen_save(); - do_cmd_knowledge_quests(creature_ptr); - screen_load(); + screen_save(); + do_cmd_knowledge_quests(creature_ptr); + screen_load(); } - /* * todo player_typeではなくQUEST_IDXを引数にすべきかもしれない * Print all active quests @@ -46,204 +45,175 @@ void do_cmd_checkquest(player_type *creature_ptr) */ static void do_cmd_knowledge_quests_current(player_type *creature_ptr, FILE *fff) { - char tmp_str[120]; - char rand_tmp_str[120] = "\0"; - GAME_TEXT name[MAX_NLEN]; - monster_race *r_ptr; - int rand_level = 100; - int total = 0; - - fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n")); - - for (QUEST_IDX i = 1; i < max_q_idx; i++) - { - bool is_print = quest[i].status == QUEST_STATUS_TAKEN; - is_print |= (quest[i].status == QUEST_STATUS_STAGE_COMPLETED) && (quest[i].type == QUEST_TYPE_TOWER); - is_print |= quest[i].status == QUEST_STATUS_COMPLETED; - if (!is_print) - continue; - - QUEST_IDX old_quest = creature_ptr->current_floor_ptr->inside_quest; - for (int j = 0; j < 10; j++) - quest_text[j][0] = '\0'; - - quest_text_line = 0; - creature_ptr->current_floor_ptr->inside_quest = i; - init_flags = INIT_SHOW_TEXT; - parse_fixed_map(creature_ptr, "q_info.txt", 0, 0, 0, 0); - creature_ptr->current_floor_ptr->inside_quest = old_quest; - if (quest[i].flags & QUEST_FLAG_SILENT) continue; - - total++; - if (quest[i].type != QUEST_TYPE_RANDOM) - { - char note[80] = "\0"; - - if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_STAGE_COMPLETED) - { - switch (quest[i].type) - { - case QUEST_TYPE_KILL_LEVEL: - case QUEST_TYPE_KILL_ANY_LEVEL: - r_ptr = &r_info[quest[i].r_idx]; - strcpy(name, r_name + r_ptr->name); - if (quest[i].max_num > 1) - { + char tmp_str[120]; + char rand_tmp_str[120] = "\0"; + GAME_TEXT name[MAX_NLEN]; + monster_race *r_ptr; + int rand_level = 100; + int total = 0; + + fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n")); + + for (QUEST_IDX i = 1; i < max_q_idx; i++) { + bool is_print = quest[i].status == QUEST_STATUS_TAKEN; + is_print |= (quest[i].status == QUEST_STATUS_STAGE_COMPLETED) && (quest[i].type == QUEST_TYPE_TOWER); + is_print |= quest[i].status == QUEST_STATUS_COMPLETED; + if (!is_print) + continue; + + QUEST_IDX old_quest = creature_ptr->current_floor_ptr->inside_quest; + for (int j = 0; j < 10; j++) + quest_text[j][0] = '\0'; + + quest_text_line = 0; + creature_ptr->current_floor_ptr->inside_quest = i; + init_flags = INIT_SHOW_TEXT; + parse_fixed_map(creature_ptr, "q_info.txt", 0, 0, 0, 0); + creature_ptr->current_floor_ptr->inside_quest = old_quest; + if (quest[i].flags & QUEST_FLAG_SILENT) + continue; + + total++; + if (quest[i].type != QUEST_TYPE_RANDOM) { + char note[80] = "\0"; + + if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_STAGE_COMPLETED) { + switch (quest[i].type) { + case QUEST_TYPE_KILL_LEVEL: + case QUEST_TYPE_KILL_ANY_LEVEL: + r_ptr = &r_info[quest[i].r_idx]; + strcpy(name, r_name + r_ptr->name); + if (quest[i].max_num > 1) { #ifdef JP - sprintf(note, " - %d 体の%sを倒す。(あと %d 体)", - (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num)); + sprintf(note, " - %d 体の%sを倒す。(あと %d 体)", (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num)); #else - plural_aux(name); - sprintf(note, " - kill %d %s, have killed %d.", - (int)quest[i].max_num, name, (int)quest[i].cur_num); + plural_aux(name); + sprintf(note, " - kill %d %s, have killed %d.", (int)quest[i].max_num, name, (int)quest[i].cur_num); #endif - } - else - sprintf(note, _(" - %sを倒す。", " - kill %s."), name); - break; - - case QUEST_TYPE_FIND_ARTIFACT: - if (quest[i].k_idx) - { - artifact_type *a_ptr = &a_info[quest[i].k_idx]; - object_type forge; - object_type *q_ptr = &forge; - KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval); - object_prep(creature_ptr, q_ptr, k_idx); - q_ptr->name1 = quest[i].k_idx; - q_ptr->ident = IDENT_STORE; - object_desc(creature_ptr, name, q_ptr, OD_NAME_ONLY); - } - sprintf(note, _("\n - %sを見つけ出す。", "\n - Find %s."), name); - break; - case QUEST_TYPE_FIND_EXIT: - sprintf(note, _(" - 出口に到達する。", " - Reach exit.")); - break; - - case QUEST_TYPE_KILL_NUMBER: + } else + sprintf(note, _(" - %sを倒す。", " - kill %s."), name); + break; + + case QUEST_TYPE_FIND_ARTIFACT: + if (quest[i].k_idx) { + artifact_type *a_ptr = &a_info[quest[i].k_idx]; + object_type forge; + object_type *q_ptr = &forge; + KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval); + object_prep(creature_ptr, q_ptr, k_idx); + q_ptr->name1 = quest[i].k_idx; + q_ptr->ident = IDENT_STORE; + describe_flavor(creature_ptr, name, q_ptr, OD_NAME_ONLY); + } + sprintf(note, _("\n - %sを見つけ出す。", "\n - Find %s."), name); + break; + case QUEST_TYPE_FIND_EXIT: + sprintf(note, _(" - 出口に到達する。", " - Reach exit.")); + break; + + case QUEST_TYPE_KILL_NUMBER: #ifdef JP - sprintf(note, " - %d 体のモンスターを倒す。(あと %d 体)", - (int)quest[i].max_num, (int)(quest[i].max_num - quest[i].cur_num)); + sprintf(note, " - %d 体のモンスターを倒す。(あと %d 体)", (int)quest[i].max_num, (int)(quest[i].max_num - quest[i].cur_num)); #else - sprintf(note, " - Kill %d monsters, have killed %d.", - (int)quest[i].max_num, (int)quest[i].cur_num); + sprintf(note, " - Kill %d monsters, have killed %d.", (int)quest[i].max_num, (int)quest[i].cur_num); #endif - break; - - case QUEST_TYPE_KILL_ALL: - case QUEST_TYPE_TOWER: - sprintf(note, _(" - 全てのモンスターを倒す。", " - Kill all monsters.")); - break; - } - } - - sprintf(tmp_str, _(" %s (危険度:%d階相当)%s\n", " %s (Danger level: %d)%s\n"), - quest[i].name, (int)quest[i].level, note); - fputs(tmp_str, fff); - if (quest[i].status == QUEST_STATUS_COMPLETED) - { - sprintf(tmp_str, _(" クエスト達成 - まだ報酬を受けとってない。\n", " Quest Completed - Unrewarded\n")); - fputs(tmp_str, fff); - continue; - } - - int k = 0; - while (quest_text[k][0] && k < 10) - { - fprintf(fff, " %s\n", quest_text[k]); - k++; - } - - continue; - } - - if (quest[i].level >= rand_level) - continue; - - rand_level = quest[i].level; - if (max_dlv[DUNGEON_ANGBAND] < rand_level) continue; - - r_ptr = &r_info[quest[i].r_idx]; - strcpy(name, r_name + r_ptr->name); - if (quest[i].max_num <= 1) - { - sprintf(rand_tmp_str, _(" %s (%d 階) - %sを倒す。\n", " %s (Dungeon level: %d)\n Kill %s.\n"), - quest[i].name, (int)quest[i].level, name); - continue; - } + break; + + case QUEST_TYPE_KILL_ALL: + case QUEST_TYPE_TOWER: + sprintf(note, _(" - 全てのモンスターを倒す。", " - Kill all monsters.")); + break; + } + } + + sprintf(tmp_str, _(" %s (危険度:%d階相当)%s\n", " %s (Danger level: %d)%s\n"), quest[i].name, (int)quest[i].level, note); + fputs(tmp_str, fff); + if (quest[i].status == QUEST_STATUS_COMPLETED) { + sprintf(tmp_str, _(" クエスト達成 - まだ報酬を受けとってない。\n", " Quest Completed - Unrewarded\n")); + fputs(tmp_str, fff); + continue; + } + + int k = 0; + while (quest_text[k][0] && k < 10) { + fprintf(fff, " %s\n", quest_text[k]); + k++; + } + + continue; + } + + if (quest[i].level >= rand_level) + continue; + + rand_level = quest[i].level; + if (max_dlv[DUNGEON_ANGBAND] < rand_level) + continue; + + r_ptr = &r_info[quest[i].r_idx]; + strcpy(name, r_name + r_ptr->name); + if (quest[i].max_num <= 1) { + sprintf(rand_tmp_str, _(" %s (%d 階) - %sを倒す。\n", " %s (Dungeon level: %d)\n Kill %s.\n"), quest[i].name, (int)quest[i].level, name); + continue; + } #ifdef JP - sprintf(rand_tmp_str, " %s (%d 階) - %d 体の%sを倒す。(あと %d 体)\n", - quest[i].name, (int)quest[i].level, - (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num)); + sprintf(rand_tmp_str, " %s (%d 階) - %d 体の%sを倒す。(あと %d 体)\n", quest[i].name, (int)quest[i].level, (int)quest[i].max_num, name, + (int)(quest[i].max_num - quest[i].cur_num)); #else - plural_aux(name); + plural_aux(name); - sprintf(rand_tmp_str, " %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n", - quest[i].name, (int)quest[i].level, - (int)quest[i].max_num, name, (int)quest[i].cur_num); + sprintf(rand_tmp_str, " %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n", quest[i].name, (int)quest[i].level, (int)quest[i].max_num, name, + (int)quest[i].cur_num); #endif - } + } - if (rand_tmp_str[0]) fputs(rand_tmp_str, fff); + if (rand_tmp_str[0]) + fputs(rand_tmp_str, fff); - if (!total) fprintf(fff, _(" なし\n", " Nothing.\n")); + if (!total) + fprintf(fff, _(" なし\n", " Nothing.\n")); } - static bool do_cmd_knowledge_quests_aux(player_type *player_ptr, FILE *fff, IDX q_idx) { - char tmp_str[120]; - char playtime_str[16]; - quest_type* const q_ptr = &quest[q_idx]; - - floor_type *floor_ptr = player_ptr->current_floor_ptr; - if (is_fixed_quest_idx(q_idx)) - { - IDX old_quest = floor_ptr->inside_quest; - floor_ptr->inside_quest = q_idx; - init_flags = INIT_NAME_ONLY; - parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0); - floor_ptr->inside_quest = old_quest; - if (q_ptr->flags & QUEST_FLAG_SILENT) return FALSE; - } - - strnfmt(playtime_str, sizeof(playtime_str), "%02d:%02d:%02d", - q_ptr->comptime / (60 * 60), (q_ptr->comptime / 60) % 60, q_ptr->comptime % 60); - - if (is_fixed_quest_idx(q_idx) || (q_ptr->r_idx == 0)) - { - sprintf(tmp_str, - _(" %-35s (危険度:%3d階相当) - レベル%2d - %s\n", - " %-35s (Danger level: %3d) - level %2d - %s\n"), - q_ptr->name, (int)q_ptr->level, q_ptr->complev, playtime_str); - fputs(tmp_str, fff); - return TRUE; - } - - if (q_ptr->complev == 0) - { - sprintf(tmp_str, - _(" %-35s (%3d階) - 不戦勝 - %s\n", - " %-35s (Dungeon level: %3d) - Unearned - %s\n"), - r_name + r_info[q_ptr->r_idx].name, - (int)q_ptr->level, playtime_str); - fputs(tmp_str, fff); - return TRUE; - } - - sprintf(tmp_str, - _(" %-35s (%3d階) - レベル%2d - %s\n", - " %-35s (Dungeon level: %3d) - level %2d - %s\n"), - r_name + r_info[q_ptr->r_idx].name, - (int)q_ptr->level, - q_ptr->complev, - playtime_str); - fputs(tmp_str, fff); - return TRUE; + char tmp_str[120]; + char playtime_str[16]; + quest_type *const q_ptr = &quest[q_idx]; + + floor_type *floor_ptr = player_ptr->current_floor_ptr; + if (is_fixed_quest_idx(q_idx)) { + IDX old_quest = floor_ptr->inside_quest; + floor_ptr->inside_quest = q_idx; + init_flags = INIT_NAME_ONLY; + parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0); + floor_ptr->inside_quest = old_quest; + if (q_ptr->flags & QUEST_FLAG_SILENT) + return FALSE; + } + + strnfmt(playtime_str, sizeof(playtime_str), "%02d:%02d:%02d", q_ptr->comptime / (60 * 60), (q_ptr->comptime / 60) % 60, q_ptr->comptime % 60); + + if (is_fixed_quest_idx(q_idx) || (q_ptr->r_idx == 0)) { + sprintf(tmp_str, _(" %-35s (危険度:%3d階相当) - レベル%2d - %s\n", " %-35s (Danger level: %3d) - level %2d - %s\n"), q_ptr->name, (int)q_ptr->level, + q_ptr->complev, playtime_str); + fputs(tmp_str, fff); + return TRUE; + } + + if (q_ptr->complev == 0) { + sprintf(tmp_str, _(" %-35s (%3d階) - 不戦勝 - %s\n", " %-35s (Dungeon level: %3d) - Unearned - %s\n"), + r_name + r_info[q_ptr->r_idx].name, (int)q_ptr->level, playtime_str); + fputs(tmp_str, fff); + return TRUE; + } + + sprintf(tmp_str, _(" %-35s (%3d階) - レベル%2d - %s\n", " %-35s (Dungeon level: %3d) - level %2d - %s\n"), r_name + r_info[q_ptr->r_idx].name, + (int)q_ptr->level, q_ptr->complev, playtime_str); + fputs(tmp_str, fff); + return TRUE; } - /* * Print all finished quests * @param creature_ptr プレーヤーへの参照ポインタ @@ -253,72 +223,66 @@ static bool do_cmd_knowledge_quests_aux(player_type *player_ptr, FILE *fff, IDX */ void do_cmd_knowledge_quests_completed(player_type *creature_ptr, FILE *fff, QUEST_IDX quest_num[]) { - fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n")); - QUEST_IDX total = 0; - for (QUEST_IDX i = 1; i < max_q_idx; i++) - { - QUEST_IDX q_idx = quest_num[i]; - quest_type* const q_ptr = &quest[q_idx]; - - if (q_ptr->status == QUEST_STATUS_FINISHED && do_cmd_knowledge_quests_aux(creature_ptr, fff, q_idx)) - { - ++total; - } - } - - if (!total) fprintf(fff, _(" なし\n", " Nothing.\n")); + fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n")); + QUEST_IDX total = 0; + for (QUEST_IDX i = 1; i < max_q_idx; i++) { + QUEST_IDX q_idx = quest_num[i]; + quest_type *const q_ptr = &quest[q_idx]; + + if (q_ptr->status == QUEST_STATUS_FINISHED && do_cmd_knowledge_quests_aux(creature_ptr, fff, q_idx)) { + ++total; + } + } + + if (!total) + fprintf(fff, _(" なし\n", " Nothing.\n")); } - /* * Print all failed quests * @param creature_ptr プレーヤーへの参照ポインタ * @param fff セーブファイル (展開済?) * @param quest_num[] 受注したことのあるクエスト群 * @return なし -*/ + */ void do_cmd_knowledge_quests_failed(player_type *creature_ptr, FILE *fff, QUEST_IDX quest_num[]) { - fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n")); - QUEST_IDX total = 0; - for (QUEST_IDX i = 1; i < max_q_idx; i++) - { - QUEST_IDX q_idx = quest_num[i]; - quest_type* const q_ptr = &quest[q_idx]; - - if (((q_ptr->status == QUEST_STATUS_FAILED_DONE) || (q_ptr->status == QUEST_STATUS_FAILED)) && - do_cmd_knowledge_quests_aux(creature_ptr, fff, q_idx)) - { - ++total; - } - } - - if (!total) fprintf(fff, _(" なし\n", " Nothing.\n")); + fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n")); + QUEST_IDX total = 0; + for (QUEST_IDX i = 1; i < max_q_idx; i++) { + QUEST_IDX q_idx = quest_num[i]; + quest_type *const q_ptr = &quest[q_idx]; + + if (((q_ptr->status == QUEST_STATUS_FAILED_DONE) || (q_ptr->status == QUEST_STATUS_FAILED)) && do_cmd_knowledge_quests_aux(creature_ptr, fff, q_idx)) { + ++total; + } + } + + if (!total) + fprintf(fff, _(" なし\n", " Nothing.\n")); } - /* * Print all random quests */ static void do_cmd_knowledge_quests_wiz_random(FILE *fff) { - fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n")); - GAME_TEXT tmp_str[120]; - QUEST_IDX total = 0; - for (QUEST_IDX i = 1; i < max_q_idx; i++) - { - if (quest[i].flags & QUEST_FLAG_SILENT) continue; - - if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN)) - { - total++; - sprintf(tmp_str, _(" %s (%d階, %s)\n", " %s (%d, %s)\n"), - quest[i].name, (int)quest[i].level, r_name + r_info[quest[i].r_idx].name); - fputs(tmp_str, fff); - } - } - - if (!total) fprintf(fff, _(" なし\n", " Nothing.\n")); + fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n")); + GAME_TEXT tmp_str[120]; + QUEST_IDX total = 0; + for (QUEST_IDX i = 1; i < max_q_idx; i++) { + if (quest[i].flags & QUEST_FLAG_SILENT) + continue; + + if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN)) { + total++; + sprintf(tmp_str, _(" %s (%d階, %s)\n", " %s (%d, %s)\n"), quest[i].name, (int)quest[i].level, r_name + r_info[quest[i].r_idx].name); + fputs(tmp_str, fff); + } + } + + if (!total) + fprintf(fff, _(" なし\n", " Nothing.\n")); } /* @@ -328,32 +292,32 @@ static void do_cmd_knowledge_quests_wiz_random(FILE *fff) */ void do_cmd_knowledge_quests(player_type *creature_ptr) { - FILE *fff = NULL; - GAME_TEXT file_name[FILE_NAME_SIZE]; - if (!open_temporary_file(&fff, file_name)) return; - - IDX *quest_num; - C_MAKE(quest_num, max_q_idx, QUEST_IDX); - - for (IDX i = 1; i < max_q_idx; i++) - quest_num[i] = i; - - int dummy; - ang_sort(creature_ptr, quest_num, &dummy, max_q_idx, ang_sort_comp_quest_num, ang_sort_swap_quest_num); - - do_cmd_knowledge_quests_current(creature_ptr, fff); - fputc('\n', fff); - do_cmd_knowledge_quests_completed(creature_ptr, fff, quest_num); - fputc('\n', fff); - do_cmd_knowledge_quests_failed(creature_ptr, fff, quest_num); - if (current_world_ptr->wizard) - { - fputc('\n', fff); - do_cmd_knowledge_quests_wiz_random(fff); - } - - angband_fclose(fff); - (void)show_file(creature_ptr, TRUE, file_name, _("クエスト達成状況", "Quest status"), 0, 0); - fd_kill(file_name); - C_KILL(quest_num, max_q_idx, QUEST_IDX); + FILE *fff = NULL; + GAME_TEXT file_name[FILE_NAME_SIZE]; + if (!open_temporary_file(&fff, file_name)) + return; + + IDX *quest_num; + C_MAKE(quest_num, max_q_idx, QUEST_IDX); + + for (IDX i = 1; i < max_q_idx; i++) + quest_num[i] = i; + + int dummy; + ang_sort(creature_ptr, quest_num, &dummy, max_q_idx, ang_sort_comp_quest_num, ang_sort_swap_quest_num); + + do_cmd_knowledge_quests_current(creature_ptr, fff); + fputc('\n', fff); + do_cmd_knowledge_quests_completed(creature_ptr, fff, quest_num); + fputc('\n', fff); + do_cmd_knowledge_quests_failed(creature_ptr, fff, quest_num); + if (current_world_ptr->wizard) { + fputc('\n', fff); + do_cmd_knowledge_quests_wiz_random(fff); + } + + angband_fclose(fff); + (void)show_file(creature_ptr, TRUE, file_name, _("クエスト達成状況", "Quest status"), 0, 0); + fd_kill(file_name); + C_KILL(quest_num, max_q_idx, QUEST_IDX); } diff --git a/src/knowledge/knowledge-self.c b/src/knowledge/knowledge-self.c index 2574ac223..450aeda67 100644 --- a/src/knowledge/knowledge-self.c +++ b/src/knowledge/knowledge-self.c @@ -7,10 +7,10 @@ #include "knowledge-self.h" #include "birth/birth-explanations-table.h" #include "core/show-file.h" +#include "flavor/flavor-describer.h" #include "floor/floor-town.h" #include "info-reader/fixed-map-parser.h" #include "io-dump/dump-util.h" -#include "object/object-flavor.h" #include "player/avatar.h" #include "player/player-class.h" #include "player/race-info-table.h" @@ -178,7 +178,7 @@ void do_cmd_knowledge_home(player_type *player_ptr) #ifdef JP if ((i % 12) == 0) fprintf(fff, "\n ( %d ページ )\n", x++); - object_desc(player_ptr, o_name, &store_ptr->stock[i], 0); + describe_flavor(player_ptr, o_name, &store_ptr->stock[i], 0); if (strlen(o_name) <= 80 - 3) { fprintf(fff, "%c%s %s\n", I2A(i % 12), paren, o_name); } else { @@ -196,7 +196,7 @@ void do_cmd_knowledge_home(player_type *player_ptr) fprintf(fff, " %.77s\n", o_name + n); } #else - object_desc(player_ptr, o_name, &store_ptr->stock[i], 0); + describe_flavor(player_ptr, o_name, &store_ptr->stock[i], 0); fprintf(fff, "%c%s %s\n", I2A(i % 12), paren, o_name); #endif } diff --git a/src/market/bounty.c b/src/market/bounty.c index d59181667..d078dcc78 100644 --- a/src/market/bounty.c +++ b/src/market/bounty.c @@ -5,27 +5,27 @@ #include "core/player-redraw-types.h" #include "core/stuff-handler.h" #include "dungeon/dungeon.h" +#include "flavor/flavor-describer.h" #include "floor/floor.h" #include "inventory/inventory-object.h" #include "inventory/inventory-slot-types.h" #include "io/input-key-acceptor.h" #include "market/bounty-prize-table.h" #include "market/building-util.h" +#include "monster-race/monster-race-hook.h" #include "monster-race/monster-race.h" #include "monster-race/race-flags1.h" #include "monster-race/race-flags2.h" #include "monster-race/race-flags7.h" #include "monster-race/race-flags9.h" #include "monster-race/race-indice-types.h" -#include "monster-race/monster-race-hook.h" #include "monster/monster-list.h" #include "monster/monster-util.h" #include "object-enchant/apply-magic.h" #include "object-enchant/item-apply-magic.h" -#include "object/object-flavor.h" #include "object/object-generator.h" -#include "object/object-kind-hook.h" #include "object/object-info.h" +#include "object/object-kind-hook.h" #include "perception/object-perception.h" #include "player/avatar.h" #include "sv-definition/sv-other-types.h" @@ -49,7 +49,7 @@ bool exchange_cash(player_type *player_ptr) o_ptr = &player_ptr->inventory_list[i]; if ((o_ptr->tval == TV_CAPTURE) && (o_ptr->pval == MON_TSUCHINOKO)) { char buf[MAX_NLEN + 20]; - object_desc(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "), o_name); if (get_check(buf)) { msg_format(_("賞金 %ld$を手に入れた。", "You get %ldgp."), (long int)(1000000L * o_ptr->number)); @@ -66,7 +66,7 @@ bool exchange_cash(player_type *player_ptr) o_ptr = &player_ptr->inventory_list[i]; if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == MON_TSUCHINOKO)) { char buf[MAX_NLEN + 20]; - object_desc(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "), o_name); if (get_check(buf)) { msg_format(_("賞金 %ld$を手に入れた。", "You get %ldgp."), (long int)(200000L * o_ptr->number)); @@ -83,7 +83,7 @@ bool exchange_cash(player_type *player_ptr) o_ptr = &player_ptr->inventory_list[i]; if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (o_ptr->pval == MON_TSUCHINOKO)) { char buf[MAX_NLEN + 20]; - object_desc(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "), o_name); if (get_check(buf)) { msg_format(_("賞金 %ld$を手に入れた。", "You get %ldgp."), (long int)(100000L * o_ptr->number)); @@ -100,7 +100,7 @@ bool exchange_cash(player_type *player_ptr) o_ptr = &player_ptr->inventory_list[i]; 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(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "), o_name); if (get_check(buf)) { msg_format(_("賞金 %ld$を手に入れた。", "You get %ldgp."), (long int)((r_info[today_mon].level * 50 + 100) * o_ptr->number)); @@ -118,7 +118,7 @@ bool exchange_cash(player_type *player_ptr) 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(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "), o_name); if (get_check(buf)) { msg_format(_("賞金 %ld$を手に入れた。", "You get %ldgp."), (long int)((r_info[today_mon].level * 30 + 60) * o_ptr->number)); @@ -142,7 +142,7 @@ bool exchange_cash(player_type *player_ptr) INVENTORY_IDX item_new; object_type forge; - object_desc(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); sprintf(buf, _("%sを渡しますか?", "Hand %s over? "), o_name); if (!get_check(buf)) continue; @@ -170,7 +170,7 @@ bool exchange_cash(player_type *player_ptr) * there is at least one empty slot. */ item_new = store_item_to_inventory(player_ptr, &forge); - object_desc(player_ptr, o_name, &forge, 0); + describe_flavor(player_ptr, o_name, &forge, 0); msg_format(_("%s(%c)を貰った。", "You get %s (%c). "), o_name, index_to_label(item_new)); autopick_alter_item(player_ptr, item_new, FALSE); diff --git a/src/market/building-craft-fix.c b/src/market/building-craft-fix.c index 39059fc04..29dd32361 100644 --- a/src/market/building-craft-fix.c +++ b/src/market/building-craft-fix.c @@ -3,6 +3,7 @@ #include "core/asking-player.h" #include "core/player-update-types.h" #include "core/stuff-handler.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "inventory/inventory-object.h" @@ -14,10 +15,9 @@ #include "object-enchant/tr-types.h" #include "object-hook/hook-enchant.h" #include "object-hook/hook-weapon.h" +#include "object/item-tester-hooker.h" #include "object/item-use-flags.h" #include "object/object-flags.h" -#include "object/object-flavor.h" -#include "object/item-tester-hooker.h" #include "object/object-kind-hook.h" #include "object/object-kind.h" #include "object/object-value.h" @@ -115,7 +115,7 @@ static PRICE repair_broken_weapon_aux(player_type *player_ptr, PRICE bcost) } char basenm[MAX_NLEN]; - object_desc(player_ptr, basenm, o_ptr, OD_NAME_ONLY); + describe_flavor(player_ptr, basenm, o_ptr, OD_NAME_ONLY); prt(format(_("修復する武器 : %s", "Repairing: %s"), basenm), row + 3, 2); q = _("材料となる武器は?", "Which weapon for material? "); @@ -132,14 +132,14 @@ static PRICE repair_broken_weapon_aux(player_type *player_ptr, PRICE bcost) return 0; } - object_desc(player_ptr, basenm, mo_ptr, OD_NAME_ONLY); + describe_flavor(player_ptr, basenm, mo_ptr, OD_NAME_ONLY); prt(format(_("材料とする武器: %s", "Material : %s"), basenm), row + 4, 2); PRICE cost = bcost + object_value_real(player_ptr, o_ptr) * 2; if (!get_check(format(_("$%dかかりますがよろしいですか? ", "Costs %d gold, okay? "), cost))) return 0; if (player_ptr->au < cost) { - object_desc(player_ptr, basenm, o_ptr, OD_NAME_ONLY); + describe_flavor(player_ptr, basenm, o_ptr, OD_NAME_ONLY); msg_format(_("%sを修復するだけのゴールドがありません!", "You do not have the gold to repair %s!"), basenm); msg_print(NULL); return 0; @@ -255,7 +255,7 @@ static PRICE repair_broken_weapon_aux(player_type *player_ptr, PRICE bcost) msg_print(_("これはかなりの業物だったようだ。", "This blade seems to be exceptional.")); } - object_desc(player_ptr, basenm, o_ptr, OD_NAME_ONLY); + describe_flavor(player_ptr, basenm, o_ptr, OD_NAME_ONLY); #ifdef JP msg_format("$%dで%sに修復しました。", cost, basenm); #else diff --git a/src/market/building-craft-weapon.c b/src/market/building-craft-weapon.c index 166066667..4af017c09 100644 --- a/src/market/building-craft-weapon.c +++ b/src/market/building-craft-weapon.c @@ -4,6 +4,7 @@ #include "combat/shoot.h" #include "core/player-update-types.h" #include "core/stuff-handler.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "inventory/inventory-slot-types.h" @@ -11,11 +12,10 @@ #include "market/building-util.h" #include "object-enchant/tr-types.h" #include "object-hook/hook-weapon.h" +#include "object/item-tester-hooker.h" #include "object/item-use-flags.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "object/object-generator.h" -#include "object/item-tester-hooker.h" #include "realm/realm-hex-numbers.h" #include "spell-realm/spells-hex.h" #include "sv-definition/sv-weapon-types.h" @@ -306,7 +306,7 @@ static void list_weapon(player_type *player_ptr, object_type *o_ptr, TERM_LEN ro DICE_SID eff_ds = o_ptr->ds + player_ptr->to_ds[0]; HIT_RELIABILITY reli = player_ptr->skill_thn + (player_ptr->to_h[0] + o_ptr->to_h) * BTH_PLUS_ADJ; - object_desc(player_ptr, o_name, o_ptr, OD_NAME_ONLY); + describe_flavor(player_ptr, o_name, o_ptr, OD_NAME_ONLY); c_put_str(TERM_YELLOW, o_name, row, col); sprintf(tmp_str, _("攻撃回数: %d", "Number of Blows: %d"), player_ptr->num_blow[0]); put_str(tmp_str, row + 1, col); diff --git a/src/market/building-enchanter.c b/src/market/building-enchanter.c index 5190b5117..139da27e3 100644 --- a/src/market/building-enchanter.c +++ b/src/market/building-enchanter.c @@ -1,4 +1,5 @@ #include "market/building-enchanter.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "game-option/disturbance-options.h" @@ -6,7 +7,6 @@ #include "market/building-util.h" #include "mind/racial-android.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "spell/spells-object.h" #include "system/object-type-definition.h" #include "term/screen-processor.h" @@ -39,7 +39,7 @@ bool enchant_item(player_type *player_ptr, PRICE cost, HIT_PROB to_hit, HIT_POIN char tmp_str[MAX_NLEN]; if (player_ptr->au < (cost * o_ptr->number)) { - object_desc(player_ptr, tmp_str, o_ptr, OD_NAME_ONLY); + describe_flavor(player_ptr, tmp_str, o_ptr, OD_NAME_ONLY); msg_format(_("%sを改良するだけのゴールドがありません!", "You do not have the gold to improve %s!"), tmp_str); return FALSE; } @@ -73,7 +73,7 @@ bool enchant_item(player_type *player_ptr, PRICE cost, HIT_PROB to_hit, HIT_POIN return FALSE; } - object_desc(player_ptr, tmp_str, o_ptr, OD_NAME_AND_ENCHANT); + describe_flavor(player_ptr, tmp_str, o_ptr, OD_NAME_AND_ENCHANT); #ifdef JP msg_format("$%dで%sに改良しました。", cost * o_ptr->number, tmp_str); #else diff --git a/src/market/building-recharger.c b/src/market/building-recharger.c index 593c7b1a6..303d877b9 100644 --- a/src/market/building-recharger.c +++ b/src/market/building-recharger.c @@ -3,15 +3,15 @@ #include "core/asking-player.h" #include "core/player-update-types.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "inventory/inventory-slot-types.h" #include "market/building-util.h" #include "object-enchant/special-object-flags.h" #include "object-hook/hook-magic.h" -#include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "object/item-tester-hooker.h" +#include "object/item-use-flags.h" #include "object/object-kind.h" #include "perception/object-perception.h" #include "spell-kind/spells-perception.h" @@ -64,7 +64,7 @@ void building_recharge(player_type *player_ptr) { player_ptr->au -= 50; identify_item(player_ptr, o_ptr); - object_desc(player_ptr, tmp_str, o_ptr, 0); + describe_flavor(player_ptr, tmp_str, o_ptr, 0); msg_format(_("%s です。", "You have: %s."), tmp_str); autopick_alter_item(player_ptr, item, FALSE); @@ -111,7 +111,7 @@ void building_recharge(player_type *player_ptr) } if (player_ptr->au < price) { - object_desc(player_ptr, tmp_str, o_ptr, OD_NAME_ONLY); + describe_flavor(player_ptr, tmp_str, o_ptr, OD_NAME_ONLY); #ifdef JP msg_format("%sを再充填するには$%d 必要です!", tmp_str, price); #else @@ -151,7 +151,7 @@ void building_recharge(player_type *player_ptr) o_ptr->ident &= ~(IDENT_EMPTY); } - object_desc(player_ptr, tmp_str, o_ptr, 0); + describe_flavor(player_ptr, tmp_str, o_ptr, 0); #ifdef JP msg_format("%sを$%d で再充填しました。", tmp_str, price); #else diff --git a/src/mind/mind-mage.c b/src/mind/mind-mage.c index f58c3489a..c142239c5 100644 --- a/src/mind/mind-mage.c +++ b/src/mind/mind-mage.c @@ -6,16 +6,16 @@ #include "mind/mind-mage.h" #include "core/stuff-handler.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "inventory/inventory-object.h" #include "object-enchant/special-object-flags.h" #include "object-hook/hook-enchant.h" #include "object-hook/hook-magic.h" +#include "object/item-tester-hooker.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "object/object-generator.h" -#include "object/item-tester-hooker.h" #include "object/object-kind.h" #include "player/player-class.h" #include "system/object-type-definition.h" @@ -101,7 +101,7 @@ bool eat_magic(player_type *caster_ptr, int power) } if (object_is_fixed_artifact(o_ptr)) { - object_desc(caster_ptr, o_name, o_ptr, OD_NAME_ONLY); + describe_flavor(caster_ptr, o_name, o_ptr, OD_NAME_ONLY); msg_format(_("魔力が逆流した!%sは完全に魔力を失った。", "The recharging backfires - %s is completely drained!"), o_name); if (o_ptr->tval == TV_ROD) o_ptr->timeout = k_ptr->pval * o_ptr->number; @@ -111,7 +111,7 @@ bool eat_magic(player_type *caster_ptr, int power) return redraw_player(caster_ptr); } - object_desc(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); /* Mages recharge objects more safely. */ if (IS_WIZARD_CLASS(caster_ptr)) { diff --git a/src/mind/mind-mindcrafter.c b/src/mind/mind-mindcrafter.c index 081c4854e..15e222c81 100644 --- a/src/mind/mind-mindcrafter.c +++ b/src/mind/mind-mindcrafter.c @@ -3,13 +3,13 @@ #include "core/player-update-types.h" #include "core/window-redrawer.h" #include "flavor/flag-inscriptions-table.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "game-option/auto-destruction-options.h" #include "object-enchant/item-feeling.h" #include "object-enchant/special-object-flags.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "object/object-mark-types.h" #include "perception/object-perception.h" #include "perception/simple-perception.h" @@ -46,7 +46,7 @@ bool psychometry(player_type *caster_ptr) item_feel_type feel = pseudo_value_check_heavy(o_ptr); GAME_TEXT o_name[MAX_NLEN]; - object_desc(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); if (!feel) { msg_format(_("%sからは特に変わった事は感じとれなかった。", "You do not perceive anything unusual about the %s."), o_name); diff --git a/src/monster-attack/monster-eating.c b/src/monster-attack/monster-eating.c index b1c12a8e6..38294a3cc 100644 --- a/src/monster-attack/monster-eating.c +++ b/src/monster-attack/monster-eating.c @@ -8,6 +8,7 @@ #include "core/player-redraw-types.h" #include "core/player-update-types.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor.h" #include "inventory/inventory-object.h" @@ -15,10 +16,9 @@ #include "mind/mind-mirror-master.h" #include "monster/monster-status.h" #include "object-hook/hook-enchant.h" -#include "object/object-flavor.h" #include "object/object-generator.h" -#include "object/object-mark-types.h" #include "object/object-info.h" +#include "object/object-mark-types.h" #include "player/avatar.h" #include "player/mimic-info-table.h" #include "status/experience.h" @@ -132,7 +132,7 @@ void process_eat_item(player_type *target_ptr, monap_type *monap_ptr) if (object_is_artifact(monap_ptr->o_ptr)) continue; - object_desc(target_ptr, monap_ptr->o_name, monap_ptr->o_ptr, OD_OMIT_PREFIX); + describe_flavor(target_ptr, monap_ptr->o_name, monap_ptr->o_ptr, OD_OMIT_PREFIX); #ifdef JP msg_format("%s(%c)を%s盗まれた!", monap_ptr->o_name, index_to_label(i_idx), ((monap_ptr->o_ptr->number > 1) ? "一つ" : "")); #else @@ -160,7 +160,7 @@ void process_eat_food(player_type *target_ptr, monap_type *monap_ptr) if ((monap_ptr->o_ptr->tval != TV_FOOD) && !((monap_ptr->o_ptr->tval == TV_CORPSE) && (monap_ptr->o_ptr->sval))) continue; - object_desc(target_ptr, monap_ptr->o_name, monap_ptr->o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(target_ptr, monap_ptr->o_name, monap_ptr->o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); #ifdef JP msg_format("%s(%c)を%s食べられてしまった!", monap_ptr->o_name, index_to_label(i_idx), ((monap_ptr->o_ptr->number > 1) ? "一つ" : "")); #else diff --git a/src/monster-floor/monster-object.c b/src/monster-floor/monster-object.c index a1720ed91..474d419da 100644 --- a/src/monster-floor/monster-object.c +++ b/src/monster-floor/monster-object.c @@ -5,8 +5,9 @@ */ #include "monster-floor/monster-object.h" -#include "floor/floor.h" +#include "flavor/flavor-describer.h" #include "floor/floor-object.h" +#include "floor/floor.h" #include "grid/grid.h" #include "monster-race/monster-race.h" #include "monster-race/race-flags-resistance.h" @@ -19,7 +20,6 @@ #include "object-enchant/tr-types.h" #include "object-hook/hook-enchant.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "object/object-generator.h" #include "object/object-mark-types.h" #include "util/bit-flags-calculator.h" @@ -30,32 +30,54 @@ */ static void update_object_flags(BIT_FLAGS *flgs, BIT_FLAGS *flg2, BIT_FLAGS *flg3, BIT_FLAGS *flgr) { - if (have_flag(flgs, TR_SLAY_DRAGON)) *flg3 |= (RF3_DRAGON); - if (have_flag(flgs, TR_KILL_DRAGON)) *flg3 |= (RF3_DRAGON); - if (have_flag(flgs, TR_SLAY_TROLL)) *flg3 |= (RF3_TROLL); - if (have_flag(flgs, TR_KILL_TROLL)) *flg3 |= (RF3_TROLL); - if (have_flag(flgs, TR_SLAY_GIANT)) *flg3 |= (RF3_GIANT); - if (have_flag(flgs, TR_KILL_GIANT)) *flg3 |= (RF3_GIANT); - if (have_flag(flgs, TR_SLAY_ORC)) *flg3 |= (RF3_ORC); - if (have_flag(flgs, TR_KILL_ORC)) *flg3 |= (RF3_ORC); - if (have_flag(flgs, TR_SLAY_DEMON)) *flg3 |= (RF3_DEMON); - if (have_flag(flgs, TR_KILL_DEMON)) *flg3 |= (RF3_DEMON); - if (have_flag(flgs, TR_SLAY_UNDEAD)) *flg3 |= (RF3_UNDEAD); - if (have_flag(flgs, TR_KILL_UNDEAD)) *flg3 |= (RF3_UNDEAD); - if (have_flag(flgs, TR_SLAY_ANIMAL)) *flg3 |= (RF3_ANIMAL); - if (have_flag(flgs, TR_KILL_ANIMAL)) *flg3 |= (RF3_ANIMAL); - if (have_flag(flgs, TR_SLAY_EVIL)) *flg3 |= (RF3_EVIL); - if (have_flag(flgs, TR_KILL_EVIL)) *flg3 |= (RF3_EVIL); - if (have_flag(flgs, TR_SLAY_HUMAN)) *flg2 |= (RF2_HUMAN); - if (have_flag(flgs, TR_KILL_HUMAN)) *flg2 |= (RF2_HUMAN); - if (have_flag(flgs, TR_BRAND_ACID)) *flgr |= (RFR_IM_ACID); - if (have_flag(flgs, TR_BRAND_ELEC)) *flgr |= (RFR_IM_ELEC); - if (have_flag(flgs, TR_BRAND_FIRE)) *flgr |= (RFR_IM_FIRE); - if (have_flag(flgs, TR_BRAND_COLD)) *flgr |= (RFR_IM_COLD); - if (have_flag(flgs, TR_BRAND_POIS)) *flgr |= (RFR_IM_POIS); + if (have_flag(flgs, TR_SLAY_DRAGON)) + *flg3 |= (RF3_DRAGON); + if (have_flag(flgs, TR_KILL_DRAGON)) + *flg3 |= (RF3_DRAGON); + if (have_flag(flgs, TR_SLAY_TROLL)) + *flg3 |= (RF3_TROLL); + if (have_flag(flgs, TR_KILL_TROLL)) + *flg3 |= (RF3_TROLL); + if (have_flag(flgs, TR_SLAY_GIANT)) + *flg3 |= (RF3_GIANT); + if (have_flag(flgs, TR_KILL_GIANT)) + *flg3 |= (RF3_GIANT); + if (have_flag(flgs, TR_SLAY_ORC)) + *flg3 |= (RF3_ORC); + if (have_flag(flgs, TR_KILL_ORC)) + *flg3 |= (RF3_ORC); + if (have_flag(flgs, TR_SLAY_DEMON)) + *flg3 |= (RF3_DEMON); + if (have_flag(flgs, TR_KILL_DEMON)) + *flg3 |= (RF3_DEMON); + if (have_flag(flgs, TR_SLAY_UNDEAD)) + *flg3 |= (RF3_UNDEAD); + if (have_flag(flgs, TR_KILL_UNDEAD)) + *flg3 |= (RF3_UNDEAD); + if (have_flag(flgs, TR_SLAY_ANIMAL)) + *flg3 |= (RF3_ANIMAL); + if (have_flag(flgs, TR_KILL_ANIMAL)) + *flg3 |= (RF3_ANIMAL); + if (have_flag(flgs, TR_SLAY_EVIL)) + *flg3 |= (RF3_EVIL); + if (have_flag(flgs, TR_KILL_EVIL)) + *flg3 |= (RF3_EVIL); + if (have_flag(flgs, TR_SLAY_HUMAN)) + *flg2 |= (RF2_HUMAN); + if (have_flag(flgs, TR_KILL_HUMAN)) + *flg2 |= (RF2_HUMAN); + if (have_flag(flgs, TR_BRAND_ACID)) + *flgr |= (RFR_IM_ACID); + if (have_flag(flgs, TR_BRAND_ELEC)) + *flgr |= (RFR_IM_ELEC); + if (have_flag(flgs, TR_BRAND_FIRE)) + *flgr |= (RFR_IM_FIRE); + if (have_flag(flgs, TR_BRAND_COLD)) + *flgr |= (RFR_IM_COLD); + if (have_flag(flgs, TR_BRAND_POIS)) + *flgr |= (RFR_IM_POIS); } - /*! * @brief モンスターがアイテムを拾うか壊す処理 * @param target_ptr プレーヤーへの参照ポインタ @@ -70,97 +92,86 @@ static void update_object_flags(BIT_FLAGS *flgs, BIT_FLAGS *flg2, BIT_FLAGS *flg * @param this_o_idx モンスターが乗ったオブジェクトID * @return なし */ -static void monster_pickup_object( - player_type *target_ptr, turn_flags *turn_flags_ptr, MONSTER_IDX m_idx, object_type *o_ptr, bool is_special_object, - POSITION ny, POSITION nx, GAME_TEXT *m_name, GAME_TEXT *o_name, OBJECT_IDX this_o_idx) +static void monster_pickup_object(player_type *target_ptr, turn_flags *turn_flags_ptr, MONSTER_IDX m_idx, object_type *o_ptr, bool is_special_object, + POSITION ny, POSITION nx, GAME_TEXT *m_name, GAME_TEXT *o_name, OBJECT_IDX this_o_idx) { - monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - if (is_special_object) - { - if (turn_flags_ptr->do_take && (r_ptr->flags2 & RF2_STUPID)) - { - turn_flags_ptr->did_take_item = TRUE; - if (m_ptr->ml && player_can_see_bold(target_ptr, ny, nx)) - { - msg_format(_("%^sは%sを拾おうとしたが、だめだった。", "%^s tries to pick up %s, but fails."), m_name, o_name); - } - } - - return; - } - - if (turn_flags_ptr->do_take) - { - turn_flags_ptr->did_take_item = TRUE; - if (player_can_see_bold(target_ptr, ny, nx)) - { - msg_format(_("%^sが%sを拾った。", "%^s picks up %s."), m_name, o_name); - } - - excise_object_idx(target_ptr->current_floor_ptr, this_o_idx); - o_ptr->marked &= OM_TOUCHED; - o_ptr->iy = o_ptr->ix = 0; - o_ptr->held_m_idx = m_idx; - o_ptr->next_o_idx = m_ptr->hold_o_idx; - m_ptr->hold_o_idx = this_o_idx; - return; - } - - if (is_pet(m_ptr)) return; - - turn_flags_ptr->did_kill_item = TRUE; - if (player_has_los_bold(target_ptr, ny, nx)) - { - msg_format(_("%^sが%sを破壊した。", "%^s destroys %s."), m_name, o_name); - } - - delete_object_idx(target_ptr, this_o_idx); -} + monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx]; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + if (is_special_object) { + if (turn_flags_ptr->do_take && (r_ptr->flags2 & RF2_STUPID)) { + turn_flags_ptr->did_take_item = TRUE; + if (m_ptr->ml && player_can_see_bold(target_ptr, ny, nx)) { + msg_format(_("%^sは%sを拾おうとしたが、だめだった。", "%^s tries to pick up %s, but fails."), m_name, o_name); + } + } + + return; + } + if (turn_flags_ptr->do_take) { + turn_flags_ptr->did_take_item = TRUE; + if (player_can_see_bold(target_ptr, ny, nx)) { + msg_format(_("%^sが%sを拾った。", "%^s picks up %s."), m_name, o_name); + } + + excise_object_idx(target_ptr->current_floor_ptr, this_o_idx); + o_ptr->marked &= OM_TOUCHED; + o_ptr->iy = o_ptr->ix = 0; + o_ptr->held_m_idx = m_idx; + o_ptr->next_o_idx = m_ptr->hold_o_idx; + m_ptr->hold_o_idx = this_o_idx; + return; + } + + if (is_pet(m_ptr)) + return; + + turn_flags_ptr->did_kill_item = TRUE; + if (player_has_los_bold(target_ptr, ny, nx)) { + msg_format(_("%^sが%sを破壊した。", "%^s destroys %s."), m_name, o_name); + } + + delete_object_idx(target_ptr, this_o_idx); +} /*! - * @brief モンスターの移動に伴うオブジェクト処理 (アイテム破壊等) - * @param target_ptr プレーヤーへの参照ポインタ - * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ - * @param m_idx モンスターID - * @param ny 移動後の、モンスターのY座標 - * @param nx 移動後の、モンスターのX座標 - */ + * @brief モンスターの移動に伴うオブジェクト処理 (アイテム破壊等) + * @param target_ptr プレーヤーへの参照ポインタ + * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ + * @param m_idx モンスターID + * @param ny 移動後の、モンスターのY座標 + * @param nx 移動後の、モンスターのX座標 + */ void update_object_by_monster_movement(player_type *target_ptr, turn_flags *turn_flags_ptr, MONSTER_IDX m_idx, POSITION ny, POSITION nx) { - monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - grid_type *g_ptr; - g_ptr = &target_ptr->current_floor_ptr->grid_array[ny][nx]; - - turn_flags_ptr->do_take = (r_ptr->flags2 & RF2_TAKE_ITEM) != 0; - OBJECT_IDX next_o_idx; - for (OBJECT_IDX this_o_idx = g_ptr->o_idx; this_o_idx > 0; this_o_idx = next_o_idx) - { - BIT_FLAGS flgs[TR_FLAG_SIZE], flg2 = 0L, flg3 = 0L, flgr = 0L; - GAME_TEXT m_name[MAX_NLEN], o_name[MAX_NLEN]; - object_type *o_ptr = &target_ptr->current_floor_ptr->o_list[this_o_idx]; - next_o_idx = o_ptr->next_o_idx; - - if (turn_flags_ptr->do_take) - { - /* Skip gold, corpse and statue */ - if (o_ptr->tval == TV_GOLD || (o_ptr->tval == TV_CORPSE) || (o_ptr->tval == TV_STATUE)) - continue; - } - - object_flags(target_ptr, o_ptr, flgs); - object_desc(target_ptr, o_name, o_ptr, 0); - monster_desc(target_ptr, m_name, m_ptr, MD_INDEF_HIDDEN); - update_object_flags(flgs, &flg2, &flg3, &flgr); - - bool is_special_object = object_is_artifact(o_ptr) || - ((r_ptr->flags3 & flg3) != 0) || - ((r_ptr->flags2 & flg2) != 0) || - (((~(r_ptr->flagsr) & flgr) != 0) && !(r_ptr->flagsr & RFR_RES_ALL)); - monster_pickup_object(target_ptr, turn_flags_ptr, m_idx, o_ptr, is_special_object, ny, nx, m_name, o_name, this_o_idx); - } + monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx]; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + grid_type *g_ptr; + g_ptr = &target_ptr->current_floor_ptr->grid_array[ny][nx]; + + turn_flags_ptr->do_take = (r_ptr->flags2 & RF2_TAKE_ITEM) != 0; + OBJECT_IDX next_o_idx; + for (OBJECT_IDX this_o_idx = g_ptr->o_idx; this_o_idx > 0; this_o_idx = next_o_idx) { + BIT_FLAGS flgs[TR_FLAG_SIZE], flg2 = 0L, flg3 = 0L, flgr = 0L; + GAME_TEXT m_name[MAX_NLEN], o_name[MAX_NLEN]; + object_type *o_ptr = &target_ptr->current_floor_ptr->o_list[this_o_idx]; + next_o_idx = o_ptr->next_o_idx; + + if (turn_flags_ptr->do_take) { + /* Skip gold, corpse and statue */ + if (o_ptr->tval == TV_GOLD || (o_ptr->tval == TV_CORPSE) || (o_ptr->tval == TV_STATUE)) + continue; + } + + object_flags(target_ptr, o_ptr, flgs); + describe_flavor(target_ptr, o_name, o_ptr, 0); + monster_desc(target_ptr, m_name, m_ptr, MD_INDEF_HIDDEN); + update_object_flags(flgs, &flg2, &flg3, &flgr); + + bool is_special_object = object_is_artifact(o_ptr) || ((r_ptr->flags3 & flg3) != 0) || ((r_ptr->flags2 & flg2) != 0) + || (((~(r_ptr->flagsr) & flgr) != 0) && !(r_ptr->flagsr & RFR_RES_ALL)); + monster_pickup_object(target_ptr, turn_flags_ptr, m_idx, o_ptr, is_special_object, ny, nx, m_name, o_name, this_o_idx); + } } /*! diff --git a/src/monster-floor/one-monster-placer.c b/src/monster-floor/one-monster-placer.c index e906e3144..c3e62271e 100644 --- a/src/monster-floor/one-monster-placer.c +++ b/src/monster-floor/one-monster-placer.c @@ -9,6 +9,7 @@ #include "core/speed-table.h" #include "dungeon/quest.h" #include "effect/effect-characteristics.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-save.h" #include "floor/floor.h" @@ -30,7 +31,6 @@ #include "monster/monster-status.h" #include "monster/monster-update.h" #include "monster/monster-util.h" -#include "object/object-flavor.h" #include "object/warning.h" #include "spell/process-effect.h" #include "spell/spell-types.h" @@ -216,7 +216,7 @@ static void warn_unique_generation(player_type *player_ptr, MONRACE_IDX r_idx) o_ptr = choose_warning_item(player_ptr); if (o_ptr != NULL) { - object_desc(player_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(player_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); msg_format(_("%sは%s光った。", "%s glows %s."), o_name, color); } else { msg_format(_("%s光る物が頭に浮かんだ。", "An %s image forms in your mind."), color); diff --git a/src/object-enchant/object-curse.c b/src/object-enchant/object-curse.c index fa5746e25..3317312b4 100644 --- a/src/object-enchant/object-curse.c +++ b/src/object-enchant/object-curse.c @@ -1,5 +1,6 @@ #include "object-enchant/object-curse.h" #include "core/player-update-types.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "inventory/inventory-slot-types.h" #include "object-enchant/item-feeling.h" @@ -10,7 +11,6 @@ #include "object-hook/hook-enchant.h" #include "object-hook/hook-weapon.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "util/bit-flags-calculator.h" #include "view/display-messages.h" @@ -26,33 +26,31 @@ */ BIT_FLAGS get_curse(player_type *owner_ptr, int power, object_type *o_ptr) { - BIT_FLAGS new_curse; + BIT_FLAGS new_curse; - while (TRUE) - { - new_curse = (1 << (randint0(MAX_CURSE)+4)); - if (power == 2) - { - if (!(new_curse & TRC_HEAVY_MASK)) continue; - } - else if (power == 1) - { - if (new_curse & TRC_SPECIAL_MASK) continue; - } - else if (power == 0) - { - if (new_curse & TRC_HEAVY_MASK) continue; - } + while (TRUE) { + new_curse = (1 << (randint0(MAX_CURSE) + 4)); + if (power == 2) { + if (!(new_curse & TRC_HEAVY_MASK)) + continue; + } else if (power == 1) { + if (new_curse & TRC_SPECIAL_MASK) + continue; + } else if (power == 0) { + if (new_curse & TRC_HEAVY_MASK) + continue; + } - if (new_curse == TRC_LOW_MELEE && !object_is_weapon(owner_ptr, o_ptr)) continue; - if (new_curse == TRC_LOW_AC && !object_is_armour(owner_ptr, o_ptr)) continue; - break; - } + if (new_curse == TRC_LOW_MELEE && !object_is_weapon(owner_ptr, o_ptr)) + continue; + if (new_curse == TRC_LOW_AC && !object_is_armour(owner_ptr, o_ptr)) + continue; + break; + } - return new_curse; + return new_curse; } - /*! * @brief 装備への呪い付加判定と付加処理 * @param owner_ptr プレーヤーへの参照ポインタ @@ -62,59 +60,55 @@ BIT_FLAGS get_curse(player_type *owner_ptr, int power, object_type *o_ptr) */ void curse_equipment(player_type *owner_ptr, PERCENTAGE chance, PERCENTAGE heavy_chance) { - if (randint1(100) > chance) return; + if (randint1(100) > chance) + return; - object_type *o_ptr = &owner_ptr->inventory_list[INVEN_RARM + randint0(12)]; - if (!o_ptr->k_idx) return; - BIT_FLAGS oflgs[TR_FLAG_SIZE]; - object_flags(owner_ptr, o_ptr, oflgs); - GAME_TEXT o_name[MAX_NLEN]; - object_desc(owner_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + object_type *o_ptr = &owner_ptr->inventory_list[INVEN_RARM + randint0(12)]; + if (!o_ptr->k_idx) + return; + BIT_FLAGS oflgs[TR_FLAG_SIZE]; + object_flags(owner_ptr, o_ptr, oflgs); + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(owner_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - /* Extra, biased saving throw for blessed items */ - if (have_flag(oflgs, TR_BLESSED)) - { + /* Extra, biased saving throw for blessed items */ + if (have_flag(oflgs, TR_BLESSED)) { #ifdef JP - msg_format("祝福された%sは呪いを跳ね返した!", o_name); + msg_format("祝福された%sは呪いを跳ね返した!", o_name); #else - msg_format("Your blessed %s resist%s cursing!", o_name, ((o_ptr->number > 1) ? "" : "s")); + msg_format("Your blessed %s resist%s cursing!", o_name, ((o_ptr->number > 1) ? "" : "s")); #endif - /* Hmmm -- can we wear multiple items? If not, this is unnecessary */ - return; - } + /* Hmmm -- can we wear multiple items? If not, this is unnecessary */ + return; + } - bool changed = FALSE; - int curse_power = 0; - if ((randint1(100) <= heavy_chance) && - (object_is_artifact(o_ptr) || object_is_ego(o_ptr))) - { - if (!(o_ptr->curse_flags & TRC_HEAVY_CURSE)) - changed = TRUE; - o_ptr->curse_flags |= TRC_HEAVY_CURSE; - o_ptr->curse_flags |= TRC_CURSED; - curse_power++; - } - else - { - if (!object_is_cursed(o_ptr)) - changed = TRUE; - o_ptr->curse_flags |= TRC_CURSED; - } + bool changed = FALSE; + int curse_power = 0; + if ((randint1(100) <= heavy_chance) && (object_is_artifact(o_ptr) || object_is_ego(o_ptr))) { + if (!(o_ptr->curse_flags & TRC_HEAVY_CURSE)) + changed = TRUE; + o_ptr->curse_flags |= TRC_HEAVY_CURSE; + o_ptr->curse_flags |= TRC_CURSED; + curse_power++; + } else { + if (!object_is_cursed(o_ptr)) + changed = TRUE; + o_ptr->curse_flags |= TRC_CURSED; + } - if (heavy_chance >= 50) curse_power++; + if (heavy_chance >= 50) + curse_power++; - BIT_FLAGS new_curse = get_curse(owner_ptr, curse_power, o_ptr); - if (!(o_ptr->curse_flags & new_curse)) - { - changed = TRUE; - o_ptr->curse_flags |= new_curse; - } + BIT_FLAGS new_curse = get_curse(owner_ptr, curse_power, o_ptr); + if (!(o_ptr->curse_flags & new_curse)) { + changed = TRUE; + o_ptr->curse_flags |= new_curse; + } - if (changed) - { - msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding %s..."), o_name); - o_ptr->feeling = FEEL_NONE; - } + if (changed) { + msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding %s..."), o_name); + o_ptr->feeling = FEEL_NONE; + } - owner_ptr->update |= PU_BONUS; + owner_ptr->update |= PU_BONUS; } diff --git a/src/object/object-flavor.c b/src/object/object-flavor.c index a8fd48108..3edc6992b 100644 --- a/src/object/object-flavor.c +++ b/src/object/object-flavor.c @@ -261,1012 +261,6 @@ void flavor_init(void) } /*! - * @brief オブジェクトの各表記を返すメイン関数 / Creates a description of the item "o_ptr", and stores it in "out_val". - * @param player_ptr プレーヤーへの参照ポインタ - * @param buf 表記を返すための文字列参照ポインタ - * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ - * @param mode 表記に関するオプション指定 - * @return 現在クエスト達成目的のアイテムならばTRUEを返す - */ -void object_desc(player_type *player_ptr, char *buf, object_type *o_ptr, BIT_FLAGS mode) -{ - concptr kindname = k_name + k_info[o_ptr->k_idx].name; - concptr basenm = kindname; - concptr modstr = ""; - int power; - int fire_rate; - bool aware = FALSE; - bool known = FALSE; - bool flavor = TRUE; - bool show_weapon = FALSE; - bool show_armour = FALSE; - concptr s, s0; - char *t; - char p1 = '(', p2 = ')'; - char b1 = '[', b2 = ']'; - char c1 = '{', c2 = '}'; - char tmp_val[MAX_NLEN + 160]; - char tmp_val2[MAX_NLEN + 10]; - char fake_insc_buf[30]; - BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_type *bow_ptr; - object_kind *k_ptr = &k_info[o_ptr->k_idx]; - object_kind *flavor_k_ptr = &k_info[k_ptr->flavor]; - - object_flags(player_ptr, o_ptr, flgs); - if (object_is_aware(o_ptr)) - aware = TRUE; - - if (object_is_known(o_ptr)) - known = TRUE; - - if (aware && ((mode & OD_NO_FLAVOR) || plain_descriptions)) - flavor = FALSE; - - if ((mode & OD_STORE) || (o_ptr->ident & IDENT_STORE)) { - flavor = FALSE; - aware = TRUE; - known = TRUE; - } - - if (mode & OD_FORCE_FLAVOR) { - aware = FALSE; - flavor = TRUE; - known = FALSE; - flavor_k_ptr = k_ptr; - } - - switch (o_ptr->tval) { - case TV_SKELETON: - case TV_BOTTLE: - case TV_JUNK: - case TV_SPIKE: - case TV_FLASK: - case TV_CHEST: - case TV_WHISTLE: - break; - case TV_CAPTURE: { - monster_race *r_ptr = &r_info[o_ptr->pval]; - if (known) { - if (!o_ptr->pval) { - modstr = _(" (空)", " (empty)"); - } else { -#ifdef JP - sprintf(tmp_val2, " (%s)", r_name + r_ptr->name); - modstr = tmp_val2; -#else - t = r_name + r_ptr->name; - - if (!(r_ptr->flags1 & RF1_UNIQUE)) { - sprintf(tmp_val2, " (%s%s)", (is_a_vowel(*t) ? "an " : "a "), t); - - modstr = tmp_val2; - } else { - sprintf(tmp_val2, "(%s)", t); - - modstr = t; - } -#endif - } - } - - break; - } - case TV_FIGURINE: - case TV_STATUE: { - monster_race *r_ptr = &r_info[o_ptr->pval]; -#ifdef JP - modstr = r_name + r_ptr->name; -#else - t = r_name + r_ptr->name; - - if (!(r_ptr->flags1 & RF1_UNIQUE)) { - sprintf(tmp_val2, "%s%s", (is_a_vowel(*t) ? "an " : "a "), t); - modstr = tmp_val2; - } else - modstr = t; -#endif - - break; - } - case TV_CORPSE: { - monster_race *r_ptr = &r_info[o_ptr->pval]; - modstr = r_name + r_ptr->name; -#ifdef JP - basenm = "#%"; -#else - if (r_ptr->flags1 & RF1_UNIQUE) - basenm = "& % of #"; - else - basenm = "& # %"; -#endif - - break; - } - case TV_SHOT: - case TV_BOLT: - case TV_ARROW: - case TV_BOW: - case TV_HAFTED: - case TV_POLEARM: - case TV_SWORD: - case TV_DIGGING: { - show_weapon = TRUE; - break; - } - case TV_BOOTS: - case TV_GLOVES: - case TV_CLOAK: - case TV_CROWN: - case TV_HELM: - case TV_SHIELD: - case TV_SOFT_ARMOR: - case TV_HARD_ARMOR: - case TV_DRAG_ARMOR: { - show_armour = TRUE; - break; - } - case TV_LITE: - break; - case TV_AMULET: { - if (aware) { - if (object_is_fixed_artifact(o_ptr)) - break; - if (k_ptr->gen_flags & TRG_INSTA_ART) - break; - } - - modstr = k_name + flavor_k_ptr->flavor_name; - if (!flavor) - basenm = _("%のアミュレット", "& Amulet~ of %"); - else if (aware) - basenm = _("%の#アミュレット", "& # Amulet~ of %"); - else - basenm = _("#アミュレット", "& # Amulet~"); - - break; - } - case TV_RING: { - if (aware) { - if (object_is_fixed_artifact(o_ptr)) - break; - if (k_ptr->gen_flags & TRG_INSTA_ART) - break; - } - - modstr = k_name + flavor_k_ptr->flavor_name; - if (!flavor) - basenm = _("%の指輪", "& Ring~ of %"); - else if (aware) - basenm = _("%の#指輪", "& # Ring~ of %"); - else - basenm = _("#指輪", "& # Ring~"); - - if (!k_ptr->to_h && !k_ptr->to_d && (o_ptr->to_h || o_ptr->to_d)) - show_weapon = TRUE; - - break; - } - case TV_CARD: - break; - case TV_STAFF: { - modstr = k_name + flavor_k_ptr->flavor_name; - if (!flavor) - basenm = _("%の杖", "& Staff~ of %"); - else if (aware) - basenm = _("%の#杖", "& # Staff~ of %"); - else - basenm = _("#杖", "& # Staff~"); - - break; - } - case TV_WAND: { - modstr = k_name + flavor_k_ptr->flavor_name; - if (!flavor) - basenm = _("%の魔法棒", "& Wand~ of %"); - else if (aware) - basenm = _("%の#魔法棒", "& # Wand~ of %"); - else - basenm = _("#魔法棒", "& # Wand~"); - - break; - } - case TV_ROD: { - modstr = k_name + flavor_k_ptr->flavor_name; - if (!flavor) - basenm = _("%のロッド", "& Rod~ of %"); - else if (aware) - basenm = _("%の#ロッド", "& # Rod~ of %"); - else - basenm = _("#ロッド", "& # Rod~"); - - break; - } - case TV_SCROLL: { - modstr = k_name + flavor_k_ptr->flavor_name; - if (!flavor) - basenm = _("%の巻物", "& Scroll~ of %"); - else if (aware) - basenm = _("「#」と書かれた%の巻物", "& Scroll~ titled \"#\" of %"); - else - basenm = _("「#」と書かれた巻物", "& Scroll~ titled \"#\""); - - break; - } - case TV_POTION: { - modstr = k_name + flavor_k_ptr->flavor_name; - if (!flavor) - basenm = _("%の薬", "& Potion~ of %"); - else if (aware) - basenm = _("%の#薬", "& # Potion~ of %"); - else - basenm = _("#薬", "& # Potion~"); - - break; - } - case TV_FOOD: { - if (!k_ptr->flavor_name) - break; - - modstr = k_name + flavor_k_ptr->flavor_name; - if (!flavor) - basenm = _("%のキノコ", "& Mushroom~ of %"); - else if (aware) - basenm = _("%の#キノコ", "& # Mushroom~ of %"); - else - basenm = _("#キノコ", "& # Mushroom~"); - - break; - } - case TV_PARCHMENT: { - basenm = _("羊皮紙 - %", "& Parchment~ - %"); - break; - } - case TV_LIFE_BOOK: { -#ifdef JP - basenm = "生命の魔法書%"; -#else - if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Life Magic %"; - else - basenm = "& Life Spellbook~ %"; -#endif - - break; - } - case TV_SORCERY_BOOK: { -#ifdef JP - basenm = "仙術の魔法書%"; -#else - if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Sorcery %"; - else - basenm = "& Sorcery Spellbook~ %"; -#endif - - break; - } - case TV_NATURE_BOOK: { -#ifdef JP - basenm = "自然の魔法書%"; -#else - if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Nature Magic %"; - else - basenm = "& Nature Spellbook~ %"; -#endif - - break; - } - case TV_CHAOS_BOOK: { -#ifdef JP - basenm = "カオスの魔法書%"; -#else - if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Chaos Magic %"; - else - basenm = "& Chaos Spellbook~ %"; -#endif - - break; - } - case TV_DEATH_BOOK: { -#ifdef JP - basenm = "暗黒の魔法書%"; -#else - if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Death Magic %"; - else - basenm = "& Death Spellbook~ %"; -#endif - - break; - } - case TV_TRUMP_BOOK: { -#ifdef JP - basenm = "トランプの魔法書%"; -#else - if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Trump Magic %"; - else - basenm = "& Trump Spellbook~ %"; -#endif - - break; - } - case TV_ARCANE_BOOK: { -#ifdef JP - basenm = "秘術の魔法書%"; -#else - if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Arcane Magic %"; - else - basenm = "& Arcane Spellbook~ %"; -#endif - - break; - } - case TV_CRAFT_BOOK: { -#ifdef JP - basenm = "匠の魔法書%"; -#else - if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Craft Magic %"; - else - basenm = "& Craft Spellbook~ %"; -#endif - - break; - } - case TV_DAEMON_BOOK: { -#ifdef JP - basenm = "悪魔の魔法書%"; -#else - if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Daemon Magic %"; - else - basenm = "& Daemon Spellbook~ %"; -#endif - - break; - } - case TV_CRUSADE_BOOK: { -#ifdef JP - basenm = "破邪の魔法書%"; -#else - if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Crusade Magic %"; - else - basenm = "& Crusade Spellbook~ %"; -#endif - - break; - } - case TV_MUSIC_BOOK: { - basenm = _("歌集%", "& Song Book~ %"); - break; - } - case TV_HISSATSU_BOOK: { - basenm = _("& 武芸の書%", "Book~ of Kendo %"); - break; - } - case TV_HEX_BOOK: { -#ifdef JP - basenm = "呪術の魔法書%"; -#else - if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Hex Magic %"; - else - basenm = "& Hex Spellbook~ %"; -#endif - - break; - } - case TV_GOLD: { - strcpy(buf, basenm); - return; - } - default: { - strcpy(buf, _("(なし)", "(nothing)")); - return; - } - } - - if (aware && have_flag(flgs, TR_FULL_NAME)) { - if (known && o_ptr->name1) - basenm = a_name + a_info[o_ptr->name1].name; - else - basenm = kindname; - } - - t = tmp_val; -#ifdef JP - if (basenm[0] == '&') - s = basenm + 2; - else - s = basenm; - - /* No prefix */ - if (mode & OD_OMIT_PREFIX) { - /* Nothing */ - } else if (o_ptr->number > 1) { - t = object_desc_count_japanese(t, o_ptr); - t = object_desc_str(t, "の "); - } - - // 英語の場合アーティファクトは The が付くので分かるが、日本語では分からないのでマークをつける. - if (known) { - if (object_is_fixed_artifact(o_ptr)) - t = object_desc_str(t, "★"); - else if (o_ptr->art_name) - t = object_desc_str(t, "☆"); - } -#else - - if (basenm[0] == '&') { - s = basenm + 2; - if (mode & OD_OMIT_PREFIX) { - /* Nothing */ - } else if (o_ptr->number <= 0) - t = object_desc_str(t, "no more "); - else if (o_ptr->number > 1) { - t = object_desc_num(t, o_ptr->number); - t = object_desc_chr(t, ' '); - } else if ((known && object_is_artifact(o_ptr)) || ((o_ptr->tval == TV_CORPSE) && (r_info[o_ptr->pval].flags1 & RF1_UNIQUE))) - t = object_desc_str(t, "The "); - else { - bool vowel; - switch (*s) { - case '#': - vowel = is_a_vowel(modstr[0]); - break; - case '%': - vowel = is_a_vowel(*kindname); - break; - default: - vowel = is_a_vowel(*s); - break; - } - - if (vowel) - t = object_desc_str(t, "an "); - else - t = object_desc_str(t, "a "); - } - } else { - s = basenm; - if (mode & OD_OMIT_PREFIX) { - /* Nothing */ - } else if (o_ptr->number <= 0) - t = object_desc_str(t, "no more "); - else if (o_ptr->number > 1) { - t = object_desc_num(t, o_ptr->number); - t = object_desc_chr(t, ' '); - } else if (known && object_is_artifact(o_ptr)) - t = object_desc_str(t, "The "); - } -#endif - -#ifdef JP - if (object_is_smith(player_ptr, o_ptr)) - t = object_desc_str(t, format("鍛冶師%sの", player_ptr->name)); - - /* 伝説のアイテム、名のあるアイテムの名前を付加する */ - if (known) { - /* ランダム・アーティファクト */ - if (o_ptr->art_name) { - concptr temp = quark_str(o_ptr->art_name); - - /* '『' から始まらない伝説のアイテムの名前は最初に付加する */ - /* 英語版のセーブファイルから来た 'of XXX' は,「XXXの」と表示する */ - if (strncmp(temp, "of ", 3) == 0) { - t = object_desc_str(t, &temp[3]); - t = object_desc_str(t, "の"); - } else if ((strncmp(temp, "『", 2) != 0) && (strncmp(temp, "《", 2) != 0) && (temp[0] != '\'')) - t = object_desc_str(t, temp); - } - /* 伝説のアイテム */ - else if (o_ptr->name1 && !have_flag(flgs, TR_FULL_NAME)) { - artifact_type *a_ptr = &a_info[o_ptr->name1]; - /* '『' から始まらない伝説のアイテムの名前は最初に付加する */ - if (strncmp(a_name + a_ptr->name, "『", 2) != 0) { - t = object_desc_str(t, a_name + a_ptr->name); - } - } - /* 名のあるアイテム */ - else if (object_is_ego(o_ptr)) { - ego_item_type *e_ptr = &e_info[o_ptr->name2]; - t = object_desc_str(t, e_name + e_ptr->name); - } - } -#endif - - for (s0 = NULL; *s || s0;) { - if (!*s) { - s = s0 + 1; - s0 = NULL; - } else if ((*s == '#') && !s0) { - s0 = s; - s = modstr; - modstr = ""; - } else if ((*s == '%') && !s0) { - s0 = s; - s = kindname; - kindname = ""; - } - -#ifdef JP -#else - else if (*s == '~') { - if (!(mode & OD_NO_PLURAL) && (o_ptr->number != 1)) { - char k = t[-1]; - if ((k == 's') || (k == 'h')) - *t++ = 'e'; - - *t++ = 's'; - } - - s++; - } -#endif - else - *t++ = *s++; - } - - *t = '\0'; - -#ifdef JP - /* '『'から始まる伝説のアイテムの名前は最後に付加する */ - if (known) { - // ランダムアーティファクトの名前はセーブファイルに記録されるので、英語版の名前もそれらしく変換する. - if (o_ptr->art_name) { - char temp[256]; - int itemp; - strcpy(temp, quark_str(o_ptr->art_name)); - if (strncmp(temp, "『", 2) == 0 || strncmp(temp, "《", 2) == 0) - t = object_desc_str(t, temp); - else if (temp[0] == '\'') { - itemp = strlen(temp); - temp[itemp - 1] = 0; - t = object_desc_str(t, "『"); - t = object_desc_str(t, &temp[1]); - t = object_desc_str(t, "』"); - } - } else if (object_is_fixed_artifact(o_ptr)) { - artifact_type *a_ptr = &a_info[o_ptr->name1]; - if (strncmp(a_name + a_ptr->name, "『", 2) == 0) - t = object_desc_str(t, a_name + a_ptr->name); - } else if (o_ptr->inscription) { - concptr str = quark_str(o_ptr->inscription); - while (*str) { - if (iskanji(*str)) { - str += 2; - continue; - } - - if (*str == '#') - break; - - str++; - } - - if (*str) { - concptr str_aux = angband_strchr(quark_str(o_ptr->inscription), '#'); - t = object_desc_str(t, "『"); - t = object_desc_str(t, &str_aux[1]); - t = object_desc_str(t, "』"); - } - } - } -#else - if (object_is_smith(player_ptr, o_ptr)) - t = object_desc_str(t, format(" of %s the Smith", player_ptr->name)); - - if (known && !have_flag(flgs, TR_FULL_NAME)) { - if (o_ptr->art_name) { - t = object_desc_chr(t, ' '); - t = object_desc_str(t, quark_str(o_ptr->art_name)); - } else if (object_is_fixed_artifact(o_ptr)) { - artifact_type *a_ptr = &a_info[o_ptr->name1]; - - t = object_desc_chr(t, ' '); - t = object_desc_str(t, a_name + a_ptr->name); - } else { - if (object_is_ego(o_ptr)) { - ego_item_type *e_ptr = &e_info[o_ptr->name2]; - t = object_desc_chr(t, ' '); - t = object_desc_str(t, e_name + e_ptr->name); - } - - if (o_ptr->inscription && angband_strchr(quark_str(o_ptr->inscription), '#')) { - concptr str = angband_strchr(quark_str(o_ptr->inscription), '#'); - t = object_desc_chr(t, ' '); - t = object_desc_str(t, &str[1]); - } - } - } -#endif - - if (mode & OD_NAME_ONLY) { - angband_strcpy(buf, tmp_val, MAX_NLEN); - return; - } - - if (o_ptr->tval == TV_CHEST) { - if (!known) { - /* Nothing */ - } else if (!o_ptr->pval) - t = object_desc_str(t, _("(空)", " (empty)")); - else if (o_ptr->pval < 0) - if (chest_traps[0 - o_ptr->pval]) - t = object_desc_str(t, _("(解除済)", " (disarmed)")); - else - t = object_desc_str(t, _("(非施錠)", " (unlocked)")); - else { - switch (chest_traps[o_ptr->pval]) { - case 0: { - t = object_desc_str(t, _("(施錠)", " (Locked)")); - break; - } - case CHEST_LOSE_STR: { - t = object_desc_str(t, _("(毒針)", " (Poison Needle)")); - break; - } - case CHEST_LOSE_CON: { - t = object_desc_str(t, _("(毒針)", " (Poison Needle)")); - break; - } - case CHEST_POISON: { - t = object_desc_str(t, _("(ガス・トラップ)", " (Gas Trap)")); - break; - } - case CHEST_PARALYZE: { - t = object_desc_str(t, _("(ガス・トラップ)", " (Gas Trap)")); - break; - } - case CHEST_EXPLODE: { - t = object_desc_str(t, _("(爆発装置)", " (Explosion Device)")); - break; - } - case CHEST_SUMMON: - case CHEST_BIRD_STORM: - case CHEST_E_SUMMON: - case CHEST_H_SUMMON: { - t = object_desc_str(t, _("(召喚のルーン)", " (Summoning Runes)")); - break; - } - case CHEST_RUNES_OF_EVIL: { - t = object_desc_str(t, _("(邪悪なルーン)", " (Gleaming Black Runes)")); - break; - } - case CHEST_ALARM: { - t = object_desc_str(t, _("(警報装置)", " (Alarm)")); - break; - } - default: { - t = object_desc_str(t, _("(マルチ・トラップ)", " (Multiple Traps)")); - break; - } - } - } - } - - if (have_flag(flgs, TR_SHOW_MODS)) - show_weapon = TRUE; - - if (object_is_smith(player_ptr, o_ptr) && (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE)) - show_weapon = TRUE; - - if (o_ptr->to_h && o_ptr->to_d) - show_weapon = TRUE; - - if (o_ptr->ac) - show_armour = TRUE; - - switch (o_ptr->tval) { - case TV_SHOT: - case TV_BOLT: - case TV_ARROW: - case TV_HAFTED: - case TV_POLEARM: - case TV_SWORD: - case TV_DIGGING: { - if (object_is_quest_target(player_ptr, o_ptr) && !known) - break; - - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_num(t, o_ptr->dd); - t = object_desc_chr(t, 'd'); - t = object_desc_num(t, o_ptr->ds); - t = object_desc_chr(t, p2); - break; - } - case TV_BOW: { - power = bow_tmul(o_ptr->sval); - if (have_flag(flgs, TR_XTRA_MIGHT)) - power++; - - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_chr(t, 'x'); - t = object_desc_num(t, power); - t = object_desc_chr(t, p2); - fire_rate = calc_num_fire(player_ptr, o_ptr); - if (fire_rate != 0 && power > 0 && known) { - fire_rate = bow_energy(o_ptr->sval) / fire_rate; - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_num(t, fire_rate / 100); - t = object_desc_chr(t, '.'); - t = object_desc_num(t, fire_rate % 100); - t = object_desc_str(t, "turn"); - t = object_desc_chr(t, p2); - } - - break; - } - } - - if (known) { - if (show_weapon) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_int(t, o_ptr->to_h); - t = object_desc_chr(t, ','); - t = object_desc_int(t, o_ptr->to_d); - t = object_desc_chr(t, p2); - } else if (o_ptr->to_h) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_int(t, o_ptr->to_h); - t = object_desc_chr(t, p2); - } else if (o_ptr->to_d) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_int(t, o_ptr->to_d); - t = object_desc_chr(t, p2); - } - } - - bow_ptr = &player_ptr->inventory_list[INVEN_BOW]; - if (bow_ptr->k_idx && (o_ptr->tval == player_ptr->tval_ammo)) { - int avgdam = o_ptr->dd * (o_ptr->ds + 1) * 10 / 2; - int tmul = bow_tmul(bow_ptr->sval); - ENERGY energy_fire = bow_energy(bow_ptr->sval); - if (object_is_known(bow_ptr)) - avgdam += (bow_ptr->to_d * 10); - - if (known) - avgdam += (o_ptr->to_d * 10); - - if (player_ptr->xtra_might) - tmul++; - - tmul = tmul * (100 + (int)(adj_str_td[player_ptr->stat_ind[A_STR]]) - 128); - avgdam *= tmul; - avgdam /= (100 * 10); - if (player_ptr->concent) - avgdam = boost_concentration_damage(player_ptr, avgdam); - - if (avgdam < 0) - avgdam = 0; - - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - if (show_ammo_no_crit) { - t = object_desc_num(t, avgdam); - t = object_desc_str(t, show_ammo_detail ? "/shot " : "/"); - } - - avgdam = calc_expect_crit_shot(player_ptr, o_ptr->weight, o_ptr->to_h, bow_ptr->to_h, avgdam); - t = object_desc_num(t, avgdam); - t = show_ammo_no_crit ? object_desc_str(t, show_ammo_detail ? "/crit " : "/") : object_desc_str(t, show_ammo_detail ? "/shot " : "/"); - if (player_ptr->num_fire == 0) - t = object_desc_chr(t, '0'); - else { - avgdam *= (player_ptr->num_fire * 100); - avgdam /= energy_fire; - t = object_desc_num(t, avgdam); - t = object_desc_str(t, show_ammo_detail ? "/turn" : ""); - if (show_ammo_crit_ratio) { - int percent = calc_crit_ratio_shot(player_ptr, known ? o_ptr->to_h : 0, known ? bow_ptr->to_h : 0); - t = object_desc_chr(t, '/'); - t = object_desc_num(t, percent / 100); - t = object_desc_chr(t, '.'); - if (percent % 100 < 10) - t = object_desc_chr(t, '0'); - - t = object_desc_num(t, percent % 100); - t = object_desc_str(t, show_ammo_detail ? "% crit" : "%"); - } - } - - t = object_desc_chr(t, p2); - } else if ((player_ptr->pclass == CLASS_NINJA) && (o_ptr->tval == TV_SPIKE)) { - int avgdam = player_ptr->mighty_throw ? (1 + 3) : 1; - s16b energy_fire = 100 - player_ptr->lev; - avgdam += ((player_ptr->lev + 30) * (player_ptr->lev + 30) - 900) / 55; - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_num(t, avgdam); - t = object_desc_chr(t, '/'); - avgdam = 100 * avgdam / energy_fire; - t = object_desc_num(t, avgdam); - t = object_desc_chr(t, p2); - } - - if (known) { - if (show_armour) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, b1); - t = object_desc_num(t, o_ptr->ac); - t = object_desc_chr(t, ','); - t = object_desc_int(t, o_ptr->to_a); - t = object_desc_chr(t, b2); - } else if (o_ptr->to_a) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, b1); - t = object_desc_int(t, o_ptr->to_a); - t = object_desc_chr(t, b2); - } - } else if (show_armour) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, b1); - t = object_desc_num(t, o_ptr->ac); - t = object_desc_chr(t, b2); - } - - if (mode & OD_NAME_AND_ENCHANT) { - angband_strcpy(buf, tmp_val, MAX_NLEN); - return; - } - - if (known) { - if (((o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_WAND))) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - if ((o_ptr->tval == TV_STAFF) && (o_ptr->number > 1)) { - t = object_desc_num(t, o_ptr->number); - t = object_desc_str(t, "x "); - } - - t = object_desc_num(t, o_ptr->pval); - t = object_desc_str(t, _("回分", " charge")); -#ifdef JP -#else - if (o_ptr->pval != 1) - t = object_desc_chr(t, 's'); -#endif - - t = object_desc_chr(t, p2); - } else if (o_ptr->tval == TV_ROD) { - if (o_ptr->timeout) { - if (o_ptr->number > 1) { - if (k_ptr->pval == 0) - k_ptr->pval = 1; - - power = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval; - if (power > o_ptr->number) - power = o_ptr->number; - - t = object_desc_str(t, " ("); - t = object_desc_num(t, power); - t = object_desc_str(t, _("本 充填中)", " charging)")); - } else - t = object_desc_str(t, _("(充填中)", " (charging)")); - } - } - - if (have_pval_flags(flgs)) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_int(t, o_ptr->pval); - if (have_flag(flgs, TR_HIDE_TYPE)) { - /* Nothing */ - } else if (have_flag(flgs, TR_SPEED)) - t = object_desc_str(t, _("加速", " to speed")); - else if (have_flag(flgs, TR_BLOWS)) { - t = object_desc_str(t, _("攻撃", " attack")); -#ifdef JP -#else - if (ABS(o_ptr->pval) != 1) - t = object_desc_chr(t, 's'); -#endif - } else if (have_flag(flgs, TR_STEALTH)) - t = object_desc_str(t, _("隠密", " to stealth")); - else if (have_flag(flgs, TR_SEARCH)) - t = object_desc_str(t, _("探索", " to searching")); - else if (have_flag(flgs, TR_INFRA)) - t = object_desc_str(t, _("赤外線視力", " to infravision")); - - t = object_desc_chr(t, p2); - } - - if ((o_ptr->tval == TV_LITE) && (!(object_is_fixed_artifact(o_ptr) || (o_ptr->sval == SV_LITE_FEANOR)))) { - t = object_desc_str(t, _("(", " (with ")); - if (o_ptr->name2 == EGO_LITE_LONG) - t = object_desc_num(t, o_ptr->xtra4 * 2); - else - t = object_desc_num(t, o_ptr->xtra4); - - t = object_desc_str(t, _("ターンの寿命)", " turns of light)")); - } - - if (o_ptr->timeout && (o_ptr->tval != TV_ROD)) - t = object_desc_str(t, _("(充填中)", " (charging)")); - } - - if (mode & OD_OMIT_INSCRIPTION) { - angband_strcpy(buf, tmp_val, MAX_NLEN); - return; - } - - tmp_val2[0] = '\0'; - if ((abbrev_extra || abbrev_all) && object_is_fully_known(o_ptr)) { - if (!o_ptr->inscription || !angband_strchr(quark_str(o_ptr->inscription), '%')) { - bool kanji, all; - kanji = _(TRUE, FALSE); - all = abbrev_all; - get_ability_abbreviation(player_ptr, tmp_val2, o_ptr, kanji, all); - } - } - - if (o_ptr->inscription) { - char buff[1024]; - if (tmp_val2[0]) - strcat(tmp_val2, ", "); - - get_inscription(player_ptr, buff, o_ptr); - angband_strcat(tmp_val2, buff, sizeof(tmp_val2)); - } - - fake_insc_buf[0] = '\0'; - if (o_ptr->feeling) - strcpy(fake_insc_buf, game_inscriptions[o_ptr->feeling]); - else if (object_is_cursed(o_ptr) && (known || (o_ptr->ident & IDENT_SENSE))) - strcpy(fake_insc_buf, _("呪われている", "cursed")); - else if (((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET) || (o_ptr->tval == TV_LITE) || (o_ptr->tval == TV_FIGURINE)) && aware && !known - && !(o_ptr->ident & IDENT_SENSE)) - strcpy(fake_insc_buf, _("未鑑定", "unidentified")); - else if (!known && (o_ptr->ident & IDENT_EMPTY)) - strcpy(fake_insc_buf, _("空", "empty")); - else if (!aware && object_is_tried(o_ptr)) - strcpy(fake_insc_buf, _("未判明", "tried")); - - if (o_ptr->discount) { - if (!tmp_val2[0] || (o_ptr->ident & IDENT_STORE)) { - char discount_num_buf[4]; - if (fake_insc_buf[0]) - strcat(fake_insc_buf, ", "); - - (void)object_desc_num(discount_num_buf, o_ptr->discount); - strcat(fake_insc_buf, discount_num_buf); - strcat(fake_insc_buf, _("%引き", "% off")); - } - } - - if (fake_insc_buf[0] || tmp_val2[0]) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, c1); - if (fake_insc_buf[0]) - t = object_desc_str(t, fake_insc_buf); - - if (fake_insc_buf[0] && tmp_val2[0]) { - t = object_desc_chr(t, ','); - t = object_desc_chr(t, ' '); - } - - if (tmp_val2[0]) - t = object_desc_str(t, tmp_val2); - - t = object_desc_chr(t, c2); - } - - angband_strcpy(buf, tmp_val, MAX_NLEN); -} - -/*! * @brief nameバッファ内からベースアイテム名を返す / Strip an "object name" into a buffer * @param buf ベースアイテム格納先の参照ポインタ * @param k_idx ベースアイテムID diff --git a/src/object/object-flavor.h b/src/object/object-flavor.h index 8356e899c..aa8356f1e 100644 --- a/src/object/object-flavor.h +++ b/src/object/object-flavor.h @@ -7,7 +7,6 @@ void get_table_name(char *out_string); void get_table_sindarin_aux(char *out_string); void get_table_sindarin(char *out_string); void flavor_init(void); -void object_desc(player_type *player_ptr, char *buf, object_type *o_ptr, BIT_FLAGS mode); void strip_name(char *buf, KIND_OBJECT_IDX k_idx); bool has_lite_flag(BIT_FLAGS *flags); bool has_dark_flag(BIT_FLAGS *flags); diff --git a/src/object/warning.c b/src/object/warning.c index 613503fa4..f52e6fff3 100644 --- a/src/object/warning.c +++ b/src/object/warning.c @@ -2,6 +2,7 @@ #include "art-definition/art-sword-types.h" #include "core/asking-player.h" #include "dungeon/dungeon.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor.h" #include "game-option/input-options.h" @@ -23,7 +24,6 @@ #include "mutation/mutation-flag-types.h" #include "object-enchant/tr-types.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "player/mimic-info-table.h" #include "player/player-class.h" #include "player/player-move.h" @@ -42,28 +42,27 @@ */ object_type *choose_warning_item(player_type *creature_ptr) { - int choices[INVEN_TOTAL - INVEN_RARM]; - - /* Paranoia -- Player has no warning ability */ - if (!creature_ptr->warning) return NULL; - - /* Search Inventory */ - int number = 0; - for (int i = INVEN_RARM; i < INVEN_TOTAL; i++) - { - BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_type *o_ptr = &creature_ptr->inventory_list[i]; - - object_flags(creature_ptr, o_ptr, flgs); - if (have_flag(flgs, TR_WARNING)) - { - choices[number] = i; - number++; - } - } - - /* Choice one of them */ - return number ? &creature_ptr->inventory_list[choices[randint0(number)]] : NULL; + int choices[INVEN_TOTAL - INVEN_RARM]; + + /* Paranoia -- Player has no warning ability */ + if (!creature_ptr->warning) + return NULL; + + /* Search Inventory */ + int number = 0; + for (int i = INVEN_RARM; i < INVEN_TOTAL; i++) { + BIT_FLAGS flgs[TR_FLAG_SIZE]; + object_type *o_ptr = &creature_ptr->inventory_list[i]; + + object_flags(creature_ptr, o_ptr, flgs); + if (have_flag(flgs, TR_WARNING)) { + choices[number] = i; + number++; + } + } + + /* Choice one of them */ + return number ? &creature_ptr->inventory_list[choices[randint0(number)]] : NULL; } /*! @@ -77,250 +76,275 @@ object_type *choose_warning_item(player_type *creature_ptr) */ static void spell_damcalc(player_type *target_ptr, monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max) { - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - int rlev = r_ptr->level; - bool ignore_wraith_form = FALSE; - - /* Vulnerability, resistance and immunity */ - switch (typ) - { - case GF_ELEC: - if (target_ptr->immune_elec) - { - dam = 0; - ignore_wraith_form = TRUE; - break; - } - - if (target_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2; - if (target_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3; - if (is_specific_player_race(target_ptr, RACE_ANDROID)) dam += dam / 3; - if (target_ptr->resist_elec) dam = (dam + 2) / 3; - if (is_oppose_elec(target_ptr)) dam = (dam + 2) / 3; - break; - - case GF_POIS: - if (target_ptr->resist_pois) dam = (dam + 2) / 3; - if (is_oppose_pois(target_ptr)) dam = (dam + 2) / 3; - break; - - case GF_ACID: - if (target_ptr->immune_acid) - { - dam = 0; - ignore_wraith_form = TRUE; - break; - } - - if (target_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2; - if (target_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3; - if (target_ptr->resist_acid) dam = (dam + 2) / 3; - if (is_oppose_acid(target_ptr)) dam = (dam + 2) / 3; - break; - - case GF_COLD: - case GF_ICE: - if (target_ptr->immune_cold) - { - dam = 0; - ignore_wraith_form = TRUE; - break; - } - - if (target_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2; - if (target_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3; - if (target_ptr->resist_cold) dam = (dam + 2) / 3; - if (is_oppose_cold(target_ptr)) dam = (dam + 2) / 3; - break; - - case GF_FIRE: - if (target_ptr->immune_fire) - { - dam = 0; - ignore_wraith_form = TRUE; - break; - } - - if (target_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2; - if (is_specific_player_race(target_ptr, RACE_ENT)) dam += dam / 3; - if (target_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3; - if (target_ptr->resist_fire) dam = (dam + 2) / 3; - if (is_oppose_fire(target_ptr)) dam = (dam + 2) / 3; - break; - - case GF_PSY_SPEAR: - ignore_wraith_form = TRUE; - break; - - case GF_ARROW: - if (!target_ptr->blind && - ((target_ptr->inventory_list[INVEN_RARM].k_idx && (target_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU)) || - (target_ptr->inventory_list[INVEN_LARM].k_idx && (target_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU)))) - { - dam = 0; - ignore_wraith_form = TRUE; - } - - break; - - case GF_LITE: - if (target_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */ - if (is_specific_player_race(target_ptr, RACE_VAMPIRE) || (target_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2; - else if (is_specific_player_race(target_ptr, RACE_S_FAIRY)) dam = dam * 4 / 3; - - if (target_ptr->wraith_form) dam *= 2; - break; - - case GF_DARK: - if (is_specific_player_race(target_ptr, RACE_VAMPIRE) || (target_ptr->mimic_form == MIMIC_VAMPIRE) || target_ptr->wraith_form) - { - dam = 0; - ignore_wraith_form = TRUE; - } - else if (target_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */ - break; - - case GF_SHARDS: - if (target_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ - break; - - case GF_SOUND: - if (target_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */ - break; - - case GF_CONFUSION: - if (target_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */ - break; - - case GF_CHAOS: - if (target_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ - break; - - case GF_NETHER: - if (is_specific_player_race(target_ptr, RACE_SPECTRE)) - { - dam = 0; - ignore_wraith_form = TRUE; - } - else if (target_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ - break; - - case GF_DISENCHANT: - if (target_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ - break; - - case GF_NEXUS: - if (target_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ - break; - - case GF_TIME: - if (target_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */ - break; - - case GF_GRAVITY: - if (target_ptr->levitation) dam = (dam * 2) / 3; - break; - - case GF_ROCKET: - if (target_ptr->resist_shard) dam /= 2; - break; - - case GF_NUKE: - if (target_ptr->resist_pois) dam = (2 * dam + 2) / 5; - if (is_oppose_pois(target_ptr)) dam = (2 * dam + 2) / 5; - break; - - case GF_DEATH_RAY: - if (target_ptr->mimic_form) - { - if (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING) - { - dam = 0; - ignore_wraith_form = TRUE; - } - - break; - } - - switch (target_ptr->prace) - { - case RACE_GOLEM: - case RACE_SKELETON: - case RACE_ZOMBIE: - case RACE_VAMPIRE: - case RACE_BALROG: - case RACE_SPECTRE: - dam = 0; - ignore_wraith_form = TRUE; - break; - } - - break; - - case GF_HOLY_FIRE: - if (target_ptr->align > 10) dam /= 2; - else if (target_ptr->align < -10) dam *= 2; - break; - - case GF_HELL_FIRE: - if (target_ptr->align > 10) dam *= 2; - break; - - case GF_MIND_BLAST: - case GF_BRAIN_SMASH: - if (100 + rlev / 2 <= MAX(5, target_ptr->skill_sav)) - { - dam = 0; - ignore_wraith_form = TRUE; - } - - break; - - case GF_CAUSE_1: - case GF_CAUSE_2: - case GF_CAUSE_3: - case GF_HAND_DOOM: - if (100 + rlev / 2 <= target_ptr->skill_sav) - { - dam = 0; - ignore_wraith_form = TRUE; - } - - break; - - case GF_CAUSE_4: - if ((100 + rlev / 2 <= target_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU)) - { - dam = 0; - ignore_wraith_form = TRUE; - } - - break; - } - - if (target_ptr->wraith_form && !ignore_wraith_form) - { - dam /= 2; - if (!dam) dam = 1; - } - - if (dam > *max) *max = dam; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + int rlev = r_ptr->level; + bool ignore_wraith_form = FALSE; + + /* Vulnerability, resistance and immunity */ + switch (typ) { + case GF_ELEC: + if (target_ptr->immune_elec) { + dam = 0; + ignore_wraith_form = TRUE; + break; + } + + if (target_ptr->muta3 & MUT3_VULN_ELEM) + dam *= 2; + if (target_ptr->special_defense & KATA_KOUKIJIN) + dam += dam / 3; + if (is_specific_player_race(target_ptr, RACE_ANDROID)) + dam += dam / 3; + if (target_ptr->resist_elec) + dam = (dam + 2) / 3; + if (is_oppose_elec(target_ptr)) + dam = (dam + 2) / 3; + break; + + case GF_POIS: + if (target_ptr->resist_pois) + dam = (dam + 2) / 3; + if (is_oppose_pois(target_ptr)) + dam = (dam + 2) / 3; + break; + + case GF_ACID: + if (target_ptr->immune_acid) { + dam = 0; + ignore_wraith_form = TRUE; + break; + } + + if (target_ptr->muta3 & MUT3_VULN_ELEM) + dam *= 2; + if (target_ptr->special_defense & KATA_KOUKIJIN) + dam += dam / 3; + if (target_ptr->resist_acid) + dam = (dam + 2) / 3; + if (is_oppose_acid(target_ptr)) + dam = (dam + 2) / 3; + break; + + case GF_COLD: + case GF_ICE: + if (target_ptr->immune_cold) { + dam = 0; + ignore_wraith_form = TRUE; + break; + } + + if (target_ptr->muta3 & MUT3_VULN_ELEM) + dam *= 2; + if (target_ptr->special_defense & KATA_KOUKIJIN) + dam += dam / 3; + if (target_ptr->resist_cold) + dam = (dam + 2) / 3; + if (is_oppose_cold(target_ptr)) + dam = (dam + 2) / 3; + break; + + case GF_FIRE: + if (target_ptr->immune_fire) { + dam = 0; + ignore_wraith_form = TRUE; + break; + } + + if (target_ptr->muta3 & MUT3_VULN_ELEM) + dam *= 2; + if (is_specific_player_race(target_ptr, RACE_ENT)) + dam += dam / 3; + if (target_ptr->special_defense & KATA_KOUKIJIN) + dam += dam / 3; + if (target_ptr->resist_fire) + dam = (dam + 2) / 3; + if (is_oppose_fire(target_ptr)) + dam = (dam + 2) / 3; + break; + + case GF_PSY_SPEAR: + ignore_wraith_form = TRUE; + break; + + case GF_ARROW: + if (!target_ptr->blind + && ((target_ptr->inventory_list[INVEN_RARM].k_idx && (target_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU)) + || (target_ptr->inventory_list[INVEN_LARM].k_idx && (target_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU)))) { + dam = 0; + ignore_wraith_form = TRUE; + } + + break; + + case GF_LITE: + if (target_ptr->resist_lite) + dam /= 2; /* Worst case of 4 / (d4 + 7) */ + if (is_specific_player_race(target_ptr, RACE_VAMPIRE) || (target_ptr->mimic_form == MIMIC_VAMPIRE)) + dam *= 2; + else if (is_specific_player_race(target_ptr, RACE_S_FAIRY)) + dam = dam * 4 / 3; + + if (target_ptr->wraith_form) + dam *= 2; + break; + + case GF_DARK: + if (is_specific_player_race(target_ptr, RACE_VAMPIRE) || (target_ptr->mimic_form == MIMIC_VAMPIRE) || target_ptr->wraith_form) { + dam = 0; + ignore_wraith_form = TRUE; + } else if (target_ptr->resist_dark) + dam /= 2; /* Worst case of 4 / (d4 + 7) */ + break; + + case GF_SHARDS: + if (target_ptr->resist_shard) + dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ + break; + + case GF_SOUND: + if (target_ptr->resist_sound) + dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */ + break; + + case GF_CONFUSION: + if (target_ptr->resist_conf) + dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */ + break; + + case GF_CHAOS: + if (target_ptr->resist_chaos) + dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ + break; + + case GF_NETHER: + if (is_specific_player_race(target_ptr, RACE_SPECTRE)) { + dam = 0; + ignore_wraith_form = TRUE; + } else if (target_ptr->resist_neth) + dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ + break; + + case GF_DISENCHANT: + if (target_ptr->resist_disen) + dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ + break; + + case GF_NEXUS: + if (target_ptr->resist_nexus) + dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ + break; + + case GF_TIME: + if (target_ptr->resist_time) + dam /= 2; /* Worst case of 4 / (d4 + 7) */ + break; + + case GF_GRAVITY: + if (target_ptr->levitation) + dam = (dam * 2) / 3; + break; + + case GF_ROCKET: + if (target_ptr->resist_shard) + dam /= 2; + break; + + case GF_NUKE: + if (target_ptr->resist_pois) + dam = (2 * dam + 2) / 5; + if (is_oppose_pois(target_ptr)) + dam = (2 * dam + 2) / 5; + break; + + case GF_DEATH_RAY: + if (target_ptr->mimic_form) { + if (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING) { + dam = 0; + ignore_wraith_form = TRUE; + } + + break; + } + + switch (target_ptr->prace) { + case RACE_GOLEM: + case RACE_SKELETON: + case RACE_ZOMBIE: + case RACE_VAMPIRE: + case RACE_BALROG: + case RACE_SPECTRE: + dam = 0; + ignore_wraith_form = TRUE; + break; + } + + break; + + case GF_HOLY_FIRE: + if (target_ptr->align > 10) + dam /= 2; + else if (target_ptr->align < -10) + dam *= 2; + break; + + case GF_HELL_FIRE: + if (target_ptr->align > 10) + dam *= 2; + break; + + case GF_MIND_BLAST: + case GF_BRAIN_SMASH: + if (100 + rlev / 2 <= MAX(5, target_ptr->skill_sav)) { + dam = 0; + ignore_wraith_form = TRUE; + } + + break; + + case GF_CAUSE_1: + case GF_CAUSE_2: + case GF_CAUSE_3: + case GF_HAND_DOOM: + if (100 + rlev / 2 <= target_ptr->skill_sav) { + dam = 0; + ignore_wraith_form = TRUE; + } + + break; + + case GF_CAUSE_4: + if ((100 + rlev / 2 <= target_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU)) { + dam = 0; + ignore_wraith_form = TRUE; + } + + break; + } + + if (target_ptr->wraith_form && !ignore_wraith_form) { + dam /= 2; + if (!dam) + dam = 1; + } + + if (dam > *max) + *max = dam; } /*! -* @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 / -* Calculate spell damages -* @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値 -* @param typ 効果属性のID -* @param m_idx 魔法を行使するモンスターのID -* @param max 算出した最大ダメージを返すポインタ -* @return なし -*/ + * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 / + * Calculate spell damages + * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値 + * @param typ 効果属性のID + * @param m_idx 魔法を行使するモンスターのID + * @param max 算出した最大ダメージを返すポインタ + * @return なし + */ void spell_damcalc_by_spellnum(player_type *creature_ptr, monster_spell_type ms_type, EFFECT_ID typ, MONSTER_IDX m_idx, int *max) { - monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx]; - HIT_POINT dam = monspell_damage(creature_ptr, ms_type, m_idx, DAM_MAX); - spell_damcalc(creature_ptr, m_ptr, typ, dam, max); + monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx]; + HIT_POINT dam = monspell_damage(creature_ptr, ms_type, m_idx, DAM_MAX); + spell_damcalc(creature_ptr, m_ptr, typ, dam, max); } /*! @@ -332,73 +356,69 @@ void spell_damcalc_by_spellnum(player_type *creature_ptr, monster_spell_type ms_ */ static int blow_damcalc(monster_type *m_ptr, player_type *target_ptr, monster_blow *blow_ptr) { - int dam = blow_ptr->d_dice * blow_ptr->d_side; - int dummy_max = 0; - - if (blow_ptr->method == RBM_EXPLODE) - { - dam = (dam + 1) / 2; - spell_damcalc(target_ptr, m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max); - dam = dummy_max; - return dam; - } - - ARMOUR_CLASS ac = target_ptr->ac + target_ptr->to_a; - bool check_wraith_form = TRUE; - switch (blow_ptr->effect) - { - case RBE_SUPERHURT: - { - int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250); - dam = MAX(dam, tmp_dam * 2); - break; - } - - case RBE_HURT: - case RBE_SHATTER: - dam -= (dam * ((ac < 150) ? ac : 150) / 250); - break; - - case RBE_ACID: - spell_damcalc(target_ptr, m_ptr, GF_ACID, dam, &dummy_max); - dam = dummy_max; - check_wraith_form = FALSE; - break; - - case RBE_ELEC: - spell_damcalc(target_ptr, m_ptr, GF_ELEC, dam, &dummy_max); - dam = dummy_max; - check_wraith_form = FALSE; - break; - - case RBE_FIRE: - spell_damcalc(target_ptr, m_ptr, GF_FIRE, dam, &dummy_max); - dam = dummy_max; - check_wraith_form = FALSE; - break; - - case RBE_COLD: - spell_damcalc(target_ptr, m_ptr, GF_COLD, dam, &dummy_max); - dam = dummy_max; - check_wraith_form = FALSE; - break; - - case RBE_DR_MANA: - dam = 0; - check_wraith_form = FALSE; - break; - } - - if (check_wraith_form && target_ptr->wraith_form) - { - dam /= 2; - if (!dam) dam = 1; - } - - return dam; + int dam = blow_ptr->d_dice * blow_ptr->d_side; + int dummy_max = 0; + + if (blow_ptr->method == RBM_EXPLODE) { + dam = (dam + 1) / 2; + spell_damcalc(target_ptr, m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max); + dam = dummy_max; + return dam; + } + + ARMOUR_CLASS ac = target_ptr->ac + target_ptr->to_a; + bool check_wraith_form = TRUE; + switch (blow_ptr->effect) { + case RBE_SUPERHURT: { + int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250); + dam = MAX(dam, tmp_dam * 2); + break; + } + + case RBE_HURT: + case RBE_SHATTER: + dam -= (dam * ((ac < 150) ? ac : 150) / 250); + break; + + case RBE_ACID: + spell_damcalc(target_ptr, m_ptr, GF_ACID, dam, &dummy_max); + dam = dummy_max; + check_wraith_form = FALSE; + break; + + case RBE_ELEC: + spell_damcalc(target_ptr, m_ptr, GF_ELEC, dam, &dummy_max); + dam = dummy_max; + check_wraith_form = FALSE; + break; + + case RBE_FIRE: + spell_damcalc(target_ptr, m_ptr, GF_FIRE, dam, &dummy_max); + dam = dummy_max; + check_wraith_form = FALSE; + break; + + case RBE_COLD: + spell_damcalc(target_ptr, m_ptr, GF_COLD, dam, &dummy_max); + dam = dummy_max; + check_wraith_form = FALSE; + break; + + case RBE_DR_MANA: + dam = 0; + check_wraith_form = FALSE; + break; + } + + if (check_wraith_form && target_ptr->wraith_form) { + dam /= 2; + if (!dam) + dam = 1; + } + + return dam; } - /*! * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 / * Examine the grid (xx,yy) and warn the player if there are any danger @@ -408,138 +428,166 @@ static int blow_damcalc(monster_type *m_ptr, player_type *target_ptr, monster_bl */ bool process_warning(player_type *creature_ptr, POSITION xx, POSITION yy) { - POSITION mx, my; - grid_type *g_ptr; - GAME_TEXT o_name[MAX_NLEN]; + POSITION mx, my; + grid_type *g_ptr; + GAME_TEXT o_name[MAX_NLEN]; #define WARNING_AWARE_RANGE 12 - int dam_max = 0; - static int old_damage = 0; - - for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++) - { - for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++) - { - int dam_max0 = 0; - monster_type *m_ptr; - monster_race *r_ptr; - - if (!in_bounds(creature_ptr->current_floor_ptr, my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue; - - g_ptr = &creature_ptr->current_floor_ptr->grid_array[my][mx]; - - if (!g_ptr->m_idx) continue; - - m_ptr = &creature_ptr->current_floor_ptr->m_list[g_ptr->m_idx]; - - if (monster_csleep_remaining(m_ptr)) continue; - if (!is_hostile(m_ptr)) continue; - - r_ptr = &r_info[m_ptr->r_idx]; - - /* Monster spells (only powerful ones)*/ - if (projectable(creature_ptr, my, mx, yy, xx)) - { - BIT_FLAGS f4 = r_ptr->flags4; - BIT_FLAGS f5 = r_ptr->a_ability_flags1; - BIT_FLAGS f6 = r_ptr->a_ability_flags2; - - if (!(d_info[creature_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC)) - { - if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(creature_ptr, MS_BALL_CHAOS, GF_CHAOS, g_ptr->m_idx, &dam_max0); - if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(creature_ptr, MS_BALL_MANA, GF_MANA, g_ptr->m_idx, &dam_max0); - if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(creature_ptr, MS_BALL_DARK, GF_DARK, g_ptr->m_idx, &dam_max0); - if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(creature_ptr, MS_STARBURST, GF_LITE, g_ptr->m_idx, &dam_max0); - if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(creature_ptr, MS_HAND_DOOM, GF_HAND_DOOM, g_ptr->m_idx, &dam_max0); - if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(creature_ptr, MS_PSY_SPEAR, GF_PSY_SPEAR, g_ptr->m_idx, &dam_max0); - } - - if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(creature_ptr, MS_ROCKET, GF_ROCKET, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(creature_ptr, MS_BR_ACID, GF_ACID, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(creature_ptr, MS_BR_ELEC, GF_ELEC, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(creature_ptr, MS_BR_FIRE, GF_FIRE, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(creature_ptr, MS_BR_COLD, GF_COLD, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(creature_ptr, MS_BR_POIS, GF_POIS, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(creature_ptr, MS_BR_NETHER, GF_NETHER, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(creature_ptr, MS_BR_LITE, GF_LITE, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(creature_ptr, MS_BR_DARK, GF_DARK, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(creature_ptr, MS_BR_CONF, GF_CONFUSION, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(creature_ptr, MS_BR_SOUND, GF_SOUND, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(creature_ptr, MS_BR_CHAOS, GF_CHAOS, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(creature_ptr, MS_BR_DISEN, GF_DISENCHANT, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(creature_ptr, MS_BR_NEXUS, GF_NEXUS, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(creature_ptr, MS_BR_TIME, GF_TIME, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(creature_ptr, MS_BR_INERTIA, GF_INERTIAL, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(creature_ptr, MS_BR_GRAVITY, GF_GRAVITY, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(creature_ptr, MS_BR_SHARDS, GF_SHARDS, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(creature_ptr, MS_BR_PLASMA, GF_PLASMA, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(creature_ptr, MS_BR_FORCE, GF_FORCE, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(creature_ptr, MS_BR_MANA, GF_MANA, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(creature_ptr, MS_BR_NUKE, GF_NUKE, g_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(creature_ptr, MS_BR_DISI, GF_DISINTEGRATE, g_ptr->m_idx, &dam_max0); - } - - /* Monster melee attacks */ - if ((r_ptr->flags1 & RF1_NEVER_BLOW) || (d_info[creature_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)) - { - dam_max += dam_max0; - continue; - } - - if (!(mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)) - { - dam_max += dam_max0; - continue; - } - - int dam_melee = 0; - for (int m = 0; m < 4; m++) - { - /* Skip non-attacks */ - if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue; - - /* Extract the attack info */ - dam_melee += blow_damcalc(m_ptr, creature_ptr, &r_ptr->blow[m]); - if (r_ptr->blow[m].method == RBM_EXPLODE) break; - } - - if (dam_melee > dam_max0) dam_max0 = dam_melee; - dam_max += dam_max0; - } - } - - /* Prevent excessive warning */ - if (dam_max > old_damage) - { - old_damage = dam_max * 3 / 2; - - if (dam_max > creature_ptr->chp / 2) - { - object_type *o_ptr = choose_warning_item(creature_ptr); - - if (o_ptr) - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - else - strcpy(o_name, _("体", "body")); /* Warning ability without item */ - msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name); - - disturb(creature_ptr, FALSE, TRUE); - return get_check(_("本当にこのまま進むか?", "Really want to go ahead? ")); - } - } - else old_damage = old_damage / 2; - - g_ptr = &creature_ptr->current_floor_ptr->grid_array[yy][xx]; - bool is_warning = (!easy_disarm && is_trap(creature_ptr, g_ptr->feat)) || (g_ptr->mimic && is_trap(creature_ptr, g_ptr->feat)); - is_warning &= !one_in_(13); - if (!is_warning) return TRUE; - - object_type *o_ptr = choose_warning_item(creature_ptr); - if (o_ptr != NULL) - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - else - strcpy(o_name, _("体", "body")); /* Warning ability without item */ - msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name); - disturb(creature_ptr, FALSE, TRUE); - return get_check(_("本当にこのまま進むか?", "Really want to go ahead? ")); + int dam_max = 0; + static int old_damage = 0; + + for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++) { + for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++) { + int dam_max0 = 0; + monster_type *m_ptr; + monster_race *r_ptr; + + if (!in_bounds(creature_ptr->current_floor_ptr, my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) + continue; + + g_ptr = &creature_ptr->current_floor_ptr->grid_array[my][mx]; + + if (!g_ptr->m_idx) + continue; + + m_ptr = &creature_ptr->current_floor_ptr->m_list[g_ptr->m_idx]; + + if (monster_csleep_remaining(m_ptr)) + continue; + if (!is_hostile(m_ptr)) + continue; + + r_ptr = &r_info[m_ptr->r_idx]; + + /* Monster spells (only powerful ones)*/ + if (projectable(creature_ptr, my, mx, yy, xx)) { + BIT_FLAGS f4 = r_ptr->flags4; + BIT_FLAGS f5 = r_ptr->a_ability_flags1; + BIT_FLAGS f6 = r_ptr->a_ability_flags2; + + if (!(d_info[creature_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC)) { + if (f4 & RF4_BA_CHAO) + spell_damcalc_by_spellnum(creature_ptr, MS_BALL_CHAOS, GF_CHAOS, g_ptr->m_idx, &dam_max0); + if (f5 & RF5_BA_MANA) + spell_damcalc_by_spellnum(creature_ptr, MS_BALL_MANA, GF_MANA, g_ptr->m_idx, &dam_max0); + if (f5 & RF5_BA_DARK) + spell_damcalc_by_spellnum(creature_ptr, MS_BALL_DARK, GF_DARK, g_ptr->m_idx, &dam_max0); + if (f5 & RF5_BA_LITE) + spell_damcalc_by_spellnum(creature_ptr, MS_STARBURST, GF_LITE, g_ptr->m_idx, &dam_max0); + if (f6 & RF6_HAND_DOOM) + spell_damcalc_by_spellnum(creature_ptr, MS_HAND_DOOM, GF_HAND_DOOM, g_ptr->m_idx, &dam_max0); + if (f6 & RF6_PSY_SPEAR) + spell_damcalc_by_spellnum(creature_ptr, MS_PSY_SPEAR, GF_PSY_SPEAR, g_ptr->m_idx, &dam_max0); + } + + if (f4 & RF4_ROCKET) + spell_damcalc_by_spellnum(creature_ptr, MS_ROCKET, GF_ROCKET, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_ACID) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_ACID, GF_ACID, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_ELEC) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_ELEC, GF_ELEC, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_FIRE) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_FIRE, GF_FIRE, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_COLD) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_COLD, GF_COLD, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_POIS) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_POIS, GF_POIS, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_NETH) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_NETHER, GF_NETHER, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_LITE) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_LITE, GF_LITE, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_DARK) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_DARK, GF_DARK, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_CONF) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_CONF, GF_CONFUSION, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_SOUN) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_SOUND, GF_SOUND, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_CHAO) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_CHAOS, GF_CHAOS, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_DISE) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_DISEN, GF_DISENCHANT, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_NEXU) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_NEXUS, GF_NEXUS, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_TIME) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_TIME, GF_TIME, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_INER) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_INERTIA, GF_INERTIAL, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_GRAV) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_GRAVITY, GF_GRAVITY, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_SHAR) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_SHARDS, GF_SHARDS, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_PLAS) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_PLASMA, GF_PLASMA, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_WALL) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_FORCE, GF_FORCE, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_MANA) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_MANA, GF_MANA, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_NUKE) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_NUKE, GF_NUKE, g_ptr->m_idx, &dam_max0); + if (f4 & RF4_BR_DISI) + spell_damcalc_by_spellnum(creature_ptr, MS_BR_DISI, GF_DISINTEGRATE, g_ptr->m_idx, &dam_max0); + } + + /* Monster melee attacks */ + if ((r_ptr->flags1 & RF1_NEVER_BLOW) || (d_info[creature_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)) { + dam_max += dam_max0; + continue; + } + + if (!(mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)) { + dam_max += dam_max0; + continue; + } + + int dam_melee = 0; + for (int m = 0; m < 4; m++) { + /* Skip non-attacks */ + if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) + continue; + + /* Extract the attack info */ + dam_melee += blow_damcalc(m_ptr, creature_ptr, &r_ptr->blow[m]); + if (r_ptr->blow[m].method == RBM_EXPLODE) + break; + } + + if (dam_melee > dam_max0) + dam_max0 = dam_melee; + dam_max += dam_max0; + } + } + + /* Prevent excessive warning */ + if (dam_max > old_damage) { + old_damage = dam_max * 3 / 2; + + if (dam_max > creature_ptr->chp / 2) { + object_type *o_ptr = choose_warning_item(creature_ptr); + + if (o_ptr) + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + else + strcpy(o_name, _("体", "body")); /* Warning ability without item */ + msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name); + + disturb(creature_ptr, FALSE, TRUE); + return get_check(_("本当にこのまま進むか?", "Really want to go ahead? ")); + } + } else + old_damage = old_damage / 2; + + g_ptr = &creature_ptr->current_floor_ptr->grid_array[yy][xx]; + bool is_warning = (!easy_disarm && is_trap(creature_ptr, g_ptr->feat)) || (g_ptr->mimic && is_trap(creature_ptr, g_ptr->feat)); + is_warning &= !one_in_(13); + if (!is_warning) + return TRUE; + + object_type *o_ptr = choose_warning_item(creature_ptr); + if (o_ptr != NULL) + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + else + strcpy(o_name, _("体", "body")); /* Warning ability without item */ + msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name); + disturb(creature_ptr, FALSE, TRUE); + return get_check(_("本当にこのまま進むか?", "Really want to go ahead? ")); } diff --git a/src/perception/identification.c b/src/perception/identification.c index d5bd141f2..d26e0e463 100644 --- a/src/perception/identification.c +++ b/src/perception/identification.c @@ -1,5 +1,6 @@ #include "perception/identification.h" #include "art-definition/art-protector-types.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "game-option/special-options.h" #include "io/input-key-acceptor.h" @@ -13,7 +14,6 @@ #include "object-hook/hook-checker.h" #include "object-hook/hook-weapon.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "object/object-info.h" #include "object/object-kind.h" #include "sv-definition/sv-amulet-types.h" @@ -690,9 +690,9 @@ bool screen_object(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS mode) Term_get_size(&wid, &hgt); if (!(mode & SCROBJ_FAKE_OBJECT)) - object_desc(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); else - object_desc(player_ptr, o_name, o_ptr, (OD_NAME_ONLY | OD_STORE)); + describe_flavor(player_ptr, o_name, o_ptr, (OD_NAME_ONLY | OD_STORE)); prt(o_name, 0, 0); for (int k = 1; k < hgt; k++) { diff --git a/src/perception/object-perception.c b/src/perception/object-perception.c index efe6dbf6e..04a7db4af 100644 --- a/src/perception/object-perception.c +++ b/src/perception/object-perception.c @@ -1,13 +1,13 @@ #include "perception/object-perception.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "game-option/play-record-options.h" #include "io/write-diary.h" #include "object-enchant/item-feeling.h" #include "object-enchant/special-object-flags.h" #include "object-enchant/trg-types.h" -#include "object/object-flavor.h" -#include "object/object-generator.h" #include "object/item-tester-hooker.h" // 暫定、このファイルへ引っ越す. +#include "object/object-generator.h" #include "object/object-kind.h" /*! @@ -61,7 +61,7 @@ void object_aware(player_type *owner_ptr, object_type *o_ptr) object_copy(q_ptr, o_ptr); q_ptr->number = 1; - object_desc(owner_ptr, o_name, q_ptr, OD_NAME_ONLY); + describe_flavor(owner_ptr, o_name, q_ptr, OD_NAME_ONLY); exe_write_diary(owner_ptr, DIARY_FOUND, 0, o_name); } diff --git a/src/perception/simple-perception.c b/src/perception/simple-perception.c index e24124845..8ff601cfe 100644 --- a/src/perception/simple-perception.c +++ b/src/perception/simple-perception.c @@ -9,6 +9,7 @@ #include "core/player-update-types.h" #include "core/window-redrawer.h" #include "flavor/flag-inscriptions-table.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "game-option/auto-destruction-options.h" #include "game-option/disturbance-options.h" @@ -18,7 +19,6 @@ #include "object-enchant/special-object-flags.h" #include "object-hook/hook-checker.h" #include "object-hook/hook-enchant.h" -#include "object/object-flavor.h" #include "object/object-info.h" #include "perception/object-perception.h" #include "player/avatar.h" @@ -87,7 +87,7 @@ static void sense_inventory_aux(player_type *creature_ptr, INVENTORY_IDX slot, b if (disturb_minor) disturb(creature_ptr, FALSE, FALSE); - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); if (slot >= INVEN_RARM) { #ifdef JP msg_format("%s%s(%c)は%sという感じがする...", describe_use(creature_ptr, slot), o_name, index_to_label(slot), game_inscriptions[feel]); diff --git a/src/player-attack/attack-chaos-effect.c b/src/player-attack/attack-chaos-effect.c index 70fe2f1e2..72039ece3 100644 --- a/src/player-attack/attack-chaos-effect.c +++ b/src/player-attack/attack-chaos-effect.c @@ -8,6 +8,7 @@ #include "player-attack/attack-chaos-effect.h" #include "art-definition/art-weapon-types.h" #include "core/player-redraw-types.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor.h" #include "inventory/inventory-object.h" @@ -19,7 +20,6 @@ #include "monster/monster-describer.h" #include "monster/monster-info.h" #include "monster/monster-status.h" -#include "object/object-flavor.h" #include "object/object-mark-types.h" #include "player/attack-defense-types.h" #include "realm/realm-hex-numbers.h" @@ -146,7 +146,7 @@ static void attack_golden_hammer(player_type *attacker_ptr, player_attack_type * object_type *q_ptr = &floor_ptr->o_list[target_ptr->hold_o_idx]; GAME_TEXT o_name[MAX_NLEN]; - object_desc(attacker_ptr, o_name, q_ptr, OD_NAME_ONLY); + describe_flavor(attacker_ptr, o_name, q_ptr, OD_NAME_ONLY); q_ptr->held_m_idx = 0; q_ptr->marked = OM_TOUCHED; target_ptr->hold_o_idx = q_ptr->next_o_idx; diff --git a/src/player/patron.c b/src/player/patron.c index f0a70fbcd..388290a29 100644 --- a/src/player/patron.c +++ b/src/player/patron.c @@ -1,6 +1,7 @@ #include "player/patron.h" #include "cmd-action/cmd-pet.h" #include "cmd-io/cmd-dump.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor.h" #include "inventory/inventory-slot-types.h" @@ -11,7 +12,6 @@ #include "mutation/mutation-flag-types.h" #include "mutation/mutation.h" #include "object-enchant/object-curse.h" -#include "object/object-flavor.h" #include "object/object-kind-hook.h" #include "player/player-class.h" #include "player/player-damage.h" @@ -22,10 +22,10 @@ #include "spell-kind/spells-launcher.h" #include "spell-kind/spells-random.h" #include "spell-kind/spells-sight.h" +#include "spell/spell-types.h" #include "spell/spells-object.h" #include "spell/spells-status.h" #include "spell/spells-summon.h" -#include "spell/spell-types.h" #include "status/base-status.h" #include "status/experience.h" #include "status/shape-changer.h" @@ -35,655 +35,539 @@ /*! * @brief カオスパトロン名テーブル */ -const concptr chaos_patrons[MAX_PATRON] = -{ - "スローター", - "マベロード", - "チャードロス", - "ハイオンハーン", - "キシオムバーグ", - - "ピアレー", - "バラン", - "アリオッチ", - "イーカー", - "ナージャン", - - "バロ", - "コーン", - "スラーネッシュ", - "ナーグル", - "ティーンチ", - - "カイン" -}; +const concptr chaos_patrons[MAX_PATRON] = { "スローター", "マベロード", "チャードロス", "ハイオンハーン", "キシオムバーグ", + + "ピアレー", "バラン", "アリオッチ", "イーカー", "ナージャン", + + "バロ", "コーン", "スラーネッシュ", "ナーグル", "ティーンチ", + + "カイン" }; #else -const concptr chaos_patrons[MAX_PATRON] = -{ - "Slortar", - "Mabelode", - "Chardros", - "Hionhurn", - "Xiombarg", - - "Pyaray", - "Balaan", - "Arioch", - "Eequor", - "Narjhan", - - "Balo", - "Khorne", - "Slaanesh", - "Nurgle", - "Tzeentch", - - "Khaine" -}; -#endif +const concptr chaos_patrons[MAX_PATRON] = { "Slortar", "Mabelode", "Chardros", "Hionhurn", "Xiombarg", + + "Pyaray", "Balaan", "Arioch", "Eequor", "Narjhan", + "Balo", "Khorne", "Slaanesh", "Nurgle", "Tzeentch", + + "Khaine" }; +#endif /*! * @brief カオスパトロンの報酬能力値テーブル */ -const int chaos_stats[MAX_PATRON] = -{ - A_CON, /* Slortar */ - A_CON, /* Mabelode */ - A_STR, /* Chardros */ - A_STR, /* Hionhurn */ - A_STR, /* Xiombarg */ - - A_INT, /* Pyaray */ - A_STR, /* Balaan */ - A_INT, /* Arioch */ - A_CON, /* Eequor */ - A_CHR, /* Narjhan */ - - -1, /* Balo */ - A_STR, /* Khorne */ - A_CHR, /* Slaanesh */ - A_CON, /* Nurgle */ - A_INT, /* Tzeentch */ - - A_STR, /* Khaine */ +const int chaos_stats[MAX_PATRON] = { + A_CON, /* Slortar */ + A_CON, /* Mabelode */ + A_STR, /* Chardros */ + A_STR, /* Hionhurn */ + A_STR, /* Xiombarg */ + + A_INT, /* Pyaray */ + A_STR, /* Balaan */ + A_INT, /* Arioch */ + A_CON, /* Eequor */ + A_CHR, /* Narjhan */ + + -1, /* Balo */ + A_STR, /* Khorne */ + A_CHR, /* Slaanesh */ + A_CON, /* Nurgle */ + A_INT, /* Tzeentch */ + + A_STR, /* Khaine */ }; /*! * @brief カオスパトロンの報酬テーブル */ -const int chaos_rewards[MAX_PATRON][20] = -{ - /* Slortar the Old: */ - { - REW_WRATH, REW_CURSE_WP, REW_CURSE_AR, REW_RUIN_ABL, REW_LOSE_ABL, - REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_POLY_WND, REW_POLY_SLF, - REW_POLY_SLF, REW_POLY_SLF, REW_GAIN_ABL, REW_GAIN_ABL, REW_GAIN_EXP, - REW_GOOD_OBJ, REW_CHAOS_WP, REW_GREA_OBJ, REW_AUGM_ABL, REW_AUGM_ABL - }, - - /* Mabelode the Faceless: */ - { - REW_WRATH, REW_CURSE_WP, REW_CURSE_AR, REW_H_SUMMON, REW_SUMMON_M, - REW_SUMMON_M, REW_IGNORE, REW_IGNORE, REW_POLY_WND, REW_POLY_WND, - REW_POLY_SLF, REW_HEAL_FUL, REW_HEAL_FUL, REW_GAIN_ABL, REW_SER_UNDE, - REW_CHAOS_WP, REW_GOOD_OBJ, REW_GOOD_OBJ, REW_GOOD_OBS, REW_GOOD_OBS - }, - - /* Chardros the Reaper: */ - { - REW_WRATH, REW_WRATH, REW_HURT_LOT, REW_PISS_OFF, REW_H_SUMMON, - REW_SUMMON_M, REW_IGNORE, REW_IGNORE, REW_DESTRUCT, REW_SER_UNDE, - REW_GENOCIDE, REW_MASS_GEN, REW_MASS_GEN, REW_DISPEL_C, REW_GOOD_OBJ, - REW_CHAOS_WP, REW_GOOD_OBS, REW_GOOD_OBS, REW_AUGM_ABL, REW_AUGM_ABL - }, - - /* Hionhurn the Executioner: */ - { - REW_WRATH, REW_WRATH, REW_CURSE_WP, REW_CURSE_AR, REW_RUIN_ABL, - REW_IGNORE, REW_IGNORE, REW_SER_UNDE, REW_DESTRUCT, REW_GENOCIDE, - REW_MASS_GEN, REW_MASS_GEN, REW_HEAL_FUL, REW_GAIN_ABL, REW_GAIN_ABL, - REW_CHAOS_WP, REW_GOOD_OBS, REW_GOOD_OBS, REW_AUGM_ABL, REW_AUGM_ABL - }, - - /* Xiombarg the Sword-Queen: */ - { - REW_TY_CURSE, REW_TY_CURSE, REW_PISS_OFF, REW_RUIN_ABL, REW_LOSE_ABL, - REW_IGNORE, REW_POLY_SLF, REW_POLY_SLF, REW_POLY_WND, REW_POLY_WND, - REW_GENOCIDE, REW_DISPEL_C, REW_GOOD_OBJ, REW_GOOD_OBJ, REW_SER_MONS, - REW_GAIN_ABL, REW_CHAOS_WP, REW_GAIN_EXP, REW_AUGM_ABL, REW_GOOD_OBS - }, - - - /* Pyaray the Tentacled Whisperer of Impossible Secretes: */ - { - REW_WRATH, REW_TY_CURSE, REW_PISS_OFF, REW_H_SUMMON, REW_H_SUMMON, - REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_POLY_WND, REW_POLY_SLF, - REW_POLY_SLF, REW_SER_DEMO, REW_HEAL_FUL, REW_GAIN_ABL, REW_GAIN_ABL, - REW_CHAOS_WP, REW_DO_HAVOC, REW_GOOD_OBJ, REW_GREA_OBJ, REW_GREA_OBS - }, - - /* Balaan the Grim: */ - { - REW_TY_CURSE, REW_HURT_LOT, REW_CURSE_WP, REW_CURSE_AR, REW_RUIN_ABL, - REW_SUMMON_M, REW_LOSE_EXP, REW_POLY_SLF, REW_POLY_SLF, REW_POLY_WND, - REW_SER_UNDE, REW_HEAL_FUL, REW_HEAL_FUL, REW_GAIN_EXP, REW_GAIN_EXP, - REW_CHAOS_WP, REW_GOOD_OBJ, REW_GOOD_OBS, REW_GREA_OBS, REW_AUGM_ABL - }, - - /* Arioch, Duke of Hell: */ - { - REW_WRATH, REW_PISS_OFF, REW_RUIN_ABL, REW_LOSE_EXP, REW_H_SUMMON, - REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_POLY_SLF, - REW_POLY_SLF, REW_MASS_GEN, REW_SER_DEMO, REW_HEAL_FUL, REW_CHAOS_WP, - REW_CHAOS_WP, REW_GOOD_OBJ, REW_GAIN_EXP, REW_GREA_OBJ, REW_AUGM_ABL - }, - - /* Eequor, Blue Lady of Dismay: */ - { - REW_WRATH, REW_TY_CURSE, REW_PISS_OFF, REW_CURSE_WP, REW_RUIN_ABL, - REW_IGNORE, REW_IGNORE, REW_POLY_SLF, REW_POLY_SLF, REW_POLY_WND, - REW_GOOD_OBJ, REW_GOOD_OBJ, REW_SER_MONS, REW_HEAL_FUL, REW_GAIN_EXP, - REW_GAIN_ABL, REW_CHAOS_WP, REW_GOOD_OBS, REW_GREA_OBJ, REW_AUGM_ABL - }, - - /* Narjhan, Lord of Beggars: */ - { - REW_WRATH, REW_CURSE_AR, REW_CURSE_WP, REW_CURSE_WP, REW_CURSE_AR, - REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_POLY_SLF, REW_POLY_SLF, - REW_POLY_WND, REW_HEAL_FUL, REW_HEAL_FUL, REW_GAIN_EXP, REW_AUGM_ABL, - REW_GOOD_OBJ, REW_GOOD_OBJ, REW_CHAOS_WP, REW_GREA_OBJ, REW_GREA_OBS - }, - - /* Balo the Jester: */ - { - REW_WRATH, REW_SER_DEMO, REW_CURSE_WP, REW_CURSE_AR, REW_LOSE_EXP, - REW_GAIN_ABL, REW_LOSE_ABL, REW_POLY_WND, REW_POLY_SLF, REW_IGNORE, - REW_DESTRUCT, REW_MASS_GEN, REW_CHAOS_WP, REW_GREA_OBJ, REW_HURT_LOT, - REW_AUGM_ABL, REW_RUIN_ABL, REW_H_SUMMON, REW_GREA_OBS, REW_AUGM_ABL - }, - - /* Khorne the Bloodgod: */ - { - REW_WRATH, REW_HURT_LOT, REW_HURT_LOT, REW_H_SUMMON, REW_H_SUMMON, - REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_SER_MONS, REW_SER_DEMO, - REW_POLY_SLF, REW_POLY_WND, REW_HEAL_FUL, REW_GOOD_OBJ, REW_GOOD_OBJ, - REW_CHAOS_WP, REW_GOOD_OBS, REW_GOOD_OBS, REW_GREA_OBJ, REW_GREA_OBS - }, - - /* Slaanesh: */ - { - REW_WRATH, REW_PISS_OFF, REW_PISS_OFF, REW_RUIN_ABL, REW_LOSE_ABL, - REW_LOSE_EXP, REW_IGNORE, REW_IGNORE, REW_POLY_WND, REW_SER_DEMO, - REW_POLY_SLF, REW_HEAL_FUL, REW_HEAL_FUL, REW_GOOD_OBJ, REW_GAIN_EXP, - REW_GAIN_EXP, REW_CHAOS_WP, REW_GAIN_ABL, REW_GREA_OBJ, REW_AUGM_ABL - }, - - /* Nurgle: */ - { - REW_WRATH, REW_PISS_OFF, REW_HURT_LOT, REW_RUIN_ABL, REW_LOSE_ABL, - REW_LOSE_EXP, REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_POLY_SLF, - REW_POLY_SLF, REW_POLY_WND, REW_HEAL_FUL, REW_GOOD_OBJ, REW_GAIN_ABL, - REW_GAIN_ABL, REW_SER_UNDE, REW_CHAOS_WP, REW_GREA_OBJ, REW_AUGM_ABL - }, - - /* Tzeentch: */ - { - REW_WRATH, REW_CURSE_WP, REW_CURSE_AR, REW_RUIN_ABL, REW_LOSE_ABL, - REW_LOSE_EXP, REW_IGNORE, REW_POLY_SLF, REW_POLY_SLF, REW_POLY_SLF, - REW_POLY_SLF, REW_POLY_WND, REW_HEAL_FUL, REW_CHAOS_WP, REW_GREA_OBJ, - REW_GAIN_ABL, REW_GAIN_ABL, REW_GAIN_EXP, REW_GAIN_EXP, REW_AUGM_ABL - }, - - /* Khaine: */ - { - REW_WRATH, REW_HURT_LOT, REW_PISS_OFF, REW_LOSE_ABL, REW_LOSE_EXP, - REW_IGNORE, REW_IGNORE, REW_DISPEL_C, REW_DO_HAVOC, REW_DO_HAVOC, - REW_POLY_SLF, REW_POLY_SLF, REW_GAIN_EXP, REW_GAIN_ABL, REW_GAIN_ABL, - REW_SER_MONS, REW_GOOD_OBJ, REW_CHAOS_WP, REW_GREA_OBJ, REW_GOOD_OBS - } +const int chaos_rewards[MAX_PATRON][20] = { + /* Slortar the Old: */ + { REW_WRATH, REW_CURSE_WP, REW_CURSE_AR, REW_RUIN_ABL, REW_LOSE_ABL, REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_POLY_WND, REW_POLY_SLF, REW_POLY_SLF, + REW_POLY_SLF, REW_GAIN_ABL, REW_GAIN_ABL, REW_GAIN_EXP, REW_GOOD_OBJ, REW_CHAOS_WP, REW_GREA_OBJ, REW_AUGM_ABL, REW_AUGM_ABL }, + + /* Mabelode the Faceless: */ + { REW_WRATH, REW_CURSE_WP, REW_CURSE_AR, REW_H_SUMMON, REW_SUMMON_M, REW_SUMMON_M, REW_IGNORE, REW_IGNORE, REW_POLY_WND, REW_POLY_WND, REW_POLY_SLF, + REW_HEAL_FUL, REW_HEAL_FUL, REW_GAIN_ABL, REW_SER_UNDE, REW_CHAOS_WP, REW_GOOD_OBJ, REW_GOOD_OBJ, REW_GOOD_OBS, REW_GOOD_OBS }, + + /* Chardros the Reaper: */ + { REW_WRATH, REW_WRATH, REW_HURT_LOT, REW_PISS_OFF, REW_H_SUMMON, REW_SUMMON_M, REW_IGNORE, REW_IGNORE, REW_DESTRUCT, REW_SER_UNDE, REW_GENOCIDE, + REW_MASS_GEN, REW_MASS_GEN, REW_DISPEL_C, REW_GOOD_OBJ, REW_CHAOS_WP, REW_GOOD_OBS, REW_GOOD_OBS, REW_AUGM_ABL, REW_AUGM_ABL }, + + /* Hionhurn the Executioner: */ + { REW_WRATH, REW_WRATH, REW_CURSE_WP, REW_CURSE_AR, REW_RUIN_ABL, REW_IGNORE, REW_IGNORE, REW_SER_UNDE, REW_DESTRUCT, REW_GENOCIDE, REW_MASS_GEN, + REW_MASS_GEN, REW_HEAL_FUL, REW_GAIN_ABL, REW_GAIN_ABL, REW_CHAOS_WP, REW_GOOD_OBS, REW_GOOD_OBS, REW_AUGM_ABL, REW_AUGM_ABL }, + + /* Xiombarg the Sword-Queen: */ + { REW_TY_CURSE, REW_TY_CURSE, REW_PISS_OFF, REW_RUIN_ABL, REW_LOSE_ABL, REW_IGNORE, REW_POLY_SLF, REW_POLY_SLF, REW_POLY_WND, REW_POLY_WND, REW_GENOCIDE, + REW_DISPEL_C, REW_GOOD_OBJ, REW_GOOD_OBJ, REW_SER_MONS, REW_GAIN_ABL, REW_CHAOS_WP, REW_GAIN_EXP, REW_AUGM_ABL, REW_GOOD_OBS }, + + /* Pyaray the Tentacled Whisperer of Impossible Secretes: */ + { REW_WRATH, REW_TY_CURSE, REW_PISS_OFF, REW_H_SUMMON, REW_H_SUMMON, REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_POLY_WND, REW_POLY_SLF, REW_POLY_SLF, + REW_SER_DEMO, REW_HEAL_FUL, REW_GAIN_ABL, REW_GAIN_ABL, REW_CHAOS_WP, REW_DO_HAVOC, REW_GOOD_OBJ, REW_GREA_OBJ, REW_GREA_OBS }, + + /* Balaan the Grim: */ + { REW_TY_CURSE, REW_HURT_LOT, REW_CURSE_WP, REW_CURSE_AR, REW_RUIN_ABL, REW_SUMMON_M, REW_LOSE_EXP, REW_POLY_SLF, REW_POLY_SLF, REW_POLY_WND, REW_SER_UNDE, + REW_HEAL_FUL, REW_HEAL_FUL, REW_GAIN_EXP, REW_GAIN_EXP, REW_CHAOS_WP, REW_GOOD_OBJ, REW_GOOD_OBS, REW_GREA_OBS, REW_AUGM_ABL }, + + /* Arioch, Duke of Hell: */ + { REW_WRATH, REW_PISS_OFF, REW_RUIN_ABL, REW_LOSE_EXP, REW_H_SUMMON, REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_POLY_SLF, REW_POLY_SLF, + REW_MASS_GEN, REW_SER_DEMO, REW_HEAL_FUL, REW_CHAOS_WP, REW_CHAOS_WP, REW_GOOD_OBJ, REW_GAIN_EXP, REW_GREA_OBJ, REW_AUGM_ABL }, + + /* Eequor, Blue Lady of Dismay: */ + { REW_WRATH, REW_TY_CURSE, REW_PISS_OFF, REW_CURSE_WP, REW_RUIN_ABL, REW_IGNORE, REW_IGNORE, REW_POLY_SLF, REW_POLY_SLF, REW_POLY_WND, REW_GOOD_OBJ, + REW_GOOD_OBJ, REW_SER_MONS, REW_HEAL_FUL, REW_GAIN_EXP, REW_GAIN_ABL, REW_CHAOS_WP, REW_GOOD_OBS, REW_GREA_OBJ, REW_AUGM_ABL }, + + /* Narjhan, Lord of Beggars: */ + { REW_WRATH, REW_CURSE_AR, REW_CURSE_WP, REW_CURSE_WP, REW_CURSE_AR, REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_POLY_SLF, REW_POLY_SLF, REW_POLY_WND, + REW_HEAL_FUL, REW_HEAL_FUL, REW_GAIN_EXP, REW_AUGM_ABL, REW_GOOD_OBJ, REW_GOOD_OBJ, REW_CHAOS_WP, REW_GREA_OBJ, REW_GREA_OBS }, + + /* Balo the Jester: */ + { REW_WRATH, REW_SER_DEMO, REW_CURSE_WP, REW_CURSE_AR, REW_LOSE_EXP, REW_GAIN_ABL, REW_LOSE_ABL, REW_POLY_WND, REW_POLY_SLF, REW_IGNORE, REW_DESTRUCT, + REW_MASS_GEN, REW_CHAOS_WP, REW_GREA_OBJ, REW_HURT_LOT, REW_AUGM_ABL, REW_RUIN_ABL, REW_H_SUMMON, REW_GREA_OBS, REW_AUGM_ABL }, + + /* Khorne the Bloodgod: */ + { REW_WRATH, REW_HURT_LOT, REW_HURT_LOT, REW_H_SUMMON, REW_H_SUMMON, REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_SER_MONS, REW_SER_DEMO, REW_POLY_SLF, + REW_POLY_WND, REW_HEAL_FUL, REW_GOOD_OBJ, REW_GOOD_OBJ, REW_CHAOS_WP, REW_GOOD_OBS, REW_GOOD_OBS, REW_GREA_OBJ, REW_GREA_OBS }, + + /* Slaanesh: */ + { REW_WRATH, REW_PISS_OFF, REW_PISS_OFF, REW_RUIN_ABL, REW_LOSE_ABL, REW_LOSE_EXP, REW_IGNORE, REW_IGNORE, REW_POLY_WND, REW_SER_DEMO, REW_POLY_SLF, + REW_HEAL_FUL, REW_HEAL_FUL, REW_GOOD_OBJ, REW_GAIN_EXP, REW_GAIN_EXP, REW_CHAOS_WP, REW_GAIN_ABL, REW_GREA_OBJ, REW_AUGM_ABL }, + + /* Nurgle: */ + { REW_WRATH, REW_PISS_OFF, REW_HURT_LOT, REW_RUIN_ABL, REW_LOSE_ABL, REW_LOSE_EXP, REW_IGNORE, REW_IGNORE, REW_IGNORE, REW_POLY_SLF, REW_POLY_SLF, + REW_POLY_WND, REW_HEAL_FUL, REW_GOOD_OBJ, REW_GAIN_ABL, REW_GAIN_ABL, REW_SER_UNDE, REW_CHAOS_WP, REW_GREA_OBJ, REW_AUGM_ABL }, + + /* Tzeentch: */ + { REW_WRATH, REW_CURSE_WP, REW_CURSE_AR, REW_RUIN_ABL, REW_LOSE_ABL, REW_LOSE_EXP, REW_IGNORE, REW_POLY_SLF, REW_POLY_SLF, REW_POLY_SLF, REW_POLY_SLF, + REW_POLY_WND, REW_HEAL_FUL, REW_CHAOS_WP, REW_GREA_OBJ, REW_GAIN_ABL, REW_GAIN_ABL, REW_GAIN_EXP, REW_GAIN_EXP, REW_AUGM_ABL }, + + /* Khaine: */ + { REW_WRATH, REW_HURT_LOT, REW_PISS_OFF, REW_LOSE_ABL, REW_LOSE_EXP, REW_IGNORE, REW_IGNORE, REW_DISPEL_C, REW_DO_HAVOC, REW_DO_HAVOC, REW_POLY_SLF, + REW_POLY_SLF, REW_GAIN_EXP, REW_GAIN_ABL, REW_GAIN_ABL, REW_SER_MONS, REW_GOOD_OBJ, REW_CHAOS_WP, REW_GREA_OBJ, REW_GOOD_OBS } }; - void gain_level_reward(player_type *creature_ptr, int chosen_reward) { - char wrath_reason[32] = ""; - int nasty_chance = 6; - tval_type dummy = 0; - int type, effect; - concptr reward = NULL; - GAME_TEXT o_name[MAX_NLEN]; - - int count = 0; - - if (!chosen_reward) - { - if (creature_ptr->suppress_multi_reward) return; - else creature_ptr->suppress_multi_reward = TRUE; - } - - - if (creature_ptr->lev == 13) nasty_chance = 2; - else if (!(creature_ptr->lev % 13)) nasty_chance = 3; - else if (!(creature_ptr->lev % 14)) nasty_chance = 12; - - if (one_in_(nasty_chance)) - type = randint1(20); /* Allow the 'nasty' effects */ - else - type = randint1(15) + 5; /* Or disallow them */ - - if (type < 1) type = 1; - if (type > 20) type = 20; - type--; - - - sprintf(wrath_reason, _("%sの怒り", "the Wrath of %s"), chaos_patrons[creature_ptr->chaos_patron]); - - effect = chaos_rewards[creature_ptr->chaos_patron][type]; - - if (one_in_(6) && !chosen_reward) - { - msg_format(_("%^sは褒美としてあなたを突然変異させた。", "%^s rewards you with a mutation!"), chaos_patrons[creature_ptr->chaos_patron]); - (void)gain_mutation(creature_ptr, 0); - reward = _("変異した。", "mutation"); - } - else - { - switch (chosen_reward ? chosen_reward : effect) - { - - case REW_POLY_SLF: - - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「汝、新たなる姿を必要とせり!」", "'Thou needst a new form, mortal!'")); - - do_poly_self(creature_ptr); - reward = _("変異した。", "polymorphing"); - break; - - case REW_GAIN_EXP: - - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「汝は良く行いたり!続けよ!」", "'Well done, mortal! Lead on!'")); - - if (creature_ptr->prace == RACE_ANDROID) - { - msg_print(_("しかし何も起こらなかった。", "But, nothing happen.")); - } - else if (creature_ptr->exp < PY_MAX_EXP) - { - s32b ee = (creature_ptr->exp / 2) + 10; - if (ee > 100000L) ee = 100000L; - msg_print(_("更に経験を積んだような気がする。", "You feel more experienced.")); - - gain_exp(creature_ptr, ee); - reward = _("経験値を得た", "experience"); - } - break; - - case REW_LOSE_EXP: - - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「下僕よ、汝それに値せず。」", "'Thou didst not deserve that, slave.'")); - - if (creature_ptr->prace == RACE_ANDROID) - { - msg_print(_("しかし何も起こらなかった。", "But, nothing happen.")); - } - else - { - lose_exp(creature_ptr, creature_ptr->exp / 6); - reward = _("経験値を失った。", "losing experience"); - } - break; - - case REW_GOOD_OBJ: - msg_format(_("%sの声がささやいた:", "The voice of %s whispers:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「我が与えし物を賢明に使うべし。」", "'Use my gift wisely.'")); - - acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, 1, FALSE, FALSE, FALSE); - reward = _("上質なアイテムを手に入れた。", "a good item"); - break; - - case REW_GREA_OBJ: - - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「我が与えし物を賢明に使うべし。」", "'Use my gift wisely.'")); - - acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, 1, TRUE, FALSE, FALSE); - reward = _("高級品のアイテムを手に入れた。", "an excellent item"); - break; - - case REW_CHAOS_WP: - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「汝の行いは貴き剣に値せり。」", "'Thy deed hath earned thee a worthy blade.'")); - acquire_chaos_weapon(creature_ptr); - reward = _("(混沌)の武器を手に入れた。", "chaos weapon"); - break; - - case REW_GOOD_OBS: - - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「汝の行いは貴き報いに値せり。」", "'Thy deed hath earned thee a worthy reward.'")); - - acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, randint1(2) + 1, FALSE, FALSE, FALSE); - reward = _("上質なアイテムを手に入れた。", "good items"); - break; - - case REW_GREA_OBS: + char wrath_reason[32] = ""; + int nasty_chance = 6; + tval_type dummy = 0; + int type, effect; + concptr reward = NULL; + GAME_TEXT o_name[MAX_NLEN]; + + int count = 0; + + if (!chosen_reward) { + if (creature_ptr->suppress_multi_reward) + return; + else + creature_ptr->suppress_multi_reward = TRUE; + } + + if (creature_ptr->lev == 13) + nasty_chance = 2; + else if (!(creature_ptr->lev % 13)) + nasty_chance = 3; + else if (!(creature_ptr->lev % 14)) + nasty_chance = 12; - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「下僕よ、汝の献身への我が惜しみ無き報いを見るがよい。」", "'Behold, mortal, how generously I reward thy loyalty.'")); + if (one_in_(nasty_chance)) + type = randint1(20); /* Allow the 'nasty' effects */ + else + type = randint1(15) + 5; /* Or disallow them */ + + if (type < 1) + type = 1; + if (type > 20) + type = 20; + type--; + + sprintf(wrath_reason, _("%sの怒り", "the Wrath of %s"), chaos_patrons[creature_ptr->chaos_patron]); + + effect = chaos_rewards[creature_ptr->chaos_patron][type]; - acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, randint1(2) + 1, TRUE, FALSE, FALSE); - reward = _("高級品のアイテムを手に入れた。", "excellent items"); - break; + if (one_in_(6) && !chosen_reward) { + msg_format(_("%^sは褒美としてあなたを突然変異させた。", "%^s rewards you with a mutation!"), chaos_patrons[creature_ptr->chaos_patron]); + (void)gain_mutation(creature_ptr, 0); + reward = _("変異した。", "mutation"); + } else { + switch (chosen_reward ? chosen_reward : effect) { + + case REW_POLY_SLF: - case REW_TY_CURSE: - msg_format(_("%sの声が轟き渡った:", "The voice of %s thunders:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「下僕よ、汝傲慢なり。」", "'Thou art growing arrogant, mortal.'")); + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「汝、新たなる姿を必要とせり!」", "'Thou needst a new form, mortal!'")); - (void)activate_ty_curse(creature_ptr, FALSE, &count); - reward = _("禍々しい呪いをかけられた。", "cursing"); - break; + do_poly_self(creature_ptr); + reward = _("変異した。", "polymorphing"); + break; - case REW_SUMMON_M: + case REW_GAIN_EXP: - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「我が下僕たちよ、かの傲慢なる者を倒すべし!」", "'My pets, destroy the arrogant mortal!'")); + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「汝は良く行いたり!続けよ!」", "'Well done, mortal! Lead on!'")); - for (dummy = 0; dummy < randint1(5) + 1; dummy++) - { - (void)summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)); - } - reward = _("モンスターを召喚された。", "summoning hostile monsters"); - break; + if (creature_ptr->prace == RACE_ANDROID) { + msg_print(_("しかし何も起こらなかった。", "But, nothing happen.")); + } else if (creature_ptr->exp < PY_MAX_EXP) { + s32b ee = (creature_ptr->exp / 2) + 10; + if (ee > 100000L) + ee = 100000L; + msg_print(_("更に経験を積んだような気がする。", "You feel more experienced.")); + gain_exp(creature_ptr, ee); + reward = _("経験値を得た", "experience"); + } + break; + + case REW_LOSE_EXP: + + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「下僕よ、汝それに値せず。」", "'Thou didst not deserve that, slave.'")); + + if (creature_ptr->prace == RACE_ANDROID) { + msg_print(_("しかし何も起こらなかった。", "But, nothing happen.")); + } else { + lose_exp(creature_ptr, creature_ptr->exp / 6); + reward = _("経験値を失った。", "losing experience"); + } + break; + + case REW_GOOD_OBJ: + msg_format(_("%sの声がささやいた:", "The voice of %s whispers:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「我が与えし物を賢明に使うべし。」", "'Use my gift wisely.'")); + + acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, 1, FALSE, FALSE, FALSE); + reward = _("上質なアイテムを手に入れた。", "a good item"); + break; + + case REW_GREA_OBJ: + + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「我が与えし物を賢明に使うべし。」", "'Use my gift wisely.'")); + + acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, 1, TRUE, FALSE, FALSE); + reward = _("高級品のアイテムを手に入れた。", "an excellent item"); + break; + + case REW_CHAOS_WP: + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「汝の行いは貴き剣に値せり。」", "'Thy deed hath earned thee a worthy blade.'")); + acquire_chaos_weapon(creature_ptr); + reward = _("(混沌)の武器を手に入れた。", "chaos weapon"); + break; - case REW_H_SUMMON: + case REW_GOOD_OBS: - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「汝、より強き敵を必要とせり!」", "'Thou needst worthier opponents!'")); + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「汝の行いは貴き報いに値せり。」", "'Thy deed hath earned thee a worthy reward.'")); - activate_hi_summon(creature_ptr, creature_ptr->y, creature_ptr->x, FALSE); - reward = _("モンスターを召喚された。", "summoning many hostile monsters"); - break; + acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, randint1(2) + 1, FALSE, FALSE, FALSE); + reward = _("上質なアイテムを手に入れた。", "good items"); + break; + case REW_GREA_OBS: - case REW_DO_HAVOC: - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「死と破壊こそ我が喜びなり!」", "'Death and destruction! This pleaseth me!'")); + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「下僕よ、汝の献身への我が惜しみ無き報いを見るがよい。」", "'Behold, mortal, how generously I reward thy loyalty.'")); - call_chaos(creature_ptr); - reward = _("カオスの力が渦巻いた。", "calling chaos"); - break; + acquirement(creature_ptr, creature_ptr->y, creature_ptr->x, randint1(2) + 1, TRUE, FALSE, FALSE); + reward = _("高級品のアイテムを手に入れた。", "excellent items"); + break; + case REW_TY_CURSE: + msg_format(_("%sの声が轟き渡った:", "The voice of %s thunders:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「下僕よ、汝傲慢なり。」", "'Thou art growing arrogant, mortal.'")); - case REW_GAIN_ABL: - msg_format(_("%sの声が鳴り響いた:", "The voice of %s rings out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「留まるのだ、下僕よ。余が汝の肉体を鍛えん。」", "'Stay, mortal, and let me mold thee.'")); + (void)activate_ty_curse(creature_ptr, FALSE, &count); + reward = _("禍々しい呪いをかけられた。", "cursing"); + break; - if (one_in_(3) && !(chaos_stats[creature_ptr->chaos_patron] < 0)) - do_inc_stat(creature_ptr, chaos_stats[creature_ptr->chaos_patron]); - else - do_inc_stat(creature_ptr, randint0(6)); - reward = _("能力値が上がった。", "increasing a stat"); - break; + case REW_SUMMON_M: + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「我が下僕たちよ、かの傲慢なる者を倒すべし!」", "'My pets, destroy the arrogant mortal!'")); - case REW_LOSE_ABL: - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「下僕よ、余は汝に飽みたり。」", "'I grow tired of thee, mortal.'")); + for (dummy = 0; dummy < randint1(5) + 1; dummy++) { + (void)summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, 0, + (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)); + } + reward = _("モンスターを召喚された。", "summoning hostile monsters"); + break; - if (one_in_(3) && !(chaos_stats[creature_ptr->chaos_patron] < 0)) - do_dec_stat(creature_ptr, chaos_stats[creature_ptr->chaos_patron]); - else - (void)do_dec_stat(creature_ptr, randint0(6)); - reward = _("能力値が下がった。", "decreasing a stat"); - break; + case REW_H_SUMMON: + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「汝、より強き敵を必要とせり!」", "'Thou needst worthier opponents!'")); - case REW_RUIN_ABL: + activate_hi_summon(creature_ptr, creature_ptr->y, creature_ptr->x, FALSE); + reward = _("モンスターを召喚された。", "summoning many hostile monsters"); + break; - msg_format(_("%sの声が轟き渡った:", "The voice of %s thunders:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「汝、謙虚たることを学ぶべし!」", "'Thou needst a lesson in humility, mortal!'")); - msg_print(_("あなたは以前より弱くなった!", "You feel less powerful!")); + case REW_DO_HAVOC: + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「死と破壊こそ我が喜びなり!」", "'Death and destruction! This pleaseth me!'")); + + call_chaos(creature_ptr); + reward = _("カオスの力が渦巻いた。", "calling chaos"); + break; - for (dummy = 0; dummy < A_MAX; dummy++) - { - (void)dec_stat(creature_ptr, dummy, 10 + randint1(15), TRUE); - } - reward = _("全能力値が下がった。", "decreasing all stats"); - break; - - case REW_POLY_WND: - - msg_format(_("%sの力が触れるのを感じた。", "You feel the power of %s touch you."), - chaos_patrons[creature_ptr->chaos_patron]); - do_poly_wounds(creature_ptr); - reward = _("傷が変化した。", "polymorphing wounds"); - break; - - case REW_AUGM_ABL: - - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - - msg_print(_("「我がささやかなる賜物を受けとるがよい!」", "'Receive this modest gift from me!'")); - - for (dummy = 0; dummy < A_MAX; dummy++) - { - (void)do_inc_stat(creature_ptr, dummy); - } - reward = _("全能力値が上がった。", "increasing all stats"); - break; - - case REW_HURT_LOT: - - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「苦しむがよい、無能な愚か者よ!」", "'Suffer, pathetic fool!'")); - - fire_ball(creature_ptr, GF_DISINTEGRATE, 0, creature_ptr->lev * 4, 4); - take_hit(creature_ptr, DAMAGE_NOESCAPE, creature_ptr->lev * 4, wrath_reason, -1); - reward = _("分解の球が発生した。", "generating disintegration ball"); - break; - - case REW_HEAL_FUL: - - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - (void)restore_level(creature_ptr); - (void)restore_all_status(creature_ptr); - (void)true_healing(creature_ptr, 5000); - reward = _("体力が回復した。", "healing"); - break; - - case REW_CURSE_WP: - - if (!has_melee_weapon(creature_ptr, INVEN_RARM) && !has_melee_weapon(creature_ptr, INVEN_LARM)) break; - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「汝、武器に頼ることなかれ。」", "'Thou reliest too much on thy weapon.'")); - - dummy = INVEN_RARM; - if (has_melee_weapon(creature_ptr, INVEN_LARM)) - { - dummy = INVEN_LARM; - if (has_melee_weapon(creature_ptr, INVEN_RARM) && one_in_(2)) dummy = INVEN_RARM; - } - object_desc(creature_ptr, o_name, &creature_ptr->inventory_list[dummy], OD_NAME_ONLY); - (void)curse_weapon_object(creature_ptr, FALSE, &creature_ptr->inventory_list[dummy]); - reward = format(_("%sが破壊された。", "destroying %s"), o_name); - break; - - case REW_CURSE_AR: - - if (!creature_ptr->inventory_list[INVEN_BODY].k_idx) break; - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「汝、防具に頼ることなかれ。」", "'Thou reliest too much on thine equipment.'")); - - object_desc(creature_ptr, o_name, &creature_ptr->inventory_list[INVEN_BODY], OD_NAME_ONLY); - (void)curse_armor(creature_ptr); - reward = format(_("%sが破壊された。", "destroying %s"), o_name); - break; - - case REW_PISS_OFF: - - msg_format(_("%sの声がささやいた:", "The voice of %s whispers:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「我を怒りしめた罪を償うべし。」", "'Now thou shalt pay for annoying me.'")); - - switch (randint1(4)) - { - case 1: - (void)activate_ty_curse(creature_ptr, FALSE, &count); - reward = _("禍々しい呪いをかけられた。", "cursing"); - break; - case 2: - activate_hi_summon(creature_ptr, creature_ptr->y, creature_ptr->x, FALSE); - reward = _("モンスターを召喚された。", "summoning hostile monsters"); - break; - case 3: - if (one_in_(2)) - { - if (!has_melee_weapon(creature_ptr, INVEN_RARM) && !has_melee_weapon(creature_ptr, INVEN_LARM)) break; - dummy = INVEN_RARM; - if (has_melee_weapon(creature_ptr, INVEN_LARM)) - { - dummy = INVEN_LARM; - if (has_melee_weapon(creature_ptr, INVEN_RARM) && one_in_(2)) dummy = INVEN_RARM; - } - object_desc(creature_ptr, o_name, &creature_ptr->inventory_list[dummy], OD_NAME_ONLY); - (void)curse_weapon_object(creature_ptr, FALSE, &creature_ptr->inventory_list[dummy]); - reward = format(_("%sが破壊された。", "destroying %s"), o_name); - } - else - { - if (!creature_ptr->inventory_list[INVEN_BODY].k_idx) break; - object_desc(creature_ptr, o_name, &creature_ptr->inventory_list[INVEN_BODY], OD_NAME_ONLY); - (void)curse_armor(creature_ptr); - reward = format(_("%sが破壊された。", "destroying %s"), o_name); - } - break; - default: - for (dummy = 0; dummy < A_MAX; dummy++) - { - (void)dec_stat(creature_ptr, dummy, 10 + randint1(15), TRUE); - } - reward = _("全能力値が下がった。", "decreasing all stats"); - break; - } - break; - - case REW_WRATH: - - msg_format(_("%sの声が轟き渡った:", "The voice of %s thunders:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「死ぬがよい、下僕よ!」", "'Die, mortal!'")); - - take_hit(creature_ptr, DAMAGE_LOSELIFE, creature_ptr->lev * 4, wrath_reason, -1); - for (dummy = 0; dummy < A_MAX; dummy++) - { - (void)dec_stat(creature_ptr, dummy, 10 + randint1(15), FALSE); - } - activate_hi_summon(creature_ptr, creature_ptr->y, creature_ptr->x, FALSE); - (void)activate_ty_curse(creature_ptr, FALSE, &count); - if (one_in_(2)) - { - dummy = 0; - - if (has_melee_weapon(creature_ptr, INVEN_RARM)) - { - dummy = INVEN_RARM; - if (has_melee_weapon(creature_ptr, INVEN_LARM) && one_in_(2)) dummy = INVEN_LARM; - } - else if (has_melee_weapon(creature_ptr, INVEN_LARM)) dummy = INVEN_LARM; - - if (dummy) (void)curse_weapon_object(creature_ptr, FALSE, &creature_ptr->inventory_list[dummy]); - } - if (one_in_(2)) (void)curse_armor(creature_ptr); - break; - - case REW_DESTRUCT: - - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「死と破壊こそ我が喜びなり!」", "'Death and destruction! This pleaseth me!'")); - - (void)destroy_area(creature_ptr, creature_ptr->y, creature_ptr->x, 25, FALSE); - reward = _("ダンジョンが*破壊*された。", "*destruct*ing dungeon"); - break; - - case REW_GENOCIDE: - - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「我、汝の敵を抹殺せん!」", "'Let me relieve thee of thine oppressors!'")); - (void)symbol_genocide(creature_ptr, 0, FALSE); - reward = _("モンスターが抹殺された。", "genociding monsters"); - break; - - case REW_MASS_GEN: - - msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("「我、汝の敵を抹殺せん!」", "'Let me relieve thee of thine oppressors!'")); - - (void)mass_genocide(creature_ptr, 0, FALSE); - reward = _("モンスターが抹殺された。", "genociding nearby monsters"); - break; - - case REW_DISPEL_C: - - msg_format(_("%sの力が敵を攻撃するのを感じた!", "You can feel the power of %s assault your enemies!"), chaos_patrons[creature_ptr->chaos_patron]); - (void)dispel_monsters(creature_ptr, creature_ptr->lev * 4); - break; - - case REW_IGNORE: - - msg_format(_("%sはあなたを無視した。", "%s ignores you."), chaos_patrons[creature_ptr->chaos_patron]); - break; - - case REW_SER_DEMO: - - msg_format(_("%sは褒美として悪魔の使いをよこした!", "%s rewards you with a demonic servant!"), chaos_patrons[creature_ptr->chaos_patron]); - - if (!summon_specific(creature_ptr, -1, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, PM_FORCE_PET)) - msg_print(_("何も現れなかった...", "Nobody ever turns up...")); - else - reward = _("悪魔がペットになった。", "a demonic servant"); - - break; - - case REW_SER_MONS: - msg_format(_("%sは褒美として使いをよこした!", "%s rewards you with a servant!"), chaos_patrons[creature_ptr->chaos_patron]); - - if (!summon_specific(creature_ptr, -1, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, 0, PM_FORCE_PET)) - msg_print(_("何も現れなかった...", "Nobody ever turns up...")); - else - reward = _("モンスターがペットになった。", "a servant"); - - break; - - case REW_SER_UNDE: - msg_format(_("%sは褒美としてアンデッドの使いをよこした。", "%s rewards you with an undead servant!"), chaos_patrons[creature_ptr->chaos_patron]); + case REW_GAIN_ABL: + msg_format(_("%sの声が鳴り響いた:", "The voice of %s rings out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「留まるのだ、下僕よ。余が汝の肉体を鍛えん。」", "'Stay, mortal, and let me mold thee.'")); - if (!summon_specific(creature_ptr, -1, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_UNDEAD, PM_FORCE_PET)) - msg_print(_("何も現れなかった...", "Nobody ever turns up...")); - else - reward = _("アンデッドがペットになった。", "an undead servant"); + if (one_in_(3) && !(chaos_stats[creature_ptr->chaos_patron] < 0)) + do_inc_stat(creature_ptr, chaos_stats[creature_ptr->chaos_patron]); + else + do_inc_stat(creature_ptr, randint0(6)); + reward = _("能力値が上がった。", "increasing a stat"); + break; - break; + case REW_LOSE_ABL: + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「下僕よ、余は汝に飽みたり。」", "'I grow tired of thee, mortal.'")); + + if (one_in_(3) && !(chaos_stats[creature_ptr->chaos_patron] < 0)) + do_dec_stat(creature_ptr, chaos_stats[creature_ptr->chaos_patron]); + else + (void)do_dec_stat(creature_ptr, randint0(6)); + reward = _("能力値が下がった。", "decreasing a stat"); + break; + + case REW_RUIN_ABL: + + msg_format(_("%sの声が轟き渡った:", "The voice of %s thunders:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「汝、謙虚たることを学ぶべし!」", "'Thou needst a lesson in humility, mortal!'")); + msg_print(_("あなたは以前より弱くなった!", "You feel less powerful!")); + + for (dummy = 0; dummy < A_MAX; dummy++) { + (void)dec_stat(creature_ptr, dummy, 10 + randint1(15), TRUE); + } + reward = _("全能力値が下がった。", "decreasing all stats"); + break; + + case REW_POLY_WND: + + msg_format(_("%sの力が触れるのを感じた。", "You feel the power of %s touch you."), chaos_patrons[creature_ptr->chaos_patron]); + do_poly_wounds(creature_ptr); + reward = _("傷が変化した。", "polymorphing wounds"); + break; + + case REW_AUGM_ABL: + + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + + msg_print(_("「我がささやかなる賜物を受けとるがよい!」", "'Receive this modest gift from me!'")); + + for (dummy = 0; dummy < A_MAX; dummy++) { + (void)do_inc_stat(creature_ptr, dummy); + } + reward = _("全能力値が上がった。", "increasing all stats"); + break; + + case REW_HURT_LOT: + + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「苦しむがよい、無能な愚か者よ!」", "'Suffer, pathetic fool!'")); + + fire_ball(creature_ptr, GF_DISINTEGRATE, 0, creature_ptr->lev * 4, 4); + take_hit(creature_ptr, DAMAGE_NOESCAPE, creature_ptr->lev * 4, wrath_reason, -1); + reward = _("分解の球が発生した。", "generating disintegration ball"); + break; + + case REW_HEAL_FUL: + + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + (void)restore_level(creature_ptr); + (void)restore_all_status(creature_ptr); + (void)true_healing(creature_ptr, 5000); + reward = _("体力が回復した。", "healing"); + break; + + case REW_CURSE_WP: + + if (!has_melee_weapon(creature_ptr, INVEN_RARM) && !has_melee_weapon(creature_ptr, INVEN_LARM)) + break; + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「汝、武器に頼ることなかれ。」", "'Thou reliest too much on thy weapon.'")); + + dummy = INVEN_RARM; + if (has_melee_weapon(creature_ptr, INVEN_LARM)) { + dummy = INVEN_LARM; + if (has_melee_weapon(creature_ptr, INVEN_RARM) && one_in_(2)) + dummy = INVEN_RARM; + } + describe_flavor(creature_ptr, o_name, &creature_ptr->inventory_list[dummy], OD_NAME_ONLY); + (void)curse_weapon_object(creature_ptr, FALSE, &creature_ptr->inventory_list[dummy]); + reward = format(_("%sが破壊された。", "destroying %s"), o_name); + break; + + case REW_CURSE_AR: + + if (!creature_ptr->inventory_list[INVEN_BODY].k_idx) + break; + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「汝、防具に頼ることなかれ。」", "'Thou reliest too much on thine equipment.'")); + + describe_flavor(creature_ptr, o_name, &creature_ptr->inventory_list[INVEN_BODY], OD_NAME_ONLY); + (void)curse_armor(creature_ptr); + reward = format(_("%sが破壊された。", "destroying %s"), o_name); + break; + + case REW_PISS_OFF: + + msg_format(_("%sの声がささやいた:", "The voice of %s whispers:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「我を怒りしめた罪を償うべし。」", "'Now thou shalt pay for annoying me.'")); + + switch (randint1(4)) { + case 1: + (void)activate_ty_curse(creature_ptr, FALSE, &count); + reward = _("禍々しい呪いをかけられた。", "cursing"); + break; + case 2: + activate_hi_summon(creature_ptr, creature_ptr->y, creature_ptr->x, FALSE); + reward = _("モンスターを召喚された。", "summoning hostile monsters"); + break; + case 3: + if (one_in_(2)) { + if (!has_melee_weapon(creature_ptr, INVEN_RARM) && !has_melee_weapon(creature_ptr, INVEN_LARM)) + break; + dummy = INVEN_RARM; + if (has_melee_weapon(creature_ptr, INVEN_LARM)) { + dummy = INVEN_LARM; + if (has_melee_weapon(creature_ptr, INVEN_RARM) && one_in_(2)) + dummy = INVEN_RARM; + } + describe_flavor(creature_ptr, o_name, &creature_ptr->inventory_list[dummy], OD_NAME_ONLY); + (void)curse_weapon_object(creature_ptr, FALSE, &creature_ptr->inventory_list[dummy]); + reward = format(_("%sが破壊された。", "destroying %s"), o_name); + } else { + if (!creature_ptr->inventory_list[INVEN_BODY].k_idx) + break; + describe_flavor(creature_ptr, o_name, &creature_ptr->inventory_list[INVEN_BODY], OD_NAME_ONLY); + (void)curse_armor(creature_ptr); + reward = format(_("%sが破壊された。", "destroying %s"), o_name); + } + break; + default: + for (dummy = 0; dummy < A_MAX; dummy++) { + (void)dec_stat(creature_ptr, dummy, 10 + randint1(15), TRUE); + } + reward = _("全能力値が下がった。", "decreasing all stats"); + break; + } + break; + + case REW_WRATH: + + msg_format(_("%sの声が轟き渡った:", "The voice of %s thunders:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「死ぬがよい、下僕よ!」", "'Die, mortal!'")); + + take_hit(creature_ptr, DAMAGE_LOSELIFE, creature_ptr->lev * 4, wrath_reason, -1); + for (dummy = 0; dummy < A_MAX; dummy++) { + (void)dec_stat(creature_ptr, dummy, 10 + randint1(15), FALSE); + } + activate_hi_summon(creature_ptr, creature_ptr->y, creature_ptr->x, FALSE); + (void)activate_ty_curse(creature_ptr, FALSE, &count); + if (one_in_(2)) { + dummy = 0; + + if (has_melee_weapon(creature_ptr, INVEN_RARM)) { + dummy = INVEN_RARM; + if (has_melee_weapon(creature_ptr, INVEN_LARM) && one_in_(2)) + dummy = INVEN_LARM; + } else if (has_melee_weapon(creature_ptr, INVEN_LARM)) + dummy = INVEN_LARM; + + if (dummy) + (void)curse_weapon_object(creature_ptr, FALSE, &creature_ptr->inventory_list[dummy]); + } + if (one_in_(2)) + (void)curse_armor(creature_ptr); + break; + + case REW_DESTRUCT: + + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「死と破壊こそ我が喜びなり!」", "'Death and destruction! This pleaseth me!'")); + + (void)destroy_area(creature_ptr, creature_ptr->y, creature_ptr->x, 25, FALSE); + reward = _("ダンジョンが*破壊*された。", "*destruct*ing dungeon"); + break; + + case REW_GENOCIDE: + + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「我、汝の敵を抹殺せん!」", "'Let me relieve thee of thine oppressors!'")); + (void)symbol_genocide(creature_ptr, 0, FALSE); + reward = _("モンスターが抹殺された。", "genociding monsters"); + break; + + case REW_MASS_GEN: + + msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("「我、汝の敵を抹殺せん!」", "'Let me relieve thee of thine oppressors!'")); + + (void)mass_genocide(creature_ptr, 0, FALSE); + reward = _("モンスターが抹殺された。", "genociding nearby monsters"); + break; + + case REW_DISPEL_C: + + msg_format(_("%sの力が敵を攻撃するのを感じた!", "You can feel the power of %s assault your enemies!"), chaos_patrons[creature_ptr->chaos_patron]); + (void)dispel_monsters(creature_ptr, creature_ptr->lev * 4); + break; + + case REW_IGNORE: + + msg_format(_("%sはあなたを無視した。", "%s ignores you."), chaos_patrons[creature_ptr->chaos_patron]); + break; + + case REW_SER_DEMO: + + msg_format(_("%sは褒美として悪魔の使いをよこした!", "%s rewards you with a demonic servant!"), chaos_patrons[creature_ptr->chaos_patron]); + + if (!summon_specific(creature_ptr, -1, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, PM_FORCE_PET)) + msg_print(_("何も現れなかった...", "Nobody ever turns up...")); + else + reward = _("悪魔がペットになった。", "a demonic servant"); + + break; + + case REW_SER_MONS: + msg_format(_("%sは褒美として使いをよこした!", "%s rewards you with a servant!"), chaos_patrons[creature_ptr->chaos_patron]); + + if (!summon_specific(creature_ptr, -1, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, 0, PM_FORCE_PET)) + msg_print(_("何も現れなかった...", "Nobody ever turns up...")); + else + reward = _("モンスターがペットになった。", "a servant"); + + break; + + case REW_SER_UNDE: + msg_format(_("%sは褒美としてアンデッドの使いをよこした。", "%s rewards you with an undead servant!"), chaos_patrons[creature_ptr->chaos_patron]); + + if (!summon_specific(creature_ptr, -1, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_UNDEAD, PM_FORCE_PET)) + msg_print(_("何も現れなかった...", "Nobody ever turns up...")); + else + reward = _("アンデッドがペットになった。", "an undead servant"); - default: - msg_format(_("%sの声がどもった:", "The voice of %s stammers:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_format(_("「あー、あー、答えは %d/%d。質問は何?」", "'Uh... uh... the answer's %d/%d, what's the question?'"), type, effect); + break; - } - } - if (reward) - { - exe_write_diary(creature_ptr, DIARY_DESCRIPTION, 0, format(_("パトロンの報酬で%s", "The patron rewarded you with %s."), reward)); - } + default: + msg_format(_("%sの声がどもった:", "The voice of %s stammers:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_format(_("「あー、あー、答えは %d/%d。質問は何?」", "'Uh... uh... the answer's %d/%d, what's the question?'"), type, effect); + } + } + if (reward) { + exe_write_diary(creature_ptr, DIARY_DESCRIPTION, 0, format(_("パトロンの報酬で%s", "The patron rewarded you with %s."), reward)); + } } void admire_from_patron(player_type *creature_ptr) { - if ((creature_ptr->pclass == CLASS_CHAOS_WARRIOR) || (creature_ptr->muta2 & MUT2_CHAOS_GIFT)) - { - msg_format(_("%sからの声が響いた。", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); - msg_print(_("『よくやった、定命の者よ!』", "'Thou art donst well, mortal!'")); - } + if ((creature_ptr->pclass == CLASS_CHAOS_WARRIOR) || (creature_ptr->muta2 & MUT2_CHAOS_GIFT)) { + msg_format(_("%sからの声が響いた。", "The voice of %s booms out:"), chaos_patrons[creature_ptr->chaos_patron]); + msg_print(_("『よくやった、定命の者よ!』", "'Thou art donst well, mortal!'")); + } } diff --git a/src/player/player-damage.c b/src/player/player-damage.c index 46ab20d50..d700adb3a 100644 --- a/src/player/player-damage.c +++ b/src/player/player-damage.c @@ -8,6 +8,7 @@ #include "core/stuff-handler.h" #include "core/window-redrawer.h" #include "dungeon/quest.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor.h" #include "floor/wild.h" @@ -41,7 +42,6 @@ #include "object/item-tester-hooker.h" #include "object/object-broken.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "player/avatar.h" #include "player/player-class.h" #include "player/player-move.h" @@ -104,7 +104,7 @@ static bool acid_minus_ac(player_type *creature_ptr) if (!object_is_armour(creature_ptr, o_ptr)) return FALSE; - object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); object_flags(creature_ptr, o_ptr, flgs); /* No damage left to be done */ if (o_ptr->ac + o_ptr->to_a <= 0) { diff --git a/src/player/player-move.c b/src/player/player-move.c index c2cd1eb00..fd19130c9 100644 --- a/src/player/player-move.c +++ b/src/player/player-move.c @@ -153,6 +153,7 @@ #include "dungeon/dungeon.h" #include "dungeon/quest.h" #include "effect/effect-characteristics.h" +#include "flavor/flavor-describer.h" #include "flavor/flavor-util.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" @@ -188,7 +189,6 @@ #include "mutation/mutation-flag-types.h" #include "object-enchant/special-object-flags.h" #include "object/item-tester-hooker.h" -#include "object/object-flavor.h" #include "object/object-info.h" #include "object/object-mark-types.h" #include "object/warning.h" @@ -310,7 +310,7 @@ void py_pickup_aux(player_type *owner_ptr, OBJECT_IDX o_idx) o_ptr = &owner_ptr->current_floor_ptr->o_list[o_idx]; #ifdef JP - object_desc(owner_ptr, old_name, o_ptr, OD_NAME_ONLY); + describe_flavor(owner_ptr, old_name, o_ptr, OD_NAME_ONLY); object_desc_count_japanese(kazu_str, o_ptr); hirottakazu = o_ptr->number; #endif @@ -334,7 +334,7 @@ void py_pickup_aux(player_type *owner_ptr, OBJECT_IDX o_idx) return; } - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); #ifdef JP if ((o_ptr->name1 == ART_CRIMSON) && (owner_ptr->pseikaku == PERSONALITY_COMBAT)) { @@ -397,7 +397,7 @@ void carry(player_type *creature_ptr, bool pickup) object_type *o_ptr; o_ptr = &creature_ptr->current_floor_ptr->o_list[this_o_idx]; GAME_TEXT o_name[MAX_NLEN]; - object_desc(creature_ptr, o_name, o_ptr, 0); + describe_flavor(creature_ptr, o_name, o_ptr, 0); next_o_idx = o_ptr->next_o_idx; disturb(creature_ptr, FALSE, FALSE); diff --git a/src/player/process-death.c b/src/player/process-death.c index f35c2372a..ec60cb3a6 100644 --- a/src/player/process-death.c +++ b/src/player/process-death.c @@ -10,12 +10,12 @@ #include "core/asking-player.h" #include "core/player-update-types.h" #include "core/stuff-handler.h" +#include "flavor/flavor-describer.h" #include "floor/floor-town.h" #include "floor/floor.h" #include "inventory/inventory-slot-types.h" #include "io/input-key-acceptor.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "perception/object-perception.h" #include "player/player-class.h" #include "store/store-util.h" @@ -39,12 +39,11 @@ */ static void center_string(char *buf, concptr str) { - int i = strlen(str); - int j = GRAVE_LINE_WIDTH / 2 - i / 2; - (void)sprintf(buf, "%*s%s%*s", j, "", str, GRAVE_LINE_WIDTH - i - j, ""); + int i = strlen(str); + int j = GRAVE_LINE_WIDTH / 2 - i / 2; + (void)sprintf(buf, "%*s%s%*s", j, "", str, GRAVE_LINE_WIDTH - i - j, ""); } - /*! * @brief 墓に基本情報を表示 * @param dead_ptr プレーヤーへの参照ポインタ @@ -53,21 +52,20 @@ static void center_string(char *buf, concptr str) */ static void show_basic_params(player_type *dead_ptr, char *buf) { - char tomb_message[160]; - (void)sprintf(tomb_message, _("レベル: %d", "Level: %d"), (int)dead_ptr->lev); - center_string(buf, tomb_message); - put_str(buf, 11, 11); - - (void)sprintf(tomb_message, _("経験値: %ld", "Exp: %ld"), (long)dead_ptr->exp); - center_string(buf, tomb_message); - put_str(buf, 12, 11); - - (void)sprintf(tomb_message, _("所持金: %ld", "AU: %ld"), (long)dead_ptr->au); - center_string(buf, tomb_message); - put_str(buf, 13, 11); + char tomb_message[160]; + (void)sprintf(tomb_message, _("レベル: %d", "Level: %d"), (int)dead_ptr->lev); + center_string(buf, tomb_message); + put_str(buf, 11, 11); + + (void)sprintf(tomb_message, _("経験値: %ld", "Exp: %ld"), (long)dead_ptr->exp); + center_string(buf, tomb_message); + put_str(buf, 12, 11); + + (void)sprintf(tomb_message, _("所持金: %ld", "AU: %ld"), (long)dead_ptr->au); + center_string(buf, tomb_message); + put_str(buf, 13, 11); } - #ifdef JP /*! * @brief プレーヤーを殺したモンスターを表示する (日本語版専用) @@ -78,47 +76,42 @@ static void show_basic_params(player_type *dead_ptr, char *buf) */ static int show_killing_monster(player_type *dead_ptr, char *buf, char *tomb_message, size_t tomb_message_size) { - shape_buffer(dead_ptr->died_from, GRAVE_LINE_WIDTH + 1, tomb_message, tomb_message_size); - char *t; - t = tomb_message + strlen(tomb_message) + 1; - if (!*t) return 0; - - char dummy[80]; - strcpy(dummy, t); /* 2nd line */ - if (*(t + strlen(t) + 1)) /* Does 3rd line exist? */ - { - for (t = dummy + strlen(dummy) - 2; iskanji(*(t - 1)); t--) /* Loop */; - strcpy(t, "…"); - } - else if (angband_strstr(tomb_message, "『") && suffix(dummy, "』")) - { - char dummy2[80]; - char *name_head = angband_strstr(tomb_message, "『"); - sprintf(dummy2, "%s%s", name_head, dummy); - if (strlen(dummy2) <= GRAVE_LINE_WIDTH) - { - strcpy(dummy, dummy2); - *name_head = '\0'; - } - } - else if (angband_strstr(tomb_message, "「") && suffix(dummy, "」")) - { - char dummy2[80]; - char *name_head = angband_strstr(tomb_message, "「"); - sprintf(dummy2, "%s%s", name_head, dummy); - if (strlen(dummy2) <= GRAVE_LINE_WIDTH) - { - strcpy(dummy, dummy2); - *name_head = '\0'; - } - } - - center_string(buf, dummy); - put_str(buf, 15, 11); - return 1; + shape_buffer(dead_ptr->died_from, GRAVE_LINE_WIDTH + 1, tomb_message, tomb_message_size); + char *t; + t = tomb_message + strlen(tomb_message) + 1; + if (!*t) + return 0; + + char dummy[80]; + strcpy(dummy, t); /* 2nd line */ + if (*(t + strlen(t) + 1)) /* Does 3rd line exist? */ + { + for (t = dummy + strlen(dummy) - 2; iskanji(*(t - 1)); t--) /* Loop */ + ; + strcpy(t, "…"); + } else if (angband_strstr(tomb_message, "『") && suffix(dummy, "』")) { + char dummy2[80]; + char *name_head = angband_strstr(tomb_message, "『"); + sprintf(dummy2, "%s%s", name_head, dummy); + if (strlen(dummy2) <= GRAVE_LINE_WIDTH) { + strcpy(dummy, dummy2); + *name_head = '\0'; + } + } else if (angband_strstr(tomb_message, "「") && suffix(dummy, "」")) { + char dummy2[80]; + char *name_head = angband_strstr(tomb_message, "「"); + sprintf(dummy2, "%s%s", name_head, dummy); + if (strlen(dummy2) <= GRAVE_LINE_WIDTH) { + strcpy(dummy, dummy2); + *name_head = '\0'; + } + } + + center_string(buf, dummy); + put_str(buf, 15, 11); + return 1; } - /*! * @brief どこで死んだかを表示する (日本語版専用) * @param dead_ptr プレーヤーへの参照ポインタ @@ -129,38 +122,28 @@ static int show_killing_monster(player_type *dead_ptr, char *buf, char *tomb_mes */ static void show_dead_place(player_type *dead_ptr, char *buf, char *tomb_message, int extra_line) { - if (streq(dead_ptr->died_from, "ripe") || streq(dead_ptr->died_from, "Seppuku")) - return; - - if (dead_ptr->current_floor_ptr->dun_level == 0) - { - concptr field_name = dead_ptr->town_num ? "街" : "荒野"; - if (streq(dead_ptr->died_from, "途中終了")) - { - sprintf(tomb_message, "%sで死んだ", field_name); - } - else - { - sprintf(tomb_message, "に%sで殺された", field_name); - } - } - else - { - if (streq(dead_ptr->died_from, "途中終了")) - { - sprintf(tomb_message, "地下 %d 階で死んだ", (int)dead_ptr->current_floor_ptr->dun_level); - } - else - { - sprintf(tomb_message, "に地下 %d 階で殺された", (int)dead_ptr->current_floor_ptr->dun_level); - } - } - - center_string(buf, tomb_message); - put_str(buf, 15 + extra_line, 11); + if (streq(dead_ptr->died_from, "ripe") || streq(dead_ptr->died_from, "Seppuku")) + return; + + if (dead_ptr->current_floor_ptr->dun_level == 0) { + concptr field_name = dead_ptr->town_num ? "街" : "荒野"; + if (streq(dead_ptr->died_from, "途中終了")) { + sprintf(tomb_message, "%sで死んだ", field_name); + } else { + sprintf(tomb_message, "に%sで殺された", field_name); + } + } else { + if (streq(dead_ptr->died_from, "途中終了")) { + sprintf(tomb_message, "地下 %d 階で死んだ", (int)dead_ptr->current_floor_ptr->dun_level); + } else { + sprintf(tomb_message, "に地下 %d 階で殺された", (int)dead_ptr->current_floor_ptr->dun_level); + } + } + + center_string(buf, tomb_message); + put_str(buf, 15 + extra_line, 11); } - /*! * @brief 墓に刻む言葉を細かく表示 (日本語版専用) * @param dead_ptr プレーヤーへの参照ポインタ @@ -169,33 +152,25 @@ static void show_dead_place(player_type *dead_ptr, char *buf, char *tomb_message */ static void show_tomb_detail(player_type *dead_ptr, char *buf) { - char tomb_message[160]; - int extra_line = 0; - if (streq(dead_ptr->died_from, "途中終了")) - { - strcpy(tomb_message, "<自殺>"); - } - else if (streq(dead_ptr->died_from, "ripe")) - { - strcpy(tomb_message, "引退後に天寿を全う"); - } - else if (streq(dead_ptr->died_from, "Seppuku")) - { - strcpy(tomb_message, "勝利の後、切腹"); - } - else - { - extra_line = show_killing_monster(dead_ptr, buf, tomb_message, sizeof(tomb_message)); - } - - center_string(buf, tomb_message); - put_str(buf, 14, 11); - - show_dead_place(dead_ptr, buf, tomb_message, extra_line); + char tomb_message[160]; + int extra_line = 0; + if (streq(dead_ptr->died_from, "途中終了")) { + strcpy(tomb_message, "<自殺>"); + } else if (streq(dead_ptr->died_from, "ripe")) { + strcpy(tomb_message, "引退後に天寿を全う"); + } else if (streq(dead_ptr->died_from, "Seppuku")) { + strcpy(tomb_message, "勝利の後、切腹"); + } else { + extra_line = show_killing_monster(dead_ptr, buf, tomb_message, sizeof(tomb_message)); + } + + center_string(buf, tomb_message); + put_str(buf, 14, 11); + + show_dead_place(dead_ptr, buf, tomb_message, extra_line); } #else - /*! * @brief Detailed display of words engraved on the tomb (English version only) * @param dead_ptr reference pointer to the player @@ -204,32 +179,32 @@ static void show_tomb_detail(player_type *dead_ptr, char *buf) */ static void show_tomb_detail(player_type *dead_ptr, char *buf) { - char tomb_message[160]; - (void)sprintf(tomb_message, "Killed on Level %d", dead_ptr->current_floor_ptr->dun_level); - center_string(buf, tomb_message); - put_str(buf, 14, 11); - - shape_buffer(format("by %s.", dead_ptr->died_from), GRAVE_LINE_WIDTH + 1, tomb_message, sizeof(tomb_message)); - center_string(buf, tomb_message); - char *t; - put_str(buf, 15, 11); - t = tomb_message + strlen(tomb_message) + 1; - if (!*t) return; - - char dummy[80]; - strcpy(dummy, t); /* 2nd line */ - if (*(t + strlen(t) + 1)) /* Does 3rd line exist? */ - { - int dummy_len = strlen(dummy); - strcpy(dummy + MIN(dummy_len, GRAVE_LINE_WIDTH - 3), "..."); - } - - center_string(buf, dummy); - put_str(buf, 16, 11); + char tomb_message[160]; + (void)sprintf(tomb_message, "Killed on Level %d", dead_ptr->current_floor_ptr->dun_level); + center_string(buf, tomb_message); + put_str(buf, 14, 11); + + shape_buffer(format("by %s.", dead_ptr->died_from), GRAVE_LINE_WIDTH + 1, tomb_message, sizeof(tomb_message)); + center_string(buf, tomb_message); + char *t; + put_str(buf, 15, 11); + t = tomb_message + strlen(tomb_message) + 1; + if (!*t) + return; + + char dummy[80]; + strcpy(dummy, t); /* 2nd line */ + if (*(t + strlen(t) + 1)) /* Does 3rd line exist? */ + { + int dummy_len = strlen(dummy); + strcpy(dummy + MIN(dummy_len, GRAVE_LINE_WIDTH - 3), "..."); + } + + center_string(buf, dummy); + put_str(buf, 16, 11); } #endif - /*! * @brief 墓石のアスキーアート表示 / * Display a "tomb-stone" @@ -238,40 +213,38 @@ static void show_tomb_detail(player_type *dead_ptr, char *buf) */ void print_tomb(player_type *dead_ptr) { - Term_clear(); - char buf[1024]; - read_dead_file(buf, sizeof(buf)); - concptr p = (current_world_ptr->total_winner || (dead_ptr->lev > PY_MAX_LEVEL)) - ? _("偉大なる者", "Magnificant") - : player_title[dead_ptr->pclass][(dead_ptr->lev - 1) / 5]; + Term_clear(); + char buf[1024]; + read_dead_file(buf, sizeof(buf)); + concptr p = (current_world_ptr->total_winner || (dead_ptr->lev > PY_MAX_LEVEL)) ? _("偉大なる者", "Magnificant") + : player_title[dead_ptr->pclass][(dead_ptr->lev - 1) / 5]; - center_string(buf, dead_ptr->name); - put_str(buf, 6, 11); + center_string(buf, dead_ptr->name); + put_str(buf, 6, 11); #ifdef JP #else - center_string(buf, "the"); - put_str(buf, 7, 11); + center_string(buf, "the"); + put_str(buf, 7, 11); #endif - center_string(buf, p); - put_str(buf, 8, 11); + center_string(buf, p); + put_str(buf, 8, 11); - center_string(buf, cp_ptr->title); - put_str(buf, 10, 11); + center_string(buf, cp_ptr->title); + put_str(buf, 10, 11); - show_basic_params(dead_ptr, buf); - show_tomb_detail(dead_ptr, buf); + show_basic_params(dead_ptr, buf); + show_tomb_detail(dead_ptr, buf); - char current_time[80]; - time_t ct = time((time_t*)0); - (void)sprintf(current_time, "%-.24s", ctime(&ct)); - center_string(buf, current_time); - put_str(buf, 17, 11); - msg_format(_("さようなら、%s!", "Goodbye, %s!"), dead_ptr->name); + char current_time[80]; + time_t ct = time((time_t *)0); + (void)sprintf(current_time, "%-.24s", ctime(&ct)); + center_string(buf, current_time); + put_str(buf, 17, 11); + msg_format(_("さようなら、%s!", "Goodbye, %s!"), dead_ptr->name); } - /*! * @brief 死亡/引退/切腹時にインベントリ内のアイテムを*鑑定*する * @param creature_ptr プレーヤーへの参照ポインタ @@ -279,18 +252,17 @@ void print_tomb(player_type *dead_ptr) */ static void inventory_aware(player_type *creature_ptr) { - object_type *o_ptr; - for (int i = 0; i < INVEN_TOTAL; i++) - { - o_ptr = &creature_ptr->inventory_list[i]; - if (!o_ptr->k_idx) continue; - - object_aware(creature_ptr, o_ptr); - object_known(o_ptr); - } + object_type *o_ptr; + for (int i = 0; i < INVEN_TOTAL; i++) { + o_ptr = &creature_ptr->inventory_list[i]; + if (!o_ptr->k_idx) + continue; + + object_aware(creature_ptr, o_ptr); + object_known(o_ptr); + } } - /*! * @brief 死亡/引退/切腹時に我が家のアイテムを*鑑定*する * @param creature_ptr プレーヤーへの参照ポインタ @@ -298,23 +270,21 @@ static void inventory_aware(player_type *creature_ptr) */ static void home_aware(player_type *creature_ptr) { - object_type *o_ptr; - store_type *store_ptr; - for (int i = 1; i < max_towns; i++) - { - store_ptr = &town_info[i].store[STORE_HOME]; - for (int j = 0; j < store_ptr->stock_num; j++) - { - o_ptr = &store_ptr->stock[j]; - if (!o_ptr->k_idx) continue; - - object_aware(creature_ptr, o_ptr); - object_known(o_ptr); - } - } + object_type *o_ptr; + store_type *store_ptr; + for (int i = 1; i < max_towns; i++) { + store_ptr = &town_info[i].store[STORE_HOME]; + for (int j = 0; j < store_ptr->stock_num; j++) { + o_ptr = &store_ptr->stock[j]; + if (!o_ptr->k_idx) + continue; + + object_aware(creature_ptr, o_ptr); + object_known(o_ptr); + } + } } - /*! * @brief プレーヤーの持ち物を表示する * @param creature_ptr プレーヤーへの参照ポインタ @@ -322,27 +292,26 @@ static void home_aware(player_type *creature_ptr) */ static bool show_dead_player_items(player_type *creature_ptr) { - if (creature_ptr->equip_cnt) - { - Term_clear(); - (void)show_equipment(creature_ptr, 0, USE_FULL, 0); - prt(_("装備していたアイテム: -続く-", "You are using: -more-"), 0, 0); - if (inkey() == ESCAPE) return TRUE; - } - - if (creature_ptr->inven_cnt) - { - Term_clear(); - (void)show_inventory(creature_ptr, 0, USE_FULL, 0); - prt(_("持っていたアイテム: -続く-", "You are carrying: -more-"), 0, 0); - - if (inkey() == ESCAPE) return TRUE; - } - - return FALSE; + if (creature_ptr->equip_cnt) { + Term_clear(); + (void)show_equipment(creature_ptr, 0, USE_FULL, 0); + prt(_("装備していたアイテム: -続く-", "You are using: -more-"), 0, 0); + if (inkey() == ESCAPE) + return TRUE; + } + + if (creature_ptr->inven_cnt) { + Term_clear(); + (void)show_inventory(creature_ptr, 0, USE_FULL, 0); + prt(_("持っていたアイテム: -続く-", "You are carrying: -more-"), 0, 0); + + if (inkey() == ESCAPE) + return TRUE; + } + + return FALSE; } - /*! * @brief 我が家にあったアイテムを表示する * @param creature_ptr プレーヤーへの参照ポインタ @@ -350,34 +319,32 @@ static bool show_dead_player_items(player_type *creature_ptr) */ static void show_dead_home_items(player_type *creature_ptr) { - for (int l = 1; l < max_towns; l++) - { - store_type *store_ptr; - store_ptr = &town_info[l].store[STORE_HOME]; - if (store_ptr->stock_num == 0) continue; - - for (int i = 0, k = 0; i < store_ptr->stock_num; k++) - { - Term_clear(); - for (int j = 0; (j < 12) && (i < store_ptr->stock_num); j++, i++) - { - GAME_TEXT o_name[MAX_NLEN]; - char tmp_val[80]; - object_type *o_ptr; - o_ptr = &store_ptr->stock[i]; - sprintf(tmp_val, "%c) ", I2A(j)); - prt(tmp_val, j + 2, 4); - object_desc(creature_ptr, o_name, o_ptr, 0); - c_put_str(tval_to_attr[o_ptr->tval], o_name, j + 2, 7); - } - - prt(format(_("我が家に置いてあったアイテム ( %d ページ): -続く-", "Your home contains (page %d): -more-"), k + 1), 0, 0); - if (inkey() == ESCAPE) return; - } - } + for (int l = 1; l < max_towns; l++) { + store_type *store_ptr; + store_ptr = &town_info[l].store[STORE_HOME]; + if (store_ptr->stock_num == 0) + continue; + + for (int i = 0, k = 0; i < store_ptr->stock_num; k++) { + Term_clear(); + for (int j = 0; (j < 12) && (i < store_ptr->stock_num); j++, i++) { + GAME_TEXT o_name[MAX_NLEN]; + char tmp_val[80]; + object_type *o_ptr; + o_ptr = &store_ptr->stock[i]; + sprintf(tmp_val, "%c) ", I2A(j)); + prt(tmp_val, j + 2, 4); + describe_flavor(creature_ptr, o_name, o_ptr, 0); + c_put_str(tval_to_attr[o_ptr->tval], o_name, j + 2, 7); + } + + prt(format(_("我が家に置いてあったアイテム ( %d ページ): -続く-", "Your home contains (page %d): -more-"), k + 1), 0, 0); + if (inkey() == ESCAPE) + return; + } + } } - /*! * @brief キャラクタ情報をファイルに書き出す * @param creature_ptr プレーヤーへの参照ポインタ @@ -386,23 +353,23 @@ static void show_dead_home_items(player_type *creature_ptr) */ static void export_player_info(player_type *creature_ptr, update_playtime_pf update_playtime, display_player_pf display_player) { - prt(_("キャラクターの記録をファイルに書き出すことができます。", "You may now dump a character record to one or more files."), 21, 0); - prt(_("リターンキーでキャラクターを見ます。ESCで中断します。", "Then, hit RETURN to see the character, or ESC to abort."), 22, 0); - while (TRUE) - { - char out_val[160]; - put_str(_("ファイルネーム: ", "Filename: "), 23, 0); - strcpy(out_val, ""); - if (!askfor(out_val, 60)) return; - if (!out_val[0]) break; - - screen_save(); - (void)file_character(creature_ptr, out_val, update_playtime, display_player); - screen_load(); - } + prt(_("キャラクターの記録をファイルに書き出すことができます。", "You may now dump a character record to one or more files."), 21, 0); + prt(_("リターンキーでキャラクターを見ます。ESCで中断します。", "Then, hit RETURN to see the character, or ESC to abort."), 22, 0); + while (TRUE) { + char out_val[160]; + put_str(_("ファイルネーム: ", "Filename: "), 23, 0); + strcpy(out_val, ""); + if (!askfor(out_val, 60)) + return; + if (!out_val[0]) + break; + + screen_save(); + (void)file_character(creature_ptr, out_val, update_playtime, display_player); + screen_load(); + } } - /*! * @brief 死亡、引退時の簡易ステータス表示 * @param creature_ptr プレーヤーへの参照ポインタ @@ -414,20 +381,22 @@ static void export_player_info(player_type *creature_ptr, update_playtime_pf upd */ void show_death_info(player_type *creature_ptr, update_playtime_pf update_playtime, display_player_pf display_player) { - inventory_aware(creature_ptr); - home_aware(creature_ptr); - - creature_ptr->update |= (PU_BONUS); - handle_stuff(creature_ptr); - flush(); - msg_erase(); - - export_player_info(creature_ptr, update_playtime, display_player); - (*update_playtime)(); - (*display_player)(creature_ptr, 0); - prt(_("何かキーを押すとさらに情報が続きます (ESCで中断): ", "Hit any key to see more information (ESC to abort): "), 23, 0); - if (inkey() == ESCAPE) return; - if (show_dead_player_items(creature_ptr)) return; - - show_dead_home_items(creature_ptr); + inventory_aware(creature_ptr); + home_aware(creature_ptr); + + creature_ptr->update |= (PU_BONUS); + handle_stuff(creature_ptr); + flush(); + msg_erase(); + + export_player_info(creature_ptr, update_playtime, display_player); + (*update_playtime)(); + (*display_player)(creature_ptr, 0); + prt(_("何かキーを押すとさらに情報が続きます (ESCで中断): ", "Hit any key to see more information (ESC to abort): "), 23, 0); + if (inkey() == ESCAPE) + return; + if (show_dead_player_items(creature_ptr)) + return; + + show_dead_home_items(creature_ptr); } diff --git a/src/realm/realm-hex.c b/src/realm/realm-hex.c index d760b5678..12c95ead8 100644 --- a/src/realm/realm-hex.c +++ b/src/realm/realm-hex.c @@ -21,6 +21,7 @@ #include "core/player-redraw-types.h" #include "core/player-update-types.h" #include "effect/effect-characteristics.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "floor/floor.h" @@ -38,7 +39,6 @@ #include "object/item-tester-hooker.h" #include "object/item-use-flags.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "player/attack-defense-types.h" #include "player/player-skill.h" #include "player/player-status.h" @@ -191,7 +191,7 @@ concptr do_hex_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode) if (!o_ptr) return FALSE; - object_desc(caster_ptr, o_name, o_ptr, OD_NAME_ONLY); + describe_flavor(caster_ptr, o_name, o_ptr, OD_NAME_ONLY); object_flags(caster_ptr, o_ptr, f); if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) @@ -499,7 +499,7 @@ concptr do_hex_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode) return FALSE; o_ptr = &caster_ptr->inventory_list[item]; - object_desc(caster_ptr, o_name, o_ptr, OD_NAME_ONLY); + describe_flavor(caster_ptr, o_name, o_ptr, OD_NAME_ONLY); object_flags(caster_ptr, o_ptr, f); if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) diff --git a/src/spell-kind/magic-item-recharger.c b/src/spell-kind/magic-item-recharger.c index 3616f6c5d..384fe4c8d 100644 --- a/src/spell-kind/magic-item-recharger.c +++ b/src/spell-kind/magic-item-recharger.c @@ -12,6 +12,7 @@ #include "spell-kind/magic-item-recharger.h" #include "core/stuff-handler.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "inventory/inventory-object.h" @@ -20,7 +21,6 @@ #include "object-hook/hook-magic.h" #include "object/item-tester-hooker.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "object/object-kind.h" #include "player/player-class.h" #include "view/display-messages.h" @@ -116,7 +116,7 @@ bool recharge(player_type *caster_ptr, int power) byte fail_type = 1; GAME_TEXT o_name[MAX_NLEN]; if (object_is_fixed_artifact(o_ptr)) { - object_desc(caster_ptr, o_name, o_ptr, OD_NAME_ONLY); + describe_flavor(caster_ptr, o_name, o_ptr, OD_NAME_ONLY); msg_format(_("魔力が逆流した!%sは完全に魔力を失った。", "The recharging backfires - %s is completely drained!"), o_name); if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout < 10000)) o_ptr->timeout = (o_ptr->timeout + 100) * 2; @@ -125,7 +125,7 @@ bool recharge(player_type *caster_ptr, int power) return update_player(caster_ptr); } - object_desc(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); if (IS_WIZARD_CLASS(caster_ptr) || caster_ptr->pclass == CLASS_MAGIC_EATER || caster_ptr->pclass == CLASS_BLUE_MAGE) { /* 10% chance to blow up one rod, otherwise draining. */ diff --git a/src/spell-kind/spells-enchant.c b/src/spell-kind/spells-enchant.c index d7a36ac6c..a325d7bc3 100644 --- a/src/spell-kind/spells-enchant.c +++ b/src/spell-kind/spells-enchant.c @@ -1,4 +1,5 @@ #include "spell-kind/spells-enchant.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "game-option/disturbance-options.h" @@ -12,7 +13,6 @@ #include "object-hook/hook-weapon.h" #include "object/item-tester-hooker.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "object/object-generator.h" #include "player/avatar.h" #include "term/screen-processor.h" @@ -36,7 +36,7 @@ bool artifact_scroll(player_type *caster_ptr) return FALSE; GAME_TEXT o_name[MAX_NLEN]; - object_desc(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); #ifdef JP msg_format("%s は眩い光を発した!", o_name); #else @@ -96,7 +96,7 @@ bool artifact_scroll(player_type *caster_ptr) } if (record_rand_art) { - object_desc(caster_ptr, o_name, o_ptr, OD_NAME_ONLY); + describe_flavor(caster_ptr, o_name, o_ptr, OD_NAME_ONLY); exe_write_diary(caster_ptr, DIARY_ART_SCROLL, 0, o_name); } diff --git a/src/spell-kind/spells-equipment.c b/src/spell-kind/spells-equipment.c index 97bce17b6..cff48780e 100644 --- a/src/spell-kind/spells-equipment.c +++ b/src/spell-kind/spells-equipment.c @@ -1,12 +1,12 @@ #include "spell-kind/spells-equipment.h" #include "core/player-update-types.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "inventory/inventory-slot-types.h" #include "mind/racial-android.h" #include "object-hook/hook-enchant.h" #include "object-hook/hook-weapon.h" -#include "object/object-flavor.h" #include "object/object-info.h" #include "player/avatar.h" #include "system/object-type-definition.h" @@ -63,7 +63,7 @@ bool apply_disenchant(player_type *target_ptr, BIT_FLAGS mode) } GAME_TEXT o_name[MAX_NLEN]; - object_desc(target_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(target_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); if (object_is_artifact(o_ptr) && (randint0(100) < 71)) { #ifdef JP msg_format("%s(%c)は劣化を跳ね返した!", o_name, index_to_label(t)); diff --git a/src/spell-kind/spells-fetcher.c b/src/spell-kind/spells-fetcher.c index ff6fc71a8..e5ba0310f 100644 --- a/src/spell-kind/spells-fetcher.c +++ b/src/spell-kind/spells-fetcher.c @@ -2,17 +2,17 @@ #include "core/player-redraw-types.h" #include "core/player-update-types.h" #include "core/stuff-handler.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor.h" #include "grid/feature.h" #include "grid/grid.h" #include "io/targeting.h" -#include "monster/monster-describer.h" #include "monster-race/monster-race.h" #include "monster-race/race-flags7.h" +#include "monster/monster-describer.h" #include "monster/monster-status.h" #include "monster/monster-update.h" -#include "object/object-flavor.h" #include "system/object-type-definition.h" #include "util/bit-flags-calculator.h" #include "view/display-messages.h" @@ -98,7 +98,7 @@ void fetch_item(player_type *caster_ptr, DIRECTION dir, WEIGHT wgt, bool require o_ptr->iy = caster_ptr->y; o_ptr->ix = caster_ptr->x; - object_desc(caster_ptr, o_name, o_ptr, OD_NAME_ONLY); + describe_flavor(caster_ptr, o_name, o_ptr, OD_NAME_ONLY); msg_format(_("%^sがあなたの足元に飛んできた。", "%^s flies through the air to your feet."), o_name); note_spot(caster_ptr, caster_ptr->y, caster_ptr->x); diff --git a/src/spell-kind/spells-floor.c b/src/spell-kind/spells-floor.c index 79bb0843c..edc934fcc 100644 --- a/src/spell-kind/spells-floor.c +++ b/src/spell-kind/spells-floor.c @@ -13,6 +13,7 @@ #include "dungeon/dungeon.h" #include "dungeon/quest.h" #include "effect/effect-characteristics.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-events.h" #include "floor/floor-object.h" @@ -37,14 +38,13 @@ #include "object-enchant/special-object-flags.h" #include "object-hook/hook-checker.h" #include "object-hook/hook-enchant.h" -#include "object/object-flavor.h" #include "object/object-mark-types.h" #include "perception/object-perception.h" -#include "status/bad-status-setter.h" #include "player/special-defense-types.h" #include "spell-kind/spells-teleport.h" #include "spell/process-effect.h" #include "spell/spell-types.h" +#include "status/bad-status-setter.h" #include "util/bit-flags-calculator.h" #include "view/display-messages.h" @@ -56,196 +56,182 @@ */ void wiz_lite(player_type *caster_ptr, bool ninja) { - /* Memorize objects */ - for (OBJECT_IDX i = 1; i < caster_ptr->current_floor_ptr->o_max; i++) - { - object_type *o_ptr = &caster_ptr->current_floor_ptr->o_list[i]; - if (!object_is_valid(o_ptr)) continue; - if (object_is_held_monster(o_ptr)) continue; - o_ptr->marked |= OM_FOUND; - } - - /* Scan all normal grids */ - for (POSITION y = 1; y < caster_ptr->current_floor_ptr->height - 1; y++) - { - /* Scan all normal grids */ - for (POSITION x = 1; x < caster_ptr->current_floor_ptr->width - 1; x++) - { - grid_type *g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x]; - - /* Memorize terrain of the grid */ - g_ptr->info |= (CAVE_KNOWN); - - /* Feature code (applying "mimic" field) */ - FEAT_IDX feat = get_feat_mimic(g_ptr); - feature_type *f_ptr; - f_ptr = &f_info[feat]; - - /* Process all non-walls */ - if (have_flag(f_ptr->flags, FF_WALL)) continue; - - /* Scan all neighbors */ - for (OBJECT_IDX i = 0; i < 9; i++) - { - POSITION yy = y + ddy_ddd[i]; - POSITION xx = x + ddx_ddd[i]; - g_ptr = &caster_ptr->current_floor_ptr->grid_array[yy][xx]; - - /* Feature code (applying "mimic" field) */ - f_ptr = &f_info[get_feat_mimic(g_ptr)]; - - /* Perma-lite the grid */ - if (!(d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS) && !ninja) - { - g_ptr->info |= (CAVE_GLOW); - } - - /* Memorize normal features */ - if (have_flag(f_ptr->flags, FF_REMEMBER)) - { - /* Memorize the grid */ - g_ptr->info |= (CAVE_MARK); - } - - /* Perma-lit grids (newly and previously) */ - else if (g_ptr->info & CAVE_GLOW) - { - /* Normally, memorize floors (see above) */ - if (view_perma_grids && !view_torch_grids) - { - /* Memorize the grid */ - g_ptr->info |= (CAVE_MARK); - } - } - } - } - } - - caster_ptr->update |= (PU_MONSTERS); - caster_ptr->redraw |= (PR_MAP); - caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); - - if (caster_ptr->special_defense & NINJA_S_STEALTH) - { - if (caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x].info & CAVE_GLOW) set_superstealth(caster_ptr, FALSE); - } -} + /* Memorize objects */ + for (OBJECT_IDX i = 1; i < caster_ptr->current_floor_ptr->o_max; i++) { + object_type *o_ptr = &caster_ptr->current_floor_ptr->o_list[i]; + if (!object_is_valid(o_ptr)) + continue; + if (object_is_held_monster(o_ptr)) + continue; + o_ptr->marked |= OM_FOUND; + } + + /* Scan all normal grids */ + for (POSITION y = 1; y < caster_ptr->current_floor_ptr->height - 1; y++) { + /* Scan all normal grids */ + for (POSITION x = 1; x < caster_ptr->current_floor_ptr->width - 1; x++) { + grid_type *g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x]; + + /* Memorize terrain of the grid */ + g_ptr->info |= (CAVE_KNOWN); + + /* Feature code (applying "mimic" field) */ + FEAT_IDX feat = get_feat_mimic(g_ptr); + feature_type *f_ptr; + f_ptr = &f_info[feat]; + + /* Process all non-walls */ + if (have_flag(f_ptr->flags, FF_WALL)) + continue; + /* Scan all neighbors */ + for (OBJECT_IDX i = 0; i < 9; i++) { + POSITION yy = y + ddy_ddd[i]; + POSITION xx = x + ddx_ddd[i]; + g_ptr = &caster_ptr->current_floor_ptr->grid_array[yy][xx]; + + /* Feature code (applying "mimic" field) */ + f_ptr = &f_info[get_feat_mimic(g_ptr)]; + + /* Perma-lite the grid */ + if (!(d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS) && !ninja) { + g_ptr->info |= (CAVE_GLOW); + } + + /* Memorize normal features */ + if (have_flag(f_ptr->flags, FF_REMEMBER)) { + /* Memorize the grid */ + g_ptr->info |= (CAVE_MARK); + } + + /* Perma-lit grids (newly and previously) */ + else if (g_ptr->info & CAVE_GLOW) { + /* Normally, memorize floors (see above) */ + if (view_perma_grids && !view_torch_grids) { + /* Memorize the grid */ + g_ptr->info |= (CAVE_MARK); + } + } + } + } + } + + caster_ptr->update |= (PU_MONSTERS); + caster_ptr->redraw |= (PR_MAP); + caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); + + if (caster_ptr->special_defense & NINJA_S_STEALTH) { + if (caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x].info & CAVE_GLOW) + set_superstealth(caster_ptr, FALSE); + } +} /* * Forget the dungeon map (ala "Thinking of Maud..."). */ void wiz_dark(player_type *caster_ptr) { - /* Forget every grid */ - for (POSITION y = 1; y < caster_ptr->current_floor_ptr->height - 1; y++) - { - for (POSITION x = 1; x < caster_ptr->current_floor_ptr->width - 1; x++) - { - grid_type *g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x]; - - /* Process the grid */ - g_ptr->info &= ~(CAVE_MARK | CAVE_IN_DETECT | CAVE_KNOWN); - g_ptr->info |= (CAVE_UNSAFE); - } - } - - /* Forget every grid on horizontal edge */ - for (POSITION x = 0; x < caster_ptr->current_floor_ptr->width; x++) - { - caster_ptr->current_floor_ptr->grid_array[0][x].info &= ~(CAVE_MARK); - caster_ptr->current_floor_ptr->grid_array[caster_ptr->current_floor_ptr->height - 1][x].info &= ~(CAVE_MARK); - } - - /* Forget every grid on vertical edge */ - for (POSITION y = 1; y < (caster_ptr->current_floor_ptr->height - 1); y++) - { - caster_ptr->current_floor_ptr->grid_array[y][0].info &= ~(CAVE_MARK); - caster_ptr->current_floor_ptr->grid_array[y][caster_ptr->current_floor_ptr->width - 1].info &= ~(CAVE_MARK); - } - - /* Forget all objects */ - for (OBJECT_IDX i = 1; i < caster_ptr->current_floor_ptr->o_max; i++) - { - object_type *o_ptr = &caster_ptr->current_floor_ptr->o_list[i]; - - if (!object_is_valid(o_ptr)) continue; - if (object_is_held_monster(o_ptr)) continue; - - /* Forget the object */ - o_ptr->marked &= OM_TOUCHED; - } - - /* Forget travel route when we have forgotten map */ - forget_travel_flow(caster_ptr->current_floor_ptr); - - caster_ptr->update |= (PU_UN_VIEW | PU_UN_LITE); - caster_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE); - caster_ptr->update |= (PU_MONSTERS); - caster_ptr->redraw |= (PR_MAP); - caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); -} + /* Forget every grid */ + for (POSITION y = 1; y < caster_ptr->current_floor_ptr->height - 1; y++) { + for (POSITION x = 1; x < caster_ptr->current_floor_ptr->width - 1; x++) { + grid_type *g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x]; + + /* Process the grid */ + g_ptr->info &= ~(CAVE_MARK | CAVE_IN_DETECT | CAVE_KNOWN); + g_ptr->info |= (CAVE_UNSAFE); + } + } + + /* Forget every grid on horizontal edge */ + for (POSITION x = 0; x < caster_ptr->current_floor_ptr->width; x++) { + caster_ptr->current_floor_ptr->grid_array[0][x].info &= ~(CAVE_MARK); + caster_ptr->current_floor_ptr->grid_array[caster_ptr->current_floor_ptr->height - 1][x].info &= ~(CAVE_MARK); + } + /* Forget every grid on vertical edge */ + for (POSITION y = 1; y < (caster_ptr->current_floor_ptr->height - 1); y++) { + caster_ptr->current_floor_ptr->grid_array[y][0].info &= ~(CAVE_MARK); + caster_ptr->current_floor_ptr->grid_array[y][caster_ptr->current_floor_ptr->width - 1].info &= ~(CAVE_MARK); + } + + /* Forget all objects */ + for (OBJECT_IDX i = 1; i < caster_ptr->current_floor_ptr->o_max; i++) { + object_type *o_ptr = &caster_ptr->current_floor_ptr->o_list[i]; + + if (!object_is_valid(o_ptr)) + continue; + if (object_is_held_monster(o_ptr)) + continue; + + /* Forget the object */ + o_ptr->marked &= OM_TOUCHED; + } + + /* Forget travel route when we have forgotten map */ + forget_travel_flow(caster_ptr->current_floor_ptr); + + caster_ptr->update |= (PU_UN_VIEW | PU_UN_LITE); + caster_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE); + caster_ptr->update |= (PU_MONSTERS); + caster_ptr->redraw |= (PR_MAP); + caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); +} /* * Hack -- map the current panel (plus some) ala "magic mapping" */ void map_area(player_type *caster_ptr, POSITION range) { - if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS) range /= 3; - - /* Scan that area */ - for (POSITION y = 1; y < caster_ptr->current_floor_ptr->height - 1; y++) - { - for (POSITION x = 1; x < caster_ptr->current_floor_ptr->width - 1; x++) - { - if (distance(caster_ptr->y, caster_ptr->x, y, x) > range) continue; - - grid_type *g_ptr; - g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x]; - - /* Memorize terrain of the grid */ - g_ptr->info |= (CAVE_KNOWN); - - /* Feature code (applying "mimic" field) */ - FEAT_IDX feat = get_feat_mimic(g_ptr); - feature_type *f_ptr; - f_ptr = &f_info[feat]; - - /* All non-walls are "checked" */ - if (have_flag(f_ptr->flags, FF_WALL)) continue; - - /* Memorize normal features */ - if (have_flag(f_ptr->flags, FF_REMEMBER)) - { - /* Memorize the object */ - g_ptr->info |= (CAVE_MARK); - } - - /* Memorize known walls */ - for (int i = 0; i < 8; i++) - { - g_ptr = &caster_ptr->current_floor_ptr->grid_array[y + ddy_ddd[i]][x + ddx_ddd[i]]; - - /* Feature code (applying "mimic" field) */ - feat = get_feat_mimic(g_ptr); - f_ptr = &f_info[feat]; - - /* Memorize walls (etc) */ - if (have_flag(f_ptr->flags, FF_REMEMBER)) - { - /* Memorize the walls */ - g_ptr->info |= (CAVE_MARK); - } - } - } - } - - caster_ptr->redraw |= (PR_MAP); - caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); -} + if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS) + range /= 3; + /* Scan that area */ + for (POSITION y = 1; y < caster_ptr->current_floor_ptr->height - 1; y++) { + for (POSITION x = 1; x < caster_ptr->current_floor_ptr->width - 1; x++) { + if (distance(caster_ptr->y, caster_ptr->x, y, x) > range) + continue; + + grid_type *g_ptr; + g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x]; + + /* Memorize terrain of the grid */ + g_ptr->info |= (CAVE_KNOWN); + /* Feature code (applying "mimic" field) */ + FEAT_IDX feat = get_feat_mimic(g_ptr); + feature_type *f_ptr; + f_ptr = &f_info[feat]; + + /* All non-walls are "checked" */ + if (have_flag(f_ptr->flags, FF_WALL)) + continue; + + /* Memorize normal features */ + if (have_flag(f_ptr->flags, FF_REMEMBER)) { + /* Memorize the object */ + g_ptr->info |= (CAVE_MARK); + } + + /* Memorize known walls */ + for (int i = 0; i < 8; i++) { + g_ptr = &caster_ptr->current_floor_ptr->grid_array[y + ddy_ddd[i]][x + ddx_ddd[i]]; + + /* Feature code (applying "mimic" field) */ + feat = get_feat_mimic(g_ptr); + f_ptr = &f_info[feat]; + + /* Memorize walls (etc) */ + if (have_flag(f_ptr->flags, FF_REMEMBER)) { + /* Memorize the walls */ + g_ptr->info |= (CAVE_MARK); + } + } + } + } + + caster_ptr->redraw |= (PR_MAP); + caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); +} /*! * @brief *破壊*処理を行う / The spell of destruction @@ -264,255 +250,228 @@ void map_area(player_type *caster_ptr, POSITION range) */ bool destroy_area(player_type *caster_ptr, POSITION y1, POSITION x1, POSITION r, bool in_generate) { - /* Prevent destruction of quest levels and town */ - floor_type *floor_ptr = caster_ptr->current_floor_ptr; - if ((floor_ptr->inside_quest && is_fixed_quest_idx(floor_ptr->inside_quest)) || !floor_ptr->dun_level) - { - return FALSE; - } - - /* Lose monster light */ - if (!in_generate) clear_mon_lite(floor_ptr); - - /* Big area of affect */ - bool flag = FALSE; - for (POSITION y = (y1 - r); y <= (y1 + r); y++) - { - for (POSITION x = (x1 - r); x <= (x1 + r); x++) - { - if (!in_bounds(floor_ptr, y, x)) continue; - - /* Extract the distance */ - int k = distance(y1, x1, y, x); - - /* Stay in the circle of death */ - if (k > r) continue; - grid_type *g_ptr; - g_ptr = &floor_ptr->grid_array[y][x]; - - /* Lose room and vault */ - g_ptr->info &= ~(CAVE_ROOM | CAVE_ICKY); - - /* Lose light and knowledge */ - g_ptr->info &= ~(CAVE_MARK | CAVE_GLOW | CAVE_KNOWN); - - if (!in_generate) /* Normal */ - { - /* Lose unsafety */ - g_ptr->info &= ~(CAVE_UNSAFE); - - /* Hack -- Notice player affect */ - if (player_bold(caster_ptr, y, x)) - { - /* Hurt the player later */ - flag = TRUE; - - /* Do not hurt this grid */ - continue; - } - } - - /* Hack -- Skip the epicenter */ - if ((y == y1) && (x == x1)) continue; - - if (g_ptr->m_idx) - { - monster_type *m_ptr = &floor_ptr->m_list[g_ptr->m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - - if (in_generate) /* In generation */ - { - /* Delete the monster (if any) */ - delete_monster(caster_ptr, y, x); - } - else if (r_ptr->flags1 & RF1_QUESTOR) - { - /* Heal the monster */ - m_ptr->hp = m_ptr->maxhp; - - /* Try to teleport away quest monsters */ - if (!teleport_away(caster_ptr, g_ptr->m_idx, (r * 2) + 1, TELEPORT_DEC_VALOUR)) continue; - } - else - { - if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname) - { - GAME_TEXT m_name[MAX_NLEN]; - - monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE); - exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_DESTROY, m_name); - } - - /* Delete the monster (if any) */ - delete_monster(caster_ptr, y, x); - } - } - - /* During generation, destroyed artifacts are "preserved" */ - if (preserve_mode || in_generate) - { - OBJECT_IDX this_o_idx, next_o_idx = 0; - - /* Scan all objects in the grid */ - for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) - { - object_type *o_ptr; - o_ptr = &floor_ptr->o_list[this_o_idx]; - next_o_idx = o_ptr->next_o_idx; - - /* Hack -- Preserve unknown artifacts */ - if (object_is_fixed_artifact(o_ptr) && (!object_is_known(o_ptr) || in_generate)) - { - /* Mega-Hack -- Preserve the artifact */ - a_info[o_ptr->name1].cur_num = 0; - - if (in_generate && cheat_peek) - { - GAME_TEXT o_name[MAX_NLEN]; - object_desc(caster_ptr, o_name, o_ptr, (OD_NAME_ONLY | OD_STORE)); - msg_format(_("伝説のアイテム (%s) は生成中に*破壊*された。", "Artifact (%s) was *destroyed* during generation."), o_name); - } - } - else if (in_generate && cheat_peek && o_ptr->art_name) - { - msg_print(_("ランダム・アーティファクトの1つは生成中に*破壊*された。", - "One of the random artifacts was *destroyed* during generation.")); - } - } - } - - delete_all_items_from_floor(caster_ptr, y, x); - - /* Destroy "non-permanent" grids */ - if (cave_perma_grid(g_ptr)) continue; - - /* Wall (or floor) type */ - int t = randint0(200); - - if (!in_generate) /* Normal */ - { - if (t < 20) - { - /* Create granite wall */ - cave_set_feat(caster_ptr, y, x, feat_granite); - } - else if (t < 70) - { - /* Create quartz vein */ - cave_set_feat(caster_ptr, y, x, feat_quartz_vein); - } - else if (t < 100) - { - /* Create magma vein */ - cave_set_feat(caster_ptr, y, x, feat_magma_vein); - } - else - { - /* Create floor */ - cave_set_feat(caster_ptr, y, x, feat_ground_type[randint0(100)]); - } - - continue; - } - - if (t < 20) - { - /* Create granite wall */ - place_grid(caster_ptr, g_ptr, GB_EXTRA); - } - else if (t < 70) - { - /* Create quartz vein */ - g_ptr->feat = feat_quartz_vein; - } - else if (t < 100) - { - /* Create magma vein */ - g_ptr->feat = feat_magma_vein; - } - else - { - /* Create floor */ - place_grid(caster_ptr, g_ptr, GB_FLOOR); - } - - /* Clear garbage of hidden trap or door */ - g_ptr->mimic = 0; - } - } - - if (in_generate) return TRUE; - - /* Process "re-glowing" */ - for (POSITION y = (y1 - r); y <= (y1 + r); y++) - { - for (POSITION x = (x1 - r); x <= (x1 + r); x++) - { - if (!in_bounds(floor_ptr, y, x)) continue; - - /* Extract the distance */ - int k = distance(y1, x1, y, x); - - /* Stay in the circle of death */ - if (k > r) continue; - grid_type *g_ptr; - g_ptr = &floor_ptr->grid_array[y][x]; - - if (is_mirror_grid(g_ptr)) - { - g_ptr->info |= CAVE_GLOW; - continue; - } - - if ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS)) continue; - - DIRECTION i; - POSITION yy, xx; - grid_type *cc_ptr; - - for (i = 0; i < 9; i++) - { - yy = y + ddy_ddd[i]; - xx = x + ddx_ddd[i]; - if (!in_bounds2(floor_ptr, yy, xx)) continue; - cc_ptr = &floor_ptr->grid_array[yy][xx]; - if (have_flag(f_info[get_feat_mimic(cc_ptr)].flags, FF_GLOW)) - { - g_ptr->info |= CAVE_GLOW; - break; - } - } - } - } - - /* Hack -- Affect player */ - if (flag) - { - msg_print(_("燃えるような閃光が発生した!", "There is a searing blast of light!")); - - /* Blind the player */ - if (!caster_ptr->resist_blind && !caster_ptr->resist_lite) - { - /* Become blind */ - (void)set_blind(caster_ptr, caster_ptr->blind + 10 + randint1(10)); - } - } - - forget_flow(floor_ptr); - - /* Mega-Hack -- Forget the view and lite */ - caster_ptr->update |= (PU_UN_VIEW | PU_UN_LITE | PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE | PU_MONSTERS); - caster_ptr->redraw |= (PR_MAP); - caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); - - if (caster_ptr->special_defense & NINJA_S_STEALTH) - { - if (floor_ptr->grid_array[caster_ptr->y][caster_ptr->x].info & CAVE_GLOW) set_superstealth(caster_ptr, FALSE); - } - - return TRUE; -} + /* Prevent destruction of quest levels and town */ + floor_type *floor_ptr = caster_ptr->current_floor_ptr; + if ((floor_ptr->inside_quest && is_fixed_quest_idx(floor_ptr->inside_quest)) || !floor_ptr->dun_level) { + return FALSE; + } + + /* Lose monster light */ + if (!in_generate) + clear_mon_lite(floor_ptr); + + /* Big area of affect */ + bool flag = FALSE; + for (POSITION y = (y1 - r); y <= (y1 + r); y++) { + for (POSITION x = (x1 - r); x <= (x1 + r); x++) { + if (!in_bounds(floor_ptr, y, x)) + continue; + + /* Extract the distance */ + int k = distance(y1, x1, y, x); + + /* Stay in the circle of death */ + if (k > r) + continue; + grid_type *g_ptr; + g_ptr = &floor_ptr->grid_array[y][x]; + + /* Lose room and vault */ + g_ptr->info &= ~(CAVE_ROOM | CAVE_ICKY); + + /* Lose light and knowledge */ + g_ptr->info &= ~(CAVE_MARK | CAVE_GLOW | CAVE_KNOWN); + + if (!in_generate) /* Normal */ + { + /* Lose unsafety */ + g_ptr->info &= ~(CAVE_UNSAFE); + + /* Hack -- Notice player affect */ + if (player_bold(caster_ptr, y, x)) { + /* Hurt the player later */ + flag = TRUE; + + /* Do not hurt this grid */ + continue; + } + } + + /* Hack -- Skip the epicenter */ + if ((y == y1) && (x == x1)) + continue; + + if (g_ptr->m_idx) { + monster_type *m_ptr = &floor_ptr->m_list[g_ptr->m_idx]; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + + if (in_generate) /* In generation */ + { + /* Delete the monster (if any) */ + delete_monster(caster_ptr, y, x); + } else if (r_ptr->flags1 & RF1_QUESTOR) { + /* Heal the monster */ + m_ptr->hp = m_ptr->maxhp; + + /* Try to teleport away quest monsters */ + if (!teleport_away(caster_ptr, g_ptr->m_idx, (r * 2) + 1, TELEPORT_DEC_VALOUR)) + continue; + } else { + if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname) { + GAME_TEXT m_name[MAX_NLEN]; + + monster_desc(caster_ptr, m_name, m_ptr, MD_INDEF_VISIBLE); + exe_write_diary(caster_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_DESTROY, m_name); + } + + /* Delete the monster (if any) */ + delete_monster(caster_ptr, y, x); + } + } + + /* During generation, destroyed artifacts are "preserved" */ + if (preserve_mode || in_generate) { + OBJECT_IDX this_o_idx, next_o_idx = 0; + + /* Scan all objects in the grid */ + for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) { + object_type *o_ptr; + o_ptr = &floor_ptr->o_list[this_o_idx]; + next_o_idx = o_ptr->next_o_idx; + + /* Hack -- Preserve unknown artifacts */ + if (object_is_fixed_artifact(o_ptr) && (!object_is_known(o_ptr) || in_generate)) { + /* Mega-Hack -- Preserve the artifact */ + a_info[o_ptr->name1].cur_num = 0; + + if (in_generate && cheat_peek) { + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(caster_ptr, o_name, o_ptr, (OD_NAME_ONLY | OD_STORE)); + msg_format(_("伝説のアイテム (%s) は生成中に*破壊*された。", "Artifact (%s) was *destroyed* during generation."), o_name); + } + } else if (in_generate && cheat_peek && o_ptr->art_name) { + msg_print( + _("ランダム・アーティファクトの1つは生成中に*破壊*された。", "One of the random artifacts was *destroyed* during generation.")); + } + } + } + + delete_all_items_from_floor(caster_ptr, y, x); + + /* Destroy "non-permanent" grids */ + if (cave_perma_grid(g_ptr)) + continue; + + /* Wall (or floor) type */ + int t = randint0(200); + + if (!in_generate) /* Normal */ + { + if (t < 20) { + /* Create granite wall */ + cave_set_feat(caster_ptr, y, x, feat_granite); + } else if (t < 70) { + /* Create quartz vein */ + cave_set_feat(caster_ptr, y, x, feat_quartz_vein); + } else if (t < 100) { + /* Create magma vein */ + cave_set_feat(caster_ptr, y, x, feat_magma_vein); + } else { + /* Create floor */ + cave_set_feat(caster_ptr, y, x, feat_ground_type[randint0(100)]); + } + + continue; + } + + if (t < 20) { + /* Create granite wall */ + place_grid(caster_ptr, g_ptr, GB_EXTRA); + } else if (t < 70) { + /* Create quartz vein */ + g_ptr->feat = feat_quartz_vein; + } else if (t < 100) { + /* Create magma vein */ + g_ptr->feat = feat_magma_vein; + } else { + /* Create floor */ + place_grid(caster_ptr, g_ptr, GB_FLOOR); + } + + /* Clear garbage of hidden trap or door */ + g_ptr->mimic = 0; + } + } + + if (in_generate) + return TRUE; + /* Process "re-glowing" */ + for (POSITION y = (y1 - r); y <= (y1 + r); y++) { + for (POSITION x = (x1 - r); x <= (x1 + r); x++) { + if (!in_bounds(floor_ptr, y, x)) + continue; + + /* Extract the distance */ + int k = distance(y1, x1, y, x); + + /* Stay in the circle of death */ + if (k > r) + continue; + grid_type *g_ptr; + g_ptr = &floor_ptr->grid_array[y][x]; + + if (is_mirror_grid(g_ptr)) { + g_ptr->info |= CAVE_GLOW; + continue; + } + + if ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS)) + continue; + + DIRECTION i; + POSITION yy, xx; + grid_type *cc_ptr; + + for (i = 0; i < 9; i++) { + yy = y + ddy_ddd[i]; + xx = x + ddx_ddd[i]; + if (!in_bounds2(floor_ptr, yy, xx)) + continue; + cc_ptr = &floor_ptr->grid_array[yy][xx]; + if (have_flag(f_info[get_feat_mimic(cc_ptr)].flags, FF_GLOW)) { + g_ptr->info |= CAVE_GLOW; + break; + } + } + } + } + + /* Hack -- Affect player */ + if (flag) { + msg_print(_("燃えるような閃光が発生した!", "There is a searing blast of light!")); + + /* Blind the player */ + if (!caster_ptr->resist_blind && !caster_ptr->resist_lite) { + /* Become blind */ + (void)set_blind(caster_ptr, caster_ptr->blind + 10 + randint1(10)); + } + } + + forget_flow(floor_ptr); + + /* Mega-Hack -- Forget the view and lite */ + caster_ptr->update |= (PU_UN_VIEW | PU_UN_LITE | PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE | PU_MONSTERS); + caster_ptr->redraw |= (PR_MAP); + caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); + + if (caster_ptr->special_defense & NINJA_S_STEALTH) { + if (floor_ptr->grid_array[caster_ptr->y][caster_ptr->x].info & CAVE_GLOW) + set_superstealth(caster_ptr, FALSE); + } + + return TRUE; +} /*! * @brief カオス魔法「流星群」の処理としてプレイヤーを中心に隕石落下処理を10+1d10回繰り返す。 diff --git a/src/spell-kind/spells-perception.c b/src/spell-kind/spells-perception.c index c664ed1f7..7e5c74b12 100644 --- a/src/spell-kind/spells-perception.c +++ b/src/spell-kind/spells-perception.c @@ -3,6 +3,7 @@ #include "core/player-update-types.h" #include "core/stuff-handler.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "game-option/auto-destruction-options.h" @@ -15,9 +16,8 @@ #include "object-hook/hook-enchant.h" #include "object-hook/hook-perception.h" #include "object-hook/hook-weapon.h" -#include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "object/item-tester-hooker.h" +#include "object/item-use-flags.h" #include "object/object-info.h" #include "object/object-mark-types.h" #include "perception/identification.h" @@ -56,7 +56,7 @@ void identify_pack(player_type *target_ptr) bool identify_item(player_type *owner_ptr, object_type *o_ptr) { GAME_TEXT o_name[MAX_NLEN]; - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); bool old_known = FALSE; if (o_ptr->ident & IDENT_KNOWN) @@ -77,7 +77,7 @@ bool identify_item(player_type *owner_ptr, object_type *o_ptr) strcpy(record_o_name, o_name); record_turn = current_world_ptr->game_turn; - object_desc(owner_ptr, o_name, o_ptr, OD_NAME_ONLY); + describe_flavor(owner_ptr, o_name, o_ptr, OD_NAME_ONLY); if (record_fix_art && !old_known && object_is_fixed_artifact(o_ptr)) exe_write_diary(owner_ptr, DIARY_ART, 0, o_name); @@ -126,7 +126,7 @@ bool ident_spell(player_type *caster_ptr, bool only_equip, tval_type item_tester bool old_known = identify_item(caster_ptr, o_ptr); GAME_TEXT o_name[MAX_NLEN]; - object_desc(caster_ptr, o_name, o_ptr, 0); + describe_flavor(caster_ptr, o_name, o_ptr, 0); if (item >= INVEN_RARM) { msg_format(_("%^s: %s(%c)。", "%^s: %s (%c)."), describe_use(caster_ptr, item), o_name, index_to_label(item)); } else if (item >= 0) { @@ -182,7 +182,7 @@ bool identify_fully(player_type *caster_ptr, bool only_equip, tval_type item_tes handle_stuff(caster_ptr); GAME_TEXT o_name[MAX_NLEN]; - object_desc(caster_ptr, o_name, o_ptr, 0); + describe_flavor(caster_ptr, o_name, o_ptr, 0); if (item >= INVEN_RARM) { msg_format(_("%^s: %s(%c)。", "%^s: %s (%c)."), describe_use(caster_ptr, item), o_name, index_to_label(item)); } else if (item >= 0) { diff --git a/src/spell-realm/spells-sorcery.c b/src/spell-realm/spells-sorcery.c index 159d825de..b12fabb67 100644 --- a/src/spell-realm/spells-sorcery.c +++ b/src/spell-realm/spells-sorcery.c @@ -2,13 +2,13 @@ #include "core/asking-player.h" #include "core/player-redraw-types.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "floor/floor-object.h" #include "game-option/input-options.h" #include "inventory/inventory-object.h" #include "io/input-key-requester.h" #include "object-hook/hook-expendable.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "object/object-value.h" #include "system/object-type-definition.h" #include "view/display-messages.h" @@ -43,7 +43,7 @@ bool alchemy(player_type *caster_ptr) ITEM_NUMBER old_number = o_ptr->number; o_ptr->number = amt; GAME_TEXT o_name[MAX_NLEN]; - object_desc(caster_ptr, o_name, o_ptr, 0); + describe_flavor(caster_ptr, o_name, o_ptr, 0); o_ptr->number = old_number; if (!force) { diff --git a/src/spell/spells-object.c b/src/spell/spells-object.c index 17148ea97..6ccbbd22f 100644 --- a/src/spell/spells-object.c +++ b/src/spell/spells-object.c @@ -12,6 +12,7 @@ #include "core/player-redraw-types.h" #include "core/player-update-types.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "floor/floor.h" @@ -41,11 +42,10 @@ #include "object-hook/hook-enchant.h" #include "object-hook/hook-magic.h" #include "object-hook/hook-weapon.h" +#include "object/item-tester-hooker.h" #include "object/item-use-flags.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "object/object-generator.h" -#include "object/item-tester-hooker.h" #include "object/object-kind-hook.h" #include "object/object-kind.h" #include "perception/object-perception.h" @@ -66,58 +66,39 @@ #include "util/bit-flags-calculator.h" #include "view/display-messages.h" -typedef struct -{ - tval_type tval; - OBJECT_SUBTYPE_VALUE sval; - PERCENTAGE prob; - byte flag; +typedef struct { + tval_type tval; + OBJECT_SUBTYPE_VALUE sval; + PERCENTAGE prob; + byte flag; } amuse_type; - /*! * @brief 装備強化処理の失敗率定数(千分率) / * Used by the "enchant" function (chance of failure) * (modified for Zangband, we need better stuff there...) -- TY * @return なし */ -static int enchant_table[16] = -{ - 0, 10, 50, 100, 200, - 300, 400, 500, 650, 800, - 950, 987, 993, 995, 998, - 1000 -}; - +static int enchant_table[16] = { 0, 10, 50, 100, 200, 300, 400, 500, 650, 800, 950, 987, 993, 995, 998, 1000 }; /* * Scatter some "amusing" objects near the player */ -#define AMS_NOTHING 0x00 /* No restriction */ +#define AMS_NOTHING 0x00 /* No restriction */ #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */ #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */ -#define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */ -#define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */ +#define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */ +#define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */ -static amuse_type amuse_info[] = -{ - { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING }, - { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE }, - { TV_SPIKE, SV_ANY, 10, AMS_PILE }, - { TV_STATUE, SV_ANY, 15, AMS_NOTHING }, - { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE }, - { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE }, - { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE }, - { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING }, - { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo - { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician - { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING }, - { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING }, - { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING }, - - { 0, 0, 0, 0 } -}; +static amuse_type amuse_info[] + = { { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING }, { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE }, { TV_SPIKE, SV_ANY, 10, AMS_PILE }, { TV_STATUE, SV_ANY, 15, AMS_NOTHING }, + { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE }, { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE }, { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE }, + { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING }, { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, // Fishing Pole of Taikobo + { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, // Broken Dagger of Magician + { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING }, { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING }, { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING }, + + { 0, 0, 0, 0 } }; /*! * @brief「弾/矢の製造」処理 / do_cmd_cast calls this function if the player's class is 'archer'. @@ -126,176 +107,173 @@ static amuse_type amuse_info[] = */ bool create_ammo(player_type *creature_ptr) { - char com[80]; - if (creature_ptr->lev >= 20) - sprintf(com, _("[S]å¼¾, [A]矢, [B]クロスボウの矢 :", "Create [S]hots, Create [A]rrow or Create [B]olt ?")); - else if (creature_ptr->lev >= 10) - sprintf(com, _("[S]å¼¾, [A]矢:", "Create [S]hots or Create [A]rrow ?")); - else - sprintf(com, _("[S]å¼¾:", "Create [S]hots ?")); - - if (cmd_limit_confused(creature_ptr)) return FALSE; - if (cmd_limit_blind(creature_ptr)) return FALSE; - - int ext = 0; - char ch; - while (TRUE) - { - if (!get_com(com, &ch, TRUE)) - { - return FALSE; - } - - if (ch == 'S' || ch == 's') - { - ext = 1; - break; - } - - if ((ch == 'A' || ch == 'a') && (creature_ptr->lev >= 10)) - { - ext = 2; - break; - } - - if ((ch == 'B' || ch == 'b') && (creature_ptr->lev >= 20)) - { - ext = 3; - break; - } - } - - GAME_TEXT o_name[MAX_NLEN]; - object_type forge; - object_type *q_ptr; - q_ptr = &forge; - - /**********Create shots*********/ - if (ext == 1) - { - POSITION x, y; - DIRECTION dir; - grid_type *g_ptr; - - if (!get_rep_dir(creature_ptr, &dir, FALSE)) return FALSE; - y = creature_ptr->y + ddy[dir]; - x = creature_ptr->x + ddx[dir]; - g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x]; - - if (!have_flag(f_info[get_feat_mimic(g_ptr)].flags, FF_CAN_DIG)) - { - msg_print(_("そこには岩石がない。", "You need a pile of rubble.")); - return FALSE; - } - - if (!cave_have_flag_grid(g_ptr, FF_CAN_DIG) || !cave_have_flag_grid(g_ptr, FF_HURT_ROCK)) - { - msg_print(_("硬すぎて崩せなかった。", "You failed to make ammo.")); - return TRUE; - } - - s16b slot; - q_ptr = &forge; - - /* Hack -- Give the player some small firestones */ - object_prep(creature_ptr, q_ptr, lookup_kind(TV_SHOT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, creature_ptr->lev) + 1)); - q_ptr->number = (byte)rand_range(15, 30); - object_aware(creature_ptr, q_ptr); - object_known(q_ptr); - apply_magic(creature_ptr, q_ptr, creature_ptr->lev, AM_NO_FIXED_ART); - q_ptr->discount = 99; - - slot = store_item_to_inventory(creature_ptr, q_ptr); - - object_desc(creature_ptr, o_name, q_ptr, 0); - msg_format(_("%sを作った。", "You make some ammo."), o_name); - - /* Auto-inscription */ - if (slot >= 0) autopick_alter_item(creature_ptr, slot, FALSE); - - /* Destroy the wall */ - cave_alter_feat(creature_ptr, y, x, FF_HURT_ROCK); - - creature_ptr->update |= (PU_FLOW); - return TRUE; - } - - /**********Create arrows*********/ - if (ext == 2) - { - OBJECT_IDX item; - concptr q, s; - s16b slot; - - item_tester_hook = item_tester_hook_convertible; - - q = _("どのアイテムから作りますか? ", "Convert which item? "); - s = _("材料を持っていない。", "You have no item to convert."); - q_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0); - if (!q_ptr) return FALSE; - - q_ptr = &forge; - - /* Hack -- Give the player some small firestones */ - object_prep(creature_ptr, q_ptr, lookup_kind(TV_ARROW, (OBJECT_SUBTYPE_VALUE)m_bonus(1, creature_ptr->lev) + 1)); - q_ptr->number = (byte)rand_range(5, 10); - object_aware(creature_ptr, q_ptr); - object_known(q_ptr); - apply_magic(creature_ptr, q_ptr, creature_ptr->lev, AM_NO_FIXED_ART); - - q_ptr->discount = 99; - - object_desc(creature_ptr, o_name, q_ptr, 0); - msg_format(_("%sを作った。", "You make some ammo."), o_name); - - vary_item(creature_ptr, item, -1); - slot = store_item_to_inventory(creature_ptr, q_ptr); - - /* Auto-inscription */ - if (slot >= 0) autopick_alter_item(creature_ptr, slot, FALSE); - return TRUE; - } - - /**********Create bolts*********/ - if (ext == 3) - { - OBJECT_IDX item; - concptr q, s; - s16b slot; - - item_tester_hook = item_tester_hook_convertible; - - q = _("どのアイテムから作りますか? ", "Convert which item? "); - s = _("材料を持っていない。", "You have no item to convert."); - - q_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0); - if (!q_ptr) return FALSE; - - q_ptr = &forge; - - /* Hack -- Give the player some small firestones */ - object_prep(creature_ptr, q_ptr, lookup_kind(TV_BOLT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, creature_ptr->lev) + 1)); - q_ptr->number = (byte)rand_range(4, 8); - object_aware(creature_ptr, q_ptr); - object_known(q_ptr); - apply_magic(creature_ptr, q_ptr, creature_ptr->lev, AM_NO_FIXED_ART); + char com[80]; + if (creature_ptr->lev >= 20) + sprintf(com, _("[S]å¼¾, [A]矢, [B]クロスボウの矢 :", "Create [S]hots, Create [A]rrow or Create [B]olt ?")); + else if (creature_ptr->lev >= 10) + sprintf(com, _("[S]å¼¾, [A]矢:", "Create [S]hots or Create [A]rrow ?")); + else + sprintf(com, _("[S]å¼¾:", "Create [S]hots ?")); + + if (cmd_limit_confused(creature_ptr)) + return FALSE; + if (cmd_limit_blind(creature_ptr)) + return FALSE; + + int ext = 0; + char ch; + while (TRUE) { + if (!get_com(com, &ch, TRUE)) { + return FALSE; + } + + if (ch == 'S' || ch == 's') { + ext = 1; + break; + } + + if ((ch == 'A' || ch == 'a') && (creature_ptr->lev >= 10)) { + ext = 2; + break; + } + + if ((ch == 'B' || ch == 'b') && (creature_ptr->lev >= 20)) { + ext = 3; + break; + } + } + + GAME_TEXT o_name[MAX_NLEN]; + object_type forge; + object_type *q_ptr; + q_ptr = &forge; + + /**********Create shots*********/ + if (ext == 1) { + POSITION x, y; + DIRECTION dir; + grid_type *g_ptr; + + if (!get_rep_dir(creature_ptr, &dir, FALSE)) + return FALSE; + y = creature_ptr->y + ddy[dir]; + x = creature_ptr->x + ddx[dir]; + g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x]; + + if (!have_flag(f_info[get_feat_mimic(g_ptr)].flags, FF_CAN_DIG)) { + msg_print(_("そこには岩石がない。", "You need a pile of rubble.")); + return FALSE; + } + + if (!cave_have_flag_grid(g_ptr, FF_CAN_DIG) || !cave_have_flag_grid(g_ptr, FF_HURT_ROCK)) { + msg_print(_("硬すぎて崩せなかった。", "You failed to make ammo.")); + return TRUE; + } + + s16b slot; + q_ptr = &forge; + + /* Hack -- Give the player some small firestones */ + object_prep(creature_ptr, q_ptr, lookup_kind(TV_SHOT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, creature_ptr->lev) + 1)); + q_ptr->number = (byte)rand_range(15, 30); + object_aware(creature_ptr, q_ptr); + object_known(q_ptr); + apply_magic(creature_ptr, q_ptr, creature_ptr->lev, AM_NO_FIXED_ART); + q_ptr->discount = 99; + + slot = store_item_to_inventory(creature_ptr, q_ptr); + + describe_flavor(creature_ptr, o_name, q_ptr, 0); + msg_format(_("%sを作った。", "You make some ammo."), o_name); + + /* Auto-inscription */ + if (slot >= 0) + autopick_alter_item(creature_ptr, slot, FALSE); + + /* Destroy the wall */ + cave_alter_feat(creature_ptr, y, x, FF_HURT_ROCK); + + creature_ptr->update |= (PU_FLOW); + return TRUE; + } + + /**********Create arrows*********/ + if (ext == 2) { + OBJECT_IDX item; + concptr q, s; + s16b slot; + + item_tester_hook = item_tester_hook_convertible; + + q = _("どのアイテムから作りますか? ", "Convert which item? "); + s = _("材料を持っていない。", "You have no item to convert."); + q_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0); + if (!q_ptr) + return FALSE; + + q_ptr = &forge; + + /* Hack -- Give the player some small firestones */ + object_prep(creature_ptr, q_ptr, lookup_kind(TV_ARROW, (OBJECT_SUBTYPE_VALUE)m_bonus(1, creature_ptr->lev) + 1)); + q_ptr->number = (byte)rand_range(5, 10); + object_aware(creature_ptr, q_ptr); + object_known(q_ptr); + apply_magic(creature_ptr, q_ptr, creature_ptr->lev, AM_NO_FIXED_ART); + + q_ptr->discount = 99; + + describe_flavor(creature_ptr, o_name, q_ptr, 0); + msg_format(_("%sを作った。", "You make some ammo."), o_name); + + vary_item(creature_ptr, item, -1); + slot = store_item_to_inventory(creature_ptr, q_ptr); + + /* Auto-inscription */ + if (slot >= 0) + autopick_alter_item(creature_ptr, slot, FALSE); + return TRUE; + } + + /**********Create bolts*********/ + if (ext == 3) { + OBJECT_IDX item; + concptr q, s; + s16b slot; - q_ptr->discount = 99; + item_tester_hook = item_tester_hook_convertible; - object_desc(creature_ptr, o_name, q_ptr, 0); - msg_format(_("%sを作った。", "You make some ammo."), o_name); + q = _("どのアイテムから作りますか? ", "Convert which item? "); + s = _("材料を持っていない。", "You have no item to convert."); - vary_item(creature_ptr, item, -1); + q_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0); + if (!q_ptr) + return FALSE; - slot = store_item_to_inventory(creature_ptr, q_ptr); + q_ptr = &forge; - /* Auto-inscription */ - if (slot >= 0) autopick_alter_item(creature_ptr, slot, FALSE); - } + /* Hack -- Give the player some small firestones */ + object_prep(creature_ptr, q_ptr, lookup_kind(TV_BOLT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, creature_ptr->lev) + 1)); + q_ptr->number = (byte)rand_range(4, 8); + object_aware(creature_ptr, q_ptr); + object_known(q_ptr); + apply_magic(creature_ptr, q_ptr, creature_ptr->lev, AM_NO_FIXED_ART); - return TRUE; -} + q_ptr->discount = 99; + + describe_flavor(creature_ptr, o_name, q_ptr, 0); + msg_format(_("%sを作った。", "You make some ammo."), o_name); + + vary_item(creature_ptr, item, -1); + + slot = store_item_to_inventory(creature_ptr, q_ptr); + /* Auto-inscription */ + if (slot >= 0) + autopick_alter_item(creature_ptr, slot, FALSE); + } + + return TRUE; +} /*! * @brief 魔道具術師の魔力取り込み処理 @@ -304,79 +282,78 @@ bool create_ammo(player_type *creature_ptr) */ bool import_magic_device(player_type *user_ptr) { - /* Only accept legal items */ - item_tester_hook = item_tester_hook_recharge; - - concptr q = _("どのアイテムの魔力を取り込みますか? ", "Gain power of which item? "); - concptr s = _("魔力を取り込めるアイテムがない。", "You have nothing to gain power."); - - OBJECT_IDX item; - object_type *o_ptr; - o_ptr = choose_object(user_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0); - if (!o_ptr) return FALSE; - - if (o_ptr->tval == TV_STAFF && o_ptr->sval == SV_STAFF_NOTHING) - { - msg_print(_("この杖には発動の為の能力は何も備わっていないようだ。", "This staff doesn't have any magical ability.")); - return FALSE; - } - - if (!object_is_known(o_ptr)) - { - msg_print(_("鑑定されていないと取り込めない。", "You need to identify before absorbing.")); - return FALSE; - } - - if (o_ptr->timeout) - { - msg_print(_("充填中のアイテムは取り込めない。", "This item is still charging.")); - return FALSE; - } - - PARAMETER_VALUE pval = o_ptr->pval; - int ext = 0; - if (o_ptr->tval == TV_ROD) - ext = 72; - else if (o_ptr->tval == TV_WAND) - ext = 36; - - if (o_ptr->tval == TV_ROD) - { - user_ptr->magic_num2[o_ptr->sval + ext] += (MAGIC_NUM2)o_ptr->number; - if (user_ptr->magic_num2[o_ptr->sval + ext] > 99) user_ptr->magic_num2[o_ptr->sval + ext] = 99; - } - else - { - int num; - for (num = o_ptr->number; num; num--) - { - int gain_num = pval; - if (o_ptr->tval == TV_WAND) gain_num = (pval + num - 1) / num; - if (user_ptr->magic_num2[o_ptr->sval + ext]) - { - gain_num *= 256; - gain_num = (gain_num / 3 + randint0(gain_num / 3)) / 256; - if (gain_num < 1) gain_num = 1; - } - user_ptr->magic_num2[o_ptr->sval + ext] += (MAGIC_NUM2)gain_num; - if (user_ptr->magic_num2[o_ptr->sval + ext] > 99) user_ptr->magic_num2[o_ptr->sval + ext] = 99; - user_ptr->magic_num1[o_ptr->sval + ext] += pval * 0x10000; - if (user_ptr->magic_num1[o_ptr->sval + ext] > 99 * 0x10000) user_ptr->magic_num1[o_ptr->sval + ext] = 99 * 0x10000; - if (user_ptr->magic_num1[o_ptr->sval + ext] > user_ptr->magic_num2[o_ptr->sval + ext] * 0x10000) user_ptr->magic_num1[o_ptr->sval + ext] = user_ptr->magic_num2[o_ptr->sval + ext] * 0x10000; - if (o_ptr->tval == TV_WAND) pval -= (pval + num - 1) / num; - } - } - - GAME_TEXT o_name[MAX_NLEN]; - object_desc(user_ptr, o_name, o_ptr, 0); - msg_format(_("%sの魔力を取り込んだ。", "You absorb magic of %s."), o_name); - - vary_item(user_ptr, item, -999); - take_turn(user_ptr, 100); - return TRUE; + /* Only accept legal items */ + item_tester_hook = item_tester_hook_recharge; + + concptr q = _("どのアイテムの魔力を取り込みますか? ", "Gain power of which item? "); + concptr s = _("魔力を取り込めるアイテムがない。", "You have nothing to gain power."); + + OBJECT_IDX item; + object_type *o_ptr; + o_ptr = choose_object(user_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0); + if (!o_ptr) + return FALSE; + + if (o_ptr->tval == TV_STAFF && o_ptr->sval == SV_STAFF_NOTHING) { + msg_print(_("この杖には発動の為の能力は何も備わっていないようだ。", "This staff doesn't have any magical ability.")); + return FALSE; + } + + if (!object_is_known(o_ptr)) { + msg_print(_("鑑定されていないと取り込めない。", "You need to identify before absorbing.")); + return FALSE; + } + + if (o_ptr->timeout) { + msg_print(_("充填中のアイテムは取り込めない。", "This item is still charging.")); + return FALSE; + } + + PARAMETER_VALUE pval = o_ptr->pval; + int ext = 0; + if (o_ptr->tval == TV_ROD) + ext = 72; + else if (o_ptr->tval == TV_WAND) + ext = 36; + + if (o_ptr->tval == TV_ROD) { + user_ptr->magic_num2[o_ptr->sval + ext] += (MAGIC_NUM2)o_ptr->number; + if (user_ptr->magic_num2[o_ptr->sval + ext] > 99) + user_ptr->magic_num2[o_ptr->sval + ext] = 99; + } else { + int num; + for (num = o_ptr->number; num; num--) { + int gain_num = pval; + if (o_ptr->tval == TV_WAND) + gain_num = (pval + num - 1) / num; + if (user_ptr->magic_num2[o_ptr->sval + ext]) { + gain_num *= 256; + gain_num = (gain_num / 3 + randint0(gain_num / 3)) / 256; + if (gain_num < 1) + gain_num = 1; + } + user_ptr->magic_num2[o_ptr->sval + ext] += (MAGIC_NUM2)gain_num; + if (user_ptr->magic_num2[o_ptr->sval + ext] > 99) + user_ptr->magic_num2[o_ptr->sval + ext] = 99; + user_ptr->magic_num1[o_ptr->sval + ext] += pval * 0x10000; + if (user_ptr->magic_num1[o_ptr->sval + ext] > 99 * 0x10000) + user_ptr->magic_num1[o_ptr->sval + ext] = 99 * 0x10000; + if (user_ptr->magic_num1[o_ptr->sval + ext] > user_ptr->magic_num2[o_ptr->sval + ext] * 0x10000) + user_ptr->magic_num1[o_ptr->sval + ext] = user_ptr->magic_num2[o_ptr->sval + ext] * 0x10000; + if (o_ptr->tval == TV_WAND) + pval -= (pval + num - 1) / num; + } + } + + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(user_ptr, o_name, o_ptr, 0); + msg_format(_("%sの魔力を取り込んだ。", "You absorb magic of %s."), o_name); + + vary_item(user_ptr, item, -999); + take_turn(user_ptr, 100); + return TRUE; } - /*! * @brief 誰得ドロップを行う。 * @param creature_ptr プレーヤーへの参照ポインタ @@ -388,82 +365,86 @@ bool import_magic_device(player_type *user_ptr) */ void amusement(player_type *creature_ptr, POSITION y1, POSITION x1, int num, bool known) { - int t = 0; - for (int n = 0; amuse_info[n].tval != 0; n++) - { - t += amuse_info[n].prob; - } - - /* Acquirement */ - object_type *i_ptr; - object_type object_type_body; - while (num) - { - int i; - KIND_OBJECT_IDX k_idx; - ARTIFACT_IDX a_idx = 0; - int r = randint0(t); - bool insta_art, fixed_art; - - for (i = 0; ; i++) - { - r -= amuse_info[i].prob; - if (r <= 0) break; - } - i_ptr = &object_type_body; - object_wipe(i_ptr); - k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval); - - /* Paranoia - reroll if nothing */ - if (!k_idx) continue; - - /* Search an artifact index if need */ - insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART); - fixed_art = (amuse_info[i].flag & AMS_FIXED_ART); - - if (insta_art || fixed_art) - { - for (a_idx = 1; a_idx < max_a_idx; a_idx++) - { - if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue; - if (a_info[a_idx].tval != k_info[k_idx].tval) continue; - if (a_info[a_idx].sval != k_info[k_idx].sval) continue; - if (a_info[a_idx].cur_num > 0) continue; - break; - } - - if (a_idx >= max_a_idx) continue; - } - - /* Make an object (if possible) */ - object_prep(creature_ptr, i_ptr, k_idx); - if (a_idx) i_ptr->name1 = a_idx; - apply_magic(creature_ptr, i_ptr, 1, AM_NO_FIXED_ART); - - if (amuse_info[i].flag & AMS_NO_UNIQUE) - { - if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue; - } - - if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3); - if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99); - - if (known) - { - object_aware(creature_ptr, i_ptr); - object_known(i_ptr); - } - - /* Paranoia - reroll if nothing */ - if (!(i_ptr->k_idx)) continue; - - (void)drop_near(creature_ptr, i_ptr, -1, y1, x1); - - num--; - } + int t = 0; + for (int n = 0; amuse_info[n].tval != 0; n++) { + t += amuse_info[n].prob; + } + + /* Acquirement */ + object_type *i_ptr; + object_type object_type_body; + while (num) { + int i; + KIND_OBJECT_IDX k_idx; + ARTIFACT_IDX a_idx = 0; + int r = randint0(t); + bool insta_art, fixed_art; + + for (i = 0;; i++) { + r -= amuse_info[i].prob; + if (r <= 0) + break; + } + i_ptr = &object_type_body; + object_wipe(i_ptr); + k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval); + + /* Paranoia - reroll if nothing */ + if (!k_idx) + continue; + + /* Search an artifact index if need */ + insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART); + fixed_art = (amuse_info[i].flag & AMS_FIXED_ART); + + if (insta_art || fixed_art) { + for (a_idx = 1; a_idx < max_a_idx; a_idx++) { + if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) + continue; + if (a_info[a_idx].tval != k_info[k_idx].tval) + continue; + if (a_info[a_idx].sval != k_info[k_idx].sval) + continue; + if (a_info[a_idx].cur_num > 0) + continue; + break; + } + + if (a_idx >= max_a_idx) + continue; + } + + /* Make an object (if possible) */ + object_prep(creature_ptr, i_ptr, k_idx); + if (a_idx) + i_ptr->name1 = a_idx; + apply_magic(creature_ptr, i_ptr, 1, AM_NO_FIXED_ART); + + if (amuse_info[i].flag & AMS_NO_UNIQUE) { + if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) + continue; + } + + if (amuse_info[i].flag & AMS_MULTIPLE) + i_ptr->number = randint1(3); + if (amuse_info[i].flag & AMS_PILE) + i_ptr->number = randint1(99); + + if (known) { + object_aware(creature_ptr, i_ptr); + object_known(i_ptr); + } + + /* Paranoia - reroll if nothing */ + if (!(i_ptr->k_idx)) + continue; + + (void)drop_near(creature_ptr, i_ptr, -1, y1, x1); + + num--; + } } - /*! * @brief 獲得ドロップを行う。 * Scatter some "great" objects near the player @@ -478,191 +459,196 @@ void amusement(player_type *creature_ptr, POSITION y1, POSITION x1, int num, boo */ void acquirement(player_type *caster_ptr, POSITION y1, POSITION x1, int num, bool great, bool special, bool known) { - object_type *i_ptr; - object_type object_type_body; - BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L); - - /* Acquirement */ - while (num--) - { - i_ptr = &object_type_body; - object_wipe(i_ptr); - - /* Make a good (or great) object (if possible) */ - if (!make_object(caster_ptr, i_ptr, mode)) continue; - - if (known) - { - object_aware(caster_ptr, i_ptr); - object_known(i_ptr); - } - - (void)drop_near(caster_ptr, i_ptr, -1, y1, x1); - } + object_type *i_ptr; + object_type object_type_body; + BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L); + + /* Acquirement */ + while (num--) { + i_ptr = &object_type_body; + object_wipe(i_ptr); + + /* Make a good (or great) object (if possible) */ + if (!make_object(caster_ptr, i_ptr, mode)) + continue; + + if (known) { + object_aware(caster_ptr, i_ptr); + object_known(i_ptr); + } + + (void)drop_near(caster_ptr, i_ptr, -1, y1, x1); + } } - void acquire_chaos_weapon(player_type *creature_ptr) { - object_type forge; - object_type *q_ptr = &forge; - tval_type dummy = TV_SWORD; - OBJECT_SUBTYPE_VALUE dummy2; - switch (randint1(creature_ptr->lev)) - { - case 0: case 1: - dummy2 = SV_DAGGER; - break; - case 2: case 3: - dummy2 = SV_MAIN_GAUCHE; - break; - case 4: - dummy2 = SV_TANTO; - break; - case 5: case 6: - dummy2 = SV_RAPIER; - break; - case 7: case 8: - dummy2 = SV_SMALL_SWORD; - break; - case 9: case 10: - dummy2 = SV_BASILLARD; - break; - case 11: case 12: case 13: - dummy2 = SV_SHORT_SWORD; - break; - case 14: case 15: - dummy2 = SV_SABRE; - break; - case 16: case 17: - dummy2 = SV_CUTLASS; - break; - case 18: - dummy2 = SV_WAKIZASHI; - break; - case 19: - dummy2 = SV_KHOPESH; - break; - case 20: - dummy2 = SV_TULWAR; - break; - case 21: - dummy2 = SV_BROAD_SWORD; - break; - case 22: case 23: - dummy2 = SV_LONG_SWORD; - break; - case 24: case 25: - dummy2 = SV_SCIMITAR; - break; - case 26: - dummy2 = SV_NINJATO; - break; - case 27: - dummy2 = SV_KATANA; - break; - case 28: case 29: - dummy2 = SV_BASTARD_SWORD; - break; - case 30: - dummy2 = SV_GREAT_SCIMITAR; - break; - case 31: - dummy2 = SV_CLAYMORE; - break; - case 32: - dummy2 = SV_ESPADON; - break; - case 33: - dummy2 = SV_TWO_HANDED_SWORD; - break; - case 34: - dummy2 = SV_FLAMBERGE; - break; - case 35: - dummy2 = SV_NO_DACHI; - break; - case 36: - dummy2 = SV_EXECUTIONERS_SWORD; - break; - case 37: - dummy2 = SV_ZWEIHANDER; - break; - case 38: - dummy2 = SV_HAYABUSA; - break; - default: - dummy2 = SV_BLADE_OF_CHAOS; - } - - object_prep(creature_ptr, q_ptr, lookup_kind(dummy, dummy2)); - q_ptr->to_h = 3 + randint1(creature_ptr->current_floor_ptr->dun_level) % 10; - q_ptr->to_d = 3 + randint1(creature_ptr->current_floor_ptr->dun_level) % 10; - one_resistance(q_ptr); - q_ptr->name2 = EGO_CHAOTIC; - (void)drop_near(creature_ptr, q_ptr, -1, creature_ptr->y, creature_ptr->x); + object_type forge; + object_type *q_ptr = &forge; + tval_type dummy = TV_SWORD; + OBJECT_SUBTYPE_VALUE dummy2; + switch (randint1(creature_ptr->lev)) { + case 0: + case 1: + dummy2 = SV_DAGGER; + break; + case 2: + case 3: + dummy2 = SV_MAIN_GAUCHE; + break; + case 4: + dummy2 = SV_TANTO; + break; + case 5: + case 6: + dummy2 = SV_RAPIER; + break; + case 7: + case 8: + dummy2 = SV_SMALL_SWORD; + break; + case 9: + case 10: + dummy2 = SV_BASILLARD; + break; + case 11: + case 12: + case 13: + dummy2 = SV_SHORT_SWORD; + break; + case 14: + case 15: + dummy2 = SV_SABRE; + break; + case 16: + case 17: + dummy2 = SV_CUTLASS; + break; + case 18: + dummy2 = SV_WAKIZASHI; + break; + case 19: + dummy2 = SV_KHOPESH; + break; + case 20: + dummy2 = SV_TULWAR; + break; + case 21: + dummy2 = SV_BROAD_SWORD; + break; + case 22: + case 23: + dummy2 = SV_LONG_SWORD; + break; + case 24: + case 25: + dummy2 = SV_SCIMITAR; + break; + case 26: + dummy2 = SV_NINJATO; + break; + case 27: + dummy2 = SV_KATANA; + break; + case 28: + case 29: + dummy2 = SV_BASTARD_SWORD; + break; + case 30: + dummy2 = SV_GREAT_SCIMITAR; + break; + case 31: + dummy2 = SV_CLAYMORE; + break; + case 32: + dummy2 = SV_ESPADON; + break; + case 33: + dummy2 = SV_TWO_HANDED_SWORD; + break; + case 34: + dummy2 = SV_FLAMBERGE; + break; + case 35: + dummy2 = SV_NO_DACHI; + break; + case 36: + dummy2 = SV_EXECUTIONERS_SWORD; + break; + case 37: + dummy2 = SV_ZWEIHANDER; + break; + case 38: + dummy2 = SV_HAYABUSA; + break; + default: + dummy2 = SV_BLADE_OF_CHAOS; + } + + object_prep(creature_ptr, q_ptr, lookup_kind(dummy, dummy2)); + q_ptr->to_h = 3 + randint1(creature_ptr->current_floor_ptr->dun_level) % 10; + q_ptr->to_d = 3 + randint1(creature_ptr->current_floor_ptr->dun_level) % 10; + one_resistance(q_ptr); + q_ptr->name2 = EGO_CHAOTIC; + (void)drop_near(creature_ptr, q_ptr, -1, creature_ptr->y, creature_ptr->x); } - /*! -* todo 元のreturnは間違っているが、修正後の↓文がどれくらい正しいかは要チェック - * @brief 防具呪縛処理 / + * todo 元のreturnは間違っているが、修正後の↓文がどれくらい正しいかは要チェック + * @brief 防具呪縛処理 / * Curse the players armor * @return 何も持っていない場合を除き、常にTRUEを返す */ bool curse_armor(player_type *owner_ptr) { - /* Curse the body armor */ - object_type *o_ptr; - o_ptr = &owner_ptr->inventory_list[INVEN_BODY]; + /* Curse the body armor */ + object_type *o_ptr; + o_ptr = &owner_ptr->inventory_list[INVEN_BODY]; - if (!o_ptr->k_idx) return FALSE; + if (!o_ptr->k_idx) + return FALSE; - GAME_TEXT o_name[MAX_NLEN]; - object_desc(owner_ptr, o_name, o_ptr, OD_OMIT_PREFIX); + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(owner_ptr, o_name, o_ptr, OD_OMIT_PREFIX); - /* Attempt a saving throw for artifacts */ - if (object_is_artifact(o_ptr) && (randint0(100) < 50)) - { - /* Cool */ + /* Attempt a saving throw for artifacts */ + if (object_is_artifact(o_ptr) && (randint0(100) < 50)) { + /* Cool */ #ifdef JP - msg_format("%sが%sを包み込もうとしたが、%sはそれを跳ね返した!", - "恐怖の暗黒オーラ", "防具", o_name); + msg_format("%sが%sを包み込もうとしたが、%sはそれを跳ね返した!", "恐怖の暗黒オーラ", "防具", o_name); #else - msg_format("A %s tries to %s, but your %s resists the effects!", - "terrible black aura", "surround your armor", o_name); + msg_format("A %s tries to %s, but your %s resists the effects!", "terrible black aura", "surround your armor", o_name); #endif - return TRUE; - } - - /* not artifact or failed save... */ - msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name); - chg_virtue(owner_ptr, V_ENCHANT, -5); - - /* Blast the armor */ - o_ptr->name1 = 0; - o_ptr->name2 = EGO_BLASTED; - o_ptr->to_a = 0 - randint1(5) - randint1(5); - o_ptr->to_h = 0; - o_ptr->to_d = 0; - o_ptr->ac = 0; - o_ptr->dd = 0; - o_ptr->ds = 0; - - for (int i = 0; i < TR_FLAG_SIZE; i++) - o_ptr->art_flags[i] = 0; - - /* Curse it */ - o_ptr->curse_flags = TRC_CURSED; - - /* Break it */ - o_ptr->ident |= (IDENT_BROKEN); - owner_ptr->update |= (PU_BONUS | PU_MANA); - owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); - return TRUE; + return TRUE; + } + + /* not artifact or failed save... */ + msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name); + chg_virtue(owner_ptr, V_ENCHANT, -5); + + /* Blast the armor */ + o_ptr->name1 = 0; + o_ptr->name2 = EGO_BLASTED; + o_ptr->to_a = 0 - randint1(5) - randint1(5); + o_ptr->to_h = 0; + o_ptr->to_d = 0; + o_ptr->ac = 0; + o_ptr->dd = 0; + o_ptr->ds = 0; + + for (int i = 0; i < TR_FLAG_SIZE; i++) + o_ptr->art_flags[i] = 0; + + /* Curse it */ + o_ptr->curse_flags = TRC_CURSED; + + /* Break it */ + o_ptr->ident |= (IDENT_BROKEN); + owner_ptr->update |= (PU_BONUS | PU_MANA); + owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); + return TRUE; } - /*! * todo 元のreturnは間違っているが、修正後の↓文がどれくらい正しいかは要チェック * @brief 武器呪縛処理 / @@ -674,52 +660,50 @@ bool curse_armor(player_type *owner_ptr) */ bool curse_weapon_object(player_type *owner_ptr, bool force, object_type *o_ptr) { - if (!o_ptr->k_idx) return FALSE; + if (!o_ptr->k_idx) + return FALSE; - GAME_TEXT o_name[MAX_NLEN]; - object_desc(owner_ptr, o_name, o_ptr, OD_OMIT_PREFIX); + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(owner_ptr, o_name, o_ptr, OD_OMIT_PREFIX); - /* Attempt a saving throw */ - if (object_is_artifact(o_ptr) && (randint0(100) < 50) && !force) - { + /* Attempt a saving throw */ + if (object_is_artifact(o_ptr) && (randint0(100) < 50) && !force) { #ifdef JP - msg_format("%sが%sを包み込もうとしたが、%sはそれを跳ね返した!", - "恐怖の暗黒オーラ", "武器", o_name); + msg_format("%sが%sを包み込もうとしたが、%sはそれを跳ね返した!", "恐怖の暗黒オーラ", "武器", o_name); #else - msg_format("A %s tries to %s, but your %s resists the effects!", - "terrible black aura", "surround your weapon", o_name); + msg_format("A %s tries to %s, but your %s resists the effects!", "terrible black aura", "surround your weapon", o_name); #endif - return TRUE; - } - - /* not artifact or failed save... */ - if (!force) msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name); - chg_virtue(owner_ptr, V_ENCHANT, -5); - - /* Shatter the weapon */ - o_ptr->name1 = 0; - o_ptr->name2 = EGO_SHATTERED; - o_ptr->to_h = 0 - randint1(5) - randint1(5); - o_ptr->to_d = 0 - randint1(5) - randint1(5); - o_ptr->to_a = 0; - o_ptr->ac = 0; - o_ptr->dd = 0; - o_ptr->ds = 0; - - for (int i = 0; i < TR_FLAG_SIZE; i++) - o_ptr->art_flags[i] = 0; - - /* Curse it */ - o_ptr->curse_flags = TRC_CURSED; - - /* Break it */ - o_ptr->ident |= (IDENT_BROKEN); - owner_ptr->update |= (PU_BONUS | PU_MANA); - owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); - return TRUE; + return TRUE; + } + + /* not artifact or failed save... */ + if (!force) + msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name); + chg_virtue(owner_ptr, V_ENCHANT, -5); + + /* Shatter the weapon */ + o_ptr->name1 = 0; + o_ptr->name2 = EGO_SHATTERED; + o_ptr->to_h = 0 - randint1(5) - randint1(5); + o_ptr->to_d = 0 - randint1(5) - randint1(5); + o_ptr->to_a = 0; + o_ptr->ac = 0; + o_ptr->dd = 0; + o_ptr->ds = 0; + + for (int i = 0; i < TR_FLAG_SIZE; i++) + o_ptr->art_flags[i] = 0; + + /* Curse it */ + o_ptr->curse_flags = TRC_CURSED; + + /* Break it */ + o_ptr->ident |= (IDENT_BROKEN); + owner_ptr->update |= (PU_BONUS | PU_MANA); + owner_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); + return TRUE; } - /*! * @brief 防具の錆止め防止処理 * @param caster_ptr 錆止め実行者の参照ポインタ @@ -727,44 +711,43 @@ bool curse_weapon_object(player_type *owner_ptr, bool force, object_type *o_ptr) */ bool rustproof(player_type *caster_ptr) { - /* Select a piece of armour */ - item_tester_hook = object_is_armour; + /* Select a piece of armour */ + item_tester_hook = object_is_armour; - concptr q = _("どの防具に錆止めをしますか?", "Rustproof which piece of armour? "); - concptr s = _("錆止めできるものがありません。", "You have nothing to rustproof."); + concptr q = _("どの防具に錆止めをしますか?", "Rustproof which piece of armour? "); + concptr s = _("錆止めできるものがありません。", "You have nothing to rustproof."); - OBJECT_IDX item; - object_type *o_ptr; - o_ptr = choose_object(caster_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0); - if (!o_ptr) return FALSE; + OBJECT_IDX item; + object_type *o_ptr; + o_ptr = choose_object(caster_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0); + if (!o_ptr) + return FALSE; - GAME_TEXT o_name[MAX_NLEN]; - object_desc(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - add_flag(o_ptr->art_flags, TR_IGNORE_ACID); + add_flag(o_ptr->art_flags, TR_IGNORE_ACID); - if ((o_ptr->to_a < 0) && !object_is_cursed(o_ptr)) - { + if ((o_ptr->to_a < 0) && !object_is_cursed(o_ptr)) { #ifdef JP - msg_format("%sは新品同様になった!", o_name); + msg_format("%sは新品同様になった!", o_name); #else - msg_format("%s %s look%s as good as new!", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "" : "s")); + msg_format("%s %s look%s as good as new!", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "" : "s")); #endif - o_ptr->to_a = 0; - } + o_ptr->to_a = 0; + } #ifdef JP - msg_format("%sは腐食しなくなった。", o_name); + msg_format("%sは腐食しなくなった。", o_name); #else - msg_format("%s %s %s now protected against corrosion.", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "are" : "is")); + msg_format("%s %s %s now protected against corrosion.", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "are" : "is")); #endif - calc_android_exp(caster_ptr); - return TRUE; + calc_android_exp(caster_ptr); + return TRUE; } - /*! * @brief ボルトのエゴ化処理(火炎エゴのみ) / * Enchant some bolts @@ -773,80 +756,81 @@ bool rustproof(player_type *caster_ptr) */ void brand_bolts(player_type *caster_ptr) { - /* Use the first acceptable bolts */ - for (int i = 0; i < INVEN_PACK; i++) - { - object_type *o_ptr = &caster_ptr->inventory_list[i]; + /* Use the first acceptable bolts */ + for (int i = 0; i < INVEN_PACK; i++) { + object_type *o_ptr = &caster_ptr->inventory_list[i]; - /* Skip non-bolts */ - if (o_ptr->tval != TV_BOLT) continue; + /* Skip non-bolts */ + if (o_ptr->tval != TV_BOLT) + continue; - /* Skip artifacts and ego-items */ - if (object_is_artifact(o_ptr) || object_is_ego(o_ptr)) - continue; + /* Skip artifacts and ego-items */ + if (object_is_artifact(o_ptr) || object_is_ego(o_ptr)) + continue; - /* Skip cursed/broken items */ - if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) continue; + /* Skip cursed/broken items */ + if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) + continue; - /* Randomize */ - if (randint0(100) < 75) continue; + /* Randomize */ + if (randint0(100) < 75) + continue; - msg_print(_("クロスボウの矢が炎のオーラに包まれた!", "Your bolts are covered in a fiery aura!")); + msg_print(_("クロスボウの矢が炎のオーラに包まれた!", "Your bolts are covered in a fiery aura!")); - /* Ego-item */ - o_ptr->name2 = EGO_FLAME; - enchant(caster_ptr, o_ptr, randint0(3) + 4, ENCH_TOHIT | ENCH_TODAM); - return; - } + /* Ego-item */ + o_ptr->name2 = EGO_FLAME; + enchant(caster_ptr, o_ptr, randint0(3) + 4, ENCH_TOHIT | ENCH_TODAM); + return; + } - if (flush_failure) flush(); - msg_print(_("炎で強化するのに失敗した。", "The fiery enchantment failed.")); + if (flush_failure) + flush(); + msg_print(_("炎で強化するのに失敗した。", "The fiery enchantment failed.")); } - bool perilous_secrets(player_type *user_ptr) { - if (!ident_spell(user_ptr, FALSE, 0)) return FALSE; - - if (mp_ptr->spell_book) - { - /* Sufficient mana */ - if (20 <= user_ptr->csp) - { - /* Use some mana */ - user_ptr->csp -= 20; - } - - /* Over-exert the player */ - else - { - int oops = 20 - user_ptr->csp; - - /* No mana left */ - user_ptr->csp = 0; - user_ptr->csp_frac = 0; - - msg_print(_("石を制御できない!", "You are too weak to control the stone!")); - /* Hack -- Bypass free action */ - (void)set_paralyzed(user_ptr, user_ptr->paralyzed + randint1(5 * oops + 1)); - - /* Confusing. */ - (void)set_confused(user_ptr, user_ptr->confused + randint1(5 * oops + 1)); - } - - user_ptr->redraw |= (PR_MANA); - } - - take_hit(user_ptr, DAMAGE_LOSELIFE, damroll(1, 12), _("危険な秘密", "perilous secrets"), -1); - /* Confusing. */ - if (one_in_(5)) (void)set_confused(user_ptr, user_ptr->confused + randint1(10)); - - /* Exercise a little care... */ - if (one_in_(20)) take_hit(user_ptr, DAMAGE_LOSELIFE, damroll(4, 10), _("危険な秘密", "perilous secrets"), -1); - return TRUE; + if (!ident_spell(user_ptr, FALSE, 0)) + return FALSE; + + if (mp_ptr->spell_book) { + /* Sufficient mana */ + if (20 <= user_ptr->csp) { + /* Use some mana */ + user_ptr->csp -= 20; + } + + /* Over-exert the player */ + else { + int oops = 20 - user_ptr->csp; + + /* No mana left */ + user_ptr->csp = 0; + user_ptr->csp_frac = 0; + + msg_print(_("石を制御できない!", "You are too weak to control the stone!")); + /* Hack -- Bypass free action */ + (void)set_paralyzed(user_ptr, user_ptr->paralyzed + randint1(5 * oops + 1)); + + /* Confusing. */ + (void)set_confused(user_ptr, user_ptr->confused + randint1(5 * oops + 1)); + } + + user_ptr->redraw |= (PR_MANA); + } + + take_hit(user_ptr, DAMAGE_LOSELIFE, damroll(1, 12), _("危険な秘密", "perilous secrets"), -1); + /* Confusing. */ + if (one_in_(5)) + (void)set_confused(user_ptr, user_ptr->confused + randint1(10)); + + /* Exercise a little care... */ + if (one_in_(20)) + take_hit(user_ptr, DAMAGE_LOSELIFE, damroll(4, 10), _("危険な秘密", "perilous secrets"), -1); + return TRUE; } - /*! * @brief 固定アーティファクト『ブラッディムーン』の特性を変更する。 * @details スレイ2d2種、及びone_resistance()による耐性1d2種、pval2種を得る。 @@ -855,31 +839,35 @@ bool perilous_secrets(player_type *user_ptr) */ void get_bloody_moon_flags(object_type *o_ptr) { - for (int i = 0; i < TR_FLAG_SIZE; i++) - o_ptr->art_flags[i] = a_info[ART_BLOOD].flags[i]; - - int dummy = randint1(2) + randint1(2); - for (int i = 0; i < dummy; i++) - { - int flag = randint0(26); - if (flag >= 20) add_flag(o_ptr->art_flags, TR_KILL_UNDEAD + flag - 20); - else if (flag == 19) add_flag(o_ptr->art_flags, TR_KILL_ANIMAL); - else if (flag == 18) add_flag(o_ptr->art_flags, TR_SLAY_HUMAN); - else add_flag(o_ptr->art_flags, TR_CHAOTIC + flag); - } - - dummy = randint1(2); - for (int i = 0; i < dummy; i++) one_resistance(o_ptr); - - for (int i = 0; i < 2; i++) - { - int tmp = randint0(11); - if (tmp < A_MAX) add_flag(o_ptr->art_flags, TR_STR + tmp); - else add_flag(o_ptr->art_flags, TR_STEALTH + tmp - 6); - } + for (int i = 0; i < TR_FLAG_SIZE; i++) + o_ptr->art_flags[i] = a_info[ART_BLOOD].flags[i]; + + int dummy = randint1(2) + randint1(2); + for (int i = 0; i < dummy; i++) { + int flag = randint0(26); + if (flag >= 20) + add_flag(o_ptr->art_flags, TR_KILL_UNDEAD + flag - 20); + else if (flag == 19) + add_flag(o_ptr->art_flags, TR_KILL_ANIMAL); + else if (flag == 18) + add_flag(o_ptr->art_flags, TR_SLAY_HUMAN); + else + add_flag(o_ptr->art_flags, TR_CHAOTIC + flag); + } + + dummy = randint1(2); + for (int i = 0; i < dummy; i++) + one_resistance(o_ptr); + + for (int i = 0; i < 2; i++) { + int tmp = randint0(11); + if (tmp < A_MAX) + add_flag(o_ptr->art_flags, TR_STR + tmp); + else + add_flag(o_ptr->art_flags, TR_STEALTH + tmp - 6); + } } - /*! * @brief 寿命つき光源の燃素追加処理 / * Charge a lite (torch or latern) @@ -887,48 +875,42 @@ void get_bloody_moon_flags(object_type *o_ptr) */ void phlogiston(player_type *caster_ptr) { - GAME_TURN max_flog = 0; - object_type *o_ptr = &caster_ptr->inventory_list[INVEN_LITE]; - - /* It's a lamp */ - if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_LANTERN)) - { - max_flog = FUEL_LAMP; - } - - /* It's a torch */ - else if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH)) - { - max_flog = FUEL_TORCH; - } - - /* No torch to refill */ - else - { - msg_print(_("燃素を消費するアイテムを装備していません。", "You are not wielding anything which uses phlogiston.")); - return; - } - - if (o_ptr->xtra4 >= max_flog) - { - msg_print(_("このアイテムにはこれ以上燃素を補充できません。", "No more phlogiston can be put in this item.")); - return; - } - - /* Refuel */ - o_ptr->xtra4 += (XTRA16)(max_flog / 2); - msg_print(_("照明用アイテムに燃素を補充した。", "You add phlogiston to your light item.")); - - if (o_ptr->xtra4 >= max_flog) - { - o_ptr->xtra4 = (XTRA16)max_flog; - msg_print(_("照明用アイテムは満タンになった。", "Your light item is full.")); - } - - caster_ptr->update |= (PU_TORCH); + GAME_TURN max_flog = 0; + object_type *o_ptr = &caster_ptr->inventory_list[INVEN_LITE]; + + /* It's a lamp */ + if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_LANTERN)) { + max_flog = FUEL_LAMP; + } + + /* It's a torch */ + else if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH)) { + max_flog = FUEL_TORCH; + } + + /* No torch to refill */ + else { + msg_print(_("燃素を消費するアイテムを装備していません。", "You are not wielding anything which uses phlogiston.")); + return; + } + + if (o_ptr->xtra4 >= max_flog) { + msg_print(_("このアイテムにはこれ以上燃素を補充できません。", "No more phlogiston can be put in this item.")); + return; + } + + /* Refuel */ + o_ptr->xtra4 += (XTRA16)(max_flog / 2); + msg_print(_("照明用アイテムに燃素を補充した。", "You add phlogiston to your light item.")); + + if (o_ptr->xtra4 >= max_flog) { + o_ptr->xtra4 = (XTRA16)max_flog; + msg_print(_("照明用アイテムは満タンになった。", "Your light item is full.")); + } + + caster_ptr->update |= (PU_TORCH); } - /*! * @brief 武器の祝福処理 / * Bless a weapon @@ -936,143 +918,127 @@ void phlogiston(player_type *caster_ptr) */ bool bless_weapon(player_type *caster_ptr) { - /* Bless only weapons */ - item_tester_hook = object_is_weapon; - - concptr q = _("どのアイテムを祝福しますか?", "Bless which weapon? "); - concptr s = _("祝福できる武器がありません。", "You have weapon to bless."); - - OBJECT_IDX item; - object_type *o_ptr; - o_ptr = choose_object(caster_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0); - if (!o_ptr) return FALSE; - - GAME_TEXT o_name[MAX_NLEN]; - object_desc(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_flags(caster_ptr, o_ptr, flgs); - - if (object_is_cursed(o_ptr)) - { - if (((o_ptr->curse_flags & TRC_HEAVY_CURSE) && (randint1(100) < 33)) || - have_flag(flgs, TR_ADD_L_CURSE) || - have_flag(flgs, TR_ADD_H_CURSE) || - (o_ptr->curse_flags & TRC_PERMA_CURSE)) - { + /* Bless only weapons */ + item_tester_hook = object_is_weapon; + + concptr q = _("どのアイテムを祝福しますか?", "Bless which weapon? "); + concptr s = _("祝福できる武器がありません。", "You have weapon to bless."); + + OBJECT_IDX item; + object_type *o_ptr; + o_ptr = choose_object(caster_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0); + if (!o_ptr) + return FALSE; + + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + BIT_FLAGS flgs[TR_FLAG_SIZE]; + object_flags(caster_ptr, o_ptr, flgs); + + if (object_is_cursed(o_ptr)) { + if (((o_ptr->curse_flags & TRC_HEAVY_CURSE) && (randint1(100) < 33)) || have_flag(flgs, TR_ADD_L_CURSE) || have_flag(flgs, TR_ADD_H_CURSE) + || (o_ptr->curse_flags & TRC_PERMA_CURSE)) { #ifdef JP - msg_format("%sを覆う黒いオーラは祝福を跳ね返した!", o_name); + msg_format("%sを覆う黒いオーラは祝福を跳ね返した!", o_name); #else - msg_format("The black aura on %s %s disrupts the blessing!", ((item >= 0) ? "your" : "the"), o_name); + msg_format("The black aura on %s %s disrupts the blessing!", ((item >= 0) ? "your" : "the"), o_name); #endif - return TRUE; - } + return TRUE; + } #ifdef JP - msg_format("%s から邪悪なオーラが消えた。", o_name); + msg_format("%s から邪悪なオーラが消えた。", o_name); #else - msg_format("A malignant aura leaves %s %s.", ((item >= 0) ? "your" : "the"), o_name); + msg_format("A malignant aura leaves %s %s.", ((item >= 0) ? "your" : "the"), o_name); #endif - - o_ptr->curse_flags = 0L; - - o_ptr->ident |= (IDENT_SENSE); - o_ptr->feeling = FEEL_NONE; - - /* Recalculate the bonuses */ - caster_ptr->update |= (PU_BONUS); - caster_ptr->window |= (PW_EQUIP); - } - - /* - * Next, we try to bless it. Artifacts have a 1/3 chance of - * being blessed, otherwise, the operation simply disenchants - * them, godly power negating the magic. Ok, the explanation - * is silly, but otherwise priests would always bless every - * artifact weapon they find. Ego weapons and normal weapons - * can be blessed automatically. - */ - if (have_flag(flgs, TR_BLESSED)) - { + o_ptr->curse_flags = 0L; + + o_ptr->ident |= (IDENT_SENSE); + o_ptr->feeling = FEEL_NONE; + + /* Recalculate the bonuses */ + caster_ptr->update |= (PU_BONUS); + caster_ptr->window |= (PW_EQUIP); + } + + /* + * Next, we try to bless it. Artifacts have a 1/3 chance of + * being blessed, otherwise, the operation simply disenchants + * them, godly power negating the magic. Ok, the explanation + * is silly, but otherwise priests would always bless every + * artifact weapon they find. Ego weapons and normal weapons + * can be blessed automatically. + */ + if (have_flag(flgs, TR_BLESSED)) { #ifdef JP - msg_format("%s は既に祝福されている。", o_name); + msg_format("%s は既に祝福されている。", o_name); #else - msg_format("%s %s %s blessed already.", - ((item >= 0) ? "Your" : "The"), o_name, - ((o_ptr->number > 1) ? "were" : "was")); + msg_format("%s %s %s blessed already.", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "were" : "was")); #endif - return TRUE; - } + return TRUE; + } - if (!(object_is_artifact(o_ptr) || object_is_ego(o_ptr)) || one_in_(3)) - { + if (!(object_is_artifact(o_ptr) || object_is_ego(o_ptr)) || one_in_(3)) { #ifdef JP - msg_format("%sは輝いた!", o_name); + msg_format("%sは輝いた!", o_name); #else - msg_format("%s %s shine%s!", - ((item >= 0) ? "Your" : "The"), o_name, - ((o_ptr->number > 1) ? "" : "s")); + msg_format("%s %s shine%s!", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "" : "s")); #endif - add_flag(o_ptr->art_flags, TR_BLESSED); - o_ptr->discount = 99; - } - else - { - bool dis_happened = FALSE; - msg_print(_("その武器は祝福を嫌っている!", "The weapon resists your blessing!")); - - /* Disenchant tohit */ - if (o_ptr->to_h > 0) - { - o_ptr->to_h--; - dis_happened = TRUE; - } - - if ((o_ptr->to_h > 5) && (randint0(100) < 33)) o_ptr->to_h--; - - /* Disenchant todam */ - if (o_ptr->to_d > 0) - { - o_ptr->to_d--; - dis_happened = TRUE; - } - - if ((o_ptr->to_d > 5) && (randint0(100) < 33)) o_ptr->to_d--; - - /* Disenchant toac */ - if (o_ptr->to_a > 0) - { - o_ptr->to_a--; - dis_happened = TRUE; - } - - if ((o_ptr->to_a > 5) && (randint0(100) < 33)) o_ptr->to_a--; - - if (dis_happened) - { - msg_print(_("周囲が凡庸な雰囲気で満ちた...", "There is a static feeling in the air...")); + add_flag(o_ptr->art_flags, TR_BLESSED); + o_ptr->discount = 99; + } else { + bool dis_happened = FALSE; + msg_print(_("その武器は祝福を嫌っている!", "The weapon resists your blessing!")); + + /* Disenchant tohit */ + if (o_ptr->to_h > 0) { + o_ptr->to_h--; + dis_happened = TRUE; + } + + if ((o_ptr->to_h > 5) && (randint0(100) < 33)) + o_ptr->to_h--; + + /* Disenchant todam */ + if (o_ptr->to_d > 0) { + o_ptr->to_d--; + dis_happened = TRUE; + } + + if ((o_ptr->to_d > 5) && (randint0(100) < 33)) + o_ptr->to_d--; + + /* Disenchant toac */ + if (o_ptr->to_a > 0) { + o_ptr->to_a--; + dis_happened = TRUE; + } + + if ((o_ptr->to_a > 5) && (randint0(100) < 33)) + o_ptr->to_a--; + + if (dis_happened) { + msg_print(_("周囲が凡庸な雰囲気で満ちた...", "There is a static feeling in the air...")); #ifdef JP - msg_format("%s は劣化した!", o_name); + msg_format("%s は劣化した!", o_name); #else - msg_format("%s %s %s disenchanted!", ((item >= 0) ? "Your" : "The"), o_name, - ((o_ptr->number > 1) ? "were" : "was")); + msg_format("%s %s %s disenchanted!", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "were" : "was")); #endif + } + } - } - } + caster_ptr->update |= (PU_BONUS); + caster_ptr->window |= (PW_EQUIP | PW_PLAYER); + calc_android_exp(caster_ptr); - caster_ptr->update |= (PU_BONUS); - caster_ptr->window |= (PW_EQUIP | PW_PLAYER); - calc_android_exp(caster_ptr); - - return TRUE; + return TRUE; } - /*! * @brief 盾磨き処理 / * pulish shield @@ -1080,47 +1046,47 @@ bool bless_weapon(player_type *caster_ptr) */ bool pulish_shield(player_type *caster_ptr) { - concptr q = _("どの盾を磨きますか?", "Pulish which weapon? "); - concptr s = _("磨く盾がありません。", "You have weapon to pulish."); - - OBJECT_IDX item; - object_type *o_ptr; - o_ptr = choose_object(caster_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), TV_SHIELD); - if (!o_ptr) return FALSE; - - GAME_TEXT o_name[MAX_NLEN]; - object_desc(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_flags(caster_ptr, o_ptr, flgs); - - bool is_pulish_successful = o_ptr->k_idx && !object_is_artifact(o_ptr) && !object_is_ego(o_ptr); - is_pulish_successful &= !object_is_cursed(o_ptr); - is_pulish_successful &= (o_ptr->sval != SV_MIRROR_SHIELD); - if (is_pulish_successful) - { + concptr q = _("どの盾を磨きますか?", "Pulish which weapon? "); + concptr s = _("磨く盾がありません。", "You have weapon to pulish."); + + OBJECT_IDX item; + object_type *o_ptr; + o_ptr = choose_object(caster_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), TV_SHIELD); + if (!o_ptr) + return FALSE; + + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + BIT_FLAGS flgs[TR_FLAG_SIZE]; + object_flags(caster_ptr, o_ptr, flgs); + + bool is_pulish_successful = o_ptr->k_idx && !object_is_artifact(o_ptr) && !object_is_ego(o_ptr); + is_pulish_successful &= !object_is_cursed(o_ptr); + is_pulish_successful &= (o_ptr->sval != SV_MIRROR_SHIELD); + if (is_pulish_successful) { #ifdef JP - msg_format("%sは輝いた!", o_name); + msg_format("%sは輝いた!", o_name); #else - msg_format("%s %s shine%s!", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "" : "s")); + msg_format("%s %s shine%s!", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "" : "s")); #endif - o_ptr->name2 = EGO_REFLECTION; - enchant(caster_ptr, o_ptr, randint0(3) + 4, ENCH_TOAC); + o_ptr->name2 = EGO_REFLECTION; + enchant(caster_ptr, o_ptr, randint0(3) + 4, ENCH_TOAC); - o_ptr->discount = 99; - chg_virtue(caster_ptr, V_ENCHANT, 2); + o_ptr->discount = 99; + chg_virtue(caster_ptr, V_ENCHANT, 2); - return TRUE; - } + return TRUE; + } - if (flush_failure) flush(); + if (flush_failure) + flush(); - msg_print(_("失敗した。", "Failed.")); - chg_virtue(caster_ptr, V_ENCHANT, -2); - calc_android_exp(caster_ptr); - return FALSE; + msg_print(_("失敗した。", "Failed.")); + chg_virtue(caster_ptr, V_ENCHANT, -2); + calc_android_exp(caster_ptr); + return FALSE; } - /*! * @brief 呪いの打ち破り処理 / * Break the curse of an item @@ -1129,22 +1095,18 @@ bool pulish_shield(player_type *caster_ptr) */ static void break_curse(object_type *o_ptr) { - BIT_FLAGS is_curse_broken = object_is_cursed(o_ptr) && - !(o_ptr->curse_flags & TRC_PERMA_CURSE) && - !(o_ptr->curse_flags & TRC_HEAVY_CURSE) && - (randint0(100) < 25); - if (!is_curse_broken) - { - return; - } - - msg_print(_("かけられていた呪いが打ち破られた!", "The curse is broken!")); - - o_ptr->curse_flags = 0L; - o_ptr->ident |= (IDENT_SENSE); - o_ptr->feeling = FEEL_NONE; -} + BIT_FLAGS is_curse_broken + = object_is_cursed(o_ptr) && !(o_ptr->curse_flags & TRC_PERMA_CURSE) && !(o_ptr->curse_flags & TRC_HEAVY_CURSE) && (randint0(100) < 25); + if (!is_curse_broken) { + return; + } + + msg_print(_("かけられていた呪いが打ち破られた!", "The curse is broken!")); + o_ptr->curse_flags = 0L; + o_ptr->ident |= (IDENT_SENSE); + o_ptr->feeling = FEEL_NONE; +} /*! * @brief 装備修正強化処理 / @@ -1171,96 +1133,96 @@ static void break_curse(object_type *o_ptr) */ bool enchant(player_type *caster_ptr, object_type *o_ptr, int n, int eflag) { - /* Large piles resist enchantment */ - int prob = o_ptr->number * 100; - - /* Missiles are easy to enchant */ - if ((o_ptr->tval == TV_BOLT) || - (o_ptr->tval == TV_ARROW) || - (o_ptr->tval == TV_SHOT)) - { - prob = prob / 20; - } - - /* Try "n" times */ - int chance; - bool res = FALSE; - bool a = object_is_artifact(o_ptr); - bool force = (eflag & ENCH_FORCE); - for (int i = 0; i < n; i++) - { - /* Hack -- Roll for pile resistance */ - if (!force && randint0(prob) >= 100) continue; - - /* Enchant to hit */ - if (eflag & ENCH_TOHIT) - { - if (o_ptr->to_h < 0) chance = 0; - else if (o_ptr->to_h > 15) chance = 1000; - else chance = enchant_table[o_ptr->to_h]; - - if (force || ((randint1(1000) > chance) && (!a || (randint0(100) < 50)))) - { - o_ptr->to_h++; - res = TRUE; - - /* only when you get it above -1 -CFT */ - if (o_ptr->to_h >= 0) - break_curse(o_ptr); - } - } - - /* Enchant to damage */ - if (eflag & ENCH_TODAM) - { - if (o_ptr->to_d < 0) chance = 0; - else if (o_ptr->to_d > 15) chance = 1000; - else chance = enchant_table[o_ptr->to_d]; - - if (force || ((randint1(1000) > chance) && (!a || (randint0(100) < 50)))) - { - o_ptr->to_d++; - res = TRUE; - - /* only when you get it above -1 -CFT */ - if (o_ptr->to_d >= 0) - break_curse(o_ptr); - } - } - - /* Enchant to armor class */ - if (!(eflag & ENCH_TOAC)) - { - continue; - } - - if (o_ptr->to_a < 0) chance = 0; - else if (o_ptr->to_a > 15) chance = 1000; - else chance = enchant_table[o_ptr->to_a]; - - if (force || ((randint1(1000) > chance) && (!a || (randint0(100) < 50)))) - { - o_ptr->to_a++; - res = TRUE; - - /* only when you get it above -1 -CFT */ - if (o_ptr->to_a >= 0) - break_curse(o_ptr); - } - } - - /* Failure */ - if (!res) return FALSE; - caster_ptr->update |= (PU_BONUS | PU_COMBINE | PU_REORDER); - caster_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); - - calc_android_exp(caster_ptr); - - /* Success */ - return TRUE; + /* Large piles resist enchantment */ + int prob = o_ptr->number * 100; + + /* Missiles are easy to enchant */ + if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT)) { + prob = prob / 20; + } + + /* Try "n" times */ + int chance; + bool res = FALSE; + bool a = object_is_artifact(o_ptr); + bool force = (eflag & ENCH_FORCE); + for (int i = 0; i < n; i++) { + /* Hack -- Roll for pile resistance */ + if (!force && randint0(prob) >= 100) + continue; + + /* Enchant to hit */ + if (eflag & ENCH_TOHIT) { + if (o_ptr->to_h < 0) + chance = 0; + else if (o_ptr->to_h > 15) + chance = 1000; + else + chance = enchant_table[o_ptr->to_h]; + + if (force || ((randint1(1000) > chance) && (!a || (randint0(100) < 50)))) { + o_ptr->to_h++; + res = TRUE; + + /* only when you get it above -1 -CFT */ + if (o_ptr->to_h >= 0) + break_curse(o_ptr); + } + } + + /* Enchant to damage */ + if (eflag & ENCH_TODAM) { + if (o_ptr->to_d < 0) + chance = 0; + else if (o_ptr->to_d > 15) + chance = 1000; + else + chance = enchant_table[o_ptr->to_d]; + + if (force || ((randint1(1000) > chance) && (!a || (randint0(100) < 50)))) { + o_ptr->to_d++; + res = TRUE; + + /* only when you get it above -1 -CFT */ + if (o_ptr->to_d >= 0) + break_curse(o_ptr); + } + } + + /* Enchant to armor class */ + if (!(eflag & ENCH_TOAC)) { + continue; + } + + if (o_ptr->to_a < 0) + chance = 0; + else if (o_ptr->to_a > 15) + chance = 1000; + else + chance = enchant_table[o_ptr->to_a]; + + if (force || ((randint1(1000) > chance) && (!a || (randint0(100) < 50)))) { + o_ptr->to_a++; + res = TRUE; + + /* only when you get it above -1 -CFT */ + if (o_ptr->to_a >= 0) + break_curse(o_ptr); + } + } + + /* Failure */ + if (!res) + return FALSE; + caster_ptr->update |= (PU_BONUS | PU_COMBINE | PU_REORDER); + caster_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); + + calc_android_exp(caster_ptr); + + /* Success */ + return TRUE; } - /*! * @brief 装備修正強化処理のメインルーチン / * Enchant an item (in the inventory or on the floor) @@ -1275,50 +1237,54 @@ bool enchant(player_type *caster_ptr, object_type *o_ptr, int n, int eflag) */ bool enchant_spell(player_type *caster_ptr, HIT_PROB num_hit, HIT_POINT num_dam, ARMOUR_CLASS num_ac) { - /* Assume enchant weapon */ - item_tester_hook = object_allow_enchant_weapon; + /* Assume enchant weapon */ + item_tester_hook = object_allow_enchant_weapon; - /* Enchant armor if requested */ - if (num_ac) item_tester_hook = object_is_armour; + /* Enchant armor if requested */ + if (num_ac) + item_tester_hook = object_is_armour; - concptr q = _("どのアイテムを強化しますか? ", "Enchant which item? "); - concptr s = _("強化できるアイテムがない。", "You have nothing to enchant."); + concptr q = _("どのアイテムを強化しますか? ", "Enchant which item? "); + concptr s = _("強化できるアイテムがない。", "You have nothing to enchant."); - OBJECT_IDX item; - object_type *o_ptr; - o_ptr = choose_object(caster_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0); - if (!o_ptr) return FALSE; + OBJECT_IDX item; + object_type *o_ptr; + o_ptr = choose_object(caster_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0); + if (!o_ptr) + return FALSE; - GAME_TEXT o_name[MAX_NLEN]; - object_desc(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); #ifdef JP - msg_format("%s は明るく輝いた!", o_name); + msg_format("%s は明るく輝いた!", o_name); #else - msg_format("%s %s glow%s brightly!", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "" : "s")); + msg_format("%s %s glow%s brightly!", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "" : "s")); #endif - /* Enchant */ - bool is_enchant_successful = FALSE; - if (enchant(caster_ptr, o_ptr, num_hit, ENCH_TOHIT)) is_enchant_successful = TRUE; - if (enchant(caster_ptr, o_ptr, num_dam, ENCH_TODAM)) is_enchant_successful = TRUE; - if (enchant(caster_ptr, o_ptr, num_ac, ENCH_TOAC)) is_enchant_successful = TRUE; - - if (!is_enchant_successful) - { - if (flush_failure) flush(); - msg_print(_("強化に失敗した。", "The enchantment failed.")); - if (one_in_(3)) chg_virtue(caster_ptr, V_ENCHANT, -1); - } - else - chg_virtue(caster_ptr, V_ENCHANT, 1); - - calc_android_exp(caster_ptr); - - /* Something happened */ - return TRUE; + /* Enchant */ + bool is_enchant_successful = FALSE; + if (enchant(caster_ptr, o_ptr, num_hit, ENCH_TOHIT)) + is_enchant_successful = TRUE; + if (enchant(caster_ptr, o_ptr, num_dam, ENCH_TODAM)) + is_enchant_successful = TRUE; + if (enchant(caster_ptr, o_ptr, num_ac, ENCH_TOAC)) + is_enchant_successful = TRUE; + + if (!is_enchant_successful) { + if (flush_failure) + flush(); + msg_print(_("強化に失敗した。", "The enchantment failed.")); + if (one_in_(3)) + chg_virtue(caster_ptr, V_ENCHANT, -1); + } else + chg_virtue(caster_ptr, V_ENCHANT, 1); + + calc_android_exp(caster_ptr); + + /* Something happened */ + return TRUE; } - /*! * @brief 武器へのエゴ付加処理 / * Brand the current weapon @@ -1328,144 +1294,139 @@ bool enchant_spell(player_type *caster_ptr, HIT_PROB num_hit, HIT_POINT num_dam, */ void brand_weapon(player_type *caster_ptr, int brand_type) { - /* Assume enchant weapon */ - item_tester_hook = object_allow_enchant_melee_weapon; - - concptr q = _("どの武器を強化しますか? ", "Enchant which weapon? "); - concptr s = _("強化できる武器がない。", "You have nothing to enchant."); - - OBJECT_IDX item; - object_type *o_ptr; - o_ptr = choose_object(caster_ptr, &item, q, s, (USE_EQUIP | IGNORE_BOTHHAND_SLOT), 0); - if (!o_ptr) return; - - bool is_special_item = o_ptr->k_idx && !object_is_artifact(o_ptr) && !object_is_ego(o_ptr) && - !object_is_cursed(o_ptr) && - !((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) && - !((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) && - !((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)); - if (!is_special_item) - { - if (flush_failure) flush(); - - msg_print(_("属性付加に失敗した。", "The branding failed.")); - chg_virtue(caster_ptr, V_ENCHANT, -2); - calc_android_exp(caster_ptr); - return; - } - - /* Let's get the name before it is changed... */ - GAME_TEXT o_name[MAX_NLEN]; - object_desc(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - - concptr act = NULL; - switch (brand_type) - { - case 17: - if (o_ptr->tval == TV_SWORD) - { - act = _("は鋭さを増した!", "becomes very sharp!"); - - o_ptr->name2 = EGO_SHARPNESS; - o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, caster_ptr->current_floor_ptr->dun_level) + 1; - - if ((o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2)) - o_ptr->pval = 2; - } - else - { - act = _("は破壊力を増した!", "seems very powerful."); - o_ptr->name2 = EGO_EARTHQUAKES; - o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, caster_ptr->current_floor_ptr->dun_level); - } - - break; - case 16: - act = _("は人間の血を求めている!", "seems to be looking for humans!"); - o_ptr->name2 = EGO_KILL_HUMAN; - break; - case 15: - act = _("は電撃に覆われた!", "covered with lightning!"); - o_ptr->name2 = EGO_BRAND_ELEC; - break; - case 14: - act = _("は酸に覆われた!", "coated with acid!"); - o_ptr->name2 = EGO_BRAND_ACID; - break; - case 13: - act = _("は邪悪なる怪物を求めている!", "seems to be looking for evil monsters!"); - o_ptr->name2 = EGO_KILL_EVIL; - break; - case 12: - act = _("は異世界の住人の肉体を求めている!", "seems to be looking for demons!"); - o_ptr->name2 = EGO_KILL_DEMON; - break; - case 11: - act = _("は屍を求めている!", "seems to be looking for undead!"); - o_ptr->name2 = EGO_KILL_UNDEAD; - break; - case 10: - act = _("は動物の血を求めている!", "seems to be looking for animals!"); - o_ptr->name2 = EGO_KILL_ANIMAL; - break; - case 9: - act = _("はドラゴンの血を求めている!", "seems to be looking for dragons!"); - o_ptr->name2 = EGO_KILL_DRAGON; - break; - case 8: - act = _("はトロルの血を求めている!", "seems to be looking for troll!s"); - o_ptr->name2 = EGO_KILL_TROLL; - break; - case 7: - act = _("はオークの血を求めている!", "seems to be looking for orcs!"); - o_ptr->name2 = EGO_KILL_ORC; - break; - case 6: - act = _("は巨人の血を求めている!", "seems to be looking for giants!"); - o_ptr->name2 = EGO_KILL_GIANT; - break; - case 5: - act = _("は非常に不安定になったようだ。", "seems very unstable now."); - o_ptr->name2 = EGO_TRUMP; - o_ptr->pval = randint1(2); - break; - case 4: - act = _("は血を求めている!", "thirsts for blood!"); - o_ptr->name2 = EGO_VAMPIRIC; - break; - case 3: - act = _("は毒に覆われた。", "is coated with poison."); - o_ptr->name2 = EGO_BRAND_POIS; - break; - case 2: - act = _("は純ログルスに飲み込まれた。", "is engulfed in raw Logrus!"); - o_ptr->name2 = EGO_CHAOTIC; - break; - case 1: - act = _("は炎のシールドに覆われた!", "is covered in a fiery shield!"); - o_ptr->name2 = EGO_BRAND_FIRE; - break; - default: - act = _("は深く冷たいブルーに輝いた!", "glows deep, icy blue!"); - o_ptr->name2 = EGO_BRAND_COLD; - break; - } - - msg_format(_("あなたの%s%s", "Your %s %s"), o_name, act); - enchant(caster_ptr, o_ptr, randint0(3) + 4, ENCH_TOHIT | ENCH_TODAM); - - o_ptr->discount = 99; - chg_virtue(caster_ptr, V_ENCHANT, 2); - calc_android_exp(caster_ptr); + /* Assume enchant weapon */ + item_tester_hook = object_allow_enchant_melee_weapon; + + concptr q = _("どの武器を強化しますか? ", "Enchant which weapon? "); + concptr s = _("強化できる武器がない。", "You have nothing to enchant."); + + OBJECT_IDX item; + object_type *o_ptr; + o_ptr = choose_object(caster_ptr, &item, q, s, (USE_EQUIP | IGNORE_BOTHHAND_SLOT), 0); + if (!o_ptr) + return; + + bool is_special_item = o_ptr->k_idx && !object_is_artifact(o_ptr) && !object_is_ego(o_ptr) && !object_is_cursed(o_ptr) + && !((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) && !((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) + && !((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)); + if (!is_special_item) { + if (flush_failure) + flush(); + + msg_print(_("属性付加に失敗した。", "The branding failed.")); + chg_virtue(caster_ptr, V_ENCHANT, -2); + calc_android_exp(caster_ptr); + return; + } + + /* Let's get the name before it is changed... */ + GAME_TEXT o_name[MAX_NLEN]; + describe_flavor(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + + concptr act = NULL; + switch (brand_type) { + case 17: + if (o_ptr->tval == TV_SWORD) { + act = _("は鋭さを増した!", "becomes very sharp!"); + + o_ptr->name2 = EGO_SHARPNESS; + o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, caster_ptr->current_floor_ptr->dun_level) + 1; + + if ((o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2)) + o_ptr->pval = 2; + } else { + act = _("は破壊力を増した!", "seems very powerful."); + o_ptr->name2 = EGO_EARTHQUAKES; + o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, caster_ptr->current_floor_ptr->dun_level); + } + + break; + case 16: + act = _("は人間の血を求めている!", "seems to be looking for humans!"); + o_ptr->name2 = EGO_KILL_HUMAN; + break; + case 15: + act = _("は電撃に覆われた!", "covered with lightning!"); + o_ptr->name2 = EGO_BRAND_ELEC; + break; + case 14: + act = _("は酸に覆われた!", "coated with acid!"); + o_ptr->name2 = EGO_BRAND_ACID; + break; + case 13: + act = _("は邪悪なる怪物を求めている!", "seems to be looking for evil monsters!"); + o_ptr->name2 = EGO_KILL_EVIL; + break; + case 12: + act = _("は異世界の住人の肉体を求めている!", "seems to be looking for demons!"); + o_ptr->name2 = EGO_KILL_DEMON; + break; + case 11: + act = _("は屍を求めている!", "seems to be looking for undead!"); + o_ptr->name2 = EGO_KILL_UNDEAD; + break; + case 10: + act = _("は動物の血を求めている!", "seems to be looking for animals!"); + o_ptr->name2 = EGO_KILL_ANIMAL; + break; + case 9: + act = _("はドラゴンの血を求めている!", "seems to be looking for dragons!"); + o_ptr->name2 = EGO_KILL_DRAGON; + break; + case 8: + act = _("はトロルの血を求めている!", "seems to be looking for troll!s"); + o_ptr->name2 = EGO_KILL_TROLL; + break; + case 7: + act = _("はオークの血を求めている!", "seems to be looking for orcs!"); + o_ptr->name2 = EGO_KILL_ORC; + break; + case 6: + act = _("は巨人の血を求めている!", "seems to be looking for giants!"); + o_ptr->name2 = EGO_KILL_GIANT; + break; + case 5: + act = _("は非常に不安定になったようだ。", "seems very unstable now."); + o_ptr->name2 = EGO_TRUMP; + o_ptr->pval = randint1(2); + break; + case 4: + act = _("は血を求めている!", "thirsts for blood!"); + o_ptr->name2 = EGO_VAMPIRIC; + break; + case 3: + act = _("は毒に覆われた。", "is coated with poison."); + o_ptr->name2 = EGO_BRAND_POIS; + break; + case 2: + act = _("は純ログルスに飲み込まれた。", "is engulfed in raw Logrus!"); + o_ptr->name2 = EGO_CHAOTIC; + break; + case 1: + act = _("は炎のシールドに覆われた!", "is covered in a fiery shield!"); + o_ptr->name2 = EGO_BRAND_FIRE; + break; + default: + act = _("は深く冷たいブルーに輝いた!", "glows deep, icy blue!"); + o_ptr->name2 = EGO_BRAND_COLD; + break; + } + + msg_format(_("あなたの%s%s", "Your %s %s"), o_name, act); + enchant(caster_ptr, o_ptr, randint0(3) + 4, ENCH_TOHIT | ENCH_TODAM); + + o_ptr->discount = 99; + chg_virtue(caster_ptr, V_ENCHANT, 2); + calc_android_exp(caster_ptr); } bool create_ration(player_type *creature_ptr) { - object_type *q_ptr; - object_type forge; - q_ptr = &forge; - object_prep(creature_ptr, q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION)); - (void)drop_near(creature_ptr, q_ptr, -1, creature_ptr->y, creature_ptr->x); - msg_print(_("食事を料理して作った。", "You cook some food.")); - return TRUE; + object_type *q_ptr; + object_type forge; + q_ptr = &forge; + object_prep(creature_ptr, q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION)); + (void)drop_near(creature_ptr, q_ptr, -1, creature_ptr->y, creature_ptr->x); + msg_print(_("食事を料理して作った。", "You cook some food.")); + return TRUE; } diff --git a/src/spell/spells-status.c b/src/spell/spells-status.c index 6e19f2c33..8c0362590 100644 --- a/src/spell/spells-status.c +++ b/src/spell/spells-status.c @@ -13,6 +13,7 @@ #include "core/stuff-handler.h" #include "core/window-redrawer.h" #include "effect/effect-characteristics.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "floor/floor.h" @@ -23,7 +24,6 @@ #include "io/targeting.h" #include "mind/mind-force-trainer.h" #include "monster/monster-describer.h" -#include "object/object-flavor.h" #include "object/object-generator.h" #include "object/object-kind-hook.h" #include "object/object-kind.h" @@ -476,7 +476,7 @@ bool cosmic_cast_off(player_type *creature_ptr, object_type *o_ptr) o_ptr = &creature_ptr->current_floor_ptr->o_list[o_idx]; GAME_TEXT o_name[MAX_NLEN]; - object_desc(creature_ptr, o_name, o_ptr, OD_NAME_ONLY); + describe_flavor(creature_ptr, o_name, o_ptr, OD_NAME_ONLY); msg_format(_("%sを脱ぎ捨てた。", "You cast off %s."), o_name); /* Get effects */ diff --git a/src/store/rumor.c b/src/store/rumor.c index f27a20770..bc5d43987 100644 --- a/src/store/rumor.c +++ b/src/store/rumor.c @@ -1,5 +1,6 @@ #include "store/rumor.h" #include "dungeon/dungeon.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-town.h" #include "floor/wild.h" @@ -7,10 +8,9 @@ #include "io/tokenizer.h" #include "monster-race/monster-race.h" #include "object-enchant/artifact.h" -#include "object/object-flavor.h" +#include "object-enchant/special-object-flags.h" #include "object/object-generator.h" #include "object/object-kind-hook.h" -#include "object-enchant/special-object-flags.h" #include "view/display-messages.h" #include "world/world.h" @@ -20,128 +20,115 @@ IDX rumor_num(char *zz, IDX max_idx) { - if (strcmp(zz, "*") == 0) return randint1(max_idx - 1); - return (IDX)atoi(zz); + if (strcmp(zz, "*") == 0) + return randint1(max_idx - 1); + return (IDX)atoi(zz); } concptr rumor_bind_name(char *base, concptr fullname) { - char *s, *v; - s = strstr(base, "{Name}"); - if (s) - { - s[0] = '\0'; - v = format("%s%s%s", base, fullname, (s + 6)); - return v; - } - - v = base; - return v; + char *s, *v; + s = strstr(base, "{Name}"); + if (s) { + s[0] = '\0'; + v = format("%s%s%s", base, fullname, (s + 6)); + return v; + } + + v = base; + return v; } void display_rumor(player_type *player_ptr, bool ex) { - char rumor[1024]; - int section = (ex && (randint0(3) == 0)) ? 1 : 0; - errr err = _(get_rnd_line_jonly("rumors_j.txt", section, rumor, 10), - get_rnd_line("rumors.txt", section, rumor)); - if (err) strcpy(rumor, _("嘘の噂もある。", "Some rumors are wrong.")); - - if (strncmp(rumor, "R:", 2) != 0) - { - msg_format("%s", rumor); - return; - } - - char *zz[4]; - if (tokenize(rumor + 2, 3, zz, TOKENIZE_CHECKQUOTE) != 3) - { - msg_print(_("この情報は間違っている。", "This information is wrong.")); - return; - } - - concptr rumor_eff_format = NULL; - char fullname[1024] = ""; - if (strcmp(zz[0], "ARTIFACT") == 0) - { - ARTIFACT_IDX a_idx; - artifact_type *a_ptr; - while (TRUE) - { - a_idx = rumor_num(zz[1], max_a_idx); - - a_ptr = &a_info[a_idx]; - if (a_ptr->name) break; - } - - KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval); - object_type forge; - object_type *q_ptr = &forge; - object_prep(player_ptr, q_ptr, k_idx); - q_ptr->name1 = a_idx; - q_ptr->ident = IDENT_STORE; - object_desc(player_ptr, fullname, q_ptr, OD_NAME_ONLY); - } - else if (strcmp(zz[0], "MONSTER") == 0) - { - monster_race *r_ptr; - while (TRUE) - { - MONRACE_IDX r_idx = rumor_num(zz[1], max_r_idx); - r_ptr = &r_info[r_idx]; - if (r_ptr->name) break; - } - - strcpy(fullname, r_name + r_ptr->name); - - if (!r_ptr->r_sights) - { - r_ptr->r_sights++; - } - } - else if (strcmp(zz[0], "DUNGEON") == 0) - { - DUNGEON_IDX d_idx; - dungeon_type *d_ptr; - while (TRUE) - { - d_idx = rumor_num(zz[1], current_world_ptr->max_d_idx); - d_ptr = &d_info[d_idx]; - if (d_ptr->name) break; - } - - strcpy(fullname, d_name + d_ptr->name); - - if (!max_dlv[d_idx]) - { - max_dlv[d_idx] = d_ptr->mindepth; - rumor_eff_format = _("%sに帰還できるようになった。", "You can recall to %s."); - } - } - else if (strcmp(zz[0], "TOWN") == 0) - { - IDX t_idx; - while (TRUE) - { - t_idx = rumor_num(zz[1], NO_TOWN); - if (town_info[t_idx].name) break; - } - - strcpy(fullname, town_info[t_idx].name); - - s32b visit = (1L << (t_idx - 1)); - if ((t_idx != SECRET_TOWN) && !(player_ptr->visit & visit)) - { - player_ptr->visit |= visit; - rumor_eff_format = _("%sに行ったことがある気がする。", "You feel you have been to %s."); - } - } - - concptr rumor_msg = rumor_bind_name(zz[2], fullname); - msg_print(rumor_msg); - if (rumor_eff_format) - { - msg_print(NULL); - msg_format(rumor_eff_format, fullname); - } + char rumor[1024]; + int section = (ex && (randint0(3) == 0)) ? 1 : 0; + errr err = _(get_rnd_line_jonly("rumors_j.txt", section, rumor, 10), get_rnd_line("rumors.txt", section, rumor)); + if (err) + strcpy(rumor, _("嘘の噂もある。", "Some rumors are wrong.")); + + if (strncmp(rumor, "R:", 2) != 0) { + msg_format("%s", rumor); + return; + } + + char *zz[4]; + if (tokenize(rumor + 2, 3, zz, TOKENIZE_CHECKQUOTE) != 3) { + msg_print(_("この情報は間違っている。", "This information is wrong.")); + return; + } + + concptr rumor_eff_format = NULL; + char fullname[1024] = ""; + if (strcmp(zz[0], "ARTIFACT") == 0) { + ARTIFACT_IDX a_idx; + artifact_type *a_ptr; + while (TRUE) { + a_idx = rumor_num(zz[1], max_a_idx); + + a_ptr = &a_info[a_idx]; + if (a_ptr->name) + break; + } + + KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval); + object_type forge; + object_type *q_ptr = &forge; + object_prep(player_ptr, q_ptr, k_idx); + q_ptr->name1 = a_idx; + q_ptr->ident = IDENT_STORE; + describe_flavor(player_ptr, fullname, q_ptr, OD_NAME_ONLY); + } else if (strcmp(zz[0], "MONSTER") == 0) { + monster_race *r_ptr; + while (TRUE) { + MONRACE_IDX r_idx = rumor_num(zz[1], max_r_idx); + r_ptr = &r_info[r_idx]; + if (r_ptr->name) + break; + } + + strcpy(fullname, r_name + r_ptr->name); + + if (!r_ptr->r_sights) { + r_ptr->r_sights++; + } + } else if (strcmp(zz[0], "DUNGEON") == 0) { + DUNGEON_IDX d_idx; + dungeon_type *d_ptr; + while (TRUE) { + d_idx = rumor_num(zz[1], current_world_ptr->max_d_idx); + d_ptr = &d_info[d_idx]; + if (d_ptr->name) + break; + } + + strcpy(fullname, d_name + d_ptr->name); + + if (!max_dlv[d_idx]) { + max_dlv[d_idx] = d_ptr->mindepth; + rumor_eff_format = _("%sに帰還できるようになった。", "You can recall to %s."); + } + } else if (strcmp(zz[0], "TOWN") == 0) { + IDX t_idx; + while (TRUE) { + t_idx = rumor_num(zz[1], NO_TOWN); + if (town_info[t_idx].name) + break; + } + + strcpy(fullname, town_info[t_idx].name); + + s32b visit = (1L << (t_idx - 1)); + if ((t_idx != SECRET_TOWN) && !(player_ptr->visit & visit)) { + player_ptr->visit |= visit; + rumor_eff_format = _("%sに行ったことがある気がする。", "You feel you have been to %s."); + } + } + + concptr rumor_msg = rumor_bind_name(zz[2], fullname); + msg_print(rumor_msg); + if (rumor_eff_format) { + msg_print(NULL); + msg_format(rumor_eff_format, fullname); + } } diff --git a/src/store/store.c b/src/store/store.c index a60f0e2aa..17da1ad39 100644 --- a/src/store/store.c +++ b/src/store/store.c @@ -34,6 +34,7 @@ #include "core/player-update-types.h" #include "core/stuff-handler.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-events.h" #include "floor/floor-object.h" @@ -66,7 +67,6 @@ #include "object-hook/hook-enchant.h" #include "object/item-tester-hooker.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "object/object-generator.h" #include "object/object-info.h" #include "object/object-kind.h" @@ -498,7 +498,7 @@ static void display_entry(player_type *player_ptr, int pos) maxwid -= 10; GAME_TEXT o_name[MAX_NLEN]; - object_desc(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); o_name[maxwid] = '\0'; c_put_str(tval_to_attr[o_ptr->tval], o_name, i + 6, cur_col); if (show_weights) { @@ -515,7 +515,7 @@ static void display_entry(player_type *player_ptr, int pos) maxwid -= 7; GAME_TEXT o_name[MAX_NLEN]; - object_desc(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); o_name[maxwid] = '\0'; c_put_str(tval_to_attr[o_ptr->tval], o_name, i + 6, cur_col); @@ -1231,7 +1231,7 @@ static void store_purchase(player_type *player_ptr) distribute_charges(o_ptr, j_ptr, amt); item_new = store_item_to_inventory(player_ptr, j_ptr); GAME_TEXT o_name[MAX_NLEN]; - object_desc(player_ptr, o_name, &player_ptr->inventory_list[item_new], 0); + describe_flavor(player_ptr, o_name, &player_ptr->inventory_list[item_new], 0); msg_format(_("%s(%c)を取った。", "You have %s (%c)."), o_name, index_to_label(item_new)); handle_stuff(player_ptr); @@ -1263,7 +1263,7 @@ static void store_purchase(player_type *player_ptr) price = (best * j_ptr->number); } else { GAME_TEXT o_name[MAX_NLEN]; - object_desc(player_ptr, o_name, j_ptr, 0); + describe_flavor(player_ptr, o_name, j_ptr, 0); msg_format(_("%s(%c)を購入する。", "Buying %s (%c)."), o_name, I2A(item)); msg_print(NULL); choice = purchase_haggle(player_ptr, j_ptr, &price); @@ -1293,7 +1293,7 @@ static void store_purchase(player_type *player_ptr) object_aware(player_ptr, j_ptr); j_ptr->ident &= ~(IDENT_FIXED); GAME_TEXT o_name[MAX_NLEN]; - object_desc(player_ptr, o_name, j_ptr, 0); + describe_flavor(player_ptr, o_name, j_ptr, 0); msg_format(_("%sを $%ldで購入しました。", "You bought %s for %ld gold."), o_name, (long)price); @@ -1302,7 +1302,7 @@ static void store_purchase(player_type *player_ptr) if (record_buy) exe_write_diary(player_ptr, DIARY_BUY, 0, o_name); - object_desc(player_ptr, o_name, o_ptr, OD_NAME_ONLY); + describe_flavor(player_ptr, o_name, o_ptr, OD_NAME_ONLY); if (record_rand_art && o_ptr->art_name) exe_write_diary(player_ptr, DIARY_ART, 0, o_name); @@ -1311,7 +1311,7 @@ static void store_purchase(player_type *player_ptr) j_ptr->ident &= ~(IDENT_STORE); item_new = store_item_to_inventory(player_ptr, j_ptr); - object_desc(player_ptr, o_name, &player_ptr->inventory_list[item_new], 0); + describe_flavor(player_ptr, o_name, &player_ptr->inventory_list[item_new], 0); msg_format(_("%s(%c)を手に入れた。", "You have %s (%c)."), o_name, index_to_label(item_new)); autopick_alter_item(player_ptr, item_new, FALSE); if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND)) { @@ -1413,7 +1413,7 @@ static void store_sell(player_type *owner_ptr) } GAME_TEXT o_name[MAX_NLEN]; - object_desc(owner_ptr, o_name, q_ptr, 0); + describe_flavor(owner_ptr, o_name, q_ptr, 0); /* Remove any inscription, feeling for stores */ if ((cur_store_num != STORE_HOME) && (cur_store_num != STORE_MUSEUM)) { @@ -1474,7 +1474,7 @@ static void store_sell(player_type *owner_ptr) } value = object_value(owner_ptr, q_ptr) * q_ptr->number; - object_desc(owner_ptr, o_name, q_ptr, 0); + describe_flavor(owner_ptr, o_name, q_ptr, 0); msg_format(_("%sを $%ldで売却しました。", "You sold %s for %ld gold."), o_name, (long)price); if (record_sell) @@ -1505,7 +1505,7 @@ static void store_sell(player_type *owner_ptr) } } else if (cur_store_num == STORE_MUSEUM) { char o2_name[MAX_NLEN]; - object_desc(owner_ptr, o2_name, q_ptr, OD_NAME_ONLY); + describe_flavor(owner_ptr, o2_name, q_ptr, OD_NAME_ONLY); if (-1 == store_check_num(q_ptr)) { msg_print(_("それと同じ品物は既に博物館にあるようです。", "The Museum already has one of those items.")); @@ -1586,7 +1586,7 @@ static void store_examine(player_type *player_ptr) } GAME_TEXT o_name[MAX_NLEN]; - object_desc(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); msg_format(_("%sを調べている...", "Examining %s..."), o_name); if (!screen_object(player_ptr, o_ptr, SCROBJ_FORCE_DETAIL)) @@ -1622,7 +1622,7 @@ static void museum_remove_object(player_type *player_ptr) o_ptr = &st_ptr->stock[item]; GAME_TEXT o_name[MAX_NLEN]; - object_desc(player_ptr, o_name, o_ptr, 0); + describe_flavor(player_ptr, o_name, o_ptr, 0); msg_print(_("展示をやめさせたアイテムは二度と見ることはできません!", "Once removed from the Museum, an item will be gone forever!")); if (!get_check(format(_("本当に%sの展示をやめさせますか?", "Really order to remove %s from the Museum? "), o_name))) @@ -2015,7 +2015,7 @@ void do_cmd_store(player_type *player_ptr) msg_print(_("ザックからアイテムがあふれてしまった!", "Your pack overflows!")); q_ptr = &forge; object_copy(q_ptr, o_ptr); - object_desc(player_ptr, o_name, q_ptr, 0); + describe_flavor(player_ptr, o_name, q_ptr, 0); msg_format(_("%sが落ちた。(%c)", "You drop %s (%c)."), o_name, index_to_label(item)); vary_item(player_ptr, item, -255); handle_stuff(player_ptr); diff --git a/src/view/display-inventory.c b/src/view/display-inventory.c index 0742720da..6945af225 100644 --- a/src/view/display-inventory.c +++ b/src/view/display-inventory.c @@ -1,4 +1,5 @@ #include "view/display-inventory.h" +#include "flavor/flavor-describer.h" #include "game-option/special-options.h" #include "game-option/text-display-options.h" #include "inventory/inventory-slot-types.h" @@ -6,7 +7,6 @@ #include "io/input-key-requester.h" #include "object/item-tester-hooker.h" #include "object/item-use-flags.h" -#include "object/object-flavor.h" #include "object/object-info.h" #include "object/object-kind.h" #include "system/object-type-definition.h" @@ -53,7 +53,7 @@ COMMAND_CODE show_inventory(player_type *owner_ptr, int target_item, BIT_FLAGS m if (!item_tester_okay(owner_ptr, o_ptr, tval) && !(mode & USE_FULL)) continue; - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); out_index[k] = i; out_color[k] = tval_to_attr[o_ptr->tval % 128]; if (o_ptr->timeout) @@ -155,7 +155,7 @@ void display_inventory(player_type *owner_ptr, tval_type tval) } Term_putstr(0, i, 3, TERM_WHITE, tmp_val); - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); n = strlen(o_name); attr = tval_to_attr[o_ptr->tval % 128]; if (o_ptr->timeout) { diff --git a/src/view/display-sub-windows.c b/src/view/display-sub-windows.c index 8cb10e0b4..59d9f8201 100644 --- a/src/view/display-sub-windows.c +++ b/src/view/display-sub-windows.c @@ -1,5 +1,6 @@ #include "view/display-sub-windows.h" #include "core/window-redrawer.h" +#include "flavor/flavor-describer.h" #include "floor/floor.h" #include "game-option/option-flags.h" #include "game-option/special-options.h" @@ -17,7 +18,6 @@ #include "monster/monster-flag-types.h" #include "monster/monster-info.h" #include "object/item-tester-hooker.h" -#include "object/object-flavor.h" #include "object/object-info.h" #include "spell-kind/magic-item-recharger.h" #include "system/monster-type-definition.h" @@ -218,7 +218,7 @@ static void display_equipment(player_type *owner_ptr, tval_type tval) strcpy(o_name, _("(武器を両手持ち)", "(wielding with two-hands)")); attr = TERM_WHITE; } else { - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); attr = tval_to_attr[o_ptr->tval % 128]; } diff --git a/src/view/main-window-util.c b/src/view/main-window-util.c index 81326055c..485403005 100644 --- a/src/view/main-window-util.c +++ b/src/view/main-window-util.c @@ -1,11 +1,11 @@ #include "view/main-window-util.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor.h" #include "floor/geometry.h" #include "game-option/map-screen-options.h" #include "game-option/special-options.h" #include "grid/grid.h" -#include "object/object-flavor.h" #include "monster-race/monster-race.h" #include "system/monster-race-definition.h" #include "system/object-type-definition.h" @@ -114,7 +114,7 @@ void print_map(player_type *player_ptr) static void display_shortened_item_name(player_type *player_ptr, object_type *o_ptr, int y) { char buf[MAX_NLEN]; - object_desc(player_ptr, buf, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NAME_ONLY)); + describe_flavor(player_ptr, buf, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NAME_ONLY)); TERM_COLOR attr = tval_to_attr[o_ptr->tval % 128]; if (player_ptr->image) { diff --git a/src/view/object-describer.c b/src/view/object-describer.c index 34d113c5e..8f86708c8 100644 --- a/src/view/object-describer.c +++ b/src/view/object-describer.c @@ -1,10 +1,10 @@ #include "view/object-describer.h" #include "cmd-action/cmd-spell.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" -#include "perception/object-perception.h" -#include "object/object-flavor.h" -#include "object/object-generator.h" #include "object-enchant/special-object-flags.h" +#include "object/object-generator.h" +#include "perception/object-perception.h" #include "realm/realm-names-table.h" #include "spell/spell-info.h" #include "system/object-type-definition.h" @@ -54,7 +54,7 @@ void inven_item_describe(player_type *owner_ptr, INVENTORY_IDX item) { object_type *o_ptr = &owner_ptr->inventory_list[item]; GAME_TEXT o_name[MAX_NLEN]; - object_desc(owner_ptr, o_name, o_ptr, 0); + describe_flavor(owner_ptr, o_name, o_ptr, 0); #ifdef JP if (o_ptr->number <= 0) { msg_format("もう%sを持っていない。", o_name); @@ -91,7 +91,7 @@ void display_koff(player_type *owner_ptr, KIND_OBJECT_IDX k_idx) q_ptr = &forge; object_prep(owner_ptr, q_ptr, k_idx); - object_desc(owner_ptr, o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE)); + describe_flavor(owner_ptr, o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE)); Term_putstr(0, 0, -1, TERM_WHITE, o_name); sval = q_ptr->sval; diff --git a/src/wizard/wizard-special-process.c b/src/wizard/wizard-special-process.c index fcd2978a1..9953e4abb 100644 --- a/src/wizard/wizard-special-process.c +++ b/src/wizard/wizard-special-process.c @@ -21,6 +21,7 @@ #include "core/window-redrawer.h" #include "dungeon/dungeon.h" #include "dungeon/quest.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "floor/floor-save.h" @@ -333,7 +334,7 @@ static void wiz_display_item(player_type *player_ptr, object_type *o_ptr) prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0); char buf[256]; - object_desc(player_ptr, buf, o_ptr, OD_STORE); + describe_flavor(player_ptr, buf, o_ptr, OD_STORE); prt(buf, 2, j); prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d", o_ptr->k_idx, k_info[o_ptr->k_idx].level, o_ptr->tval, o_ptr->sval), 4, j); prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d", o_ptr->number, o_ptr->weight, o_ptr->ac, o_ptr->dd, o_ptr->ds), 5, j); diff --git a/src/wizard/wizard-spoiler.c b/src/wizard/wizard-spoiler.c index a1d58efaa..7bbb01a42 100644 --- a/src/wizard/wizard-spoiler.c +++ b/src/wizard/wizard-spoiler.c @@ -10,6 +10,7 @@ */ #include "wizard/wizard-spoiler.h" +#include "flavor/flavor-describer.h" #include "flavor/object-flavor-types.h" #include "floor/floor-town.h" #include "inventory/inventory-slot-types.h" @@ -26,7 +27,6 @@ #include "object-enchant/trc-types.h" #include "object-enchant/trg-types.h" #include "object/object-flags.h" -#include "object/object-flavor.h" #include "object/object-generator.h" #include "object/object-info.h" #include "object/object-kind-hook.h" @@ -192,7 +192,7 @@ static void kind_info(player_type *player_ptr, char *buf, char *dam, char *wgt, if (!buf || !dam || !chance || !wgt) return; - object_desc(player_ptr, buf, q_ptr, (OD_NAME_ONLY | OD_STORE)); + describe_flavor(player_ptr, buf, q_ptr, (OD_NAME_ONLY | OD_STORE)); strcpy(dam, ""); switch (q_ptr->tval) { case TV_BOW: { @@ -396,7 +396,7 @@ static concptr *spoiler_flag_aux(const BIT_FLAGS art_flags[TR_FLAG_SIZE], const */ static void analyze_general(player_type *player_ptr, object_type *o_ptr, char *desc_ptr) { - object_desc(player_ptr, desc_ptr, o_ptr, (OD_NAME_AND_ENCHANT | OD_STORE)); + describe_flavor(player_ptr, desc_ptr, o_ptr, (OD_NAME_AND_ENCHANT | OD_STORE)); } /*! @@ -1139,9 +1139,9 @@ static void spoil_mon_info(player_type *player_ptr, concptr fname) spoil_out(buf); if ((flags1 & (RF1_FORCE_MAXHP)) || (r_ptr->hside == 1)) sprintf(buf, "Hp:%d ", r_ptr->hdice * r_ptr->hside); - else + else sprintf(buf, "Hp:%dd%d ", r_ptr->hdice, r_ptr->hside); - + spoil_out(buf); sprintf(buf, "Ac:%d ", r_ptr->ac); spoil_out(buf); @@ -1358,7 +1358,8 @@ static void random_artifact_analyze(player_type *player_ptr, object_type *o_ptr, analyze_sustains(player_ptr, o_ptr, desc_ptr->sustains); analyze_misc_magic(player_ptr, o_ptr, desc_ptr->misc_magic); desc_ptr->activation = activation_explanation(player_ptr, o_ptr); - sprintf(desc_ptr->misc_desc, _("重さ %d.%d kg", "Weight %d.%d lbs"), _(lbtokg1(o_ptr->weight), o_ptr->weight / 10), _(lbtokg2(o_ptr->weight), o_ptr->weight % 10)); + sprintf(desc_ptr->misc_desc, _("重さ %d.%d kg", "Weight %d.%d lbs"), _(lbtokg1(o_ptr->weight), o_ptr->weight / 10), + _(lbtokg2(o_ptr->weight), o_ptr->weight % 10)); } /*! -- 2.11.0