diff -r -N -u angband-orig/lib/edit/k_info.txt angband-283/lib/edit/k_info.txt --- angband-orig/lib/edit/k_info.txt Fri Jan 30 00:47:14 1998 +++ angband-283/lib/edit/k_info.txt Mon Dec 6 22:06:00 1999 @@ -201,6 +201,14 @@ ## XXX 29 XXX ## +N:29:& Arquebus~ +G:}:u +I:19:2:0 +W:30:0:140:300 +A:30/1 +P:0:2d10:0:0:0 +F:SHOW_MODS | GUN + ##### Edged Weapons ##### diff -r -N -u angband-orig/src/cmd2.c angband-283/src/cmd2.c --- angband-orig/src/cmd2.c Fri Feb 6 04:10:31 1998 +++ angband-283/src/cmd2.c Sun Dec 5 23:34:58 1999 @@ -2215,6 +2215,7 @@ int i, j, y, x, ty, tx; int tdam, tdis, thits, tmul; int bonus, chance; + u32b j_f1, j_f2, j_f3; object_type *o_ptr; object_type *j_ptr; @@ -2270,6 +2271,7 @@ /* Get a direction (or cancel) */ if (!get_aim_dir(&dir)) return; + object_flags(j_ptr, &j_f1, &j_f2, &j_f3); /* Get local object */ i_ptr = &object_type_body; @@ -2315,7 +2317,24 @@ tdis = 10; /* Base damage from thrown object plus launcher bonus */ - tdam = damroll(i_ptr->dd, i_ptr->ds) + i_ptr->to_d + j_ptr->to_d; + if (j_f1 & TR1_GUN) + { + tdam = damroll_extra(j_ptr->dd, j_ptr->ds) + i_ptr->to_d + j_ptr->to_d; + if (rand_int(20) == 0) + { + /* Gun explodes */ + object_desc(o_name, j_ptr, FALSE, 3); + msg_format("%s explodes.", o_name); + inven_item_increase(INVEN_BOW, -1); + inven_item_optimize(INVEN_BOW); + take_hit(tdam, "backfire"); + return ; + } + } + else + { + tdam = damroll(i_ptr->dd, i_ptr->ds) + i_ptr->to_d + j_ptr->to_d; + } /* Actually "fire" the object */ bonus = (p_ptr->to_h + i_ptr->to_h + j_ptr->to_h); diff -r -N -u angband-orig/src/defines.h angband-283/src/defines.h --- angband-orig/src/defines.h Wed Feb 11 06:30:28 1998 +++ angband-283/src/defines.h Sun Dec 5 22:49:19 1999 @@ -1056,6 +1056,7 @@ #define SV_LONG_BOW 13 /* (x3) */ #define SV_LIGHT_XBOW 23 /* (x3) */ #define SV_HEAVY_XBOW 24 /* (x4) */ +#define SV_ARQUEBUS 3 /* The "sval" codes for TV_DIGGING */ #define SV_SHOVEL 1 @@ -1859,7 +1860,7 @@ #define TR1_SLAY_GIANT 0x00400000L /* Weapon slays giant */ #define TR1_SLAY_DRAGON 0x00800000L /* Weapon slays dragon */ #define TR1_KILL_DRAGON 0x01000000L /* Weapon kills dragon */ -#define TR1_XXX5 0x02000000L +#define TR1_GUN 0x02000000L #define TR1_XXX6 0x04000000L #define TR1_XXX7 0x08000000L #define TR1_BRAND_ACID 0x10000000L /* Weapon has acid brand */ diff -r -N -u angband-orig/src/externs.h angband-283/src/externs.h --- angband-orig/src/externs.h Mon Feb 9 01:49:44 1998 +++ angband-283/src/externs.h Sun Dec 5 22:11:45 1999 @@ -654,6 +654,7 @@ extern void pause_line(int row); extern void request_command(bool shopping); extern uint damroll(uint num, uint sides); +extern uint damroll_extra(uint num, uint sides); extern uint maxroll(uint num, uint sides); extern bool is_a_vowel(int ch); diff -r -N -u angband-orig/src/init1.c angband-283/src/init1.c --- angband-orig/src/init1.c Mon Feb 9 01:12:39 1998 +++ angband-283/src/init1.c Sun Dec 5 22:53:02 1999 @@ -398,7 +398,7 @@ "SLAY_GIANT", "SLAY_DRAGON", "KILL_DRAGON", - "XXX5", + "GUN", "XXX6", "XXX7", "BRAND_ACID", diff -r -N -u angband-orig/src/object1.c angband-283/src/object1.c --- angband-orig/src/object1.c Wed Feb 11 06:30:29 1998 +++ angband-283/src/object1.c Sun Dec 5 23:16:34 1999 @@ -1517,15 +1517,28 @@ /* Bows */ case TV_BOW: { - /* Hack -- Extract the "base power" */ - power = (o_ptr->sval % 10); + if (f1 & TR1_GUN) + { + /* Append a "damage" string */ + object_desc_chr_macro(t, ' '); + object_desc_chr_macro(t, p1); + object_desc_num_macro(t, o_ptr->dd); + object_desc_chr_macro(t, 'd'); + object_desc_num_macro(t, o_ptr->ds); + object_desc_chr_macro(t, p2); + } + else + { + /* Hack -- Extract the "base power" */ + power = (o_ptr->sval % 10); - /* Append a "power" string */ - object_desc_chr_macro(t, ' '); - object_desc_chr_macro(t, p1); - object_desc_chr_macro(t, 'x'); - object_desc_num_macro(t, power); - object_desc_chr_macro(t, p2); + /* Append a "power" string */ + object_desc_chr_macro(t, ' '); + object_desc_chr_macro(t, p1); + object_desc_chr_macro(t, 'x'); + object_desc_num_macro(t, power); + object_desc_chr_macro(t, p2); + } /* All done */ break; diff -r -N -u angband-orig/src/util.c angband-283/src/util.c --- angband-orig/src/util.c Wed Feb 11 06:30:29 1998 +++ angband-283/src/util.c Mon Dec 6 14:23:35 1999 @@ -3195,6 +3195,24 @@ return (sum); } +/* + * Generates damage for "2d6" style dice rolls + * Reroll dice with maximum damage. + */ +uint damroll_extra(uint num, uint sides) +{ + int i, sum = 0; + int roll; + for (i = 0; i < num; i++) + { + roll = (rand_int(sides) + 1); + if (roll == sides) + num++; + sum += roll; + } + return (sum); +} + /* * Same as above, but always maximal diff -r -N -u angband-orig/src/xtra1.c angband-283/src/xtra1.c --- angband-orig/src/xtra1.c Wed Feb 11 06:30:29 1998 +++ angband-283/src/xtra1.c Sun Dec 5 22:54:47 1999 @@ -2281,6 +2281,14 @@ p_ptr->ammo_mult = 4; break; } + + /* Arquebus and Bolt */ + case SV_ARQUEBUS: + { + p_ptr->ammo_tval = TV_SHOT; + p_ptr->ammo_mult = 4; + break; + } } /* Apply special flags */