Remember to put these lines into your include/config.h:

#define LIGHTSABERS
#define JEDI

Changes from 0.3:
* feature: added Jedi to guild level
* feature: plasteel armor, helm, gloves, boots
	   all have probability 0, but can be wished for.
	   note that plasteel helmets cover your entire head.
	   that means no eating, drinking, putting on or off
	   towels/lenses/blindfolds and no using them as
	   mind flayers.
* change: stormtroopers all have a complete suite of
	  plasteel armor
* bugfix: lighting in quest home level was wrong
* bugfix: lightsabers did not appear in engraving dialoge
	  sent upstream
* bugfix: charge saber tech had unexpected results, fixed
diff -pruN slashem-0.0.7E7F1-orig/dat/Jedi.des slashem-0.0.7E7F1/dat/Jedi.des
--- slashem-0.0.7E7F1-orig/dat/Jedi.des	1970-01-01 01:00:00.000000000 +0100
+++ slashem-0.0.7E7F1/dat/Jedi.des	2005-07-20 14:55:01.434612456 +0200
@@ -0,0 +1,358 @@
+#	SCCS Id: @(#)Knight.des	3.4	1995/04/16
+#	Copyright (c) 1989 by Jean-Christophe Collet
+#	Copyright (c) 1991,92 by M. Stephenson
+# NetHack may be freely redistributed.  See license for details.
+#
+#	The "start" level for the quest.
+#
+#	Here you meet your (besieged) class leader, The Jedi Master
+#	and receive your quest assignment.
+#
+MAZE: "Jed-strt",'.'
+FLAGS: noteleport,hardfloor
+INIT_MAP: '.' , '.' , false , false , unlit , false
+GEOMETRY:center,center
+#         1         2         3         4         5         6         7
+#123456789012345678901234567890123456789012345678901234567890123456789012345
+MAP
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA--------AAAAAAAAAAAAAAAAAAAAAAAAAAA--------AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA|......|AAAAAAAAAAAAAAAAAAAAAAAAAAA|......|AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA|......|AA-----------------------AA|......|AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA|......|AA|.....................|AA|......|AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA|......|AA|.-------------------.|AA|......|AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA---+----AA|.|.................|.|AA----+---AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAA|.|AAAAA|.|.................|.|AAAAA|.|AAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAA|.------|.|..}...........}..|.|------.|AAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAS.......+.+.................+.+.......SAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAA|.------|.|..}...........}..|.|------.|AAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAA|.|AAAAA|.|.................|.|AAAAA|.|AAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA---+----AA|.|.................|.|AA----+---AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA|......|AA|.-------------------.|AA|......|AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA|......|AA|.....................|AA|......|AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA|......|AA-----------------------AA|......|AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA|......|AAAAAAAAAAAAAAAAAAAAAAAAAAA|......|AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA--------AAAAAAAAAAAAAAAAAAAAAAAAAAA--------AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ENDMAP
+RANDOM_PLACES: (57,3), (17,14), (57,14)
+# according to starwars.com the Jedi temple is a tall building high up into
+# the sky. So it seems right to have it being surrounded by Air
+# Dungeon Description
+REGION:(00,00,75,20),unlit,"ordinary"
+REGION:(16,02,23,07),lit,"ordinary"
+REGION:(51,02,63,07),lit,"ordinary"
+REGION:(16,13,23,18),lit,"ordinary"
+REGION:(51,13,63,18),lit,"ordinary"
+REGION:(29,07,45,14),lit,"ordinary"
+# Portal arrival point
+BRANCH:(17,03,0,0),(0,0,0,0)
+# Stairs
+STAIR:place[0],down
+# Doors
+DOOR:closed,(19,07)
+DOOR:closed,(19,13)
+DOOR:locked,(18,10)
+DOOR:locked,(26,10)
+DOOR:locked,(28,10)
+DOOR:locked,(46,10)
+DOOR:locked,(48,10)
+DOOR:locked,(56,10)
+DOOR:closed,(55,13)
+DOOR:closed,(55,07)
+# The Jedi Master
+MONSTER:'@',"The Jedi Master",(37,10)
+# His treasure
+CONTAINER:'(',"chest",place[1]
+OBJECT:'?',"charging",contained
+OBJECT:'?',random,contained
+OBJECT:random,random,contained
+# the remaining Jedi
+MONSTER:'@',"padawan",(38,11),peaceful
+MONSTER:'@',"padawan",(38,09),peaceful
+MONSTER:'@',"padawan",(36,11),peaceful
+MONSTER:'@',"padawan",(36,09),peaceful
+MONSTER:'@',"jedi",(18,4),peaceful
+MONSTER:'@',"jedi",(19,4),peaceful
+MONSTER:'@',"jedi",(18,15),peaceful
+MONSTER:'@',"jedi",(19,15),peaceful
+MONSTER:'@',"jedi",(56,4),peaceful
+MONSTER:'@',"jedi",(57,4),peaceful
+MONSTER:'@',"jedi",(56,15),peaceful
+MONSTER:'@',"jedi",(57,15),peaceful
+MONSTER:'@',"jedi",(33,10),peaceful
+# Non diggable walls
+NON_DIGGABLE:(00,00,75,20)
+# Monsters on siege duty.
+MONSTER: '@',"stormtrooper",(27,05),hostile
+MONSTER: '@',"stormtrooper",(47,05),hostile
+MONSTER: '@',"stormtrooper",(27,15),hostile
+MONSTER: '@',"stormtrooper",(47,15),hostile
+MONSTER: '@',"stormtrooper",(19,10),hostile
+MONSTER: '@',"stormtrooper",(20,10),hostile
+MONSTER: '@',"stormtrooper",(50,10),hostile
+MONSTER: '@',"stormtrooper",(51,10),hostile
+#
+#	The "locate" level for the quest.
+#
+
+MAZE: "Jed-loca",' '
+FLAGS: hardfloor
+INIT_MAP: '.' , '.' , false , false , unlit , false
+GEOMETRY:center,center
+#         1         2         3         4         5         6         7
+#123456789012345678901234567890123456789012345678901234567890123456789012345
+MAP
+................L...........................................................
+...............LLL..........................................................
+..............LLLLL...................  ....................................
+.............LLLLLLL..................  ....................................
+............LLLLLLLLL.............................................. ........
+.............LLLLLLL..............................................   .......
+..............LLLLL..............................................     ......
+...............LLL..............................................   .........
+................L.............................. ...............    .    ....
+...............................................  .............     .     ...
+..............................................     ............    .    ....
+...............................................  ...............       .....
+.............P.................................. ................     ......
+............PPP.....................P.............................   .......
+...........PPPPP...................PPP............................. ........
+............PPP...................PPPPP.....................................
+.............P...................PPPPPPP....................................
+..................................PPPPP.....................................
+...................................PPP......................................
+....................................P.......................................
+............................................................................
+ENDMAP
+# supposed to designate a sun, two water planets, two asteroids and
+# a barren planet made mostly of rock. Yeah, bite me!
+# Stairs
+STAIR:(0,0),up
+STAIR:(67,10),down
+# 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
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+# Random traps
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+# Random monsters.
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+
+#
+#	The "goal" level for the quest.
+#
+
+MAZE: "Jed-goal", ' '
+INIT_MAP: '.' , '.' , false , false , unlit , false
+GEOMETRY:center,center
+#         1         2         3         4         5         6         7
+#123456789012345678901234567890123456789012345678901234567890123456789012345
+MAP
+.......PP......                                                             
+......P......     .............................    ...............          
+.....P.PP....    .......L................L.....     .......L.......         
+..PPPPP.....   ........L.L..............L.....    ........LL........        
+...P.PP......    ....LL...L..L.....LL..LL....   ........L....L........      
+...PP.P....    ............LLL...L..L.LL....      .....L......L.......      
+...P...P....   ......LL....L..L.L....LL........     ...............         
+...PPPPP..............L...L..L.L....LL........   ......L....LL.....         
+..P.P................L..LL....L....L.L.......     .........L.L......        
+........................L......L..L.L........HHH......L..LL..L.......       
+....P....    ..........LL....L.L.L..L........   ......LL..LL.L.....         
+....PPP...    .........LL...L.L.L..LL........   .....L..LL..LL.....         
+....PP......    ............L.L....L.......   .......LLL.L..........        
+....P..P.....   ........L.....L.....L.....   .......L.L...LLLLL......       
+...PP..PP.....  ........L....L.L..L........   .....LL..LL.L..L......        
+..PP..P.P....    ........L..L...L.L.........   ....LLLLLLLLL.L.........     
+...PPP..P.....     ........LL....L..........  ........LL.LL.........        
+....PP.P.......     .........................    ................           
+....P.PP.......       .........................    ...........              
+..............                                                              
+ENDMAP
+# yeah, it's the slightly modified knight quest
+# Stairs
+STAIR:(03,08),up
+# Non diggable walls
+NON_DIGGABLE:(00,00,75,19)
+# Objects
+OBJECT:'(',"red lightsaber",(60,06),blessed,0,"The Lightsaber Prototype"
+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
+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
+OBJECT:random,random,random
+OBJECT:random,random,random
+OBJECT:random,random,random
+# Random traps
+TRAP:"spiked pit",(13,07)
+TRAP:"spiked pit",(12,08)
+TRAP:"spiked pit",(12,09)
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+TRAP:random,random
+# Random monsters.
+MONSTER:'@',"Lord Sidious",(60,06),hostile
+MONSTER:'@',"jedi",random,peaceful
+MONSTER:'@',"jedi",random,peaceful
+MONSTER:'@',"jedi",random,peaceful
+MONSTER:'@',"jedi",random,peaceful
+MONSTER:'@',"jedi",random,peaceful
+MONSTER:'@',"jedi",random,peaceful
+MONSTER:'@',"jedi",random,peaceful
+MONSTER:'@',"jedi",random,peaceful
+MONSTER:'@',"jedi",random,peaceful
+MONSTER:'@',"jedi",random,peaceful
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,hostile
+MONSTER:'@',"stormtrooper",random,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: "Jed-fila" , '.'
+INIT_MAP: '.' , '.' , false , true , unlit , false
+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
+OBJECT: random, random, random
+#
+MONSTER:'@',"jedi",random,peaceful
+MONSTER:'@',"jedi",random,peaceful
+MONSTER: '@', "stormtrooper", random, hostile
+MONSTER: '@', "stormtrooper", random, hostile
+MONSTER: '@', "stormtrooper", random, hostile
+MONSTER: '@', "stormtrooper", random, hostile
+MONSTER: '@', "stormtrooper", random, hostile
+#
+TRAP: random, random
+TRAP: random, random
+TRAP: random, random
+TRAP: random, random
+
+MAZE: "Jed-filb" , '.'
+INIT_MAP: '.' , '.' , false , true , lit , false
+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
+OBJECT: random, random, random
+OBJECT: random, random, random
+OBJECT: random, random, random
+OBJECT: random, random, random
+#
+MONSTER:'@',"jedi",random,peaceful
+MONSTER:'@',"jedi",random,peaceful
+MONSTER: '@', "stormtrooper", random, hostile
+MONSTER: '@', "stormtrooper", random, hostile
+MONSTER: '@', "stormtrooper", random, hostile
+MONSTER: '@', "stormtrooper", random, hostile
+MONSTER: '@', "stormtrooper", random, hostile
+#
+TRAP: random, random
+TRAP: random, random
+TRAP: random, random
+TRAP: random, random
diff -pruN slashem-0.0.7E7F1-orig/dat/guild.des slashem-0.0.7E7F1/dat/guild.des
--- slashem-0.0.7E7F1-orig/dat/guild.des	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/dat/guild.des	2005-07-20 14:55:06.718809136 +0200
@@ -42,6 +42,8 @@ MONSTER: '@', "healer", random, hostile
 MONSTER: '@', "healer", random, hostile
 MONSTER: '@', "ice mage", random, hostile
 MONSTER: '@', "ice mage", random, hostile
