diff -Naurb ../nethack-3.4.3//dat/Bard.des ./dat/Bard.des
--- ../nethack-3.4.3//dat/Bard.des	1969-12-31 21:00:00.000000000 -0300
+++ ./dat/Bard.des	2011-01-27 16:38:02.000000000 -0200
@@ -0,0 +1,323 @@
+#	The "start" level for the quest.
+#
+#	Here you meet your (besieged) class leader
+#	and receive your quest assignment.
+#
+MAZE: "Brd-strt",' '
+FLAGS: noteleport,hardfloor
+GEOMETRY:center,center
+MAP
+.......................................................}}........T..........
+.....T..............................................T...}}.............T....
+...........------------------------......................}}.................
+...........|......|.......|.......|..--...--.............}}.................
+...........|......|.......S...{...|..--...--.....T......}}..................
+..T........|---S--|.......|.......|.....................}}..................
+...........|......|.......--......|.......--.......T....}}......T...........
+....T.T....|......|........|.....--.......--...........}}...................
+...........|......--.......|.....|.....................}.............}}}..T.
+...T.......|.......+.......|.....+........--..........}}........T...}}.}}}..
+....T......|.\.....+.......|.....+........--.......T..}}............}...}}..
+...........|......--.......|.....|.....................}}....T.....}}....}..
+......T....|......|........|.....--.......--...T..T.....}}........T}..T...}.
+..T........|......|.......--......|.......--.........T...}}}}....}}.......}.
+...........|---S--|.......|.......|.........................}}...}........}.
+...........|......|.......S...{...|..--...--....T............}}.T}}....T.T}.
+...........|......|.......|.......|..--...--..................}...}.......}.
+.......T...------------------------........................T..}}.}}T.....}..
+.....................T.....................T...................}}}......}}..
+..................................................T...................}}}...
+..T..................................................................}}....T
+ENDMAP
+# Dungeon Description
+REGION:(00,00,75,20),lit,"ordinary"
+# Stairs
+STAIR:(01,08),down
+# Portal arrival point
+BRANCH:(73,02,73,02),(0,0,0,0)
+# Doors
+DOOR:closed,(15,05)
+DOOR:closed,(15,14)
+DOOR:locked,(26,04)
+DOOR:locked,(26,15)
+DOOR:locked,(19,09)
+DOOR:locked,(19,10)
+DOOR:locked,(33,09)
+DOOR:locked,(33,10)
+# Class leader
+MONSTER:'@',"Pindar",(13,10)
+OBJECT:'(',"chest",(13,10)
+# Other treasures
+OBJECT[33%]:'(',"chest",(14,04)
+OBJECT[33%]:'(',"chest",(14,15)
+# Statues
+OBJECT:'`',"statue",(35,07), "human", 2
+OBJECT:'`',"statue",(35,12), "human", 2
+OBJECT:'`',"statue",(22,05), "human", 2
+OBJECT:'`',"statue",(22,14), "human", 2
+# Rhymers for the audience chamber
+MONSTER:'@',"rhymer",(12,07)
+MONSTER:'@',"rhymer",(13,07)
+MONSTER:'@',"rhymer",(14,07)
+MONSTER:'@',"rhymer",(15,07)
+MONSTER:'@',"rhymer",(12,13)
+MONSTER:'@',"rhymer",(13,13)
+MONSTER:'@',"rhymer",(14,13)
+MONSTER:'@',"rhymer",(15,13)
+# Non diggable walls
+NON_DIGGABLE:(00,00,75,20)
+TRAP:random,random
+# Nymphs next of river
+MONSTER: 'n',random,(62,07),peaceful
+MONSTER: 'n',random,(67,10),peaceful
+MONSTER: 'n',random,(64,16),peaceful
+MONSTER: 'n',random,(64,10),peaceful
+MONSTER: 'n',random,(68,02),peaceful
+MONSTER: 'n',random,(71,07),peaceful
+MONSTER: 'n',random,(72,15),peaceful
+# Wild animals tamed by the nemesis.
+MONSTER: ';',"piranha",random,hostile
+MONSTER: 'd',random,random,hostile
+MONSTER: 'f',random,random,hostile
+MONSTER: 'S',random,random,hostile
+MONSTER: 'r',random,random,hostile
+MONSTER: 'u',random,random,hostile
+MONSTER: 'B',random,random,hostile
+
+
+
+
+#
+#	The "locate" level for the quest.
+#
+#	Here you have to reach the flowery island of Anthemoessa
+#	and descend into the Old Ruins to find your quest nemesis.
+#
+
+MAZE: "Brd-loca",' '
+FLAGS: hardfloor
+GEOMETRY:center,center
+MAP
+}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
+}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
+}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
+}}}}}}}}}}}}}}}}}}}.....}}}}}}}}}}}}}}}}..........}}}}}}}}}}}}}}}}}}}}}}}...
+}}}}}}}}}}}}}}}}}....T................................}}}}}}}}}}}}}}}}}.....
+}}}}}}}}}}}}}}}}}...................................T...}}}}}}}}}..}}}}}.T..
+}}}}}}}}}}}}}.......----......--.....--......T........}}}}}}}}}....}}.}}....
+}}}}}}}}}}}.........|................-...............}}}}}}}}}}}}}}}}}}}....
+}}}}}}}}}}..........|......|......|................}}}}}}}}}}}}}}}}}}}......
+}}.}}}}}}...........|......+......+..-.............}.}}}}}}}}}}.}}}}}}......
+}}}}}}}}}.......T...|......+......+................}}}}}}}}}}}}.}}}}}}......
+}}}}}.}}............|......|......|........T......}}}}.}}..}}}.}}}}}}}}...T.
+}}}}}}}}}}..........|......|......|..--..........}}}}}}}}..}}.}}}}}}}}}.....
+}}}}}}}}}...........---------------..--..........}}}}}}}}}}}}}}}}}}}}}}}}}..
+}}}}}}}}}.......................................}}}}}}}}}}}}}}}}}}}}}}}}}...
+}}}}}}}}................................}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}..
+}}}}}}}}.....T.......................}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
+}}}}}}}}}....................}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
+}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
+}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}..}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
+}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}..}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
+ENDMAP
+# Dungeon Description
+REGION:(00,00,75,20),lit,"ordinary"
+# Doors
+#DOOR:locked,(28,11)
+# Stairs
+STAIR:(74,08),up
+STAIR:(24,10),down
+# Non diggable walls
+NON_DIGGABLE:(00,00,75,19)
+# Objects
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+# some boulders and stones for the ruins.
+OBJECT:'`',"boulder",(38,07)
+OBJECT:'`',"boulder",(37,10)
+OBJECT:'*',"rock",(38,10)
+OBJECT:'`',"boulder",(26,06)
+OBJECT:'*',"rock",(28,06)
+OBJECT:'*',"rock",(29,06)
+# Random traps
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+# Random monsters.
+MONSTER: ';',"piranha",random,hostile
+MONSTER: ';',"piranha",random,hostile
+MONSTER: ';',"piranha",random,hostile
+MONSTER: 'd',random,random,hostile
+MONSTER: 'd',random,random,hostile
+MONSTER: 'f',random,random,hostile
+MONSTER: 'f',random,random,hostile
+MONSTER: 'S',random,random,hostile
+MONSTER: 'S',random,random,hostile
+MONSTER: 'r',random,random,hostile
+MONSTER: 'u',random,random,hostile
+MONSTER: 'B',random,random,hostile
+MONSTER: 'B',random,random,hostile
+
+
+
+#
+#	The "goal" level for the quest.
+#
+#	Here you meet your nemesis.  You have to
+#	defeat her in combat to gain the artifact you have
+#	been assigned to retrieve.
+#
+
+MAZE: "Brd-goal", ' '
+GEOMETRY:center,center
+MAP
+----------------------------------------------------------------------------
+|..........................................................................|
+|...........................---...---.........---...---....................|
+|...........................|.|...|.|.........|.|...|......................|
+|...........................---...---.........---...-......................|
+|..........................................................................|
+|.....................---...........................---....................|
+|.....................|.|...........................|.|....................|
+|.....................---...........................--.....................|
+|..........................................................................|
+|.....................---...........................---....................|
+|.....................|.|...........................|.|....................|
+|.....................---...........................---....................|
+|..........................................................................|
+|.....................---...---...---...---.........---....................|
+|.....................|.|...|.|...|.|...|.|...|.....|.|....................|
+|.....................---...---...---...---...---...---....................|
+|..........................................................................|
+|..........................................................................|
+----------------------------------------------------------------------------
+ENDMAP
+# Dungeon Description
+REGION:(00,00,75,19),unlit,"ordinary"
+REGION:(22,02,54,16),lit,"ordinary"
+# Stairs
+STAIR:(69,06),up
+# Non diggable walls
+NON_DIGGABLE:(00,00,75,19)
+# Objects
+OBJECT:'(',"wooden harp",(38,10),blessed,0,"The Lyre of Orpheus"
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+# ruins
+OBJECT:'`',"boulder",(22,02)
+OBJECT:'`',"boulder",(23,02)
+OBJECT:'`',"boulder",(24,03)
+OBJECT:'*',"rock",(25,02)
+OBJECT:'`',"boulder",(25,04)
+OBJECT:'`',"boulder",(40,02)
+OBJECT:'`',"boulder",(41,02)
+OBJECT:'`',"boulder",(43,03)
+OBJECT:'*',"rock",(40,02)
+OBJECT:'*',"rock",(39,02)
+OBJECT:'`',"boulder",(41,04)
+OBJECT:'`',"boulder",(53,03)
+OBJECT:'`',"boulder",(54,08)
+# Quest nemesis
+MONSTER:'n',"Aglaope",(38,10),asleep
+# Monsters
+MONSTER:'s',random,(33,06),hostile
+MONSTER:'S',random,(33,08),hostile
+MONSTER:'r',random,(33,10),hostile
+MONSTER:'d',random,(33,12),hostile
+MONSTER:'f',random,(33,14),hostile
+MONSTER:'f',random,(43,06),hostile
+MONSTER:'d',random,(43,08),hostile
+MONSTER:'r',random,(43,10),hostile
+MONSTER:'S',random,(43,12),hostile
+MONSTER:'s',random,(43,14),hostile
+
+
+#
+#	The "fill" levels for the quest.
+#
+#	These levels are used to fill out any levels not occupied by specific
+#	levels as defined above. "filla" is the upper filler, between the
+#	start and locate levels, and "fillb" the lower between the locate
+#	and goal levels.
+#
+
+MAZE: "Brd-fila" , ' '
+INIT_MAP: '.' , 'T' , true , true , random , true
+NOMAP
+#
+STAIR: random, up
+STAIR: random, down
+#
+OBJECT: random, random, random
+OBJECT: random, random, random
+OBJECT: random, random, random
+OBJECT: random, random, random
+OBJECT: random, random, random
+OBJECT: random, random, random
+OBJECT: random, random, random
+#
+TRAP: random, random
+TRAP: random, random
+TRAP: random, random
+TRAP: random, random
+#
+MONSTER: 'S', random, random, hostile
+MONSTER: 's', random, random, hostile
+MONSTER: 'u', random, random, hostile
+MONSTER: 'd', random, random, hostile
+MONSTER: 'f', random, random, hostile
+MONSTER: 's', random, random, hostile
+MONSTER: 'S', random, random, hostile
+
+
+LEVEL: "Brd-filb"
+#
+ROOM: "ordinary" , random, random, random, random
+STAIR: random, up
+OBJECT: random,random,random
+MONSTER: 'S', random, random
+
+ROOM: "ordinary" , random, random, random, random
+OBJECT: random, random, random
+OBJECT: random,random,random
+MONSTER: 'r', random, random
+
+ROOM: "ordinary" , random, random, random, random
+OBJECT: random, random, random
+TRAP: random, random
+OBJECT: random,random,random
+MONSTER: 's', random, random
+
+ROOM: "ordinary" , random, random, random, random
+STAIR: random, down
+OBJECT: random, random, random
+TRAP: random, random
+MONSTER: 'S', random, random
+
+ROOM: "ordinary" , random, random, random, random
+OBJECT: random, random, random
+OBJECT: random, random, random
+TRAP: random, random
+MONSTER: 'S', random, random
+
+ROOM: "ordinary" , random, random, random, random
+OBJECT: random, random, random
+TRAP: random, random
+MONSTER: 's', random, random
+
+RANDOM_CORRIDORS
+
diff -Naurb ../nethack-3.4.3//dat/data.base ./dat/data.base
--- ../nethack-3.4.3//dat/data.base	2003-12-07 21:39:13.000000000 -0200
+++ ./dat/data.base	2011-01-27 17:08:34.000000000 -0200
@@ -29,6 +29,24 @@
 	probable that the asker went on worrying out answers for himself.
 		[ The Runaway Abbot, by G. K. Chesterton ]
 aclys
