Index: lib/pref/message.prf
===================================================================
--- lib/pref/message.prf	(revision 1980)
+++ lib/pref/message.prf	(arbetskopia)
@@ -9,26 +9,22 @@
 #
 # Format:
 # M:<message-type>:<color>
-#
-# Possible colors:
-# d = Black
-# w = White
-# s = Gray
-# o = Orange
-# r = Red
-# g = Green
-# b = Blue
-# u = Brown
-# D = Dark Gray
-# W = Light Gray
-# v = Violet
-# y = Yellow
-# R = Light Red
-# G = Light Green
-# B = Light Blue
-# U = Light Brown
 
+# d - 0  - Black         w - 1  - White         s - 2  - Slate
+# o - 3  - Orange        r - 4  - Red           g - 5  - Green
+# b - 6  - Blue          u - 7  - Umber         D - 8  - Light Dark
+# W - 9  - Light Slate   P - 10 - Light Purple  y - 11 - yellow
+# R - 12 - Light Red     G - 13 - Light Green   B - 14 - Light Blue
+# U - 15 - Light Umber   p - 16 - Purple        v - 17 - Violet
+# t - 18 - Teal          m - 19 - Mud           Y - 20 - Light Yellow
+# i - 21 - Magenta-Pink  T - 22 - Light Teal    V - 23 - Light Violet
+# I - 24 - Light Pink    M - 25 - Mustard       z - 26 - Blue Slate
+# Z - 27 - Deep Light Blue
 
+# I included all possible message types here for future-proofing, 
+# although some of them are only used as sound-effects at the moment. 
+# sound.cfg can be found in /lib/extra/sound (Twilight).
+
 # MSG_GENERIC
 M:0:w
 
@@ -41,7 +37,7 @@
 # MSG_FLEE
 M:3:w
 
-# MSG_DROP
+# MSG_DROP (sound only)
 M:4:w
 
 # MSG_KILL
@@ -56,28 +52,28 @@
 # MSG_STUDY
 M:8:w
 
-# MSG_TELEPORT
+# MSG_TELEPORT (sound only)
 M:9:w
 
-# MSG_SHOOT
+# MSG_SHOOT (sound only)
 M:10:w
 
-# MSG_QUAFF
+# MSG_QUAFF (sound only)
 M:11:w
 
-# MSG_ZAP
+# MSG_ZAP_ROD (sound only)
 M:12:w
 
-# MSG_WALK
+# MSG_WALK (unused)
 M:13:w
 
-# MSG_TPOTHER
+# MSG_TPOTHER (sound only)
 M:14:w
 
 # MSG_HITWALL
 M:15:w
 
-# MSG_EAT
+# MSG_EAT (sound only)
 M:16:w
 
 # MSG_STORE1
@@ -92,13 +88,13 @@
 # MSG_STORE4
 M:20:w
 
-# MSG_DIG
+# MSG_DIG (sound only)
 M:21:w
 
 # MSG_OPENDOOR
 M:22:w
 
-# MSG_SHUTDOOR
+# MSG_SHUTDOOR (sound only)
 M:23:w
 
 # MSG_TPLEVEL
@@ -113,14 +109,373 @@
 # MSG_LOCKPICK_FAIL
 M:27:w
 
-# MSG_STAIRS
+# MSG_STAIRS_DOWN
 M:28:w
 
 # MSG_HITPOINT_WARN
 M:29:o
 
+# MSG_ACT_ARTIFACT
+M:30:w
+
+# MSG_USE_STAFF (sound only)
+M:31:w
+
+# MSG_DESTROY
+M:32:w
+
+# MSG_MON_HIT
+M:33:w
+
+# MSG_MON_TOUCH
+M:34:w
+
+# MSG_MON_PUNCH
+M:35:w
+
+# MSG_MON_KICK
+M:36:w
+
+# MSG_MON_CLAW
+M:37:w
+
+# MSG_MON_BITE
+M:38:w
+
+# MSG_MON_STING
+M:39:w
+
+# MSG_MON_BUTT 
+M:40:w
+
+# MSG_MON_CRUSH
+M:41:w
+
+# MSG_MON_ENGULF
+M:42:w
+
+# MSG_MON_CRAWL
+M:43:w
+
+# MSG_MON_DROOL
+M:44:w
+
+# MSG_MON_SPIT
+M:45:w
+
+# MSG_MON_GAZE
+M:46:w
+
+# MSG_MON_WAIL
+M:47:w
+
+# MSG_MON_SPORE
+M:48:w
+
+# MSG_MON_BEG
+M:49:w
+
+# MSG_MON_INSULT
+M:50:w
+
+# MSG_MON_MOAN
+M:51:w
+
+# MSG_RECOVER
+M:52:w
+
+# MSG_BLIND
+M:53:w
+
+# MSG_CONFUSED
+M:54:w
+
+# MSG_POISONED
+M:55:w
+
 # MSG_AFRAID
 M:56:o
 
