OSDN Git Service

Change Rarity of Armor ego.
[hengband/hengband.git] / src / object2.c
index baa719f..c4a811c 100644 (file)
@@ -991,7 +991,12 @@ s32b flag_cost(object_type *o_ptr, int plusses)
        if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
        if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
        if (have_flag(flgs, TR_LEVITATION)) total += 1250;
-       if (have_flag(flgs, TR_LITE)) total += 1250;
+       if (have_flag(flgs, TR_LITE_1)) total += 1500;
+       if (have_flag(flgs, TR_LITE_2)) total += 2500;
+       if (have_flag(flgs, TR_LITE_3)) total += 4000;
+       if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
+       if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
+       if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
        if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
        if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
        if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
@@ -1018,6 +1023,18 @@ s32b flag_cost(object_type *o_ptr, int plusses)
        if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
        if (have_flag(flgs, TR_ACTIVATE)) total += 100;
        if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
+       if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
+       if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
+       if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
+       if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
+       if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
+       if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
+       if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
+       if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
+       if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
+       if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
+       if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
+       if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
        if (have_flag(flgs, TR_TELEPORT))
        {
                if (object_is_cursed(o_ptr))
@@ -2398,10 +2415,19 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power)
                                                add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
                                        break;
                                case EGO_DEMON:
+                                       
+                                       if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+                                       one_in_(3) ? 
+                                               add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
+                                               one_in_(2) ?
+                                                       add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
+                                                       add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
+                                               
+                                       
                                        if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
                                        if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
-                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
-                                       if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);                                     
+                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
+                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
                                        break;
                                }
 
@@ -2434,6 +2460,7 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power)
                                        {
                                        case EGO_MORGUL:
                                                if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
+                                               if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
                                        case EGO_WEIRD:
                                                if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
                                                if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
@@ -2666,40 +2693,64 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
 
                                        switch (o_ptr->name2)
                                        {
-                                       case EGO_RESISTANCE:
-                                               if (one_in_(4))
-                                                       add_flag(o_ptr->art_flags, TR_RES_POIS);
-                                               break;
-                                       case EGO_ELVENKIND:
-                                       case EGO_URUKISH:
-                                               break;
-                                       case EGO_DWARVEN:
+                                         case EGO_DWARVEN:
                                                if (o_ptr->tval != TV_HARD_ARMOR)
                                                {
                                                        okay_flag = FALSE;
                                                        break;
                                                }
-                                               else
-                                               {
-                                                       o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
-                                                       o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
-                                                       break;
-                                               }
-                                       case EGO_DRUID:
+                                         case EGO_DRUID:
                                                if (o_ptr->tval != TV_SOFT_ARMOR)
                                                {
                                                        okay_flag = FALSE;
                                                        break;
                                                }
-                                               else
-                                               {
-                                                       break;
-                                               }
+                                         default:
+                                               break;
                                        }
 
                                        if (okay_flag)
                                                break;
                                }
+                               switch (o_ptr->name2)
+                               {
+                                 case EGO_RESISTANCE:
+                                       if (one_in_(4))
+                                               add_flag(o_ptr->art_flags, TR_RES_POIS);
+                                               break;
+                                 case EGO_DWARVEN:
+                                       o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
+                                       o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
+                                       break;
+                                       
+                                 case EGO_A_DEMON:
+                                       if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+                                       one_in_(3) ? 
+                                               add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
+                                               one_in_(2) ?
+                                                       add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
+                                                       add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
+                                               
+                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
+                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
+                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
+                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
+                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
+                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
+                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
+                                       if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
+                                       break;
+                                 case EGO_A_MORGUL:
+                                       if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+                                       if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
+                                       if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
+                                       if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
+                                       if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
+                                       if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
+                                       break;
+                                 default:
+                                       break;
+                               }
                        }
 
                        break;
@@ -2724,7 +2775,17 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
                                        create_artifact(o_ptr, FALSE);
                                        break;
                                }
