--- src/apply.c.orig	Thu Aug  3 15:30:51 2000
+++ src/apply.c	Mon Jan  8 23:15:55 2001
@@ -998,6 +998,7 @@
 
 	if (obj->lamplit) {
 	    if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP ||
+		    obj->otyp == ORB_OF_LIGHT ||
 		    obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL) {
 		(void) get_obj_location(obj, &x, &y, 0);
 		if (obj->where == OBJ_MINVENT ? cansee(x,y) : !Blind)
@@ -1024,6 +1025,8 @@
 		if(obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP ||
 				obj->otyp == BRASS_LANTERN)
 		    pline("%s lamp is now off.", Shk_Your(buf, obj));
+		else if (obj->otyp = ORB_OF_LIGHT)
+		    pline ("%s orb's light fades.", Shk_Your(buf, obj));
 		else
 		    You("snuff out %s.", yname(obj));
 		end_burn(obj, TRUE);
@@ -1047,6 +1050,11 @@
 				obj->otyp == BRASS_LANTERN) {
 		    check_unpaid(obj);
 		    pline("%s lamp is now on.", Shk_Your(buf, obj));
+		} else if (obj->otyp == ORB_OF_LIGHT) {
+		    check_unpaid(obj);
+		    pline("%s orb glows with magical light.",
+			  Shk_Your(buf, obj));
+		    makeknown(ORB_OF_LIGHT);
 		} else {	/* candle(s) */
 		    pline("%s flame%s burn%s%s",
 			s_suffix(Yname2(obj)),
@@ -2502,6 +2510,7 @@
 	case OIL_LAMP:
 	case MAGIC_LAMP:
 	case BRASS_LANTERN:
+	case ORB_OF_LIGHT:
 		use_lamp(obj);
 		break;
 	case POT_OIL:
--- src/invent.c.orig	Tue Dec  5 22:43:08 2000
+++ src/invent.c	Sun Dec 31 21:05:23 2000
@@ -782,6 +782,7 @@
 		    (!otmp->oartifact && !objects[otyp].oc_unique &&
 		     (otyp != FAKE_AMULET_OF_YENDOR || otmp->known) &&
 		     otyp != CRYSTAL_BALL &&	/* #invoke synonym for apply */
+		     otyp != ORB_OF_LIGHT &&
 		   /* note: presenting the possibility of invoking non-artifact
 		      mirrors and/or lamps is a simply a cruel deception... */
 		     otyp != MIRROR && otyp != MAGIC_LAMP &&
--- src/light.c.orig	Wed Feb 16 16:50:39 2000
+++ src/light.c	Sun Dec 31 21:08:10 2000
@@ -491,6 +491,7 @@
 		(  obj->otyp == MAGIC_LAMP
 		|| obj->otyp == BRASS_LANTERN
 		|| obj->otyp == OIL_LAMP
+		|| obj->otyp == ORB_OF_LIGHT
 		|| obj->otyp == CANDELABRUM_OF_INVOCATION
 		|| obj->otyp == TALLOW_CANDLE
 		|| obj->otyp == WAX_CANDLE
--- src/mkobj.c.orig	Fri Aug  4 19:39:04 2000
+++ src/mkobj.c	Sun Dec 31 21:11:59 2000
@@ -484,6 +484,9 @@
 					otmp->lamplit = 0;
 					blessorcurse(otmp, 2);
 					break;
+		case ORB_OF_LIGHT:	otmp->lamplit = 0;
+					blessorcurse(otmp, 5);
+					break;
 		case CHEST:
 		case LARGE_BOX:		otmp->olocked = !!(rn2(5));
 					otmp->otrapped = !(rn2(10));
--- src/objects.c.orig	Mon Feb 21 18:36:26 2000
+++ src/objects.c	Sun Dec 31 20:42:51 2000
@@ -599,6 +599,8 @@
 TOOL("brass lantern", (char *)0,1, 0, 0, 0,  30, 30,  12, COPPER, CLR_YELLOW),
 TOOL("oil lamp", "lamp",        0, 0, 0, 0,  45, 20,  10, COPPER, CLR_YELLOW),
 TOOL("magic lamp", "lamp",      0, 0, 1, 0,  15, 20,  50, COPPER, CLR_YELLOW),
+TOOL("orb of light", "glass orb",
+				0, 0, 1, 0,  15, 20,  60, GLASS, HI_GLASS),
 /* other tools */
 #ifdef TOURIST
 TOOL("expensive camera", (char *)0,
@@ -620,7 +622,7 @@
 #endif
 TOOL("stethoscope", (char *)0,  1, 0, 0, 0,  25,  4,  75, IRON, HI_METAL),
 TOOL("tinning kit", (char *)0,  1, 0, 0, 1,  15,100,  30, IRON, HI_METAL),
-TOOL("tin opener", (char *)0,   1, 0, 0, 0,  35,  4,  30, IRON, HI_METAL),
+TOOL("tin opener", (char *)0,   1, 0, 0, 0,  30,  4,  30, IRON, HI_METAL),
 TOOL("can of grease", (char *)0,1, 0, 0, 1,  15, 15,  20, IRON, HI_METAL),
 TOOL("figurine", (char *)0,     1, 0, 1, 0,  25, 50,  80, MINERAL, HI_MINERAL),
 TOOL("magic marker", (char *)0, 1, 0, 1, 1,  15,  2,  50, PLASTIC, CLR_RED),
@@ -628,7 +630,7 @@
 TOOL("land mine",(char *)0,     1, 0, 0, 0,   0,300, 180, IRON, CLR_RED),
 TOOL("beartrap", (char *)0,     1, 0, 0, 0,   0,200,  60, IRON, HI_METAL),
 /* instruments */
-TOOL("tin whistle", "whistle",  0, 0, 0, 0, 100,  3,  10, METAL, HI_METAL),
+TOOL("tin whistle", "whistle",  0, 0, 0, 0,  90,  3,  10, METAL, HI_METAL),
 TOOL("magic whistle", "whistle",0, 0, 1, 0,  30,  3,  10, METAL, HI_METAL),
 /* "If tin whistles are made out of tin, what do they make foghorns out of?" */
 TOOL("wooden flute", "flute",   0, 0, 0, 0,   4,  5,  12, WOOD, HI_WOOD),
--- src/objnam.c.orig	Thu Aug  3 15:25:24 2000
+++ src/objnam.c	Sun Dec 31 21:13:48 2000
@@ -623,6 +623,7 @@
 				!obj->lamplit ? " attached" : ", lit");
 			break;
 		} else if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP ||
+			obj->otyp == ORB_OF_LIGHT ||
 			obj->otyp == BRASS_LANTERN || Is_candle(obj)) {
 			if (Is_candle(obj) &&
 			    obj->age < 20L * (long)objects[obj->otyp].oc_cost)
@@ -2141,6 +2142,7 @@
 
 	if (islit &&
 		(typ == OIL_LAMP || typ == MAGIC_LAMP || typ == BRASS_LANTERN ||
+		 typ == ORB_OF_LIGHT ||
 		 Is_candle(otmp) || typ == POT_OIL)) {
 	    place_object(otmp, u.ux, u.uy);  /* make it viable light source */
 	    begin_burn(otmp, FALSE);
--- src/shk.c.orig	Sat Jul 15 21:49:54 2000
+++ src/shk.c	Sun Dec 31 21:23:59 2000
@@ -3410,6 +3410,7 @@
 	} else if(otmp->otyp == CRYSTAL_BALL ||		 /* 1 - 5 */
 		  otmp->otyp == OIL_LAMP ||		 /* 1 - 10 */
 		  otmp->otyp == BRASS_LANTERN ||
+		  otmp->otyp == ORB_OF_LIGHT ||
 		 (otmp->otyp >= MAGIC_FLUTE &&
 		  otmp->otyp <= DRUM_OF_EARTHQUAKE) ||	 /* 5 - 9 */
 		  otmp->oclass == WAND_CLASS) {		 /* 3 - 11 */
--- src/shknam.c.orig	Wed Aug  9 14:38:03 2000
+++ src/shknam.c	Sun Dec 31 21:31:19 2000
@@ -194,7 +194,7 @@
 	    {{90, WEAPON_CLASS}, {10, ARMOR_CLASS}, {0, 0}}, shkweapons},
 	{"delicatessen", FOOD_CLASS, 5, D_SHOP,
 	    {{83, FOOD_CLASS}, {5, -POT_FRUIT_JUICE}, {4, -POT_BOOZE},
-	     {5, -POT_WATER}, {3, -ICE_BOX}}, shkfoods},
+	     {5, -POT_WATER}, {3, -ICE_BOX}, {0, 0}}, shkfoods},
 	{"jewelers", RING_CLASS, 3, D_SHOP,
 	    {{85, RING_CLASS}, {10, GEM_CLASS}, {5, AMULET_CLASS}, {0, 0}},
 	    shkrings},
@@ -214,8 +214,8 @@
 	 * loader.
 	 */
 	{"lighting store", TOOL_CLASS, 0, D_SHOP,
-	    {{32, -WAX_CANDLE}, {50, -TALLOW_CANDLE},
-	     {5, -BRASS_LANTERN}, {10, -OIL_LAMP}, {3, -MAGIC_LAMP}}, shklight},
+	    {{31, -WAX_CANDLE}, {48, -TALLOW_CANDLE}, {5, -BRASS_LANTERN},
+	     {10, -OIL_LAMP}, {3, -MAGIC_LAMP}, {3, -ORB_OF_LIGHT}}, shklight},
 	{(char *)0, 0, 0, 0, {{0, 0}, {0, 0}, {0, 0}}, 0}
 };
 