+aglaope
+siren
+	In Greek mythology, the Sirens were three dangerous bird-women, 
+	portrayed as seductresses who lured nearby sailors with their 
+	enchanting music and voices to shipwreck on the rocky coast of 
+	their island. [...] In some later, rationalized traditions, the
+	literal geography of the "flowery" island of Anthemoessa, or 
+	Anthemusa, is fixed: sometimes on Cape Pelorum and at others in 
+	the islands known as the Sirenuse, near Paestum, or in Capreae.
+	All such locations were surrounded by cliffs and rocks.
+
+	Their number is variously reported as between two and five. 
+	In the Odyssey, Homer says nothing of their origin or names, 
+	but gives the number of the Sirens as two.  Later writers mention
+	both their names and number: some state that there were three, 
+	Peisinoe, Aglaope, and Thelxiepeia or Parthenope, Ligeia, and 
+	Leucosia.
+		[ http://en.wikipedia.org/wiki/Siren ]
 aklys
 	A short studded or spiked club attached to a cord allowing
 	it to be drawn back to the wielder after having been thrown.
@@ -153,6 +171,16 @@
 	fiercely as its small, distant cousin.  Various varieties
 	exist, and they are known and feared for their relentless
 	persecution of their victims.
+anthemoessa
+	According to the Roman poets Virgil and Ovid, the Sirenum 
+	scopuli were three small rocky islands where the Sirens of
+	Greek mythology lived and lured sailors to their deaths.
+	[...]
+	Similarly, Anthemoessa (or Anthemusa) was the island home 
+	of the Sirens in other versions of the myth.  Although the
+	name no longer exists, varying accounts attribute 
+	Anthemoessa to either the island of Ischia or Capri.
+		[ http://en.wikipedia.org/wiki/Anthemoessa ]
 anu
 	Anu was the Babylonian god of the heavens, the monarch of
 	the north star.  He was the oldest of the Babylonian gods,
@@ -330,6 +358,12 @@
 barbed devil
 	Barbed devils lack any real special abilities, though they
 	are quite difficult to kill.
+bard
+	The bard is a wanderer, one that plays music at taverns to 
+	earn money, win friends and influence people. 
+	His wanderings gave him some basic knowledge on several 
+	different abilities and some knowledge on ancient legends, 
+	myths, magic, and legendary items.
 *bat
 	A bat, flitting in the darkness outside, took the wrong turn
 	as it made its nightly rounds and came in through the window
@@ -2380,6 +2414,16 @@
 	in the affections of her lover. If she kills the lynx, she
 	will overcome her rival.
 		[ 10,000 Dreams Interpreted, by Gustavus Hindman Miller ]
+lyre
+	The lyre is a stringed musical instrument well known for its
+	use in classical antiquity and later.
+	[...]
+	According to ancient Greek mythology, the young god Hermes
+	created the lyre from a slaughtered cow from Apollo's sacred
+	herd, using the intestines for the strings - eventually Apollo
+	discovered who had stolen his herd, but Hermes was forgiven
+	after he gave Apollo the instrument.
+	      [ http://en.wikipedia.org/wiki/Lyre ]
 magic marker
 	The pen is mightier than the sword.
 		[ Richelieu, by Edward Bulwer-Lytton ]
@@ -3009,6 +3053,30 @@
 	club. Sirius, his dog, follows him, and the Pleiads fly
 	before him.
 		[ Bulfinch's Mythology, by Thomas Bulfinch ]
+orpheus
+	Orpheus is a legendary figure, described by most ancient
+	sources as Thracian, and venerated throughout the ancient
+	Hellenised world as a heroic, civilising benefactor to
+	mankind. [...] Pindar calls Orpheus "the father of songs"
+	and asserts him as a son of the Thracian king Oeagrus and
+	the Muse Calliope.
+	[...]
+	The most famous story in which Orpheus figures is that of
+	his wife Eurydice (also known as Agriope). [...] Eurydice
+	fell into a nest of vipers and she suffered a fatal bite
+	on her heel.  Her body was discovered by Orpheus who,
+	overcome with grief, played such sad and mournful songs
+	that all the nymphs and gods wept.  On their advice, Orpheus
+	traveled to the underworld and by his music softened the
+	hearts of Hades and Persephone (he was the only person ever
+	to do so), who agreed to allow Eurydice to return with him
+	to earth on one condition: he should walk in front of her
+	and not look back until they both had reached the upper
+	world. He set off with Eurydice following, and, in his
+	anxiety, as soon as he reached the upper world, he turned to
+	look at her, forgetting that both needed to be in the upper
+	world, and she vanished for the second time, but now forever.
+	       [ http://en.wikipedia.org/wiki/Orpheus ]
 osaku
 	The osaku is a small tool for picking locks.
 owlbear
@@ -3062,6 +3130,8 @@
 	it to kill and devour it, though in any other way they move
 	but exceeding slow.
 		[ the Bestiary of Xygag ]
+pindar
+	Pindar (ca. 522–443 BC), was an Ancient Greek lyric poet.
 piranha
 	They live in "schools." Many times they will wait for prey 
 	to come to the shallow water of the river. Then the large 
diff -Naurb ../nethack-3.4.3//dat/quest.txt ./dat/quest.txt
--- ../nethack-3.4.3//dat/quest.txt	2003-12-07 21:39:13.000000000 -0200
+++ ./dat/quest.txt	2010-12-19 02:45:33.000000000 -0200
@@ -556,6 +556,270 @@
 "This is all I know, %p.  I hope it will help you."
 %E
 #
+#	Bard
+#
+%Cc Brd 00001
+Suddenly, you see yourself at the surroundings of %H.
+You smile as you recognize the land, remembering of the days you lived here,
+learning the power of songs over nature, before you went on your voyages 
+around the world.
+
+But, wait... something is wrong.  The land looks desolated; the beautiful
+river, which flow produced a soft music, now looks dead; the breeze,
+once an inspiration to the music students, makes you shiver. The nymphs are
+scattered and it seems all the muses abandoned the place. You feel something 
+is wrong with the wild life here, too.  What happened to %H?
+%E
+%Cp Brd 00002
+By %d, you can't bear seeing %H again in this sorry state!  You must hurry.
+%E
+%Cp Brd 00003
+You are back at %H.
+You have an odd feeling this may be the last time you ever come here.
+%E
+%Cp Brd 00005
+"%lC managed to play a space-bending music to create the magic portal!"
+%E
+%Cp Brd 00006
+"The muses are gone, and all the beauty of this place was taken... 
+We are hopeless..."
+%E
+%Cp Brd 00007
+"Hurry, %p!  %lC are waiting for you!!"
+%E
+%Cp Brd 00008
+"%ns minions attacked us without warning!"
+%E
+%Cp Brd 00009
+"The poor muses... they didn't stand a chance..."
+%E
+%Cp Brd 00010
+"Do you want to buy a second hand harp? Just a couple chords are missing!"
+%E
+%Cp Brd 00011
+"The magic portal now seems like it will remain stable for quite some time."
+%E
+%Cp Brd 00012
+"Have you noticed how much stronger %l is since %o was recovered?"
+%E
+%Cp Brd 00013
+"Thank %d!  We weren't positive you would defeat %n."
+%E
+%Cp Brd 00014
+"I, too, have the desire to venture the world, and to use all the musical
+knowledge we learn here to make the world a better place."
+%E
+%Cc Brd 00015
+You see %l smile sadly as you approaches him.
+
+"%pC, it has been a long time since you departed.  I hope you had made
+good use of your musical abilities in your voyages, since you was my most
+promising student.  But I did not called you to discuss that.
+
+"%HC are in desperate need of your help, and you are to 
+go on the most difficult task of your life. But first, let me hear your
+voice to determine if you are already prepared for it..."
+%E
+%Cp Brd 00016
+"Well, %p, one more time you returns to %H.
+Perhaps you are now ready..."
+%E
+%Cp Brd 00017
+"%pC, we do not have time for purposeless talking. Anyone who studies the
+mysteries of music must understand that music is not supposed to
+be only an entertainment. You were called for a very dangerous quest,
+but you can only take it after you are really prepared!"
+%E
+%Cc Brd 00018
+"You are not honoring your training, %p!
+
+"You are expulsed from %H. Go away! I need to find
+another one."
+%E
+%Cc Brd 00019
+"%pC, you have not yet mastered your full potential to harmonize your
+music with the world. You are a mere %r yet; the quest I have
+for you will demand at least %Ra. Go, now, train yourself in
+the arts you learned here, and return when you become more experienced."
+%E
+%Cc Brd 00020
+"What is that, %p? You had deviated from the paths of %d?
+
+"Remember what I taught you: music is a gift from the gods.
+If you can not harmonize yourself with %d, you will not be able
+to harmonize your music with any living creature.
+
+"Go for now, %p. Learn the %a paths again, and only return when
+you have purified yourself."
+%E
+%Cc Brd 00021
+"%p, I see you are ready for this dire task.
+
+"%HC was attacked by dozens of wild animals controlled by the 
+mesmerizing voice of %n the siren, 
+and %o was taken. 
+She always envied the power %o has over nature and all 
+living things. 
+
+"%pC, I am too old and weak to go after %o.  You was
+always my most promising student; it is over your shoulders the responsibility
+of rescuing it.
+
+"Please, take %o back from %n.  We do not know what
+she can do with it, and it is supposed to be used to create harmony in this
+world, not as an instrument to enslave nature.  You must travel to 
+%i, find her lair at the old ruins there, and face
+%n herself. %d be with you."
+%E
+%Cp Brd 00025
+"Beware, for %n is immune to most songs."
+%E
+%Cp Brd 00026
+"At %i you may face many beings controlled by %n. Be cunning."
+%E
+%Cp Brd 00027
+"%nC can corrupt %o. Hurry!"
+%E
+%Cp Brd 00028
+"%d will come to your aid when you call."
+%E
+%Cp Brd 00029
+"Use %ns own ways against her; try to break her control over 
+%is wild life."
+%E
+%Cp Brd 00030
+"You will find the way to %i near the back of %H."
+%E
+%Cp Brd 00031
+"Go forth with the blessings of %d."
+%E
+%Cp Brd 00032
+"I will have my %gP watch for your return."
+%E
+%Cp Brd 00033
+"Beware, %i can be a very dangerous place."
+%E
+%Cp Brd 00034
+"You will feel when %o is near.  Proceed with care!"
+%E
+%Cc Brd 00035
+You see %i. The entrance to the lair must be inside the old ruins...
+%E
+%Cp Brd 00036
+You believe that you may once again invade %i.
+%E
+%Cc Brd 00040
+You can feel in your soul that %o is very near; its presence
+is soothing, even in this dark place.
+%E
+%Cp Brd 00041
+The aura of %o tingles at the edge of your perception.
+%E
+%Cc Brd 00050
+%nC holds %o close to her face, and she seems to be
+quietly talking to it. After hearing you enter, she looks at you and her
+cold stare makes you paralyzed for a second; then her beautiful, frightening
+voice is heard:
+
+"%lC sent one of his pupils instead of coming himself? 
+
+"Mortal hands do not deserve to touch %o, its power is beyond 
+your understanding. I can use its melodies to control all beings, maybe even 
+nature itself... I know I can. It should always have been mine. I deserve it!"
+%E
+%Cc Brd 00051
+"You again, %p?  You are not able to handle %o... how could 
+a worm possibly understand the music of the gods?"
+%E
+%Cp Brd 00052
+"I'm sure that your perseverance shall be the subject of innumerable
+ballads, but you shall not be around to hear them, I fear!"
+%E
+%Cp Brd 00053
+"Please. You are a mere %r, what could you possibly do?
+You think I can fall for your songs and sleep like a weakling?
+You do not deserve %o!"
+%E
+%Cp Brd 00060
+"I am not susceptible to feeble enchanting songs, you fool!"
+%E
+%Cp Brd 00061
+"Stop fighting. Just hear my voice... everything will be alright..."
+%E
+%Cp Brd 00062
+"I shall make %H the palace of my empire over nature!
+%oC was always meant for me..."
+%E
+%Cp Brd 00063
+"Are you ready yet to beg for mercy?  I could be lenient..."
+%E
+%Cp Brd 00064
+"You shall join the enslaved multitude I command!"
+%E
+%Cp Brd 00065
+"Your soul belongs to me now, %p! Grovel before your queen!"
+%E
+%Cp Brd 00066
+"Your faith in %d is for naught!  Come, submit to me now!"
+%E
+%Cp Brd 00067
+"Go on, %p... You are just increasing my wrath..."
+%E
+%Cp Brd 00068
+"My loyal servants shall take care of you!"
+%E
+%Cp Brd 00069
+%nC laughs, and the ruins walls shake...
+%E
+%Cc Brd 00070
+As you touch %o, its harmonic power infuses you with joy.
+You finally understand what %l always meant when he talked about
+harmonizing with the living beings throughout the music.  Although you feel in
+your heart it accepting you as its new master, you know you must return it to
+its rightful owner, %l.
+%E
+%Cc Brd 00080
+%nC yells while her legs falter and she falls to the floor:
+
+	No!  It can not be.  %oC is mine!  Mine!
+
+%iC seems to shake as %n shrieks, 
+and then everything is silence.
+%E
+%Cc Brd 00081
+%lC notices %o in your possession,
+smiles at you and says:
+
+    I knew you could defeat %n and retrieve %o.
+    You are truly destined to be a great %c.
+
+    I feel %o has already chosen to be used by you.
+    Do not be shy, my %S; it is yours know. May %d give you wisdom
+    on how to use it.
+
+    Now you are ready for a quest even greater. Go, and retrieve the
+    Amulet of Yendor for %d.
+%E
+%Cc Brd 00082
+"You are the keeper of %o now.  Return to %Z,
+and continue with your quest."
+%E
+%Cp Brd 00090
+"Come near, my %S, and share your adventures with me.
+So, have you succeeded in your quest for the Amulet of Yendor?"
+%E
+%Cc Brd 00091
+"Congratulations, %p.  I always knew that if anyone could succeed
+in defeating the Wizard of Yendor and his minions, it would be you.
+
+"Go now, and take the Amulet to the astral plane.  Once there, present
+the Amulet on the altar of %d.  Along the way you shall pass through the
+four elemental planes.  These planes are like nothing you have ever
+experienced before, so be prepared!
+
+"For this you were born, %s!  I am very proud of you."
+%E
+#
 #	Cave(wo)man
 #
 %Cc Cav 00001
diff -Naurb ../nethack-3.4.3//include/artilist.h ./include/artilist.h
--- ../nethack-3.4.3//include/artilist.h	2003-12-07 21:39:13.000000000 -0200
+++ ./include/artilist.h	2010-11-27 14:08:32.000000000 -0200
@@ -163,6 +163,13 @@
 	PHYS(5,0),	NO_DFNS,	NO_CARY,
 	LEVITATION,	A_NEUTRAL, PM_BARBARIAN, NON_PM, 2500L ),
 
+#ifdef BARD
+A("The Lyre of Orpheus",	WOODEN_HARP,
+	(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_SPEAK), 0, 0,
+	NO_ATTK,	NO_DFNS,	CARY(AD_MAGM),
+	TAMING,		A_NEUTRAL, PM_BARD, NON_PM, 5000L ),
+#endif
+
 A("The Sceptre of Might",	MACE,
 	(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_DALIGN), 0, 0,
 	PHYS(5,0),	NO_DFNS,	CARY(AD_MAGM),
diff -Naurb ../nethack-3.4.3//include/config.h ./include/config.h
--- ../nethack-3.4.3//include/config.h	2003-12-07 21:39:13.000000000 -0200
+++ ./include/config.h	2009-04-11 02:32:36.000000000 -0300
@@ -351,6 +351,8 @@
 /*#define GOLDOBJ */	/* Gold is kept on obj chains - Helge Hafting */
 /*#define AUTOPICKUP_EXCEPTIONS */ /* exceptions to autopickup */
 
+#define BARD		/* Bards and songs - Andre Bertelli */
+
 /* End of Section 5 */
 
 #include "global.h"	/* Define everything else according to choices above */
diff -Naurb ../nethack-3.4.3//include/edog.h ./include/edog.h
--- ../nethack-3.4.3//include/edog.h	2003-12-07 21:39:13.000000000 -0200
+++ ./include/edog.h	2010-11-06 17:33:28.000000000 -0200
@@ -27,6 +27,12 @@
 	int revivals;			/* count pet deaths */
 	int mhpmax_penalty;		/* while starving, points reduced */
 	Bitfield(killed_by_u, 1);	/* you attempted to kill him */
+#ifdef BARD
+#define EDOG_ENCOURAGED_MAX		7
+	Bitfield(encouraged, 3);	/* affected by Encourage song */
+	Bitfield(friend, 1);		/* tamed by song - will lose tameness */
+	Bitfield(waspeaceful, 1);      	/* was peaceful before tame song */
+#endif
 };
 #define EDOG(mon)	((struct edog *)&(mon)->mextra[0])
 
diff -Naurb ../nethack-3.4.3//include/extern.h ./include/extern.h
--- ../nethack-3.4.3//include/extern.h	2003-12-07 21:39:13.000000000 -0200
+++ ./include/extern.h	2008-04-04 23:26:50.000000000 -0300
@@ -1304,6 +1304,9 @@
 
 E void NDECL(awaken_soldiers);
 E int FDECL(do_play_instrument, (struct obj *));
+#ifdef BARD
+E int FDECL(pet_can_sing, (struct monst *,BOOLEAN_P));
+#endif
 
 /* ### nhlan.c ### */
 #ifdef LAN_FEATURES
diff -Naurb ../nethack-3.4.3//include/mkroom.h ./include/mkroom.h
--- ../nethack-3.4.3//include/mkroom.h	2003-12-07 21:39:13.000000000 -0200
+++ ./include/mkroom.h	2010-11-03 17:45:18.000000000 -0200
@@ -75,6 +75,16 @@
 #define CANDLESHOP	24
 #define MAXRTYPE	24	/* maximum valid room type */
 
+#ifdef BARD
+#define MUSICSHOP	24
+#undef UNIQUESHOP
+#undef CANDLESHOP
+#undef MAXRTYPE
+#define UNIQUESHOP	25
+#define CANDLESHOP	25
+#define MAXRTYPE	25
+#endif
+
 /* Special type for search_special() */
 #define ANY_TYPE	(-1)
 #define ANY_SHOP	(-2)
diff -Naurb ../nethack-3.4.3//include/rm.h ./include/rm.h
--- ../nethack-3.4.3//include/rm.h	2003-12-07 21:39:13.000000000 -0200
+++ ./include/rm.h	2010-11-24 23:07:18.000000000 -0200
@@ -70,6 +70,7 @@
 #define MAX_TYPE	36
 #define INVALID_TYPE	127
 
+
 /*
  * Avoid using the level types in inequalities:
  * these types are subject to change.
diff -Naurb ../nethack-3.4.3//include/skills.h ./include/skills.h
--- ../nethack-3.4.3//include/skills.h	2003-12-07 21:39:13.000000000 -0200
+++ ./include/skills.h	2009-04-05 23:16:20.000000000 -0300
@@ -62,17 +62,23 @@
 #define P_MATTER_SPELL      36
 #define P_FIRST_SPELL		P_ATTACK_SPELL
 #define P_LAST_SPELL		P_MATTER_SPELL
+#ifdef BARD
+#define P_MUSICALIZE		37	/* 'cast' spells as songs */
+#undef P_LAST_SPELL
+#define P_LAST_SPELL		P_MUSICALIZE
+#endif
 
 /* Other types of combat */
-#define P_BARE_HANDED_COMBAT	37
+#define P_BARE_HANDED_COMBAT	38
 #define P_MARTIAL_ARTS		P_BARE_HANDED_COMBAT	/* Role distinguishes */
-#define P_TWO_WEAPON_COMBAT	38	/* Finally implemented */
+#define P_TWO_WEAPON_COMBAT	39	/* Finally implemented */
 #ifdef STEED
-#define P_RIDING		39	/* How well you control your steed */
+#define P_RIDING		40	/* How well you control your steed */
 #define P_LAST_H_TO_H		P_RIDING
 #else
 #define P_LAST_H_TO_H		P_TWO_WEAPON_COMBAT
 #endif
+
 #define P_FIRST_H_TO_H		P_BARE_HANDED_COMBAT
 
 #define P_NUM_SKILLS		(P_LAST_H_TO_H+1)
diff -Naurb ../nethack-3.4.3//include/unixconf.h ./include/unixconf.h
--- ../nethack-3.4.3//include/unixconf.h	2003-12-07 21:39:13.000000000 -0200
+++ ./include/unixconf.h	2008-04-04 23:44:13.000000000 -0300
@@ -37,7 +37,7 @@
 #define NETWORK		/* if running on a networked system */
 			/* e.g. Suns sharing a playground through NFS */
 /* #define SUNOS4 */	/* SunOS 4.x */
-/* #define LINUX */	/* Another Unix clone */
+#define LINUX	/* Another Unix clone */
 /* #define CYGWIN32 */	/* Unix on Win32 -- use with case sensitive defines */
 /* #define GENIX */	/* Yet Another Unix Clone */
 /* #define HISX */	/* Bull Unix for XPS Machines */
diff -Naurb ../nethack-3.4.3//src/artifact.c ./src/artifact.c
--- ../nethack-3.4.3//src/artifact.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/artifact.c	2008-04-04 23:26:50.000000000 -0300
@@ -1396,6 +1396,30 @@
 	    else
 		Your("body seems to unfade...");
 	    break;
+#ifdef BARD
+	    /*
+	case HARMONIZE:
+	    {
+		struct monst *mtmp;
+		struct obj *otmp;
+		int i,j;
+
+		for(i = -u.ulevel; i <= u.ulevel; i++)
+		    for(j = -u.ulevel; j <= u.ulevel; j++)
+			if (isok(u.ux+i,u.uy+j) 
+			    && i*i + j*j < u.ulevel * u.ulevel) {
+			    mtmp = m_at(u.ux+i,u.uy+j);
+			    if (mtmp->mtame && distu(mtmp->mx, mtmp->my) < u.ulevel) {
+				mtmp->mhp = mtmp->mhpmax;
+				mtmp->msleeping = mtmp->mflee = mtmp->mblinded = mtmp->mcanmove = mtmp->mfrozen = mtmp->mstun = mtmp->mconf = 0;
+				mtmp->mcansee = 1;
+				mtmp->mtame++;
+			    }
+			}
+	    }
+	    break;
+	    */
+#endif
 	}
     }
 
diff -Naurb ../nethack-3.4.3//src/attrib.c ./src/attrib.c
--- ../nethack-3.4.3//src/attrib.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/attrib.c	2010-11-03 17:17:09.000000000 -0200
@@ -34,7 +34,11 @@
 		     {   7, &(HFast), "quick", "slow" },
 		     {  15, &(HStealth), "stealthy", "" },
 		     {	 0, 0, 0, 0 } },
-
+#ifdef BARD
+	brd_abil[] = { {	5, &(HSleep_resistance), "awake", "tired" },
+		     {	 10, &(HStealth), "stealthy", "noisy" },
+		     {	 0, 0, 0, 0 } },
+#endif
 	cav_abil[] = { {	 7, &(HFast), "quick", "slow" },
 		     {	15, &(HWarning), "sensitive", "" },
 		     {	 0, 0, 0, 0 } },
@@ -543,6 +547,9 @@
 	switch (Role_switch) {
 	case PM_ARCHEOLOGIST:   abil = arc_abil;	break;
 	case PM_BARBARIAN:      abil = bar_abil;	break;
+#ifdef BARD
+	case PM_BARD:           abil = brd_abil;	break;
+#endif
 	case PM_CAVEMAN:        abil = cav_abil;	break;
 	case PM_HEALER:         abil = hea_abil;	break;
 	case PM_KNIGHT:         abil = kni_abil;	break;
diff -Naurb ../nethack-3.4.3//src/dog.c ./src/dog.c
--- ../nethack-3.4.3//src/dog.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/dog.c	2010-11-06 17:39:13.000000000 -0200
@@ -30,6 +30,11 @@
 	EDOG(mtmp)->revivals = 0;
 	EDOG(mtmp)->mhpmax_penalty = 0;
 	EDOG(mtmp)->killed_by_u = 0;
+#ifdef BARD
+	EDOG(mtmp)->encouraged = 0;
+	EDOG(mtmp)->friend = 0;
+	EDOG(mtmp)->waspeaceful = 0;
+#endif
 }
 
 STATIC_OVL int
@@ -446,6 +451,11 @@
 	/* reduce tameness for every 150 moves you are separated */
 	if (mtmp->mtame) {
 	    int wilder = (imv + 75) / 150;
+#ifdef BARD
+	    /* monsters under influence of Friendship song go wilder faster */
+	    if (EDOG(mtmp)->friend)
+		    wilder *= 150;
+#endif
 	    if (mtmp->mtame > wilder) mtmp->mtame -= wilder;	/* less tame */
 	    else if (mtmp->mtame > rn2(wilder)) mtmp->mtame = 0;  /* untame */
 	    else mtmp->mtame = mtmp->mpeaceful = 0;		/* hostile! */
diff -Naurb ../nethack-3.4.3//src/dogmove.c ./src/dogmove.c
--- ../nethack-3.4.3//src/dogmove.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/dogmove.c	2010-11-29 00:49:20.000000000 -0200
@@ -540,6 +540,22 @@
 							after, udist, whappr);
 	if (appr == -2) return(0);
 
+#ifdef BARD
+	if (pet_can_sing(mtmp, FALSE))
+		return(3);
+	/* lose tameness if under effects of taming song */
+	if (has_edog && EDOG(mtmp)->friend && mtmp->mtame) {
+		mtmp->mtame -= (always_hostile(mtmp->data) ? 2 : 1);
+		if (mtmp->mtame <= 0) {
+			mtmp->mtame = 0;
+			EDOG(mtmp)->friend = 0;
+			mtmp->mpeaceful = EDOG(mtmp)->waspeaceful;
+		}
+		if (wizard)
+			pline("[%s friend for %d(%d)]", Monnam(mtmp), mtmp->mtame, EDOG(mtmp)->waspeaceful);
+	}
+#endif
+
 	allowflags = ALLOW_M | ALLOW_TRAPS | ALLOW_SSM | ALLOW_SANCT;
 	if (passes_walls(mtmp->data)) allowflags |= (ALLOW_ROCK | ALLOW_WALL);
 	if (passes_bars(mtmp->data)) allowflags |= ALLOW_BARS;
@@ -613,13 +629,21 @@
 		    int mstatus;
 		    register struct monst *mtmp2 = m_at(nx,ny);
 
+#ifdef BARD
+		    if ((int)mtmp2->m_lev >= (int)mtmp->m_lev+2 + EDOG(mtmp)->encouraged ||
+#else
 		    if ((int)mtmp2->m_lev >= (int)mtmp->m_lev+2 ||
+#endif
 			(mtmp2->data == &mons[PM_FLOATING_EYE] && rn2(10) &&
 			 mtmp->mcansee && haseyes(mtmp->data) && mtmp2->mcansee
 			 && (perceives(mtmp->data) || !mtmp2->minvis)) ||
 			(mtmp2->data==&mons[PM_GELATINOUS_CUBE] && rn2(10)) ||
 			(max_passive_dmg(mtmp2, mtmp) >= mtmp->mhp) ||
+#ifdef BARD
+			((mtmp->mhp*(4+EDOG(mtmp)->encouraged) < mtmp->mhpmax
+#else
 			((mtmp->mhp*4 < mtmp->mhpmax
+#endif
 			  || mtmp2->data->msound == MS_GUARDIAN
 			  || mtmp2->data->msound == MS_LEADER) &&
 			 mtmp2->mpeaceful && !Conflict) ||
@@ -788,6 +812,13 @@
 		newsym(cc.x,cc.y);
 		set_apparxy(mtmp);
 	}
+#ifdef BARD
+	if (EDOG(mtmp)->encouraged && (rn2(4))) {
+	    EDOG(mtmp)->encouraged--;
+	    if (!(EDOG(mtmp)->encouraged) && canseemon(mtmp))
+		pline("%s looks calm again.", Monnam(mtmp));
+	}
+#endif
 	return(1);
 }
 
diff -Naurb ../nethack-3.4.3//src/makemon.c ./src/makemon.c
--- ../nethack-3.4.3//src/makemon.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/makemon.c	2010-11-01 16:29:07.000000000 -0200
@@ -223,6 +223,10 @@
 		    if (rn2(2)) (void)mongets(mtmp, ELVEN_LEATHER_HELM);
 		    else if (!rn2(4)) (void)mongets(mtmp, ELVEN_BOOTS);
 		    if (rn2(2)) (void)mongets(mtmp, ELVEN_DAGGER);
+#ifdef BARD
+		    if (mm == PM_ELVENKING || mm == PM_ELF_LORD ? !rn2(10) : !rn2(50))
+			(void)mongets(mtmp, (rn2(2) ? WOODEN_FLUTE : WOODEN_HARP));
+#endif
 		    switch (rn2(3)) {
 			case 0:
 			    if (!rn2(4)) (void)mongets(mtmp, ELVEN_SHIELD);
@@ -335,6 +339,10 @@
 			if(!rn2(3)) (void)mongets(mtmp, ORCISH_SHIELD);
 			if(!rn2(3)) (void)mongets(mtmp, KNIFE);
 			if(!rn2(3)) (void)mongets(mtmp, ORCISH_CHAIN_MAIL);
+#ifdef BARD
+			if (mm == PM_ORC_CAPTAIN ? !rn2(10) : !rn2(50))
+			    (void)mongets(mtmp, LEATHER_DRUM);
+#endif
 			break;
 		    case PM_URUK_HAI:
 			if(!rn2(3)) (void)mongets(mtmp, ORCISH_CLOAK);
@@ -345,6 +353,10 @@
 			    m_initthrow(mtmp, ORCISH_ARROW, 12);
 			}
 			if(!rn2(3)) (void)mongets(mtmp, URUK_HAI_SHIELD);
+#ifdef BARD
+			if (mm == PM_ORC_CAPTAIN ? !rn2(10) : !rn2(50))
+			    (void)mongets(mtmp, LEATHER_DRUM);
+#endif
 			break;
 		    default:
 			if (mm != PM_ORC_SHAMAN && rn2(2))
diff -Naurb ../nethack-3.4.3//src/mhitm.c ./src/mhitm.c
--- ../nethack-3.4.3//src/mhitm.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/mhitm.c	2010-11-29 01:12:31.000000000 -0200
@@ -594,6 +594,14 @@
 	int armpro, num, tmp = d((int)mattk->damn, (int)mattk->damd);
 	boolean cancelled;
 
+#ifdef BARD
+	if (magr->mtame && EDOG(magr)) {
+		tmp += EDOG(magr)->encouraged;
+		if (wizard && EDOG(magr)->encouraged)
+			pline("[%s +%d]", Monnam(magr), EDOG(magr)->encouraged);
+	}
+#endif
+
 	if (touch_petrifies(pd) && !resists_ston(magr)) {
 	    long protector = attk_protection((int)mattk->aatyp),
 		 wornitems = magr->misc_worn_check;
diff -Naurb ../nethack-3.4.3//src/mon.c ./src/mon.c
--- ../nethack-3.4.3//src/mon.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/mon.c	2008-04-07 21:22:27.000000000 -0300
@@ -98,6 +98,9 @@
 /* Quest guardians */
 	case PM_STUDENT:     mndx = mode ? PM_ARCHEOLOGIST  : PM_HUMAN; break;
 	case PM_CHIEFTAIN:   mndx = mode ? PM_BARBARIAN : PM_HUMAN; break;
+#ifdef BARD
+	case PM_RHYMER:      mndx = mode ? PM_BARD   : PM_HUMAN; break;
+#endif
 	case PM_NEANDERTHAL: mndx = mode ? PM_CAVEMAN   : PM_HUMAN; break;
 	case PM_ATTENDANT:   mndx = mode ? PM_HEALER    : PM_HUMAN; break;
 	case PM_PAGE:        mndx = mode ? PM_KNIGHT    : PM_HUMAN; break;
@@ -545,7 +548,6 @@
 	    mtmp->mcanmove = 1;
 	if (mtmp->mfleetim && !--mtmp->mfleetim)
 	    mtmp->mflee = 0;
-
 	/* FIXME: mtmp->mlstmv ought to be updated here */
     }
 }
diff -Naurb ../nethack-3.4.3//src/monst.c ./src/monst.c
--- ../nethack-3.4.3//src/monst.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/monst.c	2010-12-19 02:07:38.000000000 -0200
@@ -2935,6 +2935,14 @@
 	SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0,
 	M1_HUMANOID|M1_OMNIVORE,
 	M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC),
+    MON("bard", S_HUMAN,
+	LVL(10, 12, 10, 2, -3), G_NOGEN,
+	A(ATTK(AT_WEAP, AD_PHYS, 1, 4),
+	  NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+	SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
+	M1_HUMANOID|M1_OMNIVORE,
+	M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE,
+	HI_DOMESTIC),
     MON("caveman", S_HUMAN,
 	LVL(10, 12, 10, 0, 1), G_NOGEN,
 	A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
@@ -3058,6 +3066,17 @@
 	M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE|
 	  M2_COLLECT|M2_MAGIC,
 	M3_CLOSE|M3_INFRAVISIBLE, HI_LORD),
+#ifdef BARD
+    MON("Pindar", S_HUMAN,
+	LVL(20, 12, 0, 50, -20), (G_NOGEN|G_UNIQ),
+	A(ATTK(AT_WEAP, AD_PHYS, 1, 6),
+	  NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+	SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
+	M1_HUMANOID|M1_OMNIVORE,
+	M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|
+	  M2_MALE|M2_COLLECT|M2_MAGIC,
+	M3_CLOSE|M3_INFRAVISIBLE, HI_LORD),
+#endif
     MON("Shaman Karnov", S_HUMAN,
 	LVL(20, 12, 0, 30, 20), (G_NOGEN|G_UNIQ),
 	A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
@@ -3207,6 +3226,16 @@
 	M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_STRONG|M2_MALE|M2_STALK|M2_HOSTILE|
 	  M2_NASTY|M2_COLLECT|M2_MAGIC,
 	M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISIBLE, HI_LORD),
+#ifdef BARD
+    MON("Aglaope", S_NYMPH,
+	LVL(17, 9, -4, 90, -15), (G_NOGEN|G_UNIQ|G_NOCORPSE),
+	A(ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), 
+	  ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK),
+	SIZ(600, 300, 0, MS_NEMESIS, MZ_HUMAN), MR_SLEEP|MR_POISON, 0,
+	M1_HUMANOID|M1_TPORT|M1_TPORT_CNTRL,
+	M2_NOPOLY|M2_LORD|M2_PNAME|M2_HOSTILE|M2_FEMALE|M2_COLLECT|M2_MAGIC,
+	M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISION|M3_INFRAVISIBLE, HI_LORD),
+#endif
 	/* Multi-headed, possessing the breath attacks of all the other dragons
 	 * (selected at random when attacking).
 	 */
@@ -3347,6 +3376,16 @@
 	M1_HUMANOID|M1_OMNIVORE,
 	M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE,
 	HI_DOMESTIC),
+#ifdef BARD
+    MON("rhymer", S_HUMAN,
+	LVL(5, 12, 10, 10, -3), G_NOGEN,
+	A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
+	  NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+	SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0,
+	M1_HUMANOID|M1_OMNIVORE,
+	M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT,
+	M3_INFRAVISIBLE, HI_DOMESTIC),
+#endif
     MON("neanderthal", S_HUMAN,
 	LVL(5, 12, 10, 10, 1), G_NOGEN,
 	A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
diff -Naurb ../nethack-3.4.3//src/music.c ./src/music.c
--- ../nethack-3.4.3//src/music.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/music.c	2011-01-28 17:27:30.000000000 -0200
@@ -6,7 +6,7 @@
  * This file contains the different functions designed to manipulate the
  * musical instruments and their various effects.
  *
- * Actually the list of instruments / effects is :
+ * Currently the list of instruments / effects is :
  *
  * (wooden) flute	may calm snakes if player has enough dexterity
  * magic flute		may put monsters to sleep:  area of effect depends
@@ -24,9 +24,17 @@
  * drum of earthquake	Will initiate an earthquake whose intensity depends
  *			on player level.  That is, it creates random pits
  *			called here chasms.
+ *
+ * If BARD is #defined, there is a new skill called 'musicalize', referring to
+ * the ability of 'casting' spells in the form of songs. -- ABA
  */
 
+
 #include "hack.h"
+#ifdef BARD
+#include "skills.h"
+#include "edog.h"
+#endif
 
 STATIC_DCL void FDECL(awaken_monsters,(int));
 STATIC_DCL void FDECL(put_monsters_to_sleep,(int));
@@ -35,6 +43,16 @@
 STATIC_DCL void FDECL(charm_monsters,(int));
 STATIC_DCL void FDECL(do_earthquake,(int));
 STATIC_DCL int FDECL(do_improvisation,(struct obj *));
+#ifdef BARD
+STATIC_DCL void FDECL(tame_song,(int));
+STATIC_DCL void FDECL(sleep_song,(int));
+STATIC_DCL void FDECL(scary_song,(int));
+STATIC_DCL void FDECL(confusion_song,(int));
+STATIC_DCL unsigned char FDECL(songs_menu,(struct obj *));
+STATIC_PTR int NDECL(play_song);
+STATIC_DCL void FDECL(slowness_song,(int));
+STATIC_DCL void FDECL(encourage_pets,(int));
+#endif
 
 #ifdef UNIX386MUSIC
 STATIC_DCL int NDECL(atconsole);
@@ -53,6 +71,672 @@
 void FDECL( amii_speaker, ( struct obj *, char *, int ) );
 #endif
 
+
+#ifdef BARD
+
+struct songspell {
+	short	sp_id;
+	char	*name;
+	xchar	level;
+	xchar	turns;
+	int	instr1; /* this instrument can play this music */
+	int	instr2; /* this one has a bonus to successfully play this song */
+};	
+
+#endif /* BARD */
+/* we need at least these defines (so they're outside #define BARD) */
+#define SNG_NONE            0
+#define SNG_IMPROVISE       99
+#define SNG_NOTES           98
+#define SNG_PASSTUNE        97
+#ifdef BARD
+/* same order and indices as below */
+#define SNG_SLEEP		1
+#define SNG_CONFUSION		2
+#define SNG_SLOW		3
+#define SNG_FEAR		4
+#define SNG_TAME		5
+#define SNG_COURAGE		6
+#define SNG_FIRST		SNG_SLEEP
+#define SNG_LAST_ENCHANTMENT	SNG_COURAGE	/* last song based on an enchantment spell */
+#define SNG_LAST		SNG_COURAGE
+#define SNG_IMPROVISE_CHAR	'i'
+#define SNG_NOTES_CHAR		'n'
+#define SNG_PASSTUNE_CHAR	'p'
+
+/* songs based on enchantment spells must be the first ones on list, because of
+   SNG_LAST_ENCHANTMENT */
+NEARDATA const struct songspell songs[] = {
+	/* sp_id		name	    level turns instr1		instr2 */
+	{ 0,			"None",		0, 1,	0,		0 },
+	{ SPE_SLEEP,		"Lullaby",	1, 4,	WOODEN_HARP,	WOODEN_FLUTE },
+	{ SPE_CONFUSE_MONSTER,	"Cacophony",	2, 5,	TOOLED_HORN,	LEATHER_DRUM },
+	{ SPE_SLOW_MONSTER,	"Drowsiness",	2, 5,	WOODEN_FLUTE, 	WOODEN_HARP },
+	{ SPE_CAUSE_FEAR,	"Despair",	3, 6,	LEATHER_DRUM, 	TOOLED_HORN },
+	{ SPE_CHARM_MONSTER,	"Friendship",	3, 6,	WOODEN_FLUTE, 	WOODEN_HARP },
+	{ SPE_CAUSE_FEAR,	"Inspire Courage",3,6,	LEATHER_DRUM, 	BUGLE }
+/*	random ideas that weren't implemented -- based in spells from other schools
+	{ SPE_HASTE_SELF,	"Haste Pets"
+	{ SPE_CURE_BLINDNESS,	"Cause Blindness"
+	{ SPE_CURE_SICKNESS,	"Cause Sickness"
+	{ SPE_POLYMORPH,	"Change?", poly pets to higher level monster temporarily
+	{ SPE_FORCE_BOLT,	"Shatter", shatter glass/wood/stone objects
+	not spell based
+	{ ?		       	"Shout/Sound Burst", area damage
+	{ ?			"Silence", monster spells fail
+	{ ?			"Ventriloquism", makes monster think you're at a given location
+	{ ?			"Rage", pet uses special attack
+*/
+};
+
+static NEARDATA schar song_delay;	/* moves left for this song */
+struct obj *song_instr;			/* musical instrument being played */
+uchar song_played = SNG_NONE;	/* song being played (songs[] index)*/
+boolean song_penalty;			/* instrument penalty (see do_play_instrument) */
+static NEARDATA int petsing;		/* effect of pets singing with the player */
+static NEARDATA long petsing_lastcheck = 0L; /* last time pets were checked */
+static NEARDATA char msgbuf[BUFSZ];
+
+
+/*
+ * Ugly kludge. Returns the song being played at the moment.
+ * We cannot check song_played directly because if the song was interrupted,
+ * we have no means to reset song_played.
+ */
+int inline
+song_being_played()
+{
+    if (occupation != play_song)
+		song_played = SNG_NONE;
+    return song_played;
+}
+
+STATIC_PTR int
+reset_song()
+{
+    song_played = SNG_NONE;
+    song_delay = 0;
+    song_penalty = 0;
+/*	song_lastturn = 0L;*/
+    return;
+}
+
+/* music being played is at its last turn? */
+#define	SNG_FIRST_TURN	(song_being_played() == SNG_NONE ? \
+			 FALSE : (song_delay == songs[song_being_played()].turns))
+
+
+/**
+ * Checks if this pet can sing, helping the player, returning a bonus
+ */
+int
+pet_can_sing(mtmp, domsg)
+struct monst *mtmp;
+boolean domsg;
+{
+    int r = 0;
+
+    if (song_being_played() == SNG_NONE) return 0;
+
+    if ((mtmp->mcanmove) && (!mtmp->msleeping) && (!Conflict)
+	&& (!mtmp->mconf) && (!mtmp->mflee) && (!mtmp->mcan)
+	&& (distu(mtmp->mx, mtmp->my) <= 25)) {
+	    /* nymphs and some elves sing along harps */
+	    if ((song_instr->otyp == WOODEN_HARP || song_instr->otyp == MAGIC_HARP)
+		&& (mtmp->data->mlet == S_NYMPH 
+		    || (mtmp->data >= &mons[PM_ELF] && mtmp->data <= &mons[PM_ELVENKING])) 
+		&& (mtmp->mhp*2 > mtmp->mhpmax))
+		    r = max(10,(mtmp->data->mlet == S_NYMPH ? mtmp->m_lev*2 : mtmp->m_lev));
+	    /* undeads sing along horns */
+	    else if ((song_instr->otyp == TOOLED_HORN)
+		     && (mtmp->data->mlet == S_LICH || mtmp->data->mlet == S_MUMMY
+			 || mtmp->data->mlet == S_VAMPIRE || mtmp->data->mlet == S_WRAITH
+			 || mtmp->data->mlet == S_DEMON || mtmp->data->mlet == S_GHOST))
+		    r = max(10,(mtmp->data->mlet == S_LICH || mtmp->data->mlet == S_DEMON
+				? mtmp->m_lev*2 : mtmp->m_lev));
+	    /* orcs and ogres sing along (shout, actually) drums and bugles */
+	    else if ((song_instr->otyp == LEATHER_DRUM || song_instr->otyp == BUGLE)
+		     && (mtmp->data->mlet == S_ORC || mtmp->data->mlet == S_OGRE))
+		    r = max(10, mtmp->m_lev);
+    }
+
+    if (domsg && (r > 0))
+		if (canseemon(mtmp)) {
+			if (mtmp->data->mlet == S_LICH || mtmp->data->mlet == S_DEMON 
+				|| mtmp->data->mlet == S_VAMPIRE)
+				pline("%s's dreadful voice chants your song!", Monnam(mtmp));
+			else if (mtmp->data->mlet == S_MUMMY || mtmp->data->mlet == S_GHOST
+					 || mtmp->data->mlet == S_WRAITH)
+				pline("%s mourns while you play!", Monnam(mtmp));
+			else if (mtmp->data->mlet == S_NYMPH)
+				pline("%s's charming voice sings along!", Monnam(mtmp));
+			else if (mtmp->data->mlet == S_ORC || mtmp->data->mlet == S_OGRE)
+				pline("%s shouts!", Monnam(mtmp));
+			else
+				pline("%s sings while you play!", Monnam(mtmp));
+		}
+	else
+		if (mtmp->data->mlet == S_LICH || mtmp->data->mlet == S_DEMON 
+			|| mtmp->data->mlet == S_VAMPIRE)
+			You_hear("a horrible voice chanting your song!");
+		else if (mtmp->data->mlet == S_MUMMY || mtmp->data->mlet == S_GHOST
+				 || mtmp->data->mlet == S_WRAITH)
+			You_hear("someone mourning while you play!", Monnam(mtmp));
+		else if (mtmp->data->mlet == S_NYMPH)
+			You_hear("a charming voice singing along!");
+		else if (mtmp->data->mlet == S_ORC || mtmp->data->mlet == S_OGRE)
+			You_hear("a shout!");
+		else
+			You_hear("someone singing while you play!");
+
+    return r;
+}
+
+/** Singing pets bonus for this turn.
+ * Calculates the bonus of all singing pets (see above), if not yet done
+ * for this turn
+ */
+STATIC_DCL int
+singing_pets_effect()
+{
+    register struct monst *mtmp;
+
+    if (song_being_played() == SNG_NONE) return 0;
+    if (monstermoves != petsing_lastcheck) {
+	petsing_lastcheck = monstermoves;
+	petsing = 0;
+	for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
+	    if (mtmp->mtame)
+		petsing += pet_can_sing(mtmp, TRUE);
+    }
+
+    return petsing;
+}
+
+
+/** Chance of succesfully playing a song. 
+ * Depends on dexterity, different from the chance of the song actually affecting
+ * the creature, which depends more on charisma than dexterity.
+ */
+int
+song_success(song_id, instr, know_spell)
+int song_id;
+struct obj *instr;
+int know_spell;
+{
+	int a;
+	int chance;
+
+	//TODO: must check if the spell is still memorized
+
+	if (!know_spell)
+		return 0;
+
+	chance = ( ACURR(A_DEX) * 2 * (P_SKILL(P_MUSICALIZE)-P_UNSKILLED+1) + u.ulevel)
+		- (songs[song_id].level * (instr->blessed ? 15 : 20));
+
+	if (instr->oartifact || instr->otyp == songs[song_id].instr2)
+		chance = (chance*3)/2;
+
+	/* not easy to play 'peaceful' music when badly injured */
+	if (u.uhp < u.uhpmax * 0.3) chance /= 2;
+
+	/* it's also difficult to play some instruments while wearing a shield. */
+	if (uarms && (instr->otyp == WOODEN_HARP || instr->otyp == LEATHER_DRUM)) 
+		chance /= 2;
+
+	/* but it's easier with the eyes closed */
+	if (Blind) chance += u.ulevel;
+
+	if (instr->oartifact == ART_LYRE_OF_ORPHEUS && (song_id != SNG_SLEEP && song_id != SNG_TAME))
+		chance /= 2;
+
+	if (chance > 100) chance = 100;
+	if (chance < 0) chance = 0;
+
+	return chance;
+}
+
+/**
+ * Shows the music menu.
+ * Returns a SNG_* identifier
+ */
+STATIC_DCL unsigned char
+songs_menu(instr)
+struct obj *instr;
+{
+	char buf[BUFSZ];
+	winid tmpwin;
+	anything any;
+	menu_item *selected;
+	int a,b;
+	int song, know_spell;
+	char hardtoplay;
+
+	tmpwin = create_nhwindow(NHW_MENU);
+	start_menu(tmpwin);
+	any.a_void = 0;  /* zero out all bits */
+	Sprintf(buf, "(songs marked with # have a bonus with this instrument)");
+	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED);
+	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED);
+	Sprintf(buf, "    Song             Level Turns   Fail");
+	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, buf, MENU_UNSELECTED);
+
+	/* improvise option */
+	any.a_int = SNG_IMPROVISE;
+	add_menu(tmpwin, NO_GLYPH, &any, SNG_IMPROVISE_CHAR, 0, ATR_NONE,
+		 "improvise", MENU_UNSELECTED);
+	/* play notes option */
+	any.a_int = SNG_NOTES;
+	add_menu(tmpwin, NO_GLYPH, &any, SNG_NOTES_CHAR, 0, ATR_NONE,
+		 "a sequence of notes", MENU_UNSELECTED);
+	/* play the passtune option */
+	if (u.uevent.uheard_tune == 2) {
+		any.a_int = SNG_PASSTUNE;
+		add_menu(tmpwin, NO_GLYPH, &any, SNG_PASSTUNE_CHAR, 0, ATR_NONE,
+			 "passtune", MENU_UNSELECTED);
+	}
+
+	for (a = SNG_FIRST; a <= SNG_LAST; a++) {
+		/* For a song to be available in the menu:
+		   - Need a suitable instrument (the Lyre of Orpheus can play any song)
+		   - Must know the related spell (Bards already know any enchantment based song)
+		*/
+		know_spell = (Role_if(PM_BARD) && a <= SNG_LAST_ENCHANTMENT);
+		if (!know_spell)
+			for (b = 0; b < MAXSPELL; b++)
+				if (spl_book[b].sp_id == songs[a].sp_id)
+					know_spell = TRUE;
+		
+		if (know_spell && (instr->oartifact == ART_LYRE_OF_ORPHEUS
+				   || instr->otyp == songs[a].instr1 || instr->otyp == songs[a].instr2)) {
+			any.a_int = a+1;
+			if (instr->oartifact == ART_LYRE_OF_ORPHEUS)
+				hardtoplay = (a == SNG_FEAR || a == SNG_COURAGE || a == SNG_CONFUSION || a == SNG_SLOW ? ' ' : '#');
+			else
+				hardtoplay = (songs[a].instr1 == instr->otyp ? ' ' : '#');
+					
+			Sprintf(buf, "%-20s %i     %i %c %3i%%", songs[a].name, 
+				songs[a].level,	songs[a].turns,
+				hardtoplay,
+				100 - song_success(a, instr, know_spell));
+			add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+				 buf, MENU_UNSELECTED);
+		}
+	}
+
+	Sprintf(buf, "Play which song with the %s?", xname(instr));
+	end_menu(tmpwin, buf);
+	a = select_menu(tmpwin, PICK_ONE, &selected);
+	if (a > 0)
+		song = selected[0].item.a_int - (selected[0].item.a_int >= SNG_PASSTUNE ? 0 : 1);
+	else
+		song = SNG_NONE;
+	/*  if (song > 0) song--; */
+	free((genericptr_t)selected);
+	destroy_nhwindow(tmpwin);
+	
+	return song;
+}
+
+
+/** Returns a positive number if monster is affected by song, or a negative number
+ * if monster resisted it. 
+ * The number means the difference between the song 'attack' level and the monster
+ * resistance level against it.
+ * Charisma weights more than dexterity, different from the chance of 
+ * successfully playing the song, which depends on dexterity.
+ */
+int
+resist_song(mtmp, song, instr)
+struct monst *mtmp;
+int song;
+struct obj * instr;
+{
+	/* atack level, defense level, defense level before modifiers */
+	int alev, dlev, dlev0;
+	int showmsg;
+	char *msg;
+
+	showmsg = (song_delay == songs[song_played].level + 3) && canseemon(mtmp);
+	msg = (void *)0;
+
+	/* Attack level */
+	//alev = min(P_SKILL(P_MUSICALIZE) - songs[song].level + 1, 0);
+	alev = P_SKILL(P_MUSICALIZE) - P_UNSKILLED + 1;
+	alev = ( (alev * ACURR(A_CHA)) + ACURR(A_DEX) ) / 3;
+	// blessed/cursed instruments make it a little easier/harder to 'cast' the song
+	alev += bcsign(instr)*5;
+	// account for pets that can sing with the bard's song
+	alev += max(0, singing_pets_effect() - song_delay);
+	// polymorphed into something that can't sing
+	if (is_silent(youmonst.data)) alev /= 2;
+
+	/* Defense level */
+	dlev = (int)mtmp->m_lev*2;
+	if (is_golem(mtmp->data)) dlev = 100;
+	dlev0 = dlev;
+
+	/* "peaceful" songs */
+	if (song == SNG_SLEEP || song == SNG_TAME) {
+		if (mindless(mtmp->data)) dlev += dlev0/10;
+		if (is_animal(mtmp->data)) dlev -= dlev0/10; // music calm the beasts
+		if (is_domestic(mtmp->data)) dlev -= dlev0/10;
+		if (likes_magic(mtmp->data)) dlev += dlev0/5;
+		if (your_race(mtmp->data)) dlev -= dlev0/10;
+
+		// undead and demons don't care about 'peaceful' music
+		if (is_undead(mtmp->data) || is_demon(mtmp->data)) dlev += 50;
+		if (always_hostile(mtmp->data)) dlev += dlev0/10;
+		if (race_peaceful(mtmp->data)) dlev -= dlev0/10;
+
+		// rats like music from flutes (The Pied Piper of Hamelin)
+		if (mtmp->data->mlet == S_RODENT && instr->otyp == WOODEN_FLUTE) {
+			dlev -= dlev0/5;
+			if (showmsg) msg = "%s seems to briefly swing with your music.";
+		}
+		// angels like the sound of harps
+		if ((mtmp->data->mlet == S_ANGEL) && (mtmp->malign >= A_COALIGNED)
+		    && (instr->otyp == WOODEN_HARP))
+			dlev -= dlev0/5;
+		// snakes (and nagas) also like music from flutes
+		if (((mtmp->data->mlet == S_SNAKE) || (mtmp->data->mlet == S_NAGA))
+		    && (instr->otyp == WOODEN_FLUTE)) {
+			dlev -= dlev0/5;
+			if (showmsg) msg = "%s briefly dances with your music.";
+		}
+		// the Lyre of Orpheus is very good at peaceful music
+		if (instr->oartifact == ART_LYRE_OF_ORPHEUS)
+			alev += (P_SKILL(P_MUSICALIZE) - P_UNSKILLED) * 5;
+
+		// finally, music will do little effect on monsters if they're badly injured
+		if (mtmp->mhp < mtmp->mhpmax*0.6) {
+			dlev *= 2;
+			if (showmsg && !rn2(10)) msg = "%s is too hurt to listen to your song.";
+		}
+		if (mtmp->mhp < mtmp->mhpmax*0.3) {
+			dlev *= 5;
+			if (showmsg && !rn2(20)) 
+				msg = "%s cares more about surviving than listening to your music!";
+		}
+	
+	} else if (song == SNG_FEAR || song == SNG_CONFUSION) {
+		int canseeu;
+
+		// the Lyre isn't so good to scare people or to sow confusion
+		if (instr->oartifact == ART_LYRE_OF_ORPHEUS) alev /= 2;
+		// undeads and demons like scary music
+		if (song == SNG_FEAR && is_undead(mtmp->data)) dlev -= dlev0/3;
+		if (song == SNG_FEAR && is_demon(mtmp->data)) dlev -= dlev0/5;
+		// monster is scared/confused easily if it can't see you
+		canseeu = m_canseeu(mtmp);
+		if (!canseeu) dlev -= dlev0/5;
+		// but its harder to confuse it if it can see you
+		if (song == SNG_CONFUSION && canseeu) dlev += dlev0/5;
+
+	} else if (song == SNG_COURAGE) {
+		/* when badly injured, it's easier to encourage others */
+		if (u.uhp < u.uhpmax * 0.6) alev *= 2;
+		if (u.uhp < u.uhpmax * 0.3) alev *= 3;
+		/* hostile monsters are easily encouraged */
+		if (always_hostile(mtmp->data)) dlev -= dlev0/5;
+		if (race_hostile(mtmp->data)) dlev -= dlev0/5;
+		if (is_mercenary(mtmp->data)) dlev -= dlev0/5;
+	}
+
+    if (dlev < 1) dlev = is_mplayer(mtmp->data) ? u.ulevel : 1;
+    if (song_penalty) alev /= 2;
+
+    if (wizard)
+	    pline("[%s:%i/%i]", mon_nam(mtmp), alev, dlev);
+
+    if (alev >= dlev && msg != (void *)0)
+	    pline(msg, Monnam(mtmp));
+
+    return (alev - dlev);
+}
+
+
+
+
+STATIC_PTR int
+play_song()
+{
+	register struct monst *mtmp;
+	int distance;
+
+	distance = (P_SKILL(P_MUSICALIZE) - P_UNSKILLED + 1) * 9 + (u.ulevel/2);
+
+	/* songs only have effect after the 1st turn */
+	//if (song_delay <= songs[song_played].level+2) 
+	switch (song_being_played()) {
+		case SNG_SLEEP: 
+			sleep_song(distance);
+			break;
+		case SNG_CONFUSION:
+			confusion_song(distance);
+			break;
+		case SNG_SLOW:
+			slowness_song(distance);
+			break;
+		case SNG_FEAR:
+			scary_song(distance);
+			break;
+		case SNG_COURAGE:
+			encourage_pets(distance);
+			break;
+		case SNG_TAME:
+			tame_song(distance);
+			break;
+		}
+
+	song_delay--;
+	if (song_delay <= 0) {
+		reset_song();
+		use_skill(P_MUSICALIZE, 1);
+		exercise(A_DEX, TRUE);
+		/*if (songs[song_played].turns > 1)*/
+		You("finish the song.");
+		return 0;
+	}
+	return 1;
+}
+
+
+/* monster is affected by song if:
+   - not tamed; or
+   - if tamed, player's musicalize skill is only basic, AND tamed monster
+     isn't of any kind that sings with your song (considering peaceful
+	 songs only)
+   Rationale: a skilled musician must be able to, say, make enemies sleep but
+   not his/her pets, but a less skilled one will end up affecting pets too.
+*/
+#define mon_affected_by_peace_song(mtmp) \
+	(!mtmp->mtame || \
+	(mtmp->mtame && (P_SKILL(P_MUSICALIZE) < P_SKILLED) &&				\
+	 mtmp->data->mlet != S_NYMPH &&										\
+	 (mtmp->data < &mons[PM_ELF] || mtmp->data > &mons[PM_ELVENKING])))
+#define mon_affected_by_song(mtmp) \
+	(!mtmp->mtame || \
+	 (mtmp->mtame && (P_SKILL(P_MUSICALIZE) < P_SKILLED)))
+
+
+/** Fear song effects.
+ * Contributed by Johanna Ploog
+ */
+void
+scary_song(distance)
+int distance;
+{
+	register struct monst *mtmp, *m = fmon;
+	register int r;
+
+	while(m) {
+		mtmp = m;
+		m = m->nmon;
+		r = resist_song(mtmp, SNG_FEAR, song_instr);
+
+		if (!DEADMONSTER(mtmp) && distu(mtmp->mx, mtmp->my) < distance &&
+			mon_affected_by_song(mtmp) && r >= 0) {
+
+			if (is_undead(mtmp->data) || is_demon(mtmp->data)) {
+				// small chance of side effect
+				r = r/songs[song_being_played()].turns;
+				if (wizard) pline("[%i%% side effect]", r);
+			}
+	
+			/* fear song actually can pacify undead */
+			if (is_undead(mtmp->data)) {
+				if (rn2(100) < r) {
+					if (canseemon(mtmp))
+						pline((Hallucination ? "%s starts to coreograph a dance!" 
+						       : (mtmp->data->mlet == S_LICH ? 
+							  "%s makes a sinister grin in approval of your music."
+							  : "%s groans in the rhythm of your music.")),
+						      Monnam(mtmp));
+					mtmp->mpeaceful = 1;
+					mtmp->mavenge = 0;
+				} else {
+					if (canseemon(mtmp) && SNG_FIRST_TURN)
+						pline("%s stops to %s your music for a moment.", Monnam(mtmp),
+						      (Hallucination ? "smell" : "hear"));
+					mtmp->movement = 0;
+				}
+			} else if (is_demon(mtmp->data)) {
+				/* but angers demon lords */
+				if (is_dlord(mtmp->data) || is_dprince(mtmp->data)) {
+					pline("%s laughs fiendishly!", Monnam(mtmp));
+					verbalize("Thou playest thy own funeral march, weakling!");
+					mtmp->mpeaceful = 0;
+					mtmp->mavenge = 1;
+				} else if (rn2(100) < r) {
+					/* and can pacify normal demons */
+					if (canseemon(mtmp))
+						pline("%s makes a sinister grin in approval of your music.", Monnam(mtmp));
+					mtmp->mpeaceful = 1;
+					mtmp->mavenge = 0;
+				} else {
+					if (canseemon(mtmp) && SNG_FIRST_TURN)
+						pline("%s to %s your music for a moment.", Monnam(mtmp),
+						      (Hallucination ? "smell" : "hear"));
+					mtmp->movement = 0;
+				}
+			} else {
+				monflee(mtmp, 
+					min(1, P_SKILL(P_MUSICALIZE)-P_UNSKILLED) * 3, 
+					FALSE, TRUE);
+				if (mtmp->mpeaceful && rn2(10)) {
+					mtmp->mpeaceful = 0;
+				}
+			}
+			/*
+			  possible additions:
+			  + aggravate undeads
+			  + chance to unpacify peaceful (non-deaf) monsters
+			  (humans are not affected by this, they're used to worse... ;-) )
+			*/
+		}
+	}
+}
+
+
+STATIC_OVL void
+slowness_song(distance)
+int distance;
+{
+	register struct monst *mtmp = fmon;
+	register int distm;
+
+	while(mtmp) {
+		if (!DEADMONSTER(mtmp) && distu(mtmp->mx, mtmp->my) < distance &&
+			mon_affected_by_peace_song(mtmp) &&
+		    resist_song(mtmp, SNG_SLOW, song_instr) >= 0) {
+			switch (P_SKILL(P_MUSICALIZE)) {
+			case P_UNSKILLED:
+			case P_BASIC:
+				mtmp->movement -= (NORMAL_SPEED/2);
+				break;
+			case P_SKILLED:
+				mtmp->movement -= (NORMAL_SPEED*3/4);
+				break;
+			case P_EXPERT:
+				mtmp->movement -= (NORMAL_SPEED-1);
+				break;
+			}
+			//mtmp->movement -= NORMAL_SPEED / (5 - max(1,P_SKILL(P_MUSICALIZE)-P_UNSKILLED));
+			if (song_delay == songs[SNG_SLOW].turns && canseemon(mtmp))
+				pline("%s seems slower.", Monnam(mtmp));
+
+			if (u.uswallow && (mtmp == u.ustuck) &&
+			    is_whirly(mtmp->data)) {
+				You("disrupt %s!", mon_nam(mtmp));
+				pline("A huge hole opens up...");
+				expels(mtmp, mtmp->data, TRUE);
+			}
+		}
+	    mtmp = mtmp->nmon;
+	}
+}
+
+
+STATIC_OVL void
+encourage_pets(distance)
+int distance;
+{
+	register struct monst *mtmp = fmon;
+
+	while(mtmp) {
+		if (!DEADMONSTER(mtmp) && mtmp->mtame && distu(mtmp->mx, mtmp->my) < distance &&
+		    resist_song(mtmp, SNG_TAME, song_instr) >= 0) {
+			if (EDOG(mtmp)->encouraged < EDOG_ENCOURAGED_MAX)
+				EDOG(mtmp)->encouraged += (P_SKILL(P_MUSICALIZE)-P_UNSKILLED+1) * 6;
+			if (mtmp->mflee)
+				switch (P_SKILL(P_MUSICALIZE)) {
+				case P_UNSKILLED:
+				case P_BASIC:
+					mtmp->mfleetim /= 2;
+					break;
+				case P_SKILLED:
+					mtmp->mfleetim /= 4;
+					break;
+				case P_EXPERT:
+					mtmp->mfleetim = 0;
+					break;
+				}
+			if (canseemon(mtmp))
+				if (Hallucination)
+					pline("%s looks %s!", Monnam(mtmp),
+					      EDOG(mtmp)->encouraged == EDOG_ENCOURAGED_MAX ? "way cool" :
+					      EDOG(mtmp)->encouraged > (EDOG_ENCOURAGED_MAX/2) ? "cooler" : "cool");
+				else
+					pline("%s looks %s!", Monnam(mtmp),
+					      EDOG(mtmp)->encouraged == EDOG_ENCOURAGED_MAX ? "berserk" :
+					      EDOG(mtmp)->encouraged > (EDOG_ENCOURAGED_MAX/2) ? "wilder" : "wild");
+		}
+		mtmp = mtmp->nmon;
+	}
+}
+
+STATIC_OVL void
+confusion_song(distance)
+int distance;
+{
+	register struct monst *mtmp = fmon;
+
+	while(mtmp) {
+		if (!DEADMONSTER(mtmp) && !mtmp->mtame && !mtmp->mconf &&
+		    distu(mtmp->mx, mtmp->my) < distance &&
+		    resist_song(mtmp, SNG_SLOW, song_instr) >= 0) {
+			if (canseemon(mtmp))
+				pline("%s seems confused.", Monnam(mtmp));
+			mtmp->mconf = 1;
+		}
+		mtmp = mtmp->nmon;
+	}
+}
+#endif  /* BARD */
+
+
 /*
  * Wake every monster in range...
  */
