OSDN Git Service

Fix artifact, 'Vampire Killer'.
[hengband/hengband.git] / src / flavor.c
index af5f5d2..8c695e2 100644 (file)
@@ -34,6 +34,7 @@ static bool object_easy_know(int i)
                case TV_CRUSADE_BOOK:
                case TV_MUSIC_BOOK:
                case TV_HISSATSU_BOOK:
+               case TV_HEX_BOOK:
                {
                        return (TRUE);
                }
@@ -130,7 +131,7 @@ void get_table_name_aux(char *out_string)
 
 
 /*
- * Create a name from random parts without quotes.
+ * Create a name from random parts with quotes.
  */
 void get_table_name(char *out_string)
 {
@@ -146,6 +147,49 @@ void get_table_name(char *out_string)
 
 
 /*
+ * Make random Sindarin name
+ */
+void get_table_sindarin_aux(char *out_string)
+{
+       char Syllable[80];
+#ifdef JP
+       char tmp[80];
+#endif
+
+       get_rnd_line("sname.txt", 1, Syllable);
+#ifdef JP
+       strcpy(tmp, Syllable);
+#else
+       strcpy(out_string, Syllable);
+#endif
+
+       get_rnd_line("sname.txt", 2, Syllable);
+#ifdef JP
+       strcat(tmp, Syllable);
+       sindarin_to_kana(out_string, tmp);
+#else
+       strcat(out_string, Syllable);
+#endif
+}
+
+
+/*
+ * Make random Sindarin name with quotes
+ */
+void get_table_sindarin(char *out_string)
+{
+       char buff[80];
+       get_table_sindarin_aux(buff);
+
+#ifdef JP
+       sprintf(out_string, "¡Ø%s¡Ù", buff);
+#else
+       sprintf(out_string, "'%s'", buff);
+#endif
+}
+
+
+/*
  * Shuffle flavor indices of a group of objects with given tval
  */
 static void shuffle_flavors(byte tval)
@@ -189,6 +233,9 @@ static void shuffle_flavors(byte tval)
                k1_ptr->flavor = k2_ptr->flavor;
                k2_ptr->flavor = tmp;
        }
+
+       /* Free an array for a list of k_idx */
+       C_KILL(k_idx_list, max_k_idx, s16b);
 }
 
 /*
@@ -225,12 +272,13 @@ static void shuffle_flavors(byte tval)
 void flavor_init(void)
 {
        int i;
+       u32b state_backup[4];
 
-       /* Hack -- Use the "simple" RNG */
-       Rand_quick = TRUE;
+       /* Hack -- Backup the RNG state */
+       Rand_state_backup(state_backup);
 
        /* Hack -- Induce consistant flavors */
-       Rand_value = seed_flavor;
+       Rand_state_init(seed_flavor);
 
 
        /* Initialize flavor index of each object by itself */
@@ -273,8 +321,8 @@ void flavor_init(void)
        shuffle_flavors(TV_SCROLL);
 
 
-       /* Hack -- Use the "complex" RNG */
-       Rand_quick = FALSE;
+       /* Hack -- Restore the RNG state */
+       Rand_state_restore(state_backup);
 
        /* Analyze every object */
        for (i = 1; i < max_k_idx; i++)
@@ -407,6 +455,7 @@ char *object_desc_kosuu(char *t, object_type *o_ptr)
       case  TV_CRUSADE_BOOK:
       case  TV_MUSIC_BOOK:
       case  TV_HISSATSU_BOOK:
+         case TV_HEX_BOOK:
       {
          t = object_desc_str(t, "ºý");
          break;
@@ -580,7 +629,8 @@ static flag_insc_table flag_insc_resistance[] =
 
 static flag_insc_table flag_insc_misc[] =
 {
-       { "ËâÎÏ", "Ma", TR_DEC_MANA, -1 },
+       { "°×", "Es", TR_EASY_SPELL, -1 },
+       { "¸º", "Dm", TR_DEC_MANA, -1 },
        { "Åê", "Th", TR_THROW, -1 },
        { "ȿ", "Rf", TR_REFLECT, -1 },
        { "Ëã", "Fa", TR_FREE_ACT, -1 },
@@ -597,6 +647,8 @@ static flag_insc_table flag_insc_misc[] =
        { "ÅÜ", "Ag", TR_AGGRAVATE, -1 },
        { "½Ë", "Bs", TR_BLESSED, -1 },
        { "´÷", "Ty", TR_TY_CURSE, -1 },
+       { "¼ö", "C-", TR_ADD_L_CURSE, -1 },
+       { "ëÇ", "C+", TR_ADD_H_CURSE, -1 },
        { NULL, NULL, 0, -1 }
 };
 
@@ -738,7 +790,8 @@ static flag_insc_table flag_insc_resistance[] =
 
 static flag_insc_table flag_insc_misc[] =
 {
-       { "Ma", TR_DEC_MANA, -1 },
+       { "Es", TR_EASY_SPELL, -1 },
+       { "Dm", TR_DEC_MANA, -1 },
        { "Th", TR_THROW, -1 },
        { "Rf", TR_REFLECT, -1 },
        { "Fa", TR_FREE_ACT, -1 },
@@ -755,6 +808,8 @@ static flag_insc_table flag_insc_misc[] =
        { "Ag", TR_AGGRAVATE, -1 },
        { "Bs", TR_BLESSED, -1 },
        { "Ty", TR_TY_CURSE, -1 },
+       { "C-", TR_ADD_L_CURSE, -1 },
+       { "C+", TR_ADD_H_CURSE, -1 },
        { NULL, 0, -1 }
 };
 
@@ -1100,6 +1155,26 @@ static void get_inscription(char *buff, object_type *o_ptr)
        *ptr = '\0';
 }
 