+MONSTER: '@', "jedi", random, hostile
+MONSTER: '@', "padawan", random, hostile
 MONSTER: '@', "knight", random, hostile
 MONSTER: '@', "knight", random, hostile
 MONSTER: '@', "monk", random, hostile
diff -pruN slashem-0.0.7E7F1-orig/dat/quest.txt slashem-0.0.7E7F1/dat/quest.txt
--- slashem-0.0.7E7F1-orig/dat/quest.txt	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/dat/quest.txt	2005-07-20 14:55:06.726807920 +0200
@@ -1588,6 +1588,243 @@ speaks of you.
 "This is all I know, %p.  I hope it will help you."
 %E
 #
+#       Jedi
+#
+%Cc Jed 00001
+You are back at %H where you were raised and trained during your youth.
+You fondly remember your mentor, %l, and your fellow %g.
+Looking around, to the eye everything looks normal. You wonder why
+%l would call you here without necessity.
+
+Then some stormtroopers jump from the shadows...
+%E
+%Cp Jed 00002
+Once again you are back at %H.
+%E
+%Cp Jed 00003
+Again, you stand before %H.  You vaguely sense that this
+may be the last time you stand before %l.
+%E
+%Cp Jed 00005
+"Hello, %p. May the force be with you!"
+%E
+%Cp Jed 00006
+"%p, it seems the force has left us..."
+%E
+%Cp Jed 00007
+"The dark side is strong, or so they tell us."
+%E
+%Cp Jed 00008
+"If the dark side is so powerful, why not use its power for us?"
+%E
+%Cp Jed 00009
+"What shall we do, %p?"
+%E
+%Cp Jed 00010
+"Hello, %p. May the force be with you!"
+%E
+%Cp Jed 00011
+"The force has led us to victory!"
+%E
+%Cp Jed 00012
+"Will the Sith ever be defeated?"
+%E
+%Cp Jed 00013
+"So you defeated %n?"
+%E
+%Cp Jed 00014
+"Is this the fabled %o?"
+%E
+%Cc Jed 00015
+"It's good to see you again, %p. I'm glad you got our transmission.
+Let me check if you are capable of helping us in this dark hour."
+%E
+%Cp Jed 00016
+"The force is strong in you, %p. But is it strong enough now?"
+%E
+%Cp Jed 00017
+"Again, you are back, %p. Have you enhanced your knowledge of the force
+far enough now?"
+%E
+%Cc Jed 00018
+"You are arrogant, %p. This is the way to the Dark Side. Unfortunately,
+we cannot allow you to walk the halls of %H anymore to protect our %gP.
+Leave, now, and never return here, or we will have to deal with you
+in ways other than words."
+%E
+%Cc Jed 00019
+"The force is strong within you, %p. But sadly, a mere %r could never
+hope to be a help in this dark hour.
+Go and learn more of the way of the force. When you reached the skills
+of a %R, return here.
+
+May the force be with you!"
+%E
+%Cc Jed 00020
+"You have strayed from the light side of the force! Leave, now!
+And return only when you made up your mind about which way to
+follow."
+%E
+%Cc Jed 00021
+"Ah, %p. You have become a fine %r, you have become skilled in using
+the force and the ways of the Jedi. As such, you must help us:"
+
+"As you surely noticed, war has broken out between the Sith and the
+Jedi. Stormtroopers, Sith and Jedi are desperately fighting and
+dying for what they believe in."
+
+"What they are fighting over? A mighty artifact, %o.
+It is the first lightsaber ever made and has powers greater than any
+lightsaber in use today. It never runs out of power and has a built-in
+targeting device."
+
+"It was also thought to be lost forever, but eventually a merchant
+discovered it in the outer rim and announced it for sale. Needless to
+say, that merchant was no longer alive when we got there, slaughtered
+by the Sith, who - despite all their efforts - couldn't get their hands
+on it yet."
+
+"We need your help in this matter. Every man on the front in the outer
+rim counts."
+
+"Oh, and we got word that %n himself has gone to the outer rim to claim
+%o. You better hurry."
+
+"May the force be with you!"
+%E
+%Cp Jed 00025
+"Remember, %p, follow always the path of the %d."
+%E
+%Cp Jed 00026
+"May the force be with you!"
+%E
+%Cp Jed 00027
+"Remember, %p, follow always the path of the %d."
+%E
+%Cp Jed 00028
+"May the force be with you!"
+%E
+%Cp Jed 00029
+"Remember, %p, follow always the path of the %d."
+%E
+%Cp Jed 00030
+"May the force be with you!"
+%E
+%Cp Jed 00031
+"Remember, %p, follow always the path of the %d."
+%E
+%Cp Jed 00032
+"May the force be with you!"
+%E
+%Cp Jed 00033
+"Remember, %p, follow always the path of the %d."
+%E
+%Cp Jed 00034
+"May the force be with you!"
+%E
+%Cc Jed 00035
+You arrive at the %i.
+Following the emanations of the force, you work your way through the
+different planets trying to locate %o.
+%E
+%Cp Jed 00036
+Again, you arrive at the %i.
+%E
+%Cc Jed 00040
+You arrive at an unnamed planet.
+You can feel large disturbances in the force before you, like huge
+armies crossing weapons.
+You know that you must hurry in order to not disappoint %l.
+%E
+%Cp Jed 00041
+Again, you arrive at the unnamed planet.
+%E
+%Cc Jed 00050
+"Again, %l sends a worthless %c to get %o from me?
+Well, I can give you a choice: Join me!"
+%E
+%Cp Jed 00051
+"Again, you challenge me, %r? You can't beat the dark side of the force!"
+%E
+%Cp Jed 00052
+"Haven't you learned your lesson yet? I shall teach it to you now!"
+%E
+%Cp Jed 00053
+"Got your hands on %o, little %c? You will not be able to draw all its
+powers anyway. Now, you wouldn't kill an unarmed, would you?"
+%E
+%Cp Jed 00060
+"Join the dark side and you'll be granted powers beyond your wildest dreams!"
+%E
+%Cp Jed 00061
+"%l's faith in you is his weak point!"
+%E
+%Cp Jed 00062
+"A %c you want to be? I call you a %g!"
+%E
+%Cp Jed 00063
+"Join the dark side and you'll be granted powers beyond your wildest dreams!"
+%E
+%Cp Jed 00064
+"%l's faith in you is his weak point!"
+%E
+%Cp Jed 00065
+"A %c you want to be? I call you a %g!"
+%E
+%Cp Jed 00066
+"Join the dark side and you'll be granted powers beyond your wildest dreams!"
+%E
+%Cp Jed 00067
+"%l's faith in you is his weak point!"
+%E
+%Cp Jed 00068
+"A %c you want to be? I call you a %g!"
+%E
+%Cp Jed 00069
+"Join the dark side and you'll be granted powers beyond your wildest dreams!"
+%E
+%Cc Jed 00070
+You have %o in your hands.
+Force surrounds it like air surrounds a planet. You can see why no
+other lightsaber was made like this one.
+%E
+%Cc Jed 00080
+You finally manage to land the final blow against %n.
+But as you just want to claim your victory, his body dissolves into
+nothingness.
+
+"You can't win against %n! I will be back!"
+
+You feel a shiver run up and down your spine as you head back
+to %l.
+%E
+%Cc Jed 00081
+As you approach %l, he beams at you and says:
+
+	You have not disappointed the halls of %H.
+	The war is over, %o is secured and peace
+	can be restored.
+
+	Though %n escaped us again, we will not rest until he is
+	destroyed. The Sith must never return to power.
+%E
+%Cc Jed 00082
+"Be careful with %o. Though it gives great power, it also requires
+great responsibility from its owner. Use the portal to return to
+%Z and find the Amulet of Yendor.
+%E
+%Cp Jed 00090
+"Welcome back, %p. How is the search for the Amulet of Yendor?"
+%E
+%Cc Jed 00091
+"You really are a %S of %H."
+
+"Ancient Jedi Legends tell us that the amulet must be brought to
+a place called 'The Astral Plane' and offered to %d there."
+
+"May the force be with you, %p."
+%E
+#
 #       Knight
 #
 %Cc Kni 00001
diff -pruN slashem-0.0.7E7F1-orig/include/artilist.h slashem-0.0.7E7F1/include/artilist.h
--- slashem-0.0.7E7F1-orig/include/artilist.h	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/include/artilist.h	2005-07-20 14:55:06.728807616 +0200
@@ -427,6 +427,13 @@ A("The Crown of Saint Edward", HELM_OF_T
 	0,  A_LAWFUL, PM_YEOMAN, NON_PM, 5000L ),
 #endif
 
+#ifdef JEDI
+A("The Lightsaber Prototype", RED_LIGHTSABER,
+	(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_REFLECT), 0, 0,
+	PHYS(5, 10),	NO_DFNS, NO_CARY,
+	ENERGY_BOOST,	A_LAWFUL, PM_JEDI, NON_PM, 3500L ),
+#endif
+
 /*
  *  terminator; otyp must be zero
  */
diff -pruN slashem-0.0.7E7F1-orig/include/extern.h slashem-0.0.7E7F1/include/extern.h
--- slashem-0.0.7E7F1-orig/include/extern.h	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/include/extern.h	2005-07-20 14:55:06.734806704 +0200
@@ -2061,6 +2061,13 @@ E int FDECL(tech_inuse, (int));
 E void NDECL(tech_timeout);
 E boolean FDECL(tech_known, (SHORT_P));
 E void FDECL(learntech, (SHORT_P,long,int));
+E int FDECL(disarm_holdingtrap, (struct trap *));
+E int FDECL(disarm_rust_trap, (struct trap *));
+E int FDECL(disarm_fire_trap, (struct trap *));
+E int FDECL(disarm_landmine, (struct trap *));
+E int FDECL(disarm_squeaky_board, (struct trap *));
+E int FDECL(disarm_shooting_trap, (struct trap *, int));
+
 
 /* ### teleport.c ### */
 
diff -pruN slashem-0.0.7E7F1-orig/include/tech.h slashem-0.0.7E7F1/include/tech.h
--- slashem-0.0.7E7F1-orig/include/tech.h	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/include/tech.h	2005-07-20 14:55:06.736806400 +0200
@@ -88,8 +88,15 @@ struct blitz_tab {
 #define T_POWER_SURGE 	39
 #define T_SPIRIT_BOMB 	40
 #define T_DRAW_BLOOD	41
+#ifdef JEDI
+#define T_JEDI_JUMP	42
+#define T_CHARGE_SABER	43
+#define T_TELEKINESIS	44
 
+#define MAXTECH 44
+#else /* JEDI */
 #define MAXTECH 41
+#endif /* JEDI */
 
 
 #endif /* TECH_H */
diff -pruN slashem-0.0.7E7F1-orig/src/apply.c slashem-0.0.7E7F1/src/apply.c
--- slashem-0.0.7E7F1-orig/src/apply.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/apply.c	2005-07-20 14:55:06.741805640 +0200
@@ -1145,7 +1145,7 @@ struct obj *obj;
 			    return;
 			} else obj->altmode = FALSE;
 		    }