@@ -84,6 +768,38 @@
 /*
  * Make monsters fall asleep.  Note that they may resist the spell.
  */
+#ifdef BARD
+STATIC_OVL void
+sleep_song(distance)
+int distance;
+{
+	register struct monst *mtmp = fmon;
+// to do: peaceful music can aggravate demons
+
+	while(mtmp) {
+		if (!DEADMONSTER(mtmp) && distu(mtmp->mx, mtmp->my) < distance &&
+			mon_affected_by_peace_song(mtmp) &&
+		    resist_song(mtmp, SNG_SLEEP, song_instr) >= 0) {
+			/* pets, if affected, sleep less time */
+			mtmp->mfrozen = min( mtmp->mfrozen +
+					     max(1, P_SKILL(P_MUSICALIZE)-P_UNSKILLED)
+					     * (mtmp->mtame ? 2 : 3), 127);
+			if (wizard)
+				pline("[%s:%i turns]", mon_nam(mtmp), mtmp->mfrozen);
+			if (!mtmp->mcanmove) {
+				if (canseemon(mtmp) && flags.verbose && !rn2(10))
+					pline("%s moves while sleeping.", Monnam(mtmp));
+			} else {
+				mtmp->mcanmove = 0;
+				if (canseemon(mtmp) && flags.verbose)
+					pline("%s sleeps.", Monnam(mtmp));
+			}
+			slept_monst(mtmp);
+		}
+		mtmp = mtmp->nmon;
+	}
+}
+#endif /* BARD */
 
 STATIC_OVL void
 put_monsters_to_sleep(distance)