+# MSG_PARALYZED
+M:57:w
+
+# MSG_DRUGGED
+M:58:w
+
+# MSG_SPEED
+M:59:w
+
+# MSG_SLOW
+M:60:w
+
+# MSG_SHIELD
+M:61:w
+
+# MSG_BLESSED
+M:62:w
+
+# MSG_HERO
+M:63:w
+
+# MSG_BERSERK
+M:64:w
+
+# MSG_PROT_EVIL
+M:65:w
+
+# MSG_INVULN
+M:66:w
+
+# MSG_SEE_INVIS
+M:67:w
+
+# MSG_INFRARED
+M:68:w
+
+# MSG_RES_ACID
+M:69:w
+
+# MSG_RES_ELEC
+M:70:w
+
+# MSG_RES_FIRE
+M:71:w
+
+# MSG_RES_COLD
+M:72:w
+
+# MSG_RES_POIS
+M:73:w
+
+# MSG_STUN
+M:74:w
+
+# MSG_CUT
+M:75:w
+
+# MSG_STAIRS_UP
+M:76:w
+
+# MSG_STORE_ENTER (unused)
+M:77:w
+
+# MSG_STORE_LEAVE (unused)
+M:78:w
+
+# MSG_STORE_HOME (unused)
+M:79:w
+
+# MSG_MONEY1
+M:80:w
+
+# MSG_MONEY2
+M:81:w
+
+# MSG_MONEY3
+M:82:w
+
+# MSG_SHOOT_HIT
+M:83:w
+
+# MSG_STORE5
+M:84:w
+
+# MSG_LOCKPICK
+M:85:w
+
+# MSG_DISARM
+M:86:w
+
+# MSG_IDENT_BAD
+M:87:w
+
+# MSG_IDENT_EGO
+M:88:w
+
+# MSG_IDENT_ART
+M:89:w
+
+# MSG_BR_ELEMENTS
+# This is used as a generic breath.Another message type should be defined.
+M:90:w
+
+# MSG_BR_FROST
+M:91:w
+
+# MSG_BR_ELEC
+M:92:w
+
+# MSG_BR_ACID
+M:93:w
+
+# MSG_BR_GAS
+M:94:w
+
+# MSG_BR_FIRE
+M:95:w
+
+# MSG_BR_CONF
+M:96:w
+
+# MSG_BR_DISENCHANT
+M:97:w
+
+# MSG_BR_CHAOS
+M:98:w
+
+# MSG_BR_SHARDS
+M:99:w
+
+# MSG_BR_SOUND
+M:100:w
+
+# MSG_BR_LIGHT
+M:101:w
+
+# MSG_BR_DARK
+M:102:w
+
+# MSG_BR_NETHER
+M:103:w
+
+# MSG_BR_NEXUS
+M:104:w
+
+# MSG_BR_TIME
+M:105:w
+
+# MSG_BR_INERTIA
+M:106:w
+
+# MSG_BR_GRAVITY
+M:107:w
+
+# MSG_BR_PLASMA
+M:108:w
+
+# MSG_BR_FORCE
+M:109:w
+
+# MSG_SUM_MONSTER
+M:110:w
+
+# MSG_SUM_ANGEL
+M:111:w
+
+# MSG_SUM_UNDEAD
+M:112:w
+
+# MSG_SUM_ANIMAL
+M:113:w
+
+# MSG_SUM_SPIDER
+M:114:w
+
+# MSG_SUM_HOUND
+M:115:w
+
+# MSG_SUM_HYDRA
+M:116:w
+
+# MSG_SUM_DEMON
+M:117:w
+
+# MSG_SUM_DRAGON
+M:118:w
+
+# MSG_SUM_HI_UNDEAD
+M:119:w
+
+# MSG_SUM_HI_DRAGON
+M:120:w
+
+# MSG_SUM_HI_DEMON
+M:121:w
+
+# MSG_SUM_WRAITH
+M:122:w
+
+# MSG_SUM_UNIQUE
+M:123:w
+
+# MSG_WIELD
+M:124:w
+
+# MSG_CURSED
+M:125:w
+
+# MSG_PSEUDOID
+M:126:w
+
+# MSG_HUNGRY
+M:127:w
+
+# MSG_NOTICE
+M:128:w
+
+# MSG_AMBIENT_DAY (sound only)
+M:129:w
+
+# MSG_AMBIENT_NITE (sound only)
+M:130:w
+
+# MSG_AMBIENT_DNG1 (sound only)
+M:131:w
+
+# MSG_AMBIENT_DNG2 (sound only)
+M:132:w
+
+# MSG_AMBIENT_DNG3 (sound only)
+M:133:w
+
+# MSG_AMBIENT_DNG4 (sound only)
+M:134:w
+
+# MSG_AMBIENT_DNG5 (sound only)
+M:135:w
+
+# MSG_CREATE_TRAP
+M:136:w
+
+# MSG_SHRIEK
+M:137:w
+
+# MSG_CAST_FEAR
+M:138:w
+
+# MSG_HIT_GOOD
+M:139:w
+
+# MSG_HIT_GREAT
+M:140:w
+
+# MSG_HIT_SUPERB
+M:141:w
+
+# MSG_HIT_HI_GREAT
+M:142:w
+
+# MSG_HIT_HI_SUPERB
+M:143:w
+
+# MSG_SPELL (sound only)
+M:144:w
+
+# MSG_PRAYER (unused)
+M:145:w
+
+# MSG_KILL_UNIQUE
+M:146:w
+
+# MSG_KILL_KING
+M:147:w
+
+# MSG_DRAIN_STAT
+M:148:w
+
+# MSG_MULTIPLY (sound only)
+M:149:w
+
+# MSG_MAX 150
+
 ?:1
-
Index: src/attack.c
===================================================================
--- src/attack.c	(revision 1980)
+++ src/attack.c	(arbetskopia)
@@ -88,7 +88,7 @@
  * Critical hits (from objects thrown by player)
  * Factor in item weight, total plusses, and player level.
  */
-static int critical_shot(int weight, int plus, int dam)
+static int critical_shot(int weight, int plus, int dam, u32b *msg_type)
 {
 	int i, k;
 
@@ -102,17 +102,17 @@
 
 		if (k < 500)
 		{
-			msg_print("It was a good hit!");
+			*msg_type = MSG_HIT_GOOD;
 			dam = 2 * dam + 5;
 		}
 		else if (k < 1000)
 		{
-			msg_print("It was a great hit!");
+			*msg_type = MSG_HIT_GREAT;
 			dam = 2 * dam + 10;
 		}
 		else
 		{
-			msg_print("It was a superb hit!");
+			*msg_type = MSG_HIT_SUPERB;
 			dam = 3 * dam + 15;
 		}
 	}
@@ -127,7 +127,7 @@
  *
  * Factor in weapon weight, total plusses, player level.
  */
-static int critical_norm(int weight, int plus, int dam, const char **crit_msg)
+static int critical_norm(int weight, int plus, int dam, u32b *msg_type)
 {
 	int i, k;
 
@@ -141,39 +141,32 @@
 
 		if (k < 400)
 		{
-			sound(MSG_HIT_GOOD);
-			*crit_msg = "It was a good hit!";
+			*msg_type = MSG_HIT_GOOD;
 			dam = 2 * dam + 5;
 		}
 		else if (k < 700)
 		{
-			sound(MSG_HIT_GREAT);
-			*crit_msg = "It was a great hit!";
+			*msg_type = MSG_HIT_GREAT;
 			dam = 2 * dam + 10;
 		}
 		else if (k < 900)
 		{
-			sound(MSG_HIT_SUPERB);
-			*crit_msg = "It was a superb hit!";
+			*msg_type = MSG_HIT_SUPERB;
 			dam = 3 * dam + 15;
 		}
 		else if (k < 1300)
 		{
-			sound(MSG_HIT_HI_GREAT);
-			*crit_msg = "It was a *GREAT* hit!";
+			*msg_type = MSG_HIT_HI_GREAT;
 			dam = 3 * dam + 20;
 		}
 		else
 		{
-			sound(MSG_HIT_HI_SUPERB);
-			*crit_msg = "It was a *SUPERB* hit!";
+			*msg_type = MSG_HIT_HI_SUPERB;
 			dam = ((7 * dam) / 2) + 25;
 		}
 	}
 	else