+bool object_is_quest_target(object_type *o_ptr)
+{
+       if (p_ptr->inside_quest)
+       {
+               int a_idx = quest[p_ptr->inside_quest].k_idx;
+               if (a_idx)
+               {
+                       artifact_type *a_ptr = &a_info[a_idx];
+                       if (!(a_ptr->gen_flags & TRG_INSTA_ART))
+                       {
+                               if((o_ptr->tval == a_ptr->tval) && (o_ptr->sval == a_ptr->sval))
+                               {
+                                       return TRUE;
+                               }
+                       }
+               }
+       }
+       return FALSE;
+}
+
 
 /*
  * Creates a description of the item "o_ptr", and stores it in "out_val".
@@ -1159,6 +1234,7 @@ void object_desc(char *buf, object_type *o_ptr, u32b mode)
        cptr            modstr = "";
 
        int             power;
+       int                             fire_rate;
 
        bool            aware = FALSE;
        bool            known = FALSE;
@@ -1698,6 +1774,20 @@ void object_desc(char *buf, object_type *o_ptr, u32b mode)
                        break;
                }
 
+               case TV_HEX_BOOK:
+               {
+#ifdef JP
+                       basenm = "¼ö½Ñ¤ÎËâË¡½ñ%";
+#else
+                       if (mp_ptr->spell_book == TV_LIFE_BOOK)
+                               basenm = "& Book~ of Crusade Magic %";
+                       else
+                               basenm = "& Crusade Spellbook~ %";
+#endif
+
+                       break;
+               }
+
                /* Hack -- Gold/Gems */
                case TV_GOLD:
                {
@@ -2243,7 +2333,13 @@ void object_desc(char *buf, object_type *o_ptr, u32b mode)
                case TV_HAFTED:
                case TV_POLEARM:
                case TV_SWORD:
-               case TV_DIGGING:
+           case TV_DIGGING:
+               
+               /* In Vault Quest, hide the dice of target weapon. */
+               if(object_is_quest_target(o_ptr) && !known)
+               {
+                       break;
+               }
 
                /* Append a "damage" string */
                t = object_desc_chr(t, ' ');
@@ -2272,7 +2368,22 @@ void object_desc(char *buf, object_type *o_ptr, u32b mode)
                t = object_desc_chr(t, 'x');
                t = object_desc_num(t, power);
                t = object_desc_chr(t, p2);
-
+               
+               fire_rate = calc_num_fire(o_ptr);
+               /* Show Fire rate */
+               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);
+               }
+               
                /* All done */
                break;
        }
@@ -2334,14 +2445,30 @@ void object_desc(char *buf, object_type *o_ptr, u32b mode)
                /* Launcher multiplier */
                avgdam *= tmul;
                avgdam /= (100 * 10);
+
+               /* Get extra damage from concentration */
+               if (p_ptr->concent) avgdam = boost_concentration_damage(avgdam);
+               
                if (avgdam < 0) avgdam = 0;
 
-               /* Display (shot damage/ avg damage) */
+               /* Display (shot damage/ shot damage with critical/ avg damage with critical) */
                t = object_desc_chr(t, ' ');
                t = object_desc_chr(t, p1);
+               
+               if(show_ammo_no_crit)
+               {
+                       /* Damage with no-crit */
+                       t = object_desc_num(t, avgdam);
+                       t = object_desc_str(t, show_ammo_detail ? "/shot " : "/");
+               }
+               
+               /* Apply Expect damage of Critical */
+               avgdam = calc_expect_crit_shot(o_ptr->weight, o_ptr->to_h, bow_ptr->to_h, avgdam);
                t = object_desc_num(t, avgdam);
-               t = object_desc_chr(t, '/');
-
+               
+               t = show_ammo_no_crit ? object_desc_str(t, show_ammo_detail ? "/crit " : "/")
+                                                         : object_desc_str(t, show_ammo_detail ? "/shot " : "/");
+       
                if (p_ptr->num_fire == 0)
                {
                        t = object_desc_chr(t, '0');
@@ -2352,6 +2479,20 @@ void object_desc(char *buf, object_type *o_ptr, u32b mode)
                        avgdam *= (p_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(o_ptr->weight, 
+                                               known ? o_ptr->to_h : 0, 
+                                               object_is_known(bow_ptr) ? bow_ptr->to_h : 0,  avgdam);
+                               
+                               t = object_desc_chr(t, '/');
+                               t = object_desc_num(t, percent / 100);
+                               t = object_desc_chr(t, '.');
+                               t = object_desc_num(t, percent % 100);
+                               t = object_desc_str(t, show_ammo_detail ? "% crit" : "%");
+                       }
                }
 
                t = object_desc_chr(t, p2);