}
if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
if (have_flag(flgs, TR_BLESSED)) total += 750;
+ if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
+ if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
/* Also, give some extra for activatable powers... */
if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
{
- int i;
- for (i = 0; activation_info[i].flag != NULL; i++)
- {
- if (activation_info[i].index == o_ptr->xtra2)
- {
- total += activation_info[i].value;
- break;
- }
+ const activation_type* const act_ptr = find_activation_info(o_ptr);
+ if (act_ptr) {
+ total += act_ptr->value;
}
}
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);
}
o_ptr->dd = k_ptr->dd;
o_ptr->ds = k_ptr->ds;
+ /* Default activation */
+ if (k_ptr->act_idx > 0) o_ptr->xtra2 = k_ptr->act_idx;
+
/* Hack -- worthless items are always "broken" */
if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
add_flag(o_ptr->art_flags, TR_RES_POIS);
break;
case EGO_ELVENKIND:
+ case EGO_URUKISH:
break;
case EGO_DWARVEN:
if (o_ptr->tval != TV_HARD_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);
+ break;
+ }
+ case EGO_DRUID:
+ if (o_ptr->tval != TV_SOFT_ARMOR)
+ {
+ okay_flag = FALSE;
+ break;
+ }
+ else
+ {
break;
}
}
if (o_ptr->dd > 9) o_ptr->dd = 9;
}
+ /* Hack -- apply activatin index if needed */
+ 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))
{
}
+/*
+ * Scatter some "amusing" objects near the player
+ */
+
+#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 */
+
+typedef struct
+{
+ int tval;
+ int sval;
+ int prob;
+ byte flag;
+} amuse_type;
+
+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 }
+};
+
+void amusement(int y1, int x1, int num, bool known)
+{
+ object_type *i_ptr;
+ object_type object_type_body;
+ int n, t = 0;
+
+ for (n = 0; amuse_info[n].tval != 0; n++)
+ {
+ t += amuse_info[n].prob;
+ }
+
+ /* Acquirement */
+ while (num)
+ {
+ int i, k_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;
+ }
+
+ /* Get local object */
+ i_ptr = &object_type_body;
+
+ /* Wipe the object */
+ object_wipe(i_ptr);
+
+ /* Wipe the object */
+ 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(i_ptr, k_idx);
+ if (a_idx) i_ptr->name1 = a_idx;
+ apply_magic(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(i_ptr);
+ object_known(i_ptr);
+ }
+
+ /* Paranoia - reroll if nothing */
+ if (!(i_ptr->k_idx)) continue;
+
+ /* Drop the object */
+ (void)drop_near(i_ptr, -1, y1, x1);
+
+ num--;
+ }
+}
+
+
#define MAX_NORMAL_TRAPS 18
/* See init_feat_variables() in init2.c */
else strcpy(o_name, "body"); /* Warning ability without item */
msg_format("Your %s pulsates sharply!", o_name);
#endif
- disturb(0, 0);
+ disturb(0, 1);
#ifdef JP
return get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©");
#else
else strcpy(o_name, "body"); /* Warning ability without item */
msg_format("Your %s pulsates!", o_name);
#endif
- disturb(0, 0);
+ disturb(0, 1);
#ifdef JP
return get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©");
#else
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 (!observe)
{
-#ifdef JP
- msg_print("¥¨¥Ã¥»¥ó¥¹¤ÏÃê½Ð¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£");
-#else
- msg_print("You were not able to extract any essence.");
-#endif
+ msg_print(_("¥¨¥Ã¥»¥ó¥¹¤ÏÃê½Ð¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", "You were not able to extract any essence."));
}
else
{
-#ifdef JP
- msg_print("Ãê½Ð¤·¤¿¥¨¥Ã¥»¥ó¥¹:");
-#else
- msg_print("Extracted essences:");
-#endif
+ msg_print(_("Ãê½Ð¤·¤¿¥¨¥Ã¥»¥ó¥¹:", "Extracted essences:"));
+
for (i = 0; essence_name[i]; i++)
{
if (!essence_name[i][0]) continue;
p_ptr->magic_num1[i] += drain_value[i];
p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
msg_print(NULL);
- msg_format("%s...%d", essence_name[i], drain_value[i]);
+ msg_format("%s...%d%s", essence_name[i], drain_value[i], _("¡£", ". "));
}
}
+ /* Apply autodestroy/inscription to the drained item */
+ autopick_alter_item(item, TRUE);
+
/* Combine the pack */
p_ptr->notice |= (PN_COMBINE | PN_REORDER);
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;
+ }
+}