-	{
-		sound(MSG_HIT);
-	}
+		*msg_type = MSG_HIT;
 
 	return dam;
 }
@@ -264,7 +257,7 @@
 
 	bool do_quake = FALSE;
 
-	const char *crit_msg = NULL;
+	u32b msg_type = 0;
 
 
 	/* Disturb the player */
@@ -338,7 +331,7 @@
 					do_quake = TRUE;
 
 				k += o_ptr->to_d;
-				k = critical_norm(o_ptr->weight, o_ptr->to_h, k, &crit_msg);
+				k = critical_norm(o_ptr->weight, o_ptr->to_h, k, &msg_type);
 
 				/* Learn by use for the weapon */
 				object_notice_attack_plusses(o_ptr);
@@ -361,8 +354,36 @@
 			}
 
 			/* Tell the player what happened */
-			message_format(MSG_GENERIC, m_ptr->r_idx, "You %s %s.", hit_verb, m_name);
-			if (crit_msg) msg_print(crit_msg);
+			if (msg_type == MSG_HIT)
+				message_format(MSG_HIT, m_ptr->r_idx, "You %s %s.", hit_verb, m_name);
+			else
+			{
+				if (msg_type == MSG_HIT_GOOD)
+				{
+					message_format(MSG_HIT_GOOD, m_ptr->r_idx, "You %s %s. %s", hit_verb, m_name,
+								   "It was a good hit!");
+				}
+				else if (msg_type == MSG_HIT_GREAT)
+				{
+					message_format(MSG_HIT_GREAT, m_ptr->r_idx, "You %s %s. %s", hit_verb, m_name,
+								   "It was a great hit!");
+				}
+				else if (msg_type == MSG_HIT_SUPERB)
+				{
+					message_format(MSG_HIT_SUPERB, m_ptr->r_idx, "You %s %s. %s", hit_verb, m_name,
+								   "It was a superb hit!");
+				}
+				else if (msg_type == MSG_HIT_HI_GREAT)
+				{
+					message_format(MSG_HIT_HI_GREAT, m_ptr->r_idx, "You %s %s. %s", hit_verb, m_name,
+								   "It was a *GREAT* hit!");
+				}
+				else if (msg_type == MSG_HIT_HI_SUPERB)
+				{
+					message_format(MSG_HIT_HI_SUPERB, m_ptr->r_idx, "You %s %s. %s", hit_verb, m_name,
+								   "It was a *SUPERB* hit!");
+				}
+			}
 
 			/* Complex message */
 			if (p_ptr->wizard)
@@ -469,6 +490,8 @@
 
 	char o_name[80];
 
+	u32b msg_type = 0;
+
 	int path_n;
 	u16b path_g[256];
 
@@ -628,7 +651,23 @@
 					note_dies = " is destroyed.";
 				}
 
+				/* Apply damage: multiplier, slays, criticals, bonuses */
+				tdam = damroll(o_ptr->dd, o_ptr->ds);
+				tdam += o_ptr->to_d + j_ptr->to_d;
+				tdam *= p_ptr->state.ammo_mult;
+				tdam *= (best_s_ptr == NULL) ? 1 : best_s_ptr->mult;
+				tdam = critical_shot(o_ptr->weight, o_ptr->to_h, tdam, &msg_type);
 
+				object_notice_attack_plusses(o_ptr);
+				object_notice_attack_plusses(&inventory[INVEN_BOW]);
+
+				/* No negative damage; change verb if no damage done */
+				if (tdam <= 0)
+				{
+					tdam = 0;
+					hit_verb = "fail to harm";
+				}
+
 				/* Handle unseen monster */
 				if (!visible)
 				{
@@ -644,29 +683,35 @@
 					/* Get "the monster" or "it" */
 					monster_desc(m_name, sizeof(m_name), m_ptr, 0);
 
-					/* Message */
-					message_format(MSG_SHOOT_HIT, 0, "The %s %s %s.", o_name, hit_verb, m_name);
-
+					/* Tell the player what happened */
+					if (msg_type == MSG_SHOOT_HIT)
+						message_format(MSG_SHOOT_HIT, 0, "The %s %s %s.", o_name, hit_verb, m_name);
+					else
+					{
+						if (msg_type == MSG_HIT_GOOD)
+						{
+							message_format(MSG_HIT_GOOD, 0, "The %s %s %s. %s", o_name, hit_verb, m_name,
+										   "It was a good hit!");
+						}
+						else if (msg_type == MSG_HIT_GREAT)
+						{
+							message_format(MSG_HIT_GREAT, 0, "The %s %s %s. %s", o_name, hit_verb, m_name,
+										   "It was a great hit!");
+						}
+						else if (msg_type == MSG_HIT_SUPERB)
+						{
+							message_format(MSG_HIT_SUPERB, 0, "The %s %s %s. %s", o_name, hit_verb, m_name,
+										   "It was a superb hit!");
+						}
+					}
 					/* Hack -- Track this monster race */
 					if (m_ptr->ml) monster_race_track(m_ptr->r_idx);
 
 					/* Hack -- Track this monster */
 					if (m_ptr->ml) health_track(cave_m_idx[y][x]);
+
 				}
 
-				/* Apply damage: multiplier, slays, criticals, bonuses */
-				tdam = damroll(o_ptr->dd, o_ptr->ds);
-				tdam += o_ptr->to_d + j_ptr->to_d;
-				tdam *= p_ptr->state.ammo_mult;
-				tdam *= (best_s_ptr == NULL) ? 1 : best_s_ptr->mult;
-				tdam = critical_shot(o_ptr->weight, o_ptr->to_h, tdam);
-
-				object_notice_attack_plusses(o_ptr);
-				object_notice_attack_plusses(&inventory[INVEN_BOW]);
-
-				/* No negative damage */
-				if (tdam < 0) tdam = 0;
-
 				/* Complex message */
 				if (p_ptr->wizard)
 				{
@@ -846,6 +891,8 @@
 
 	char o_name[80];
 
+	u32b msg_type = 0;
+
 	int path_n;
 	u16b path_g[256];
 
@@ -1026,7 +1073,16 @@
 					tdam *= best_s_ptr->mult;
 					hit_verb = best_s_ptr->range_verb;
 				}
+				/* Apply special damage XXX XXX XXX */
+				tdam = critical_shot(i_ptr->weight, i_ptr->to_h, tdam, &msg_type);
 