-		    lightsaber_deactivate(obj, TRUE);
+		    	lightsaber_deactivate(obj, TRUE);
 		    return;
 #endif
 		} else if (artifact_light(obj)) {
@@ -1157,6 +1157,12 @@ struct obj *obj;
 		end_burn(obj, TRUE);
 		return;
 	}
+#ifdef JEDI
+	// for some reason, the lightsaber prototype is created with
+	// age == 0
+	if (obj->oartifact == ART_LIGHTSABER_PROTOTYPE)
+		obj->age = 300L;
+#endif
 	/* magic lamps with an spe == 0 (wished for) cannot be lit */
 	if ((!Is_candle(obj) && obj->age == 0)
 			|| (obj->otyp == MAGIC_LAMP && obj->spe == 0)) {
@@ -3539,10 +3545,16 @@ doapply()
 	case GREEN_LIGHTSABER:
 #ifdef D_SABER
   	case BLUE_LIGHTSABER:
+#if 0
+	case VIOLET_LIGHTSABER:
+	case WHITE_LIGHTSABER:
+	case YELLOW_LIGHTSABER:
+#endif
 #endif
 	case RED_LIGHTSABER:
 	case RED_DOUBLE_LIGHTSABER:
-		if (uwep != obj && !wield_tool(obj, (const char *)0)) break;
+		if (!(uswapwep == obj && u.twoweap))
+		  if (uwep != obj && !wield_tool(obj, (const char *)0)) break;
 		/* Fall through - activate via use_lamp */
 #endif
 	case OIL_LAMP:
diff -pruN slashem-0.0.7E7F1-orig/src/attrib.c slashem-0.0.7E7F1/src/attrib.c
--- slashem-0.0.7E7F1-orig/src/attrib.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/attrib.c	2005-07-20 14:55:06.744805184 +0200
@@ -52,6 +52,14 @@ const struct innate {
 		     {  13, &(HFire_resistance), "cool", "warmer" },
 		     {   0, 0, 0, 0 } },
 
+#ifdef JEDI
+	jed_abil[] = { {   1, &(HStealth), "", ""},
+		       {   3, &(HTelepat), "disturbances in the force", "your grip on the force lessen" },
+		       {   5, &(HSee_invisible), "your vision sharpen", "your vision blurring" },
+		       {   7, &(HFast), "quick", "slow" },
+		       { 0, 0, 0, 0 } },
+#endif
+			
 	kni_abil[] = { {	 7, &(HFast), "quick", "slow" },
 		     {	 0, 0, 0, 0 } },
 
@@ -631,6 +639,9 @@ int oldlevel, newlevel;
 	case PM_FLAME_MAGE:	abil = fla_abil;	break;
 	case PM_HEALER:         abil = hea_abil;	break;
 	case PM_ICE_MAGE:	abil = ice_abil;	break;
+#ifdef JEDI
+	case PM_JEDI:		abil = jed_abil;	break;
+#endif
 	case PM_KNIGHT:         abil = kni_abil;	break;
 	case PM_MONK:           abil = mon_abil;	break;
 	case PM_NECROMANCER:	abil = nec_abil;	break;
diff -pruN slashem-0.0.7E7F1-orig/src/bones.c slashem-0.0.7E7F1/src/bones.c
--- slashem-0.0.7E7F1-orig/src/bones.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/bones.c	2005-07-20 14:55:06.745805032 +0200
@@ -127,6 +127,12 @@ boolean restore;
 			    otmp->onamelth = 0;
 			    *ONAME(otmp) = '\0';
 			}
+#ifdef JEDI
+			else if (is_lightsaber(otmp)){
+				if (otmp->lamplit)
+					end_burn(otmp, FALSE);
+			}
+#endif
 		}
 	}
 }
diff -pruN slashem-0.0.7E7F1-orig/src/dig.c slashem-0.0.7E7F1/src/dig.c
--- slashem-0.0.7E7F1-orig/src/dig.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/dig.c	2005-07-20 14:55:06.748804576 +0200
@@ -136,13 +136,28 @@ struct obj *otmp;
 xchar x, y;
 {
 	boolean ispick = is_pick(otmp);
+#ifdef LIGHTSABERS
+	boolean issaber = is_lightsaber(otmp);
+#endif
 
-	return (ispick && sobj_at(STATUE, x, y) ? DIGTYP_STATUE :
-		ispick && sobj_at(BOULDER, x, y) ? DIGTYP_BOULDER :
+	return ((ispick
+#ifdef LIGHTSABERS
+		|| issaber
+#endif
+		) && sobj_at(STATUE, x, y) ? DIGTYP_STATUE :
+		(ispick
+#ifdef LIGHTSABERS
+		|| issaber
+#endif
+		) && sobj_at(BOULDER, x, y) ? DIGTYP_BOULDER :
 		closed_door(x, y) ? DIGTYP_DOOR :
 		IS_TREE(levl[x][y].typ) ?
 			(ispick ? DIGTYP_UNDIGGABLE : DIGTYP_TREE) :
-		ispick && IS_ROCK(levl[x][y].typ) &&
+		(ispick
+#ifdef LIGHTSABERS
+		 || issaber
+#endif
+		) && IS_ROCK(levl[x][y].typ) &&
 			(!level.flags.arboreal || IS_WALL(levl[x][y].typ)) ?
 			DIGTYP_ROCK : DIGTYP_UNDIGGABLE);
 }
@@ -463,7 +478,7 @@ cleanup:
 		if(!did_dig_msg) {
 #ifdef LIGHTSABERS
 		    if (is_lightsaber(uwep)) You("burn steadily through %s.",
-			d_target[dig_target]);
+			the(d_target[dig_target]));
 		    else
 #endif
 		    You("hit the %s with all your might.",
diff -pruN slashem-0.0.7E7F1-orig/src/do_wear.c slashem-0.0.7E7F1/src/do_wear.c
--- slashem-0.0.7E7F1-orig/src/do_wear.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/do_wear.c	2005-07-20 14:55:06.752803968 +0200
@@ -87,6 +87,9 @@ Boots_on()
 	u.uprops[objects[uarmf->otyp].oc_oprop].extrinsic & ~WORN_BOOTS;
 
     switch(uarmf->otyp) {
+#ifdef JEDI
+	case PLASTEEL_BOOTS:
+#endif
 	case LOW_BOOTS:
 	case IRON_SHOES:
 	case HIGH_BOOTS:
@@ -175,6 +178,9 @@ Boots_off()
 	case HIGH_BOOTS:
 	case JUMPING_BOOTS:
 	case KICKING_BOOTS:
+#ifdef JEDI
+	case PLASTEEL_BOOTS:
+#endif
 		break;
 	default: impossible(unknown_type, c_boots, otyp);
     }
@@ -309,6 +315,9 @@ Helmet_on()
 	case FEDORA:
 		set_moreluck();
 		break;
+#ifdef JEDI
+	case PLASTEEL_HELM:
+#endif
 	case HELMET:
 	case DENTED_POT:
 	case ELVEN_LEATHER_HELM:
@@ -373,6 +382,9 @@ Helmet_off()
 	    setworn((struct obj *)0, W_ARMH);
 	    set_moreluck();
 	    return 0;
+#ifdef JEDI
+	case PLASTEEL_HELM:
+#endif
 	case HELMET:
 	case DENTED_POT:
 	case ELVEN_LEATHER_HELM:
@@ -417,6 +429,9 @@ Gloves_on()
 	u.uprops[objects[uarmg->otyp].oc_oprop].extrinsic & ~WORN_GLOVES;
 
     switch(uarmg->otyp) {
+#ifdef JEDI
+	case PLASTEEL_GLOVES:
+#endif
 	case LEATHER_GLOVES:
 		break;
 	case GAUNTLETS_OF_SWIMMING:
@@ -450,6 +465,9 @@ Gloves_off()
     takeoff_mask &= ~W_ARMG;
 
     switch(uarmg->otyp) {
+#ifdef JEDI
+	case PLASTEEL_GLOVES:
+#endif
 	case LEATHER_GLOVES:
 	    break;
 	case GAUNTLETS_OF_SWIMMING:
@@ -1456,6 +1474,14 @@ boolean noisy;
 		pline_The("%s won't fit over your horn%s.",
 			  c_helmet, plur(num_horns(youmonst.data)));
 	    err++;
+#ifdef JEDI
+	} else if (Upolyd && (youmonst.data == &mons[PM_MIND_FLAYER] ||
+			      youmonst.data == &mons[PM_MASTER_MIND_FLAYER]) &&
+			otmp->otyp == PLASTEEL_HELM){
+		if (noisy)
+			pline_The("%s won't fit over your tentacles.", xname(otmp));
+		err++;
+#endif
 	} else
 	    *mask = W_ARMH;
     } else if (is_shield(otmp)) {
@@ -1745,6 +1771,12 @@ doputon()
 		}
 		if (otmp->oartifact && !touch_artifact(otmp, &youmonst))
 		    return 1;
+#ifdef JEDI
+		if (uarmh && uarmh->otyp == PLASTEEL_HELM){
+			pline("The %s covers your whole face. You need to remove it first.", xname(uarmh));
+			return 1;
+		}
+#endif
 		Blindf_on(otmp);
 		return(1);
 	}
diff -pruN slashem-0.0.7E7F1-orig/src/dothrow.c slashem-0.0.7E7F1/src/dothrow.c
--- slashem-0.0.7E7F1-orig/src/dothrow.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/dothrow.c	2005-07-20 14:55:06.755803512 +0200
@@ -1059,6 +1059,19 @@ int thrown;
             else setuqwep(obj);*/
 		return;
 	    }
+#ifdef JEDI
+	    if (u.dz < 0 && Role_if(PM_JEDI) &&
+		    is_lightsaber(obj) && obj->lamplit && !impaired &&
+		    P_SKILL(weapon_type(obj)) >= P_SKILLED) {
+		pline("%s the %s and returns to your hand!",
+		      Tobjnam(obj, "hit"), ceiling(u.ux,u.uy));
+		obj = addinv(obj);
+		(void) encumber_msg();
+		setuwep(obj, TRUE);
+		u.twoweap = twoweap;
+		return;
+	    }
+#endif
 #ifdef FIREARMS
 	    /* [ALI]
 	     * Grenades are armed but are then processed by toss_up/hitfloor
@@ -1219,9 +1232,23 @@ int thrown;
 		if (obj != uball) (void) mpickobj(u.ustuck,obj);
 	} else {
 		/* the code following might become part of dropy() */