-                               o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
+                               
+                               while(1)
+                               {
+                                       o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
+                                       if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD 
+                                                               && o_ptr->name2 == EGO_S_DWARVEN)
+                                       {
+                                               continue;
+                                       }
+                                       break;
+                               }
                                
                                switch (o_ptr->name2)
                                {
@@ -2736,6 +2797,11 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
                                        if (o_ptr->sval == SV_MIRROR_SHIELD)
                                                o_ptr->name2 = 0;
                                        break;
+                                       
+                               case EGO_S_DWARVEN:
+                                       o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
+                                       o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
+                                       break;
                                }
                        }
                        break;
@@ -2832,6 +2898,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
                                        case EGO_MIGHT:
                                        case EGO_REGENERATION:
                                        case EGO_LORDLINESS:
+                                       case EGO_BASILISK:
                                                break;
                                        case EGO_SEEING:
                                                if (one_in_(3))
@@ -2851,8 +2918,26 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
 
                        /* Very cursed */
                        else if (power < -1)
-                       {
-                               o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
+                       {       
+                               while (1)
+                               {
+                                       bool ok_flag = TRUE;
+                                       o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
+
+                                       switch (o_ptr->name2)
+                                       {
+                                         case EGO_ANCIENT_CURSE:
+                                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
+                                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
+                                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
+                                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
+                                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
+                                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
+                                               break;
+                                       }
+                                       if (ok_flag)
+                                               break; /* while (1) */
+                               }
                        }
 
                        break;
@@ -2883,12 +2968,10 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
 
                                        switch (o_ptr->name2)
                                        {
-                                       case EGO_INTELLIGENCE:
-                                       case EGO_WISDOM:
-                                       case EGO_BEAUTY:
-                                       case EGO_LITE:
+                                       case EGO_BRILLIANCE:
                                        case EGO_DARK:
                                        case EGO_INFRAVISION:
+                                       case EGO_H_PROTECTION:
                                                break;
                                        case EGO_SEEING:
                                                if (one_in_(7))
@@ -2897,6 +2980,27 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
                                                        else add_esp_weak(o_ptr, FALSE);
                                                }
                                                break;
+                                       case EGO_LITE:
+                                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
+                                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
+                                               break;
+                                       case EGO_H_DEMON:
+                                               if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+                                               one_in_(3) ? 
+                                                       add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
+                                                       one_in_(2) ?
+                                                               add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
+                                                               add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
+                                               
+                                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
+                                               if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
+                                               if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
+                                               if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
+                                               if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
+                                               if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
+                                               if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
+                                               if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
+                                               break;
                                        default:/* not existing helm (Magi, Might, etc...)*/
                                                ok_flag = FALSE;
                                        }
@@ -2908,7 +3012,19 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
                        /* Very cursed */
                        else if (power < -1)
                        {
-                               o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
+                               while (1)
+                               {
+                                       bool ok_flag = TRUE;
+                                       o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
+
+                                       switch (o_ptr->name2)
+                                       {
+                                         case EGO_ANCIENT_CURSE:
+                                               ok_flag = FALSE;
+                                       }
+                                       if (ok_flag)
+                                               break; /* while (1) */
+                               }
                        }
                        break;
                }
@@ -2931,6 +3047,14 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
                                        o_ptr->to_d -= 6;
                                        o_ptr->to_h -= 6;
                                        break;
+                                 case EGO_NAZGUL:
+                                       o_ptr->to_d -= 3;
+                                       o_ptr->to_h -= 3;
+                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
+                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
+                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
+                                       if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
+                                       break;
                                }
 
                        }
@@ -3276,7 +3400,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->name2 = EGO_RING_REGEN;
                                                break;
                                        case 5: case 6:
-                                               if (have_flag(k_ptr->flags, TR_LITE)) break;
+                                               if (have_flag(k_ptr->flags, TR_LITE_1)) break;
                                                o_ptr->name2 = EGO_RING_LITE;
                                                break;
                                        case 7: case 8:
@@ -4340,7 +4464,7 @@ void apply_magic(object_type *o_ptr, int lev, u32b mode)
                if (e_ptr->act_idx) o_ptr->xtra2 = e_ptr->act_idx;
 
                /* Hack -- apply extra penalties if needed */
-               if (object_is_cursed(o_ptr) || object_is_broken(o_ptr))
+               if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
                {
                        /* Hack -- obtain bonuses */
                        if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
@@ -4373,6 +4497,34 @@ void apply_magic(object_type *o_ptr, int lev, u32b mode)
                                        o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
                                else o_ptr->to_a += randint1(e_ptr->max_to_a);
                        }
+                       
+                       /* Accuracy ego must have high to_h */
+                       if(o_ptr->name2 == EGO_ACCURACY)
+                       {
+                               while(o_ptr->to_h < o_ptr->to_d + 10)
+                               {
+                                       o_ptr->to_h += 5;
+                                       o_ptr->to_d -= 5;
+                               }
+                               o_ptr->to_h = MAX(o_ptr->to_h, 15);
+                       }
+                       
+                       /* Accuracy ego must have high to_h */
+                       if(o_ptr->name2 == EGO_VELOCITY)
+                       {
+                               while(o_ptr->to_d < o_ptr->to_h + 10)
+                               {
+                                       o_ptr->to_d += 5;
+                                       o_ptr->to_h -= 5;
+                               }
+                               o_ptr->to_d = MAX(o_ptr->to_d, 15);
+                       }
+                       
+                       /* Protection ego must have high to_a */
+                       if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
+                       {
+                               o_ptr->to_a = MAX(o_ptr->to_a, 15);
+                       }
 
                        /* Hack -- obtain pval */
                        if (e_ptr->max_pval)
@@ -4384,8 +4536,6 @@ void apply_magic(object_type *o_ptr, int lev, u32b mode)
                                }
                                else if (o_ptr->name2 == EGO_DEMON)
                                {
-                                       o_ptr->curse_flags |= (TRC_CURSED);
-                                       if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
                                        if(have_flag(o_ptr->art_flags, TR_BLOWS))
                                        {
                                                o_ptr->pval += randint1(2);
@@ -4407,10 +4557,16 @@ void apply_magic(object_type *o_ptr, int lev, u32b mode)
                                        o_ptr->pval = randint1(e_ptr->max_pval);
                                        if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
                                }
+                               else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
+                               {
+                                       o_ptr->pval = randint1(e_ptr->max_pval);
+                               }
                                else
                                {
                                        o_ptr->pval += randint1(e_ptr->max_pval);
                                }
+                               
+                               
                        }
                        if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
                        {
@@ -7053,7 +7209,7 @@ static essence_type essence_info[] =
        {TR_NO_MAGIC, "È¿ËâË¡", 3, TR_NO_MAGIC, 15},
        {TR_WARNING, "·Ù¹ð", 3, TR_WARNING, 20},
        {TR_LEVITATION, "ÉâÍ·", 3, TR_LEVITATION, 20},
-       {TR_LITE, "±Êµ×¸÷¸»", 3, TR_LITE, 15},
+       {TR_LITE_1, "±Êµ×¸÷¸»", 3, TR_LITE_1, 15},
        {TR_SEE_INVIS, "²Ä»ëÆ©ÌÀ", 3, TR_SEE_INVIS, 20},
        {TR_TELEPATHY, "¥Æ¥ì¥Ñ¥·¡¼", 6, TR_TELEPATHY, 15},
        {TR_SLOW_DIGEST, "Ãپò½", 3, TR_SLOW_DIGEST, 15},
@@ -7162,7 +7318,7 @@ static essence_type essence_info[] =
        {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, "permanent light", 3, TR_LITE, 15},
+       {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
        {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},
@@ -7536,8 +7692,20 @@ static void drain_essence(void)
        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;