+				/* No negative damage; change verb if no damage done */
+				if (tdam <= 0)
+				{
+					tdam = 0;
+					hit_verb = "fail to harm";
+				}
+
 				/* Handle unseen monster */
 				if (!visible)
 				{
@@ -1042,9 +1098,27 @@
 					/* Get "the monster" or "it" */
 					monster_desc(m_name, sizeof(m_name), m_ptr, 0);
 
-					/* Message */
-					msg_format("The %s %s %s.", o_name, hit_verb, m_name);
-
+					/* Tell the player what happened */
+					if (msg_type == MSG_SHOOT_HIT)
+						message_format(MSG_SHOOT_HIT, 0, "The %s %s %s.", o_name, hit_verb, m_name);
+					else
+					{
+						if (msg_type == MSG_HIT_GOOD)
+						{
+							message_format(MSG_HIT_GOOD, 0, "The %s %s %s. %s", o_name, hit_verb, m_name,
+										   "It was a good hit!");
+						}
+						else if (msg_type == MSG_HIT_GREAT)
+						{
+							message_format(MSG_HIT_GREAT, 0, "The %s %s %s. %s", o_name, hit_verb, m_name,
+										   "It was a great hit!");
+						}
+						else if (msg_type == MSG_HIT_SUPERB)
+						{
+							message_format(MSG_HIT_SUPERB, 0, "The %s %s %s. %s", o_name, hit_verb, m_name,
+										   "It was a superb hit!");
+						}
+					}
 					/* Hack -- Track this monster race */
 					if (m_ptr->ml) monster_race_track(m_ptr->r_idx);
 
@@ -1052,12 +1126,6 @@
 					if (m_ptr->ml) health_track(cave_m_idx[y][x]);
 				}
 
-				/* Apply special damage XXX XXX XXX */
-				tdam = critical_shot(i_ptr->weight, i_ptr->to_h, tdam);
-
-				/* No negative damage */
-				if (tdam < 0) tdam = 0;
-
 				/* Learn the bonuses */
 				/* XXX Eddie This is messed up, better done for firing, */
 				/* should use that method [split last] instead */
@@ -1122,7 +1190,7 @@
 
 	if (item >= INVEN_WIELD && item < QUIVER_START)
 	{
-		msg_print("You have cannot throw wielded items.");
+		msg_print("You cannot throw wielded items.");
 		return;
 	}
 
Index: src/cmd-obj.c
===================================================================
--- src/cmd-obj.c	(revision 1980)
+++ src/cmd-obj.c	(arbetskopia)
@@ -517,7 +517,7 @@
 		}
 
 		use = USE_CHARGE;
-		snd = MSG_ZAP_ROD;
+		snd = MSG_USE_STAFF;
 		items_allowed = USE_INVEN | USE_FLOOR;
 	}
 	else if (obj_is_food(o_ptr))
Index: src/cmd3.c
===================================================================
--- src/cmd3.c	(revision 1980)
+++ src/cmd3.c	(arbetskopia)
@@ -199,15 +199,13 @@
 	object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL);
 
 	/* Message */