--- src/timeout.c.orig	Sat Jul 15 21:15:53 2000
+++ src/timeout.c	Sun Dec 31 21:35:41 2000
@@ -1011,6 +1011,7 @@
 
 	switch (obj->otyp) {
 	    case MAGIC_LAMP:
+	    case ORB_OF_LIGHT:
 		obj->lamplit = 1;
 		do_timer = FALSE;
 		break;
@@ -1094,7 +1095,8 @@
 
 	del_light_source(LS_OBJECT, (genericptr_t) obj);
 
-	if (obj->otyp == MAGIC_LAMP) timer_attached = FALSE;
+	if (obj->otyp == MAGIC_LAMP || obj->otyp == ORB_OF_LIGHT)
+	    timer_attached = FALSE;
 	if (timer_attached) {
 	    expire_time = stop_timer(BURN_OBJECT, (genericptr_t) obj);
 	    if (expire_time)
--- src/zap.c.orig	Fri Aug  4 20:23:29 2000
+++ src/zap.c	Sun Dec 31 21:40:41 2000
@@ -741,6 +741,7 @@
 	       obj->otyp != WAN_CANCELLATION &&
 		 /* can't cancel cancellation */
 		 obj->otyp != MAGIC_LAMP &&
+		 obj->otyp != ORB_OF_LIGHT &&
 		 obj->otyp != CANDELABRUM_OF_INVOCATION) {
 		costly_cancel(obj);
 		obj->spe = (obj->oclass == WAND_CLASS) ? -1 : 0;
--- include/mkroom.h.orig	Wed Jul  7 00:16:33 1999
+++ include/mkroom.h	Sun Dec 31 21:31:19 2000
@@ -30,7 +30,7 @@
 	struct itp {
 	    int iprob;		/* probability of an item type */
 	    int itype;	/* item type: if >=0 a class, if < 0 a specific item */
-	} iprobs[5];
+	} iprobs[6];
 	const char **shknms;	/* list of shopkeeper names for this type */
 };
 
--- win/share/objects.txt.orig	Thu Mar 23 18:11:51 2000
+++ win/share/objects.txt	Mon Jan  1 11:21:16 2001
@@ -3909,7 +3909,26 @@
   MMMMMMMMMMMMMMMM
   MMMMMMMMMMMMMMMM
 }
+# tile 99999 (glass orb / orb of light)
+{
+  MMMMMMMMMMMMMMMM
+  MMMMMMMMMMMMMMMM
+  MMMMMMMMMMMMMMMM
+  MMMMMMMMMMMMMMMM
+  MMMMMMMMMMMMMMMM
+  MMMMMBBBBMMMMMMM
+  MMMMBNBBBBMMMMMM
+  MMMMBBBBBBMMMMMM
+  MMMMBBBBBBMAAMMM
+  MMMMBBBBBBAAAAMM
+  MMMMCBBBBJAAAMMM
+  MMMCKKKKKJJAMMMM
+  MMMMKKKKJJAMMMMM
+  MMMMMMMMMMMMMMMM
+  MMMMMMMMMMMMMMMM
+  MMMMMMMMMMMMMMMM
+}
 # tile 205 (expensive camera)
 {
   MMMMMMMMMMMMMMMM
