diff -Nbaur -x '*~' -x '#*#' nethack-3.4.3/include/decl.h nethack-rusty/include/decl.h --- nethack-3.4.3/include/decl.h 2003-12-08 10:39:13.000000000 +1100 +++ nethack-rusty/include/decl.h 2005-12-05 14:12:52.000000000 +1100 @@ -210,6 +210,12 @@ boolean down, chew, warned, quiet; } digging; +E NEARDATA struct tinning_info { + struct obj *corpse; + struct obj *kit; + int usedtime, reqtime; +} tinning; + E NEARDATA long moves, monstermoves; E NEARDATA long wailmsg; diff -Nbaur -x '*~' -x '#*#' nethack-3.4.3/src/apply.c nethack-rusty/src/apply.c --- nethack-3.4.3/src/apply.c 2003-12-08 10:39:13.000000000 +1100 +++ nethack-rusty/src/apply.c 2005-12-05 14:21:16.000000000 +1100 @@ -1374,15 +1374,56 @@ return 1; } +STATIC_PTR +int +make_tin() /* called during each move whilst tinning a corpse */ +{ + register struct obj *can; + if(!carried(tinning.corpse) && !obj_here(tinning.corpse, u.ux, u.uy)) { + return(0); /* perhaps it was stolen? */ + } + if(!carried(tinning.kit)) { + return(0); /* perhaps it was stolen? */ + } + tinning.usedtime++; + if(tinning.usedtime < tinning.reqtime) + return(1); /* still busy */ + + if ((can = mksobj(TIN, FALSE, FALSE)) != 0) { + struct obj *corpse = tinning.corpse; + struct obj *kit = tinning.kit; + + static const char you_buy_it[] = "You tin it, you bought it!"; + + can->corpsenm = corpse->corpsenm; + can->cursed = kit->cursed; + can->blessed = kit->blessed; + can->owt = weight(can); + can->known = 1; + can->spe = -1; /* Mark tinned tins. No spinach allowed... */ + + if (carried(corpse)) { + if (corpse->unpaid) + verbalize(you_buy_it); + useup(corpse); + } else { + if (costly_spot(corpse->ox, corpse->oy) && !corpse->no_charge) + verbalize(you_buy_it); + useupf(corpse, 1L); + } + can = hold_another_object(can, "You make, but cannot pick up, %s.", + doname(can), (const char *)0); + } else impossible("Tinning failed."); + return(0); +} + STATIC_OVL void use_tinning_kit(obj) register struct obj *obj; { - register struct obj *corpse, *can; + register struct obj *corpse; + int i, rust; - /* This takes only 1 move. If this is to be changed to take many - * moves, we've got to deal with decaying corpses... - */ if (obj->spe <= 0) { You("seem to be out of tins."); return; @@ -1418,27 +1459,31 @@ } consume_obj_charge(obj, TRUE); - if ((can = mksobj(TIN, FALSE, FALSE)) != 0) { - static const char you_buy_it[] = "You tin it, you bought it!"; + /* Monsters with rust corrode attacks will damage */ + /* your tinning kit. */ - can->corpsenm = corpse->corpsenm; - can->cursed = obj->cursed; - can->blessed = obj->blessed; - can->owt = weight(can); - can->known = 1; - can->spe = -1; /* Mark tinned tins. No spinach allowed... */ - if (carried(corpse)) { - if (corpse->unpaid) - verbalize(you_buy_it); - useup(corpse); - } else { - if (costly_spot(corpse->ox, corpse->oy) && !corpse->no_charge) - verbalize(you_buy_it); - useupf(corpse, 1L); + rust = 0; + for (i = 0; i < NATTK; i++) { + int adtyp = mons[corpse->corpsenm].mattk[i].adtyp; + if (adtyp == AD_CORR) { + rust = 3; + break; } - can = hold_another_object(can, "You make, but cannot pick up, %s.", - doname(can), (const char *)0); - } else impossible("Tinning failed."); + else if (adtyp == AD_RUST) { + rust = 1; + break; + } + } + if (rust) { + rust_dmg(obj, xname(obj), rust, FALSE, &youmonst); + } + + tinning.corpse = corpse; + tinning.kit = obj; + tinning.usedtime = 0; + tinning.reqtime = 1 + obj->oeroded; + set_occupation(make_tin, "tinning the corpse", 0); + } void diff -Nbaur -x '*~' -x '#*#' nethack-3.4.3/src/decl.c nethack-rusty/src/decl.c --- nethack-3.4.3/src/decl.c 2003-12-08 10:39:13.000000000 +1100 +++ nethack-rusty/src/decl.c 2005-12-05 14:12:41.000000000 +1100 @@ -111,6 +111,7 @@ NEARDATA struct multishot m_shot = { 0, 0, STRANGE_OBJECT, FALSE }; NEARDATA struct dig_info digging; +NEARDATA struct tinning_info tinning; NEARDATA dungeon dungeons[MAXDUNGEON]; /* ini'ed by init_dungeon() */ NEARDATA s_level *sp_levchn; @@ -271,6 +272,7 @@ "lockdir", "configdir", "troubledir" }; #endif + /* dummy routine used to force linkage */ void decl_init() diff -Nbaur -x '*~' -x '#*#' nethack-3.4.3/src/dig.c nethack-rusty/src/dig.c --- nethack-3.4.3/src/dig.c 2003-12-08 10:39:13.000000000 +1100 +++ nethack-rusty/src/dig.c 2005-12-05 13:56:21.000000000 +1100 @@ -1440,6 +1440,8 @@ } else if (obj == uquiver) { uqwepgone(); stop_occupation(); + } else if (obj == tinning.corpse) { + stop_occupation(); } } else if (obj->where == OBJ_MINVENT && obj->owornmask) { if (obj == MON_WEP(obj->ocarry)) { diff -Nbaur -x '*~' -x '#*#' nethack-3.4.3/src/eat.c nethack-rusty/src/eat.c --- nethack-3.4.3/src/eat.c 2003-12-08 10:39:13.000000000 +1100 +++ nethack-rusty/src/eat.c 2005-12-05 14:17:26.000000000 +1100 @@ -155,6 +155,7 @@ static NEARDATA struct { struct obj *tin; int usedtime, reqtime; + struct obj *opener; } tin; static NEARDATA struct { @@ -1051,6 +1052,26 @@ else if (tin.tin->spe == -1 && !tin.tin->blessed && !rn2(7)) r = ROTTEN_TIN; /* some homemade tins go bad */ which = 0; /* 0=>plural, 1=>as-is, 2=>"the" prefix */ + + /* Monsters with rust corrode attacks will damage */ + /* your tinning kit. */ + + if (tin.opener) { + int rust = 0; + int i; + for (i = 0; i < NATTK; i++) { + int adtyp = mons[tin.tin->corpsenm].mattk[i].adtyp; + if (adtyp == AD_CORR) { + rust = 3; + break; + } + else if (adtyp == AD_RUST) { + rust = 1; + break; + } + } + if (rust) rust_dmg(uwep, xname(uwep), rust, FALSE, &youmonst); + } if (Hallucination) { what = rndmonnam(); } else { @@ -1134,6 +1155,7 @@ register struct obj *otmp; { register int tmp; + register struct obj *opener = (struct obj *) 0;; if (metallivorous(youmonst.data)) { You("bite right into the metal tin..."); @@ -1164,8 +1186,17 @@ default: goto no_opener; } + opener = uwep; + /* MRKR: Rusty tools take longer */ + /* Enchanted tools take less */ + + tmp += uwep->oeroded; + tmp -= uwep->spe; + if (tmp < 1) tmp = 1; + pline("Using your %s you try to open the tin.", aobjnam(uwep, (char *)0)); + } else { no_opener: pline("It is not so easy to open this tin."); @@ -1184,6 +1215,7 @@ tin.reqtime = tmp; tin.usedtime = 0; tin.tin = otmp; + tin.opener = opener; set_occupation(opentin, "opening the tin", 0); return; } diff -Nbaur -x '*~' -x '#*#' nethack-3.4.3/src/read.c nethack-rusty/src/read.c --- nethack-3.4.3/src/read.c 2003-12-08 10:39:13.000000000 +1100 +++ nethack-rusty/src/read.c 2005-12-05 14:04:57.000000000 +1100 @@ -958,7 +958,10 @@ */ break; case SCR_ENCHANT_WEAPON: - if(uwep && (uwep->oclass == WEAPON_CLASS || is_weptool(uwep)) + if(uwep && (uwep->oclass == WEAPON_CLASS + || is_weptool(uwep) + || uwep->otyp == TINNING_KIT + || uwep->otyp == TIN_OPENER) && confused) { /* oclass check added 10/25/86 GAN */ uwep->oerodeproof = !(sobj->cursed);