-	sound(MSG_WIELD);
-	msg_format(fmt, o_name, index_to_label(slot));
+	message_format(MSG_WIELD, 0, fmt, o_name, index_to_label(slot));
 
 	/* Cursed! */
 	if (cursed_p(o_ptr))
 	{
 		/* Warn the player */
-		sound(MSG_CURSED);
-		msg_print("Oops! It feels deathly cold!");
+		message_format(MSG_CURSED, 0, "Oops! It feels deathly cold!");
 
 		/* Sense the object */
 		object_notice_curses(o_ptr);
Index: src/dungeon.c
===================================================================
--- src/dungeon.c	(revision 1980)
+++ src/dungeon.c	(arbetskopia)
@@ -793,18 +793,15 @@
 			/* Disturbing! */
 			disturb(0, 0);
 
-			/* Sound */
-			sound(MSG_TPLEVEL);
-
 			/* Determine the level */
 			if (p_ptr->depth)
 			{
-				msg_print("You feel yourself yanked upwards!");
+				message_format(MSG_TPLEVEL, 0, "You feel yourself yanked upwards!");
 				dungeon_change_level(0);
 			}
 			else
 			{
-				msg_print("You feel yourself yanked downwards!");
+				message_format(MSG_TPLEVEL, 0, "You feel yourself yanked downwards!");
 
 				/* New depth - back to max depth or 1, whichever is deeper */
 				dungeon_change_level(p_ptr->max_depth < 1 ? 1: p_ptr->max_depth);
Index: src/effects.c
===================================================================
--- src/effects.c	(revision 1980)
+++ src/effects.c	(arbetskopia)
@@ -1842,8 +1842,7 @@
 		case EF_DRAGON_BLUE:
 		{
 			dam = 100 * (100 + boost) / 100;
-			sound(MSG_BR_ELEC);
-			msg_print("You breathe lightning.");
+			message_format(MSG_BR_ELEC, 0, "You breathe lightning.");
 			fire_ball(GF_ELEC, dir, dam, 2);
 			return TRUE;
 		}
@@ -1851,8 +1850,7 @@
 		case EF_DRAGON_GREEN:
 		{
 			dam = 150 * (100 + boost) / 100;
-			sound(MSG_BR_GAS);
-			msg_print("You breathe poison gas.");
+			message_format(MSG_BR_GAS, 0, "You breathe poison gas.");
 			fire_ball(GF_POIS, dir, dam, 2);
 			return TRUE;
 		}
@@ -1860,8 +1858,7 @@
 		case EF_DRAGON_RED:
 		{
 			dam = 200 * (100 + boost) / 100;
-			sound(MSG_BR_FIRE);
-			msg_print("You breathe fire.");
+			message_format(MSG_BR_FIRE, 0, "You breathe fire.");
 			fire_ball(GF_FIRE, dir, dam, 2);
 			return TRUE;
 		}
@@ -1870,7 +1867,7 @@
 		{
 			static const struct
 			{
-				int sound;
+				int msg_sound;
 				const char *msg;
 				int typ;
 			} mh[] =
@@ -1884,8 +1881,7 @@
 
 			int chance = randint0(5);
 			dam = 250 * (100 + boost) / 100;
-			sound(mh[chance].sound);
-			msg_format("You breathe %s.", mh[chance].msg);
+			message_format(mh[chance].msg_sound, 0, "You breathe %s.", mh[chance].msg);
 			fire_ball(mh[chance].typ, dir, dam, 2);
 			return TRUE;
 		}
@@ -1893,8 +1889,7 @@
 		case EF_DRAGON_BRONZE:
 		{
 			dam = 120 * (100 + boost) / 100;
-			sound(MSG_BR_CONF);
-			msg_print("You breathe confusion.");
+			message_format(MSG_BR_CONF, 0, "You breathe confusion.");
 			fire_ball(GF_CONFUSION, dir, dam, 2);
 			return TRUE;
 		}
@@ -1902,8 +1897,7 @@
 		case EF_DRAGON_GOLD:
 		{
 			dam = 130 * (100 + boost) / 100;
-			sound(MSG_BR_SOUND);
-			msg_print("You breathe sound.");
+			message_format(MSG_BR_SOUND, 0, "You breathe sound.");
 			fire_ball(GF_SOUND, dir, dam, 2);
 			return TRUE;
 		}
@@ -1912,9 +1906,9 @@
 		{
 			dam = 220 * (100 + boost) / 100;
 			chance = randint0(2);
-			sound(((chance == 1 ? MSG_BR_CHAOS : MSG_BR_DISENCHANT)));
-			msg_format("You breathe %s.",
-			           ((chance == 1 ? "chaos" : "disenchantment")));
+			message_format((chance == 1 ? MSG_BR_CHAOS : MSG_BR_DISENCHANT), 0,
+					"You breathe %s.",
+					((chance == 1 ? "chaos" : "disenchantment")));
 			fire_ball((chance == 1 ? GF_CHAOS : GF_DISENCHANT),
 			          dir, dam, 2);
 			return TRUE;
@@ -1924,8 +1918,7 @@
 		{
 			dam = 230 * (100 + boost) / 100;
 			chance = randint0(2);
-			sound(((chance == 1 ? MSG_BR_SOUND : MSG_BR_SHARDS)));
-			msg_format("You breathe %s.",
+			message_format((chance == 1 ? MSG_BR_SOUND : MSG_BR_SHARDS), 0, "You breathe %s.",
 			           ((chance == 1 ? "sound" : "shards")));
 			fire_ball((chance == 1 ? GF_SOUND : GF_SHARD),
 			          dir, dam, 2);
@@ -1951,8 +1944,7 @@
 		{
 			dam = 200 * (100 + boost) / 100;
 			chance = randint0(2);
-			sound(((chance == 0 ? MSG_BR_LIGHT : MSG_BR_DARK)));
-			msg_format("You breathe %s.",
+			message_format((chance == 0 ? MSG_BR_LIGHT : MSG_BR_DARK), 0, "You breathe %s.",
 			        ((chance == 0 ? "light" : "darkness")));
 			fire_ball((chance == 0 ? GF_LIGHT : GF_DARK), dir, dam,
 				2);
@@ -1962,8 +1954,7 @@
 		case EF_DRAGON_POWER:
 		{
 			dam = 300 * (100 + boost) / 100;
-			sound(MSG_BR_ELEMENTS);
-			msg_print("You breathe the elements.");
+			message_format(MSG_BR_ELEMENTS, 0, "You breathe the elements.");
 			fire_ball(GF_MISSILE, dir, dam, 2);
 			return TRUE;
 		}
Index: src/spells2.c
===================================================================
--- src/spells2.c	(revision 1980)
+++ src/spells2.c	(arbetskopia)
@@ -3303,6 +3303,8 @@
 {
 	char o_name[80];
 
+	u32b msg_type = 0;
+
 	/* Identify it */
 	object_flavor_aware(o_ptr);
 	object_notice_everything(o_ptr);
@@ -3325,22 +3327,26 @@
 	/* Description */
 	object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL);
 
-	/* Possibly play a sound depending on object quality. */
+	/* Determine the message type. */
 	if (o_ptr->pval < 0)
 	{
 		/* This is a bad item. */
-		sound(MSG_IDENT_BAD);
+		msg_type = MSG_IDENT_BAD;
 	}
 	else if (o_ptr->name1 != 0)
 	{
 		/* We have a good artifact. */
-		sound(MSG_IDENT_ART);
+		msg_type = MSG_IDENT_ART;
 	}
 	else if (o_ptr->name2 != 0)
 	{
 		/* We have a good ego item. */
-		sound(MSG_IDENT_EGO);
+		msg_type = MSG_IDENT_EGO;
 	}
+	else
+	{
+		msg_type = MSG_GENERIC;
+	}
 
 	/* Log artifacts to the history list. */
 	if (artifact_p(o_ptr))
@@ -3349,16 +3355,16 @@
 	/* Describe */
 	if (item >= INVEN_WIELD)
 	{
-		msg_format("%^s: %s (%c).",
+		message_format(msg_type, 0, "%^s: %s (%c).",
 			  describe_use(item), o_name, index_to_label(item));
 	}
 	else if (item >= 0)
 	{
-		msg_format("In your pack: %s (%c).",
+		message_format(msg_type, 0, "In your pack: %s (%c).",
 			  o_name, index_to_label(item));
 	}
 	else
 	{
-		msg_format("On the ground: %s.", o_name);
+		message_format(msg_type, 0, "On the ground: %s.", o_name);
 	}
 }
Index: src/monster/melee2.c
===================================================================
--- src/monster/melee2.c	(revision 1980)
+++ src/monster/melee2.c	(arbetskopia)
@@ -767,8 +767,7 @@
 		{
 			if (!direct) break;
 			disturb(1, 0);
-			sound(MSG_SHRIEK);
-			msg_format("%^s makes a high pitched shriek.", m_name);
+			message_format(MSG_SHRIEK, 0, "%^s makes a high pitched shriek.", m_name);
 			aggravate_monsters(m_idx);
 			break;
 		}
@@ -840,9 +839,8 @@
 		case RSF_BR_ACID:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_ACID);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes acid.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_ACID, 0, "%^s breathes acid.", m_name);
 			breath(m_idx, GF_ACID,
 			       ((m_ptr->hp / BR_ACID_DIVISOR) > BR_ACID_MAX ? BR_ACID_MAX : (m_ptr->hp / BR_ACID_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_ACID);
@@ -852,9 +850,8 @@
 		case RSF_BR_ELEC:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_ELEC);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes lightning.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_ELEC, 0, "%^s breathes lightning.", m_name);
 			breath(m_idx, GF_ELEC,
 			       ((m_ptr->hp / BR_ELEC_DIVISOR) > BR_ELEC_MAX ? BR_ELEC_MAX : (m_ptr->hp / BR_ELEC_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_ELEC);
@@ -864,9 +861,8 @@
 		case RSF_BR_FIRE:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_FIRE);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes fire.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_FIRE, 0, "%^s breathes fire.", m_name);
 			breath(m_idx, GF_FIRE,
 			       ((m_ptr->hp / BR_FIRE_DIVISOR) > BR_FIRE_MAX ? BR_FIRE_MAX : (m_ptr->hp / BR_FIRE_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_FIRE);
@@ -876,9 +872,8 @@
 		case RSF_BR_COLD:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_FROST);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes frost.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_FROST, 0, "%^s breathes frost.", m_name);
 			breath(m_idx, GF_COLD,
 			       ((m_ptr->hp / BR_COLD_DIVISOR) > BR_COLD_MAX ? BR_COLD_MAX : (m_ptr->hp / BR_COLD_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_COLD);
@@ -888,9 +883,8 @@
 		case RSF_BR_POIS:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_GAS);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes gas.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_GAS, 0, "%^s breathes gas.", m_name);
 			breath(m_idx, GF_POIS,
 			       ((m_ptr->hp / BR_POIS_DIVISOR) > BR_POIS_MAX ? BR_POIS_MAX : (m_ptr->hp / BR_POIS_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_POIS);
@@ -900,9 +894,8 @@
 		case RSF_BR_NETH:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_NETHER);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes nether.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_NETHER, 0, "%^s breathes nether.", m_name);
 			breath(m_idx, GF_NETHER,
 			       ((m_ptr->hp / BR_NETH_DIVISOR) > BR_NETH_MAX ? BR_NETH_MAX : (m_ptr->hp / BR_NETH_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_NETHR);
@@ -912,9 +905,8 @@
 		case RSF_BR_LIGHT:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_LIGHT);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes light.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_LIGHT, 0, "%^s breathes light.", m_name);
 			breath(m_idx, GF_LIGHT,
 			       ((m_ptr->hp / BR_LIGHT_DIVISOR) > BR_LIGHT_MAX ? BR_LIGHT_MAX : (m_ptr->hp / BR_LIGHT_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_LIGHT);
@@ -924,9 +916,8 @@
 		case RSF_BR_DARK:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_DARK);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes darkness.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_DARK, 0, "%^s breathes darkness.", m_name);
 			breath(m_idx, GF_DARK,
 			       ((m_ptr->hp / BR_DARK_DIVISOR) > BR_DARK_MAX ? BR_DARK_MAX : (m_ptr->hp / BR_DARK_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_DARK);
@@ -936,9 +927,8 @@
 		case RSF_BR_CONF:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_CONF);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes confusion.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_CONF, 0, "%^s breathes confusion.", m_name);
 			breath(m_idx, GF_CONFUSION,
 			       ((m_ptr->hp / BR_CONF_DIVISOR) > BR_CONF_MAX ? BR_CONF_MAX : (m_ptr->hp / BR_CONF_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_CONFU);
@@ -948,9 +938,8 @@
 		case RSF_BR_SOUN:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_SOUND);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes sound.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_SOUND, 0, "%^s breathes sound.", m_name);
 			breath(m_idx, GF_SOUND,
 			       ((m_ptr->hp / BR_SOUN_DIVISOR) > BR_SOUN_MAX ? BR_SOUN_MAX : (m_ptr->hp / BR_SOUN_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_SOUND);
@@ -960,9 +949,8 @@
 		case RSF_BR_CHAO:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_CHAOS);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes chaos.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_CHAOS, 0, "%^s breathes chaos.", m_name);
 			breath(m_idx, GF_CHAOS,
 			       ((m_ptr->hp / BR_CHAO_DIVISOR) > BR_CHAO_MAX ? BR_CHAO_MAX : (m_ptr->hp / BR_CHAO_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_CHAOS);
@@ -972,9 +960,8 @@
 		case RSF_BR_DISE:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_DISENCHANT);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes disenchantment.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_DISENCHANT, 0, "%^s breathes disenchantment.", m_name);
 			breath(m_idx, GF_DISENCHANT,
 			       ((m_ptr->hp / BR_DISE_DIVISOR) > BR_DISE_MAX ? BR_DISE_MAX : (m_ptr->hp / BR_DISE_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_DISEN);
@@ -984,9 +971,8 @@
 		case RSF_BR_NEXU:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_NEXUS);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes nexus.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_NEXUS, 0, "%^s breathes nexus.", m_name);
 			breath(m_idx, GF_NEXUS,
 			       ((m_ptr->hp / BR_NEXU_DIVISOR) > BR_NEXU_MAX ? BR_NEXU_MAX : (m_ptr->hp / BR_NEXU_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_NEXUS);
@@ -996,9 +982,8 @@
 		case RSF_BR_TIME:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_TIME);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes time.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_TIME, 0, "%^s breathes time.", m_name);
 			breath(m_idx, GF_TIME,
 			       ((m_ptr->hp / BR_TIME_DIVISOR) > BR_TIME_MAX ? BR_TIME_MAX : (m_ptr->hp / BR_TIME_DIVISOR)));
 			break;
@@ -1007,9 +992,8 @@
 		case RSF_BR_INER:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_INERTIA);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes inertia.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_INERTIA, 0, "%^s breathes inertia.", m_name);
 			breath(m_idx, GF_INERTIA,
 			       ((m_ptr->hp / BR_INER_DIVISOR) > BR_INER_MAX ? BR_INER_MAX : (m_ptr->hp / BR_INER_DIVISOR)));
 			break;
@@ -1018,9 +1002,8 @@
 		case RSF_BR_GRAV:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_GRAVITY);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes gravity.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_GRAVITY, 0, "%^s breathes gravity.", m_name);
 			breath(m_idx, GF_GRAVITY,
 			       ((m_ptr->hp / BR_GRAV_DIVISOR) > BR_GRAV_MAX ? BR_GRAV_MAX : (m_ptr->hp / BR_GRAV_DIVISOR)));
 			break;
@@ -1029,9 +1012,8 @@
 		case RSF_BR_SHAR:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_SHARDS);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes shards.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_SHARDS, 0, "%^s breathes shards.", m_name);
 			breath(m_idx, GF_SHARD,
 			       ((m_ptr->hp / BR_SHAR_DIVISOR) > BR_SHAR_MAX ? BR_SHAR_MAX : (m_ptr->hp / BR_SHAR_DIVISOR)));
 			update_smart_learn(m_idx, DRS_RES_SHARD);
