diff -burN nethack/dat/Convict.des nethack-convict/dat/Convict.des --- nethack/dat/Convict.des 1969-12-31 19:00:00.000000000 -0500 +++ nethack-convict/dat/Convict.des 2012-04-18 13:52:03.876437284 -0400 @@ -0,0 +1,411 @@ +# +# The "start" level for the quest. +# +# Here you meet your (besieged) class leader, Robert the Lifer +# and receive your quest assignment. +# +MAZE:"Con-strt",' ' +FLAGS:noteleport,hardfloor +GEOMETRY:left,top +#123456789012345678901234567890123456789012345678901234567890123456789012345 +MAP +|--------------------------------------------------------|-----------------| +|....|...|...|...|...|...|...|...|...|...|...|...|...|...|................K| +|....|...|...|...|...|...|...|...|...|...|...|...|...|...|.................| +|---.---.---.---.---.---.---.---.---.---.---.---.---.---.|.................| +|..........................................................................| +|..........................................................................| +|....|.---.---.---.---.---.---.---.---.---.---.---.---.--------------..----| +|....|...|...|...|...|...|...|...|...|...|...|...|...|...|.................| +|....|...|...|...|...|...|...|...|...|...|...|...|...|...|.................| +|....|---------------------------------------------------|.................| +|....|...|...|...|...|...|...|...|...|...|...|...|...|...|.................| +|....|...|...|...|...|...|...|...|...|...|...|...|...|...|.................| +|....|--.---.---.---.---.---.---.---.---.---.---.---.---.|-----------------| +|..........................................................................| +|..........................................................................| +|..........................................................................| +|.----.---.---.---.---.---.---.---.---.---.---.---.---.--|.................| +|....|...|...|...|...|...|...|...|...|...|...|...|...|...|.................| +|....|...|...|...|...|...|...|...|...|...|...|...|...|...|.................| +|--------------------------------------------------------|-----------------| +ENDMAP +# Dungeon Description +REGION:(00,00,75,19),lit,"ordinary" +# Stairs +STAIR:(64,08),down +# Portal arrival point +BRANCH:(71,03,71,03),(0,0,0,0) +# Altar +ALTAR:(70,16),chaos,shrine +# Robert the Lifer +MONSTER:'@',"Robert the Lifer",(74,18) +# fellow prisoners +MONSTER:'@',"inmate",random +MONSTER:'@',"inmate",random +MONSTER:'@',"inmate",random +MONSTER:'@',"inmate",random +MONSTER:'@',"inmate",random +MONSTER:'@',"inmate",random +# Corrupt guards +MONSTER[50%]:'@',"prison guard",random +MONSTER[50%]:'@',"prison guard",random +MONSTER[50%]:'@',"prison guard",random +MONSTER[50%]:'@',"prison guard",random +MONSTER[50%]:'@',"prison guard",random +MONSTER[50%]:'@',"prison guard",random +# Good `ol mimics +MONSTER:'m',"giant mimic", (74,05), m_feature "staircase up" +# Random traps +TRAP:"web",random +TRAP:"web",random +TRAP:"web",random +TRAP:"web",random +# Prison debris +OBJECT[75%]: '_', "iron chain", random +OBJECT[75%]: '_', "iron chain", random +OBJECT[75%]: '_', "iron chain", random +OBJECT[75%]: '_', "iron chain", random +OBJECT[75%]: '_', "iron chain", random +OBJECT[50%]: '0', "heavy iron ball", random +OBJECT[50%]: '0', "heavy iron ball", random +# Non diggable walls +NON_DIGGABLE:(00,00,75,19) + +# +# The "locate" level for the quest. +# +# Here you have to find the exit from the Royal Dungeons +# to go further towards your assigned quest. +# + +MAZE:"Con-loca",' ' +FLAGS:noteleport,hardfloor +GEOMETRY:left,top +#123456789012345678901234567890123456789012345678901234567890123456789012345 +MAP +--------------- --------------- +|.....F.......| ################################# |............K| +|.....F.......+## # #############+.............| +|.....F.......| # # |.............| +|.....+.......| # # |.............| +|.....F.......| # # |.............| +|.....F.......| ### # |.............| +|.....F.......| ## # |FFFFFFFFFFFFF| +|-------------- ######### # |......|......| + # |S-------| # |......|......| + # |........| ###### |-------------| + ################# |........| # H + # |........+####### # + # |----S---| # |----------| + |--+-------| # ##### |..........| + |..........| # # # |..........| + |..........| # |------| # #########+..........| + |..........| ######S......+### |..........| + |----------| |......| |----------| + |------| +ENDMAP +# Dungeon Description +REGION:(01,01,13,07),lit,"ordinary" +REGION:(02,15,11,17),lit,"ordinary" +REGION:(62,01,74,09),lit,"ordinary" +REGION:(62,14,71,17),lit,"shop" +REGION:(28,10,35,12),lit,"barracks" +REGION:(39,17,44,18),lit,"ordinary" +# Stairs +STAIR:(02,03),up +STAIR:(39,17),down +# Non diggable walls +NON_DIGGABLE:(00,00,75,19) +DOOR:locked,(04,14) +DOOR:locked,(06,04) +DOOR:open,(14,02) +DOOR:closed,(61,16) +DOOR:closed,(45,17) +DOOR:locked,(36,12) +DOOR:closed,(61,02) +# Police station kops +MONSTER: '@',"inmate",(63,08) +MONSTER: '@',"inmate",(70,08) +MONSTER: 'K',"Keystone Kop",(62,01),asleep +MONSTER: 'K',"Keystone Kop",(65,01),asleep +MONSTER: 'K',"Keystone Kop",(66,01),asleep +MONSTER: 'K',"Keystone Kop",(74,02),asleep +MONSTER: 'K',"Kop Sergeant",(63,03),asleep +MONSTER: 'K',"Kop Sergeant",(72,03),asleep +MONSTER: 'K',"Kop Lieutenant",(71,04),asleep +MONSTER: 'K',"Kop Lieutenant",(68,05),asleep +MONSTER: 'K',"Kop Kaptain",(64,06),asleep +# Iron golem in supply room +MONSTER: ''',"iron golem",(11,17),asleep +# Supply room junk +OBJECT: '_', "iron chain", (2,15) +OBJECT: '_', "iron chain", (2,15) +OBJECT: '_', "iron chain", (3,15) +OBJECT: '_', "iron chain", (3,15) +OBJECT: '_', "iron chain", (4,15) +OBJECT: '0', "heavy iron ball", (4,15) +OBJECT: '_', "iron chain", (4,15) +OBJECT: '_', "iron chain", (5,15) +OBJECT: '_', "iron chain", (5,15) +OBJECT: '_', "iron chain", (6,15) +OBJECT: '_', "iron chain", (6,15) +OBJECT: '_', "iron chain", (6,15) +OBJECT: '_', "iron chain", (7,15) +OBJECT: '0', "heavy iron ball", (7,15) +OBJECT: '_', "iron chain", (8,15) +OBJECT: '_', "iron chain", (8,15) +OBJECT: '_', "iron chain", (9,15) +OBJECT: '_', "iron chain", (9,15) +OBJECT: '_', "iron chain", (9,15) +OBJECT: '_', "iron chain", (10,15) +OBJECT: '_', "iron chain", (10,15) +OBJECT: '_', "iron chain", (10,15) +OBJECT: '_', "iron chain", (11,15) +OBJECT: '_', "iron chain", (11,15) +OBJECT: '0', "heavy iron ball", (11,15) +OBJECT: '_', "iron chain", (2,16) +OBJECT: '0', "heavy iron ball", (2,16) +OBJECT: '_', "iron chain", (3,16) +OBJECT: '_', "iron chain", (3,16) +OBJECT: '_', "iron chain", (3,16) +OBJECT: '_', "iron chain", (4,16) +OBJECT: '_', "iron chain", (4,16) +OBJECT: '_', "iron chain", (5,16) +OBJECT: '_', "iron chain", (6,16) +OBJECT: '_', "iron chain", (6,16) +OBJECT: '_', "iron chain", (6,16) +OBJECT: '_', "iron chain", (7,16) +OBJECT: '_', "iron chain", (7,16) +OBJECT: '0', "heavy iron ball", (7,16) +OBJECT: '_', "iron chain", (7,16) +OBJECT: '_', "iron chain", (8,16) +OBJECT: '_', "iron chain", (8,16) +OBJECT: '_', "iron chain", (9,16) +OBJECT: '_', "iron chain", (9,16) +OBJECT: '_', "iron chain", (9,16) +OBJECT: '_', "iron chain", (10,16) +OBJECT: '_', "iron chain", (10,16) +OBJECT: '_', "iron chain", (11,16) +OBJECT: '_', "iron chain", (2,17) +OBJECT: '_', "iron chain", (3,17) +OBJECT: '_', "iron chain", (3,17) +OBJECT: '_', "iron chain", (3,17) +OBJECT: '_', "iron chain", (4,17) +OBJECT: '0', "heavy iron ball", (4,17) +OBJECT: '_', "iron chain", (4,17) +OBJECT: '_', "iron chain", (4,17) +OBJECT: '0', "heavy iron ball", (4,17) +OBJECT: '_', "iron chain", (5,17) +OBJECT: '_', "iron chain", (6,17) +OBJECT: '_', "iron chain", (7,17) +OBJECT: '_', "iron chain", (7,17) +OBJECT: '_', "iron chain", (7,17) +OBJECT: '_', "iron chain", (8,17) +OBJECT: '0', "heavy iron ball", (8,17) +OBJECT: '_', "iron chain", (9,17) +OBJECT: '_', "iron chain", (9,17) +OBJECT: '0', "heavy iron ball", (9,17) +OBJECT: '_', "iron chain", (9,17) +OBJECT: '_', "iron chain", (10,17) +OBJECT: '_', "iron chain", (10,17) +OBJECT: '_', "iron chain", (10,17) +OBJECT: '0', "heavy iron ball", (10,17) +OBJECT: '_', "iron chain", (11,17) + + +# +# The "goal" level for the quest. +# +# Here you meet Warden Arianna, your nemesis monster. You have to +# defeat Warden Arianna in combat to gain the artifact you have +# been assigned to retrieve. +# + +MAZE:"Con-goal",' ' +FLAGS:hardfloor +GEOMETRY:left,top +#123456789012345678901234567890123456789012345678901234567890123456789012345 +MAP +--------------------------------------------------------- +|...| |............................| | +|...| --............................| | +|...| |.............................| | +|...| --.............................| | +|...| |..............................| | +|...| --...................L..........| | +|...| |....................L..........| | +|...| --...................L.L.........| | +|...| |..............L.L.L.L.L.L.L.L...| | +|...|-----................L..L...L..L.....| | +|...........................L.L.L.L.......| | +|...........................L.L.L.L.......| | +|..........................L.L...L.L......| | +|.........................................|-------------| +|.........................................|.............| +|.........................................S.............| +|.........................................|.............| +|.........................................|.............| +--------------------------------------------------------- +ENDMAP +# Dungeon Description +REGION:(00,00,56,19),lit,"ordinary" +# Stairs +STAIR:(02,02),up +# Non diggable walls +NON_DIGGABLE:(00,00,56,19) +# Random traps +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random +# Lava demons +MONSTER: '&',"lava demon",(30,05),hostile,awake +MONSTER: '&',"lava demon",(23,09),hostile,awake +MONSTER: '&',"lava demon",(39,09),hostile,awake +MONSTER: '&',"lava demon",(36,14),hostile,awake +MONSTER: '&',"lava demon",(26,14),hostile,awake +# Elite guard +MONSTER: ''',"iron golem",(04,13),hostile +# Objects +OBJECT:'0',"heavy iron ball",(31,10),blessed,0,"The Iron Ball of Liberation" +OBJECT:'(',"chest",(55,18),blessed,2 +# Warden Arianna +MONSTER:'@',"Warden Arianna",(31,10),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:"Con-fila",' ' +FLAGS:hardfloor +GEOMETRY:left,top +#123456789012345678901234567890123456789012345678901234567890123456789012345 +MAP +---------------------------------------------------------------------------- +|....................---------.......................---------.............| +|....................F...|...|.......................F...|...|.............| +|....................|...|...F.......................|...|...F.............| +|....|---|---|.......|---|---|.......|---|---|.......|---|---|.............| +|....F...|...|.......F...|...|.......F...|...|.......F...|...|.............| +|....|...|...F.......|...|...F.......|...|...F.......|...|...F.............| +|....|---|---|.......|---|---|.......|---|---|.......|---|---|.............| +|....F...|...|.......F...|...|.......F...|...|.......F...|...|.............| +|....|...|...F.......|...|...F.......|...|...F.......|...|...F.............| +|....|---|---|.......|---|---|.......|---|---|.......|---|---|.............| +|........|...|.......F...|...|.......F...|...|.......F...|...|.............| +|....|...|...F.......|...|...F.......|...|...F.......|...|...F.............| +|....|---|---|.......|---|---|.......|---|---|.......|---|---|.............| +|....F...|...|.......F...|...|.......F...|...|.......F...|...|.............| +|....|...|...F.......|...|...........|...|...F.......|...|...F.............| +|....|---|---|.......|---|---|.......|---|---|.......|---|---|.............| +|........|...|.......................F...|...|.............................| +|....|...|...F.......................|...|...F.............................| +|--------------------------------------------------------------------------| +ENDMAP +# Dungeon Description +REGION:(00,00,75,19),lit,"ordinary" +# Stairs +STAIR:(74,03),up +STAIR:(03,17),down +# Non diggable walls +NON_DIGGABLE:(00,00,75,19) +# "Regular" prisoners +MONSTER:'@',"inmate",(59,02) +MONSTER:'@',"inmate",(55,08) +MONSTER:'@',"inmate",(43,14) +MONSTER:'@',"inmate",(38,05) +MONSTER:'@',"inmate",(27,02) +MONSTER:'@',"inmate",(23,08) +MONSTER:'@',"inmate",(11,14) +MONSTER:'@',"inmate",(06,05) +# Undead prisoners +MONSTER:' ',"ghost",(42,17),"Orzo the Inmate" +MONSTER[50%]:' ',"ghost",(40,18),"Fredgar the Inmate" +MONSTER[50%]:' ',"ghost",(06,12),"Rastilon the Inmate" +MONSTER:'Z',"skeleton",(28,15),awake +# Bugs and snakes +MONSTER:'S',"pit viper",(06,17) +MONSTER:'x',"xan",random +# Corrupt guards +MONSTER[50%]:'@',"prison guard",random +MONSTER[50%]:'@',"prison guard",random +MONSTER[50%]:'@',"prison guard",random +MONSTER[50%]:'@',"prison guard",random +# Random traps +TRAP:"web",random +TRAP:"web",random +TRAP:"web",random +TRAP:"web",random +# Prison debris +OBJECT[75%]: '_', "iron chain", random +OBJECT[75%]: '_', "iron chain", random +OBJECT[75%]: '_', "iron chain", random +OBJECT[75%]: '_', "iron chain", random +OBJECT[75%]: '_', "iron chain", random +OBJECT[50%]: '0', "heavy iron ball", random +OBJECT[50%]: '0', "heavy iron ball", random + + +MAZE:"Con-filb",' ' +FLAGS:hardfloor +INIT_MAP: '#' , ' ', true, true, unlit, true +MESSAGE: "This appears to be a prison level that is still under construction" +NOMAP +# +STAIR: random, up +STAIR: random, down +# Peaceful miners +MONSTER:'@',"miner",random,peaceful +MONSTER:'@',"miner",random,peaceful +MONSTER:'@',"miner",random,peaceful +MONSTER:'@',"miner",random,peaceful +MONSTER:'@',"miner",random,peaceful +MONSTER:'@',"miner",random,peaceful +MONSTER:'@',"miner",random,peaceful +MONSTER:'@',"miner",random,peaceful +# Earth creatures +MONSTER:'X',"xorn",random +MONSTER:'E',"earth elemental",random +MONSTER[50%]:'X',"xorn",random +MONSTER[50%]:'E',"earth elemental",random +# Other nasties +MONSTER:'t',"lurker above",random +MONSTER:'t',"trapper",random +MONSTER[50%]:'t',"lurker above",random +MONSTER[50%]:'t',"trapper",random +MONSTER[50%]:'p',"rock piercer",random +MONSTER[50%]:'p',"rock piercer",random +MONSTER[50%]:'p',"iron piercer",random +MONSTER[50%]:'p',"iron piercer",random +MONSTER[50%]:'p',"glass piercer",random +MONSTER[50%]:'p',"glass piercer",random +# Tools and corpses +OBJECT[50%]: '(', "pick-axe", random +OBJECT[75%]: '(', "brass lantern", random +OBJECT[50%]: '(', random, random +OBJECT[25%]: '%', "corpse", random, "miner", 0 +OBJECT[25%]: '%', "corpse", random, "miner", 0 +OBJECT[25%]: '%', "corpse", random, "miner", 0 +OBJECT[25%]: '%', "corpse", random, "miner", 0 +# Natural cavern hazards +TRAP: "pit", random +TRAP: "pit", random +TRAP: "pit", random +TRAP: "pit", random +TRAP: "pit", random +TRAP: "pit", random +TRAP: "falling rock", random +TRAP: "falling rock", random +TRAP: "falling rock", random +TRAP: "falling rock", random +TRAP: "web", random +TRAP: "web", random + diff -burN nethack/dat/quest.txt nethack-convict/dat/quest.txt --- nethack/dat/quest.txt 2011-05-27 10:06:55.637425410 -0400 +++ nethack-convict/dat/quest.txt 2012-04-18 13:28:49.878390408 -0400 @@ -810,6 +810,302 @@ "Sacrifice the Amulet on the altar. Thus shall %d become supreme!" %E # +# Convict +# +%Cc Con 00001 +Somehow, you have been captured and teleported back to +%H! But wait, the portal you went through is still +here. You had heard your old mentor %l, +the prison chaplain who taught you the ways of +%d calling for your help. Also, %H +is not as you had left it. There seems to be damage +to the walls, and you hear sounds of strife all +around you. +%E +%Cp Con 00002 +You have returned to %H. Somehow, things are even +worse now than when you were on your previous visit. Has +%l managed to still hold out? +%E +%Cp Con 00003 +The situation seems to degrade, and you wonder how long +your fellow %gp can hold out against the corrupt +guards and creatures of the Underdark that pervade the +formerly tranquil %H. +%E +%Cp Con 00005 +"How did you manage to escape?" +%E +%Cp Con 00006 +"How is life on the outside?" +%E +%Cp Con 00007 +"Between the abusive guards, and the nasty vermin, I +don't know how we will hold out." +%E +%Cp Con 00008 +"This place used to be so much nicer before %n +became corrupt." +%E +%Cp Con 00009 +"You are really back? I thought you were gone for +good." +%E +%Cp Con 00010 +"Thank you for ridding us of %n. I hope the +new warden will be better." +%E +%Cp Con 00011 +"Take me with you! I will be glad to be rid of this +awful place." +%E +%Cp Con 00012 +"Don't forget to come back for us once you have +completed your quest!" +%E +%Cp Con 00013 +"Thank you for coming back to help us in our hour +of need!" +%E +%Cp Con 00014 +"Leave while you still can! If you can escape, +maybe there is hope for the rest of us." +%E +%Cc Con 00015 +"%p, I am very happy to see that you are +alive and well! We were all proud of your daring +escape, and hoped that you were doing well. +Things have become much worse in your absence, +however, and we desperately need your help. Let +me have a look at you, and see if you are ready." +%E +%Cp Con 00016 +"I see that you are back, %p. I hope that +you are now ready to help us? Let me see if you +are." +%E +%Cp Con 00017 +"Once again, you have returned. Let me see if you +are finally ready to help us." +%E +%Cc Con 00018 +"You have betrayed us all, %p! Begone from +here, and don't come back! You are not even worthy +to share a cell with the least of us now." +%E +%Cc Con 00019 +"%p, I am afraid that a %r will be no +match for %n. If I sent you now, +she would dispatch you all too easily. + +"Continue your other quest, and practice your +skills. Return to us once you have achieved the rank +of %R." +%E +%Cc Con 00020 +"%p, I see that you are not yet a loyal servant of +%d. Leave this place for now, and only +return when you have cleansed your spirit. Only then +will you be ready to stand up to %n and +recover %o." +%E +%Cc Con 00021 +"Yes, %p, it looks like you are now ready to +help us. Things have become much worse since you +left. The dungeons are overrun by vermin, guards +have become brutal and corrupt, and I believe that +%n has had dealings with dark powers. + +"I had spent many years enchanting my iron ball +with powers to help lead an escape from this place, +turning it into %o. +Unfortunately, %n stole it from me, +likely using it for dark, twisted purposes. + +"We need your help to go down to the warden's level +to defeat the corrupt %n and recover +%o for us so that +%H will be safe again." +%E +%Cp Con 00025 +"The sooner you are able to recover %o, +the better off we will be." +%E +%Cp Con 00026 +"I am not sure what has happened, but even without +%o, %n will make a formidable opponent." +%E +%Cp Con 00027 +"Stay true to the teachings of %d, and good +fortune will be with you." +%E +%Cp Con 00028 +"I am afraid without the power of %o +to protect us, we will soon be overwhelmed." +%E +%Cp Con 00029 +"%n used to be a woman of honor before turning +to dark ways. It is much too late for +redemption, however." +%E +%Cp Con 00030 +"%n is arrogant, and will try to diminish +your confidence. Do not let yourself be +discouraged!" +%E +%Cp Con 00031 +"You will have to be very alert, and will need +to use all of your cunning if you hope to +defeat %n." +%E +%Cp Con 00032 +"Call upon the power of %d to protect you +when you encounter %n." +%E +%Cp Con 00033 +"If you remain true to your faith, you should +be able to sense the power of %o when +you are near." +%E +%Cp Con 00034 +"You should be able to defeat %n easily +enough in a fair fight. Unfortunately, she doesn't +fight fair." +%E +%Cc Con 00035 +This must be the level that leads to the warden's +area. You must be getting closer to +%o now! +%E +%Cp Con 00036 +Once again, you find yourself near the entrance to +the warden's area. Hopefully, you can acquire +%o before it's too late! +%E +%Cc Con 00040 +You sense the presence of %o as soon as you +enter this level. If %o is here, then +%n must not be far away. +%E +%Cp Con 00041 +Once again, you find yourself in the abode of +%n, and feel the presence of +%o. +%E +%Cc Con 00050 +"So, %p. You have returned, and are here to get +%o for %l? +What makes you think you can get it if +%l couldn't? I have many +allies that have made me even stronger." +%E +%Cp Con 00051 +"I see that you have returned, %p. I +suggest you leave and save yourself while you still +have a chance." +%E +%Cp Con 00052 +"Back again, %p? You will certainly die in +your attempt to defeat me." +%E +%Cp Con 00053 +"I will get %o from you, just as I did +%l! You can not defeat me." +%E +%Cp Con 00060 +"You should never come back. You will not escape +here alive again!" +%E +%Cp Con 00061 +"Even all of your pathetic lot put together would +not be enough to defeat me." +%E +%Cp Con 00062 +"You are no more than lowly prison scum. You are +unworthy to even challenge me." +%E +%Cp Con 00063 +"Even %l could not stand up to me, so +you have no chance at all." +%E +%Cp Con 00064 +"Even %o would not be enough to +make you my equal." +%E +%Cp Con 00065 +"Your pathetic devotion to %d will not +save you, either." +%E +%Cp Con 00066 +"After I kill you, I will go after %l next, +and any that dare to defy me again!" +%E +%Cp Con 00067 +"Die with dishonor, lowly %c!" +%E +%Cp Con 00068 +"Once a %c, always a %c." +%E +%Cp Con 00069 +"How about you find yourself a cosy little cell, +and hope that I forgive your insolence?" +%E +%Cc Con 00070 +As you pick up %o, you feel its power +flow through you, protecting you, and making you +more aware of your surroundings. You know that +you need to get it back to %l as soon +as possible now. +%E +%Cc Con 00080 +As %n approaches death, you see sudden +clarity in her eyes. + +"What have I done? Those demons have been clouding my mind. +Please forgive me, %p, although I know that I +probably do not deserve it. Take +%o back to %l +with my blessing." + +With a final coughing fit, %n spasms, and her +eyes see no more. +%E +%Cc Con 00081 +"Congratulations, %p! You have returned with +your life, and with %o! I had +planned to use %o to lead an +escape from here, but with %n defeated, +life should go back to normal before long. + +"Whether I like it or not, I know my place is here. I +see that %o has already attuned +itself to you. I offer it to you in hopes that +it will aid in your quest to recover the Amulet +of Yendor." +%E +%Cc Con 00082 +%l looks upon %o +with fondness. +"You are its keeper now. Take it with you back to +%Z, through the magic portal +that brought you here." +%E +%Cc Con 00090 +"Welcome back, %p. We have done well in your +absence. How far have you come with your quest to +regain the Amulet of Yendor for %d?" +%E +%Cc Con 00091 +"Congratulations, %p! You have redeemed yourself +and proven yourself a worthy servant of %d, +and in doing so have made all of us proud. + +"One final task remains for you now. You must take +the Amulet up to the Great Temple of %d, on +the Astral plane. There you must offer the Amulet +to %d." +%E +# # Healer # %Cc Hea 00001 @@ -3505,3 +3801,25 @@ S suffix: return s_suffix(capitalized(root)); t suffix: return strip_the_prefix(root); %E +# +# Alternate legacy text for Convict role +# +%Cc - 00199 +It is written in the Book of %d: + + After the Creation, the cruel god Moloch rebelled + against the authority of Marduk the Creator. + Moloch stole from Marduk the most powerful of all + the artifacts of the gods, the Amulet of Yendor, + and he hid it in the dark cavities of Gehennom, the + Under World, where he now lurks, and bides his time. + +Your %G %d seeks to possess the Amulet, and with it +to gain deserved ascendance over the other gods. + +You, a newly escaped %r, have chosen to redeem +yourself by recovering the Amulet for %d. You are +determined to recover the Amulet for your deity, or die +in the attempt. Your hour of destiny has come. For +the sake of us all: Go bravely with %d! +%E diff -burN nethack/include/artifact.h nethack-convict/include/artifact.h --- nethack/include/artifact.h 2011-05-27 10:06:54.443222338 -0400 +++ nethack-convict/include/artifact.h 2012-04-16 21:54:37.000000000 -0400 @@ -60,5 +60,6 @@ #define CREATE_PORTAL (LAST_PROP+7) #define ENLIGHTENING (LAST_PROP+8) #define CREATE_AMMO (LAST_PROP+9) +#define PHASING (LAST_PROP+10) #endif /* ARTIFACT_H */ diff -burN nethack/include/artilist.h nethack-convict/include/artilist.h --- nethack/include/artilist.h 2011-05-27 10:06:54.430806975 -0400 +++ nethack-convict/include/artilist.h 2012-04-16 21:54:37.000000000 -0400 @@ -43,6 +43,11 @@ A("Excalibur", LONG_SWORD, (SPFX_NOGEN|SPFX_RESTR|SPFX_SEEK|SPFX_DEFN|SPFX_INTEL|SPFX_SEARCH),0,0, PHYS(5,10), DRLI(0,0), NO_CARY, 0, A_LAWFUL, PM_KNIGHT, NON_PM, 4000L ), +#ifdef CONVICT +A("Luck Blade", BROADSWORD, + (SPFX_RESTR|SPFX_LUCK|SPFX_INTEL),0,0, + PHYS(5,6), NO_DFNS, NO_CARY, 0, A_CHAOTIC, PM_CONVICT, NON_PM, 3000L ), +#endif /* CONVICT */ /* * Stormbringer only has a 2 because it can drain a level, * providing 8 more. @@ -168,6 +173,14 @@ PHYS(5,0), NO_DFNS, CARY(AD_MAGM), CONFLICT, A_LAWFUL, PM_CAVEMAN, NON_PM, 2500L ), +#ifdef CONVICT +A("The Iron Ball of Liberation", HEAVY_IRON_BALL, + (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), + (SPFX_STLTH|SPFX_SEARCH|SPFX_WARN), 0, + NO_ATTK, NO_DFNS, CARY(AD_MAGM), + PHASING, A_NEUTRAL, PM_PRISONER, NON_PM, 5000L ), +#endif /* CONVICT */ + #if 0 /* OBSOLETE */ A("The Palantir of Westernesse", CRYSTAL_BALL, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), diff -burN nethack/include/config.h nethack-convict/include/config.h --- nethack/include/config.h 2012-02-27 11:44:09.321438291 -0500 +++ nethack-convict/include/config.h 2012-04-17 15:21:49.362153336 -0400 @@ -332,6 +332,8 @@ #define SEDUCE /* Succubi/incubi seduction, by KAA, suggested by IM */ #define STEED /* Riding steeds */ #define TOURIST /* Tourist players with cameras and Hawaiian shirts */ +#define CONVICT /* Convict player with heavy iron ball */ + /* difficulty */ #define ELBERETH /* Engraving the E-word repels monsters */ /* I/O */ diff -burN nethack/include/decl.h nethack-convict/include/decl.h --- nethack/include/decl.h 2011-05-27 10:06:54.414705019 -0400 +++ nethack-convict/include/decl.h 2012-04-16 21:54:37.000000000 -0400 @@ -189,6 +189,9 @@ E NEARDATA char dogname[]; E NEARDATA char catname[]; E NEARDATA char horsename[]; +#ifdef CONVICT +E NEARDATA char ratname[]; +#endif /* CONVICT */ E char preferred_pet; E const char *occtxt; /* defined when occupation != NULL */ E const char *nomovemsg; diff -burN nethack/include/eshk.h nethack-convict/include/eshk.h --- nethack/include/eshk.h 2011-05-27 10:06:54.443222338 -0400 +++ nethack-convict/include/eshk.h 2012-04-16 21:54:37.000000000 -0400 @@ -26,6 +26,9 @@ schar unused; /* to force alignment for stupid compilers */ boolean following; /* following customer since he owes us sth */ boolean surcharge; /* angry shk inflates prices */ +#ifdef CONVICT + boolean pbanned; /* player is banned from the shop */ +#endif /* CONVICT */ coord shk; /* usual position shopkeeper */ coord shd; /* position shop door */ d_level shoplevel; /* level (& dungeon) of his shop */ diff -burN nethack/include/mondata.h nethack-convict/include/mondata.h --- nethack/include/mondata.h 2011-05-27 10:06:54.415738818 -0400 +++ nethack-convict/include/mondata.h 2012-04-16 21:54:37.000000000 -0400 @@ -86,6 +86,13 @@ #define is_bat(ptr) ((ptr) == &mons[PM_BAT] || \ (ptr) == &mons[PM_GIANT_BAT] || \ (ptr) == &mons[PM_VAMPIRE_BAT]) +#ifdef CONVICT +# define is_rat(ptr) ((ptr) == &mons[PM_SEWER_RAT] || \ + (ptr) == &mons[PM_GIANT_RAT] || \ + (ptr) == &mons[PM_RABID_RAT] || \ + (ptr) == &mons[PM_ENORMOUS_RAT] || \ + (ptr) == &mons[PM_RODENT_OF_UNUSUAL_SIZE]) +#endif /* CONVICT */ #define is_bird(ptr) ((ptr)->mlet == S_BAT && !is_bat(ptr)) #define is_giant(ptr) (((ptr)->mflags2 & M2_GIANT) != 0L) #define is_golem(ptr) ((ptr)->mlet == S_GOLEM) @@ -187,7 +194,12 @@ ((ptr)->mlet == S_PUDDING && \ (ptr) != &mons[PM_BLACK_PUDDING])) +#ifdef CONVICT +#define befriend_with_obj(ptr, obj) ((obj)->oclass == FOOD_CLASS && \ + (is_domestic(ptr) || (is_rat(ptr) && Role_if(PM_CONVICT)))) +#else #define befriend_with_obj(ptr, obj) ((obj)->oclass == FOOD_CLASS && \ is_domestic(ptr)) +#endif #endif /* MONDATA_H */ diff -burN nethack/include/youprop.h nethack-convict/include/youprop.h --- nethack/include/youprop.h 2011-05-27 10:06:54.449367589 -0400 +++ nethack-convict/include/youprop.h 2012-04-16 21:54:37.000000000 -0400 @@ -275,7 +275,9 @@ #define EPasses_walls u.uprops[PASSES_WALLS].extrinsic #define Passes_walls (HPasses_walls || EPasses_walls || \ passes_walls(youmonst.data)) - +#ifdef CONVICT +# define Phasing u.uprops[PASSES_WALLS].intrinsic +#endif /* CONVICT */ /*** Physical attributes ***/ #define HSlow_digestion u.uprops[SLOW_DIGESTION].intrinsic diff -burN nethack/README-convict.txt nethack-convict/README-convict.txt --- nethack/README-convict.txt 1969-12-31 19:00:00.000000000 -0500 +++ nethack-convict/README-convict.txt 2012-04-18 14:10:25.067429819 -0400 @@ -0,0 +1,113 @@ +Convict role patch v0.7 for NetHack 3.4.3 +Karl Garrison + + +Non-spoiler Information +~~~~~~~~~~~~~~~~~~~~~~~ + +This patch adds a new role to NetHack: the Convict. The Convict is an +escaped prisoner who seeks to redeem himself by seeking the Amulet in +the Dungeons of Doom. They start out with a striped shirt, some rocks, +and heavy iron ball chained to them. A trusty sewer rat accompanies +the Convict into the dungeon: a companion from his days of +imprisonment. Convicts have an affinity with rats, but many other +animals do not trust him. + +Race: Human, Dwarf, Gnome, or Orc +Alignment: Chaotic +Deity: Tymora (Forgotten Realms) + +New configuration file option: ratname. Example: + +OPTIONS=ratname:Squeak + + + + + + + + + + + + + +Spoiler Information +~~~~~~~~~~~~~~~~~~~ + +There may be a few surprises to this role for the unaware. They start +with a negative alignment ("You have transgressed"). This means that a +Convict will not be able to pray successfully early on. Some time and +killing of monsters will make up for this before too long, though. +They also start the game on the verge of hungry, which also makes the +very early game challenging for Convicts. On the bright side, it takes +them longer to progress from hungry to weak, etc, due to their higher +tolerance for irregular meals. + +Stats: Excellent CON, good STR, average DEX and INT, poor WIS and CHA. + +Intrinsics: Sick resistance at level 1 (due to exposure to unhealthy +prison conditions, as well as bad food), poison resistance at level 7, +search at level 20. + +Pet: The convict starts with a sewer rat, which quickly advances to a +giant rat, and can eventually become an enormous rat, then a rodent of +unusual size. Convicts can tame rats with food, but not domestic +amimals like dogs and cats. The latter are instead made peaceful. + +Convicts can also usually make rats peaceful and occasionally tame by +#chatting with them. + +Iron Ball: The Convict starts with a heavy iron ball chained to him, as +if he had read a scroll of punishment. Since he starts with no real +weapons apart from his rocks, he may wish to wield it as a weapon. +Convicts (and only Convicts) will practice the flail skill when he +weilds an iron ball. Advancing flail skill improves his chance to hit, +and prevents him from automatically falling down the stairs if one is +chained to him, so long as he is currently wielding it. + +Striped Shirt: Shopkeepers who can see the Convict wearing his striped +shirt will recognize the player as an escaped prisoner, and will ban +him from the shop. Even if he later hides the shirt, that shopkeeper +will remember the player. + +Guards: Guards (town watch and vault guards) who see a Convict will +recognize him from wanted posters, and immediately become hostile. + +Hunger: Convicts start on the verge of hungry, but the effects of +hunger kick in a bit more slowly for this role, due to their learned +tolerance of inadequate nutrition. + +Weapon Skills: + +Basic: mace, short sword + +Skilled: dagger, dart, hammer, sling, two-weapon combat +bare-handed combat + +Expert: club, flail, knife, pick-axe + + +Spellcasting Skills: + +Basic: Matter + +Expert: Escape + + +Luck Sword: This is a Chaotic broadsword which acts as a luckstone, and +is the Convict's first sacrifice gift. + +The Quest: The Convict quest has the player return to Castle +Waterdeep's dungeons in order to retrieve the Iron Ball of Liberation +from the corrupted Warden Arianna on behalf of their quest leader, +Robert the Lifer. + +The Iron Ball of Liberation: This is a (slightly lighter) heavy iron +ball that grants magic resistance, stealth, searching and warning. +When invoked, it allows phasing for a limited time (the ability to +walk through walls/stone like a xorn). The downsides are its weight +(almost as heavy as a normal iron ball) and the fact that it chains +itself to the player everytime its power is invoked. + diff -burN nethack/src/allmain.c nethack-convict/src/allmain.c --- nethack/src/allmain.c 2011-05-27 10:06:55.406500830 -0400 +++ nethack-convict/src/allmain.c 2012-04-16 21:54:37.000000000 -0400 @@ -526,10 +526,27 @@ if(MON_AT(u.ux, u.uy)) mnexto(m_at(u.ux, u.uy)); (void) makedog(); docrt(); +#ifdef CONVICT + if (Role_if(PM_CONVICT)) { + setworn(mkobj(CHAIN_CLASS, TRUE), W_CHAIN); + setworn(mkobj(BALL_CLASS, TRUE), W_BALL); + uball->spe = 1; + placebc(); + newsym(u.ux,u.uy); + } +#endif /* CONVICT */ if (flags.legacy) { flush_screen(1); +#ifdef CONVICT + if (Role_if(PM_CONVICT)) { + com_pager(199); + } else { + com_pager(1); + } +#else com_pager(1); +#endif /* CONVICT */ } #ifdef INSURANCE diff -burN nethack/src/artifact.c nethack-convict/src/artifact.c --- nethack/src/artifact.c 2011-05-27 10:06:55.424745523 -0400 +++ nethack-convict/src/artifact.c 2012-04-16 21:54:37.000000000 -0400 @@ -550,6 +550,19 @@ if (yours) pline("%s your grasp!", Tobjnam(obj, "evade")); return 0; } +#ifdef CONVICT + /* This is a kludge, but I'm not sure where else to put it */ + if (oart == &artilist[ART_IRON_BALL_OF_LIBERATION]) { + if (Role_if(PM_CONVICT) && (!obj->oerodeproof)) { + obj->oerodeproof = TRUE; + obj->owt = 300; /* Magically lightened, but still heavy */ + } + + if (Punished && (obj != uball)) { + unpunish(); /* Remove a mundane heavy iron ball */ + } + } +#endif /* CONVICT */ return 1; } @@ -1348,6 +1361,35 @@ otmp = hold_another_object(otmp, "Suddenly %s out.", aobjnam(otmp, "fall"), (const char *)0); break; +#ifdef CONVICT + case PHASING: /* Walk through walls and stone like a xorn */ + if (Passes_walls) goto nothing_special; + if (oart == &artilist[ART_IRON_BALL_OF_LIBERATION]) { + if (Punished && (obj != uball)) { + unpunish(); /* Remove a mundane heavy iron ball */ + } + + if (!Punished) { + setworn(mkobj(CHAIN_CLASS, TRUE), W_CHAIN); + setworn(obj, W_BALL); + uball->spe = 1; + if (!u.uswallow) { + placebc(); + if (Blind) set_bc(1); /* set up ball and chain variables */ + newsym(u.ux,u.uy); /* see ball&chain if can't see self */ + } + Your("%s chains itself to you!", xname(obj)); + } + } + if (!Hallucination) { + Your("body begins to feel less solid."); + } else { + You_feel("one with the spirit world."); + } + incr_itimeout(&Phasing, (50 + rnd(100))); + obj->age += Phasing; /* Time begins after phasing ends */ + break; +#endif /* CONVICT */ } } } else { diff -burN nethack/src/attrib.c nethack-convict/src/attrib.c --- nethack/src/attrib.c 2011-05-27 10:06:55.396437143 -0400 +++ nethack-convict/src/attrib.c 2012-04-16 21:54:37.000000000 -0400 @@ -39,6 +39,13 @@ { 15, &(HWarning), "sensitive", "" }, { 0, 0, 0, 0 } }, +#ifdef CONVICT + con_abil[] = { { 1, &(HSick_resistance), "", "" }, + { 7, &(HPoison_resistance), "healthy", "" }, + { 20, &(HSearching), "perceptive", "unaware" }, + { 0, 0, 0, 0 } }, +#endif /* CONVICT */ + hea_abil[] = { { 1, &(HPoison_resistance), "", "" }, { 15, &(HWarning), "sensitive", "" }, { 0, 0, 0, 0 } }, @@ -544,6 +551,9 @@ case PM_ARCHEOLOGIST: abil = arc_abil; break; case PM_BARBARIAN: abil = bar_abil; break; case PM_CAVEMAN: abil = cav_abil; break; +#ifdef CONVICT + case PM_CONVICT: abil = con_abil; break; +#endif /* CONVICT */ case PM_HEALER: abil = hea_abil; break; case PM_KNIGHT: abil = kni_abil; break; case PM_MONK: abil = mon_abil; break; diff -burN nethack/src/cmd.c nethack-convict/src/cmd.c --- nethack/src/cmd.c 2011-05-27 10:06:55.426807254 -0400 +++ nethack-convict/src/cmd.c 2012-04-16 21:54:37.000000000 -0400 @@ -896,6 +896,11 @@ if (u.usick_type & SICK_NONVOMITABLE) you_are("sick from illness"); } +#ifdef CONVICT + if (Punished) { + you_are("punished"); + } +#endif /* CONVICT */ } if (Stoned) you_are("turning to stone"); if (Slimed) you_are("turning into slime"); diff -burN nethack/src/decl.c nethack-convict/src/decl.c --- nethack/src/decl.c 2011-05-27 10:06:55.386792449 -0400 +++ nethack-convict/src/decl.c 2012-04-16 21:54:37.000000000 -0400 @@ -201,6 +201,9 @@ NEARDATA char dogname[PL_PSIZ] = DUMMY; NEARDATA char catname[PL_PSIZ] = DUMMY; NEARDATA char horsename[PL_PSIZ] = DUMMY; +#ifdef CONVICT +NEARDATA char ratname[PL_PSIZ] = DUMMY; +#endif /* CONVICT */ char preferred_pet; /* '\0', 'c', 'd', 'n' (none) */ /* monsters that went down/up together with @ */ NEARDATA struct monst *mydogs = (struct monst *)0; diff -burN nethack/src/do.c nethack-convict/src/do.c --- nethack/src/do.c 2011-05-27 10:06:55.425774294 -0400 +++ nethack-convict/src/do.c 2012-04-16 21:54:37.000000000 -0400 @@ -1162,7 +1162,14 @@ You("fly down along the %s.", at_ladder ? "ladder" : "stairs"); else if (u.dz && +#ifdef CONVICT + (near_capacity() > UNENCUMBERED || (Punished && + ((uwep != uball) || ((P_SKILL(P_FLAIL) < P_BASIC)) + || !Role_if(PM_CONVICT))) + || Fumbling)) { +#else (near_capacity() > UNENCUMBERED || Punished || Fumbling)) { +#endif /* CONVICT */ You("fall down the %s.", at_ladder ? "ladder" : "stairs"); if (Punished) { drag_down(); diff -burN nethack/src/dog.c nethack-convict/src/dog.c --- nethack/src/dog.c 2011-05-27 10:06:55.427842171 -0400 +++ nethack-convict/src/dog.c 2012-04-16 21:54:37.000000000 -0400 @@ -142,6 +142,10 @@ petname = dogname; else if (pettype == PM_PONY) petname = horsename; +#ifdef CONVICT + else if (pettype == PM_SEWER_RAT) + petname = ratname; +#endif /* CONVICT */ else petname = catname; @@ -154,6 +158,11 @@ if(Role_if(PM_RANGER)) petname = "Sirius"; /* Orion's dog */ } +#ifdef CONVICT + if (!*petname && pettype == PM_SEWER_RAT) { + if(Role_if(PM_CONVICT)) petname = "Nicodemus"; /* Rats of NIMH */ + } +#endif /* CONVICT */ mtmp = makemon(&mons[pettype], u.ux, u.uy, MM_EDOG); if(!mtmp) return((struct monst *) 0); /* pets were genocided */ @@ -760,6 +769,13 @@ && mtmp->data->mlet == S_DOG) return((struct monst *)0); +#ifdef CONVICT + if (Role_if(PM_CONVICT) && (is_domestic(mtmp->data) && obj)) { + /* Domestic animals are wary of the Convict */ + pline("%s still looks wary of you.", Monnam(mtmp)); + return((struct monst *)0); + } +#endif /* If we cannot tame it, at least it's no longer afraid. */ mtmp->mflee = 0; mtmp->mfleetim = 0; diff -burN nethack/src/dokick.c nethack-convict/src/dokick.c --- nethack/src/dokick.c 2011-05-27 10:06:55.415540774 -0400 +++ nethack-convict/src/dokick.c 2012-04-16 21:54:37.000000000 -0400 @@ -307,6 +307,10 @@ goldreqd = 500L; else if (mtmp->data == &mons[PM_CAPTAIN]) goldreqd = 750L; +#ifdef CONVICT + else if (mtmp->data == &mons[PM_PRISON_GUARD]) + goldreqd = 200L; +#endif /* CONVICT */ if (goldreqd) { #ifndef GOLDOBJ diff -burN nethack/src/eat.c nethack-convict/src/eat.c --- nethack/src/eat.c 2011-05-27 10:06:55.434428204 -0400 +++ nethack-convict/src/eat.c 2012-04-18 13:13:23.477108910 -0400 @@ -1393,11 +1393,18 @@ "Mmm, tripe... not bad!"); else { pline("Yak - dog food!"); +#ifdef CONVICT + if (Role_if(PM_CONVICT)) + pline("At least it's not prison food."); +#endif /* CONVICT */ more_experienced(1,0); newexplevel(); /* not cannibalism, but we use similar criteria for deciding whether to be sickened by this meal */ if (rn2(2) && !CANNIBAL_ALLOWED()) +#ifdef CONVICT + if (!Role_if(PM_CONVICT)) +#endif /* CONVICT */ make_vomiting((long)rn1(victual.reqtime, 14), FALSE); } break; @@ -1441,6 +1448,11 @@ #endif if (otmp->otyp == EGG && stale_egg(otmp)) { pline("Ugh. Rotten egg."); /* perhaps others like it */ +#ifdef CONVICT + if (Role_if(PM_CONVICT) && (rn2(8) > u.ulevel)) { + You_feel("a slight stomach ache."); /* prisoners are used to bad food */ + } else +#endif /* CONVICT */ make_vomiting(Vomiting+d(10,4), TRUE); } else give_feedback: @@ -2129,6 +2141,10 @@ if ((!u.usleep || !rn2(10)) /* slow metabolic rate while asleep */ && (carnivorous(youmonst.data) || herbivorous(youmonst.data)) +#ifdef CONVICT + /* Convicts can last twice as long at hungry and below */ + && (!Role_if(PM_CONVICT) || (moves % 2) || (u.uhs < HUNGRY)) +#endif /* CONVICT */ && !Slow_digestion) u.uhunger--; /* ordinary food consumption */ diff -burN nethack/src/files.c nethack-convict/src/files.c --- nethack/src/files.c 2011-05-27 10:06:55.403407255 -0400 +++ nethack-convict/src/files.c 2012-04-16 21:54:37.000000000 -0400 @@ -1790,6 +1790,10 @@ (void) strncpy(dogname, bufp, PL_PSIZ-1); } else if (match_varname(buf, "CATNAME", 3)) { (void) strncpy(catname, bufp, PL_PSIZ-1); +#ifdef CONVICT + } else if (match_varname(buf, "RATNAME", 3)) { + (void) strncpy(catname, bufp, PL_PSIZ-1); +#endif /* CONVICT */ } else if (match_varname(buf, "BOULDER", 3)) { (void) get_uchars(fp, buf, bufp, &iflags.bouldersym, TRUE, diff -burN nethack/src/hack.c nethack-convict/src/hack.c --- nethack/src/hack.c 2011-05-27 10:06:55.415540774 -0400 +++ nethack-convict/src/hack.c 2012-04-16 21:54:37.000000000 -0400 @@ -14,7 +14,6 @@ #endif STATIC_DCL boolean FDECL(findtravelpath, (BOOLEAN_P)); STATIC_DCL boolean FDECL(monstinroom, (struct permonst *,int)); - STATIC_DCL void FDECL(move_update, (BOOLEAN_P)); #define IS_SHOP(x) (rooms[x].rtype >= SHOPBASE) @@ -642,6 +641,9 @@ } if (invent && (inv_weight() + weight_cap() > 600)) { if (mode == DO_MOVE) +#ifdef CONVICT + if (!Passes_walls) +#endif /* CONVICT */ You("are carrying too much to get through."); return FALSE; } diff -burN nethack/src/makemon.c nethack-convict/src/makemon.c --- nethack/src/makemon.c 2011-05-27 10:06:55.396437143 -0400 +++ nethack-convict/src/makemon.c 2012-04-16 21:54:37.000000000 -0400 @@ -204,6 +204,9 @@ case PM_LIEUTENANT: w1 = rn2(2) ? BROADSWORD : LONG_SWORD; break; +#ifdef CONVICT + case PM_PRISON_GUARD: +#endif /* CONVICT */ case PM_CAPTAIN: case PM_WATCH_CAPTAIN: w1 = rn2(2) ? LONG_SWORD : SILVER_SABER; @@ -254,7 +257,14 @@ if(!rn2(2)) curse(otmp); (void) mpickobj(mtmp, otmp); } +#ifdef CONVICT + } else if (mm == PM_MINER) { + (void)mongets(mtmp, PICK_AXE); + otmp = mksobj(BRASS_LANTERN, TRUE, FALSE); + (void) mpickobj(mtmp, otmp); + begin_burn(otmp, FALSE); } +#endif /* CONVICT */ break; case S_ANGEL: @@ -506,6 +516,9 @@ switch(monsndx(ptr)) { case PM_GUARD: mac = -1; break; +#ifdef CONVICT + case PM_PRISON_GUARD: mac = -2; break; +#endif /* CONVICT */ case PM_SOLDIER: mac = 3; break; case PM_SERGEANT: mac = 0; break; case PM_LIEUTENANT: mac = -2; break; @@ -547,6 +560,9 @@ mac += 1 + mongets(mtmp, LEATHER_CLOAK); if(ptr != &mons[PM_GUARD] && +#ifdef CONVICT + ptr != &mons[PM_PRISON_GUARD] && +#endif /* CONVICT */ ptr != &mons[PM_WATCHMAN] && ptr != &mons[PM_WATCH_CAPTAIN]) { if (!rn2(3)) (void) mongets(mtmp, K_RATION); diff -burN nethack/src/mondata.c nethack-convict/src/mondata.c --- nethack/src/mondata.c 2011-05-27 10:06:55.396437143 -0400 +++ nethack-convict/src/mondata.c 2012-04-16 21:54:37.000000000 -0400 @@ -566,6 +566,10 @@ {PM_ORC, PM_ORC_CAPTAIN}, {PM_HILL_ORC, PM_ORC_CAPTAIN}, {PM_MORDOR_ORC, PM_ORC_CAPTAIN}, {PM_URUK_HAI, PM_ORC_CAPTAIN}, {PM_SEWER_RAT, PM_GIANT_RAT}, +#ifdef CONVICT + {PM_GIANT_RAT, PM_ENORMOUS_RAT}, + {PM_ENORMOUS_RAT, PM_RODENT_OF_UNUSUAL_SIZE}, +#endif /* CONVICT */ {PM_CAVE_SPIDER, PM_GIANT_SPIDER}, {PM_OGRE, PM_OGRE_LORD}, {PM_OGRE_LORD, PM_OGRE_KING}, {PM_ELF, PM_ELF_LORD}, {PM_WOODLAND_ELF, PM_ELF_LORD}, diff -burN nethack/src/monmove.c nethack-convict/src/monmove.c --- nethack/src/monmove.c 2011-05-27 10:06:55.396437143 -0400 +++ nethack-convict/src/monmove.c 2012-04-16 21:54:37.000000000 -0400 @@ -54,6 +54,15 @@ if(mtmp->mpeaceful && in_town(u.ux+u.dx, u.uy+u.dy) && mtmp->mcansee && m_canseeu(mtmp) && !rn2(3)) { +#ifdef CONVICT + if(Role_if(PM_CONVICT) && !Upolyd) { + verbalize("%s yells: Hey! You are the one from the wanted poster!", + Amonnam(mtmp)); + (void) angry_guards(!(flags.soundok)); + stop_occupation(); + return; + } +#endif /* CONVICT */ if(picking_lock(&x, &y) && IS_DOOR(levl[x][y].typ) && (levl[x][y].doormask & D_LOCKED)) { @@ -380,6 +389,9 @@ /* Demonic Blackmail! */ if(nearby && mdat->msound == MS_BRIBE && +#ifdef CONVICT + (monsndx(mdat) != PM_PRISON_GUARD) && +#endif /* CONVICT */ mtmp->mpeaceful && !mtmp->mtame && !u.uswallow) { if (mtmp->mux != u.ux || mtmp->muy != u.uy) { pline("%s whispers at thin air.", @@ -398,6 +410,26 @@ } else if(demon_talk(mtmp)) return(1); /* you paid it off */ } +#ifdef CONVICT + /* Prison guard extortion */ + if(nearby && (monsndx(mdat) == PM_PRISON_GUARD) && !mtmp->mpeaceful + && !mtmp->mtame && !u.uswallow && (!mtmp->mspec_used)) { + long gdemand = 500 * u.ulevel; + long goffer = 0; + + pline("%s demands %ld %s to avoid re-arrest.", Amonnam(mtmp), + gdemand, currency(gdemand)); + if ((goffer = bribe(mtmp)) >= gdemand) { + verbalize("Good. Now beat it, scum!"); + mtmp->mpeaceful = 1; + set_malign(mtmp); + } else { + pline("I said %ld!", gdemand); + mtmp->mspec_used = 1000; + } + } +#endif /* CONVICT */ + /* the watch will look around and see if you are up to no good :-) */ if (mdat == &mons[PM_WATCHMAN] || mdat == &mons[PM_WATCH_CAPTAIN]) watch_on_duty(mtmp); diff -burN nethack/src/monst.c nethack-convict/src/monst.c --- nethack/src/monst.c 2011-05-27 10:06:55.414508931 -0400 +++ nethack-convict/src/monst.c 2012-04-18 13:46:04.447377864 -0400 @@ -823,6 +823,22 @@ SIZ(40, 30, 0, MS_SQEEK, MZ_TINY), MR_POISON, 0, M1_NOHANDS|M1_POIS|M1_REGEN|M1_CARNIVORE, M2_NOPOLY|M2_WERE|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), +#ifdef CONVICT + MON("enormous rat", S_RODENT, + LVL(3, 9, 6, 0, 0), (G_GENO|G_SGROUP|1), + A(ATTK(AT_BITE, AD_PHYS, 1, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(200, 100, 0, MS_SQEEK, MZ_SMALL), 0, 0, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + CLR_BROWN), + MON("rodent of unusual size", S_RODENT, + LVL(7, 8, 4, 0, 0), (G_GENO|1), + A(ATTK(AT_BITE, AD_PHYS, 2, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(500, 200, 0, MS_SQEEK, MZ_MEDIUM), 0, 0, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + CLR_BROWN), +#endif /* CONVICT */ MON("rock mole", S_RODENT, LVL(3, 3, 0, 20, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 1, 6), @@ -2282,6 +2298,24 @@ M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), +#ifdef CONVICT + MON("miner", S_HUMAN, + LVL(2, 6, 10, 10, 4), (G_GENO|G_NOGEN), + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_TUNNEL|M1_NEEDPICK|M1_HUMANOID|M1_OMNIVORE, + M2_NOPOLY|M2_HUMAN|M2_STRONG, + M3_INFRAVISIBLE, CLR_GRAY), + MON("prison guard", S_HUMAN, + LVL(12, 10, 10, 15, -6), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, 0, MS_BRIBE, MZ_HUMAN), 0, 0, + M1_HUMANOID|M1_OMNIVORE, + M2_NOPOLY|M2_HUMAN|M2_MERC|M2_STALK|M2_HOSTILE|M2_STRONG|M2_COLLECT, + M3_INFRAVISIBLE, HI_METAL), +#endif /* CONVICT */ MON("wererat", S_HUMAN, LVL(2, 12, 10, 10, -7), (1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), @@ -2540,6 +2574,16 @@ M1_HUMANOID|M1_POIS|M1_SWIM, M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BLUE), +#ifdef CONVICT + MON("lava demon", S_DEMON, + LVL(12, 12,-8, 40, -7), (G_NOCORPSE|G_NOGEN), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_BITE, AD_PHYS, 1, 8), + ATTK(AT_BITE, AD_FIRE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN), MR_FIRE|MR_POISON, 0, + M1_HUMANOID|M1_POIS, + M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY|M2_COLLECT, + M3_INFRAVISIBLE|M3_INFRAVISION, CLR_RED), +#endif /* standard demons & devils */ MON("horned devil", S_DEMON, @@ -2550,7 +2594,7 @@ SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN), MR_FIRE|MR_POISON, 0, M1_POIS|M1_THICK_HIDE, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION, - CLR_BROWN), + CLR_RED), #ifdef SEDUCE # define SEDUCTION_ATTACKS \ A(ATTK(AT_BITE, AD_SSEX, 0, 0), ATTK(AT_CLAW, AD_PHYS, 1, 3), \ @@ -2951,6 +2995,15 @@ M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_FEMALE|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), +#ifdef CONVICT + MON("convict", S_HUMAN, + LVL(10, 12, 10, 1, 0), 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_HUMANOID, MZ_HUMAN), 0, 0, + M1_HUMANOID|M1_OMNIVORE, + M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), +#endif /* CONVICT */ MON("healer", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), @@ -3067,6 +3120,17 @@ M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), +#ifdef CONVICT + MON("Robert the Lifer", S_HUMAN, + LVL(20, 12, 0, 40, -20), (G_NOGEN|G_UNIQ), + 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_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| + M2_COLLECT|M2_MAGIC, + M3_CLOSE|M3_INFRAVISIBLE, HI_DOMESTIC), +#endif /* CONVICT */ #if 0 /* OBSOLETE */ /* Two for elves - one of each sex. */ @@ -3222,6 +3286,17 @@ M2_NOPOLY|M2_HOSTILE|M2_FEMALE|M2_STALK|M2_STRONG|M2_NASTY| M2_GREEDY|M2_JEWELS|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISIBLE, HI_LORD), +#ifdef CONVICT + MON("Warden Arianna", S_HUMAN, + LVL(20, 12, 0, 40, -14), (G_NOGEN|G_UNIQ|G_NOCORPSE), + A(ATTK(AT_WEAP, AD_PHYS, 1, 25), ATTK(AT_WEAP, AD_PHYS, 1, 25), + ATTK(AT_CLAW, AD_SAMU, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN), MR_FIRE|MR_POISON, 0, + M1_HUMANOID|M1_OMNIVORE, + M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_HOSTILE|M2_STRONG|M2_STALK| + M2_NASTY|M2_FEMALE|M2_COLLECT|M2_MAGIC, + M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISIBLE, HI_LORD), +#endif /* CONVICT */ #if 0 /* OBSOLETE */ MON("Goblin King", S_ORC, LVL(15, 12, 10, 0, -15), (G_NOGEN|G_UNIQ), @@ -3355,6 +3430,16 @@ M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), +#ifdef CONVICT + MON("inmate", S_HUMAN, + LVL(12, 12, 10, 0, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), + NO_ATTK, 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|M3_CLOSE, CLR_BLACK), +#endif /* CONVICT */ #if 0 /* OBSOLETE */ MON("High-elf", S_HUMAN, LVL(5, 12, 10, 10, -7), G_NOGEN, diff -burN nethack/src/objects.c nethack-convict/src/objects.c --- nethack/src/objects.c 2011-05-27 10:06:55.423709769 -0400 +++ nethack-convict/src/objects.c 2012-04-16 21:54:37.000000000 -0400 @@ -401,9 +401,13 @@ /* shirts */ ARMOR("Hawaiian shirt", (char *)0, 1, 0, 0, 0, 8, 0, 5, 3, 10, 0, ARM_SHIRT, CLOTH, CLR_MAGENTA), +# ifdef CONVICT +ARMOR("striped shirt", (char *)0, + 1, 0, 0, 0, 0, 0, 5, 2, 10, 0, ARM_SHIRT, CLOTH, CLR_GRAY), +# endif /* CONVICT */ ARMOR("T-shirt", (char *)0, 1, 0, 0, 0, 2, 0, 5, 2, 10, 0, ARM_SHIRT, CLOTH, CLR_WHITE), -#endif +#endif /* TOURIST */ /* cloaks */ /* 'cope' is not a spelling mistake... leave it be */ @@ -949,7 +953,11 @@ OBJECT(OBJ("statue", (char *)0), BITS(1,0,0,1,0,0,0,0,0,0,0,P_NONE,MINERAL), 0, ROCK_CLASS, 900, 0, 2500, 0, 20, 20, 0, 0, 2500, CLR_WHITE), +#ifdef CONVICT +OBJECT(OBJ("heavy iron ball", (char *)0), BITS(1,0,0,0,0,0,0,0,0,0,WHACK,P_FLAIL,IRON), 0, +#else OBJECT(OBJ("heavy iron ball", (char *)0), BITS(1,0,0,0,0,0,0,0,0,0,WHACK,P_NONE,IRON), 0, +#endif /* CONVICT */ BALL_CLASS, 1000, 0, 480, 10, 25, 25, 0, 0, 200, HI_METAL), /* +d4 when "very heavy" */ OBJECT(OBJ("iron chain", (char *)0), BITS(1,0,0,0,0,0,0,0,0,0,WHACK,P_NONE,IRON), 0, diff -burN nethack/src/objnam.c nethack-convict/src/objnam.c --- nethack/src/objnam.c 2011-05-27 10:06:55.416588540 -0400 +++ nethack-convict/src/objnam.c 2012-04-16 21:54:37.000000000 -0400 @@ -1508,7 +1508,8 @@ { "shoes", ARMOR_CLASS, LOW_BOOTS, IRON_SHOES }, { "cloak", ARMOR_CLASS, MUMMY_WRAPPING, CLOAK_OF_DISPLACEMENT }, #ifdef TOURIST - { "shirt", ARMOR_CLASS, HAWAIIAN_SHIRT, T_SHIRT }, + { "shirt", ARMOR_CLASS, HAWAIIAN_SHIRT, T_SHIRT + }, #endif { "dragon scales", ARMOR_CLASS, GRAY_DRAGON_SCALES, YELLOW_DRAGON_SCALES }, diff -burN nethack/src/options.c nethack-convict/src/options.c --- nethack/src/options.c 2011-05-27 10:06:55.438962841 -0400 +++ nethack-convict/src/options.c 2012-04-16 21:54:37.000000000 -0400 @@ -312,6 +312,10 @@ 12, DISP_IN_GAME }, { "race", "your starting race (e.g., Human, Elf)", PL_CSIZ, DISP_IN_GAME }, +#ifdef CONVICT + { "ratname", "the name of your (first) rat (e.g., ratname:Squeak)", + PL_PSIZ, DISP_IN_GAME }, +#endif /* CONVICT */ { "role", "your starting role (e.g., Barbarian, Valkyrie)", PL_CSIZ, DISP_IN_GAME }, { "runmode", "display frequency when `running' or `travelling'", @@ -1100,6 +1104,16 @@ return; } +#ifdef CONVICT + fullname = "ratname"; + if (match_optname(opts, fullname, 3, TRUE)) { + if (negated) bad_negation(fullname, FALSE); + else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) + nmcpy(ratname, op, PL_PSIZ); + return; + } +#endif /* CONVICT */ + fullname = "number_pad"; if (match_optname(opts, fullname, 10, TRUE)) { boolean compat = (strlen(opts) <= 10); @@ -3142,6 +3156,10 @@ } else if (!strcmp(optname, "race")) Sprintf(buf, "%s", rolestring(flags.initrace, races, noun)); +#ifdef CONVICT + else if (!strcmp(optname, "ratname")) + Sprintf(buf, "%s", ratname[0] ? catname : none ); +#endif /* CONVICT */ else if (!strcmp(optname, "role")) Sprintf(buf, "%s", rolestring(flags.initrole, roles, name.m)); else if (!strcmp(optname, "runmode")) diff -burN nethack/src/read.c nethack-convict/src/read.c --- nethack/src/read.c 2011-05-27 10:06:55.396437143 -0400 +++ nethack-convict/src/read.c 2012-04-16 21:54:37.000000000 -0400 @@ -1733,6 +1733,9 @@ punish(sobj) register struct obj *sobj; { +#ifdef CONVICT + struct obj *otmp; +#endif /* CONVICT */ /* KMH -- Punishment is still okay when you are riding */ You("are being punished for your misbehavior!"); if(Punished){ @@ -1746,7 +1749,17 @@ return; } setworn(mkobj(CHAIN_CLASS, TRUE), W_CHAIN); +#ifdef CONVICT + if (((otmp = carrying(HEAVY_IRON_BALL)) != 0) &&(otmp->oartifact == + ART_IRON_BALL_OF_LIBERATION)) { + setworn(otmp, W_BALL); + Your("%s chains itself to you!", xname(otmp)); + } else { + setworn(mkobj(BALL_CLASS, TRUE), W_BALL); + } +#else setworn(mkobj(BALL_CLASS, TRUE), W_BALL); +#endif /* CONVICT */ uball->spe = 1; /* special ball (see save) */ /* diff -burN nethack/src/role.c nethack-convict/src/role.c --- nethack/src/role.c 2011-05-27 10:06:55.385476528 -0400 +++ nethack-convict/src/role.c 2012-04-16 21:54:37.000000000 -0400 @@ -103,6 +103,34 @@ { 1, 0, 0, 1, 0, 1 },10, /* Energy */ 0, 12, 0, 1, 8, A_INT, SPE_DIG, -4 }, +#ifdef CONVICT +{ {"Convict", 0}, { + {"Detainee", 0}, + {"Inmate", 0}, + {"Jail-bird",0}, + {"Prisoner",0}, + {"Outlaw", 0}, + {"Crook", 0}, + {"Desperado", 0}, + {"Felon", 0}, + {"Fugitive", 0} }, + "Ilmater", "Grumbar", "_Tymora", /* Faerunian */ + "Con", "Castle Waterdeep Dungeon", "the Warden's Level", + PM_CONVICT, NON_PM, PM_SEWER_RAT, + PM_ROBERT_THE_LIFER, PM_INMATE, PM_WARDEN_ARIANNA, + PM_GIANT_BEETLE, PM_SOLDIER_ANT, S_RODENT, S_SPIDER, + ART_IRON_BALL_OF_LIBERATION, + MH_HUMAN|MH_DWARF|MH_GNOME|MH_ORC | ROLE_MALE|ROLE_FEMALE | + ROLE_CHAOTIC, + /* Str Int Wis Dex Con Cha */ + { 10, 7, 7, 7, 13, 6 }, + { 20, 20, 10, 20, 20, 10 }, + /* Init Lower Higher */ + { 8, 0, 0, 8, 0, 0 }, /* Hit points */ + { 1, 0, 0, 1, 0, 1 },10, /* Energy */ + -10, 5, 0, 2, 10, A_INT, SPE_TELEPORT_AWAY, -4 +}, +#endif /* CONVICT */ { {"Healer", 0}, { {"Rhizotomist", 0}, {"Empiric", 0}, diff -burN nethack/src/shk.c nethack-convict/src/shk.c --- nethack/src/shk.c 2011-05-27 10:06:55.417612562 -0400 +++ nethack-convict/src/shk.c 2012-04-16 21:54:37.000000000 -0400 @@ -553,6 +553,12 @@ verbalize("Invisible customers are not welcome!"); return; } +#ifdef CONVICT + /* Visible striped prison shirt */ + if ((uarmu && (uarmu->otyp == STRIPED_SHIRT)) && !uarm && !uarmc) { + eshkp->pbanned = TRUE; + } +#endif /* CONVICT */ rt = rooms[*enterstring - ROOMOFFSET].rtype; @@ -564,6 +570,9 @@ } else if (eshkp->robbed) { pline("%s mutters imprecations against shoplifters.", shkname(shkp)); } else { +#ifdef CONVICT + if (!eshkp->pbanned || inside_shop(u.ux, u.uy)) +#endif /* CONVICT */ verbalize("%s, %s! Welcome%s to %s %s!", Hello(shkp), plname, eshkp->visitct++ ? " again" : "", @@ -607,6 +616,11 @@ "Leave %s outside.", y_monnam(u.usteed)); should_block = TRUE; #endif +#ifdef CONVICT + } else if (eshkp->pbanned) { + verbalize("I don't sell to your kind here."); + should_block = TRUE; +#endif } else { should_block = (Fast && (sobj_at(PICK_AXE, u.ux, u.uy) || sobj_at(DWARVISH_MATTOCK, u.ux, u.uy))); @@ -1625,6 +1639,9 @@ else { numsk++; taken |= inherits(mtmp, numsk, croaked); +#ifdef CONVICT + ESHK(mtmp)->pbanned = FALSE; /* Un-ban for bones levels */ +#endif /* CONVICT */ } } } @@ -3274,6 +3291,9 @@ uondoor = (u.ux == eshkp->shd.x && u.uy == eshkp->shd.y); if(uondoor) { badinv = (carrying(PICK_AXE) || carrying(DWARVISH_MATTOCK) || +#ifdef CONVICT + eshkp->pbanned || +#endif /* CONVICT */ (Fast && (sobj_at(PICK_AXE, u.ux, u.uy) || sobj_at(DWARVISH_MATTOCK, u.ux, u.uy)))); if(satdoor && badinv) diff -burN nethack/src/sounds.c nethack-convict/src/sounds.c --- nethack/src/sounds.c 2011-05-27 10:06:55.406500830 -0400 +++ nethack-convict/src/sounds.c 2012-04-16 21:54:37.000000000 -0400 @@ -757,6 +757,29 @@ break; #endif case MS_BRIBE: +#ifdef CONVICT + if (monsndx(ptr) == PM_PRISON_GUARD) { + long gdemand = 500 * u.ulevel; + long goffer = 0; + + if (!mtmp->mpeaceful && !mtmp->mtame) { + pline("%s demands %ld %s to avoid re-arrest.", + Amonnam(mtmp), gdemand, currency(gdemand)); + if ((goffer = bribe(mtmp)) >= gdemand) { + verbl_msg = "Good. Now beat it, scum!"; + mtmp->mpeaceful = 1; + set_malign(mtmp); + break; + } else { + pline("I said %ld!", gdemand); + mtmp->mspec_used = 1000; + break; + } + } else { + verbl_msg = "Out of my way, scum!"; /* still a jerk */ + } + } else +#endif /* CONVICT */ if (mtmp->mpeaceful && !mtmp->mtame) { (void) demon_talk(mtmp); break; @@ -923,6 +946,25 @@ return (0); } +#ifdef CONVICT + if (Role_if(PM_CONVICT) && is_rat(mtmp->data) && !mtmp->mpeaceful && + !mtmp->mtame) { + You("attempt to soothe the %s with chittering sounds.", + l_monnam(mtmp)); + if (rnl(10) < 2) { + (void) tamedog(mtmp, (struct obj *) 0); + } else { + if (rnl(10) > 8) { + pline("%s unfortunately ignores your overtures.", + Monnam(mtmp)); + return 0; + } + mtmp->mpeaceful = 1; + set_malign(mtmp); + } + return 0; + } +#endif /* CONVICT */ return domonnoise(mtmp); } diff -burN nethack/src/timeout.c nethack-convict/src/timeout.c --- nethack/src/timeout.c 2011-05-27 10:06:55.436898037 -0400 +++ nethack-convict/src/timeout.c 2012-04-16 21:54:37.000000000 -0400 @@ -6,6 +6,9 @@ #include "lev.h" /* for checking save modes */ STATIC_DCL void NDECL(stoned_dialogue); +#ifdef CONVICT +STATIC_DCL void NDECL(phasing_dialogue); +#endif /* CONVICT */ STATIC_DCL void NDECL(vomiting_dialogue); STATIC_DCL void NDECL(choke_dialogue); STATIC_DCL void NDECL(slime_dialogue); @@ -39,6 +42,28 @@ exercise(A_DEX, FALSE); } +#ifdef CONVICT +STATIC_OVL void +phasing_dialogue() +{ + if (Phasing == 15) { + if (!Hallucination) { + Your("body is beginning to feel more solid."); + } else { + You_feel("more distant from the spirit world."); + } + stop_occupation(); + } else if (Phasing == 1) { + if (!Hallucination) { + Your("body is solid again."); + } else { + You_feel("totally separated from the spirit world."); + } + stop_occupation(); + } +} +#endif /* CONVICT */ + /* He is getting sicker and sicker prior to vomiting */ static NEARDATA const char * const vomiting_texts[] = { "are feeling mildly nauseated.", /* 14 */ @@ -182,6 +207,9 @@ else if(u.uluck < baseluck && (nostone || time_luck > 0)) u.uluck++; } +#ifdef CONVICT + if(Phasing) phasing_dialogue(); +#endif /* CONVICT */ if(u.uinvulnerable) return; /* things past this point could kill you */ if(Stoned) stoned_dialogue(); if(Slimed) slime_dialogue(); diff -burN nethack/src/uhitm.c nethack-convict/src/uhitm.c --- nethack/src/uhitm.c 2011-05-27 10:06:55.436898037 -0400 +++ nethack-convict/src/uhitm.c 2012-04-16 21:54:37.000000000 -0400 @@ -264,6 +264,16 @@ if (is_orc(mtmp->data) && maybe_polyd(is_elf(youmonst.data), Race_if(PM_ELF))) tmp++; +#ifdef CONVICT + /* Adding iron ball as a weapon skill gives a -4 penalty for + unskilled vs no penalty for non-weapon objects. Add 4 to + compensate. */ + if (uwep && (uwep->otyp == HEAVY_IRON_BALL)) { + tmp += 4; /* Compensate for iron ball weapon skill -4 + penalty for unskilled vs no penalty for non- + weapon objects. */ + } +#endif /* CONVICT */ if(Role_if(PM_MONK) && !Upolyd) { if (uarm) { Your("armor is rather cumbersome..."); @@ -563,7 +573,11 @@ } else { Strcpy(saved_oname, cxname(obj)); if(obj->oclass == WEAPON_CLASS || is_weptool(obj) || +#ifdef CONVICT + obj->oclass == GEM_CLASS || obj->otyp == HEAVY_IRON_BALL) { +#else obj->oclass == GEM_CLASS) { +#endif /* CONVICT */ /* is it not a melee weapon? */ if (/* if you strike with a bow... */ diff -burN nethack/src/u_init.c nethack-convict/src/u_init.c --- nethack/src/u_init.c 2011-05-27 10:06:55.437929880 -0400 +++ nethack-convict/src/u_init.c 2012-04-18 13:54:23.998404134 -0400 @@ -35,6 +35,7 @@ { TINNING_KIT, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS }, { TOUCHSTONE, 0, GEM_CLASS, 1, 0 }, { SACK, 0, TOOL_CLASS, 1, 0 }, + { 0, 0, 0, 0, 0 } }; static struct trobj Barbarian[] = { @@ -55,6 +56,13 @@ { LEATHER_ARMOR, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { 0, 0, 0, 0, 0 } }; +#ifdef CONVICT +static struct trobj Convict[] = { + { ROCK, 0, GEM_CLASS, 1, 0 }, + { STRIPED_SHIRT, 0, ARMOR_CLASS, 1, 0 }, + { 0, 0, 0, 0, 0 } +}; +#endif /* CONVICT */ static struct trobj Healer[] = { { SCALPEL, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, { LEATHER_GLOVES, 1, ARMOR_CLASS, 1, UNDEF_BLESS }, @@ -303,6 +311,20 @@ { P_NONE, 0 } }; +#ifdef CONVICT +static const struct def_skill Skill_Con[] = { + { P_DAGGER, P_SKILLED }, { P_KNIFE, P_EXPERT }, + { P_HAMMER, P_SKILLED }, { P_PICK_AXE, P_EXPERT }, + { P_CLUB, P_EXPERT }, { P_MACE, P_BASIC }, + { P_DART, P_SKILLED }, { P_FLAIL, P_EXPERT }, + { P_SHORT_SWORD, P_BASIC }, { P_SLING, P_SKILLED }, + { P_ATTACK_SPELL, P_BASIC }, { P_ESCAPE_SPELL, P_EXPERT }, + { P_TWO_WEAPON_COMBAT, P_SKILLED }, + { P_BARE_HANDED_COMBAT, P_SKILLED }, + { P_NONE, 0 } +}; +#endif /* CONVICT */ + static const struct def_skill Skill_H[] = { { P_DAGGER, P_SKILLED }, { P_KNIFE, P_EXPERT }, { P_SHORT_SWORD, P_SKILLED }, { P_SCIMITAR, P_BASIC }, @@ -628,6 +650,19 @@ ini_inv(Cave_man); skill_init(Skill_C); break; +#ifdef CONVICT + case PM_CONVICT: + ini_inv(Convict); + knows_object(SKELETON_KEY); + knows_object(GRAPPLING_HOOK); + skill_init(Skill_Con); + u.uhunger = 200; /* On the verge of hungry */ + u.ualignbase[A_CURRENT] = u.ualignbase[A_ORIGINAL] = + u.ualign.type = A_CHAOTIC; /* Override racial alignment */ + urace.hatemask |= urace.lovemask; /* Hated by the race's allies */ + urace.lovemask = 0; /* Convicts are pariahs of their race */ + break; +#endif /* CONVICT */ case PM_HEALER: #ifndef GOLDOBJ u.ugold = u.ugold0 = rn1(1000, 1001); @@ -787,6 +822,9 @@ case PM_ORC: /* compensate for generally inferior equipment */ if (!Role_if(PM_WIZARD)) +#ifdef CONVICT + if (!Role_if(PM_CONVICT)) +#endif /* CONVICT */ ini_inv(Xtra_food); /* Orcs can recognize all orcish objects */ knows_object(ORCISH_SHORT_SWORD); @@ -857,6 +895,9 @@ case PM_ARCHEOLOGIST: skills = Skill_A; break; case PM_BARBARIAN: skills = Skill_B; break; case PM_CAVEMAN: skills = Skill_C; break; +#ifdef CONVICT + case PM_CONVICT: skills = Skill_Con; break; +#endif /* CONVICT */ case PM_HEALER: skills = Skill_H; break; case PM_KNIGHT: skills = Skill_K; break; case PM_MONK: skills = Skill_Mon; break; @@ -998,6 +1039,11 @@ is_graystone(obj) && obj->otyp != FLINT) { obj->quan = 1L; } +#ifdef CONVICT + if (obj->otyp == STRIPED_SHIRT ) { + obj->cursed = TRUE; + } +#endif /* CONVICT */ if (trop->trspe != UNDEF_SPE) obj->spe = trop->trspe; if (trop->trbless != UNDEF_BLESS) diff -burN nethack/src/vault.c nethack-convict/src/vault.c --- nethack/src/vault.c 2011-05-27 10:06:55.403407255 -0400 +++ nethack-convict/src/vault.c 2012-04-16 21:54:37.000000000 -0400 @@ -250,6 +250,17 @@ mongone(guard); return; } +#ifdef CONVICT + if (Role_if(PM_CONVICT) && !Upolyd) { + setmangry(guard); + verbalize("I saw your pic on the wanted poster!"); + if (!MON_WEP(guard)) { + guard->weapon_check = NEED_HTH_WEAPON; + (void) mon_wield_item(guard); + } + return; + } +#endif /* CONVICT */ if (Strangled || is_silent(youmonst.data) || multi < 0) { /* [we ought to record whether this this message has already been given in order to vary it upon repeat visits, but diff -burN nethack/src/weapon.c nethack-convict/src/weapon.c --- nethack/src/weapon.c 2011-05-27 10:06:55.437929880 -0400 +++ nethack-convict/src/weapon.c 2012-04-16 21:54:37.000000000 -0400 @@ -1073,6 +1073,10 @@ if (!obj) /* Not using a weapon */ return (P_BARE_HANDED_COMBAT); +#ifdef CONVICT + if ((obj->otyp == HEAVY_IRON_BALL) && Role_if(PM_CONVICT)) + return objects[obj->otyp].oc_skill; +#endif /* CONVICT */ if (obj->oclass != WEAPON_CLASS && obj->oclass != TOOL_CLASS && obj->oclass != GEM_CLASS) /* Not a weapon, weapon-tool, or ammo */ diff -burN nethack/sys/unix/Makefile.dat nethack-convict/sys/unix/Makefile.dat --- nethack/sys/unix/Makefile.dat 2011-05-27 10:06:57.624640212 -0400 +++ nethack-convict/sys/unix/Makefile.dat 2012-04-16 21:54:37.000000000 -0400 @@ -116,12 +116,13 @@ touch spec_levs quest_levs: ../util/lev_comp \ - Arch.des Barb.des Caveman.des Healer.des Knight.des Monk.des \ + Arch.des Barb.des Caveman.des Convict.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 Caveman.des + ../util/lev_comp Convict.des ../util/lev_comp Healer.des ../util/lev_comp Knight.des ../util/lev_comp Monk.des diff -burN nethack/sys/winnt/Makefile.gcc nethack-convict/sys/winnt/Makefile.gcc --- nethack/sys/winnt/Makefile.gcc 2012-04-17 15:32:33.329538280 -0400 +++ nethack-convict/sys/winnt/Makefile.gcc 2012-04-16 21:54:37.000000000 -0400 @@ -523,7 +523,8 @@ $(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 \ - $(DAT)/tourist.des $(DAT)/valkyrie.des $(DAT)/wizard.des + $(DAT)/tourist.des $(DAT)/valkyrie.des $(DAT)/wizard.des \ + $(DAT)/convict.des $(subst /,\,$(U)lev_comp $(DAT)/bigroom.des) $(subst /,\,$(U)lev_comp $(DAT)/castle.des) $(subst /,\,$(U)lev_comp $(DAT)/endgame.des) @@ -548,6 +549,7 @@ $(subst /,\,$(U)lev_comp $(DAT)/tourist.des) $(subst /,\,$(U)lev_comp $(DAT)/valkyrie.des) $(subst /,\,$(U)lev_comp $(DAT)/wizard.des) + $(subst /,\,$(U)lev_comp $(DAT)/convict.des) $(subst /,\,copy *.lev $(DAT)) $(subst /,\,del *.lev) $(subst /,\,echo sp_levs done > $(O)sp_lev.tag) diff -burN nethack/win/share/monsters.txt nethack-convict/win/share/monsters.txt --- nethack/win/share/monsters.txt 2011-05-27 10:06:55.832955578 -0400 +++ nethack-convict/win/share/monsters.txt 2012-04-16 21:54:37.000000000 -0400 @@ -1781,6 +1781,44 @@ MMMMMMMMMMJJAMMM MMMMMMMMMMMMMMMM } +# tile 394 (enormous rat) +{ + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMKMMKMJKKKKKMMM + MMKKKKJKKKJKKKMM + MMJAKAKJKJJKKKJM + MMHAHAKJKJJKKKKM + MMAKAKJKKAKKAKKA + MKKJJJJKAJKAAKKA + MPJJAAKKAJJAJKAM + MMAAMKKAAMMJKAMM + MMMMMMMMMMJJAMMM + MMMMMMMMMMMMMMMM +} +# tile 395 (rodent of unusual size) +{ + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMKMMKMJKKKKKMMM + MMKKKKJKKKJKKKMM + MMJAKAKJKJJKKKJM + MMDADAKJKJJKKKKM + MMAKAKJKKAKKAKKA + MKKJJJJKAJKAAKKA + MPJJAAKKAJJAJKAM + MMAAMKKAAMMJKAMM + MMMMMMMMMMJJAMMM + MMMMMMMMMMMMMMMM +} # tile 93 (rock mole) { MMMMMMMMMMMMMMMM @@ -5011,6 +5049,44 @@ MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } +# tile 396 (miner) +{ + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMBPAMMMMMM + MMMMMMBPPPAMMMMM + MMMMMMPEEPAMMMMM + MMMMMMPLLPAMMMMM + MMPPMMMLLAAMMMMM + MPMMMMOAAOAMAAAM + PMJMMOOOOOOAAAAM + MMMJOAOOOOAOAAAM + MMMMLAOOOOALAAAM + MMMMMJOOOOAAAAMM + MMMMMMJLALAAMAMM + MMMMMLLAMLLAMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM +} +# tile 275 (prison guard) +{ + MMMMMMMMMMMMMMMM + MMMMMBBPPPAAMMMM + MMMMBNPPPPPPAMMM + MMMMBPPBPPPPAMMM + MMMMBAABPAAPAMMM + MMMMBCLBPCLPAMMM + MMMMAACPPCAAAAMM + MMMMBAAAAAAPAAAA + MMMBPAAKKAAPPAAA + MMBPPAAAAAAPPPAA + MMPPABAAAAPPAPPA + MMPPABPAAPPPAPPA + MMLCMBPPPPPPCLAA + MMLLMBPPABPPLLAA + MMMMMBPPABPPAAAA + MMMMBPPPMBPPPAAA +} # tile 263 (wererat) { MMMMMMMMMMMMMMMM @@ -5581,6 +5657,25 @@ MMMMEEAEEAMMMMMM MMMMMMMMMMMMMMMM } +# tile 397 (lava demon) +{ + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMCCMMMMMCCMMMMM + MCMCCMMMCCMCMMMM + MMMMCCCCCMMMMMMM + MMMMCDCDCMMAMMMM + MMMCCCCCCCAAAAMM + MMCCCAAACCCAAMAM + MMCCCCCCCCCAAAMM + MMCCACCCACCAAAMM + MMMAACCCAAAAAMMM + MMMMCCACCAAMMMMM + MMMMCCACCAMMMMMM + MMMMMMMMMMMMMMMM +} # tile 293 (horned devil) { MMMMMMMMMMMMMMMM @@ -6455,6 +6550,25 @@ MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } +# tile 398 (convict) +{ + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMHHAMMMMMM + MMMMMMAAAAAMMMMM + MMMMMMLJLJAMMMMM + MMMMMMLLLLAMMMMM + MMMMMMALLAMMMMMM + MMMMMHHAAHHMAAAM + MMMMAAAAAAAAAAAM + MMMMHAHHHHAHAAAM + MMMMAAAAAAAAAAAM + MMMMLAHHHHALAAAM + MMMMMMAJJAAAAAMM + MMMMMMHAAHAAMAMM + MMMMMLLAMLLAMMMM + MMMMMMMMMMMMMMMM +} # tile 339 (healer) { MMMMMMMMMMMMMMMM @@ -6759,6 +6873,25 @@ MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM } +# tile 399 (Robert the Lifer) +{ + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMCCAMMMMMM + MMMMMMAAAAAMMMMM + MMMMMMLJLJAMMMMM + MMMMMMLLLLAMMMMM + MMMMMMNLLNMMMMMM + MMMMMCNNNNCMAAAM + MMMMAAANNAAAAAAM + MMMMCACNNCACAAAM + MMMMAAAAAAAAAAAM + MMMMLACCCCALAAAM + MMMMMMAJJAAAAAMM + MMMMMMCAACAAMAMM + MMMMMLLAMLLAMMMM + MMMMMMMMMMMMMMMM +} # tile 355 (Hippocrates) { MMMMMMMMMMMMMMMM @@ -7025,6 +7158,25 @@ MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } +# tile 400 (Warden Arianna) +{ + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMCCCMMMMMMM + MMMMMCCCCCMMMMMM + MMMMMCFLFLCMMMMM + MMMMCCLLLLCMMMMM + MMMCCCALLAMMMMMM + MMMCJAJAAAJJAAAM + MMCCLJJAAJJLAAAM + MMCMLACAJCALAAAM + MMMMLAAAAAALAAAM + MMMMMMAAJAAAAAMM + MMMMMMAJAJAAMAMM + MMMMMALAMLAAMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM +} # tile 369 (Cyclops) { MMMMMMMMMMMMMMMM @@ -7272,6 +7424,25 @@ MMMMMMGFAFAAMMMM MMMMMKLAMLKAMMMM } +# tile 401 (inmate) +{ + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMOOAMMMMMM + MMMMMMAAAAAMMMMM + MMMMMMLJLJAMMMMM + MMMMMMLLLLAMMMMM + MMMMMMALLAMMMMMM + MMMMMOOAAOOMAAAM + MMMMAAAAAAAAAAAM + MMMMOAOOOOAOAAAM + MMMMAAAAAAAAAAAM + MMMMLAOOOOALAAAM + MMMMMMAJJAAAAAMM + MMMMMMOAAOAAMAMM + MMMMMLLAMLLAMMMM + MMMMMMMMMMMMMMMM +} # tile 382 (attendant) { MMMMMMMMMMMMMMMM diff -burN nethack/win/share/objects.txt nethack-convict/win/share/objects.txt --- nethack/win/share/objects.txt 2011-05-27 10:06:55.832955578 -0400 +++ nethack-convict/win/share/objects.txt 2012-04-16 21:54:37.000000000 -0400 @@ -2275,6 +2275,25 @@ MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } +# tile 435 (striped shirt) +{ + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMHMMMMMHMMMMM + MMMHHJJJJJHHMMMM + MMAAAHJJJHAAAMMM + MHHHHHHHHHHHHHMM + MMAAAAAAAAAAAAAM + MMMMHHHHHHHAAAMM + MMMMAAAAAAAAMMMM + MMMMHHHHHHHAMMMM + MMMMAAAAAAAAMMMM + MMMMHHHHHHHAMMMM + MMMMMAAAAAAAMMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM +} # tile 119 (mummy wrapping) { MMMMMMMMMMMMMMMM @@ -8279,3 +8298,4 @@ MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } +