diff -Naur angband-3.0.5/TODO angband-3.0.5.new/TODO
--- angband-3.0.5/TODO	Sun Feb 22 22:34:47 2004
+++ angband-3.0.5.new/TODO	Thu Aug  5 18:38:10 2004
@@ -36,7 +36,6 @@
 - Replace the maximize mode option with a "half-maximized" mode.
 - Add a command to display the 'time of day'.
 - Mimics should be true objects until the player steps next to them.
-- Throwing potions should cause the potions effect on the target.
 - Add race-specific starting equipment.
 - Extend the use of scripts for customization.
 - Improve the script-debugger.
diff -Naur angband-3.0.5/src/cmd1.c angband-3.0.5.new/src/cmd1.c
--- angband-3.0.5/src/cmd1.c	Sat Mar  1 01:23:39 2003
+++ angband-3.0.5.new/src/cmd1.c	Thu Aug  5 18:00:56 2004
@@ -135,7 +135,7 @@
  * Note that most brands and slays are x3, except Slay Animal (x2),
  * Slay Evil (x2), and Kill dragon (x5).
  */
-int tot_dam_aux(const object_type *o_ptr, int tdam, const monster_type *m_ptr)
+int tot_dam_aux(const object_type *o_ptr, int tdam, monster_type *m_ptr)
 {
 	int mult = 1;
 
@@ -147,7 +147,9 @@
 	/* Extract the flags */
 	object_flags(o_ptr, &f1, &f2, &f3);
 
-	/* Some "weapons" and "ammo" do extra damage */
+	/* Some "weapons" and "ammo" do extra damage,
+           potions do their stuff on monsters.
+           Finally a use for potions of blindness!  */
 	switch (o_ptr->tval)
 	{
 		case TV_SHOT:
@@ -387,6 +389,363 @@
 
 			break;
 		}
+                case TV_POTION:
+                {
+                        bool seen = (m_ptr->ml);
+                        /* For printing restiance notes */
+                        cptr note = NULL;
+                        
+                        /* Monster name */
+                        char m_name[80];
+                        
+                        /* Get the monster name */
+                        monster_desc(m_name, sizeof(m_name), m_ptr, 0);
+                        
+                        /* Switch on the potion type */
+                        switch (o_ptr->sval) {
+				
+                                case SV_POTION_SLOWNESS:
+				{
+					/* Powerful monsters can resist */
+					if ((r_ptr->flags1 & (RF1_UNIQUE)) ||
+					    (r_ptr->level > randint((tdam - 10) < 1 ? 1 : (tdam - 10)) + 10))
+					{
+						note = " is unaffected!";
+					}
+
+					/* Normal monsters slow down */
+					else
+					{
+						if (m_ptr->mspeed > 60) m_ptr->mspeed -= 10;
+						note = " starts moving slower.";
+					}
+
+					/* No "real" damage
+                                        Mega-Hack: prevent msg (monster) is unnaffected */
+                                        tdam = 1;
+					break;
+				}
+                                
+                                case SV_POTION_POISON:
+                                {
+                                        /* Notice immunity */
+                                        if (r_ptr->flags3 & (RF3_IM_POIS))
+                                        {
+                                                note = " resists";
+                                                if (seen) l_ptr->flags3 |= (RF3_IM_POIS);
+                                        }
+                                        /* Otherwise, take the damage */
+                                        else
+                                        {
+                                                if (mult < 3) mult = 3;
+						note=" is affected by the potion!";
+                                        }
+                                        break;
+                                }
+                                
+                                case SV_POTION_BLINDNESS:
+                                {
+                                        /* Monsters can't be blinded, so act as darkness instead 
+                                           Notice immunity */
+                                        if (r_ptr->flags4 & (RF4_BR_DARK))
+                                        {
+                                                note = " resists.";
+                                                mult = 1; /* Still do broken bottle damage */
+                                                if (seen) l_ptr->flags4 |= (RF4_BR_DARK);
+                                        }
+                                        /* Otherwise, take the damage */ 
+                                        else 
+                                        {
+                                                if (mult < 4) mult = 4;
+                                                note=" is affected by the potion!";
+					}
+				        break;
+                                }
+                                
+                                case SV_POTION_CONFUSION:
+                                {
+					int do_conf;
+					/* These calculations (pulled from spell1.c) originally used
+					   r (distance). I always throw from right next to the monster,
+					   so I use 1. This code also deals damage differntly:
+					   x2 for normal, x1 for resists somewhat and x0 for resists. */
+					do_conf = (11 + randint(15)) / 2;
+					if (r_ptr->flags4 & (RF4_BR_CONF))
+					{
+						note = " resists.";
+						mult = 0;
+					}
+					else if (r_ptr->flags3 & (RF3_NO_CONF))
+					{
+						note = " resists somewhat.";
+						mult = 1;
+					}
+					else
+					{
+						mult = 2;
+					}
+                                        
+                                        /* Confuse monster */
+					if (do_conf &&
+	         			    !(r_ptr->flags4 & (RF4_BR_CHAO)) &&
+					    !(r_ptr->flags4 & (RF4_BR_CONF)) &&
+					    !(r_ptr->flags3 & (RF3_NO_CONF)))
+					{
+						int tmp = 0;
+
+						/* Already partially confused */
+						if (m_ptr->confused)
+						{
+							note = " looks more confused.";
+							tmp = m_ptr->confused + (do_conf / 2);
+						}
+
+						/* Was not confused */
+						else
+						{
+							note = " looks confused.";
+							tmp = do_conf;
+						}
+
+					/* Apply confusion */
+					m_ptr->confused = (tmp < 200) ? tmp : 200;
+					}
+					break;
+				}
+                                
+                                case SV_POTION_SLEEP:
+                                {
+
+                                    /* Attempt a saving throw */
+                                    if ((r_ptr->flags1 & (RF1_UNIQUE)) ||
+                                        (r_ptr->flags3 & (RF3_NO_SLEEP)) ||
+                                        (r_ptr->level > randint((tdam - 10) < 1 ? 1 : (tdam - 10)) + 10))
+                                    {
+                                            /* Memorize a flag */
+                                            if (r_ptr->flags3 & (RF3_NO_SLEEP))
+                                            {
+                                                    if (seen) l_ptr->flags3 |= (RF3_NO_SLEEP);
+                                            }
+    
+                                            /* No obvious effect */
+                                            note = " is unaffected!";
+                                    }
+                                    else
+                                    {
+                                            /* Go to sleep (much) later */
+                                            note = " falls asleep!";
+                                            m_ptr->csleep = 500;
+                                    }
+
+                                    /* No "real" damage
+                                    Mega-Hack: prevent msg (monster) is unnaffected */
+                                    tdam = 1;
+                                    break;
+                                }
+                                
+                        	case SV_POTION_SPEED:
+				{
+					/* Speed up */
+					if (m_ptr->mspeed < 150) m_ptr->mspeed += 10;
+					note = " starts moving faster.";
+
+					/* No "real" damage
+                                        Mega-Hack: prevent msg (monster) is unnaffected */
+                                        tdam = 1;
+					break;
+				}
+                                
+                                case SV_POTION_RUINATION:
+                                {
+                                        
+                                        /* Do damage */
+                                        tdam += damroll(10, 10);
+                                        mult = 1;
+                                        break;
+                                        
+                                }
+                                case SV_POTION_DETONATIONS:
+                                {
+                                        /* Print a message */
+                                        msg_print("Massive explosions rupture the monster's body!");
+                                        /* Do the damage */
+                                        tdam += damroll(50, 20);
+                                        mult = 1;
+                                        break;
+                                }
+                                case SV_POTION_DEATH:
+                                {
+                                        /* Do the damage */
+                                        tdam += 5000;
+                                        mult = 1;
+                                        break;
+                                }
+                                case SV_POTION_BOLDNESS:
+                                {
+                                        /* Bolden monster */
+                                        m_ptr->monfear=0;
+                                        
+                                        /* No "real" damage
+                                        Mega-Hack: prevent msg (monster) is unnaffected */
+                                        tdam = 1;
+                                        break;
+                                        
+                                }
+                                
+                                case SV_POTION_HEROISM: 
+                                        m_ptr->monfear = 0;
+                                        /* flow through: they're close enough! (heroism should add 10 health) */
+                                case SV_POTION_CURE_LIGHT:
+                                {
+			
+                                        /* Wake up */
+                                        m_ptr->csleep = 0;
+
+                                        /* Heal */
+                                        m_ptr->hp += damroll(2,8);
+
+                                        /* No overflow */
+                                        if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
+
+
+                                        /* Message */
+                                        note = " looks healthier.";
+
+                                        /* No "real" damage
+                                        Mega-Hack: prevent msg (monster) is unnaffected */
+                                        m_ptr->hp++;
+                                        tdam = 1;
+                                        break;
+	
+                                }
+                                
+                                case SV_POTION_BERSERK_STRENGTH:
+                                        m_ptr->monfear = 0;
+                                        /* flow through: they're close enough (Berserk strength should add 30 health) */
+                                case SV_POTION_CURE_SERIOUS:
+                                {
+			
+                                        /* Wake up */
+                                        m_ptr->csleep = 0;
+
+                                        /* Heal */
+                                        m_ptr->hp += damroll(4,8);
+                                        m_ptr->confused = 0;
+
+                                        /* No overflow */
+                                        if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
+
+
+                                        /* Message */
+                                        note = " looks healthier.";
+
+                                         /* No "real" damage
+                                        Mega-Hack: prevent msg (monster) is unnaffected */
+                                        m_ptr->hp++;
+                                        tdam = 1;
+                                        break;
+
+                                }
+
+                                case SV_POTION_CURE_CRITICAL:
+                                {
+                                     
+                                        /* Wake up */
+                                        m_ptr->csleep = 0;
+
+                                        /* Heal */
+                                        m_ptr->hp += damroll(6,8);
+                                        m_ptr->confused = 0;
+                                        m_ptr->stunned=0;
+
+                                        /* No overflow */
+                                        if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
+
+                                        /* Message */
+                                        note = " looks healthier.";
+
+                                         /* No "real" damage
+                                        Mega-Hack: prevent msg (monster) is unnaffected */
+                                        m_ptr->hp++;
+                                        tdam = 1;
+                                        break;
+
+                                }
+                                
+                                case SV_POTION_HEALING:
+                                {
+                                        /* Wake up */
+                                        m_ptr->csleep = 0;
+
+                                        /* Heal */
+                                        m_ptr->hp += 300;
+                                        m_ptr->confused = 0;
+                                        m_ptr->stunned=0;
+
+                                        /* No overflow */
+                                        if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
+
+                                        /* Message */
+                                        note = " looks healthier.";
+
+                                        /* No "real" damage
+                                        Mega-Hack: prevent msg (monster) is unnaffected */
+                                        m_ptr->hp++;
+                                        tdam = 1;
+                                        break;		
+                                }
+                                
+                                case SV_POTION_STAR_HEALING:
+                                {
+                                        /* Wake up */
+                                        m_ptr->csleep = 0;
+
+                                        /* Heal */
+                                        m_ptr->hp += 1200;
+                                        m_ptr->confused = 0;
+                                        m_ptr->stunned=0;
+
+                                        /* No overflow */
+                                        if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
+
+                                        /* Message */
+                                        note = " looks healthier.";
+
+                                         /* No "real" damage
+                                        Mega-Hack: prevent msg (monster) is unnaffected */
+                                        m_ptr->hp++;
+                                        tdam = 1;
+                                        break;
+                                }
+
+                                case SV_POTION_LIFE:
+                                {
+                                        msg_print("You see life flow through the monster!");
+                                        /* Wake up */
+                                        m_ptr->csleep = 0;
+
+                                        /* Heal */
+                                        m_ptr->hp += 5000;
+                                        m_ptr->confused = 0;
+                                        m_ptr->stunned = 0;
+                                        m_ptr->monfear = 0;
+
+                                        /* No overflow */
+                                        if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
+
+                                        /* Message */
+                                        note = " looks healthier.";
+
+                                         /* No "real" damage
+                                        Mega-Hack: prevent msg (monster) is unnaffected */
+                                        m_ptr->hp++;
+                                        tdam = 1;
+                                        break;
+                                }
+                        }
+                         /* Print out the effect on the monster */
+                        if (note) msg_format("%^s%s", m_name, note);
+                }
 	}
 
 
diff -Naur angband-3.0.5/src/externs.h angband-3.0.5.new/src/externs.h
--- angband-3.0.5/src/externs.h	Sat May  1 16:23:24 2004
+++ angband-3.0.5.new/src/externs.h	Thu Aug  5 18:29:47 2004
@@ -287,7 +287,7 @@
 extern bool test_hit(int chance, int ac, int vis);
 extern int critical_shot(int weight, int plus, int dam);
 extern int critical_norm(int weight, int plus, int dam);
-extern int tot_dam_aux(const object_type *o_ptr, int tdam, const monster_type *m_ptr);
+extern int tot_dam_aux(const object_type *o_ptr, int tdam, monster_type *m_ptr);
 extern void search(void);
 extern void py_pickup(int pickup);
 extern void hit_trap(int y, int x);