@@ -1041,9 +1023,8 @@
 		case RSF_BR_PLAS:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_PLASMA);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes plasma.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_PLASMA, 0, "%^s breathes plasma.", m_name);
 			breath(m_idx, GF_PLASMA,
 			       ((m_ptr->hp / BR_PLAS_DIVISOR) > BR_PLAS_MAX ? BR_PLAS_MAX : (m_ptr->hp / BR_PLAS_DIVISOR)));
 			break;
@@ -1052,9 +1033,8 @@
 		case RSF_BR_WALL:
 		{
 			disturb(1, 0);
-			sound(MSG_BR_FORCE);
-			if (blind) msg_format("%^s breathes.", m_name);
-			else msg_format("%^s breathes force.", m_name);
+			if (blind) message_format(MSG_BR_ELEMENTS, 0, "%^s breathes.", m_name);
+			else message_format(MSG_BR_FORCE, 0, "%^s breathes force.", m_name);
 			breath(m_idx, GF_FORCE,
 			       ((m_ptr->hp / BR_FORC_DIVISOR) > BR_FORC_MAX ? BR_FORC_MAX : (m_ptr->hp / BR_FORC_DIVISOR)));
 			break;
@@ -1486,9 +1466,8 @@
 		{
 			if (!direct) break;
 			disturb(1, 0);
-			sound(MSG_CAST_FEAR);
-			if (blind) msg_format("%^s mumbles, and you hear scary noises.", m_name);
-			else msg_format("%^s casts a fearful illusion.", m_name);
+			if (blind) message_format(MSG_CAST_FEAR, 0, "%^s mumbles, and you hear scary noises.", m_name);
+			else message_format(MSG_CAST_FEAR, 0, "%^s casts a fearful illusion.", m_name);
 			if (p_ptr->state.resist_fear)
 			{
 				msg_print("You refuse to be frightened.");
@@ -1762,9 +1741,8 @@
 		{
 			if (!direct) break;
 			disturb(1, 0);
-			sound(MSG_CREATE_TRAP);
-			if (blind) msg_format("%^s mumbles, and then cackles evilly.", m_name);
-			else msg_format("%^s casts a spell and cackles evilly.", m_name);
+			if (blind) message_format(MSG_CREATE_TRAP, 0, "%^s mumbles, and then cackles evilly.", m_name);
+			else message_format(MSG_CREATE_TRAP, 0, "%^s casts a spell and cackles evilly.", m_name);
 			(void)trap_creation();
 			break;
 		}
@@ -1786,9 +1764,8 @@
 		case RSF_S_KIN:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_MONSTER);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons %s %s.", m_name, m_poss,
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_MONSTER, 0, "%^s magically summons %s %s.", m_name, m_poss,
 			                (rf_has(r_ptr->flags, RF_UNIQUE) ?
 			                 "minions" : "kin"));
 
@@ -1800,7 +1777,7 @@
 			}
 			if (blind && count)
 			{
-				msg_print("You hear many things appear nearby.");
+				message_format(MSG_SUM_MONSTER, 0, "You hear many things appear nearby.");
 			}
 			break;
 		}
