OSDN Git Service

Thrown torches given pretty larger dice, fire brand, kill undead when them has fuel
authoriks <iks@0568b783-4c39-0410-ac80-bf13821ea2a2>
Mon, 18 Feb 2013 13:55:40 +0000 (13:55 +0000)
committeriks <iks@0568b783-4c39-0410-ac80-bf13821ea2a2>
Mon, 18 Feb 2013 13:55:40 +0000 (13:55 +0000)
src/cmd1.c
src/cmd2.c
src/externs.h
src/object2.c

index b7124ee..dfdd5ec 100644 (file)
@@ -230,6 +230,7 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, int mode, bo
 
        /* Extract the flags */
        object_flags(o_ptr, flgs);
+       torch_flags(o_ptr, flgs); /* torches has secret flags */
 
        if (!thrown)
        {
@@ -251,6 +252,7 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, int mode, bo
                case TV_POLEARM:
                case TV_SWORD:
                case TV_DIGGING:
+               case TV_LITE:
                {
                        /* Slay Animal */
                        if ((have_flag(flgs, TR_SLAY_ANIMAL)) &&
index c365b59..760c6f5 100644 (file)
@@ -4129,7 +4129,7 @@ bool do_cmd_throw_aux(int mult, bool boomerang, int shuriken)
        int i, j, y, x, ty, tx, prev_y, prev_x;
        int ny[19], nx[19];
        int chance, tdam, tdis;
-       int mul, div;
+       int mul, div, dd, ds;
        int cur_dis, visible;
 
        object_type forge;
@@ -4250,6 +4250,7 @@ bool do_cmd_throw_aux(int mult, bool boomerang, int shuriken)
 
        /* Extract the thrown object's flags. */
        object_flags(q_ptr, flgs);
+       torch_flags(q_ptr, flgs);
 
        /* Distribute the charges of rods/wands between the stacks */
        distribute_charges(o_ptr, q_ptr, 1);
@@ -4464,7 +4465,10 @@ bool do_cmd_throw_aux(int mult, bool boomerang, int shuriken)
                                }
 
                                /* Hack -- Base damage from thrown object */
-                               tdam = damroll(q_ptr->dd, q_ptr->ds);
+                               dd = q_ptr->dd;
+                               ds = q_ptr->ds;
+                               torch_dice(q_ptr, &dd, &ds); /* throwing a torch */
+                               tdam = damroll(dd, ds);
                                /* Apply special damage XXX XXX XXX */
                                tdam = tot_dam_aux(q_ptr, tdam, m_ptr, 0, TRUE);
                                tdam = critical_shot(q_ptr->weight, q_ptr->to_h, tdam);
@@ -4554,6 +4558,9 @@ bool do_cmd_throw_aux(int mult, bool boomerang, int shuriken)
                }
        }
 
+       /* decrease toach's fuel */
+       if (hit_body) torch_lost_fuel(q_ptr);
+
        /* Chance of breakage (during attacks) */
        j = (hit_body ? breakage_chance(q_ptr) : 0);
 
index ebfc91c..1884626 100644 (file)
@@ -1073,6 +1073,9 @@ extern void display_koff(int k_idx);
 extern object_type *choose_warning_item(void);
 extern bool process_warning(int xx, int yy);
 extern void do_cmd_kaji(bool only_browse);
+extern void torch_flags(object_type *o_ptr, u32b *flgs);
+extern void torch_dice(object_type *o_ptr, int *dd, int *ds);
+extern void torch_lost_fuel(object_type *o_ptr);
 
 /* racial.c */
 extern bool gain_magic(void);
index 1d9b8d1..a541130 100644 (file)
@@ -8615,3 +8615,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) = 2;
+                       (*ds) = 4;
+               }
+       }
+}
+
+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;
+       }
+}