+#ifndef JEDI
 		if (obj->oartifact == ART_MJOLLNIR &&
 			Role_if(PM_VALKYRIE) && rn2(100)) {
 		    /* we must be wearing Gauntlets of Power to get here */
+#else
+		if ((obj->oartifact == ART_MJOLLNIR &&
+			Role_if(PM_VALKYRIE) && rn2(100)) ||
+		    (is_lightsaber(obj) && obj->lamplit && Role_if(PM_JEDI) &&
+		     P_SKILL(weapon_type(obj)) >= P_SKILLED)){
+		    /* we must be wearing Gauntlets of Power to get here */
+		    /* or a Jedi with a lightsaber */
+		    if (Role_if(PM_JEDI) && u.uen < 5){
+			You("don't have enough force to call %s.", the(xname(obj)));
+		    } else {
+		      if (Role_if(PM_JEDI))
+			u.uen -= 5;
+#endif
 		    sho_obj_return_to_u(obj);	    /* display its flight */
 
 		    if (!impaired && rn2(100)) {
@@ -1259,6 +1286,9 @@ int thrown;
 		    }
 		    thrownobj = (struct obj*)0;
 		    return;
+#ifdef JEDI
+		    }
+#endif
 		}
 
 		if (!IS_SOFT(levl[bhitpos.x][bhitpos.y].typ) &&
diff -pruN slashem-0.0.7E7F1-orig/src/eat.c slashem-0.0.7E7F1/src/eat.c
--- slashem-0.0.7E7F1-orig/src/eat.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/eat.c	2005-07-20 14:55:06.759802904 +0200
@@ -2335,6 +2335,12 @@ doeat()		/* generic "eat" command funtio
 		pline("If you can't breathe air, how can you consume solids?");
 		return 0;
 	}
+#ifdef JEDI
+	if (uarmh && uarmh->otyp == PLASTEEL_HELM){
+		pline("The %s covers your whole face.", xname(uarmh));
+		return 0;
+	}
+#endif
 	if (!(otmp = floorfood("eat"))) return 0;
 	if (check_capacity((char *)0)) return 0;
 
diff -pruN slashem-0.0.7E7F1-orig/src/engrave.c slashem-0.0.7E7F1/src/engrave.c
--- slashem-0.0.7E7F1-orig/src/engrave.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/engrave.c	2005-07-20 14:55:06.762802448 +0200
@@ -55,6 +55,9 @@ static const char *random_mesg[] = {
 	"Silly rabbit, Trix are for kids!", /* Trix */
  	"I'll be back!", /* Terminator */
  	"That is not dead which can eternal lie.", /* HPL */
+#ifdef JEDI
+	"May the force be with you!",
+#endif
 };
 
 char *
@@ -845,12 +848,6 @@ doengrave()
 		break;
 
 	    case WEAPON_CLASS:
-#ifdef LIGHTSABERS
-		if (is_lightsaber(otmp)) {
-			if (otmp->lamplit) type = BURN;
-			else Your("%s is deactivated!", aobjnam(otmp,"are"));
-		} else
-#endif
 		if(is_blade(otmp)) {
 		    if ((int)otmp->spe > -3)
 			type = ENGRAVE;
@@ -860,6 +857,12 @@ doengrave()
 		break;
 
 	    case TOOL_CLASS:
+#ifdef LIGHTSABERS
+		if (is_lightsaber(otmp)) {
+			if (otmp->lamplit) type = BURN;
+			else Your("%s is deactivated!", aobjnam(otmp,"are"));
+		} else
+#endif
 		if(otmp == ublindf) {
 		    pline(
 		"That is a bit difficult to engrave with, don't you think?");
diff -pruN slashem-0.0.7E7F1-orig/src/invent.c slashem-0.0.7E7F1/src/invent.c
--- slashem-0.0.7E7F1-orig/src/invent.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/invent.c	2005-07-20 14:55:06.767801688 +0200
@@ -862,7 +862,11 @@ struct obj *otmp;
 		     otyp != AMULET_OF_YENDOR && otyp != FAKE_AMULET_OF_YENDOR))
 		|| (!strcmp(word, "write with") &&
 		    (otmp->oclass == TOOL_CLASS &&
-		     otyp != MAGIC_MARKER && otyp != TOWEL))
+#ifdef LIGHTSABERS
+		     (!is_lightsaber(otmp) || !otmp->lamplit) &&
+#endif
+		     otyp != MAGIC_MARKER && otyp != TOWEL
+		     ))
 		|| (!strcmp(word, "tin") &&
 		    (otyp != CORPSE || !tinnable(otmp)))
 		|| (!strcmp(word, "rub") &&
diff -pruN slashem-0.0.7E7F1-orig/src/lock.c slashem-0.0.7E7F1/src/lock.c
--- slashem-0.0.7E7F1-orig/src/lock.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/lock.c	2005-07-20 14:55:06.770801232 +0200
@@ -666,6 +666,12 @@ doforce()		/* try to force a chest with 
 			&& mtmp->m_ap_type != M_AP_OBJECT) {
 
 		if (mtmp->isshk || mtmp->data == &mons[PM_ORACLE])		
+#ifdef JEDI
+		  if (Role_if(PM_JEDI))
+		    verbalize("Your puny Jedi tricks won't work on me!"); /* Return of the Jedi */
+		  else
+#endif
+
 		    verbalize("What do you think you are, a Jedi?"); /* Phantom Menace */
 		else
 		    pline("I don't think %s would appreciate that.", mon_nam(mtmp));
diff -pruN slashem-0.0.7E7F1-orig/src/makemon.c slashem-0.0.7E7F1/src/makemon.c
--- slashem-0.0.7E7F1-orig/src/makemon.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/makemon.c	2005-07-20 14:55:06.773800776 +0200
@@ -245,6 +245,9 @@ register struct monst *mtmp;
 #ifdef YEOMAN
 				|| mm == PM_CHIEF_YEOMAN_WARDER || mm == PM_YEOMAN_WARDER
 #endif
+#ifdef JEDI
+				|| mm == PM_JEDI || mm == PM_PADAWAN || mm == PM_STORMTROOPER
+#endif
 		) {
 		    int w1 = 0, w2 = 0;
 		    switch (mm) {
@@ -347,6 +350,37 @@ register struct monst *mtmp;
 #endif
 			  w1 = rn2(2) ? BROADSWORD : LONG_SWORD;
 			  break;
+#ifdef JEDI
+			case PM_PADAWAN:
+			case PM_JEDI:
+			  switch(rnd(3)){
+			    case 1: mongets(mtmp, RED_LIGHTSABER); break;
+			    case 2: mongets(mtmp, BLUE_LIGHTSABER); break;
+			    case 3: mongets(mtmp, GREEN_LIGHTSABER); break;
+			    default: break;
+			  }
+			  break;
+			case PM_THE_JEDI_MASTER:
+			  mongets(mtmp, BLUE_LIGHTSABER);
+			  mongets(mtmp, SPEED_BOOTS);
+			  mongets(mtmp, AMULET_OF_REFLECTION);
+			  break;
+			case PM_STORMTROOPER:
+#ifdef FIREARMS
+			  if (rn2(2)) {
+			  	w1 = HEAVY_MACHINE_GUN;
+			  	m_initthrow(mtmp, BULLET, 50);
+			  } else {
+			  	w1 = SUBMACHINE_GUN;
+			  	m_initthrow(mtmp, BULLET, 30);
+			  }
+			  mongets(mtmp, PLASTEEL_ARMOR);
+			  mongets(mtmp, PLASTEEL_GLOVES);
+			  mongets(mtmp, PLASTEEL_BOOTS);
+			  mongets(mtmp, PLASTEEL_HELM);
+			  break;
+#endif // FIREARMS
+#endif // JEDI
 			case PM_SHOPKEEPER:
 #ifdef FIREARMS
 			  (void) mongets(mtmp,SHOTGUN);
diff -pruN slashem-0.0.7E7F1-orig/src/mkobj.c slashem-0.0.7E7F1/src/mkobj.c
--- slashem-0.0.7E7F1-orig/src/mkobj.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/mkobj.c	2005-07-20 14:55:06.776800320 +0200
@@ -552,6 +552,11 @@ boolean artif;
 		case GREEN_LIGHTSABER:
 #ifdef D_SABER
 		case BLUE_LIGHTSABER:
+#if 0
+		case VIOLET_LIGHTSABER:
+		case WHITE_LIGHTSABER:
+		case YELLOW_LIGHTSABER:
+#endif
 #endif
 		case RED_LIGHTSABER:
 					otmp->lamplit = 0;
diff -pruN slashem-0.0.7E7F1-orig/src/mon.c slashem-0.0.7E7F1/src/mon.c
--- slashem-0.0.7E7F1-orig/src/mon.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/mon.c	2005-07-20 14:55:06.781799560 +0200
@@ -1386,6 +1386,33 @@ struct monst *magr,	/* monster that is c
 	if(magr->data == &mons[PM_WOODCHUCK] && mdef->data == &mons[PM_ORACLE])
 		return ALLOW_M|ALLOW_TM;
 
+#ifdef JEDI
+	/* Stormtroopers vs. Padawans */
+	if(magr->data == &mons[PM_STORMTROOPER] && mdef->data == &mons[PM_PADAWAN])
+		return ALLOW_M|ALLOW_TM;
+	/* and vice versa */
+	if(mdef->data == &mons[PM_STORMTROOPER] && magr->data == &mons[PM_PADAWAN])
+		return ALLOW_M|ALLOW_TM;
+	/* Stormtroopers vs. Jedi */
+	if(magr->data == &mons[PM_STORMTROOPER] && mdef->data == &mons[PM_JEDI])
+		return ALLOW_M|ALLOW_TM;
+	/* and vice versa */
+	if(mdef->data == &mons[PM_STORMTROOPER] && magr->data == &mons[PM_JEDI])
+		return ALLOW_M|ALLOW_TM;
+	/* Stormtroopers vs. The Jedi Master */
+	if(magr->data == &mons[PM_STORMTROOPER] && mdef->data == &mons[PM_THE_JEDI_MASTER])
+		return ALLOW_M|ALLOW_TM;
+	/* and vice versa */
+	if(mdef->data == &mons[PM_STORMTROOPER] && magr->data == &mons[PM_THE_JEDI_MASTER])
+		return ALLOW_M|ALLOW_TM;
+	/* Jedi vs. Lord Sidious */
+	if(magr->data == &mons[PM_LORD_SIDIOUS] && mdef->data == &mons[PM_JEDI])
+		return ALLOW_M|ALLOW_TM;
+	/* and vice versa */
+	if(mdef->data == &mons[PM_LORD_SIDIOUS] && magr->data == &mons[PM_JEDI])
+		return ALLOW_M|ALLOW_TM;
+#endif
+
 	return 0L;
 }
 
diff -pruN slashem-0.0.7E7F1-orig/src/monst.c slashem-0.0.7E7F1/src/monst.c
--- slashem-0.0.7E7F1-orig/src/monst.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/monst.c	2005-07-20 14:55:06.792797888 +0200
@@ -3935,6 +3935,16 @@ struct permonst _mons2[] = {
 	M1_HUMANOID|M1_OMNIVORE,
 	M2_NOPOLY|M2_HUMAN|M2_MERC|M2_STALK|M2_PEACEFUL|M2_STRONG|M2_COLLECT,
 	M3_INFRAVISIBLE, CLR_GREEN),
+#ifdef JEDI
+    MON("stormtrooper", S_HUMAN,
+	LVL(8, 10, 5, 25, -5), (G_NOGEN|G_LGROUP),
+	A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
+	  NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+	SIZ(WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN), 0, 0,
+	M1_HUMANOID|M1_OMNIVORE,
+	M2_NOPOLY|M2_HUMAN|M2_HOSTILE|M2_STRONG|M2_COLLECT,
+	M3_INFRAVISIBLE, CLR_WHITE),
+#endif
 	/* Unique humans not tied to quests.
 	 */
     MON("Medusa", S_HUMAN,
@@ -4764,6 +4774,24 @@ struct permonst _mons2[] = {
 	M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE,
 	HI_DOMESTIC),
 #endif
+#ifdef JEDI
+    MON("padawan", S_HUMAN,
+	LVL(10, 10, 10, 1, 3), G_NOGEN,
+	A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 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),
+    MON("jedi", S_HUMAN,
+	LVL(10, 10, 10, 1, 3), G_NOGEN,
+	A(ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_WEAP, AD_PHYS, 4, 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
 	/* Wizard should be last.  Sigh. */
     MON("wizard", S_HUMAN,
 	LVL(10, 12, 10, 3, 0), G_NOGEN,
@@ -5013,6 +5041,16 @@ struct permonst _mons2[] = {
 	M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_MALE|M2_COLLECT|M2_MAGIC,
 	M3_CLOSE, HI_LORD),
 #endif
+#ifdef JEDI
+    MON("The Jedi Master", S_HUMAN,
+	LVL(20, 18, -5, 50, 10), (G_NOGEN|G_UNIQ|G_NOCORPSE),
+	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_LEADER, MZ_HUMAN), 0, 0,
+	M1_HUMANOID|M1_OMNIVORE,
+	M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_MALE|M2_COLLECT|M2_MAGIC,
+	M3_CLOSE, HI_LORD),
+#endif
 
 /*
  * quest nemeses
@@ -5264,6 +5302,18 @@ struct permonst _mons2[] = {
 	  M2_NASTY|M2_COLLECT|M2_MAGIC,
 	M3_WANTSARTI|M3_WAITFORU, HI_LORD),
 #endif
+#ifdef JEDI
+    MON("Lord Sidious", S_HUMAN,
+	LVL(20, 10, 5, 10, -10), (G_NOGEN|G_UNIQ),
+	A(ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_TUCH, AD_ELEC, 4, 6),
+	  ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
+	  NO_ATTK, NO_ATTK),
+	SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN), MR_POISON|MR_ELEC|MR_STONE, 0,
+	M1_HUMANOID|M1_OMNIVORE,
+	M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_STRONG|M2_MALE|M2_HOSTILE|
+	  M2_NASTY|M2_COLLECT|M2_MAGIC,
+	M3_WANTSARTI|M3_WAITFORU, HI_LORD),
+#endif
 
 /*
  * quest "guardians"
diff -pruN slashem-0.0.7E7F1-orig/src/mplayer.c slashem-0.0.7E7F1/src/mplayer.c
--- slashem-0.0.7E7F1-orig/src/mplayer.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/mplayer.c	2005-07-20 14:55:06.795797432 +0200
@@ -230,6 +230,20 @@ register boolean special;
 		    if (rn2(4)) helm = HELM_OF_BRILLIANCE;
 		    shield = STRANGE_OBJECT;
 		    break;
+#ifdef JEDI
+		case PM_JEDI:
+		case PM_PADAWAN:
+		    switch(rnd(3)){
+		      case 1: weapon = RED_LIGHTSABER; break;
+		      case 2: weapon = BLUE_LIGHTSABER; break;
+		      case 3: weapon = GREEN_LIGHTSABER; break;
+		    }
+		    cloak = STRANGE_OBJECT;
+		    armor = rn2(2) ? ROBE : ROBE_OF_POWER;
+		    helm = STRANGE_OBJECT;
+		    shield = STRANGE_OBJECT;
+		    break;
+#endif
 		default: impossible("bad mplayer monster");
 		    weapon = 0;
 		    break;
diff -pruN slashem-0.0.7E7F1-orig/src/mthrowu.c slashem-0.0.7E7F1/src/mthrowu.c
--- slashem-0.0.7E7F1-orig/src/mthrowu.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/mthrowu.c	2005-07-20 14:55:06.797797128 +0200
@@ -65,6 +65,14 @@ const char *name;	/* if null, then forma
 		if(Blind || !flags.verbose) pline("It misses.");
 		else You("are almost hit by %s.", onm);
 		return(0);
+#ifdef JEDI
+	} else if (Role_if(PM_JEDI) && uwep && is_lightsaber(uwep) &&
+		uwep->lamplit && P_SKILL(weapon_type(uwep)) >= P_SKILLED &&
+		rn2(5)){ // dodge four of five missiles, even when blind
+			 // see "A new hope" for blindness reference
+		You("dodge %s with %s.", onm, yname(uwep));
+		return(0);
+#endif
 	} else {
 		if(Blind || !flags.verbose) You("are hit!");
 		else You("are hit by %s%s", onm, exclam(dam));
diff -pruN slashem-0.0.7E7F1-orig/src/objects.c slashem-0.0.7E7F1/src/objects.c
--- slashem-0.0.7E7F1-orig/src/objects.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/objects.c	2005-07-20 14:55:06.800796672 +0200
@@ -433,6 +433,10 @@ ARMOR("T-shirt", (char *)0,
 /* Suits of armor */
 ARMOR("plate mail", (char *)0,
 	1, 0, 1, 0,	40, 5, 450, 600,  3, 2, ARM_SUIT, IRON, HI_METAL),
+#ifdef JEDI
+ARMOR("plasteel armor", (char *)0,
+	1, 0, 1, 0,      0, 5, 150,  80,  4, 0, ARM_SUIT, PLASTIC, CLR_WHITE),
+#endif
 ARMOR("crystal plate mail", (char *)0,
 	1, 0, 1, 0,	10, 5, 450, 820,  3, 2, ARM_SUIT, GLASS, CLR_WHITE),
 #ifdef TOURIST
@@ -569,6 +573,10 @@ HELM("dunce cap", "conical hat",
 		0, 1, 0,			3, 1,  4,   1,10, 0, CLOTH, CLR_BLUE),
 HELM("dented pot", (char *)0,
 		1, 0, 0,			2, 0, 10,   8, 9, 0, IRON, CLR_BLACK),
+#ifdef JEDI
+HELM("plasteel helm", (char *)0,
+		1, 0, 0,                        0, 1,  6,  20, 7, 9, PLASTIC, CLR_WHITE),
+#endif
 /* ...with shuffled appearances */
 HELM("helmet", "plumed helmet",
 		0, 0, 0,		   10, 1, 30,  10, 9, 0, IRON, HI_METAL),
@@ -583,6 +591,10 @@ HELM("helm of telepathy", "visored helme
 /* these have their color but not material shuffled, so the IRON must stay
  * CLR_BROWN (== HI_LEATHER)
  */
+#ifdef JEDI
+GLOVES("plasteel gloves", "white gloves",
+		0, 0,  0,                        0, 1,  9, 25,  8, 0, PLASTIC, CLR_WHITE),
+#endif
 GLOVES("leather gloves", "old gloves",
 		0, 0,  0,			16, 1, 10,  8,  9, 0, LEATHER, HI_LEATHER),
 GLOVES("gauntlets of fumbling", "padded gloves",
@@ -612,6 +624,10 @@ SHIELD("shield of reflection", "polished
 		0, 1, 0, REFLECTING, 3, 0, 50, 50,  8, 0, SILVER, HI_SILVER),
 
 /* Boots */
+#ifdef JEDI
+BOOTS("plasteel boots", (char *)0,
+		0, 0,  0,          0, 2, 8,  25,  8, 9, PLASTIC, CLR_WHITE),
+#endif
 BOOTS("low boots", "walking shoes",
 		0, 0,  0,	  25, 2, 10,  8,  9, 0, LEATHER, HI_LEATHER),
 BOOTS("iron shoes", "hard shoes",
@@ -841,6 +857,16 @@ WEPTOOL("red lightsaber",  "lightsaber",
 	0, 0, 1, 0,  1, 60, 500, 9,  11, -3, SLASH, P_LIGHTSABER, PLATINUM, HI_METAL),
 WEPTOOL("red double lightsaber",  "double lightsaber",
 	0, 0, 1, 1,  0, 60,1000, 9,  11, -4, SLASH, P_LIGHTSABER, PLATINUM, HI_METAL),
+# ifdef D_SABER
+#if 0 // just an idea...
+WEPTOOL("yellow lightsaber",  "lightsaber",
+	0, 0, 1, 0,  0, 60, 500, 5,  7, -3, SLASH, P_LIGHTSABER, PLATINUM, HI_METAL),
+WEPTOOL("violet lightsaber",  "lightsaber",
+	0, 0, 1, 0,  0, 60, 500, 5,  7, -3, SLASH, P_LIGHTSABER, PLATINUM, HI_METAL),
+WEPTOOL("white lightsaber",  "lightsaber",
+	0, 0, 1, 0,  0, 60, 500, 5,  7, -3, SLASH, P_LIGHTSABER, PLATINUM, HI_METAL),
+# endif /* D_SABER */
+#endif
 #endif	/* LIGHTSABERS */
 
 /* Other tools */
diff -pruN slashem-0.0.7E7F1-orig/src/objnam.c slashem-0.0.7E7F1/src/objnam.c
--- slashem-0.0.7E7F1-orig/src/objnam.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/objnam.c	2005-07-20 14:55:06.804796064 +0200
@@ -2394,6 +2394,9 @@ boolean from_user;
        strncmpi(bp, "one ring", 8) &&
 	   strncmpi(bp, "food ration", 11) &&
 	   strncmpi(bp, "meat ring", 9)
+#ifdef JEDI
+	   && strncmpi(bp, "plasteel armor", 14)
+#endif
 	)
 	for (i = 0; i < (int)(sizeof wrpsym); i++) {
 		register int j = strlen(wrp[i]);
diff -pruN slashem-0.0.7E7F1-orig/src/polyself.c slashem-0.0.7E7F1/src/polyself.c
--- slashem-0.0.7E7F1-orig/src/polyself.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/polyself.c	2005-07-20 14:55:06.808795456 +0200
@@ -785,6 +785,18 @@ break_armor()
 	    }
 	}
     }
+#ifdef JEDI
+    if ((otmp = uarmh) != 0 && (youmonst.data == &mons[PM_MIND_FLAYER] ||
+	youmonst.data == &mons[PM_MASTER_MIND_FLAYER])){
+	    if (!otmp->cursed){
+	      pline_The("%s is pushed from your head by your tentacles.", xname(otmp));
+	      (void) Helmet_off();
+	    } else {
+	      Your("tentacles break through %s.", the(xname(otmp)));
+	      useup(uarmh);
+	    }
+    }
+#endif
     if (nohands(youmonst.data) || verysmall(youmonst.data)) {
 	if ((otmp = uarmg) != 0) {
 	    if (donning(otmp)) cancel_don();
diff -pruN slashem-0.0.7E7F1-orig/src/potion.c slashem-0.0.7E7F1/src/potion.c
--- slashem-0.0.7E7F1-orig/src/potion.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/potion.c	2005-07-20 14:55:06.812794848 +0200
@@ -346,6 +346,12 @@ dodrink()
 		pline("If you can't breathe air, how can you drink liquid?");
 		return 0;
 	}
+#ifdef JEDI
+	if (uarmh && uarmh->otyp == PLASTEEL_HELM){
+		pline("The %s covers your whole face.", xname(uarmh));
+		return 0;
+	}
+#endif
 
 	*qp++ = ALLOW_FLOOROBJ;
 	if (!u.uswallow && (IS_FOUNTAIN(levl[u.ux][u.uy].typ) ||
diff -pruN slashem-0.0.7E7F1-orig/src/read.c slashem-0.0.7E7F1/src/read.c
--- slashem-0.0.7E7F1-orig/src/read.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/read.c	2005-07-20 14:55:06.815794392 +0200
@@ -546,6 +546,11 @@ int curse_bless;
 	    case GREEN_LIGHTSABER:
 #ifdef D_SABER
 	    case BLUE_LIGHTSABER:
+#if 0
+	    case VIOLET_LIGHTSABER:
+	    case WHITE_LIGHTSABER:
+	    case YELLOW_LIGHTSABER:
+#endif
 #endif
 	    case RED_LIGHTSABER:
 	    case RED_DOUBLE_LIGHTSABER:
diff -pruN slashem-0.0.7E7F1-orig/src/role.c slashem-0.0.7E7F1/src/role.c
--- slashem-0.0.7E7F1-orig/src/role.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/role.c	2005-07-20 14:55:06.819793784 +0200
@@ -201,6 +201,38 @@ const struct Role roles[] = {
 	0, 1, 0, 
 	2, 10, A_INT, SPE_CONE_OF_COLD,    -4 /* From old role.c */
 },
+#ifdef JEDI
+{	{"Jedi", 0}, {
+	{"Youngling",     0},
+	//{"Padawan",       0},
+	{"Padawan",       0},
+	//{"Jedi Apprentice", 0},
+	{"Jedi Apprentice", 0},
+	//{"Jedi Knight",    0},
+	{"Jedi Knight",    0},
+	{"Jedi Hero",      0},
+	{"Jedi Master",    0} },
+	"the Light Side", "the Force", "the Dark Side",
+	"Jed", "the Jedi Temple", "the Outer Rim",
+	PM_JEDI, NON_PM, PM_LITTLE_DOG,
+	PM_THE_JEDI_MASTER, PM_PADAWAN, PM_LORD_SIDIOUS,
+	PM_STORMTROOPER, PM_STORMTROOPER, S_HUMAN, S_HUMAN,
+#if 0
+	???
+#endif
+	ART_LIGHTSABER_PROTOTYPE,
+	MH_HUMAN|MH_ELF|MH_HOBBIT| 
+	ROLE_MALE|ROLE_FEMALE|ROLE_LAWFUL,
+	/* Str Int Wis Dex Con Cha */
+	{  10,  7, 14, 12, 10, 14 },
+	{  30, 15, 15, 10, 20, 10 },
+	/* Init   Lower  Higher */
+	{ 15, 4,  0, 8,  2, 4 },	/* Hit points */
+	{  1, 4,  0, 1,  0, 4 },10,	/* Energy */
+	0, 12 , -1, 
+	2, 10, A_INT, SPE_CHARM_MONSTER,    -4
+},
+#endif
 {	{"Knight", 0}, {
 	{"Gallant",     0},
 	{"Esquire",     0},
diff -pruN slashem-0.0.7E7F1-orig/src/tech.c slashem-0.0.7E7F1/src/tech.c
--- slashem-0.0.7E7F1-orig/src/tech.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/tech.c	2005-07-20 14:55:06.823793176 +0200
@@ -17,6 +17,9 @@ static int FDECL(techeffects, (int));
 static void FDECL(hurtmon, (struct monst *,int));
 static int FDECL(mon_to_zombie, (int));
 STATIC_PTR int NDECL(tinker);
+#ifdef JEDI
+STATIC_PTR int NDECL(charge_saber);
+#endif
 STATIC_PTR int NDECL(draw_energy);
 static const struct innate_tech * NDECL(role_tech);
 static const struct innate_tech * NDECL(race_tech);
@@ -80,6 +83,11 @@ STATIC_OVL NEARDATA const char *tech_nam
 	"power surge",
 	"spirit bomb",
 	"draw blood",
+#ifdef JEDI
+	"jedi jump",
+	"charge saber",
+	"telekinesis",
+#endif
 	""
 };
 
@@ -106,6 +114,12 @@ static const struct innate_tech 
 		       {  12, T_POWER_SURGE, 1},
 		       {  20, T_SIGIL_DISCHARGE, 1},
 		       {   0, 0, 0} },
+#ifdef JEDI
+	jed_tech[] = { {   1, T_JEDI_JUMP, 1},
+		       {   5, T_CHARGE_SABER, 1},
+		       {   8, T_TELEKINESIS, 1},
+		       {   0, 0, 0,} },
+#endif
 	kni_tech[] = { {   1, T_TURN_UNDEAD, 1},
 		       {   1, T_HEAL_HANDS, 1},
 		       {   0, 0, 0} },
@@ -1480,6 +1494,116 @@ int tech_no;
 			(const char *)0);
 		t_timeout = rn1(1000, 500);
 		break;
+#ifdef JEDI
+	    case T_JEDI_JUMP:
+		if (u.uen < 25){
+			You("can't channel the force around you.");
+			break;
+		}
+		u.uen -= 25;
+		jump((techlev(tech_no)/5)+1);
+		t_timeout = 50;
+		break;
+	    case T_TELEKINESIS:
+	      {
+		coord cc;
+		struct trap *ttrap;
+		cc.x=u.ux;
+		cc.y=u.uy;
+		pline("Where do you want to apply telekinesis?");
+		if (getpos(&cc, TRUE, "apply telekinesis where") < 0)
+			break;
+		if (!cansee(cc.x, cc.y)){
+			You("can't see what's there!");
+			break;
+		}
+		if ((ttrap=t_at(cc.x, cc.y)) && ttrap->tseen &&
+			yn("Handle the trap here?") == 'y'){
+		  if (yn("Disarm the trap?") == 'y'){
+		    techt_inuse(tech_no) = 1;
+		    /* copied from trap.c */
+		switch(ttrap->ttyp) {
+			case BEAR_TRAP:
+			case WEB:
+				t_timeout = 250;
+				return disarm_holdingtrap(ttrap);
+			case LANDMINE:
+				t_timeout = 250;
+				return disarm_landmine(ttrap);
+			case SQKY_BOARD:
+				t_timeout = 250;
+				return disarm_squeaky_board(ttrap);
+			case DART_TRAP:
+				t_timeout = 250;
+				return disarm_shooting_trap(ttrap, DART);
+			case ARROW_TRAP:
+				t_timeout = 250;
+				return disarm_shooting_trap(ttrap, ARROW);
+			case RUST_TRAP:
+				t_timeout = 250;
+				return disarm_rust_trap(ttrap);
+			case FIRE_TRAP:
+				t_timeout = 250;
+				return disarm_fire_trap(ttrap);
+			default:
+				You("cannot disable %s trap.", (u.dx || u.dy) ? "that" : "this");
+				return 1;
+		    }
+		  } else if(yn("Spring this trap?")=='y') {
+		    switch(ttrap->ttyp) {
+		      case LANDMINE: 
+			You("trigger the landmine.");
+			pline("KABLAAAM!");
+			blow_up_landmine(ttrap);
+			fill_pit(cc.x, cc.y);
+			newsym(cc.x, cc.y);
+		        t_timeout = 250;
+			break;
+		      case ROLLING_BOULDER_TRAP:
+		      {
+			int style = ROLL | (ttrap->tseen ? LAUNCH_KNOWN : 0);
+			You("trigger the trap!");
+			if(!launch_obj(BOULDER, ttrap->launch.x, ttrap->launch.y, ttrap->launch2.x, ttrap->launch2.y, style)){
+			  deltrap(ttrap);
+			  newsym(cc.x, cc.y);
+			  pline("But no boulder was released.");
+		        }
+		        t_timeout = 250;
+		      }
+		      default:
+		        You("can't spring this trap.");
+		        break;
+		    }
+		  }
+		} else if ((otmp = level.objects[cc.x][cc.y]) != 0) {
+		  char buf[BUFSZ];
+		  sprintf(buf, "Pick up %s?", the(xname(otmp)));
+		  if (yn(buf) == 'n')
+			  break;
+		  You("pick up an object from the %s.", surface(cc.x,cc.y));
+		  (void) pickup_object(otmp, 1L, TRUE);
+		  newsym(cc.x, cc.y);
+		  t_timeout = 250;
+		} else {
+		  You("can't do anything there");
+		}
+		break;
+	      }
+	    case T_CHARGE_SABER:
+	      if (!uwep || !is_lightsaber(uwep)){
+		      You("are not holding a lightsaber!");
+		      break;
+	      }
+	      if (u.uen < 5){
+		      You("lack the concentration to charge %s.", the(xname(uwep)));
+		      break;
+	      }
+	      You("start charging %s.", the(xname(uwep)));
+	      delay=-10;
+	      set_occupation(charge_saber, "charging", 0);
+	      t_timeout = 500;
+	      break;
+#endif
 	    default:
 	    	pline ("Error!  No such effect (%i)", tech_no);
 		break;
@@ -1628,6 +1752,9 @@ role_tech()
 		case PM_FLAME_MAGE:	return (fla_tech);
 		case PM_HEALER:		return (hea_tech);
 		case PM_ICE_MAGE:	return (ice_tech);
+#ifdef JEDI
+		case PM_JEDI:		return (jed_tech);
+#endif
 		case PM_KNIGHT:		return (kni_tech);
 		case PM_MONK: 		return (mon_tech);
 		case PM_NECROMANCER:	return (nec_tech);
@@ -1719,6 +1846,35 @@ int monnum;
 	else return PM_GHOUL;
 }
 
+#ifdef JEDI
+STATIC_PTR int
+charge_saber()
+{
+	int i, tlevel;
+	if(delay) {
+		delay++;
+		return(1);
+	}
+	for (i = 0; i < MAXTECH; i++) {
+	    if (techid(i) == NO_TECH)
+		continue;
+	    if (techid(i) != T_CHARGE_SABER)
+		continue;
+	    tlevel = techlev(i);
+	}
+	if (tlevel >= 10 && !rn2(5)){
+		You("manage to channel the force perfectly!");
+		uwep->age+=1500; // Jackpot!
+	} else
+		You("channel the force into %s.", the(xname(uwep)));
+
+	// yes no return above, it's a bonus :)
+	uwep->age+=u.uen*((techlev(T_CHARGE_SABER)/10)+1);
+	u.uen=0;
+	flags.botl=1;
+	return(0);
+}
+#endif
 
 /*WAC tinker code*/
 STATIC_PTR int
diff -pruN slashem-0.0.7E7F1-orig/src/timeout.c slashem-0.0.7E7F1/src/timeout.c
--- slashem-0.0.7E7F1-orig/src/timeout.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/timeout.c	2005-07-20 14:55:06.827792568 +0200
@@ -1415,6 +1415,11 @@ long timeout;
 	    case GREEN_LIGHTSABER: 
 #ifdef D_SABER
 	    case BLUE_LIGHTSABER:
+#if 0
+	    case VIOLET_LIGHTSABER:
+	    case WHITE_LIGHTSABER:
+	    case YELLOW_LIGHTSABER:
+#endif
 #endif
 	    case RED_LIGHTSABER:
 	        /* Callback is checked every 5 turns - 
@@ -1570,10 +1575,21 @@ begin_burn(obj, already_lit)
 	    case RED_LIGHTSABER:
 #ifdef D_SABER
 	    case BLUE_LIGHTSABER:
+#if 0
+	    case VIOLET_LIGHTSABER:
+	    case WHITE_LIGHTSABER:
+	    case YELLOW_LIGHTSABER:
+#endif
 #endif
 	    case GREEN_LIGHTSABER:
 	    	turns = 1;
     	    	radius = 1;
+#ifdef JEDI
+		if (obj->oartifact == ART_LIGHTSABER_PROTOTYPE){
+			do_timer = FALSE;
+			obj->lamplit = 1;
+		}
+#endif
 		break;
 #endif
 	    case POT_OIL:
@@ -1670,6 +1686,9 @@ end_burn(obj, timer_attached)
 	}
 
 	if (obj->otyp == MAGIC_LAMP || obj->otyp == MAGIC_CANDLE ||
+#ifdef JEDI
+		obj->oartifact == ART_LIGHTSABER_PROTOTYPE ||
+#endif
 		artifact_light(obj))
 	    timer_attached = FALSE;
 
diff -pruN slashem-0.0.7E7F1-orig/src/trap.c slashem-0.0.7E7F1/src/trap.c
--- slashem-0.0.7E7F1-orig/src/trap.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/trap.c	2005-07-20 14:55:06.832791808 +0200
@@ -14,12 +14,14 @@ STATIC_DCL void FDECL(cnv_trap_obj, (int
 STATIC_DCL void FDECL(move_into_trap, (struct trap *));
 STATIC_DCL int FDECL(try_disarm, (struct trap *,BOOLEAN_P));
 STATIC_DCL void FDECL(reward_untrap, (struct trap *, struct monst *));
+/*
 STATIC_DCL int FDECL(disarm_holdingtrap, (struct trap *));
 STATIC_DCL int FDECL(disarm_rust_trap, (struct trap *));
 STATIC_DCL int FDECL(disarm_fire_trap, (struct trap *));
 STATIC_DCL int FDECL(disarm_landmine, (struct trap *));
 STATIC_DCL int FDECL(disarm_squeaky_board, (struct trap *));
 STATIC_DCL int FDECL(disarm_shooting_trap, (struct trap *, int));
+*/
 STATIC_DCL int FDECL(try_lift, (struct monst *, struct trap *, int, BOOLEAN_P));
 STATIC_DCL int FDECL(help_monster_out, (struct monst *, struct trap *));
 STATIC_DCL boolean FDECL(thitm, (int,struct monst *,struct obj *,int,BOOLEAN_P));
@@ -3333,6 +3335,11 @@ boolean force_failure;
 	int ttype = ttmp->ttyp;
 	boolean under_u = (!u.dx && !u.dy);
 	boolean holdingtrap = (ttype == BEAR_TRAP || ttype == WEB);
+
+#ifdef JEDI
+	if (tech_inuse(T_TELEKINESIS) && !force_failure)
+		return 2;
+#endif
 	
 	/* Test for monster first, monsters are displayed instead of trap. */
 	if (mtmp && (!mtmp->mtrapped || !holdingtrap)) {
@@ -3433,7 +3440,7 @@ struct monst *mtmp;
 	}
 }
 
-STATIC_OVL int
+int
 disarm_holdingtrap(ttmp) /* Helge Hafting */
 struct trap *ttmp;
 {
@@ -3465,7 +3472,7 @@ struct trap *ttmp;
 	return 1;
 }
 
-STATIC_OVL int
+int
 disarm_landmine(ttmp) /* Helge Hafting */
 struct trap *ttmp;
 {
@@ -3477,7 +3484,7 @@ struct trap *ttmp;
 	return 1;
 }
 
-STATIC_OVL int
+int
 disarm_rust_trap(ttmp) /* Paul Sonier */
 struct trap *ttmp;
 {
@@ -3499,7 +3506,7 @@ static NEARDATA const char oil[] = { ALL
 static NEARDATA const char disarmpotion[] = { ALL_CLASSES, POTION_CLASS, 0 };
 
 /* water disarms, oil will explode */
-STATIC_OVL int
+int
 disarm_fire_trap(ttmp) /* Paul Sonier */
 struct trap *ttmp;
 {
@@ -3533,7 +3540,7 @@ struct trap *ttmp;
 }
 
 /* it may not make much sense to use grease on floor boards, but so what? */
-STATIC_OVL int
+int
 disarm_squeaky_board(ttmp)
 struct trap *ttmp;
 {
@@ -3566,7 +3573,7 @@ struct trap *ttmp;
 }
 
 /* removes traps that shoot arrows, darts, etc. */
-STATIC_OVL int
+int
 disarm_shooting_trap(ttmp, otyp)
 struct trap *ttmp;
 int otyp;
diff -pruN slashem-0.0.7E7F1-orig/src/u_init.c slashem-0.0.7E7F1/src/u_init.c
--- slashem-0.0.7E7F1-orig/src/u_init.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/u_init.c	2005-07-20 14:55:06.836791200 +0200
@@ -102,6 +102,27 @@ static struct trobj Ice_Mage[] = {
 	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
 	{ 0, 0, 0, 0, 0 }
 };
+#ifdef JEDI
+static struct trobj Jedi[] = {
+	{ ROBE, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
+	{ LEATHER_GLOVES, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
+	{ 0, 0, 0, 0, 0 }
+};
+static struct trobj GreenSaber[] = {
+	{ GREEN_LIGHTSABER, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
+	{ 0, 0, 0, 0, 0, }
+};
+#ifdef D_SABER
+static struct trobj BlueSaber[] = {
+	{ BLUE_LIGHTSABER, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
+	{ 0, 0, 0, 0, 0, }
+};
+#endif
+static struct trobj RedSaber[] = {
+	{ RED_LIGHTSABER, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
+	{ 0, 0, 0, 0, 0, }
+};
+#endif
 static struct trobj Knight[] = {
 	{ LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
 	{ LANCE, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
@@ -532,6 +553,19 @@ static const struct def_skill Skill_I[] 
     { P_NONE, 0 }
 };
 
+#ifdef JEDI
+static const struct def_skill Skill_J[] = {
+    { P_LIGHTSABER, P_EXPERT },
+    { P_SHORT_SWORD, P_BASIC }, { P_BROAD_SWORD, P_BASIC },
+    { P_LONG_SWORD, P_SKILLED }, { P_SABER, P_SKILLED },
+    { P_HEALING_SPELL, P_BASIC },
+#ifdef STEED
+    { P_RIDING, P_SKILLED },
+#endif
+    { P_TWO_WEAPON_COMBAT, P_BASIC }, { P_BARE_HANDED_COMBAT, P_EXPERT },
+    { P_NONE, 0 }
+};
+#endif
 static const struct def_skill Skill_K[] = {
     { P_DAGGER, P_BASIC },		{ P_KNIFE, P_BASIC },
     { P_AXE, P_SKILLED },		{ P_PICK_AXE, P_BASIC },
@@ -1095,6 +1129,29 @@ u_init()
 		else if(!rn2(5)) ini_inv(Magicmarker);
 		skill_init(Skill_I);
 		break;
+#ifdef JEDI
+	case PM_JEDI:
+		ini_inv(Jedi);
+#ifdef D_SABER
+		switch(rnd(3)) {
+			case 1: ini_inv(RedSaber); break;
+			case 2: ini_inv(BlueSaber); break;
+			case 3: ini_inv(GreenSaber); break;
+			default: break;
+		}
+#else
+		switch(rnd(2)) {
+			case 1: ini_inv(RedSaber); break;
+			case 2: ini_inv(GreenSaber); break;
+			default: break;
+		}
+#endif
+		if(!rn2(2)) ini_inv(Blindfold);
+		skill_init(Skill_J);
+		knows_class(WEAPON_CLASS);
+		knows_class(ARMOR_CLASS);
+		break;
+#endif
 	case PM_KNIGHT:
 		ini_inv(Knight);
 		knows_class(WEAPON_CLASS);
@@ -1563,6 +1620,14 @@ register struct trobj *trop;
 				otyp = obj->otyp;
 			}
 
+#ifdef JEDI
+			if (is_lightsaber(obj))
+				obj->age = 1500;
+			// start with maxed lightsaber
+			// only Jedi start with one, so no need to check
+			// Role_if here
+#endif
+
 			/* Don't start with +0 or negative rings */
 			if (objects[otyp].oc_charged && obj->spe <= 0)
 				obj->spe = rne(3);
diff -pruN slashem-0.0.7E7F1-orig/src/uhitm.c slashem-0.0.7E7F1/src/uhitm.c
--- slashem-0.0.7E7F1-orig/src/uhitm.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/uhitm.c	2005-07-20 14:55:06.841790440 +0200
@@ -282,7 +282,14 @@ register struct monst *mtmp;
 	    You("dishonorably attack the innocent!");
 	    adjalign(-1);
 	}
-
+#ifdef JEDI
+/* as well as for the way of the Jedi */
+	if (Role_if(PM_JEDI) && mtmp->mpeaceful &&
+	    u.ualign.record > -10) {
+	    You("violate the way of the Jedi!");
+	    adjalign(-1);
+	}
+#endif
 /*	Adjust vs. (and possibly modify) monster state.		*/
 
 	if(mtmp->mstun) tmp += 2;
@@ -326,6 +333,18 @@ register struct monst *mtmp;
 		   tmp += (u.ulevel / 9) + 1;
 		}
 	}
+#ifdef JEDI
+	if(Role_if(PM_JEDI) && !Upolyd) {
+		if (((uwep && is_lightsaber(uwep) && uwep->lamplit) ||
+		    (uswapwep && u.twoweap && is_lightsaber(uswapwep) && uswapwep->lamplit)) &&
+		   (uarm &&
+		   (uarm->otyp < ROBE || uarm->otyp > ROBE_OF_WEAKNESS))){
+		    char yourbuf[BUFSZ];
+		    You("can't use %s %s effectively in this armor...", shk_your(yourbuf, uwep), xname(uwep));
+		    tmp-=20; // sorry
+		}
+	}
+#endif
 	/* special class effect uses... */
 	if (tech_inuse(T_KIII)) tmp += 4;
 	if (tech_inuse(T_BERSERK)) tmp += 2;
@@ -894,7 +913,6 @@ int thrown;
 		ispoisoned = TRUE;
 
 	    noeffect = objenchant < canhitmon && !ispoisoned;
-
 	    Strcpy(saved_oname, cxname(obj));
 	    if(obj->oclass == WEAPON_CLASS || is_weptool(obj) ||
 	       obj->oclass == GEM_CLASS) {
@@ -994,6 +1012,30 @@ int thrown;
 			}
 			hittxt = TRUE;
 		    }
+#ifdef JEDI
+		    else if (obj == uwep &&
+			  (Role_if(PM_JEDI) && is_lightsaber(obj)) &&
+			  ((wtype = uwep_skill_type()) != P_NONE &&
+			    P_SKILL(wtype) >= P_SKILLED) &&
+			  ((monwep = MON_WEP(mon)) != 0 &&
+			   !is_lightsaber(monwep) && // no cutting other lightsabers :)
+			   !monwep->oartifact && // no cutting artifacts either
+			   !obj_resists(monwep,
+				 50 + 15 * greatest_erosion(obj), 100))) {
+			setmnotwielded(mon,monwep);
+			MON_NOWEP(mon);
+			mon->weapon_check = NEED_WEAPON;
+			Your("%s cuts %s %s in half!",
+			      xname(obj),
+			      s_suffix(mon_nam(mon)), xname(monwep));
+			m_useup(mon, monwep);
+			/* If someone just shattered MY weapon, I'd flee! */
+			if (rn2(4)) {
+			    monflee(mon, d(2,3), TRUE, TRUE);
+			}
+			hittxt = TRUE;
+		    }
+#endif
 
 		    if (obj->oartifact &&
 			artifact_hit(&youmonst, mon, obj, &tmp, dieroll)) {
diff -pruN slashem-0.0.7E7F1-orig/src/weapon.c slashem-0.0.7E7F1/src/weapon.c
--- slashem-0.0.7E7F1-orig/src/weapon.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/weapon.c	2005-07-20 14:55:06.845789832 +0200
@@ -279,6 +279,11 @@ struct monst *mon;
 		case GREEN_LIGHTSABER:  tmp +=13; break;
 #ifdef D_SABER
 		case BLUE_LIGHTSABER:   tmp +=12; break;
+#if 0
+		case VIOLET_LIGHTSABER:
+		case WHITE_LIGHTSABER:
+		case YELLOW_LIGHTSABER:
+#endif
 #endif
 		case RED_DOUBLE_LIGHTSABER: 
 					if (otmp->altmode) tmp += rnd(11);
@@ -315,6 +320,11 @@ struct monst *mon;
 		case GREEN_LIGHTSABER:  tmp +=9; break;
 #ifdef D_SABER
 		case BLUE_LIGHTSABER:   tmp +=8; break;
+#if 0
+		case VIOLET_LIGHTSABER:
+		case WHITE_LIGHTSABER:
+		case YELLOW_LIGHTSABER:
+#endif
 #endif
 		case RED_DOUBLE_LIGHTSABER:
 					if (otmp->altmode) tmp += rnd(9);
@@ -614,6 +624,9 @@ static const NEARDATA short hwep[] = {
 	  RED_DOUBLE_LIGHTSABER, RED_LIGHTSABER,
 #ifdef D_SABER
 	  BLUE_LIGHTSABER,
+#if 0
+	  YELLOW_LIGHTSABER, WHITE_LIGHTSABER, VIOLET_LIGHTSABER,
+#endif
 #endif
 	  GREEN_LIGHTSABER,
 #endif
@@ -857,6 +870,12 @@ struct monst * mon;
 	/* No obj or not lightsaber */
 	if (!obj || !is_lightsaber(obj)) return;
 
+#ifdef JEDI
+	// for some reason, the lightsaber prototype is created with
+	// age == 0
+	if (obj->oartifact == ART_LIGHTSABER_PROTOTYPE)
+		obj->age = 300L;
+#endif
 	/* WAC - Check lightsaber is on */
 	if (!obj->lamplit) {
 	    if (obj->cursed && !rn2(2)) {
@@ -1462,6 +1481,11 @@ struct obj *weapon;
 		if (type == P_LANCE) bonus++;
 	}
 #endif
+#ifdef JEDI
+	/* Jedi are trained in lightsabers, no to-hit penalty for them */
+	if (Role_if(PM_JEDI) && is_lightsaber(weapon))
+		bonus-=objects[weapon->otyp].oc_hitbon;
+#endif
 
     return bonus;
 }
@@ -1542,6 +1566,19 @@ struct obj *weapon;
 	}
 #endif
 
+#ifdef JEDI
+	/* Jedi are simply better */
+	if (Role_if(PM_JEDI) && weapon && is_lightsaber(weapon)){
+		switch (P_SKILL(type)){
+			case P_EXPERT: bonus +=3; /* fall through */
+			case P_SKILLED: bonus +=2; break;
+			case P_BASIC: break;
+			case P_UNSKILLED: break;
+			default: impossible("unknown lightsaber skill for a jedi"); break;
+		}
+	}
+#endif
+
     return bonus;
 }
 
diff -pruN slashem-0.0.7E7F1-orig/src/wield.c slashem-0.0.7E7F1/src/wield.c
--- slashem-0.0.7E7F1-orig/src/wield.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/src/wield.c	2005-07-20 14:55:06.848789376 +0200
@@ -903,6 +903,14 @@ boolean put_away;
 	You("extinguish %s before putting it away.", yname(obj));
 	end_burn(obj, TRUE);
     }
+#ifdef JEDI
+    else if (put_away && is_lightsaber(obj) && obj->lamplit &&
+	!artifact_light(obj)){
+	    char yourbuf[BUFSZ];
+	    You("deactivate %s %s before putting it away.", shk_your(yourbuf, obj), xname(obj));
+	    end_burn(obj, TRUE);
+    }
+#endif
 }
 
 /*wield.c*/
diff -pruN slashem-0.0.7E7F1-orig/sys/unix/Makefile.dat slashem-0.0.7E7F1/sys/unix/Makefile.dat
--- slashem-0.0.7E7F1-orig/sys/unix/Makefile.dat	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/sys/unix/Makefile.dat	2005-07-20 14:55:06.717809288 +0200
@@ -297,7 +297,7 @@ spec_levs: ../util/lev_comp \
 	touch spec_levs
 
 quest_levs: ../util/lev_comp \
-	Arch.des Barb.des Caveman.des Flame.des Healer.des Ice.des Knight.des \
+	Arch.des Barb.des Caveman.des Flame.des Healer.des Ice.des Jedi.des Knight.des \
 	Monk.des Necro.des Priest.des Ranger.des Rogue.des Samurai.des \
 	Tourist.des Slayer.des Valkyrie.des Wizard.des Yeoman.des
 	../util/lev_comp Arch.des
@@ -306,6 +306,9 @@ quest_levs: ../util/lev_comp \
 	../util/lev_comp Flame.des
 	../util/lev_comp Healer.des
 	../util/lev_comp Ice.des
+	@if egrep -s Jedi options > /dev/null ; then \
+	echo ../util/lev_comp Jedi.des ; ../util/lev_comp Jedi.des ; \
+	else rm -f Jed-goal.lev Jed-fil?.lev Jed-loca.lev Jed-strt.lev ; fi
 	../util/lev_comp Knight.des
 	../util/lev_comp Monk.des
 	../util/lev_comp Necro.des
diff -pruN slashem-0.0.7E7F1-orig/util/makedefs.c slashem-0.0.7E7F1/util/makedefs.c
--- slashem-0.0.7E7F1-orig/util/makedefs.c	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/util/makedefs.c	2005-07-20 14:55:06.851788920 +0200
@@ -859,6 +859,9 @@ static const char *build_opts[] = {
 # else
 		"lightsabers",
 # endif
+# ifdef JEDI
+		"Jedi",
+# endif
 #endif
 #ifdef P_SPOON
 		"Houchou",
diff -pruN slashem-0.0.7E7F1-orig/win/share/monsters.txt slashem-0.0.7E7F1/win/share/monsters.txt
--- slashem-0.0.7E7F1-orig/win/share/monsters.txt	2005-07-02 09:24:44.000000000 +0200
+++ slashem-0.0.7E7F1/win/share/monsters.txt	2005-07-20 14:55:06.865786792 +0200
@@ -8925,6 +8925,25 @@ P = (108, 145, 182)
   MMMMJJJMJJJMMMMM
   MMMMMMMMMMMMMMMM
 }
+# tile 469 (stormtrooper)
+{
+  MMMMMMMMMMMMMMMM
+  MMMMMMMMMMMMMMMM
+  MMMMMNNNNMMMMMMM
+  MMMMNNNNNNMMMMMM
+  MMMNNAAAANNMMMMM
+  MMMNNAMMMNNAMMMM
+  MMMMAAMMMNNAMMMM
+  MMMMMMMMNNAAMMMM
+  MMMMMMMNNAAMMMMM
+  MMMMMMNNAAMMMMMM
+  MMMMMMNNAMMMMMMM
+  MMMMMMMAAMMMMMMM
+  MMMMMMNNMMMMMMMM
+  MMMMMMNNAMMMMMMM
+  MMMMMMMAAMMMMMMM
+  MMMMMMMMMMMMMMMM
+}
 # tile 469 (Medusa)
 {
   MMMMMMMMMMMMMMMM
@@ -10692,6 +10711,44 @@ P = (108, 145, 182)
   MMMMMDDAMDDAMMMM
   MMMMMMMMMMMMMMMM
 }
+# tile 562 (padawan)
+{
+  MMMMMMMMMMMMMMMM
+  MMMMMMMMMMMMMMMM
+  MMMMMNNNNMMMMMMM
+  MMMMNNNNNNMMMMMM
+  MMMNNAAAANNMMMMM
+  MMMNNAMMMNNAMMMM
+  MMMMAAMMMNNAMMMM
+  MMMMMMMMNNAAMMMM
+  MMMMMMMNNAAMMMMM
+  MMMMMMNNAAMMMMMM
+  MMMMMMNNAMMMMMMM
+  MMMMMMMAAMMMMMMM
+  MMMMMMNNMMMMMMMM
+  MMMMMMNNAMMMMMMM
+  MMMMMMMAAMMMMMMM
+  MMMMMMMMMMMMMMMM
+}
+# tile 562 (jedi)
+{
+  MMMMMMMMMMMMMMMM
+  MMMMMMMMMMMMMMMM
+  MMMMMNNNNMMMMMMM
+  MMMMNNNNNNMMMMMM
+  MMMNNAAAANNMMMMM
+  MMMNNAMMMNNAMMMM
+  MMMMAAMMMNNAMMMM
+  MMMMMMMMNNAAMMMM
+  MMMMMMMNNAAMMMMM
+  MMMMMMNNAAMMMMMM
+  MMMMMMNNAMMMMMMM
+  MMMMMMMAAMMMMMMM
+  MMMMMMNNMMMMMMMM
+  MMMMMMNNAMMMMMMM
+  MMMMMMMAAMMMMMMM
+  MMMMMMMMMMMMMMMM
+}
 # tile 562 (wizard)
 {
   MMMMMMMMMMMMMMMM
@@ -11186,6 +11243,25 @@ P = (108, 145, 182)
   MMMMMHHAMHHAMMMM
   MMMMMMMMMMMMMMMM
 }
+# tile 562 (The Jedi Master)
+{
+  MMMMMMMMMMMMMMMM
+  MMMMMMMMMMMMMMMM
+  MMMMMNNNNMMMMMMM
+  MMMMNNNNNNMMMMMM
+  MMMNNAAAANNMMMMM
+  MMMNNAMMMNNAMMMM
+  MMMMAAMMMNNAMMMM
+  MMMMMMMMNNAAMMMM
+  MMMMMMMNNAAMMMMM
+  MMMMMMNNAAMMMMMM
+  MMMMMMNNAMMMMMMM
+  MMMMMMMAAMMMMMMM
+  MMMMMMNNMMMMMMMM
+  MMMMMMNNAMMMMMMM
+  MMMMMMMAAMMMMMMM
+  MMMMMMMMMMMMMMMM
+}
 # tile 588 (Minion of Huhetotl)
 {
   MMMOPMMMMMMPOMMM
@@ -11623,6 +11699,25 @@ P = (108, 145, 182)
   MMMMKKJPMCJJMMMM
   MMMMMMMMMMMMMMMM
 }
+# tile 562 (Lord Sidious)
+{
+  MMMMMMMMMMMMMMMM
+  MMMMMMMMMMMMMMMM
+  MMMMMNNNNMMMMMMM
+  MMMMNNNNNNMMMMMM
+  MMMNNAAAANNMMMMM
+  MMMNNAMMMNNAMMMM
+  MMMMAAMMMNNAMMMM
+  MMMMMMMMNNAAMMMM
+  MMMMMMMNNAAMMMMM
+  MMMMMMNNAAMMMMMM
+  MMMMMMNNAMMMMMMM
+  MMMMMMMAAMMMMMMM
+  MMMMMMNNMMMMMMMM
+  MMMMMMNNAMMMMMMM
+  MMMMMMMAAMMMMMMM
+  MMMMMMMMMMMMMMMM
+}
 # tile 611 (student)
 {
   MMMMMMMMMMMMMMMM