@@ -1808,16 +1785,16 @@
 		case RSF_S_HI_DEMON:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_HI_DEMON);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons greater demons!", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_HI_DEMON, 0, "%^s magically summons greater demons!", m_name);
 			for (k = 0; k < 8; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_HI_DEMON, 0);
 			}
 			if (blind && count)
 			{
-				msg_print("You hear many evil things appear nearby.");
+				/* The message is distinct, hence a specific message type. */
+				message_format(MSG_SUM_HI_DEMON, 0, "You hear many evil things appear nearby.");
 			}
 			break;
 		}
@@ -1825,16 +1802,15 @@
 		case RSF_S_MONSTER:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_MONSTER);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons help!", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_MONSTER, 0, "%^s magically summons help!", m_name);
 			for (k = 0; k < 1; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_MONSTER, 0);
 			}
 			if (blind && count)
 			{
-				msg_print("You hear something appear nearby.");
+				message_format(MSG_SUM_MONSTER, 0, "You hear something appear nearby.");
 			}
 			break;
 		}
@@ -1842,16 +1818,15 @@
 		case RSF_S_MONSTERS:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_MONSTER);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons monsters!", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_MONSTER, 0, "%^s magically summons monsters!", m_name);
 			for (k = 0; k < 8; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_MONSTERS, 0);
 			}
 			if (blind && count)
 			{
-				msg_print("You hear many things appear nearby.");
+				message_format(MSG_SUM_MONSTER, 0, "You hear many things appear nearby.");
 			}
 			break;
 		}
@@ -1859,16 +1834,15 @@
 		case RSF_S_ANIMAL:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_ANIMAL);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons animals.", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_ANIMAL, 0, "%^s magically summons animals.", m_name);
 			for (k = 0; k < 6; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_ANIMAL, 0);
 			}
 			if (blind && count)
 			{
-				msg_print("You hear many things appear nearby.");
+				message_format(MSG_SUM_MONSTER, 0, "You hear many things appear nearby.");
 			}
 			break;
 		}
@@ -1876,16 +1850,15 @@
 		case RSF_S_SPIDER:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_SPIDER);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons spiders.", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_SPIDER, 0, "%^s magically summons spiders.", m_name);
 			for (k = 0; k < 6; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_SPIDER, 0);
 			}
 			if (blind && count)
 			{
-				msg_print("You hear many things appear nearby.");
+				message_format(MSG_SUM_MONSTER, 0, "You hear many things appear nearby.");
 			}
 			break;
 		}
@@ -1893,16 +1866,15 @@
 		case RSF_S_HOUND:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_HOUND);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons hounds.", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_HOUND, 0, "%^s magically summons hounds.", m_name);
 			for (k = 0; k < 6; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_HOUND, 0);
 			}
 			if (blind && count)
 			{
-				msg_print("You hear many things appear nearby.");
+				message_format(MSG_SUM_MONSTER, 0, "You hear many things appear nearby.");
 			}
 			break;
 		}
@@ -1910,16 +1882,15 @@
 		case RSF_S_HYDRA:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_HYDRA);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons hydras.", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_HYDRA, 0, "%^s magically summons hydras.", m_name);
 			for (k = 0; k < 6; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_HYDRA, 0);
 			}
 			if (blind && count)
 			{
-				msg_print("You hear many things appear nearby.");
+				message_format(MSG_SUM_MONSTER, 0, "You hear many things appear nearby.");
 			}
 			break;
 		}