@@ -101,6 +817,8 @@
 	}
 }
 
+
+
 /*
  * Charm snakes in range.  Note that the snakes are NOT tamed.
  */
@@ -160,6 +878,7 @@
 	}
 }
 
+
 /* Awake only soldiers of the level. */
 
 void
@@ -184,6 +903,50 @@
 /* Charm monsters in range.  Note that they may resist the spell.
  * If swallowed, range is reduced to 0.
  */
+#ifdef BARD
+STATIC_OVL void
+tame_song(distance)
+int distance;
+{
+	struct monst *mtmp, *mtmp2, *m, *m2;
+	xchar tame, waspeaceful;
+
+	if (u.uswallow) {
+		if (resist_song(u.ustuck, SNG_TAME, song_instr) >= 0) {
+			mtmp = tamedog(u.ustuck, (struct obj *) 0);
+			EDOG(mtmp)->friend = 1;
+		}
+	} else {
+		for (mtmp = fmon; mtmp; mtmp = mtmp2) {
+			mtmp2 = mtmp->nmon;
+			m = mtmp;
+			if (!DEADMONSTER(m) && distu(m->mx, m->my) <= distance &&
+			    resist_song(m, SNG_TAME, song_instr) >= 0) {
+				m->mflee = 0;
+				/* no other effect if monster was already tame by other means */
+				if (m->mtame && !(EDOG(m)->friend))
+					continue;
+				tame = m->mtame;
+				waspeaceful = m->mpeaceful;
+				if (!tame) {
+					m2 = tamedog(m, (struct obj *) 0);
+					if (m2) m = m2;
+					EDOG(m)->waspeaceful = waspeaceful;
+					if (canseemon(m) && flags.verbose && !m->msleeping)
+						pline("%s seems to like your song.", Monnam(m));
+				}
+				EDOG(m)->friend = 1;
+
+				/* tameness of song is temporary. uses tameness
+				 as timeout counter */
+				m->mtame = min(m->mtame
+					       + max(1, P_SKILL(P_MUSICALIZE)-P_UNSKILLED)*2,
+					       255);
+			}
+		}
+	}
+}
+#endif /* BARD */
 
 STATIC_OVL void
 charm_monsters(distance)
