X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fobject2.c;h=e5cbb3e1bfa28b870b317ae7a2d5d6f0c56cdeec;hb=67a5a32944f12de9a30808919a49f08c5c5ffbfa;hp=1d9b8d1a30ddf6bd9939e3c0943adced0a03c51a;hpb=0a00f2f67afaa77ab45bedd98efe05cde3a7f0bf;p=hengband%2Fhengband.git diff --git a/src/object2.c b/src/object2.c index 1d9b8d1a3..e5cbb3e1b 100644 --- a/src/object2.c +++ b/src/object2.c @@ -1018,6 +1018,8 @@ 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_TELEPORT)) { if (object_is_cursed(o_ptr)) @@ -1828,7 +1830,7 @@ void object_wipe(object_type *o_ptr) void object_copy(object_type *o_ptr, object_type *j_ptr) { /* Copy the structure */ - COPY(o_ptr, j_ptr, object_type); + (void)COPY(o_ptr, j_ptr, object_type); } @@ -2318,6 +2320,8 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) continue; if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED) continue; + if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD) + continue; break; } @@ -2395,6 +2399,20 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) if (one_in_(5)) 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_ADD_H_CURSE); + break; } if (!o_ptr->art_name) @@ -2413,11 +2431,27 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) /* Roll for ego-item */ if (randint0(MAX_DEPTH) < level) { - o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE); + while(1) + { + o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE); + if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD) + { + continue; + } + break; + } switch (o_ptr->name2) { 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); + if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC); + if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE); + if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE); + if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE); } } } @@ -2643,31 +2677,63 @@ 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: - break; - case EGO_DWARVEN: + case EGO_DWARVEN: if (o_ptr->tval != TV_HARD_ARMOR) { okay_flag = FALSE; break; } - else + case EGO_DRUID: + if (o_ptr->tval != TV_SOFT_ARMOR) { - o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3); - o_ptr->ac = k_info[o_ptr->k_idx].ac + 5; - if (one_in_(4)) - add_flag(o_ptr->art_flags, TR_CON); + okay_flag = FALSE; 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); + + 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_MORGUL: + if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE); + if (one_in_(6)) 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_(4)) add_flag(o_ptr->art_flags, TR_AGGRAVATE); + if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_MAGIC); + if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE); + break; + default: + break; + } } break; @@ -2692,7 +2758,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) { @@ -2704,6 +2780,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; @@ -4308,7 +4389,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); @@ -4341,6 +4422,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->to_a = MAX(o_ptr->to_a, 15); + } /* Hack -- obtain pval */ if (e_ptr->max_pval) @@ -4350,6 +4459,17 @@ void apply_magic(object_type *o_ptr, int lev, u32b mode) o_ptr->pval++; if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++; } + else if (o_ptr->name2 == EGO_DEMON) + { + if(have_flag(o_ptr->art_flags, TR_BLOWS)) + { + o_ptr->pval += randint1(2); + } + else + { + o_ptr->pval += randint1(e_ptr->max_pval); + } + } else if (o_ptr->name2 == EGO_ATTACKS) { o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1); @@ -4362,10 +4482,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)) { @@ -4377,7 +4503,7 @@ void apply_magic(object_type *o_ptr, int lev, u32b mode) /* Cheat -- describe the item */ if (cheat_peek) object_mention(o_ptr); - + /* Done */ return; } @@ -7491,6 +7617,8 @@ 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_TY_CURSE)) dec--; iy = o_ptr->iy; @@ -8615,3 +8743,41 @@ void do_cmd_kaji(bool only_browse) case 5: add_essence(10);break; } } + + +/* + * Torches have special abilities when they are flaming. + */ +void torch_flags(object_type *o_ptr, u32b *flgs) +{ + if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH)) + { + if (o_ptr->xtra4 > 0) + { + add_flag(flgs, TR_BRAND_FIRE); + add_flag(flgs, TR_KILL_UNDEAD); + add_flag(flgs, TR_THROW); + } + } +} + +void torch_dice(object_type *o_ptr, int *dd, int *ds) +{ + if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH)) + { + if (o_ptr->xtra4 > 0) + { + (*dd) = 1; + (*ds) = 6; + } + } +} + +void torch_lost_fuel(object_type *o_ptr) +{ + if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH)) + { + o_ptr->xtra4 -= (FUEL_TORCH / 25); + if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0; + } +}