@@ -1927,16 +1898,15 @@
 		case RSF_S_ANGEL:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_ANGEL);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons an angel!", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_ANGEL, 0, "%^s magically summons an angel!", m_name);
 			for (k = 0; k < 1; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_ANGEL, 0);
 			}
 			if (blind && count)
 			{
-				msg_print("You hear something appear nearby.");
+				message_format(MSG_SUM_MONSTER, 0, "You hear something appear nearby.");
 			}
 			break;
 		}
@@ -1944,16 +1914,15 @@
 		case RSF_S_DEMON:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_DEMON);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons a hellish adversary!", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_DEMON, 0, "%^s magically summons a hellish adversary!", m_name);
 			for (k = 0; k < 1; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_DEMON, 0);
 			}
 			if (blind && count)
 			{
-				msg_print("You hear something appear nearby.");
+				message_format(MSG_SUM_MONSTER, 0, "You hear something appear nearby.");
 			}
 			break;
 		}
@@ -1961,16 +1930,15 @@
 		case RSF_S_UNDEAD:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_UNDEAD);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons an undead adversary!", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_UNDEAD, 0, "%^s magically summons an undead adversary!", m_name);
 			for (k = 0; k < 1; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_UNDEAD, 0);
 			}
 			if (blind && count)
 			{
-				msg_print("You hear something appear nearby.");
+				message_format(MSG_SUM_MONSTER, 0, "You hear something appear nearby.");
 			}
 			break;
 		}
@@ -1978,16 +1946,15 @@
 		case RSF_S_DRAGON:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_DRAGON);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons a dragon!", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_DRAGON, 0, "%^s magically summons a dragon!", m_name);
 			for (k = 0; k < 1; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_DRAGON, 0);
 			}
 			if (blind && count)
 			{
-				msg_print("You hear something appear nearby.");
+				message_format(MSG_SUM_MONSTER, 0, "You hear something appear nearby.");
 			}
 			break;
 		}
@@ -1995,16 +1962,16 @@
 		case RSF_S_HI_UNDEAD:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_HI_UNDEAD);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons greater undead!", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_HI_UNDEAD, 0, "%^s magically summons greater undead!", m_name);
 			for (k = 0; k < 8; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_HI_UNDEAD, 0);
 			}
 			if (blind && count)
 			{
-				msg_print("You hear many creepy things appear nearby.");
+				/* We don't know which kind of creepy things appear while blind. */
+				message_format(MSG_SUM_HI_UNDEAD, 0, "You hear many creepy things appear nearby.");
 			}
 			break;
 		}
@@ -2012,16 +1979,16 @@
 		case RSF_S_HI_DRAGON:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_HI_DRAGON);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons ancient dragons!", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_HI_DRAGON, 0, "%^s magically summons ancient dragons!", m_name);
 			for (k = 0; k < 8; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_HI_DRAGON, 0);
 			}
 			if (blind && count)
 			{
-				msg_print("You hear many powerful things appear nearby.");
+				/* This should be a more general message type. */
+				message_format(MSG_SUM_HI_DRAGON, 0, "You hear many powerful things appear nearby.");
 			}
 			break;
 		}
@@ -2029,9 +1996,8 @@
 		case RSF_S_WRAITH:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_WRAITH);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons mighty undead opponents!", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_WRAITH, 0, "%^s magically summons mighty undead opponents!", m_name);
 			for (k = 0; k < 8; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_WRAITH, 0);
@@ -2042,7 +2008,8 @@
 			}
 			if (blind && count)
 			{
-				msg_print("You hear many creepy things appear nearby.");
+				/* We don't know which kind of creepy things appear while blind. */
+				message_format(MSG_SUM_HI_UNDEAD, 0, "You hear many creepy things appear nearby.");
 			}
 			break;
 		}
@@ -2050,9 +2017,8 @@
 		case RSF_S_UNIQUE:
 		{
 			disturb(1, 0);
-			sound(MSG_SUM_UNIQUE);
-			if (blind) msg_format("%^s mumbles.", m_name);
-			else msg_format("%^s magically summons special opponents!", m_name);
+			if (blind) message_format(MSG_GENERIC, 0, "%^s mumbles.", m_name);
+			else message_format(MSG_SUM_UNIQUE, 0, "%^s magically summons special opponents!", m_name);
 			for (k = 0; k < 8; k++)
 			{
 				count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_UNIQUE, 0);
@@ -2063,7 +2029,8 @@
 			}
 			if (blind && count)
 			{
-				msg_print("You hear many powerful things appear nearby.");
+				/* This should be a more general message type. */
+				message_format(MSG_SUM_UNIQUE, 0, "You hear many powerful things appear nearby.");
 			}
 			break;
 		}
Index: src/object/obj-util.c
===================================================================
--- src/object/obj-util.c	(revision 1980)
+++ src/object/obj-util.c	(arbetskopia)
@@ -2935,8 +2935,7 @@
 	slot = inven_carry(i_ptr);
 
 	/* Message */
-	sound(MSG_WIELD);
-	msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
+	message_format(MSG_WIELD, 0, "%s %s (%c).", act, o_name, index_to_label(slot));
 
 	p_ptr->notice |= PN_SQUELCH;
 
Index: src/player/timed.c
===================================================================
--- src/player/timed.c	(revision 1980)
+++ src/player/timed.c	(arbetskopia)
@@ -753,40 +753,35 @@
 			/* Fainting / Starving */
 			case 0:
 			{
-				sound(MSG_NOTICE);
-				msg_print("You are getting faint from hunger!");
+				message_format(MSG_NOTICE, 0, "You are getting faint from hunger!");
 				break;
 			}
 
 			/* Weak */
 			case 1:
 			{
-				sound(MSG_NOTICE);
-				msg_print("You are getting weak from hunger!");
+				message_format(MSG_NOTICE, 0, "You are getting weak from hunger!");
 				break;
 			}
 
 			/* Hungry */
 			case 2:
 			{
-				sound(MSG_HUNGRY);
-				msg_print("You are getting hungry.");
+				message_format(MSG_HUNGRY, 0, "You are getting hungry.");
 				break;
 			}
 
 			/* Normal */
 			case 3:
 			{
-				sound(MSG_NOTICE);
-				msg_print("You are no longer full.");
+				message_format(MSG_NOTICE, 0, "You are no longer full.");
 				break;
 			}
 
 			/* Full */
 			case 4:
 			{
-				sound(MSG_NOTICE);
-				msg_print("You are no longer gorged.");
+				message_format(MSG_NOTICE, 0, "You are no longer gorged.");
 				break;
 			}
 		}