@@ -208,6 +971,7 @@
 
 }
 
+
 /* Generate earthquake :-) of desired force.
  * That is:  create random chasms (pits).
  */
@@ -465,9 +1229,11 @@
 	    impossible("What a weird instrument (%d)!", instr->otyp);
 	    break;
 	}
+     
 	return 2;		/* That takes time */
 }
 
+
 /*
  * So you want music...
  */
@@ -476,23 +1242,111 @@
 do_play_instrument(instr)
 struct obj *instr;
 {
-    char buf[BUFSZ], c = 'y';
+    char buf[BUFSZ];
     char *s;
     int x,y;
+    int a;
+    unsigned char song = SNG_NONE;
     boolean ok;
 
     if (Underwater) {
 	You_cant("play music underwater!");
 	return(0);
     }
+#ifdef BARD
+    if (nohands(youmonst.data)) {
+	You("have no hands!");
+	return 0;
+    }
+    /*
+    if (uarms) {
+	You_cant("play music while wearing a shield!");
+      	return(0);
+    }
+    */
+    if (welded(uwep)) {
+	You("need free hands to play music!");
+	return(0);
+    }
+    /* also cursed gauntlets should mean your song will go bad */
+
+    /* Another possibility would be playing only scary music
+       while being thus affected. */
+    if (Confusion > 0 || Stunned || Hallucination) {
+	You_cant("play music while %s!", Confusion > 0 ? "confused" : 
+		 (Stunned ? "stunned" : "stoned"));
+	return 0;
+    }
+
+    if (uarms && (instr->otyp == WOODEN_HARP || instr->otyp == LEATHER_DRUM))
+	    You("can't play properly while wearing a shield.");
+    if (is_silent(youmonst.data))
+	    pline("While in this form, you can't sing along your songs.");
+    
+    if (!P_RESTRICTED(P_MUSICALIZE)) {
+	song = songs_menu(instr);
+	if (song == SNG_NONE)
+	    return 0;
+    } else {
+#endif
     if (instr->otyp != LEATHER_DRUM && instr->otyp != DRUM_OF_EARTHQUAKE) {
-	c = yn("Improvise?");
+	    if (yn("Improvise?") == 'y') song = SNG_IMPROVISE;
+	    else if (u.uevent.uheard_tune == 2 && yn("Play the passtune?") == 'y')
+		song = SNG_PASSTUNE;
+	    else
+		song = SNG_NONE;
+    }
+#ifdef BARD
     }
-    if (c == 'n') {
-	if (u.uevent.uheard_tune == 2 && yn("Play the passtune?") == 'y') {
+#endif
+    
+    switch (song) {
+    case SNG_NONE:
+	return 0;
+	break;
+    case SNG_IMPROVISE:
+	return do_improvisation(instr);
+	break;
+    case SNG_NOTES:
+	getlin("What tune are you playing? [what 5 notes]", buf);
+	break;
+    case SNG_PASSTUNE:
 	    Strcpy(buf, tune);
-	} else {
-	    getlin("What tune are you playing? [5 notes, A-G]", buf);
+	break;
+    default:
+#ifdef BARD
+/*
+	a = songs[song].level * (Role_if(PM_BARD) ? 2 : 5);
+	if (a > u.uen) {
+	    You("don't have enough energy to play that song.");
+	    return 0;
+	}
+	u.uen -= a;
+	flags.botl = 1;
+*/
+	    if (rnd(100) > song_success(song, instr, 1)) {
+		    pline("What you produce is quite far from music...");
+		    return 1;
+	    }
+	
+	    song_played = song;
+	    song_instr = instr;
+	    song_delay = songs[song_played].turns;
+
+	song_penalty = (songs[song_played].instr1 == instr->otyp);
+	if (song_played == SNG_TAME && instr->oartifact == ART_LYRE_OF_ORPHEUS)
+		song_penalty = 0;
+
+	Sprintf(msgbuf, "playing %s", the(xname(instr)));
+	if (instr->oartifact == ART_LYRE_OF_ORPHEUS)
+		pline("%s the \"%s\" song!", Tobjnam(instr, "sing"), songs[song].name);
+	else
+		You("play the \"%s\" song...", songs[song].name);
+	set_occupation(play_song, msgbuf, 0);
+	return 0;
+#endif	/* BARD */
+    }
+    
 	    (void)mungspaces(buf);
 	    /* convert to uppercase and change any "H" to the expected "B" */
 	    for (s = buf; *s; s++) {
@@ -504,7 +1358,7 @@
 #endif
 		if (*s == 'H') *s = 'B';
 	    }
-	}
+    
 	You("extract a strange sound from %s!", the(xname(instr)));
 #ifdef UNIX386MUSIC
 	/* if user is at the console, play through the console speaker */
@@ -605,10 +1459,9 @@
 	    }
 	  }
 	return 1;
-    } else
-	    return do_improvisation(instr);
 }
 
+
 #ifdef UNIX386MUSIC
 /*
  * Play audible music on the machine's speaker if appropriate.
diff -Naurb ../nethack-3.4.3//src/pager.c ./src/pager.c
--- ../nethack-3.4.3//src/pager.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/pager.c	2011-01-19 23:05:19.000000000 -0200
@@ -7,6 +7,9 @@
 
 #include "hack.h"
 #include "dlb.h"
+#ifdef BARD
+#include "edog.h"
+#endif
 
 STATIC_DCL boolean FDECL(is_swallow_sym, (int));
 STATIC_DCL int FDECL(append_str, (char *, const char *));
@@ -138,7 +141,12 @@
 		    (mtmp->mx != x || mtmp->my != y) ?
 			((mtmp->isshk && accurate)
 				? "tail of " : "tail of a ") : "",
-		    (mtmp->mtame && accurate) ? "tame " :
+		    (mtmp->mtame && accurate) ? 
+#ifdef BARD
+		    (EDOG(mtmp)->friend ? "friendly " : "tame ") :
+#else
+		    "tame " :
+#endif
 		    (mtmp->mpeaceful && accurate) ? "peaceful " : "",
 		    name);
 	    if (u.ustuck == mtmp)
diff -Naurb ../nethack-3.4.3//src/role.c ./src/role.c
--- ../nethack-3.4.3//src/role.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/role.c	2010-11-29 00:40:20.000000000 -0200
@@ -77,6 +77,34 @@
 	{  1, 0,  0, 1,  0, 1 },10,	/* Energy */
 	10, 14, 0, 0,  8, A_INT, SPE_HASTE_SELF,      -4
 },
+#ifdef BARD
+{	{"Bard", 0}, {
+	{"Rhymer",      0},
+	{"Lyrist",      0},
+	{"Sonneteer",   0},
+	{"Jongleur",    0},
+	{"Troubadour",  0},
+	{"Minstrel",    0},
+	{"Lorist",      0},
+	{"Bard",        0},
+	{"Master Bard", 0} },
+	"Apollon", "Pan", "Dionysus", /* Thracian? */
+	"Brd", "the Conservatorium", "the Island of Anthemoessa",
+	PM_BARD, NON_PM, NON_PM,
+	PM_PINDAR, PM_RHYMER, PM_AGLAOPE,
+	PM_SNAKE, PM_WHITE_UNICORN, S_SNAKE, S_UNICORN,
+	ART_LYRE_OF_ORPHEUS,
+	MH_HUMAN|MH_ELF|MH_GNOME | ROLE_MALE|ROLE_FEMALE |
+	  ROLE_NEUTRAL|ROLE_CHAOTIC,
+	/* Str Int Wis Dex Con Cha */
+	{   7,  7,  7, 10,  6, 10 },
+	{  10, 10, 15, 25, 10, 30 },
+	/* Init   Lower  Higher */
+	{ 11, 0,  0, 8,  1, 0 },	/* Hit points */
+	{  4, 3,  0, 1,  0, 2 },10,	/* Energy */
+	10, 3,-3, 2, 9, A_INT, SPE_SLEEP, -4
+},
+#endif
 {	{"Caveman", "Cavewoman"}, {
 	{"Troglodyte",  0},
 	{"Aborigine",   0},
diff -Naurb ../nethack-3.4.3//src/shknam.c ./src/shknam.c
--- ../nethack-3.4.3//src/shknam.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/shknam.c	2011-01-19 23:13:12.000000000 -0200
@@ -166,6 +166,17 @@
     0
 };
 
+#ifdef BARD
+static const char * const shkmusic[] = {
+    /* Brazil */
+    "Andre", "Daniel", "Tiago", "Alexandre", "Joao", 
+    "Carlos", "Fabio", "Ricardo", "Gustavo", "Rafael",
+    "Felipe", "Anderson", "Jorge", "Paulo", "Jose",
+    "Rogerio", "Roberto", "Marcos", "Luis", "Luciano",
+    0
+};
+#endif
+
 /*
  * To add new shop types, all that is necessary is to edit the shtypes[] array.
  * See mkroom.h for the structure definition.  Typically, you'll have to lower
@@ -183,7 +194,11 @@
  */
 
 const struct shclass shtypes[] = {
+#ifdef BARD
+	{"general store", RANDOM_CLASS, 41,
+#else
 	{"general store", RANDOM_CLASS, 44,
+#endif
 	    D_SHOP, {{100, RANDOM_CLASS}, {0, 0}, {0, 0}}, shkgeneral},
 	{"used armor dealership", ARMOR_CLASS, 14,
 	    D_SHOP, {{90, ARMOR_CLASS}, {10, WEAPON_CLASS}, {0, 0}},
@@ -211,6 +226,12 @@
 	 */
 	{"rare books", SPBOOK_CLASS, 3, D_SHOP,
 	    {{90, SPBOOK_CLASS}, {10, SCROLL_CLASS}, {0, 0}}, shkbooks},
+#ifdef BARD
+	{"music shop", TOOL_CLASS, 3, D_SHOP,
+	    {{32, -WOODEN_FLUTE}, {32, -WOODEN_HARP}, {32, -LEATHER_DRUM}, 
+	     {2, -MAGIC_HARP}, {2, -MAGIC_FLUTE}},
+	     shkmusic},
+#endif
 	/* Shops below this point are "unique".  That is they must all have a
 	 * probability of zero.  They are only created via the special level
 	 * loader.
diff -Naurb ../nethack-3.4.3//src/spell.c ./src/spell.c
--- ../nethack-3.4.3//src/spell.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/spell.c	2010-11-03 17:31:07.000000000 -0200
@@ -41,6 +41,7 @@
  *   spelbase, spelheal:
  *	Arc are aware of magic through historical research
  *	Bar abhor magic (Conan finds it "interferes with his animal instincts")
+ *	Brd know a lot about general lore, including a bit of magic
  *	Cav are ignorant to magic
  *	Hea are very aware of healing magic through medical research
  *	Kni are moderately aware of healing from Paladin training
@@ -62,6 +63,7 @@
  *  spelspec, spelsbon:
  *	Arc map masters (SPE_MAGIC_MAPPING)
  *	Bar fugue/berserker (SPE_HASTE_SELF)
+ *      Brd to put to sleep (SPE_SLEEP)
  *	Cav born to dig (SPE_DIG)
  *	Hea to heal (SPE_CURE_SICKNESS)
  *	Kni to turn back evil (SPE_TURN_UNDEAD)
diff -Naurb ../nethack-3.4.3//src/u_init.c ./src/u_init.c
--- ../nethack-3.4.3//src/u_init.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/u_init.c	2010-11-13 11:29:22.000000000 -0200
@@ -46,6 +46,20 @@
 	{ FOOD_RATION, 0, FOOD_CLASS, 1, 0 },
 	{ 0, 0, 0, 0, 0 }
 };
+#ifdef BARD
+static struct trobj Bard[] = {
+#define BARD_INSTR 0
+#define BARD_BOOZE 4
+#define BARD_WHISTLE 5
+	{ WOODEN_HARP, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS },
+	{ LEATHER_CLOAK, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
+	{ APPLE, 0, FOOD_CLASS, 3, 0 },
+	{ ORANGE, 0, FOOD_CLASS, 3, 0 },
+	{ POT_BOOZE, 0, POTION_CLASS, 1, UNDEF_BLESS },
+	{ TIN_WHISTLE, 0, TOOL_CLASS, 1, UNDEF_BLESS },
+	{ 0, 0, 0, 0, 0 }
+};
+#endif
 static struct trobj Cave_man[] = {
 #define C_AMMO	2
 	{ CLUB, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
@@ -288,6 +302,21 @@
     { P_NONE, 0 }
 };
 
+#ifdef BARD
+static struct def_skill Skill_Bard[] = {
+    { P_DAGGER, P_SKILLED },		{ P_KNIFE,  P_BASIC },
+    { P_SHORT_SWORD, P_BASIC },		{ P_SCIMITAR, P_BASIC },
+    { P_CLUB, P_SKILLED },		{ P_FLAIL, P_BASIC },
+    { P_QUARTERSTAFF, P_SKILLED },	{ P_POLEARMS, P_BASIC },
+    { P_JAVELIN, P_SKILLED },		{ P_SPEAR, P_BASIC },
+    { P_SLING, P_SKILLED },		{ P_DART, P_EXPERT },
+    { P_UNICORN_HORN, P_BASIC },	{ P_CROSSBOW, P_SKILLED },
+    { P_ENCHANTMENT_SPELL, P_SKILLED },	{ P_ESCAPE_SPELL, P_BASIC },
+    { P_BARE_HANDED_COMBAT, P_EXPERT }, { P_MUSICALIZE, P_EXPERT },
+    { P_NONE, 0 }
+};
+#endif
+
 static const struct def_skill Skill_C[] = {
     { P_DAGGER, P_BASIC },		{ P_KNIFE,  P_SKILLED },
     { P_AXE, P_SKILLED },		{ P_PICK_AXE, P_BASIC },
@@ -348,6 +377,9 @@
     { P_CLERIC_SPELL, P_SKILLED },  { P_ESCAPE_SPELL, P_BASIC },
     { P_MATTER_SPELL, P_BASIC },
     { P_MARTIAL_ARTS, P_GRAND_MASTER },
+#ifdef BARD
+    { P_MUSICALIZE, P_BASIC },
+#endif
     { P_NONE, 0 }
 };
 
@@ -364,6 +396,9 @@
     { P_HEALING_SPELL, P_EXPERT },	{ P_DIVINATION_SPELL, P_EXPERT },
     { P_CLERIC_SPELL, P_EXPERT },
     { P_BARE_HANDED_COMBAT, P_BASIC },
+#ifdef BARD
+    { P_MUSICALIZE, P_BASIC },
+#endif
     { P_NONE, 0 }
 };
 
@@ -447,6 +482,9 @@
 #ifdef STEED
     { P_RIDING, P_BASIC },
 #endif
+#ifdef BARD
+    { P_MUSICALIZE, P_SKILLED },
+#endif
     { P_TWO_WEAPON_COMBAT, P_SKILLED },
     { P_BARE_HANDED_COMBAT, P_SKILLED },
     { P_NONE, 0 }
@@ -513,6 +551,52 @@
 			knows_object(ct);
 }
 
+#ifdef BARD
+/* Know 5 to 15 random magical objects (wands, potions, scrolls, ...)
+   For now we decide that tools while possibly magical (bag of holding/tricks,
+   magic lamp) are excempt because the Bard already knows all instruments
+   which appear to be more than enough tools.
+   We might also add GEM_CLASS with oc_material != GLASS 
+*** Contributed by Johanna Ploog */
+STATIC_OVL void
+know_random_obj()
+{
+        register int obj, count, ct;
+
+        count = rn1(11,5);
+        for (ct = 500; ct > 0 && count > 0; ct--) {
+           obj = rn2(NUM_OBJECTS);
+           if (objects[obj].oc_magic &&
+
+               /* We have to make an exception for those dummy
+                  objects (wand and scroll) that exist to allow
+                  for additional descriptions. */
+
+               obj_descr[(objects[obj].oc_name_idx)].oc_name != 0 &&
+
+              (objects[obj].oc_class == ARMOR_CLASS &&
+
+               /* Dragon scales and mails are considered magical,
+                  but as they don't have different descriptions,
+                  they don't appear in the discovery list,
+                  so as not to rob the player of an opportunity... */
+
+                !(obj > HELM_OF_TELEPATHY && obj < PLATE_MAIL) ||
+
+               objects[obj].oc_class == RING_CLASS ||
+               objects[obj].oc_class == POTION_CLASS ||
+               objects[obj].oc_class == SCROLL_CLASS ||
+               objects[obj].oc_class == SPBOOK_CLASS ||
+               objects[obj].oc_class == WAND_CLASS ||
+               objects[obj].oc_class == AMULET_CLASS))
+            {
+              knows_object(obj);
+              count--;
+            }
+        }
+}
+#endif
+
 void
 u_init()
 {
@@ -623,6 +707,27 @@
 		knows_class(ARMOR_CLASS);
 		skill_init(Skill_B);
 		break;
+#ifdef BARD
+	case PM_BARD:
+		if (rn2(100) >= 50) Bard[BARD_INSTR].trotyp = WOODEN_FLUTE;
+		if (rn2(100) >= 85) Bard[BARD_WHISTLE].trotyp = BELL;
+		Bard[BARD_BOOZE].trquan = rn1(2, 5);
+		ini_inv(Bard);
+		/* This depends on the order in objects.c */
+		for (i = TIN_WHISTLE; i <= DRUM_OF_EARTHQUAKE; i++)
+			knows_object(i);
+		/* Bards know about the enchantment spellbooks, though they don't know
+		   the spells */
+		knows_object(SPE_SLEEP);
+		knows_object(SPE_CONFUSE_MONSTER);
+		knows_object(SPE_SLOW_MONSTER);
+		knows_object(SPE_CAUSE_FEAR);
+		knows_object(SPE_CHARM_MONSTER);
+		/* Bards also know a lot about legendary & magical stuff. */
+		know_random_obj();
+		skill_init(Skill_Bard);
+		break;
+#endif
 	case PM_CAVEMAN:
 		Cave_man[C_AMMO].trquan = rn1(11, 10);	/* 10..20 */
 		ini_inv(Cave_man);
@@ -856,6 +961,9 @@
     switch (Role_switch) {
      case PM_ARCHEOLOGIST:	skills = Skill_A; break;
      case PM_BARBARIAN:		skills = Skill_B; break;
+#ifdef BARD
+     case PM_BARD:		skills = Skill_Bard; break;
+#endif
      case PM_CAVEMAN:		skills = Skill_C; break;
      case PM_HEALER:		skills = Skill_H; break;
      case PM_KNIGHT:		skills = Skill_K; break;
diff -Naurb ../nethack-3.4.3//src/weapon.c ./src/weapon.c
--- ../nethack-3.4.3//src/weapon.c	2003-12-07 21:39:13.000000000 -0200
+++ ./src/weapon.c	2010-11-03 17:25:17.000000000 -0200
@@ -25,6 +25,9 @@
 #define PN_CLERIC_SPELL			(-12)
 #define PN_ESCAPE_SPELL			(-13)
 #define PN_MATTER_SPELL			(-14)
+#ifdef BARD
+#define PN_MUSICALIZE			(-15)
+#endif
 
 STATIC_DCL void FDECL(give_may_advance_msg, (int));
 
@@ -49,6 +52,9 @@
 	PN_DIVINATION_SPELL, PN_ENCHANTMENT_SPELL,
 	PN_CLERIC_SPELL,     PN_ESCAPE_SPELL,
 	PN_MATTER_SPELL,
+#ifdef BARD
+	PN_MUSICALIZE,
+#endif
 	PN_BARE_HANDED,   PN_TWO_WEAPONS,
 #ifdef STEED
 	PN_RIDING
@@ -72,6 +78,9 @@
     "clerical spells",
     "escape spells",
     "matter spells",
+#ifdef BARD
+	"musicalize spell",
+#endif
 };
 /* indexed vis `is_martial() */
 STATIC_VAR NEARDATA const char * const barehands_or_martial[] = {
@@ -1262,6 +1271,12 @@
 		P_SKILL(P_ATTACK_SPELL) = P_BASIC;
 		P_SKILL(P_ENCHANTMENT_SPELL) = P_BASIC;
 	}
+#ifdef BARD
+	if (Role_if(PM_BARD)) {
+	  P_SKILL(P_MUSICALIZE) = P_BASIC;
+	  P_SKILL(P_BARE_HANDED_COMBAT) = P_BASIC;
+	}
+#endif
 
 	/* walk through array to set skill maximums */
 	for (; class_skill->skill != P_NONE; class_skill++) {
diff -Naurb ../nethack-3.4.3//sys/amiga/Makefile.agc ./sys/amiga/Makefile.agc
--- ../nethack-3.4.3//sys/amiga/Makefile.agc	2003-12-07 21:39:13.000000000 -0200
+++ ./sys/amiga/Makefile.agc	2008-04-04 23:26:50.000000000 -0300
@@ -221,6 +221,10 @@
 	$(SLIB)Bar-strt.lev
 BDFILES= $(SLIB)Bar-goal.lev $(BDFILES1)
 
+BARDFILES1= $(SLIB)Brd-fila.lev $(SLIB)Brd-filb.lev $(SLIB)Brd-loca.lev \
+	$(SLIB)Brd-strt.lev
+BARDFILES= $(SLIB)Brd-goal.lev $(BARDFILES1)
+
 CDFILES1= $(SLIB)Cav-fila.lev $(SLIB)Cav-filb.lev $(SLIB)Cav-loca.lev \
 	$(SLIB)Cav-strt.lev
 CDFILES= $(SLIB)Cav-goal.lev $(CDFILES1)
@@ -265,7 +269,7 @@
 	$(SLIB)Wiz-strt.lev
 WDFILES= $(SLIB)Wiz-goal.lev $(WDFILES1)
 
-XDFILES=	$(ADFILES) $(BDFILES) $(CDFILES) $(HDFILES) $(KDFILES) \
+XDFILES=	$(ADFILES) $(BDFILES) $(BARDFILES) $(CDFILES) $(HDFILES) $(KDFILES) \
 		$(MDFILES) $(PDFILES) $(RDFILES) $(RANFILES) $(SDFILES) $(TDFILES) \
 		$(VDFILES) $(WDFILES)
 
@@ -399,6 +403,7 @@
 #	-delete $(SLIB)soko4-1.lev $(SLIB)soko4-2.lev
 #	-delete $(ADFILES)
 #	-delete $(BDFILES)
+#	-delete $(BARDFILES)
 #	-delete $(CDFILES)
 #	-delete $(HDFILES)
 #	-delete $(KDFILES)
@@ -836,6 +841,10 @@
 
 $(SLIB)Bar-goal.lev:	$(DAT)Barb.des $(SBIN)lev_comp
 
+$(BARDFILES1):	$(SLIB)Brd-goal.lev
+
+$(SLIB)Brd-goal.lev:	$(DAT)Bard.des $(SBIN)lev_comp
+
 $(CDFILES1):	$(SLIB)Cav-goal.lev
 
 $(SLIB)Cav-goal.lev:	$(DAT)Caveman.des $(SBIN)lev_comp
diff -Naurb ../nethack-3.4.3//sys/amiga/Makefile.ami ./sys/amiga/Makefile.ami
--- ../nethack-3.4.3//sys/amiga/Makefile.ami	2003-12-07 21:39:13.000000000 -0200
+++ ./sys/amiga/Makefile.ami	2008-04-04 23:26:50.000000000 -0300
@@ -428,6 +428,10 @@
 	$(SLIB)Bar-strt.lev
 BDFILES= $(SLIB)Bar-goal.lev $(BDFILES1)
 
+BARDFILES1= $(SLIB)Brd-fila.lev $(SLIB)Brd-filb.lev $(SLIB)Brd-loca.lev \
+	$(SLIB)Brd-strt.lev
+BARDFILES= $(SLIB)Brd-goal.lev $(BARDFILES1)
+
 CDFILES1= $(SLIB)Cav-fila.lev $(SLIB)Cav-filb.lev $(SLIB)Cav-loca.lev \
 	$(SLIB)Cav-strt.lev
 CDFILES= $(SLIB)Cav-goal.lev $(CDFILES1)
@@ -472,7 +476,7 @@
 	$(SLIB)Wiz-strt.lev
 WDFILES= $(SLIB)Wiz-goal.lev $(WDFILES1)
 
-XDFILES=	$(ADFILES) $(BDFILES) $(CDFILES) $(HDFILES) $(KDFILES) \
+XDFILES=	$(ADFILES) $(BDFILES) $(BARDFILES) $(CDFILES) $(HDFILES) $(KDFILES) \
 		$(MDFILES) $(PDFILES) $(RDFILES) $(RANFILES) $(SDFILES) $(TDFILES) \
 		$(VDFILES) $(WDFILES)
 
@@ -627,6 +631,7 @@
 #	-delete $(SLIB)soko4-1.lev $(SLIB)soko4-2.lev
 #	-delete $(ADFILES)
 #	-delete $(BDFILES)
+#	-delete $(BARDFILES)
 #	-delete $(CDFILES)
 #	-delete $(HDFILES)
 #	-delete $(KDFILES)
@@ -1137,6 +1142,12 @@
 #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Barb.des
 #none
 
+$(BARDFILES1):	$(SLIB)Brd-goal.lev
+
+$(SLIB)Brd-goal.lev:	$(DAT)Bard.des $(SBIN)lev_comp
+#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Bard.des
+#none
+
 $(CDFILES1):	$(SLIB)Cav-goal.lev
 
 $(SLIB)Cav-goal.lev:	$(DAT)Caveman.des $(SBIN)lev_comp
diff -Naurb ../nethack-3.4.3//sys/msdos/Makefile.BC ./sys/msdos/Makefile.BC
--- ../nethack-3.4.3//sys/msdos/Makefile.BC	2003-12-07 21:39:13.000000000 -0200
+++ ./sys/msdos/Makefile.BC	2008-04-04 23:26:50.000000000 -0300
@@ -709,7 +709,7 @@
 
 U  = $(UTIL)\				# comment so \ isn't last char
 
-SPLEVDES = $(DAT)\Arch.des $(DAT)\Barb.des $(DAT)\bigroom.des \
+SPLEVDES = $(DAT)\Arch.des $(DAT)\Barb.des $(DAT)\Bard.des $(DAT)\bigroom.des \
 	$(DAT)\castle.des $(DAT)\Caveman.des $(DAT)\endgame.des \
 	$(DAT)\gehennom.des $(DAT)\Healer.des $(DAT)\Knight.des \
 	$(DAT)\knox.des $(DAT)\Monk.des $(DAT)\medusa.des \
@@ -975,6 +975,7 @@
 	$(U)lev_comp yendor.des
 	$(U)lev_comp arch.des
 	$(U)lev_comp barb.des
+	$(U)lev_comp bard.des
 	$(U)lev_comp caveman.des
 	$(U)lev_comp healer.des
 	$(U)lev_comp knight.des
diff -Naurb ../nethack-3.4.3//sys/msdos/Makefile.GCC ./sys/msdos/Makefile.GCC
--- ../nethack-3.4.3//sys/msdos/Makefile.GCC	2003-12-07 21:39:13.000000000 -0200
+++ ./sys/msdos/Makefile.GCC	2008-04-04 23:26:50.000000000 -0300
@@ -886,6 +886,7 @@
 	$(DAT)/endgame.des $(DAT)/gehennom.des $(DAT)/knox.des \
 	$(DAT)/medusa.des  $(DAT)/oracle.des   $(DAT)/tower.des \
 	$(DAT)/yendor.des  $(DAT)/arch.des     $(DAT)/barb.des \
+	$(DAT)/bard.des \
 	$(DAT)/caveman.des   $(DAT)/healer.des   $(DAT)/knight.des \
 	$(DAT)/monk.des      $(DAT)/priest.des   $(DAT)/ranger.des \
 	$(DAT)/rogue.des     $(DAT)/samurai.des  $(DAT)/tourist.des \
@@ -904,6 +905,7 @@
 	@$(subst /,\,$(U)lev_comp yendor.des)
 	@$(subst /,\,$(U)lev_comp arch.des)
 	@$(subst /,\,$(U)lev_comp barb.des)
+	@$(subst /,\,$(U)lev_comp bard.des)
 	@$(subst /,\,$(U)lev_comp caveman.des)
 	@$(subst /,\,$(U)lev_comp healer.des)
 	@$(subst /,\,$(U)lev_comp knight.des)
diff -Naurb ../nethack-3.4.3//sys/msdos/Makefile.MSC ./sys/msdos/Makefile.MSC
--- ../nethack-3.4.3//sys/msdos/Makefile.MSC	2003-12-07 21:39:13.000000000 -0200
+++ ./sys/msdos/Makefile.MSC	2008-04-04 23:26:50.000000000 -0300
@@ -137,7 +137,7 @@
 
 U  = $(UTIL)\				# comment so \ isn't last char
 
-SPLEVDES = $(DAT)\Arch.des $(DAT)\Barb.des $(DAT)\bigroom.des \
+SPLEVDES = $(DAT)\Arch.des $(DAT)\Barb.des $(DAT)\Bard.des $(DAT)\bigroom.des \
 	$(DAT)\castle.des $(DAT)\Caveman.des $(DAT)\endgame.des \
 	$(DAT)\gehennom.des $(DAT)\Healer.des $(DAT)\Knight.des \
 	$(DAT)\knox.des $(DAT)\Monk.des $(DAT)\medusa.des \
@@ -425,6 +425,7 @@
 	$(U)lev_comp yendor.des
 	$(U)lev_comp arch.des
 	$(U)lev_comp barb.des
+	$(U)lev_comp bard.des
 	$(U)lev_comp caveman.des
 	$(U)lev_comp healer.des
 	$(U)lev_comp knight.des
diff -Naurb ../nethack-3.4.3//sys/os2/Makefile.os2 ./sys/os2/Makefile.os2
--- ../nethack-3.4.3//sys/os2/Makefile.os2	2003-12-07 21:39:13.000000000 -0200
+++ ./sys/os2/Makefile.os2	2008-04-04 23:26:50.000000000 -0300
@@ -529,6 +529,7 @@
 QUEST_LEVS = \
  Arc-goal.lev Arc-fila.lev Arc-filb.lev Arc-loca.lev Arc-strt.lev \
  Bar-goal.lev Bar-fila.lev Bar-filb.lev Bar-loca.lev Bar-strt.lev \
+ Brd-goal.lev Brd-fila.lev Brd-filb.lev Brd-loca.lev Brd-strt.lev \
  Cav-goal.lev Cav-fila.lev Cav-filb.lev Cav-loca.lev Cav-strt.lev \
  Hea-goal.lev Hea-fila.lev Hea-filb.lev Hea-loca.lev Hea-strt.lev \
  Kni-goal.lev Kni-fila.lev Kni-filb.lev Kni-loca.lev Kni-strt.lev \
@@ -1276,6 +1277,7 @@
 
 AFILES = $(GAMEDIR)\Arc-goal.lev
 BFILES = $(GAMEDIR)\Bar-goal.lev
+BARDFILES = $(GAMEDIR)\Brd-goal.lev
 CFILES = $(GAMEDIR)\Cav-goal.lev
 HFILES = $(GAMEDIR)\Hea-goal.lev
 KFILES = $(GAMEDIR)\Kni-goal.lev
@@ -1288,7 +1290,7 @@
 VFILES = $(GAMEDIR)\Val-goal.lev
 WFILES = $(GAMEDIR)\Wiz-goal.lev
 
-XFILES = $(AFILES) $(BFILES) $(CFILES) $(HFILES) $(KFILES) $(MFILES) \
+XFILES = $(AFILES) $(BFILES) $(BARDFILES) $(CFILES) $(HFILES) $(KFILES) $(MFILES) \
 	 $(PFILES) $(RANFILES) $(RFILES) $(SFILES) $(TFILES) $(VFILES) $(WFILES)
 
 spec_lev : $(GAMEDIR)\astral.lev $(GAMEDIR)\bigrm-1.lev $(GAMEDIR)\castle.lev \
@@ -1383,6 +1385,8 @@
 	$(MAKEB) QQ=Arc QF=Arch do_quest
 $(BFILES) : $(DAT)\Barb.des $(TEMP)\lev_comp.exe
 	$(MAKEB) QQ=Bar QF=Barb do_quest
+$(BARDFILES) : $(DAT)\Bard.des $(TEMP)\lev_comp.exe
+	$(MAKEB) QQ=Brd QF=Bard do_quest
 $(CFILES) : $(DAT)\Caveman.des $(TEMP)\lev_comp.exe
 	$(MAKEB) QQ=Cav QF=Caveman do_quest
 $(HFILES) : $(DAT)\Healer.des $(TEMP)\lev_comp.exe
diff -Naurb ../nethack-3.4.3//sys/unix/Makefile.dat ./sys/unix/Makefile.dat
--- ../nethack-3.4.3//sys/unix/Makefile.dat	2003-12-07 21:39:13.000000000 -0200
+++ ./sys/unix/Makefile.dat	2008-04-04 23:26:50.000000000 -0300
@@ -116,11 +116,12 @@
 	touch spec_levs
 
 quest_levs: ../util/lev_comp \
-	Arch.des Barb.des Caveman.des Healer.des Knight.des Monk.des \
+	Arch.des Barb.des Bard.des Caveman.des Healer.des Knight.des Monk.des \
 	Priest.des Ranger.des Rogue.des Samurai.des Tourist.des Valkyrie.des \
 	Wizard.des
 	../util/lev_comp Arch.des
 	../util/lev_comp Barb.des
+	../util/lev_comp Bard.des
 	../util/lev_comp Caveman.des
 	../util/lev_comp Healer.des
 	../util/lev_comp Knight.des
diff -Naurb ../nethack-3.4.3//sys/vms/Makefile.dat ./sys/vms/Makefile.dat
--- ../nethack-3.4.3//sys/vms/Makefile.dat	2003-12-07 21:39:13.000000000 -0200
+++ ./sys/vms/Makefile.dat	2008-04-04 23:26:50.000000000 -0300
@@ -28,7 +28,7 @@
 DUNGEON = dungeon.;
 X11TILES= x11tiles.;
 # note: the level lists need to be space separated
-QUESTLEVS = Arch.des Barb.des Caveman.des Healer.des Knight.des \
+QUESTLEVS = Arch.des Barb.des Bard.des Caveman.des Healer.des Knight.des \
 	Monk.des Priest.des Ranger.des Rogue.des Samurai.des Tourist.des \
 	Valkyrie.des Wizard.des
 SPECLEVS  = bigroom.des castle.des endgame.des gehennom.des knox.des \
diff -Naurb ../nethack-3.4.3//sys/winnt/Makefile.bcc ./sys/winnt/Makefile.bcc
--- ../nethack-3.4.3//sys/winnt/Makefile.bcc	2003-12-07 21:39:13.000000000 -0200
+++ ./sys/winnt/Makefile.bcc	2008-04-04 23:26:50.000000000 -0300
@@ -558,6 +558,7 @@
 	$(DAT)\endgame.des $(DAT)\gehennom.des $(DAT)\knox.des   \
 	$(DAT)\medusa.des  $(DAT)\oracle.des   $(DAT)\tower.des  \
 	$(DAT)\yendor.des  $(DAT)\arch.des     $(DAT)\barb.des   \
+	$(DAT)\bard.des   \
 	$(DAT)\caveman.des $(DAT)\healer.des   $(DAT)\knight.des \
 	$(DAT)\monk.des    $(DAT)\priest.des   $(DAT)\ranger.des \
 	$(DAT)\rogue.des   $(DAT)\samurai.des  $(DAT)\sokoban.des \
@@ -576,6 +577,7 @@
 	$(U)lev_comp yendor.des
 	$(U)lev_comp arch.des
 	$(U)lev_comp barb.des
+	$(U)lev_comp bard.des
 	$(U)lev_comp caveman.des
 	$(U)lev_comp healer.des
 	$(U)lev_comp knight.des
diff -Naurb ../nethack-3.4.3//sys/winnt/Makefile.gcc ./sys/winnt/Makefile.gcc
--- ../nethack-3.4.3//sys/winnt/Makefile.gcc	2003-12-07 21:39:13.000000000 -0200
+++ ./sys/winnt/Makefile.gcc	2008-04-04 23:26:50.000000000 -0300
@@ -520,6 +520,7 @@
 	 $(DAT)/endgame.des $(DAT)/gehennom.des $(DAT)/knox.des   \
 	 $(DAT)/medusa.des  $(DAT)/oracle.des   $(DAT)/tower.des  \
 	 $(DAT)/yendor.des  $(DAT)/arch.des     $(DAT)/barb.des   \
+	 $(DAT)/bard.des   \
 	 $(DAT)/caveman.des $(DAT)/healer.des   $(DAT)/knight.des \
 	 $(DAT)/monk.des    $(DAT)/priest.des   $(DAT)/ranger.des \
 	 $(DAT)/rogue.des   $(DAT)/samurai.des  $(DAT)/sokoban.des \
@@ -537,6 +538,7 @@
 	$(subst /,\,$(U)lev_comp $(DAT)/yendor.des)
 	$(subst /,\,$(U)lev_comp $(DAT)/arch.des)
 	$(subst /,\,$(U)lev_comp $(DAT)/barb.des)
+	$(subst /,\,$(U)lev_comp $(DAT)/bard.des)
 	$(subst /,\,$(U)lev_comp $(DAT)/caveman.des)
 	$(subst /,\,$(U)lev_comp $(DAT)/healer.des)
 	$(subst /,\,$(U)lev_comp $(DAT)/knight.des)
diff -Naurb ../nethack-3.4.3//sys/winnt/Makefile.msc ./sys/winnt/Makefile.msc
--- ../nethack-3.4.3//sys/winnt/Makefile.msc	2003-12-07 21:39:13.000000000 -0200
+++ ./sys/winnt/Makefile.msc	2008-04-04 23:26:50.000000000 -0300
@@ -493,6 +493,7 @@
 	$(DAT)\endgame.des $(DAT)\gehennom.des $(DAT)\knox.des   \
 	$(DAT)\medusa.des  $(DAT)\oracle.des   $(DAT)\tower.des  \
 	$(DAT)\yendor.des  $(DAT)\arch.des     $(DAT)\barb.des   \
+	$(DAT)\bard.des   \
 	$(DAT)\caveman.des $(DAT)\healer.des   $(DAT)\knight.des \
 	$(DAT)\monk.des    $(DAT)\priest.des   $(DAT)\ranger.des \
 	$(DAT)\rogue.des   $(DAT)\samurai.des  $(DAT)\sokoban.des \
@@ -511,6 +512,7 @@
 	$(U)lev_comp yendor.des
 	$(U)lev_comp arch.des
 	$(U)lev_comp barb.des
+	$(U)lev_comp bard.des
 	$(U)lev_comp caveman.des
 	$(U)lev_comp healer.des
 	$(U)lev_comp knight.des
diff -Naurb ../nethack-3.4.3//util/lev_main.c ./util/lev_main.c
--- ../nethack-3.4.3//util/lev_main.c	2003-12-07 21:39:13.000000000 -0200
+++ ./util/lev_main.c	2010-11-24 23:06:42.000000000 -0200
@@ -162,6 +162,9 @@
 	{ "wand shop",	 WANDSHOP },
 	{ "tool shop",	 TOOLSHOP },
 	{ "book shop",	 BOOKSHOP },
+#ifdef BARD
+	{ "music shop",  MUSICSHOP },
+#endif
 	{ "candle shop", CANDLESHOP },
 	{ 0, 0 }
 };
@@ -222,6 +225,9 @@
 	static char *mac_argv[] = {	"lev_comp",	/* dummy argv[0] */
 				":dat:Arch.des",
 				":dat:Barb.des",
+#ifdef BARD
+				":dat:Bard.des",
+#endif
 				":dat:Caveman.des",
 				":dat:Healer.des",
 				":dat:Knight.des",
