Only in .: angband
diff -c -w -r \games\angb283/lib/edit/a_info.txt ./lib/edit/a_info.txt
*** \games\angb283/lib/edit/a_info.txt	Fri Jan 30 05:47:02 1998
--- ./lib/edit/a_info.txt	Mon Feb 23 17:32:16 1998
***************
*** 92,98 ****
  
  N:8:of Barahir
  I:45:32:1
! W:50:25:2:65000
  F:STR | INT | WIS | DEX | CON | CHR | STEALTH | HIDE_TYPE | 
  F:RES_POIS | 
  F:INSTA_ART
--- 92,98 ----
  
  N:8:of Barahir
  I:45:32:1
! W:50:2:2:65000
  F:STR | INT | WIS | DEX | CON | CHR | STEALTH | HIDE_TYPE | 
  F:RES_POIS | 
  F:INSTA_ART
***************
*** 102,108 ****
  
  N:9:of Tulkas
  I:45:33:4
! W:70:50:2:150000
  F:STR | DEX | CON | HIDE_TYPE | 
  F:ACTIVATE | 
  F:INSTA_ART
--- 102,108 ----
  
  N:9:of Tulkas
  I:45:33:4
! W:70:5:2:150000
  F:STR | DEX | CON | HIDE_TYPE | 
  F:ACTIVATE | 
  F:INSTA_ART
***************
*** 112,118 ****
  
  N:10:of Power (Narya)
  I:45:34:1
! W:70:30:2:100000
  F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | 
  F:ACTIVATE | FREE_ACT | SEE_INVIS | 
  F:SLOW_DIGEST | REGEN | 
--- 112,118 ----
  
  N:10:of Power (Narya)
  I:45:34:1
! W:70:3:2:100000
  F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | 
  F:ACTIVATE | FREE_ACT | SEE_INVIS | 
  F:SLOW_DIGEST | REGEN | 
***************
*** 124,130 ****
  
  N:11:of Power (Nenya)
  I:45:35:2
! W:80:40:2:200000
  F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | 
  F:ACTIVATE | HOLD_LIFE | FREE_ACT | SEE_INVIS | 
  F:FEATHER | REGEN | 
--- 124,130 ----
  
  N:11:of Power (Nenya)
  I:45:35:2
! W:80:4:2:200000
  F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | 
  F:ACTIVATE | HOLD_LIFE | FREE_ACT | SEE_INVIS | 
  F:FEATHER | REGEN | 
***************
*** 136,142 ****
  
  N:12:of Power (Vilya)
  I:45:36:3
! W:90:50:2:300000
  F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | 
  F:ACTIVATE | HOLD_LIFE | FREE_ACT | SEE_INVIS | 
  F:FEATHER | SLOW_DIGEST | REGEN | 
--- 136,142 ----
  
  N:12:of Power (Vilya)
  I:45:36:3
! W:90:5:2:300000
  F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | 
  F:ACTIVATE | HOLD_LIFE | FREE_ACT | SEE_INVIS | 
  F:FEATHER | SLOW_DIGEST | REGEN | 
***************
*** 149,155 ****
  
  N:13:of Power (The One Ring)
  I:45:37:5
! W:100:100:2:5000000
  F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | 
  F:ACTIVATE | LIGHT_CURSE | HEAVY_CURSE | PERMA_CURSE |
  F:AGGRAVATE | DRAIN_EXP | SEE_INVIS | REGEN |
--- 149,155 ----
  
  N:13:of Power (The One Ring)
  I:45:37:5
! W:100:1:2:5000000
  F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | 
  F:ACTIVATE | LIGHT_CURSE | HEAVY_CURSE | PERMA_CURSE |
  F:AGGRAVATE | DRAIN_EXP | SEE_INVIS | REGEN |
***************
*** 806,816 ****
  # The Long Sword 'Anduril'
  
  N:83:'Anduril'
! I:23:17:4
  W:20:40:130:80000
  P:0:2d5:10:15:5
! F:STR | HIDE_TYPE | 
! F:SLAY_EVIL | BRAND_FIRE | SLAY_TROLL | SLAY_ORC | FREE_ACT | 
  F:RES_FIRE | SUST_DEX | SEE_INVIS | ACTIVATE | SHOW_MODS
  
  
--- 806,816 ----
  # The Long Sword 'Anduril'
  
  N:83:'Anduril'
! I:23:17:5
  W:20:40:130:80000
  P:0:2d5:10:15:5
! F:STR | DEX | HIDE_TYPE |
! F:SLAY_EVIL | BRAND_FIRE | SLAY_TROLL | SLAY_ORC | FREE_ACT | SUST_STR |
  F:RES_FIRE | SUST_DEX | SEE_INVIS | ACTIVATE | SHOW_MODS
  
  
diff -c -w -r \games\angb283/lib/edit/k_info.txt ./lib/edit/k_info.txt
*** \games\angb283/lib/edit/k_info.txt	Fri Jan 30 05:47:14 1998
--- ./lib/edit/k_info.txt	Mon Feb 23 17:32:18 1998
***************
*** 6,11 ****
--- 6,12 ----
  
  # Do not modify this file unless you know exactly what you are doing,
  # unless you wish to risk possible system crashes and broken savefiles.
+ 
  # After modifying this file, delete the "lib/raw/k_info.raw" file.
  
  # Available slots (?):
***************
*** 1173,1219 ****
  A:30/1
  F:SEE_INVIS | EASY_KNOW
  
! N:156:Sustain Strength
! G:=:d
! I:45:10:0
! W:30:0:2:750
! A:30/1
! F:SUST_STR | EASY_KNOW
  
! N:157:Sustain Intelligence
! G:=:d
! I:45:11:0
! W:30:0:2:600
! A:30/1
! F:SUST_INT | EASY_KNOW
! 
! N:158:Sustain Wisdom
! G:=:d
! I:45:12:0
! W:30:0:2:600
! A:30/1
! F:SUST_WIS | EASY_KNOW
! 
! N:159:Sustain Constitution
! G:=:d
! I:45:13:0
! W:30:0:2:750
! A:30/1
! F:SUST_CON | EASY_KNOW
! 
! N:160:Sustain Dexterity
! G:=:d
! I:45:14:0
! W:30:0:2:750
! A:30/1
! F:SUST_DEX | EASY_KNOW
! 
! N:161:Sustain Charisma
! G:=:d
! I:45:15:0
! W:30:0:2:500
! A:30/1
! F:SUST_CHR | EASY_KNOW
  
  N:162:Slaying
  G:=:d
--- 1174,1222 ----
  A:30/1
  F:SEE_INVIS | EASY_KNOW
  
! # 156-161 deleted for psionics
  
! #N:156:Sustain Strength
! #G:=:d
! #I:45:10:0
! #W:30:0:2:750
! #A:30/1
! #F:SUST_STR | EASY_KNOW
! 
! #N:157:Sustain Intelligence
! #G:=:d
! #I:45:11:0
! #W:30:0:2:600
! #A:30/1
! #F:SUST_INT | EASY_KNOW
! 
! #N:158:Sustain Wisdom
! #G:=:d
! #I:45:12:0
! #W:30:0:2:600
! #A:30/1
! #F:SUST_WIS | EASY_KNOW
! 
! #N:159:Sustain Constitution
! #G:=:d
! #I:45:13:0
! #W:30:0:2:750
! #A:30/1
! #F:SUST_CON | EASY_KNOW
! 
! #N:160:Sustain Dexterity
! #G:=:d
! #I:45:14:0
! #W:30:0:2:750
! #A:30/1
! #F:SUST_DEX | EASY_KNOW
! 
! #N:161:Sustain Charisma
! #G:=:d
! #I:45:15:0
! #W:30:0:2:500
! #A:30/1
! #F:SUST_CHR | EASY_KNOW
  
  N:162:Slaying
  G:=:d
***************
*** 2746,2833 ****
  P:0:1d1:0:0:0
  F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
  
  
! ##### Junk #####
! 
! N:389:& Shard~ of Pottery
! G:~:r
! I:3:3:0
! W:0:0:5:0
! A:0/1
! P:0:1d1:0:0:0
! 
! N:390:& Broken Stick~
! G:~:r
! I:3:6:0
! W:0:0:3:0
! A:0/1
! P:0:1d1:0:0:0
! 
! 
! ##### Skeletons #####
! 
! N:391:& Broken Skull~
! G:~:w
! I:1:1:0
! W:0:0:1:0
! A:0/1
! P:0:1d1:0:0:0
! 
! N:392:& Broken Bone~
! G:~:w
! I:1:2:0
! W:0:0:2:0
! A:0/1
! P:0:1d1:0:0:0
  
! N:393:& Canine Skeleton~
! G:~:w
! I:1:4:0
! W:1:0:10:0
! A:1/1
  P:0:1d1:0:0:0
  
! N:394:& Rodent Skeleton~
! G:~:w
! I:1:3:0
! W:1:0:10:0
! A:1/1
  P:0:1d1:0:0:0
  
! N:395:& Human Skeleton~
! G:~:w
! I:1:8:0
! W:5:0:60:0
! A:5/1
! P:0:1d2:0:0:0
! 
! N:396:& Dwarf Skeleton~
! G:~:w
! I:1:7:0
! W:5:0:50:0
! A:5/1
! P:0:1d2:0:0:0
! 
! N:397:& Elf Skeleton~
! G:~:w
! I:1:6:0
! W:5:0:40:0
! A:5/1
  P:0:1d2:0:0:0
  
! N:398:& Gnome Skeleton~
! G:~:w
! I:1:5:0
! W:5:0:30:0
! A:5/1
  P:0:1d2:0:0:0
! 
! ## XXX 399 XXX ##
  
  
  ##### Dragon Scale Mail #####
  
! N:400:Black Dragon Scale Mail~
  G:[:s
  I:38:1:0
  W:60:0:200:30000
--- 2749,2917 ----
  P:0:1d1:0:0:0
  F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
  
+ ### 156-161 389-399
+ ### Psionics ###
  
! N:156:[Telepathy I]
! G:#:R
! I:92:0:2
! W:5:0:2:50
! A:2/1:7/1
! P:0:1d1:0:0:0
! F:WIS | CHR | PSI_ERASE | EASY_KNOW
! #O:WIS | CHR
! 
! N:157:[Telepathy II]
! G:#:r
! I:92:1:2
! W:20:0:2:750
! A:20/3
! F:WIS | CHR | INT | SUST_INT | SUST_WIS | EASY_KNOW | PSI_ERASE 
! #O:WIS | CHR | INT
! 
! N:158:[Telepathy III]
! G:#:y
! I:92:2:3
! W:50:0:2:2000
! A:50/7:70/3
! F:INT | WIS | CHR | SUST_INT | SUST_WIS | TELEPATHY | EASY_KNOW | PSI_ERASE 
! #O:INT | WIS | CHR | SUST_INT | SUST_WIS
! 
! N:159:[Psychoportation I]
! G:#:R
! I:92:3:0
! W:5:0:2:200
! A:3/1:10/1
! P:0:1d1:0:0:2
! F:PSI_ERASE | EASY_KNOW
! 
! N:160:[Psychoportation II]
! G:#:r
! I:92:4:2
! W:20:0:2:600
! A:20/4:40/1
! P:0:1d1:0:0:5
! F:DEX | PSI_ERASE | EASY_KNOW
! #O:DEX
! 
! N:161:[Psychoportation III]
! G:#:y
! I:92:5:6
! W:50:0:2:1500
! A:50/6:90/1
! P:0:1d1:0:0:10
! F:DEX | TELEPORT | PSI_ERASE | EASY_KNOW
! #O:DEX | TELEPORT
! 
! N:389:[Psychometabolism I]
! G:#:R
! I:92:6:2
! W:5:0:2:800
! A:5/1
! P:0:1d1:0:0:0
! F:CON | SUST_CON | SUST_STR | PSI_ERASE | EASY_KNOW
! #O:CON | SUST_CON | SUST_STR
! 
! N:390:[Psychometabolism II]
! G:#:r
! I:92:7:2
! W:40:0:2:850
! A:20/8:60/4
! F:STR | CON | SUST_STR | SUST_CON | SUST_DEX | PSI_ERASE | EASY_KNOW
! #O:STR | CON | SUST_STR | SUST_CON | SUST_DEX
! 
! N:391:[Psychometabolism III]
! G:#:y
! I:92:8:3
! W:70:0:2:900
! A:50/12:80/3
! F:STR | CON | DEX | SUST_STR | SUST_CON | SUST_DEX | HOLD_LIFE | PSI_ERASE |
! F:EASY_KNOW
! #O:STR | CON | DEX | SUST_STR | SUST_CON | SUST_DEX | HOLD_LIFE
  
! N:392:[Psychokinesis I]
! G:#:R
! I:92:9:0
! W:5:0:2:300
! A:5/2
! P:0:1d1:0:0:0
! F:RES_FORCE | PSI_ERASE | EASY_KNOW
! #O:RES_FORCE
! 
! N:393:[Psychokinesis II]
! G:#:r
! I:92:10:0
! W:20:0:2:2000
! A:20/4:40/1
! P:0:1d1:0:0:0
! F:RES_FORCE | RES_SHARD | RES_INERT | PSI_ERASE | EASY_KNOW
! #O:RES_FORCE | RES_SHARD | RES_INERT
! 
! N:394:[Psychokinesis III]
! G:#:y
! I:92:11:0
! W:55:0:2:20000
! A:45/8:99/1
! P:0:1d1:0:0:0
! F:RES_FORCE | RES_SHARD | RES_INERT | RES_GRAVT | PSI_ERASE | EASY_KNOW
! #O:RES_FORCE | RES_SHARD | RES_INERT | RES_GRAVT
! 
! N:395:[Metapsionics I]
! G:#:w
! I:92:12:0
! W:30:0:2:5000
! A:20/4:60/2
  P:0:1d1:0:0:0
+ F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | META_PSI1 |
+ F:EASY_KNOW
  
! N:396:[Metapsionics II]
! G:#;W
! I:92:13:0
! W:70:0:2:10000
! A:60/4:99/2
  P:0:1d1:0:0:0
+ F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | META_PSI2 |
+ F:EASY_KNOW
  
! N:397:[Metapsionics III]
! G:#:v
! I:92:14:0
! W:90:0:2:25000
! A:90/6
! F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD |
! F:META_PSI1 | META_PSI2 | EASY_KNOW
! 
! N:398:[Clairsentience I]
! G:#:R
! I:92:15:3
! W:3:0:2:100
! A:3/1
! F:SEARCH | PSI_ERASE | PSI_PSEUDO_ID | EASY_KNOW
! #O:SEARCH | PSI_PSEUDO_ID
! 
! N:399:[Clairsentience II]
! G:#:r
! I:92:16:4
! W:20:0:2:507
! A:20/4
  P:0:1d2:0:0:0
+ F:SEARCH | RES_BLIND | PSI_ERASE | PSI_PSEUDO_ID | EASY_KNOW
+ #O:SEARCH | RES_BLIND | PSI_PSEUDO_ID
  
! N:400:[Clairsentience III]
! G:#:y
! I:92:17:5
! W:50:0:2:4076
! A:40/7:60/3
  P:0:1d2:0:0:0
! F:SEARCH | RES_BLIND | TELEPATHY | PSI_ERASE | PSI_PSEUDO_ID | EASY_KNOW
! #O:SEARCH | RES_BLIND | TELEPATHY | PSI_PSEUDO_ID
  
  
  ##### Dragon Scale Mail #####
  
! N:413:Black Dragon Scale Mail~
  G:[:s
  I:38:1:0
  W:60:0:200:30000
***************
*** 2945,2951 ****
  F:RES_LITE | RES_DARK | RES_NEXUS | RES_NETHR | RES_CHAOS | 
  F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
  
! ## XXX 413 XXX ##
  
  ## XXX 414 XXX ##
  
--- 3029,3035 ----
  F:RES_LITE | RES_DARK | RES_NEXUS | RES_NETHR | RES_CHAOS | 
  F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
  
! ## XXX 413 is black dragon scale mail XXX ##
  
  ## XXX 414 XXX ##
  
Only in ./lib/edit: r_info.old
diff -c -w -r \games\angb283/lib/edit/r_info.txt ./lib/edit/r_info.txt
*** \games\angb283/lib/edit/r_info.txt	Fri Jan 30 05:47:20 1998
--- ./lib/edit/r_info.txt	Mon Feb 23 17:32:24 1998
***************
*** 2077,2083 ****
  F:INVISIBLE | COLD_BLOOD | PASS_WALL | 
  F:EVIL | UNDEAD | IM_COLD | NO_CONF | NO_SLEEP
  S:1_IN_15 | 
! S:TPORT | SCARE
  D:A ghostly apparition that shrieks horribly.
  
  N:168:Swordsman
--- 2077,2083 ----
  F:INVISIBLE | COLD_BLOOD | PASS_WALL | 
  F:EVIL | UNDEAD | IM_COLD | NO_CONF | NO_SLEEP
  S:1_IN_15 | 
! S:TPORT | SCARE | P_CRUSH
  D:A ghostly apparition that shrieks horribly.
  
  N:168:Swordsman
***************
*** 2126,2132 ****
  F:BASH_DOOR | 
  F:EVIL | IM_POIS
  S:1_IN_8 | 
! S:CONF | CAUSE_1 | DARKNESS
  D:A dark elven torso merged with the bloated form of a giant spider.
  
  N:172:Killer brown beetle
--- 2126,2132 ----
  F:BASH_DOOR | 
  F:EVIL | IM_POIS
  S:1_IN_8 | 
! S:CONF | CAUSE_1 | DARKNESS | M_WRACK
  D:A dark elven torso merged with the bloated form of a giant spider.
  
  N:172:Killer brown beetle
***************
*** 2189,2195 ****
  F:SMART | OPEN_DOOR | BASH_DOOR | 
  F:EVIL
  S:1_IN_3 | 
! S:HASTE | BLINK | TPORT | BLIND | HOLD | SLOW | CONF | DARKNESS
  D:A deceptive spell caster.
  
  N:177:Druid
--- 2189,2196 ----
  F:SMART | OPEN_DOOR | BASH_DOOR | 
  F:EVIL
  S:1_IN_3 | 
! S:HASTE | BLINK | TPORT | BLIND | HOLD | SLOW | CONF | DARKNESS |
! S:M_WRACK | P_CRUSH
  D:A deceptive spell caster.
  
  N:177:Druid
***************
*** 2203,2209 ****
  F:SMART | OPEN_DOOR | BASH_DOOR | 
  F:EVIL
  S:1_IN_3 | 
! S:HASTE | BLINK | BLIND | HOLD | SLOW | BO_FIRE | BO_ELEC
  D:A mystic at one with nature.  Om.
  
  N:178:Black orc
--- 2204,2211 ----
  F:SMART | OPEN_DOOR | BASH_DOOR | 
  F:EVIL
  S:1_IN_3 | 
! S:HASTE | BLINK | BLIND | HOLD | SLOW | BO_FIRE | BO_ELEC |
! S:P_WAVE | P_BLAST
  D:A mystic at one with nature.  Om.
  
  N:178:Black orc
***************
*** 2668,2674 ****
  F:SMART | INVISIBLE | COLD_BLOOD | BASH_DOOR | 
  F:EVIL | DEMON | IM_FIRE
  S:1_IN_10 | 
! S:BLINK | TPORT | TELE_TO | TELE_LEVEL | BLIND | CONF | SCARE
  D:The lawful evil master's favourite pet.
  
  N:214:Forest troll
--- 2670,2676 ----
  F:SMART | INVISIBLE | COLD_BLOOD | BASH_DOOR | 
  F:EVIL | DEMON | IM_FIRE
  S:1_IN_10 | 
! S:BLINK | TPORT | TELE_TO | TELE_LEVEL | BLIND | CONF | SCARE | P_CRUSH
  D:The lawful evil master's favourite pet.
  
  N:214:Forest troll
***************
*** 2698,2704 ****
  F:OPEN_DOOR | BASH_DOOR | 
  F:IM_FIRE | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
! S:HEAL | BLIND | CONF | CAUSE_2 | MIND_BLAST
  D:This dwarf became so obsessed by gold that Morgoth tricked him into 
  D:betraying his friends.
  
--- 2700,2706 ----
  F:OPEN_DOOR | BASH_DOOR | 
  F:IM_FIRE | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
! S:HEAL | BLIND | CONF | CAUSE_2 | MIND_BLAST | P_BLAST
  D:This dwarf became so obsessed by gold that Morgoth tricked him into 
  D:betraying his friends.
  
***************
*** 3135,3141 ****
  F:OPEN_DOOR | BASH_DOOR | 
  F:EVIL | HURT_LITE
  S:1_IN_5 | 
! S:HASTE | BLIND | CONF | DARKNESS | BO_FIRE | BO_COLD
  D:A dark elven figure in armour and radiating evil power.
  
  N:247:Cloud giant
--- 3137,3143 ----
  F:OPEN_DOOR | BASH_DOOR | 
  F:EVIL | HURT_LITE
  S:1_IN_5 | 
! S:HASTE | BLIND | CONF | DARKNESS | BO_FIRE | BO_COLD | M_WRACK
  D:A dark elven figure in armour and radiating evil power.
  
  N:247:Cloud giant
***************
*** 3209,3215 ****
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_5 | 
  S:BLIND | CONF | SCARE | CAUSE_2 | BO_FIRE | 
! S:S_MONSTER
  D:A strange creature that disguises itself as discarded objects to lure 
  D:unsuspecting adventurers within reach of its venomous claws.
  
--- 3211,3217 ----
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_5 | 
  S:BLIND | CONF | SCARE | CAUSE_2 | BO_FIRE | 
! S:S_MONSTER | P_WAVE
  D:A strange creature that disguises itself as discarded objects to lure 
  D:unsuspecting adventurers within reach of its venomous claws.
  
***************
*** 3501,3507 ****
  F:OPEN_DOOR | BASH_DOOR | 
  F:EVIL | IM_FIRE | IM_ELEC | NO_CONF | NO_SLEEP
  S:1_IN_4 | 
! S:SLOW | FORGET
  D:A Black Numenorean with a blacker heart.
  
  N:274:Angamaite of Umbar
--- 3503,3509 ----
  F:OPEN_DOOR | BASH_DOOR | 
  F:EVIL | IM_FIRE | IM_ELEC | NO_CONF | NO_SLEEP
  S:1_IN_4 | 
! S:SLOW | FORGET | P_CRUSH
  D:A Black Numenorean with a blacker heart.
  
  N:274:Angamaite of Umbar
***************
*** 3518,3524 ****
  F:OPEN_DOOR | BASH_DOOR | 
  F:EVIL | IM_FIRE | IM_ELEC | NO_CONF | NO_SLEEP
  S:1_IN_4 | 
! S:SLOW | FORGET
  D:A Black Numenorean who hates the men of the west.
  
  N:275:Banshee
--- 3520,3526 ----
  F:OPEN_DOOR | BASH_DOOR | 
  F:EVIL | IM_FIRE | IM_ELEC | NO_CONF | NO_SLEEP
  S:1_IN_4 | 
! S:SLOW | FORGET | M_WRACK
  D:A Black Numenorean who hates the men of the west.
  
  N:275:Banshee
***************
*** 3547,3553 ****
  F:HURT_ROCK | 
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_4 | 
! S:SLOW | CONF | BO_ACID
  D:A stumpy figure carved from stone, with glittering eyes, this sentinel 
  D:strides towards you with deadly intent.
  
--- 3549,3555 ----
  F:HURT_ROCK | 
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_4 | 
! S:SLOW | CONF | BO_ACID | BR_INSA
  D:A stumpy figure carved from stone, with glittering eyes, this sentinel 
  D:strides towards you with deadly intent.
  
***************
*** 3564,3570 ****
  F:OPEN_DOOR | BASH_DOOR | 
  F:EVIL | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
! S:HEAL | CONF | DARKNESS | 
  S:S_MONSTER | S_SPIDER
  D:A powerful dark elf, with mighty nature-controlling enchantments.
  
--- 3566,3572 ----
  F:OPEN_DOOR | BASH_DOOR | 
  F:EVIL | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
! S:HEAL | DARKNESS | P_WAVE | P_BLAST |
  S:S_MONSTER | S_SPIDER
  D:A powerful dark elf, with mighty nature-controlling enchantments.
  
***************
*** 3716,3722 ****
  F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | 
  F:IM_ACID | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
! S:BLIND | CONF | SCARE | FORGET
  D:A lesser angel wearing little more than a loincloth - its steely skin 
  D:provides all the protection it needs.
  
--- 3718,3724 ----
  F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | 
  F:IM_ACID | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
! S:BLIND | CONF | SCARE | FORGET | P_BLAST
  D:A lesser angel wearing little more than a loincloth - its steely skin 
  D:provides all the protection it needs.
  
***************
*** 3735,3741 ****
  F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_6 | 
! S:HEAL | SCARE | BO_ACID | BA_ACID
  D:The last of his race, Mim is a petty dwarf.  Petty dwarves are strange 
  D:creatures, powerful in sorcery and originating in the East.  They were 
  D:hunted to extinction by high elves.
--- 3737,3743 ----
  F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_6 | 
! S:HEAL | SCARE | BO_ACID | BA_ACID | P_WAVE
  D:The last of his race, Mim is a petty dwarf.  Petty dwarves are strange 
  D:creatures, powerful in sorcery and originating in the East.  They were 
  D:hunted to extinction by high elves.
***************
*** 3856,3862 ****
  F:OPEN_DOOR | BASH_DOOR | REGENERATE | 
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_9 | 
! S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS
  D:It is a humanoid with an aura of power.  You notice a sharp set of front 
  D:teeth.
  
--- 3858,3865 ----
  F:OPEN_DOOR | BASH_DOOR | REGENERATE | 
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_9 | 
! S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS |
! S:P_CRUSH | P_BLAST
  D:It is a humanoid with an aura of power.  You notice a sharp set of front 
  D:teeth.
  
***************
*** 3982,3991 ****
  B:GAZE:LOSE_INT:2d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_60 | DROP_1D2 | 
! F:OPEN_DOOR | BASH_DOOR | 
  F:EVIL | NO_CONF | NO_SLEEP
  S:1_IN_8 | 
! S:BLIND | HOLD | SCARE | MIND_BLAST | BRAIN_SMASH | FORGET
  D:A humanoid form with a gruesome head, tentacular mouth, and piercing 
  D:eyes.  Claws reach out for you and you feel a presence invade your mind.
  
--- 3985,3994 ----
  B:GAZE:LOSE_INT:2d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_60 | DROP_1D2 | 
! F:OPEN_DOOR | BASH_DOOR |  RES_PSI |
  F:EVIL | NO_CONF | NO_SLEEP
  S:1_IN_8 | 
! S:HOLD | SCARE | MIND_BLAST | BRAIN_SMASH | FORGET | P_BLAST | P_CRUSH
  D:A humanoid form with a gruesome head, tentacular mouth, and piercing 
  D:eyes.  Claws reach out for you and you feel a presence invade your mind.
  
***************
*** 4061,4067 ****
  F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | 
  F:IM_FIRE | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
! S:HEAL | HASTE | BLIND | CONF | SCARE
  D:A lesser angel protected by an aura of holiness.  Its muscular form looks 
  D:extremely powerful next to your own frail body.
  
--- 4064,4070 ----
  F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | 
  F:IM_FIRE | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
! S:HEAL | HASTE | BLIND | CONF | SCARE | P_CRUSH
  D:A lesser angel protected by an aura of holiness.  Its muscular form looks 
  D:extremely powerful next to your own frail body.
  
***************
*** 4162,4168 ****
  F:DRAGON | NO_CONF | NO_SLEEP
  S:1_IN_11 | 
  S:SCARE | 
! S:BR_CONF
  D:It has a form that legends are made of.  Its still-tender scales are a 
  D:rich bronze hue, and its shape masks its true form.
  
--- 4165,4171 ----
  F:DRAGON | NO_CONF | NO_SLEEP
  S:1_IN_11 | 
  S:SCARE | 
! S:BR_CONF | BR_INSA
  D:It has a form that legends are made of.  Its still-tender scales are a 
  D:rich bronze hue, and its shape masks its true form.
  
***************
*** 4184,4192 ****
  G:d:D
  I:110:20d10:25:50:30
  W:30:2:0:700
! B:BITE:COLD:1d6
! B:BITE:COLD:1d6
! B:BITE:COLD:1d6
  F:FORCE_SLEEP | RAND_25 | 
  F:ONLY_ITEM | DROP_2D2 | 
  F:TAKE_ITEM | INVISIBLE | OPEN_DOOR | BASH_DOOR | 
--- 4187,4195 ----
  G:d:D
  I:110:20d10:25:50:30
  W:30:2:0:700
! B:BITE:COLD:2d6
! B:BITE:COLD:2d6
! B:BITE:COLD:2d6
  F:FORCE_SLEEP | RAND_25 | 
  F:ONLY_ITEM | DROP_2D2 | 
  F:TAKE_ITEM | INVISIBLE | OPEN_DOOR | BASH_DOOR | 
***************
*** 4342,4348 ****
  F:ANIMAL | EVIL | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
  S:HEAL | BLIND | SLOW | CONF | SCARE | CAUSE_3 | CAUSE_4 | 
! S:TRAPS | 
  S:S_SPIDER
  D:Shelob is an enormous bloated spider, rumoured to have been one of the 
  D:brood of Ungoliant the Unlight.  Her poison is legendary, as is her ego, 
--- 4345,4351 ----
  F:ANIMAL | EVIL | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
  S:HEAL | BLIND | SLOW | CONF | SCARE | CAUSE_3 | CAUSE_4 | 
! S:TRAPS | P_CRUSH |
  S:S_SPIDER
  D:Shelob is an enormous bloated spider, rumoured to have been one of the 
  D:brood of Ungoliant the Unlight.  Her poison is legendary, as is her ego, 
***************
*** 4474,4480 ****
  W:33:3:0:700
  B:CLAW:HURT:1d8
  B:CLAW:HURT:1d8
! B:BITE:HURT:2d6
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | 
--- 4477,4483 ----
  W:33:3:0:700
  B:CLAW:HURT:1d8
  B:CLAW:HURT:1d8
! B:BITE:HURT:4d6
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | 
***************
*** 4483,4489 ****
  F:IM_FIRE | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
  S:SLOW | CONF | SCARE | 
! S:BR_DISE | BR_CHAO
  D:A dragon twisted by the forces of chaos.  It seems first ugly, then fair, 
  D:as its form shimmers and changes in front of your eyes.
  
--- 4486,4492 ----
  F:IM_FIRE | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
  S:SLOW | CONF | SCARE | 
! S:BR_DISE | BR_CHAO | BR_INSA
  D:A dragon twisted by the forces of chaos.  It seems first ugly, then fair, 
  D:as its form shimmers and changes in front of your eyes.
  
***************
*** 4493,4499 ****
  W:33:3:0:700
  B:CLAW:HURT:1d8
  B:CLAW:HURT:1d8
! B:BITE:HURT:2d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | 
  F:OPEN_DOOR | BASH_DOOR | 
--- 4496,4502 ----
  W:33:3:0:700
  B:CLAW:HURT:1d8
  B:CLAW:HURT:1d8
! B:BITE:HURT:3d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | 
  F:OPEN_DOOR | BASH_DOOR | 
***************
*** 4509,4517 ****
  G:d:v
  I:110:60d10:25:100:30
  W:33:3:0:700
! B:CLAW:HURT:1d8
! B:CLAW:HURT:1d8
! B:BITE:HURT:2d6
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | 
--- 4512,4520 ----
  G:d:v
  I:110:60d10:25:100:30
  W:33:3:0:700
! B:CLAW:HURT:2d8
! B:CLAW:HURT:2d8
! B:BITE:HURT:5d6
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | 
***************
*** 4530,4536 ****
  W:33:3:0:700
  B:CLAW:HURT:1d8
  B:CLAW:HURT:1d8
! B:BITE:HURT:2d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | 
  F:INVISIBLE | PASS_WALL | 
--- 4533,4539 ----
  W:33:3:0:700
  B:CLAW:HURT:1d8
  B:CLAW:HURT:1d8
! B:BITE:HURT:3d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | 
  F:INVISIBLE | PASS_WALL | 
***************
*** 4619,4625 ****
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_15 | 
! S:BLIND | HOLD | DRAIN_MANA | FORGET
  D:A phantasmal shrieking spirit.  Its wail drives the intense cold of pure 
  D:evil deep within your body.
  
--- 4622,4628 ----
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_15 | 
! S:BLIND | HOLD | DRAIN_MANA | FORGET | M_WRACK
  D:A phantasmal shrieking spirit.  Its wail drives the intense cold of pure 
  D:evil deep within your body.
  
***************
*** 4668,4674 ****
  F:NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:HEAL | HASTE | BLIND | SCARE | MIND_BLAST | BO_FIRE | 
! S:S_MONSTERS
  D:It is an angel moving very quickly, wielding a holy war hammer and casting 
  D:a volley of powerful spells in your direction.
  
--- 4671,4677 ----
  F:NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:HEAL | HASTE | BLIND | SCARE | MIND_BLAST | BO_FIRE | 
! S:S_MONSTERS | P_BLAST | P_WAVE
  D:It is an angel moving very quickly, wielding a holy war hammer and casting 
  D:a volley of powerful spells in your direction.
  
***************
*** 4753,4763 ****
  B:TOUCH:LOSE_DEX:2d8
  F:FORCE_SLEEP | FORCE_MAXHP | DROP_1D2 | 
  F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
! F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_4 | 
  S:BLINK | TELE_TO | TELE_AWAY | BLIND | HOLD | SLOW | SCARE | 
! S:CAUSE_3 | DRAIN_MANA | BRAIN_SMASH
  D:It is a skeletal form dressed in robes.  It radiates vastly evil power.
  
  N:357:Master vampire
--- 4756,4766 ----
  B:TOUCH:LOSE_DEX:2d8
  F:FORCE_SLEEP | FORCE_MAXHP | DROP_1D2 | 
  F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
! F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE |  RES_PSI |
  F:NO_CONF | NO_SLEEP
  S:1_IN_4 | 
  S:BLINK | TELE_TO | TELE_AWAY | BLIND | HOLD | SLOW | SCARE | 
! S:CAUSE_3 | DRAIN_MANA | BRAIN_SMASH | P_CRUSH
  D:It is a skeletal form dressed in robes.  It radiates vastly evil power.
  
  N:357:Master vampire
***************
*** 4774,4780 ****
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
  S:TELE_TO | HOLD | CONF | SCARE | CAUSE_3 | MIND_BLAST | FORGET | 
! S:DARKNESS | BO_NETH
  D:It is a humanoid form dressed in robes.  Power emanates from its chilling 
  D:frame.
  
--- 4777,4783 ----
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
  S:TELE_TO | HOLD | CONF | SCARE | CAUSE_3 | MIND_BLAST | FORGET | 
! S:DARKNESS | BO_NETH | P_CRUSH
  D:It is a humanoid form dressed in robes.  Power emanates from its chilling 
  D:frame.
  
***************
*** 4957,4963 ****
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_15 | 
! S:BLIND | HOLD | CONF | DRAIN_MANA | BO_NETH
  D:It is a form that screams its presence against the eye.  Death incarnate, 
  D:its hideous black body seems to struggle against reality as the universe 
  D:itself struggles to banish it.
--- 4960,4966 ----
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_15 | 
! S:BLIND | HOLD | CONF | DRAIN_MANA | BO_NETH | P_CRUSH
  D:It is a form that screams its presence against the eye.  Death incarnate, 
  D:its hideous black body seems to struggle against reality as the universe 
  D:itself struggles to banish it.
***************
*** 5000,5006 ****
  W:35:1:0:620
  B:CLAW:HURT:1d5
  B:CLAW:HURT:1d5
! B:BITE:HURT:1d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_60 | DROP_90 | DROP_1D2 | 
  F:OPEN_DOOR | BASH_DOOR | 
--- 5003,5009 ----
  W:35:1:0:620
  B:CLAW:HURT:1d5
  B:CLAW:HURT:1d5
! B:BITE:HURT:2d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_60 | DROP_90 | DROP_1D2 | 
  F:OPEN_DOOR | BASH_DOOR | 
***************
*** 5039,5045 ****
  W:35:1:0:1000
  B:CLAW:HURT:1d8
  B:CLAW:HURT:1d8
! B:BITE:HURT:2d8
  F:FORCE_SLEEP | FORCE_MAXHP | DROP_2D2 | 
  F:OPEN_DOOR | BASH_DOOR | 
  F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP
--- 5042,5048 ----
  W:35:1:0:1000
  B:CLAW:HURT:1d8
  B:CLAW:HURT:1d8
! B:BITE:HURT:3d8
  F:FORCE_SLEEP | FORCE_MAXHP | DROP_2D2 | 
  F:OPEN_DOOR | BASH_DOOR | 
  F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP
***************
*** 5121,5127 ****
  W:36:1:0:1320
  B:CLAW:HURT:1d9
  B:CLAW:HURT:1d9
! B:BITE:HURT:2d10
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_1D2 | DROP_4D2 | 
--- 5124,5130 ----
  W:36:1:0:1320
  B:CLAW:HURT:1d9
  B:CLAW:HURT:1d9
! B:BITE:HURT:3d10
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_1D2 | DROP_4D2 | 
***************
*** 5157,5163 ****
  W:36:2:0:950
  B:CLAW:HURT:1d8
  B:CLAW:HURT:1d8
! B:BITE:HURT:2d8
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_60 | DROP_90 | DROP_2D2 | 
  F:OPEN_DOOR | BASH_DOOR | 
--- 5160,5166 ----
  W:36:2:0:950
  B:CLAW:HURT:1d8
  B:CLAW:HURT:1d8
! B:BITE:HURT:3d8
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_60 | DROP_90 | DROP_2D2 | 
  F:OPEN_DOOR | BASH_DOOR | 
***************
*** 5207,5213 ****
  W:36:1:0:1100
  B:CLAW:HURT:1d4
  B:CLAW:HURT:1d4
! B:BITE:HURT:1d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_60 | DROP_90 | DROP_2D2 | 
  F:BASH_DOOR | 
--- 5210,5216 ----
  W:36:1:0:1100
  B:CLAW:HURT:1d4
  B:CLAW:HURT:1d4
! B:BITE:HURT:4d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_60 | DROP_90 | DROP_2D2 | 
  F:BASH_DOOR | 
***************
*** 5222,5228 ****
  I:110:44d10:20:70:150
  W:36:2:0:1300
  B:CLAW:HURT:1d8
! B:CLAW:HURT:1d8
  B:BITE:HURT:2d10
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_1D2 | DROP_4D2 | 
--- 5225,5231 ----
  I:110:44d10:20:70:150
  W:36:2:0:1300
  B:CLAW:HURT:1d8
! B:CLAW:HURT:2d8
  B:BITE:HURT:2d10
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_1D2 | DROP_4D2 | 
***************
*** 5230,5245 ****
  F:DRAGON | NO_CONF | NO_SLEEP
  S:1_IN_9 | 
  S:CONF | SCARE | 
! S:BR_CONF
  D:A large dragon with scales of rich bronze.
  
  N:387:Young red dragon
  G:d:r
  I:110:29d10:20:63:50
  W:36:1:0:640
! B:CLAW:HURT:1d8
! B:CLAW:HURT:1d8
! B:BITE:HURT:2d8
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_60 | DROP_90 | DROP_1D2 | 
  F:OPEN_DOOR | BASH_DOOR | 
--- 5233,5248 ----
  F:DRAGON | NO_CONF | NO_SLEEP
  S:1_IN_9 | 
  S:CONF | SCARE | 
! S:BR_CONF | BR_INSA
  D:A large dragon with scales of rich bronze.
  
  N:387:Young red dragon
  G:d:r
  I:110:29d10:20:63:50
  W:36:1:0:640
! B:CLAW:HURT:1d12
! B:CLAW:HURT:1d12
! B:BITE:HURT:4d8
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_60 | DROP_90 | DROP_1D2 | 
  F:OPEN_DOOR | BASH_DOOR | 
***************
*** 5325,5331 ****
  F:UNIQUE | MALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | 
! F:OPEN_DOOR | BASH_DOOR | 
  F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_4 | 
--- 5328,5334 ----
  F:UNIQUE | MALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | 
! F:OPEN_DOOR | BASH_DOOR |  RES_PSI |
  F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_4 | 
***************
*** 5397,5403 ****
  F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_2 | 
! S:BLINK | TPORT | CONF | CAUSE_2
  D:A strange ball of glowing light.  It disappears and reappears and seems to 
  D:draw you to it.  You seem somehow compelled to stand still and watch its 
  D:strange dancing motion.
--- 5400,5406 ----
  F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_2 | 
! S:BLINK | TPORT | CONF | CAUSE_2 | P_BLAST
  D:A strange ball of glowing light.  It disappears and reappears and seems to 
  D:draw you to it.  You seem somehow compelled to stand still and watch its 
  D:strange dancing motion.
***************
*** 5479,5487 ****
  G:d:r
  I:110:48d10:20:80:30
  W:37:1:0:1400
- B:CLAW:HURT:1d4
  B:CLAW:HURT:1d10
! B:BITE:HURT:2d12
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_1D2 | DROP_4D2 | 
  F:BASH_DOOR | 
--- 5482,5490 ----
  G:d:r
  I:110:48d10:20:80:30
  W:37:1:0:1400
  B:CLAW:HURT:1d10
! B:CLAW:HURT:1d10
! B:BITE:HURT:2d20
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_1D2 | DROP_4D2 | 
  F:BASH_DOOR | 
***************
*** 5495,5503 ****
  G:d:y
  I:110:56d10:20:80:150
  W:37:2:0:1500
- B:CLAW:HURT:1d4
  B:CLAW:HURT:1d10
! B:BITE:HURT:2d12
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_1D2 | DROP_4D2 | 
  F:BASH_DOOR | 
--- 5498,5506 ----
  G:d:y
  I:110:56d10:20:80:150
  W:37:2:0:1500
  B:CLAW:HURT:1d10
! B:CLAW:HURT:1d10
! B:BITE:HURT:2d20
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_1D2 | DROP_4D2 | 
  F:BASH_DOOR | 
***************
*** 5511,5519 ****
  G:d:v
  I:120:50d10:25:100:30
  W:37:2:0:1500
! B:CLAW:HURT:1d4
! B:CLAW:HURT:1d4
! B:BITE:HURT:2d5
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_4D2 | 
--- 5514,5522 ----
  G:d:v
  I:120:50d10:25:100:30
  W:37:2:0:1500
! B:CLAW:HURT:1d5
! B:CLAW:HURT:1d5
! B:BITE:HURT:4d5
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_4D2 | 
***************
*** 5529,5537 ****
  G:d:s
  I:110:46d10:20:55:30
  W:37:1:0:1350
! B:CLAW:HURT:1d8
! B:CLAW:HURT:1d8
! B:BITE:HURT:2d10
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_60 | DROP_90 | DROP_2D2 | 
  F:BASH_DOOR | 
--- 5532,5540 ----
  G:d:s
  I:110:46d10:20:55:30
  W:37:1:0:1350
! B:CLAW:HURT:1d12
! B:CLAW:HURT:1d12
! B:BITE:HURT:2d20
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_60 | DROP_90 | DROP_2D2 | 
  F:BASH_DOOR | 
***************
*** 5545,5553 ****
  G:d:v
  I:110:64d10:20:65:50
  W:38:2:0:1700
! B:CLAW:HURT:1d10
! B:CLAW:HURT:1d10
! B:BITE:HURT:2d12
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
--- 5548,5556 ----
  G:d:v
  I:110:64d10:20:65:50
  W:38:2:0:1700
! B:CLAW:HURT:1d12
! B:CLAW:HURT:1d12
! B:BITE:HURT:2d22
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
***************
*** 5572,5578 ****
  F:EVIL | IM_COLD
  S:1_IN_5 | 
  S:BLIND | SCARE | CAUSE_3 | BO_NETH | 
! S:S_MONSTERS
  D:It is a humanoid form dressed in armour of an ancient form.  From beneath 
  D:its helmet, eyes glow a baleful red and seem to pierce you like lances of 
  D:fire.
--- 5575,5581 ----
  F:EVIL | IM_COLD
  S:1_IN_5 | 
  S:BLIND | SCARE | CAUSE_3 | BO_NETH | 
! S:S_MONSTERS | P_BLAST
  D:It is a humanoid form dressed in armour of an ancient form.  From beneath 
  D:its helmet, eyes glow a baleful red and seem to pierce you like lances of 
  D:fire.
***************
*** 5591,5597 ****
  F:SMART | OPEN_DOOR | TAKE_ITEM | BASH_DOOR | 
  F:EVIL
  S:1_IN_2 | 
! S:HEAL | TRAPS | BO_FIRE | BO_COLD | BO_ELEC | BO_ICEE
  D:A Black Numenorean who usurped the throne of Gondor, he is treacherous and 
  D:evil.
  
--- 5594,5600 ----
  F:SMART | OPEN_DOOR | TAKE_ITEM | BASH_DOOR | 
  F:EVIL
  S:1_IN_2 | 
! S:HEAL | TRAPS | BO_FIRE | BO_COLD | BO_ELEC | BO_ICEE | P_WAVE
  D:A Black Numenorean who usurped the throne of Gondor, he is treacherous and 
  D:evil.
  
***************
*** 5627,5635 ****
  G:D:b
  I:120:70d10:20:80:80
  W:38:1:0:1500
! B:CLAW:HURT:1d8
! B:CLAW:HURT:1d8
! B:BITE:HURT:2d8
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_1D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
--- 5630,5638 ----
  G:D:b
  I:120:70d10:20:80:80
  W:38:1:0:1500
! B:CLAW:HURT:2d8
! B:CLAW:HURT:2d8
! B:BITE:HURT:4d9
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_1D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
***************
*** 5643,5658 ****
  G:D:U
  I:120:73d10:20:100:200
  W:38:2:0:1700
! B:CLAW:HURT:1d8
! B:CLAW:HURT:1d8
! B:BITE:HURT:2d10
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
  F:DRAGON | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
  S:BLIND | CONF | SCARE | 
! S:BR_CONF
  D:A huge draconic form enveloped in a cascade of colour.
  
  N:413:Beholder
--- 5646,5661 ----
  G:D:U
  I:120:73d10:20:100:200
  W:38:2:0:1700
! B:CLAW:HURT:2d8
! B:CLAW:HURT:2d8
! B:BITE:HURT:4d10
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
  F:DRAGON | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
  S:BLIND | CONF | SCARE | 
! S:BR_CONF | BR_INSA
  D:A huge draconic form enveloped in a cascade of colour.
  
  N:413:Beholder
***************
*** 5668,5674 ****
  F:EVIL | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
  S:BLIND | SLOW | CONF | SCARE | DRAIN_MANA | MIND_BLAST | FORGET | 
! S:DARKNESS | BO_ACID | BO_FIRE | BO_COLD
  D:A disembodied eye, surrounded by twelve smaller eyes on stalks.
  
  N:414:Emperor wight
--- 5671,5677 ----
  F:EVIL | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
  S:BLIND | SLOW | CONF | SCARE | DRAIN_MANA | MIND_BLAST | FORGET | 
! S:DARKNESS | BO_ACID | BO_FIRE | BO_COLD | P_CRUSH | P_BLAST | M_WRACK
  D:A disembodied eye, surrounded by twelve smaller eyes on stalks.
  
  N:414:Emperor wight
***************
*** 5684,5690 ****
  F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
! S:HOLD | SCARE | CAUSE_3 | BO_NETH
  D:Your life force is torn from your body as this powerful unearthly being 
  D:approaches.
  
--- 5687,5693 ----
  F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
! S:HOLD | SCARE | CAUSE_3 | BO_NETH | P_BLAST
  D:Your life force is torn from your body as this powerful unearthly being 
  D:approaches.
  
***************
*** 5697,5709 ****
  B:HIT:HURT:5d5
  B:HIT:HURT:4d6
  F:FORCE_SLEEP | FORCE_MAXHP | SMART | 
! F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | 
  F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | 
  F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_11 | 
  S:HEAL | HASTE | TELE_AWAY | CONF | BO_MANA | BO_PLAS | 
! S:S_MONSTERS | S_ANGEL
  D:It is an angel, fast and strong.  You are stunned by its extreme holiness 
  D:and try to resist all desires to obey it.
  
--- 5700,5712 ----
  B:HIT:HURT:5d5
  B:HIT:HURT:4d6
  F:FORCE_SLEEP | FORCE_MAXHP | SMART | 
! F:ONLY_ITEM | DROP_1D2 | DROP_2D2 |  RES_PSI |
  F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | 
  F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_11 | 
  S:HEAL | HASTE | TELE_AWAY | CONF | BO_MANA | BO_PLAS | 
! S:S_MONSTERS | S_ANGEL | P_WAVE | M_WRACK | P_CRUSH
  D:It is an angel, fast and strong.  You are stunned by its extreme holiness 
  D:and try to resist all desires to obey it.
  
***************
*** 5773,5779 ****
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | 
  F:HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
! S:BLIND | SCARE | CAUSE_3 | MIND_BLAST | DARKNESS | BO_NETH
  D:A form that hurts the eye, death permeates the air around it.  As it nears 
  D:you, a coldness saps your soul.
  
--- 5776,5782 ----
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | 
  F:HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_6 | 
! S:BLIND | SCARE | CAUSE_3 | MIND_BLAST | DARKNESS | BO_NETH | P_CRUSH
  D:A form that hurts the eye, death permeates the air around it.  As it nears 
  D:you, a coldness saps your soul.
  
***************
*** 5826,5835 ****
  G:d:v
  I:120:13d100:20:85:30
  W:39:3:0:3000
! B:BITE:HURT:2d12
! B:BITE:HURT:2d12
! B:BITE:HURT:2d12
! B:BITE:HURT:2d12
  F:UNIQUE | MALE | ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | 
--- 5829,5838 ----
  G:d:v
  I:120:13d100:20:85:30
  W:39:3:0:3000
! B:BITE:HURT:3d12
! B:BITE:HURT:3d12
! B:BITE:HURT:3d12
! B:BITE:HURT:3d12
  F:UNIQUE | MALE | ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | 
***************
*** 5838,5844 ****
  F:NO_CONF | NO_SLEEP
  S:1_IN_4 | 
  S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_SOUN | BR_CONF | 
! S:BR_SHAR | BR_GRAV | BR_NEXU
  D:A large dragon with a selection of heads, all shouting and arguing as they 
  D:look for prey, but each with its own deadly breath weapon.
  
--- 5841,5847 ----
  F:NO_CONF | NO_SLEEP
  S:1_IN_4 | 
  S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_SOUN | BR_CONF | 
! S:BR_SHAR | BR_GRAV | BR_NEXU | BR_INSA
  D:A large dragon with a selection of heads, all shouting and arguing as they 
  D:look for prey, but each with its own deadly breath weapon.
  
***************
*** 5846,5854 ****
  G:D:w
  I:120:70d10:20:90:80
  W:39:1:0:2500
! B:CLAW:HURT:1d9
! B:CLAW:HURT:1d9
! B:BITE:HURT:2d12
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
--- 5849,5857 ----
  G:D:w
  I:120:70d10:20:90:80
  W:39:1:0:2500
! B:CLAW:HURT:2d9
! B:CLAW:HURT:2d9
! B:BITE:HURT:4d12
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
***************
*** 5862,5870 ****
  G:D:g
  I:120:72d10:20:85:80
  W:39:1:0:2400
! B:CLAW:HURT:1d8
! B:CLAW:HURT:1d8
! B:BITE:HURT:2d10
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
--- 5865,5873 ----
  G:D:g
  I:120:72d10:20:85:80
  W:39:1:0:2400
! B:CLAW:HURT:2d8
! B:CLAW:HURT:2d8
! B:BITE:HURT:4d10
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
***************
*** 5921,5936 ****
  F:NO_CONF | NO_SLEEP
  S:1_IN_7 | 
  S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA | 
! S:BRAIN_SMASH | DARKNESS | BO_NETH
  D:A foul wind chills your bones as this ghastly figure approaches.
  
  N:429:Ancient black dragon
  G:D:s
  I:120:72d10:20:90:70
  W:39:1:0:2500
! B:CLAW:HURT:1d9
! B:CLAW:HURT:1d9
! B:BITE:HURT:2d10
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
--- 5924,5939 ----
  F:NO_CONF | NO_SLEEP
  S:1_IN_7 | 
  S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA | 
! S:BRAIN_SMASH | DARKNESS | BO_NETH | P_CRUSH | M_WRACK
  D:A foul wind chills your bones as this ghastly figure approaches.
  
  N:429:Ancient black dragon
  G:D:s
  I:120:72d10:20:90:70
  W:39:1:0:2500
! B:CLAW:HURT:2d9
! B:CLAW:HURT:2d9
! B:BITE:HURT:4d10
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
***************
*** 5973,5979 ****
  B:HIT:HURT:3d5
  F:FORCE_MAXHP | 
  F:DROP_90 | 
! F:INVISIBLE | PASS_WALL | 
  F:EVIL | TROLL | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  D:A weird troll from the elemental planes.
--- 5976,5982 ----
  B:HIT:HURT:3d5
  F:FORCE_MAXHP | 
  F:DROP_90 | 
! F:INVISIBLE | PASS_WALL |  RES_PSI |
  F:EVIL | TROLL | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  D:A weird troll from the elemental planes.
***************
*** 5992,5998 ****
  F:EVIL | GIANT
  S:1_IN_3 | 
  S:HEAL | TELE_TO | SCARE | 
! S:S_MONSTERS
  D:It is a humanoid figure thirty feet tall that gives off an aura of power 
  D:and hate.
  
--- 5995,6001 ----
  F:EVIL | GIANT
  S:1_IN_3 | 
  S:HEAL | TELE_TO | SCARE | 
! S:S_MONSTERS | P_BLAST
  D:It is a humanoid figure thirty feet tall that gives off an aura of power 
  D:and hate.
  
***************
*** 6039,6050 ****
  B:HIT:HURT:3d4
  B:HIT:HURT:3d5
  F:MALE | 
! F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_90 | DROP_2D2 | 
  F:SMART | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:HEAL | BLIND | HOLD | CONF | CAUSE_3 | 
  S:S_MONSTER | S_UNDEAD
  D:An evil priest, dressed all in black.  Deadly spells hit you at an 
  D:alarming rate as his black spiked mace rains down blow after blow on your 
--- 6042,6053 ----
  B:HIT:HURT:3d4
  B:HIT:HURT:3d5
  F:MALE | 
! F:FORCE_SLEEP | FORCE_MAXHP |  RES_PSI |
  F:ONLY_ITEM | DROP_90 | DROP_2D2 | 
  F:SMART | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:HEAL | BLIND | HOLD | P_BLAST | P_WAVE | CAUSE_3 |
  S:S_MONSTER | S_UNDEAD
  D:An evil priest, dressed all in black.  Deadly spells hit you at an 
  D:alarming rate as his black spiked mace rains down blow after blow on your 
***************
*** 6061,6069 ****
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_90 | DROP_4D2 | 
  F:OPEN_DOOR | BASH_DOOR | 
! F:EVIL | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:BLINK | TELE_TO | BLIND | CONF | CAUSE_3 | TRAPS | 
  S:BO_ACID | BA_FIRE | BA_COLD | 
  S:S_MONSTER | S_UNDEAD | S_DRAGON
  D:A human figure in robes, he moves with magically improved speed, and his 
--- 6064,6072 ----
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_90 | DROP_4D2 | 
  F:OPEN_DOOR | BASH_DOOR | 
! F:EVIL | NO_CONF | NO_SLEEP | RES_PSI
  S:1_IN_2 | 
! S:BLINK | TELE_TO | BLIND | P_CRUSH | CAUSE_3 | TRAPS |
  S:BO_ACID | BA_FIRE | BA_COLD | 
  S:S_MONSTER | S_UNDEAD | S_DRAGON
  D:A human figure in robes, he moves with magically improved speed, and his 
***************
*** 6139,6145 ****
  F:EVIL | IM_ACID | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
  S:HOLD | SCARE | CAUSE_3 | BO_FIRE | BO_PLAS | BA_ACID | 
! S:S_HYDRA
  D:One of the original three ugly sisters.  Her face could sink a thousand 
  D:ships.  Her scales rattle as she slithers towards you, venom dripping from 
  D:her ghastly mouth.
--- 6142,6148 ----
  F:EVIL | IM_ACID | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
  S:HOLD | SCARE | CAUSE_3 | BO_FIRE | BO_PLAS | BA_ACID | 
! S:S_HYDRA | M_WRACK | P_CRUSH | P_BLAST
  D:One of the original three ugly sisters.  Her face could sink a thousand 
  D:ships.  Her scales rattle as she slithers towards you, venom dripping from 
  D:her ghastly mouth.
***************
*** 6148,6157 ****
  G:D:G
  I:120:10d100:25:100:30
  W:40:2:0:3500
! B:CLAW:HURT:1d10
! B:CLAW:HURT:1d10
! B:BITE:EXP_80:1d6
! B:BITE:EXP_80:1d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | 
  F:INVISIBLE | TAKE_ITEM | 
--- 6151,6160 ----
  G:D:G
  I:120:10d100:25:100:30
  W:40:2:0:3500
! B:CLAW:HURT:4d10
! B:CLAW:HURT:4d10
! B:BITE:EXP_80:4d6
! B:BITE:EXP_80:4d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | 
  F:INVISIBLE | TAKE_ITEM | 
***************
*** 6167,6175 ****
  G:D:r
  I:120:10d100:20:100:70
  W:40:1:0:2750
! B:CLAW:HURT:1d10
! B:CLAW:HURT:1d10
! B:BITE:HURT:2d14
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
--- 6170,6178 ----
  G:D:r
  I:120:10d100:20:100:70
  W:40:1:0:2750
! B:CLAW:HURT:2d10
! B:CLAW:HURT:2d10
! B:BITE:HURT:4d14
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
***************
*** 6184,6192 ****
  G:D:y
  I:120:15d100:20:100:200
  W:40:2:0:4000
! B:CLAW:HURT:1d10
! B:CLAW:HURT:1d10
! B:BITE:HURT:2d14
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
--- 6187,6195 ----
  G:D:y
  I:120:15d100:20:100:200
  W:40:2:0:4000
! B:CLAW:HURT:2d10
! B:CLAW:HURT:2d10
! B:BITE:HURT:4d14
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:DROP_3D2 | DROP_4D2 | 
  F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | 
***************
*** 6200,6208 ****
  G:D:v
  I:120:15d100:25:100:30
  W:40:2:0:3500
! B:CLAW:HURT:1d9
! B:CLAW:HURT:1d9
! B:BITE:HURT:2d12
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | 
--- 6203,6211 ----
  G:D:v
  I:120:15d100:25:100:30
  W:40:2:0:3500
! B:CLAW:HURT:4d9
! B:CLAW:HURT:4d9
! B:BITE:HURT:8d12
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | 
***************
*** 6265,6271 ****
  S:1_IN_3 | 
  S:BLIND | HOLD | SCARE | CAUSE_3 | FORGET | 
  S:BO_ACID | BO_FIRE | BO_COLD | BO_NETH | 
! S:S_MONSTER
  D:A sorceress in life, Adunaphel quickly fell under Sauron's sway and the 
  D:power of the rings.
  
--- 6268,6274 ----
  S:1_IN_3 | 
  S:BLIND | HOLD | SCARE | CAUSE_3 | FORGET | 
  S:BO_ACID | BO_FIRE | BO_COLD | BO_NETH | 
! S:S_MONSTER | P_BLAST | P_CRUSH
  D:A sorceress in life, Adunaphel quickly fell under Sauron's sway and the 
  D:power of the rings.
  
***************
*** 6282,6289 ****
  F:SMART | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:HEAL | BLINK | TELE_TO | BLIND | CONF | CAUSE_3 | DARKNESS | 
! S:BO_ACID | BA_FIRE | BA_COLD | 
  S:S_MONSTER | S_UNDEAD | S_DEMON
  D:A dark elven figure, dressed in deepest black.  Power seems to crackle 
  D:from his slender frame.
--- 6285,6292 ----
  F:SMART | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:HEAL | BLINK | TELE_TO | BLIND | P_CRUSH | CAUSE_3 | DARKNESS |
! S:BO_ACID | BA_FIRE | BA_COLD | P_WAVE |
  S:S_MONSTER | S_UNDEAD | S_DEMON
  D:A dark elven figure, dressed in deepest black.  Power seems to crackle 
  D:from his slender frame.
***************
*** 6301,6308 ****
  F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
! S:BLINK | TELE_TO | BLIND | HOLD | CONF | SCARE | CAUSE_3 | CAUSE_4 | 
! S:DRAIN_MANA | BRAIN_SMASH | 
  S:S_UNDEAD
  D:A skeletal form wrapped in robes.  Powerful magic crackles along its bony 
  D:fingers.
--- 6304,6311 ----
  F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
! S:BLINK | TELE_TO | BLIND | HOLD | P_BLAST | SCARE | CAUSE_3 | CAUSE_4 |
! S:DRAIN_MANA | BRAIN_SMASH | M_WRACK |
  S:S_UNDEAD
  D:A skeletal form wrapped in robes.  Powerful magic crackles along its bony 
  D:fingers.
***************
*** 6337,6343 ****
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:BLIND | HOLD | SCARE | CAUSE_3 | DARKNESS | 
! S:BO_FIRE | BO_COLD | BO_NETH | 
  S:S_MONSTER
  D:A mighty sorcerer King, Akhorahil was blind in life.  With powerful 
  D:enchantments, he created jewelled eyes that enabled him to see better than 
--- 6340,6346 ----
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:BLIND | HOLD | SCARE | CAUSE_3 | DARKNESS | 
! S:BO_FIRE | BO_COLD | BO_NETH | P_WAVE | P_CRUSH | M_WRACK |
  S:S_MONSTER
  D:A mighty sorcerer King, Akhorahil was blind in life.  With powerful 
  D:enchantments, he created jewelled eyes that enabled him to see better than 
***************
*** 6370,6381 ****
  B:HIT:HURT:8d6
  B:HIT:HURT:8d6
  F:FORCE_SLEEP | 
! F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | 
  F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS
  S:1_IN_3 | 
  S:TELE_TO | BLIND | SCARE | CAUSE_2 | CAUSE_4 | BO_MANA | 
! S:S_ANGEL
  D:Never a more heavenly being have you seen.  The very holiness of its 
  D:presence makes you deeply respect it.  Few creatures can match the powers 
  D:of a Solar; fewer still live to tell the tale after attacking one.
--- 6373,6384 ----
  B:HIT:HURT:8d6
  B:HIT:HURT:8d6
  F:FORCE_SLEEP | 
! F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD |  RES_PSI |
  F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | 
  F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS
  S:1_IN_3 | 
  S:TELE_TO | BLIND | SCARE | CAUSE_2 | CAUSE_4 | BO_MANA | 
! S:S_ANGEL | P_CRUSH
  D:Never a more heavenly being have you seen.  The very holiness of its 
  D:presence makes you deeply respect it.  Few creatures can match the powers 
  D:of a Solar; fewer still live to tell the tale after attacking one.
***************
*** 6411,6417 ****
  F:HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:BLIND | HOLD | SCARE | CAUSE_3 | BO_FIRE | BO_NETH | BA_FIRE | 
! S:S_MONSTER
  D:Ren was an insane eastern king who believed himself to be the son of a 
  D:volcano god.  At an early age his sanity was destroyed by a plague that 
  D:wiped out his family, and he never recovered.
--- 6414,6420 ----
  F:HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:BLIND | HOLD | SCARE | CAUSE_3 | BO_FIRE | BO_NETH | BA_FIRE | 
! S:S_MONSTER | P_WAVE | M_WRACK
  D:Ren was an insane eastern king who believed himself to be the son of a 
  D:volcano god.  At an early age his sanity was destroyed by a plague that 
  D:wiped out his family, and he never recovered.
***************
*** 6450,6456 ****
  F:NO_CONF | NO_SLEEP
  S:1_IN_2 | 
  S:SLOW | CAUSE_4 | DRAIN_MANA | MIND_BLAST | BRAIN_SMASH | FORGET | 
! S:BO_MANA | 
  S:S_UNDEAD
  D:A disembodied eye, floating in the air.  Black nether storms rage around 
  D:its bloodshot pupil and light seems to bend as it sucks its power from the 
--- 6453,6459 ----
  F:NO_CONF | NO_SLEEP
  S:1_IN_2 | 
  S:SLOW | CAUSE_4 | DRAIN_MANA | MIND_BLAST | BRAIN_SMASH | FORGET | 
! S:BO_MANA | P_BLAST | P_WAVE | P_CRUSH | M_WRACK |
  S:S_UNDEAD
  D:A disembodied eye, floating in the air.  Black nether storms rage around 
  D:its bloodshot pupil and light seems to bend as it sucks its power from the 
***************
*** 6471,6477 ****
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_15 | 
! S:BLIND | HOLD | CONF | DRAIN_MANA | BO_NETH
  D:It is a form that screams its presence against the eye.  Death incarnate, 
  D:its hideous black body seems to struggle against reality as the universe 
  D:itself struggles to banish it.
--- 6474,6480 ----
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_15 | 
! S:BLIND | HOLD | CONF | DRAIN_MANA | BO_NETH | P_CRUSH
  D:It is a form that screams its presence against the eye.  Death incarnate, 
  D:its hideous black body seems to struggle against reality as the universe 
  D:itself struggles to banish it.
***************
*** 6492,6500 ****
  G:D:v
  I:120:21d100:20:100:70
  W:43:1:0:13000
! B:CLAW:HURT:1d12
! B:CLAW:HURT:1d12
! B:BITE:HURT:3d12
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | 
--- 6495,6503 ----
  G:D:v
  I:120:21d100:20:100:70
  W:43:1:0:13000
! B:CLAW:HURT:2d12
! B:CLAW:HURT:2d12
! B:BITE:HURT:8d12
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | 
***************
*** 6511,6519 ****
  G:D:o
  I:120:21d100:25:100:15
  W:43:2:0:11000
! B:CLAW:HURT:1d12
! B:CLAW:HURT:1d12
! B:BITE:HURT:3d12
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | 
  F:INVISIBLE | 
--- 6514,6522 ----
  G:D:o
  I:120:21d100:25:100:15
  W:43:2:0:11000
! B:CLAW:HURT:2d12
! B:CLAW:HURT:2d12
! B:BITE:HURT:4d12
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | 
  F:INVISIBLE | 
***************
*** 6647,6659 ****
  B:HIT:HURT:3d4
  B:HIT:HURT:3d5
  F:MALE | 
! F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_90 | DROP_4D2 | 
  F:SMART | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
  S:HEAL | BLIND | HOLD | CAUSE_4 | BRAIN_SMASH | 
! S:S_MONSTERS | S_UNDEAD
  D:A dark priest of the highest order.  Powerful and evil, beware his many 
  D:spells.
  
--- 6650,6662 ----
  B:HIT:HURT:3d4
  B:HIT:HURT:3d5
  F:MALE | 
! F:FORCE_SLEEP | FORCE_MAXHP |  RES_PSI |
  F:ONLY_ITEM | DROP_90 | DROP_4D2 | 
  F:SMART | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
  S:HEAL | BLIND | HOLD | CAUSE_4 | BRAIN_SMASH | 
! S:S_MONSTERS | S_UNDEAD | P_CRUSH | P_BLAST
  D:A dark priest of the highest order.  Powerful and evil, beware his many 
  D:spells.
  
***************
*** 6680,6689 ****
  G:g:g
  I:120:30d100:25:130:30
  W:44:3:0:12000
! B:BITE:HURT:5d8
! B:BITE:HURT:5d8
! B:CLAW:POISON:3d3
! B:CLAW:POISON:3d3
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
  F:DRAGON | IM_FIRE | IM_COLD | 
--- 6683,6692 ----
  G:g:g
  I:120:30d100:25:130:30
  W:44:3:0:12000
! B:BITE:HURT:5d10
! B:BITE:HURT:5d10
! B:CLAW:POISON:3d20
! B:CLAW:POISON:3d20
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
  F:DRAGON | IM_FIRE | IM_COLD | 
***************
*** 6700,6709 ****
  G:D:w
  I:120:20d100:20:130:70
  W:44:2:0:17000
! B:CLAW:HURT:1d10
! B:CLAW:HURT:1d10
! B:CLAW:HURT:1d10
! B:BITE:HURT:3d14
  F:UNIQUE | MALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
--- 6703,6712 ----
  G:D:w
  I:120:20d100:20:130:70
  W:44:2:0:17000
! B:CLAW:HURT:4d10
! B:CLAW:HURT:4d10
! B:CLAW:HURT:4d10
! B:BITE:HURT:9d14
  F:UNIQUE | MALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
***************
*** 6740,6749 ****
  G:D:r
  I:120:20d100:20:100:70
  W:45:2:0:19000
! B:CLAW:HURT:1d10
! B:CLAW:HURT:1d10
! B:CLAW:HURT:1d10
! B:BITE:HURT:3d14
  F:UNIQUE | MALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
--- 6743,6752 ----
  G:D:r
  I:120:20d100:20:100:70
  W:45:2:0:19000
! B:CLAW:HURT:3d10
! B:CLAW:HURT:3d10
! B:CLAW:HURT:3d10
! B:BITE:HURT:10d14
  F:UNIQUE | MALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
***************
*** 6760,6769 ****
  G:D:G
  I:120:35d100:25:120:30
  W:46:2:0:18000
! B:CLAW:HURT:1d12
! B:CLAW:HURT:1d12
! B:BITE:EXP_80:1d6
! B:BITE:EXP_80:1d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | 
  F:COLD_BLOOD | 
--- 6763,6772 ----
  G:D:G
  I:120:35d100:25:120:30
  W:46:2:0:18000
! B:CLAW:HURT:2d12
! B:CLAW:HURT:2d12
! B:BITE:EXP_80:4d6
! B:BITE:EXP_80:4d6
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | 
  F:COLD_BLOOD | 
***************
*** 6785,6796 ****
  B:HIT:CONFUSE:12d12
  B:HIT:CONFUSE:12d12
  B:HIT:CONFUSE:12d12
! F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | 
  F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | GIANT
  S:1_IN_3 | 
! S:HEAL | TELE_TO | 
  S:S_MONSTERS
  D:A forty foot tall humanoid that shakes the ground as it walks.  The power 
  D:radiating from its frame shakes your courage, its hatred inspired by your 
--- 6788,6799 ----
  B:HIT:CONFUSE:12d12
  B:HIT:CONFUSE:12d12
  B:HIT:CONFUSE:12d12
! F:FORCE_SLEEP | FORCE_MAXHP |  RES_PSI |
  F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | 
  F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | GIANT
  S:1_IN_3 | 
! S:HEAL | TELE_TO | P_CRUSH |
  S:S_MONSTERS
  D:A forty foot tall humanoid that shakes the ground as it walks.  The power 
  D:radiating from its frame shakes your courage, its hatred inspired by your 
***************
*** 6800,6807 ****
  G:D:G
  I:120:35d100:25:120:30
  W:46:2:0:14000
! B:BITE:HURT:2d12
! B:BITE:HURT:2d12
  B:BITE:HURT:5d8
  B:GAZE:PARALYZE
  F:FORCE_SLEEP | FORCE_MAXHP | 
--- 6803,6810 ----
  G:D:G
  I:120:35d100:25:120:30
  W:46:2:0:14000
! B:BITE:HURT:3d12
! B:BITE:HURT:3d12
  B:BITE:HURT:5d8
  B:GAZE:PARALYZE
  F:FORCE_SLEEP | FORCE_MAXHP | 
***************
*** 6833,6842 ****
  G:D:r
  I:120:22d100:20:100:70
  W:47:4:0:20000
! B:CLAW:HURT:1d10
! B:CLAW:HURT:1d10
! B:BITE:HURT:3d14
! B:BITE:HURT:4d14
  F:UNIQUE | MALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
--- 6836,6845 ----
  G:D:r
  I:120:22d100:20:100:70
  W:47:4:0:20000
! B:CLAW:HURT:3d10
! B:CLAW:HURT:3d10
! B:BITE:HURT:7d14
! B:BITE:FIRE:12d14
  F:UNIQUE | MALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
***************
*** 6852,6861 ****
  G:D:r
  I:120:28d100:20:120:70
  W:48:2:0:25000
! B:CLAW:HURT:4d12
! B:CLAW:HURT:4d12
! B:BITE:HURT:6d14
! B:BITE:HURT:6d14
  F:UNIQUE | MALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
--- 6855,6864 ----
  G:D:r
  I:120:28d100:20:120:70
  W:48:2:0:25000
! B:CLAW:HURT:8d12
! B:CLAW:HURT:8d12
! B:BITE:HURT:18d14
! B:BITE:HURT:18d14
  F:UNIQUE | MALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
***************
*** 6879,6891 ****
  B:HIT:POISON:20d1
  B:HIT:PARALYZE:15d1
  F:MALE | 
! F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | 
  F:INVISIBLE | OPEN_DOOR | BASH_DOOR | 
  F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_3 | 
! S:HEAL | 
  S:S_SPIDER
  D:A lord of all that is natural, skilled in the mystic ways.  He is a master 
  D:of martial arts and is at one with nature, able to summon help from the 
--- 6882,6894 ----
  B:HIT:POISON:20d1
  B:HIT:PARALYZE:15d1
  F:MALE | 
! F:FORCE_SLEEP | FORCE_MAXHP |  RES_PSI |
  F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | 
  F:INVISIBLE | OPEN_DOOR | BASH_DOOR | 
  F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_3 | 
! S:HEAL | M_WRACK |
  S:S_SPIDER
  D:A lord of all that is natural, skilled in the mystic ways.  He is a master 
  D:of martial arts and is at one with nature, able to summon help from the 
***************
*** 6906,6912 ****
  F:EVIL | DEMON | IM_FIRE | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_4 | 
! S:CONF | SCARE | 
  S:BR_FIRE | 
  S:S_UNDEAD | S_DEMON
  D:A huge balrog surrounded by raging pillars of fire, Muar is indeed a 
--- 6909,6915 ----
  F:EVIL | DEMON | IM_FIRE | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_4 | 
! S:CONF | SCARE | P_CRUSH |
  S:BR_FIRE | 
  S:S_UNDEAD | S_DEMON
  D:A huge balrog surrounded by raging pillars of fire, Muar is indeed a 
***************
*** 6926,6933 ****
  F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_4 | 
! S:BLIND | SCARE | CAUSE_4 | BRAIN_SMASH | 
! S:BO_MANA | BO_NETH | BA_NETH | 
  S:S_UNDEAD
  D:Everywhere colours seem paler and the air chiller.  At the centre of the 
  D:cold stands a mighty figure.  Its wings envelop you in the chill of death 
--- 6929,6936 ----
  F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_4 | 
! S:BLIND | SCARE | CAUSE_4 | BRAIN_SMASH | M_WRACK | P_BLAST |
! S:BO_MANA | BO_NETH | BA_NETH | P_CRUSH |
  S:S_UNDEAD
  D:Everywhere colours seem paler and the air chiller.  At the centre of the 
  D:cold stands a mighty figure.  Its wings envelop you in the chill of death 
***************
*** 7006,7015 ****
  G:D:b
  I:120:30d100:30:150:80
  W:51:2:0:17000
! B:CLAW:HURT:1d12
! B:CLAW:HURT:1d12
! B:CLAW:HURT:1d12
! B:BITE:HURT:4d14
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:BASH_DOOR | POWERFUL | MOVE_BODY | 
--- 7009,7018 ----
  G:D:b
  I:120:30d100:30:150:80
  W:51:2:0:17000
! B:CLAW:HURT:3d12
! B:CLAW:HURT:3d12
! B:CLAW:HURT:3d12
! B:BITE:HURT:12d14
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:BASH_DOOR | POWERFUL | MOVE_BODY | 
***************
*** 7088,7099 ****
  B:HIT:POISON:20d1
  B:HIT:PARALYZE:15d1
  F:MALE | 
! F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_4D2 | 
  F:INVISIBLE | OPEN_DOOR | BASH_DOOR | 
  F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:HEAL | MIND_BLAST | 
  S:S_SPIDER | S_HOUND
  D:He is one of the few true masters of the art, being extremely skillful in 
  D:all forms of unarmed combat and controlling the world's natural creatures 
--- 7091,7102 ----
  B:HIT:POISON:20d1
  B:HIT:PARALYZE:15d1
  F:MALE | 
! F:FORCE_SLEEP | FORCE_MAXHP |  RES_PSI |
  F:ONLY_ITEM | DROP_4D2 | 
  F:INVISIBLE | OPEN_DOOR | BASH_DOOR | 
  F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:HEAL | P_CRUSH | P_BLAST |
  S:S_SPIDER | S_HOUND
  D:He is one of the few true masters of the art, being extremely skillful in 
  D:all forms of unarmed combat and controlling the world's natural creatures 
***************
*** 7115,7121 ****
  F:HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
  S:TELE_LEVEL | BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | BO_MANA | 
! S:BA_FIRE | BA_COLD | BA_NETH | 
  S:S_UNDEAD
  D:A warrior-king of the East.  Khamul is a powerful opponent, his skill in 
  D:combat awesome and his form twisted by evil cunning.
--- 7118,7124 ----
  F:HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
  S:TELE_LEVEL | BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | BO_MANA | 
! S:BA_FIRE | BA_COLD | BA_NETH | P_CRUSH |
  S:S_UNDEAD
  D:A warrior-king of the East.  Khamul is a powerful opponent, his skill in 
  D:combat awesome and his form twisted by evil cunning.
***************
*** 7140,7149 ****
  G:D:w
  I:120:30d100:30:170:80
  W:54:2:0:20000
- B:CLAW:HURT:1d12
- B:CLAW:HURT:1d12
  B:CLAW:HURT:3d12
! B:BITE:HURT:4d14
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:BASH_DOOR | POWERFUL | MOVE_BODY | 
--- 7143,7152 ----
  G:D:w
  I:120:30d100:30:170:80
  W:54:2:0:20000
  B:CLAW:HURT:3d12
! B:CLAW:HURT:3d12
! B:CLAW:HURT:6d12
! B:BITE:HURT:8d14
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:BASH_DOOR | POWERFUL | MOVE_BODY | 
***************
*** 7190,7196 ****
  S:1_IN_4 | 
  S:BLIND | SCARE | BRAIN_SMASH | 
  S:BO_MANA | BO_NETH | BA_NETH | 
! S:BR_NETH | 
  S:S_UNDEAD
  D:This intensely evil creature bears the form of a gargantuan black worm.  
  D:Its gaping maw is a void of blackness, acid drips from its steely hide.  
--- 7193,7199 ----
  S:1_IN_4 | 
  S:BLIND | SCARE | BRAIN_SMASH | 
  S:BO_MANA | BO_NETH | BA_NETH | 
! S:BR_NETH | P_BLAST | P_CRUSH |
  S:S_UNDEAD
  D:This intensely evil creature bears the form of a gargantuan black worm.  
  D:Its gaping maw is a void of blackness, acid drips from its steely hide.  
***************
*** 7203,7212 ****
  W:55:4:0:12000
  F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | 
  F:SMART | COLD_BLOOD | 
! F:EVIL | UNDEAD | IM_COLD | IM_POIS | 
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_1 | 
! S:TELE_AWAY | BLIND | CONF | SCARE | CAUSE_3 | FORGET | DARKNESS
  D:A skeletal hand floating in the air, motionless except for its flexing 
  D:fingers.
  
--- 7206,7216 ----
  W:55:4:0:12000
  F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | 
  F:SMART | COLD_BLOOD | 
! F:EVIL | UNDEAD | IM_COLD | IM_POIS |  RES_PSI |
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_1 | 
! S:TELE_AWAY | BLIND | CONF | SCARE | CAUSE_3 | FORGET | DARKNESS | P_CRUSH |
! S:P_BLAST | M_WRACK | P_WAVE
  D:A skeletal hand floating in the air, motionless except for its flexing 
  D:fingers.
  
***************
*** 7219,7229 ****
  F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | 
  F:SMART | COLD_BLOOD | 
  F:EVIL | UNDEAD | 
! F:IM_FIRE | IM_COLD | IM_POIS | 
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_1 | 
  S:BO_MANA | BO_NETH | BA_NETH | 
! S:S_UNDEAD
  D:A bloodshot eyeball floating in the air, you'd be forgiven for assuming it 
  D:harmless.
  
--- 7223,7233 ----
  F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | 
  F:SMART | COLD_BLOOD | 
  F:EVIL | UNDEAD | 
! F:IM_FIRE | IM_COLD | IM_POIS | RES_PSI |
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_1 | 
  S:BO_MANA | BO_NETH | BA_NETH | 
! S:S_UNDEAD | P_BLAST
  D:A bloodshot eyeball floating in the air, you'd be forgiven for assuming it 
  D:harmless.
  
***************
*** 7235,7248 ****
  B:BITE:PARALYZE:4d4
  B:BITE:LOSE_INT:4d4
  B:BITE:LOSE_WIS:4d4
! F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | 
  F:SMART | COLD_BLOOD | 
  F:EVIL | UNDEAD | 
  F:IM_FIRE | IM_COLD | IM_POIS | 
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_1 | 
  S:SLOW | CAUSE_4 | MIND_BLAST | BRAIN_SMASH | TRAPS | BO_PLAS | 
! S:BO_NETH | BA_WATE | 
  S:S_UNDEAD
  D:A glowing skull possessed by sorcerous power.  It need not move, but 
  D:merely blast you with mighty magic.
--- 7239,7252 ----
  B:BITE:PARALYZE:4d4
  B:BITE:LOSE_INT:4d4
  B:BITE:LOSE_WIS:4d4
! F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE |  RES_PSI |
  F:SMART | COLD_BLOOD | 
  F:EVIL | UNDEAD | 
  F:IM_FIRE | IM_COLD | IM_POIS | 
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_1 | 
  S:SLOW | CAUSE_4 | MIND_BLAST | BRAIN_SMASH | TRAPS | BO_PLAS | 
! S:BO_NETH | BA_WATE | P_BLAST | P_WAVE |
  S:S_UNDEAD
  D:A glowing skull possessed by sorcerous power.  It need not move, but 
  D:merely blast you with mighty magic.
***************
*** 7277,7283 ****
  S:1_IN_6 | 
  S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS | BR_LITE | 
  S:BR_DARK | BR_SOUN | BR_CONF | BR_CHAO | BR_SHAR | BR_NETH | 
! S:BR_WALL | BR_INER | BR_TIME | BR_GRAV | BR_PLAS | BR_NEXU
  D:An awesome vortex of pure magic, power radiates from its frame.
  
  N:504:The Lernean Hydra
--- 7281,7287 ----
  S:1_IN_6 | 
  S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS | BR_LITE | 
  S:BR_DARK | BR_SOUN | BR_CONF | BR_CHAO | BR_SHAR | BR_NETH | 
! S:BR_WALL | BR_INER | BR_TIME | BR_GRAV | BR_PLAS | BR_NEXU | BR_INSA
  D:An awesome vortex of pure magic, power radiates from its frame.
  
  N:504:The Lernean Hydra
***************
*** 7312,7324 ****
  B:HIT:CONFUSE:6d6
  B:HIT:CONFUSE:6d6
  F:UNIQUE | FEMALE | 
! F:FORCE_SLEEP | FORCE_MAXHP | SMART | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | 
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA | 
! S:BRAIN_SMASH | BA_NETH
  D:Chief messenger between Sauron and Morgoth, she is surely the most deadly 
  D:of her vampire race.  At first she is charming to meet, but her wings and 
  D:eyes give away her true form.
--- 7316,7328 ----
  B:HIT:CONFUSE:6d6
  B:HIT:CONFUSE:6d6
  F:UNIQUE | FEMALE | 
! F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_PSI |
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | 
  F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA | 
! S:BRAIN_SMASH | BA_NETH | P_CRUSH | P_WAVE
  D:Chief messenger between Sauron and Morgoth, she is surely the most deadly 
  D:of her vampire race.  At first she is charming to meet, but her wings and 
  D:eyes give away her true form.
***************
*** 7327,7336 ****
  G:D:r
  I:120:54d100:40:170:40
  W:55:2:0:23000
- B:CLAW:HURT:1d12
- B:CLAW:HURT:1d12
  B:CLAW:HURT:3d12
! B:BITE:HURT:4d14
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:BASH_DOOR | POWERFUL | MOVE_BODY | 
--- 7331,7340 ----
  G:D:r
  I:120:54d100:40:170:40
  W:55:2:0:23000
  B:CLAW:HURT:3d12
! B:CLAW:HURT:3d12
! B:CLAW:HURT:9d12
! B:BITE:HURT:12d14
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:BASH_DOOR | POWERFUL | MOVE_BODY | 
***************
*** 7367,7377 ****
  F:UNIQUE | MALE
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | 
! F:OPEN_DOOR | BASH_DOOR | 
  F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | 
  S:1_IN_4 | 
  S:HEAL | BLIND | CONF | SCARE | CAUSE_3 | CAUSE_4 | BRAIN_SMASH | 
! S:FORGET | 
  S:S_MONSTERS
  D:He is one of the greatest dwarven priests to walk the earth.  Fundin has 
  D:earned a high position in the church, and his skill with both weapon and 
--- 7371,7381 ----
  F:UNIQUE | MALE
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | 
! F:OPEN_DOOR | BASH_DOOR | IM_PSI |
  F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | 
  S:1_IN_4 | 
  S:HEAL | BLIND | CONF | SCARE | CAUSE_3 | CAUSE_4 | BRAIN_SMASH | 
! S:FORGET | P_BLAST | P_CRUSH | M_WRACK |
  S:S_MONSTERS
  D:He is one of the greatest dwarven priests to walk the earth.  Fundin has 
  D:earned a high position in the church, and his skill with both weapon and 
***************
*** 7427,7436 ****
  G:D:D
  I:120:75d100:20:125:70
  W:58:3:0:30000
! B:CLAW:HURT:5d12
! B:CLAW:HURT:6d12
! B:CLAW:HURT:8d12
! B:BITE:HURT:10d14
  F:UNIQUE | MALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
--- 7431,7440 ----
  G:D:D
  I:120:75d100:20:125:70
  W:58:3:0:30000
! B:CLAW:HURT:10d12
! B:CLAW:HURT:12d12
! B:CLAW:HURT:16d12
! B:BITE:HURT:20d14
  F:UNIQUE | MALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
***************
*** 7458,7464 ****
  F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_4 | 
! S:BLIND | SCARE | BRAIN_SMASH | 
  S:BO_MANA | BO_NETH | BA_NETH | 
  S:S_UNDEAD
  D:A huge giant garbed in black, more massive than a titan and stronger than 
--- 7462,7468 ----
  F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_4 | 
! S:BLIND | SCARE | BRAIN_SMASH | P_CRUSH | M_WRACK |
  S:BO_MANA | BO_NETH | BA_NETH | 
  S:S_UNDEAD
  D:A huge giant garbed in black, more massive than a titan and stronger than 
***************
*** 7480,7486 ****
  F:ESCORT | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | 
! F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS
  S:1_IN_2 | 
  S:TELE_TO | BLIND | BO_MANA | 
  S:S_ANGEL
--- 7484,7490 ----
  F:ESCORT | 
  F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | 
! F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | RES_PSI
  S:1_IN_2 | 
  S:TELE_TO | BLIND | BO_MANA | 
  S:S_ANGEL
***************
*** 7501,7511 ****
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:SMART | OPEN_DOOR | BASH_DOOR | 
! F:EVIL | IM_FIRE | IM_COLD | 
  F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | CONF | SCARE | 
! S:CAUSE_4 | MIND_BLAST | FORGET | TRAPS | 
  S:BO_ICEE | BA_ACID | BA_FIRE | BA_COLD | BA_WATE | 
  S:S_UNDEAD | S_DEMON | S_DRAGON
  D:Originally known as the White, Saruman fell prey to Sauron's wiles.  He 
--- 7505,7515 ----
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:SMART | OPEN_DOOR | BASH_DOOR | 
! F:EVIL | IM_FIRE | IM_COLD | RES_PSI |
  F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | P_BLAST | SCARE |
! S:CAUSE_4 | P_CRUSH | FORGET | TRAPS | M_WRACK | P_WAVE |
  S:BO_ICEE | BA_ACID | BA_FIRE | BA_COLD | BA_WATE | 
  S:S_UNDEAD | S_DEMON | S_DRAGON
  D:Originally known as the White, Saruman fell prey to Sauron's wiles.  He 
***************
*** 7529,7535 ****
  F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_4 | 
  S:BLIND | HOLD | CONF | DRAIN_MANA | BA_NETH | 
! S:S_UNDEAD
  D:It is a massive form of animated death, its colour deeper than black.  It 
  D:drinks in light, and space around it is twisted and torn by the weight of 
  D:its evil.  It is unlife and it knows nothing but the stealing of souls and 
--- 7533,7539 ----
  F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_4 | 
  S:BLIND | HOLD | CONF | DRAIN_MANA | BA_NETH | 
! S:S_UNDEAD | P_BLAST
  D:It is a massive form of animated death, its colour deeper than black.  It 
  D:drinks in light, and space around it is twisted and torn by the weight of 
  D:its evil.  It is unlife and it knows nothing but the stealing of souls and 
***************
*** 7595,7604 ****
  G:D:v
  I:120:45d100:40:170:20
  W:67:2:0:29000
! B:CLAW:HURT:5d12
! B:CLAW:HURT:5d12
! B:CLAW:HURT:6d12
! B:BITE:HURT:8d14
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
--- 7599,7608 ----
  G:D:v
  I:120:45d100:40:170:20
  W:67:2:0:29000
! B:CLAW:HURT:10d12
! B:CLAW:HURT:10d12
! B:CLAW:HURT:12d12
! B:BITE:HURT:16d14
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
***************
*** 7606,7612 ****
  F:EVIL | DRAGON | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:BLIND | CONF | SCARE | 
! S:BR_CHAO | BR_DISE | 
  S:S_DRAGON
  D:A massive dragon of changing form.  As you watch, it appears first fair 
  D:and then foul.  Its body is twisted by chaotic forces as it strives to 
--- 7610,7616 ----
  F:EVIL | DRAGON | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:BLIND | CONF | SCARE | 
! S:BR_CHAO | BR_DISE | BR_INSA |
  S:S_DRAGON
  D:A massive dragon of changing form.  As you watch, it appears first fair 
  D:and then foul.  Its body is twisted by chaotic forces as it strives to 
***************
*** 7616,7625 ****
  G:D:B
  I:120:45d100:40:170:255
  W:67:2:0:29000
! B:CLAW:HURT:5d12
! B:CLAW:HURT:5d12
! B:CLAW:HURT:6d12
! B:BITE:HURT:8d14
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:BASH_DOOR | POWERFUL | MOVE_BODY | 
--- 7620,7629 ----
  G:D:B
  I:120:45d100:40:170:255
  W:67:2:0:29000
! B:CLAW:HURT:8d12
! B:CLAW:HURT:8d12
! B:CLAW:HURT:12d12
! B:BITE:HURT:16d14
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
  F:BASH_DOOR | POWERFUL | MOVE_BODY | 
***************
*** 7636,7645 ****
  G:D:v
  I:120:49d100:40:170:255
  W:67:4:0:31000
! B:CLAW:HURT:5d12
! B:CLAW:HURT:5d12
! B:CLAW:HURT:6d12
! B:BITE:HURT:8d14
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
--- 7640,7649 ----
  G:D:v
  I:120:49d100:40:170:255
  W:67:4:0:31000
! B:CLAW:HURT:10d12
! B:CLAW:HURT:10d12
! B:CLAW:HURT:13d12
! B:BITE:HURT:18d14
  F:ATTR_MULTI | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | 
***************
*** 7670,7676 ****
  F:IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:BLIND | HOLD | CONF | 
! S:BA_DARK | BA_NETH | 
  S:S_WRAITH | S_HI_UNDEAD
  D:This huge affront to existence twists and tears at the fabric of space.  A 
  D:master of mighty magic, Tselakus hungers for your tender flesh.  Darkness 
--- 7674,7680 ----
  F:IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:BLIND | HOLD | CONF | 
! S:BA_DARK | BA_NETH | P_CRUSH |
  S:S_WRAITH | S_HI_UNDEAD
  D:This huge affront to existence twists and tears at the fabric of space.  A 
  D:master of mighty magic, Tselakus hungers for your tender flesh.  Darkness 
***************
*** 7683,7692 ****
  G:D:v
  I:130:100d100:20:125:70
  W:70:4:0:45000
! B:CLAW:HURT:6d12
! B:CLAW:HURT:8d12
! B:CLAW:HURT:8d12
! B:BITE:HURT:10d14
  F:ATTR_MULTI | 
  F:UNIQUE | FEMALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
--- 7687,7696 ----
  G:D:v
  I:130:100d100:20:125:70
  W:70:4:0:45000
! B:CLAW:HURT:10d12
! B:CLAW:HURT:18d12
! B:CLAW:HURT:18d12
! B:BITE:HURT:20d14
  F:ATTR_MULTI | 
  F:UNIQUE | FEMALE | 
  F:FORCE_SLEEP | FORCE_MAXHP | 
***************
*** 7717,7723 ****
  F:NO_CONF | NO_SLEEP | KILL_WALL
  S:1_IN_3 | 
  S:TELE_TO | BLIND | HOLD | CONF | CAUSE_3 | CAUSE_4 | DRAIN_MANA | 
! S:BRAIN_SMASH | BA_MANA | BA_NETH | 
  S:S_UNDEAD
  D:A humanoid form,  black as night, advancing steadily and unstoppably.  
  D:Flee!
--- 7721,7727 ----
  F:NO_CONF | NO_SLEEP | KILL_WALL
  S:1_IN_3 | 
  S:TELE_TO | BLIND | HOLD | CONF | CAUSE_3 | CAUSE_4 | DRAIN_MANA | 
! S:BRAIN_SMASH | BA_MANA | BA_NETH | M_WRACK | P_CRUSH |
  S:S_UNDEAD
  D:A humanoid form,  black as night, advancing steadily and unstoppably.  
  D:Flee!
***************
*** 7780,7786 ****
  S:1_IN_2 | 
  S:BLINK | TELE_TO | BLIND | HOLD | CONF | SCARE | CAUSE_3 | CAUSE_4 | 
  S:BRAIN_SMASH | TRAPS | BA_MANA | 
! S:BO_MANA | BA_NETH | 
  S:S_MONSTERS | S_UNDEAD
  D:He is a highly cunning, extremely magical being, spoken of in legends.  
  D:This ancient shadow of death wilts any living thing it passes.
--- 7784,7790 ----
  S:1_IN_2 | 
  S:BLINK | TELE_TO | BLIND | HOLD | CONF | SCARE | CAUSE_3 | CAUSE_4 | 
  S:BRAIN_SMASH | TRAPS | BA_MANA | 
! S:BO_MANA | BA_NETH | M_WRACK | P_CRUSH |
  S:S_MONSTERS | S_UNDEAD
  D:He is a highly cunning, extremely magical being, spoken of in legends.  
  D:This ancient shadow of death wilts any living thing it passes.
***************
*** 7799,7806 ****
  F:EVIL | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:BLIND | SLOW | CONF | SCARE | DRAIN_MANA | MIND_BLAST | FORGET | 
! S:DARKNESS | BA_DARK | BO_ACID | BO_FIRE | BO_COLD
  D:A disembodied eye, floating in the air.  His gaze seems to shred your 
  D:soul and his spells crush your will.  He is ancient, his history steeped 
  D:in forgotten evils, his atrocities numerous and sickening.
--- 7803,7810 ----
  F:EVIL | IM_POIS | 
  F:NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:BLIND | SLOW | CONF | SCARE | DRAIN_MANA | MIND_BLAST | FORGET | P_WAVE |
! S:DARKNESS | BA_DARK | BO_ACID | BO_FIRE | BO_COLD | P_CRUSH | M_WRACK
  D:A disembodied eye, floating in the air.  His gaze seems to shred your 
  D:soul and his spells crush your will.  He is ancient, his history steeped 
  D:in forgotten evils, his atrocities numerous and sickening.
***************
*** 7820,7826 ****
  F:ANIMAL | EVIL | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:HEAL | BLIND | SLOW | CONF | SCARE | DARKNESS | BA_DARK | 
! S:BR_POIS | BR_DARK | 
  S:S_SPIDER
  D:This enormous, hideous spirit of void is in the form of a spider of 
  D:immense proportions.  She is surrounded by a cloud of Unlight as she sucks 
--- 7824,7830 ----
  F:ANIMAL | EVIL | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:HEAL | BLIND | SLOW | CONF | SCARE | DARKNESS | BA_DARK | 
! S:BR_POIS | BR_DARK | P_BLAST | P_CRUSH |
  S:S_SPIDER
  D:This enormous, hideous spirit of void is in the form of a spider of 
  D:immense proportions.  She is surrounded by a cloud of Unlight as she sucks 
***************
*** 7846,7852 ****
  S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS | 
  S:BR_LITE | BR_DARK | BR_SOUN | BR_CONF | BR_CHAO | BR_SHAR | 
  S:BR_NETH | BR_DISE | BR_WALL | BR_INER | BR_TIME | 
! S:BR_GRAV | BR_PLAS | BR_NEXU
  D:A shifting, swirling form.  It seems to be all colours and sizes and 
  D:shapes, though the dominant form is that of a huge dog.  You feel very 
  D:uncertain all of a sudden.
--- 7850,7856 ----
  S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS | 
  S:BR_LITE | BR_DARK | BR_SOUN | BR_CONF | BR_CHAO | BR_SHAR | 
  S:BR_NETH | BR_DISE | BR_WALL | BR_INER | BR_TIME | 
! S:BR_GRAV | BR_PLAS | BR_NEXU | BR_INSA
  D:A shifting, swirling form.  It seems to be all colours and sizes and 
  D:shapes, though the dominant form is that of a huge dog.  You feel very 
  D:uncertain all of a sudden.
***************
*** 7864,7872 ****
  F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | 
  F:INVISIBLE | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | IM_FIRE | IM_COLD | 
! F:IM_ELEC | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:TELE_TO | HOLD | CAUSE_3 | TRAPS | 
  S:BO_PLAS | BA_DARK | BA_MANA | BA_FIRE | BA_WATE | BA_NETH
  D:The Mouth of Sauron is a mighty spell caster.  So old that even he cannot 
  D:remember his own name, his power and evil are undeniable.  He believes 
--- 7868,7876 ----
  F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | 
  F:INVISIBLE | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | IM_FIRE | IM_COLD | 
! F:IM_ELEC | NO_CONF | NO_SLEEP | IM_PSI
  S:1_IN_2 | 
! S:TELE_TO | HOLD | CAUSE_3 | TRAPS | P_CRUSH |
  S:BO_PLAS | BA_DARK | BA_MANA | BA_FIRE | BA_WATE | BA_NETH
  D:The Mouth of Sauron is a mighty spell caster.  So old that even he cannot 
  D:remember his own name, his power and evil are undeniable.  He believes 
***************
*** 7884,7890 ****
  F:ANIMAL | EVIL | 
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_2 | 
! S:BRAIN_SMASH | 
  S:S_HI_UNDEAD | S_HI_DRAGON
  D:A huge seething mass of flesh with a rudimentary intelligence, the Emperor 
  D:Quylthulg changes colours in front of your eyes.  Pulsating first one 
--- 7888,7894 ----
  F:ANIMAL | EVIL | 
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_2 | 
! S:P_CRUSH |
  S:S_HI_UNDEAD | S_HI_DRAGON
  D:A huge seething mass of flesh with a rudimentary intelligence, the Emperor 
  D:Quylthulg changes colours in front of your eyes.  Pulsating first one 
***************
*** 7899,7905 ****
  F:ONLY_ITEM | DROP_4D2 | 
  F:INVISIBLE | 
  F:ANIMAL | EVIL | 
! F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_1 | 
  S:S_MONSTER | S_MONSTERS | S_UNDEAD | S_DEMON | S_DRAGON | S_ANGEL | 
  S:S_HYDRA | S_SPIDER | S_ANT | S_HOUND | S_UNIQUE | S_WRAITH | 
--- 7903,7909 ----
  F:ONLY_ITEM | DROP_4D2 | 
  F:INVISIBLE | 
  F:ANIMAL | EVIL | 
! F:NO_CONF | NO_SLEEP | NO_FEAR | IM_PSI
  S:1_IN_1 | 
  S:S_MONSTER | S_MONSTERS | S_UNDEAD | S_DEMON | S_DRAGON | S_ANGEL | 
  S:S_HYDRA | S_SPIDER | S_ANT | S_HOUND | S_UNIQUE | S_WRAITH | 
***************
*** 7923,7930 ****
  F:EVIL | UNDEAD | 
  F:IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:TELE_AWAY | BLIND | HOLD | SCARE | CAUSE_3 | BRAIN_SMASH | 
! S:BO_MANA | BA_NETH | 
  S:S_MONSTERS | S_WRAITH | S_HI_UNDEAD | S_HI_DRAGON
  D:The Chief of the Ringwraiths.  A fell being of devastating power.  His 
  D:spells are lethal and his combat blows crushingly hard.  He moves at 
--- 7927,7934 ----
  F:EVIL | UNDEAD | 
  F:IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
! S:TELE_AWAY | BLIND | HOLD | SCARE | CAUSE_3 | P_CRUSH |
! S:BO_MANA | BA_NETH | M_WRACK | P_BLAST |
  S:S_MONSTERS | S_WRAITH | S_HI_UNDEAD | S_HI_DRAGON
  D:The Chief of the Ringwraiths.  A fell being of devastating power.  His 
  D:spells are lethal and his combat blows crushingly hard.  He moves at 
***************
*** 7946,7952 ****
  F:EVIL | DEMON | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | 
  F:IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
! S:MIND_BLAST | BO_ELEC | BO_MANA | BA_ELEC
  D:A winged humanoid from the Planes of Hell, Pazuzu grins inhumanely at you 
  D:as he decides your fate.
  
--- 7950,7956 ----
  F:EVIL | DEMON | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | 
  F:IM_POIS | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
! S:P_BLAST | BO_ELEC | BO_MANA | BA_ELEC | P_CRUSH
  D:A winged humanoid from the Planes of Hell, Pazuzu grins inhumanely at you 
  D:as he decides your fate.
  
***************
*** 7978,7987 ****
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | 
  F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS | 
! F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_1 | 
! S:TELE_TO | SLOW | SCARE | CAUSE_4 | BRAIN_SMASH | 
! S:BO_ICEE | BO_MANA | BA_WATE | BA_NETH | 
  S:S_HI_UNDEAD
  D:A legion of evil undead druj animating the skeleton of a once mighty 
  D:sorcerer.  His power is devastating and his speed unmatched in the 
--- 7982,7991 ----
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | 
  F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS | 
! F:NO_CONF | NO_SLEEP | NO_FEAR | RES_PSI
  S:1_IN_1 | 
! S:TELE_TO | SLOW | SCARE | CAUSE_4 | P_CRUSH |
! S:BO_ICEE | BO_MANA | BA_WATE | BA_NETH | M_WRACK | P_BLAST |
  S:S_HI_UNDEAD
  D:A legion of evil undead druj animating the skeleton of a once mighty 
  D:sorcerer.  His power is devastating and his speed unmatched in the 
***************
*** 8000,8006 ****
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | 
  F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | 
! F:EVIL | IM_FIRE | IM_COLD | NO_CONF | NO_SLEEP
  S:1_IN_2 | 
  S:BR_FIRE | BR_COLD | BR_DISE
  D:The Tarrasque is a massive reptile of legend, rumoured to be unkillable 
--- 8004,8010 ----
  F:FORCE_SLEEP | FORCE_MAXHP | 
  F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | 
  F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | 
! F:EVIL | IM_FIRE | IM_COLD | NO_CONF | NO_SLEEP | IM_PSI
  S:1_IN_2 | 
  S:BR_FIRE | BR_COLD | BR_DISE
  D:The Tarrasque is a massive reptile of legend, rumoured to be unkillable 
***************
*** 8064,8073 ****
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | 
  F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | UNDEAD | 
! F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | 
  S:1_IN_3 | 
! S:TPORT | BLIND | SCARE | CAUSE_4 | BRAIN_SMASH | 
! S:BA_MANA | BO_MANA | BA_FIRE | 
  S:S_MONSTERS | S_DEMON | S_HI_UNDEAD
  D:A stench of corruption and decay surrounds this sorcerer, who has clearly 
  D:risen from the grave to continue his foul plots and schemes.
--- 8068,8077 ----
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | 
  F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
  F:EVIL | UNDEAD | 
! F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | RES_PSI
  S:1_IN_3 | 
! S:TPORT | BLIND | SCARE | CAUSE_4 | P_BLAST | M_WRACK |
! S:BA_MANA | BO_MANA | BA_FIRE | P_CRUSH |
  S:S_MONSTERS | S_DEMON | S_HI_UNDEAD
  D:A stench of corruption and decay surrounds this sorcerer, who has clearly 
  D:risen from the grave to continue his foul plots and schemes.
***************
*** 8127,8133 ****
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | 
  F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | 
  F:EVIL | DEMON | 
! F:IM_FIRE | IM_ELEC | NO_CONF | NO_SLEEP
  S:1_IN_3 | 
  S:BLIND | CONF | SCARE | 
  S:BR_FIRE | 
--- 8131,8137 ----
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | 
  F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | 
  F:EVIL | DEMON | 
! F:IM_FIRE | IM_ELEC | NO_CONF | NO_SLEEP | RES_PSI
  S:1_IN_3 | 
  S:BLIND | CONF | SCARE | 
  S:BR_FIRE | 
***************
*** 8154,8166 ****
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | 
  F:SMART | OPEN_DOOR | BASH_DOOR | MOVE_BODY | REGENERATE | 
  F:EVIL | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
! F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_2 | 
! S:TPORT | TELE_LEVEL | BLIND | CONF | SCARE | CAUSE_4 | 
! S:BRAIN_SMASH | FORGET | 
  S:BO_ICEE | BO_MANA | BO_PLAS | 
  S:BA_MANA | BA_FIRE | BA_WATE | BA_NETH | BA_DARK | 
! S:S_MONSTERS | S_DEMON | S_HI_UNDEAD | S_HI_DRAGON
  D:He is Morgoth's most powerful servant.  Mighty in spells and enchantments, 
  D:he created the One Ring.  His eyes glow with power and his gaze seeks to 
  D:destroy your soul.  He has many servants, and rarely fights without them.
--- 8158,8170 ----
  F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | 
  F:SMART | OPEN_DOOR | BASH_DOOR | MOVE_BODY | REGENERATE | 
  F:EVIL | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
! F:NO_CONF | NO_SLEEP | NO_FEAR | RES_PSI
  S:1_IN_2 | 
! S:TPORT | TELE_LEVEL | BLIND | P_CRUSH | SCARE | CAUSE_4 |
! S:P_BLAST | FORGET | M_WRACK | P_WAVE |
  S:BO_ICEE | BO_MANA | BO_PLAS | 
  S:BA_MANA | BA_FIRE | BA_WATE | BA_NETH | BA_DARK | 
! S:S_MONSTERS | S_DEMON | S_HI_UNDEAD | S_HI_DRAGON | HEAL2
  D:He is Morgoth's most powerful servant.  Mighty in spells and enchantments, 
  D:he created the One Ring.  His eyes glow with power and his gaze seeks to 
  D:destroy your soul.  He has many servants, and rarely fights without them.
***************
*** 8182,8194 ****
  F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 | 
  F:DROP_GOOD | DROP_GREAT | DROP_CHOSEN | 
  F:SMART | KILL_WALL | MOVE_BODY | 
! F:REGENERATE | 
  F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_3 | 
! S:BRAIN_SMASH | 
  S:BA_MANA | BO_MANA | BA_NETH | 
! S:S_MONSTERS | S_UNIQUE | S_WRAITH | S_HI_UNDEAD | S_HI_DRAGON
  D:He is the Master of the Pits of Angband.  His figure is like a black 
  D:mountain crowned with Lightning.  He rages with everlasting anger, his 
  D:body scarred by Fingolfin's eight mighty wounds.  He can never rest from 
--- 8186,8198 ----
  F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 | 
  F:DROP_GOOD | DROP_GREAT | DROP_CHOSEN | 
  F:SMART | KILL_WALL | MOVE_BODY | 
! F:REGENERATE | RES_PSI |
  F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | 
  F:NO_CONF | NO_SLEEP | NO_FEAR
  S:1_IN_3 | 
! S:P_WAVE | M_WRACK | P_CRUSH |
  S:BA_MANA | BO_MANA | BA_NETH | 
! S:S_MONSTERS | S_UNIQUE | S_WRAITH | S_HI_UNDEAD | S_HI_DRAGON | HEAL2
  D:He is the Master of the Pits of Angband.  His figure is like a black 
  D:mountain crowned with Lightning.  He rages with everlasting anger, his 
  D:body scarred by Fingolfin's eight mighty wounds.  He can never rest from 
Only in .: psi_diff
Only in .: psionics.txt
diff -c -w -r \games\angb283/readme ./readme
*** \games\angb283/readme	Mon Feb  9 12:00:26 1998
--- ./readme	Mon Feb 23 18:15:42 1998
***************
*** 24,29 ****
--- 24,31 ----
  === General Info ===
  
  This is the README file for Angband 2.8.3 (1998-02-09)
+ Psionic Angband is based on Angband 2.8.3; for documentation on what
+ this version adds, see "psionics.txt".
  
  Angband is a "graphical" dungeon adventure game using textual characters
  to represent the walls and floors of a dungeon and the inhabitants therein,
diff -c -w -r \games\angb283/src/birth.c ./src/birth.c
*** \games\angb283/src/birth.c	Mon Feb  9 12:29:30 1998
--- ./src/birth.c	Mon Feb 23 17:32:24 1998
***************
*** 968,974 ****
--- 968,982 ----
  		{ TV_PRAYER_BOOK, 0 },
  		{ TV_SWORD, SV_BROAD_SWORD },
  		{ TV_SCROLL, SV_SCROLL_PROTECTION_FROM_EVIL }
+ 	},
+ 
+    {
+ 		/* Psionicist */
+ 		{ TV_PSI_BOOK,0 },
+ 		{ TV_SWORD, SV_DAGGER },
+ 		{ TV_PSI_BOOK,15 }
  	}
+ 
  };
  
  
***************
*** 1057,1062 ****
--- 1065,1073 ----
  	char buf[80];
  
  	bool autoroll = FALSE;
+ #ifdef FAST_AUTOROLL
+    int stats[6];
+ #endif
  
  
  	/*** Instructions ***/
***************
*** 1266,1271 ****
--- 1277,1309 ----
  	clear_from(20);
  
  
+ #ifdef GJW_RANDART
+ 	/* Extra info */
+ 	Term_putstr(5, 15, -1, TERM_WHITE,
+ 		"Using random artifacts means that your character will enter a");
+ 	Term_putstr(5, 16, -1, TERM_WHITE,
+ 		"world with a uniquely generated set of special items.   ");
+ 
+ 	/* Ask about random artifacts */
+ 	while (1)
+ 	{
+ 		put_str("Use random artifacts? (y/n) ", 20, 2);
+ 		c = inkey();
+ 		if (c == 'Q') quit(NULL);
+ 		if (c == 'S') return (FALSE);
+ 		if (c == ESCAPE) break;
+ 		if ((c == 'y') || (c == 'n')) break;
+                 if (c == '?') do_cmd_help();
+                 else bell("(y/n)!");
+ 	}
+ 
+ 	/* Set random artifacts */
+ 	p_ptr->random_artifacts = (c == 'y');
+ 
+ 	/* Clear */
+ 	clear_from(20);
+ #endif
+ 
  #ifdef ALLOW_AUTOROLLER
  
  	/*** Autoroll ***/
***************
*** 1275,1280 ****
--- 1313,1321 ----
  		"The 'autoroller' allows you to specify certain 'minimal' stats,");
  	Term_putstr(5, 16, -1, TERM_WHITE,
  		"but be warned that your various stats may not be independant!");
+ #ifdef FAST_AUTOROLL
+    Term_putstr(20,17,-1, TERM_RED,"***Fast autorolling enabled***");
+ #endif
  
  	/* Ask about "auto-roller" mode */
  	while (1)
***************
*** 1384,1389 ****
--- 1425,1435 ----
  				if (v <= mval[i]) break;
  			}
  
+ 			#ifdef FAST_AUTOROLL
+          if (p_ptr->maximize)
+          v = adjust_stat(v,0 - rp_ptr->r_adj[i] - cp_ptr->c_adj[i],autoroll);
+          #endif
+ 
  			/* Save the minimum stat */
  			stat_limit[i] = (v > 0) ? v : 0;
  		}
***************
*** 1451,1456 ****
--- 1497,1532 ----
  		{
  			bool accept = TRUE;
  
+ #ifdef FAST_AUTOROLL
+          if (p_ptr->maximize)
+          if (auto_round & 0xFFFF)
+          {
+          m = 0;
+          for (i=0 ; i<6 ; i++)
+          {
+            m += (stats[i] = 8 + Rand_mod(3) + Rand_mod(4) + Rand_mod(5));
+            if (stats[i] < stat_limit[i]) {accept = FALSE; break;}
+          }
+          if (!accept) continue;
+          if (m > 84) continue;
+ 
+          /* Done */
+ 
+          for (i=0 ; i<6 ; i++)
+          {
+ 		     m = rp_ptr->r_adj[i] + cp_ptr->c_adj[i];
+ 		     if (p_ptr->maximize)
+ 			      stat_use[i] = modify_stat_value(p_ptr->stat_cur[i] =
+ 			        p_ptr->stat_max[i] = stats[i],m);
+ 	 	     else
+ 		 	    p_ptr->stat_cur[i] = p_ptr->stat_max[i] = stat_use[i]
+ 		 	       = adjust_stat(stats[i], m, FALSE);
+          }
+          break;
+          } /* use old routine every so often to display totals */
+          accept = FALSE;
+          last_round = auto_round;
+ #endif
  			/* Get a new character */
  			get_stats();
  
diff -c -w -r \games\angb283/src/cmd1.c ./src/cmd1.c
*** \games\angb283/src/cmd1.c	Fri Feb  6 09:10:30 1998
--- ./src/cmd1.c	Wed Feb 25 18:08:24 1998
***************
*** 1072,1083 ****
  	/* Hack -- attack monsters */
  	if (cave_m_idx[y][x] > 0)
  	{
  		/* Attack */
  		py_attack(y, x);
  	}
  
  	/* Player can not walk through "walls" */
! 	else if (!cave_floor_bold(y, x))
  	{
  		/* Disturb the player */
  		disturb(0, 0);
--- 1072,1084 ----
  	/* Hack -- attack monsters */
  	if (cave_m_idx[y][x] > 0)
  	{
+       if (!(m_list[cave_m_idx[y][x]].smart & SM_DOMINATE))
  		/* Attack */
  		py_attack(y, x);
  	}
  
  	/* Player can not walk through "walls" */
! 	else if ((!cave_floor_bold(y, x)) && (!pa_ptr->shadow_form))
  	{
  		/* Disturb the player */
  		disturb(0, 0);
***************
*** 1142,1147 ****
--- 1143,1154 ----
  		/* Sound XXX XXX XXX */
  		/* sound(SOUND_WALK); */
  
+ 	  /* Hack -- Only pets should make it this far. */
+ 
+ 	  if (cave_m_idx[y][x] > 0) {
+ 	    msg_print("You switch spots with the monster.");
+ 	  }
+ 
  		/* Move player */
  		monster_swap(py, px, y, x);
  
***************
*** 1163,1168 ****
--- 1170,1176 ----
  			search();
  		}
  
+       if (!pa_ptr->shadow_form)
  		/* Handle "objects" */
  		py_pickup(do_pickup);
  
diff -c -w -r \games\angb283/src/cmd2.c ./src/cmd2.c
*** \games\angb283/src/cmd2.c	Fri Feb  6 09:10:30 1998
--- ./src/cmd2.c	Wed Feb 25 17:16:08 1998
***************
*** 20,26 ****
  	int px = p_ptr->px;
  
  	/* Verify stairs */
! 	if (cave_feat[py][px] != FEAT_LESS)
  	{
  		msg_print("I see no up staircase here.");
  		return;
--- 20,27 ----
  	int px = p_ptr->px;
  
  	/* Verify stairs */
! 	if (((pa_ptr->prob_travel == 0) && (cave_feat[py][px] != FEAT_LESS))
! 	    || (p_ptr->depth == 0))
  	{
  		msg_print("I see no up staircase here.");
  		return;
***************
*** 52,58 ****
  	int px = p_ptr->px;
  
  	/* Verify stairs */
! 	if (cave_feat[py][px] != FEAT_MORE)
  	{
  		msg_print("I see no down staircase here.");
  		return;
--- 53,60 ----
  	int px = p_ptr->px;
  
  	/* Verify stairs */
! 	if (((pa_ptr->prob_travel == 0) && (cave_feat[py][px] != FEAT_MORE))
! 	    || (p_ptr->depth == 127) || is_quest(p_ptr->depth))
  	{
  		msg_print("I see no down staircase here.");
  		return;
***************
*** 2486,2491 ****
--- 2488,2501 ----
  						/* Message */
  						msg_format("%^s flees in terror!", m_name);
  					}
+ 					if (m_ptr->smart & SM_DOMINATE) {
+ 					  char m_name[80];
+ 
+ 					  monster_desc(m_name, m_ptr, 0x80);
+ 
+ 					  msg_format("%^s howls in rebellion!", m_name);
+ 					  m_ptr->smart &= ~SM_DOMINATE;
+ 					}
  				}
  			}
  
***************
*** 2768,2773 ****
--- 2778,2791 ----
  
  						/* Message */
  						msg_format("%^s flees in terror!", m_name);
+ 					}
+ 					if (m_ptr->smart & SM_DOMINATE) {
+ 					  char m_name[80];
+ 
+ 					  monster_desc(m_name, m_ptr, 0x80);
+ 
+ 					  msg_format("%^s howls in rebellion!", m_name);
+ 					  m_ptr->smart &= ~SM_DOMINATE;
  					}
  				}
  			}
diff -c -w -r \games\angb283/src/cmd4.c ./src/cmd4.c
*** \games\angb283/src/cmd4.c	Mon Feb  9 09:08:02 1998
--- ./src/cmd4.c	Mon Feb 23 17:32:30 1998
***************
*** 2328,2334 ****
  void do_cmd_version(void)
  {
  	/* Silly message */
! 	msg_format("You are playing Angband %d.%d.%d.  Type '?' for more info.",
  	           VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
  }
  
--- 2328,2336 ----
  void do_cmd_version(void)
  {
  	/* Silly message */
!         msg_format("You are playing Psionic Angband Version %s.",
!          PSI_VERSION);
! 	msg_format("Based on Vanilla Angband %d.%d.%d.  Type '?' for more info.",
  	           VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
  }
  
diff -c -w -r \games\angb283/src/cmd5.c ./src/cmd5.c
*** \games\angb283/src/cmd5.c	Mon Feb  9 05:28:10 1998
--- ./src/cmd5.c	Mon Feb 23 17:32:32 1998
***************
*** 38,44 ****
  
  	char out_val[160];
  
! 	cptr p = ((mp_ptr->spell_book == TV_MAGIC_BOOK) ? "spell" : "prayer");
  
  
  	/* Extract spells */
--- 38,45 ----
  
  	char out_val[160];
  
! 	cptr p = ((mp_ptr->spell_book == TV_MAGIC_BOOK) ? "spell" :
! 	((mp_ptr->spell_book == TV_PSI_BOOK) ? "power" : "prayer"));
  
  
  	/* Extract spells */
***************
*** 239,244 ****
--- 240,246 ----
  
  	/* No lite */
  	if (p_ptr->blind || no_lite())
+       if (mp_ptr->spell_book != TV_PSI_BOOK)
  	{
  		msg_print("You cannot see!");
  		return;
***************
*** 257,265 ****
  	item_tester_tval = mp_ptr->spell_book;
  
  	/* Get an item */
  	q = "Browse which book? ";
  	s = "You have no books that you can read.";
! 	if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
  
  	/* Get the item (in the pack) */
  	if (item >= 0)
--- 259,275 ----
  	item_tester_tval = mp_ptr->spell_book;
  
  	/* Get an item */
+    if (mp_ptr->spell_book == TV_PSI_BOOK)
+    {
+      q = "Examine which focus? ";
+      s = "You have no foci to examine. ";
+    }
+    else
+    {
  	q = "Browse which book? ";
  	s = "You have no books that you can read.";
!    }
! 	if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return;
  
  	/* Get the item (in the pack) */
  	if (item >= 0)
***************
*** 275,281 ****
  
  	/* Access the item's sval */
  	sval = o_ptr->sval;
! 
  
  	/* Track the object kind */
  	object_kind_track(o_ptr->k_idx);
--- 285,291 ----
  
  	/* Access the item's sval */
  	sval = o_ptr->sval;
!    if (mp_ptr->spell_book == TV_PSI_BOOK) sval /= 3;
  
  	/* Track the object kind */
  	object_kind_track(o_ptr->k_idx);
***************
*** 334,340 ****
  
  	int spell = -1;
  
! 	cptr p = ((mp_ptr->spell_book == TV_MAGIC_BOOK) ? "spell" : "prayer");
  
  	cptr q, s;
  
--- 344,351 ----
  
  	int spell = -1;
  
! 	cptr p = ((mp_ptr->spell_book == TV_MAGIC_BOOK) ? "spell" :
! 	((mp_ptr->spell_book == TV_PSI_BOOK) ? "power" : "prayer"));
  
  	cptr q, s;
  
***************
*** 348,353 ****
--- 359,365 ----
  	}
  
  	if (p_ptr->blind || no_lite())
+       if (mp_ptr->spell_book != TV_PSI_BOOK)
  	{
  		msg_print("You cannot see!");
  		return;
***************
*** 370,378 ****
  	item_tester_tval = mp_ptr->spell_book;
  
  	/* Get an item */
  	q = "Study which book? ";
  	s = "You have no books that you can read.";
! 	if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
  
  	/* Get the item (in the pack) */
  	if (item >= 0)
--- 382,398 ----
  	item_tester_tval = mp_ptr->spell_book;
  
  	/* Get an item */
+    if (mp_ptr->spell_book == TV_PSI_BOOK)
+    {
+      q = "Examine which focus? ";
+      s = "You have no foci to examine. ";
+    }
+    else
+    {
  	q = "Study which book? ";
  	s = "You have no books that you can read.";
!    }
! 	if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return;
  
  	/* Get the item (in the pack) */
  	if (item >= 0)
***************
*** 400,409 ****
  	/* Mage -- Learn a selected spell */
  	if (mp_ptr->spell_book == TV_MAGIC_BOOK)
  	{
- 		/* Ask for a spell, allow cancel */
  		if (!get_spell(&spell, "study", sval, FALSE) && (spell == -1)) return;
  	}
  
  	/* Priest -- Learn a random prayer */
  	if (mp_ptr->spell_book == TV_PRAYER_BOOK)
  	{
--- 420,432 ----
  	/* Mage -- Learn a selected spell */
  	if (mp_ptr->spell_book == TV_MAGIC_BOOK)
  	{
  		if (!get_spell(&spell, "study", sval, FALSE) && (spell == -1)) return;
+ 		/* Ask for a spell, allow cancel */
  	}
  
+    if (mp_ptr->spell_book == TV_PSI_BOOK)
+ 		if (!get_spell(&spell,"study",sval/3,FALSE) && (spell == -1)) return;
+ 
  	/* Priest -- Learn a random prayer */
  	if (mp_ptr->spell_book == TV_PRAYER_BOOK)
  	{
***************
*** 438,444 ****
  	if (spell < 0)
  	{
  		/* Message */
! 		msg_format("You cannot learn any %ss in that book.", p);
  
  		/* Abort */
  		return;
--- 461,468 ----
  	if (spell < 0)
  	{
  		/* Message */
! 		msg_format("You cannot learn any %ss in that %s.", p,
! 		 (mp_ptr->spell_book == TV_PSI_BOOK) ? "focus" : "book");
  
  		/* Abort */
  		return;
***************
*** 519,524 ****
--- 543,554 ----
  	/* Require spell ability */
  	if (mp_ptr->spell_book != TV_MAGIC_BOOK)
  	{
+                  if (mp_ptr->spell_book == TV_PSI_BOOK)
+                    do_cmd_psi();
+                  else
+                  if (mp_ptr->spell_book == TV_PRAYER_BOOK)
+                    do_cmd_pray();
+                  else
  		msg_print("You cannot cast spells!");
  		return;
  	}
***************
*** 1103,1108 ****
--- 1133,1987 ----
  }
  
  
+ static bool item_tester_hook_drain(object_type *o_ptr)
+ {
+    int t = o_ptr->tval;
+    if ((t != TV_STAFF) && (t != TV_WAND)) return FALSE;
+    return (o_ptr->pval != 0);
+ }
+ 
+ #define req_focus(lvl) if (f_lev<lvl) {msg_print(\
+ "Your focus isn't strong enough to use that power."); return;}
+ 
+ int min(int a,int b) {return (a<b) ? a : b;}
+ 
+ int max(int a,int b) {return (a>b) ? a : b;}
+ 
+ int splice_val = 0,splice_n = 0;
+ 
+ /*
+  * use a psionic power
+  */
+ 
+ void do_cmd_psi(void)
+ {
+ 	int                     item, sval, spell, dir, f_lev;
+ 	int                     chance;
+ 	int                     plev = p_ptr->lev;
+ 
+ 	object_type             *o_ptr;
+ 
+ 	magic_type              *s_ptr;
+    char temp[20];
+ 	int i,j;
+ 
+ 
+ 	/* Require spell ability */
+ 	if (mp_ptr->spell_book != TV_PSI_BOOK)
+ 	{
+                 if (mp_ptr->spell_book == TV_MAGIC_BOOK)
+                   do_cmd_cast();
+                 else
+                 if (mp_ptr->spell_book == TV_PRAYER_BOOK)
+                   do_cmd_pray();
+                  else
+ 		msg_print("You cannot use psionics!");
+ 		return;
+ 	}
+ 
+ 	/* Not when confused */
+ 	if (p_ptr->confused)
+ 	{
+ 		msg_print("You are too confused!");
+ 		return;
+ 	}
+ 
+ 	/* Note: psionics *are* possible when blind */
+ 
+    /* Metapsionics allows use of any focus */
+    if (meta_psi_lev)
+    {
+      /* Restrict choices to spell books */
+ 	  item_tester_tval = mp_ptr->spell_book;
+ 
+ 	  /* Get an item (from inven or floor) */
+ 	  if (!get_item(&item,"Use which discipline? ","You have no psionic foci!"
+    	  ,USE_EQUIP | USE_INVEN | USE_FLOOR)) return;
+ 
+      /* Get the item (in the pack) */
+      if (item >= 0)
+ 	    o_ptr = &inventory[item];
+ 
+      /* Get the item (on the floor) */
+ 	  else
+ 		  o_ptr = &o_list[0 - item];
+ 
+ 	  /* Access the item's sval - extract power and type*/
+ 	  sval = o_ptr->sval;
+      f_lev = sval % 3;
+ 
+      /* If we are using metapsionics limit focus power */
+      if (o_ptr != &inventory[INVEN_NECK]) f_lev = min(meta_psi_lev,f_lev);
+      sval /= 3;
+    }
+    else
+    {
+    o_ptr = &inventory[INVEN_NECK];
+ 
+    item = 0;
+    if (o_ptr) item = (o_ptr->tval == TV_PSI_BOOK);
+    if (!item)
+    {
+      msg_print("You aren't wearing a psionic focus!");
+      return;
+    }
+ 
+    sval = o_ptr->sval;
+    f_lev = sval % 3;
+    sval /= 3;
+    }
+ 
+ 	/* Track the object kind */
+ 	object_kind_track(o_ptr->k_idx);
+ 
+ 	/* Hack -- Handle stuff */
+ 	handle_stuff();
+ 
+ 
+ 	/* Ask for a spell */
+ 	if (!get_spell(&spell, "use", sval , TRUE))
+ 	{
+ 		if (spell == -2) msg_print("You don't know any powers in that discipline.");
+ 		return;
+ 	}
+ 
+ 
+ 	/* Access the spell */
+ 	s_ptr = &mp_ptr->info[spell];
+ 
+ 
+ 	/* Verify "dangerous" spells */
+ 	if (s_ptr->smana > p_ptr->csp)
+ 	{
+ 		/* Warning */
+ 		msg_print("You do not have enough mana to use this power.");
+ 
+ 		/* Verify */
+ 		if (!get_check("Attempt it anyway? ")) return;
+ 	}
+ 
+ 
+ 	/* Spell failure chance */
+ 	chance = spell_chance(spell);
+ 
+ 	/* Failed spell */
+ 	if (rand_int(100) < chance)
+ 	{
+ 		if (flush_failure) flush();
+ 		msg_print("You failed to concentrate hard enough!");
+ 		p_ptr->csp += s_ptr->smana >> 1;
+       if (splice_val)
+       {
+ 	      splice_val -= max(damroll(2,8),splice_val / 2);
+ 	      if (splice_val <= 0) splice_val = 0;
+       }
+ 	}
+ 
+ 	/* Process spell */
+ 	else
+ 	{
+ 
+ 		/* Spells.  */
+ 		switch (spell)
+ 		{
+ 	 /* *** TELEPATHY *** */
+ 
+ 			case 0: /* Mind Thrust */
+ 			{
+ 				if (!get_aim_dir(&dir)) return;
+ 				fire_ball(GF_PSI, dir, damroll(1 + (plev / 4), 4),0);
+ 				break;
+ 			}
+ 
+ 			case 1: /* Mental Barrier */
+ 			{
+ 				msg_print("You shield your psyche from mental attacks.");
+ 		      p_ptr->oops = 1;
+ 		      pa_ptr->mental_barrier += randint(20 + 2 * plev);
+ 	         p_ptr->resist_confu = TRUE;
+ 		      p_ptr->resist_fear = TRUE;
+ 		      p_ptr->sustain_int = TRUE;
+ 		      p_ptr->sustain_wis = TRUE;
+ 	         break;
+ 			}
+ 
+ 			case 2: /* Psychic Crush */
+ 			{
+ 		      req_focus(1);
+ 			   if (!get_aim_dir(&dir)) return;
+ 				fire_ball(GF_PSI2, dir,damroll(plev , 9),0);
+ 				break;
+ 			}
+ 
+ 	 case 3: /* Intimidate */
+     {
+ 				if (!get_aim_dir(&dir)) return;
+ 		      fear_monster(dir,plev * 3);
+ 				break;
+     }
+ 
+ 	 case 4: /* Sleep */
+     {
+ 				if (!get_aim_dir(&dir)) return;
+ 				fire_ball(GF_OLD_SLEEP,dir,plev * 3,0);
+ 				break;
+     }
+ 
+ 			case 5: /* Psionic Blast */
+ 			{
+ 				if (!get_aim_dir(&dir)) return;
+ 				fire_ball(GF_PSI, dir, plev * 5,2);
+ 				break;
+ 			}
+ 
+ 	 case 6: /* Mind Wrack */
+ 	 {
+ 		 req_focus(1);
+ 				if (!get_aim_dir(&dir)) return;
+ 				fire_ball(GF_PSI3,dir,damroll(2 , plev),0);
+ 				break;
+ 	 }
+ 
+ 
+ 			case 7: /* Domination */
+ 			{
+ 		      req_focus(2);
+ 	    if (!get_aim_dir(&dir)) return;
+                  fire_ball(GF_DOMINATE,dir,plev + randint(plev * 4),0);
+ 				break;
+ 			}
+ 
+ 	 case 8: /* Amnesia */
+     {
+ 		 req_focus(2);
+ 				if (!get_aim_dir(&dir)) return;
+ 				fire_ball(GF_AMNESIA,dir,plev +
+ 				  (rand_int(2) ? randint(plev * 3) : 0),0);
+ 				break;
+     }
+ 
+ 	 /* *** PSYCHOPORTATION *** */
+ 
+     case 9: /* Blink */
+ 			{
+ 				teleport_player(10);
+ 				break;
+ 			}
+ 
+ 			case 10: /* Teleport */
+ 			{
+ 				teleport_player(plev * 5);
+ 				break;
+ 			}
+ 
+ 	 case 11: /* Dimension Door */
+     {
+ 	    msg_print("You open a dimensional gate. Choose a destination.");
+ 	    if (!tgt_pt(&i,&j)) return;
+ 	    p_ptr->energy -= 60 - plev;
+ 	    if (!cave_empty_bold(j,i) || (cave_info[j][i] & CAVE_ICKY) ||
+ 	       (distance(j,i,p_ptr->py,p_ptr->px) > plev + 2) ||
+           (!rand_int(plev * plev / 2)))
+ 	    {
+ 	       msg_print("You fail to exit the astral plane correctly!");
+ 	       p_ptr->energy -= 100;
+ 	       teleport_player(10);
+ 	    }
+ 	    else teleport_player_to(j,i);
+ 	    break;
+     }
+ 
+ 			case 12: /* Probability Travel */
+ 	 {
+ 	     req_focus(1);
+ 	     p_ptr->oops = 1;
+ 	     pa_ptr->prob_travel += (plev / 8) - 3 + randint(5);
+ 	     if (pa_ptr->prob_travel > 0)
+ 		  msg_print("You enter the astral plane!");
+ 	     else 
+ 	       {
+ 		msg_print("You fail to reach the astral plane.");
+ 		pa_ptr->prob_travel = 0;
+ 	       }
+ 	     break;
+ 	 }
+ 
+ 			case 13: /* Teleport Other */
+ 			{
+ 	    req_focus(1);
+ 				if (!get_aim_dir(&dir)) return;
+ 				(void)teleport_monster(dir);
+ 				break;
+ 			}
+ 
+ 			case 14: /* Recall */
+ 			{
+ 	    req_focus(2);
+ 				if (!p_ptr->word_recall)
+ 				{
+ 	       if (pa_ptr->ts_anchor)
+ 	       {
+ 		 msg_print("Your time/space anchor prevents you from recalling.");
+ 		 break;
+ 	       }
+ 				   p_ptr->word_recall = rand_int(30);
+ 					msg_print("The air about you becomes charged...");
+ 				}
+ 				else
+ 				{
+ 					p_ptr->word_recall = 0;
+ 					msg_print("A tension leaves the air around you...");
+ 				}
+ 				break;
+ 			}
+ 
+ 	 case 15: /* Time/Space Anchor */
+ 	 {
+ 	   msg_print("With immense mental effort you temporarily stabilize local space.");
+ 	   p_ptr->oops = 1;
+ 	   pa_ptr->ts_anchor += randint(randint(100 + plev));
+ 	   break;
+ 	 }
+ 
+ 			case 16: /* Time Shift */
+ 			{
+ 	    req_focus(2);
+ 	    if (pa_ptr->ts_anchor)
+ 	    {
+ 	      msg_print("You end your time/space anchor.");
+ 	      pa_ptr->ts_anchor = 0;
+ 	    }
+ 		 msg_print("Time freezes around you!");
+ 				p_ptr->energy += damroll(5,plev);
+ 				break;
+ 			}
+ 
+ 	 /* *** PSYCHOMETABOLISM *** */
+ 
+ 			case 17: /* Cell Adjustment */
+ 			{
+ 				(void)hp_player(damroll(plev / 2, 6));
+ 				(void)set_cut(p_ptr->cut - 15);
+ 				break;
+ 			}
+ 
+ 			case 18: /* Satisfy Hunger */
+ 			{
+ 				(void)set_food(PY_FOOD_MAX - 1);
+ 				break;
+ 			}
+ 
+                         case 19: /* Adrenaline Control */
+ 	 {
+             msg_print("Adrenaline surges through your veins!");
+ 	    p_ptr->oops = 1;
+             pa_ptr->adrenaline += randint(20) + plev;
+        p_ptr->update |= PU_BONUS | PU_HP;
+        handle_stuff();
+        while (pa_ptr->adrenaline > 30 + randint(plev * 4))
+        {
+          msg_print("Your body can't handle that much adrenaline!");
+          i = randint(randint(pa_ptr->adrenaline));
+          take_hit(damroll(5,i * 2),"adrenaline poisoning");
+          pa_ptr->adrenaline -= i;
+        }
+        break;
+ 	 }
+ 
+ 			case 20: /* Biofeedback */
+ 	 {
+ 	    msg_print("Your pulse slows and your body prepares to resist damage.");
+ 	    p_ptr->oops = 1;
+ 	    pa_ptr->biofeedback += randint(10 + plev);
+        while (pa_ptr->biofeedback > 25 + rand_int(rand_int(plev)))
+        {
+          msg_print("You speed up your pulse to avoid fainting!");
+          pa_ptr->biofeedback -= randint(20);
+        }
+ 	    break;
+ 	 }
+ 
+ 			case 21: /* Shadowform */
+ 	 {
+        req_focus(2);
+ 	    msg_print("You leave the physical world and become a living shadow!");
+ 	    p_ptr->oops = 1;
+ 	    pa_ptr->shadow_form += randint(randint(plev + 12));
+        if (pa_ptr->shadow_form > 30 + randint(plev * 2))
+        {
+          msg_print("You begin to fade into the netherworld!");
+          i = randint(pa_ptr->shadow_form);
+          _killer = "shadows";
+          project(-2,1,p_ptr->py,p_ptr->px,damroll(i,6),GF_NETHER,
+            PROJECT_KILL);
+          pa_ptr->shadow_form -= i;
+          if (pa_ptr->shadow_form < 0) pa_ptr->shadow_form = 0;
+        }
+ 	    break;
+ 	 }
+ 
+ 			case 22: /* Drain Life */
+ 			{
+ 	         req_focus(1);
+ 				if (!get_aim_dir(&dir)) return;
+ 				life_drained = 0;
+             fade_dam_on = TRUE;
+ 				fire_bolt_or_beam(plev,GF_OLD_DRAIN,dir,
+ 					damroll(plev,10));
+             fade_dam_on = FALSE;
+ 				if (life_drained) hp_player(life_drained / 2);
+ 	    break;
+ 			}
+ 			  
+ 	 case 23: /* Double Pain */
+     {
+ 	         req_focus(2);
+ 				if (!get_aim_dir(&dir)) return;
+ 				fire_ball(GF_PAIN,dir,randint(plev * 3 + 15),0);
+ 				break;
+     }
+ 
+ 			case 24: /* Energy Contaiment */
+ 			{
+ 	         int n = 10 + randint(20);
+ 			   (void)set_oppose_acid(p_ptr->oppose_acid + n);
+ 			   (void)set_oppose_elec(p_ptr->oppose_elec + n);
+ 				(void)set_oppose_fire(p_ptr->oppose_fire + n);
+ 				(void)set_oppose_cold(p_ptr->oppose_cold + n);
+ 				(void)set_oppose_pois(p_ptr->oppose_pois + n);
+ 	    break;
+ 			}
+ 
+ 			case 25: /* Death Field */
+ 			{
+ 	         req_focus(1);
+ 				sprintf(temp,"Intensity (1-%d): ",plev);
+ 				i = get_quantity(temp,plev);
+ 				i = damroll(6,i);
+ 				msg_print("Waves of darkness begin emanating from your body.");
+ 				take_hit(damroll(2,i),"idiocy");
+ 				project(-1,3,p_ptr->py,p_ptr->px,damroll(15,i),GF_NETHER,
+ 				  PROJECT_KILL);
+ 				break;
+ 			}
+ 
+ 			case 26 : /* Complete Healing */
+ 			{
+ 	         req_focus(1);
+ 				msg_print(
+ 				  "You enter a trance and your body begins to rapidly recover.");
+ 				(void)hp_player(5000);
+ 				(void)set_poisoned(0);
+ 				(void)set_stun(0);
+ 				(void)set_cut(0);
+ 				p_ptr->energy -= 350 - plev * 2;
+ 				break;
+ 			}
+ 
+ 	 /* *** PSYCHOKINESIS *** */
+ 
+ 	 case 27: /* Light Control */
+ 	 {
+        if (!p_ptr->blind) msg_print(
+ 	"Your infrared transforms into a brilliant burst of visible light.");
+        project(-1,(plev / 10) + 1,p_ptr->py,p_ptr->px,damroll(3, plev),
+        GF_LITE_WEAK, PROJECT_GRID | PROJECT_KILL);
+        lite_room(p_ptr->py,p_ptr->px);
+ 	    break;
+ 	 }
+ 
+ 			case 28: /* Inertial Barrier */
+ 	 {
+ 	    msg_print("The air around you solidifies into a protective shield.");
+ 	    p_ptr->oops = 1;
+ 	    pa_ptr->inertial_barrier += randint(20 + plev / 2);
+        while (pa_ptr->inertial_barrier > plev + randint(200))
+        {
+           msg_print("The inertia makes it difficult to move!");
+           _killer = "air pressure";
+           i = randint(50);
+           project(-2,randint(3),p_ptr->py,p_ptr->px,i * 2,GF_INERTIA,
+             PROJECT_KILL);
+           if ((pa_ptr->inertial_barrier -= i) < 0)
+             pa_ptr->inertial_barrier = 0;
+        }
+        break;
+ 	 }
+ 
+ 			case 29: /* Project Force */
+ 			{
+ 				if (!get_aim_dir(&dir)) return;
+             if (plev > 30) plev = 30 + (plev - 30) / 4;
+             fade_dam_on = TRUE;
+ 				fire_beam(GF_FORCE,dir,damroll(3,plev));
+             fade_dam_on = FALSE;
+ 				break;
+ 			}
+ 
+ 	 case 30: /* Sonic Boom */
+ 	 {
+ 				if (!get_aim_dir(&dir)) return;
+             msg_print("Sonic Boom!!");
+             if (plev > 30) plev = 30 + (plev - 30) / 4;
+ 				fire_ball(GF_SOUND, dir,30 + 2 * plev,5);
+ 	    break;
+ 	 }
+ 
+ 			case 31: /* Disintegrate */
+ 			{
+ 	         req_focus(1);
+ 				if (!get_aim_dir(&dir)) return;
+             if (plev > 30) plev = 30 + (plev - 30) / 2;
+ 				fire_ball(GF_DISINTEGRATE,dir,damroll(plev,9),2);
+             break;
+ 			}
+ 
+ 			case 32: /* Sphere of Cold */
+ 			{
+ 	         req_focus(1);
+ 				if (!get_aim_dir(&dir)) return;
+ 				fire_ball(GF_COLD,dir,plev * 9 - 36,1);
+ 				break;
+ 			}
+ 
+ 			case 33: /* Fire Eruption */
+ 			{
+ 	         req_focus(1);
+ 				if (!get_aim_dir(&dir)) return;
+ 				fire_ball(GF_FIRE,dir,plev * 15 - 65,0);
+ 				break;
+ 			}
+ 
+ 			case 34: /* Detonate */
+ 			{
+ 				if (!get_aim_dir(&dir)) return;
+ 				fire_ball(GF_METEOR,dir,damroll(20,plev),2);
+ 				break;
+ 			}
+ 
+ 			case 35: /* Balefire */
+ 			{
+ 	         req_focus(2);
+ 				if (!get_aim_dir(&dir)) return;
+ 				fire_beam(GF_FIRE,dir,damroll(5,p_ptr->chp));
+ 				break;
+ 			}
+ 
+ 	 /* *** METAPSIONICS *** */
+ 
+ 			case 36: /* Cannibalize */
+ 	 {
+ 	    int m = 0,h;
+        do
+        {
+ 	      m = get_quantity("How much mana?",999);
+          if (pa_ptr->precognition)
+            msg_print(format("That would probably leave you with %d hp.",
+              p_ptr->chp - (m * 5) / 2));
+ 	      if (!m) return;
+        } while (!get_check(format("Confirm %d mana?",m)));
+        m += rand_int(6) - 2;
+ 	    if (m<0) return;
+ 	    p_ptr->csp += m;
+ 	    for (h=0;m;m--) h += rand_int(6);
+ 	    msg_print("You begin converting your life force into psionic power.");
+ 	    take_hit(h,"idiocy");
+ 	    break;
+ 	 }
+ 
+ 	 case 37: /* Splice */
+     {
+ 	req_focus(1);
+ 	if (splice_val)
+ 	{
+ 	  splice_val = 0;
+ 	  return;
+ 	}
+ 	splice_val = get_quantity(format(
+ 	"Type in amount of mana to spend to begin splice (max %d).",plev),plev);
+ 	splice_n = 0;
+ 	p_ptr->csp -= splice_val;
+ 	while (splice_val) do_cmd_psi();
+ 	msg_print("Your splice unravels.");
+ 	break;
+     }
+ 
+ 	 case 38: /* Receptacle */
+ 	   item_tester_hook = item_tester_hook_drain;
+ 	   if (!get_item(&item, "Drain what item?", "Nothing charged to drain",
+        USE_EQUIP | USE_FLOOR | USE_INVEN)) break;
+       if (item >= 0) o_ptr = &inventory[item];
+ 	    else o_ptr = &o_list[0 - item];
+ 
+ 	   msg_print("Energy drains from your pack!");
+ 
+       i = 0;
+ 	   while ((p_ptr->csp < p_ptr->msp) && (o_ptr->pval > 0) &&
+            (i < 6 + randint(60)))
+       {
+ 	     p_ptr->csp += damroll(o_ptr->number,plev);
+         j = randint((plev > 40) ? randint(6) : 6);
+ 	     o_ptr->pval -= j;
+         i += j;
+       }
+ 
+       if ((j = o_ptr->pval) < 0) o_ptr->pval = 0;
+       else
+         if ((i = i * i - 40) > 0)
+          if (rand_int(2)) /* Straight up 50% save */
+           if (damroll(3,20) < i + damroll(j,6))
+           {
+              msg_print("There is a bright flash of light.");
+              			/* Reduce and describe inventory */
+              if (item >= 0)
+ 			    {
+ 				    inven_item_increase(item, -999);
+ 				    inven_item_describe(item);
+ 				    inven_item_optimize(item);
+              }
+ 
+ 			   /* Reduce and describe floor item */
+ 			   else
+ 			   {
+                 floor_item_increase(0 - item, -999);
+ 				    floor_item_describe(0 - item);
+ 				    floor_item_optimize(0 - item);
+             }
+ 
+              i = damroll(j,(j>20 ? 16 : j));
+              _killer = "a burst of magical energy";
+              project(-2,i > 50 ? 3 : 2,p_ptr->py,p_ptr->px,i,GF_MANA,
+                PROJECT_GRID | PROJECT_KILL | PROJECT_ITEM);
+           }
+ 
+       /* Combine / Reorder the pack */
+       p_ptr->notice |= (PN_COMBINE | PN_REORDER);
+ 
+       /* Window stuff */
+       p_ptr->window |= (PW_INVEN);
+ 
+       /* Done */
+       break;
+ 
+ 			 case 39: /* Empower */
+ 			{
+ 				recharge(rand_int(3)?100:100*randint(randint(plev)));
+ 				break;
+ 			}
+ 
+ 			case 40: /* Psychic Drain */
+ 			{
+ 				req_focus(2);
+ 				if (!get_aim_dir(&dir)) return;
+ 				life_drained = 0;
+                                 fade_dam_on = TRUE;
+                                 fire_ball(GF_PSI_DRAIN,dir,damroll(plev/2,6),1
+                                  + (rand_int(6) != 0) - (rand_int(5) != 0));
+                                 fade_dam_on = FALSE;
+ 				p_ptr->csp += damroll(5,life_drained) >> 2;
+                                 p_ptr->energy -= randint(150);
+ 				break;
+ 			}
+ 
+ 			case 41: /* Psychic Surgery */
+ 			{
+ 				restore_level();
+ 				set_afraid(0);
+ 				(void)do_res_stat(A_WIS);
+ 				(void)do_res_stat(A_INT);
+ 				break;
+ 			}
+ 
+ 			case 42: /* Time Control */
+ 			{
+ 				req_focus(1);
+ 				if (pa_ptr->ts_anchor)
+ 				{
+ 				  msg_print("You end your time/space anchor.");
+ 				  pa_ptr->ts_anchor = 0;
+ 				}
+ 				(void)set_fast(p_ptr->fast + plev + randint(20));
+             while (p_ptr->fast > 100 + randint(plev * 10))
+             {
+               msg_print("You accelerate time too much!");
+               i = randint(randint(randint(p_ptr->fast * 3)));
+               _killer = "a blast from the past.";
+               project(-2,rand_int(5),p_ptr->py,p_ptr->px,i,GF_TIME,
+                 PROJECT_KILL);
+               p_ptr->fast -= i;
+               if (p_ptr->fast < 0) p_ptr->fast = 0;
+             }
+ 				break;
+ 			}
+ 
+ 			case 43: /* Ultrablast */
+ 			{
+ 				req_focus(1);
+ 				project(-1,4,p_ptr->py,p_ptr->px,damroll(40,plev),GF_PSI2,
+ 				 PROJECT_KILL);
+ 				break;
+ 			}
+ 
+ 				
+ 			case 44: /* *Ultrablast* */
+ 			{
+ 				req_focus(2);
+ 				project(-1,7,p_ptr->py,p_ptr->px,damroll(100,plev),GF_PSI2,
+ 				  PROJECT_KILL);
+ 				break;
+ 			}
+ 
+ 			/* *** CLAIRSENTIENCE *** */
+ 
+ 			case 45: /* Detect Monsters */
+ 			{
+ 				(void)detect_monsters_normal();
+ 				break;
+ 			}
+ 
+ 			case 46: /* Awareness */
+ 			{
+ 				msg_print("You become aware of nearby intelligence!");
+ 				p_ptr->oops = 1;
+ 				pa_ptr->awareness += plev * plev / 5 + randint(80);
+ 				p_ptr->telepathy = TRUE;
+ 				break;
+ 			}
+ 
+ 			case 47: /* Reveal Secrets */
+ 			{
+ 				detect_doors();
+ 				detect_traps();
+ 				detect_stairs();
+ 				break;
+ 			}
+ 
+ 			case 48: /* Clairvoyance */
+ 			{
+ 				msg_print("An image of your surroundings forms in your mind...");
+ 				map_area();
+ 				break;
+ 			}
+ 
+ 			case 49: /* Read Object */
+ 			{
+ 		      req_focus(1);
+ 			   (void)ident_spell();
+ 				break;
+ 			}
+ 
+ 			case 50: /* Read Aura */
+ 	 {
+        req_focus(2);
+ 	    (void)identify_fully();
+ 	    break;
+ 	 }
+ 
+ 	 case 51: /* Precognition */
+ 	 {
+        req_focus(2);
+ 	    msg_print("Images from the future begin to flash before your eyes.");
+ 	    p_ptr->oops = 1;
+ 	    pa_ptr->precognition += randint(plev);
+ 	    break;
+ 	 }
+ 
+ 	 case 52: /* Analyze Monster */
+ 	 {
+ 	    req_focus(2);
+ 	    if (!get_aim_dir(&dir)) return;
+        fire_ball(GF_ANALYZE,dir,2 * plev,0);
+ 	    break;
+ 	 }
+ 
+ 	 default:
+ 			{
+ 				msg_format("%s not implemented",
+ 				  spell_names[mp_ptr->spell_type][spell]);
+ 				break;
+ 			}
+ 		}
+ 
+ 		/* A spell was cast */
+ 		if (!((spell < 32) ?
+ 		      (p_ptr->spell_worked1 & (1L << spell)) :
+ 		      (p_ptr->spell_worked2 & (1L << (spell - 32)))))
+ 		{
+ 			int e = s_ptr->sexp;
+ 
+ 			/* The spell worked */
+ 			if (spell < 32)
+ 			{
+ 				p_ptr->spell_worked1 |= (1L << spell);
+ 			}
+ 			else
+ 			{
+ 				p_ptr->spell_worked2 |= (1L << (spell - 32));
+ 			}
+ 
+ 			/* Gain experience */
+ 			gain_exp(e * s_ptr->slevel);
+ 		}
+       if (splice_val)
+ 	{
+ 	   p_ptr->command_dir = 0; /* change targets */
+ 	   splice_val -= s_ptr->smana / 3 + ++splice_n;
+ 	   if (splice_val < 0) splice_val = 0; else
+ 	     msg_format("%d splice points remaining.",splice_val);
+ 	}
+ 
+ 	}
+ 
+ 	/* Take a turn */
+ 	p_ptr->energy_use = 100;
+ 
+ 	/* Sufficient mana */
+ 	if (s_ptr->smana <= p_ptr->csp)
+ 	{
+ 		/* Use some mana */
+ 		p_ptr->csp -= s_ptr->smana;
+ 	}
+ 
+ 	/* Over-exert the player */
+ 	else
+ 	{
+ 		int oops = s_ptr->smana - p_ptr->csp;
+ 
+ 		/* No mana left */
+ 		p_ptr->csp = 0;
+ 		p_ptr->csp_frac = 0;
+ 
+ 		/* Message */
+ 		msg_print("You faint from the effort!");
+ 
+ 		/* Hack -- Bypass free action */
+ 		(void)set_paralyzed(p_ptr->paralyzed + randint(5 * oops + 1));
+ 
+ 		if (rand_int(100) < 50)
+ 		{
+ 			bool perm = (rand_int(100) < 25);
+ 
+ 			/* Message */
+ 			msg_print("You have damaged your psyche!");
+ 
+ 			(void)dec_stat(A_INT, 15 + randint(10), perm);
+ 			(void)dec_stat(A_WIS, 15 + randint(10), perm);
+ 		}
+ 	}
+ 
+ 	if (p_ptr->csp >= p_ptr->msp)
+ 	{
+ 	  p_ptr->csp = p_ptr->msp;
+ 	  p_ptr->csp_frac = 0;
+ 	}
+ 
+ 	/* Redraw mana */
+ 	p_ptr->redraw |= (PR_MANA);
+ 
+ 	/* Window stuff */
+ 	p_ptr->window |= (PW_PLAYER);
+ }
+ 
  /*
   * Brand the current weapon
   */
***************
*** 1171,1176 ****
--- 2050,2061 ----
  	/* Must use prayer books */
  	if (mp_ptr->spell_book != TV_PRAYER_BOOK)
  	{
+                 if (mp_ptr->spell_book == TV_MAGIC_BOOK)
+                   do_cmd_cast();
+                 else
+                 if (mp_ptr->spell_book == TV_PSI_BOOK)
+                   do_cmd_psi();
+                  else
  		msg_print("Pray hard enough and your prayers may be answered.");
  		return;
  	}
diff -c -w -r \games\angb283/src/cmd6.c ./src/cmd6.c
*** \games\angb283/src/cmd6.c	Fri Feb  6 09:10:30 1998
--- ./src/cmd6.c	Mon Feb 23 17:32:34 1998
***************
*** 2993,2999 ****
  
  			case ART_RAZORBACK:
  			{
! 				msg_print("Your armor is surrounded by lightning...");
  				for (i = 0; i < 8; i++) fire_ball(GF_ELEC, ddd[i], 150, 3);
  				o_ptr->timeout = 1000;
  				break;
--- 2993,2999 ----
  
  			case ART_RAZORBACK:
  			{
! 				msg_print("You call forth ball lightning!");
  				for (i = 0; i < 8; i++) fire_ball(GF_ELEC, ddd[i], 150, 3);
  				o_ptr->timeout = 1000;
  				break;
***************
*** 3001,3007 ****
  
  			case ART_BLADETURNER:
  			{
! 				msg_print("Your armor glows many colours...");
  				(void)hp_player(30);
  				(void)set_afraid(0);
  				(void)set_shero(p_ptr->shero + randint(50) + 50);
--- 3001,3007 ----
  
  			case ART_BLADETURNER:
  			{
! 				msg_print("You are surrounded by many colours...");
  				(void)hp_player(30);
  				(void)set_afraid(0);
  				(void)set_shero(p_ptr->shero + randint(50) + 50);
***************
*** 3018,3024 ****
  
  			case ART_SOULKEEPER:
  			{
! 				msg_print("Your armor glows a bright white...");
  				msg_print("You feel much better...");
  				(void)hp_player(1000);
  				(void)set_cut(0);
--- 3018,3024 ----
  
  			case ART_SOULKEEPER:
  			{
! 				msg_print("You see a bright white glow...");
  				msg_print("You feel much better...");
  				(void)hp_player(1000);
  				(void)set_cut(0);
***************
*** 3028,3034 ****
  
  			case ART_BELEGENNON:
  			{
! 				msg_print("Your armor twists space around you...");
  				teleport_player(10);
  				o_ptr->timeout = 2;
  				break;
--- 3028,3034 ----
  
  			case ART_BELEGENNON:
  			{
! 				msg_print("Space is twisted around you...");
  				teleport_player(10);
  				o_ptr->timeout = 2;
  				break;
***************
*** 3036,3042 ****
  
  			case ART_CELEBORN:
  			{
! 				msg_print("Your armor glows deep blue...");
  				(void)genocide();
  				o_ptr->timeout = 500;
  				break;
--- 3036,3042 ----
  
  			case ART_CELEBORN:
  			{
! 				msg_print("You see a deep blue glow...");
  				(void)genocide();
  				o_ptr->timeout = 500;
  				break;
***************
*** 3044,3050 ****
  
  			case ART_CASPANION:
  			{
! 				msg_print("Your armor glows bright red...");
  				destroy_doors_touch();
  				o_ptr->timeout = 10;
  				break;
--- 3044,3050 ----
  
  			case ART_CASPANION:
  			{
! 				msg_print("You see a bright red glow...");
  				destroy_doors_touch();
  				o_ptr->timeout = 10;
  				break;
***************
*** 3053,3059 ****
  
  			case ART_HOLHENNETH:
  			{
! 				msg_print("Your helm glows bright white...");
  				msg_print("An image forms in your mind...");
  				detect_all();
  				o_ptr->timeout = rand_int(55) + 55;
--- 3053,3059 ----
  
  			case ART_HOLHENNETH:
  			{
! 				msg_print("You see a bright white glow...");
  				msg_print("An image forms in your mind...");
  				detect_all();
  				o_ptr->timeout = rand_int(55) + 55;
***************
*** 3062,3068 ****
  
  			case ART_GONDOR:
  			{
! 				msg_print("Your crown glows deep blue...");
  				msg_print("You feel a warm tingling inside...");
  				(void)hp_player(500);
  				(void)set_cut(0);
--- 3062,3068 ----
  
  			case ART_GONDOR:
  			{
! 				msg_print("You see a deep blue glow...");
  				msg_print("You feel a warm tingling inside...");
  				(void)hp_player(500);
  				(void)set_cut(0);
***************
*** 3073,3079 ****
  
  			case ART_COLLUIN:
  			{
! 				msg_print("Your cloak glows many colours...");
  				(void)set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20);
  				(void)set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20);
  				(void)set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20);
--- 3073,3079 ----
  
  			case ART_COLLUIN:
  			{
! 				msg_print("You are surrounded by many colours...");
  				(void)set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20);
  				(void)set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20);
  				(void)set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20);
***************
*** 3085,3091 ****
  
  			case ART_HOLCOLLETH:
  			{
! 				msg_print("Your cloak glows deep blue...");
  				sleep_monsters_touch();
  				o_ptr->timeout = 55;
  				break;
--- 3085,3091 ----
  
  			case ART_HOLCOLLETH:
  			{
! 				msg_print("You see a deep blue glow...");
  				sleep_monsters_touch();
  				o_ptr->timeout = 55;
  				break;
***************
*** 3093,3099 ****
  
  			case ART_THINGOL:
  			{
! 				msg_print("Your cloak glows bright yellow...");
  				recharge(60);
  				o_ptr->timeout = 70;
  				break;
--- 3093,3099 ----
  
  			case ART_THINGOL:
  			{
! 				msg_print("You see a bright yellow glow...");
  				recharge(60);
  				o_ptr->timeout = 70;
  				break;
***************
*** 3101,3107 ****
  
  			case ART_COLANNON:
  			{
! 				msg_print("Your cloak twists space around you...");
  				teleport_player(100);
  				o_ptr->timeout = 45;
  				break;
--- 3101,3107 ----
  
  			case ART_COLANNON:
  			{
! 				msg_print("Space is twisted around you...");
  				teleport_player(100);
  				o_ptr->timeout = 45;
  				break;
***************
*** 3109,3115 ****
  
  			case ART_LUTHIEN:
  			{
! 				msg_print("Your cloak glows a deep red...");
  				restore_level();
  				o_ptr->timeout = 450;
  				break;
--- 3109,3115 ----
  
  			case ART_LUTHIEN:
  			{
! 				msg_print("You see a deep red glow...");
  				restore_level();
  				o_ptr->timeout = 450;
  				break;
***************
*** 3118,3124 ****
  
  			case ART_CAMMITHRIM:
  			{
! 				msg_print("Your gloves glow extremely brightly...");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_MISSILE, dir, damroll(2, 6));
  				o_ptr->timeout = 2;
--- 3118,3124 ----
  
  			case ART_CAMMITHRIM:
  			{
! 				msg_print("You see an extremely bright glow...");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_MISSILE, dir, damroll(2, 6));
  				o_ptr->timeout = 2;
***************
*** 3127,3133 ****
  
  			case ART_PAURHACH:
  			{
! 				msg_print("Your gauntlets are covered in fire...");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_FIRE, dir, damroll(9, 8));
  				o_ptr->timeout = rand_int(8) + 8;
--- 3127,3133 ----
  
  			case ART_PAURHACH:
  			{
! 				msg_print("You call forth a bolt of fire!");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_FIRE, dir, damroll(9, 8));
  				o_ptr->timeout = rand_int(8) + 8;
***************
*** 3136,3142 ****
  
  			case ART_PAURNIMMEN:
  			{
! 				msg_print("Your gauntlets are covered in frost...");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_COLD, dir, damroll(6, 8));
  				o_ptr->timeout = rand_int(7) + 7;
--- 3136,3142 ----
  
  			case ART_PAURNIMMEN:
  			{
! 				msg_print("You call forth an icy blast!");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_COLD, dir, damroll(6, 8));
  				o_ptr->timeout = rand_int(7) + 7;
***************
*** 3145,3151 ****
  
  			case ART_PAURAEGEN:
  			{
! 				msg_print("Your gauntlets are covered in sparks...");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_ELEC, dir, damroll(4, 8));
  				o_ptr->timeout = rand_int(6) + 6;
--- 3145,3151 ----
  
  			case ART_PAURAEGEN:
  			{
! 				msg_print("You call forth a lightning bolt!");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_ELEC, dir, damroll(4, 8));
  				o_ptr->timeout = rand_int(6) + 6;
***************
*** 3154,3160 ****
  
  			case ART_PAURNEN:
  			{
! 				msg_print("Your gauntlets are covered in acid...");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_ACID, dir, damroll(5, 8));
  				o_ptr->timeout = rand_int(5) + 5;
--- 3154,3160 ----
  
  			case ART_PAURNEN:
  			{
! 				msg_print("A stream of acid spews forth!");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_ACID, dir, damroll(5, 8));
  				o_ptr->timeout = rand_int(5) + 5;
***************
*** 3163,3169 ****
  
  			case ART_FINGOLFIN:
  			{
! 				msg_print("Your cesti grows magical spikes...");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_ARROW, dir, 150);
  				o_ptr->timeout = rand_int(90) + 90;
--- 3163,3169 ----
  
  			case ART_FINGOLFIN:
  			{
! 				msg_print("Huge magical spikes shoot out!");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_ARROW, dir, 150);
  				o_ptr->timeout = rand_int(90) + 90;
***************
*** 3173,3179 ****
  
  			case ART_FEANOR:
  			{
! 				msg_print("Your boots glow bright green...");
  				if (!p_ptr->fast)
  				{
  					(void)set_fast(randint(20) + 20);
--- 3173,3179 ----
  
  			case ART_FEANOR:
  			{
! 				msg_print("You see a bright green glow...");
  				if (!p_ptr->fast)
  				{
  					(void)set_fast(randint(20) + 20);
***************
*** 3188,3194 ****
  
  			case ART_DAL:
  			{
! 				msg_print("Your boots glow deep blue...");
  				(void)set_afraid(0);
  				(void)set_poisoned(0);
  				o_ptr->timeout = 5;
--- 3188,3194 ----
  
  			case ART_DAL:
  			{
! 				msg_print("You see a deep blue glow...");
  				(void)set_afraid(0);
  				(void)set_poisoned(0);
  				o_ptr->timeout = 5;
***************
*** 3198,3204 ****
  
  			case ART_NARTHANC:
  			{
! 				msg_print("Your dagger is covered in fire...");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_FIRE, dir, damroll(9, 8));
  				o_ptr->timeout = rand_int(8) + 8;
--- 3198,3204 ----
  
  			case ART_NARTHANC:
  			{
! 				msg_print("You call forth a fire bolt!");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_FIRE, dir, damroll(9, 8));
  				o_ptr->timeout = rand_int(8) + 8;
***************
*** 3207,3213 ****
  
  			case ART_NIMTHANC:
  			{
! 				msg_print("Your dagger is covered in frost...");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_COLD, dir, damroll(6, 8));
  				o_ptr->timeout = rand_int(7) + 7;
--- 3207,3213 ----
  
  			case ART_NIMTHANC:
  			{
! 				msg_print("You call forth an icy blast!");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_COLD, dir, damroll(6, 8));
  				o_ptr->timeout = rand_int(7) + 7;
***************
*** 3216,3222 ****
  
  			case ART_DETHANC:
  			{
! 				msg_print("Your dagger is covered in sparks...");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_ELEC, dir, damroll(4, 8));
  				o_ptr->timeout = rand_int(6) + 6;
--- 3216,3222 ----
  
  			case ART_DETHANC:
  			{
! 				msg_print("You call forth a lightning bolt!");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_ELEC, dir, damroll(4, 8));
  				o_ptr->timeout = rand_int(6) + 6;
***************
*** 3225,3231 ****
  
  			case ART_RILIA:
  			{
! 				msg_print("Your dagger throbs deep green...");
  				if (!get_aim_dir(&dir)) return;
  				fire_ball(GF_POIS, dir, 12, 3);
  				o_ptr->timeout = rand_int(4) + 4;
--- 3225,3231 ----
  
  			case ART_RILIA:
  			{
! 				msg_print("You see a throbbing green light...");
  				if (!get_aim_dir(&dir)) return;
  				fire_ball(GF_POIS, dir, 12, 3);
  				o_ptr->timeout = rand_int(4) + 4;
***************
*** 3234,3240 ****
  
  			case ART_BELANGIL:
  			{
! 				msg_print("Your dagger is covered in frost...");
  				if (!get_aim_dir(&dir)) return;
  				fire_ball(GF_COLD, dir, 48, 2);
  				o_ptr->timeout = rand_int(5) + 5;
--- 3234,3240 ----
  
  			case ART_BELANGIL:
  			{
! 				msg_print("You hear the howl of a fearsome winter storm!");
  				if (!get_aim_dir(&dir)) return;
  				fire_ball(GF_COLD, dir, 48, 2);
  				o_ptr->timeout = rand_int(5) + 5;
***************
*** 3243,3249 ****
  
  			case ART_ARUNRUTH:
  			{
! 				msg_print("Your sword glows a pale blue...");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_COLD, dir, damroll(12, 8));
  				o_ptr->timeout = 500;
--- 3243,3249 ----
  
  			case ART_ARUNRUTH:
  			{
! 				msg_print("You see a pale blue glow...");
  				if (!get_aim_dir(&dir)) return;
  				fire_bolt(GF_COLD, dir, damroll(12, 8));
  				o_ptr->timeout = 500;
***************
*** 3252,3258 ****
  
  			case ART_RINGIL:
  			{
! 				msg_print("Your sword glows an intense blue...");
  				if (!get_aim_dir(&dir)) return;
  				fire_ball(GF_COLD, dir, 100, 2);
  				o_ptr->timeout = 300;
--- 3252,3258 ----
  
  			case ART_RINGIL:
  			{
! 				msg_print("You see an intense blue glow...");
  				if (!get_aim_dir(&dir)) return;
  				fire_ball(GF_COLD, dir, 100, 2);
  				o_ptr->timeout = 300;
***************
*** 3261,3267 ****
  
  			case ART_ANDURIL:
  			{
! 				msg_print("Your sword glows an intense red...");
  				if (!get_aim_dir(&dir)) return;
  				fire_ball(GF_FIRE, dir, 72, 2);
  				o_ptr->timeout = 400;
--- 3261,3267 ----
  
  			case ART_ANDURIL:
  			{
! 				msg_print("You see an intense red glow...");
  				if (!get_aim_dir(&dir)) return;
  				fire_ball(GF_FIRE, dir, 72, 2);
  				o_ptr->timeout = 400;
***************
*** 3271,3277 ****
  
  			case ART_THEODEN:
  			{
! 				msg_print("Your axe blade glows black...");
  				if (!get_aim_dir(&dir)) return;
  				drain_life(dir, 120);
  				o_ptr->timeout = 400;
--- 3271,3277 ----
  
  			case ART_THEODEN:
  			{
! 				msg_print("You see a black aura...");
  				if (!get_aim_dir(&dir)) return;
  				drain_life(dir, 120);
  				o_ptr->timeout = 400;
***************
*** 3280,3286 ****
  
  			case ART_AEGLOS:
  			{
! 				msg_print("Your spear glows a bright white...");
  				if (!get_aim_dir(&dir)) return;
  				fire_ball(GF_COLD, dir, 100, 2);
  				o_ptr->timeout = 500;
--- 3280,3286 ----
  
  			case ART_AEGLOS:
  			{
! 				msg_print("You see a bright white glow...");
  				if (!get_aim_dir(&dir)) return;
  				fire_ball(GF_COLD, dir, 100, 2);
  				o_ptr->timeout = 500;
***************
*** 3289,3295 ****
  
  			case ART_OROME:
  			{
! 				msg_print("Your spear pulsates...");
  				if (!get_aim_dir(&dir)) return;
  				wall_to_mud(dir);
  				o_ptr->timeout = 5;
--- 3289,3295 ----
  
  			case ART_OROME:
  			{
! 				msg_print("You hear distant pounding...");
  				if (!get_aim_dir(&dir)) return;
  				wall_to_mud(dir);
  				o_ptr->timeout = 5;
***************
*** 3298,3304 ****
  
  			case ART_EONWE:
  			{
! 				msg_print("Your axe lets out a long, shrill note...");
  				(void)mass_genocide();
  				o_ptr->timeout = 1000;
  				break;
--- 3298,3304 ----
  
  			case ART_EONWE:
  			{
! 				msg_print("You hear a long, shrill note...");
  				(void)mass_genocide();
  				o_ptr->timeout = 1000;
  				break;
***************
*** 3306,3312 ****
  
  			case ART_LOTHARANG:
  			{
! 				msg_print("Your battle axe radiates deep purple...");
  				hp_player(damroll(4, 8));
  				(void)set_cut((p_ptr->cut / 2) - 50);
  				o_ptr->timeout = rand_int(3) + 3;
--- 3306,3312 ----
  
  			case ART_LOTHARANG:
  			{
! 				msg_print("You see a deep purple glow...");
  				hp_player(damroll(4, 8));
  				(void)set_cut((p_ptr->cut / 2) - 50);
  				o_ptr->timeout = rand_int(3) + 3;
***************
*** 3315,3321 ****
  
  			case ART_ULMO:
  			{
! 				msg_print("Your trident glows deep red...");
  				if (!get_aim_dir(&dir)) return;
  				teleport_monster(dir);
  				o_ptr->timeout = 150;
--- 3315,3321 ----
  
  			case ART_ULMO:
  			{
! 				msg_print("You see a deep red glow...");
  				if (!get_aim_dir(&dir)) return;
  				teleport_monster(dir);
  				o_ptr->timeout = 150;
***************
*** 3324,3330 ****
  
  			case ART_AVAVIR:
  			{
! 				msg_print("Your scythe glows soft white...");
  				if (p_ptr->word_recall == 0)
  				{
  					p_ptr->word_recall = randint(20) + 15;
--- 3324,3330 ----
  
  			case ART_AVAVIR:
  			{
! 				msg_print("You see a soft white glow...");
  				if (p_ptr->word_recall == 0)
  				{
  					p_ptr->word_recall = randint(20) + 15;
***************
*** 3342,3348 ****
  
  			case ART_TOTILA:
  			{
! 				msg_print("Your flail glows in scintillating colours...");
  				if (!get_aim_dir(&dir)) return;
  				confuse_monster(dir, 20);
  				o_ptr->timeout = 15;
--- 3342,3348 ----
  
  			case ART_TOTILA:
  			{
! 				msg_print("You see scintillating colours...");
  				if (!get_aim_dir(&dir)) return;
  				confuse_monster(dir, 20);
  				o_ptr->timeout = 15;
***************
*** 3351,3357 ****
  
  			case ART_FIRESTAR:
  			{
! 				msg_print("Your morning star rages in fire...");
  				if (!get_aim_dir(&dir)) return;
  				fire_ball(GF_FIRE, dir, 72, 3);
  				o_ptr->timeout = 100;
--- 3351,3357 ----
  
  			case ART_FIRESTAR:
  			{
! 				msg_print("You feel the heat of a raging fire!");
  				if (!get_aim_dir(&dir)) return;
  				fire_ball(GF_FIRE, dir, 72, 3);
  				o_ptr->timeout = 100;
***************
*** 3360,3366 ****
  
  			case ART_TARATOL:
  			{
! 				msg_print("Your mace glows bright green...");
  				if (!p_ptr->fast)
  				{
  					(void)set_fast(randint(20) + 20);
--- 3360,3366 ----
  
  			case ART_TARATOL:
  			{
! 				msg_print("You see a bright green glow...");
  				if (!p_ptr->fast)
  				{
  					(void)set_fast(randint(20) + 20);
***************
*** 3375,3381 ****
  
  			case ART_ERIRIL:
  			{
! 				msg_print("Your quarterstaff glows yellow...");
  				if (!ident_spell()) return;
  				o_ptr->timeout = 10;
  				break;
--- 3375,3381 ----
  
  			case ART_ERIRIL:
  			{
! 				msg_print("You see a yellow glow...");
  				if (!ident_spell()) return;
  				o_ptr->timeout = 10;
  				break;
***************
*** 3383,3389 ****
  
  			case ART_OLORIN:
  			{
! 				msg_print("Your quarterstaff glows brightly...");
  				probing();
  				o_ptr->timeout = 20;
  				break;
--- 3383,3389 ----
  
  			case ART_OLORIN:
  			{
! 				msg_print("You see a bright glow...");
  				probing();
  				o_ptr->timeout = 20;
  				break;
***************
*** 3391,3397 ****
  
  			case ART_TURMIL:
  			{
! 				msg_print("Your hammer glows white...");
  				if (!get_aim_dir(&dir)) return;
  				drain_life(dir, 90);
  				o_ptr->timeout = 70;
--- 3391,3397 ----
  
  			case ART_TURMIL:
  			{
! 				msg_print("You see a white glow...");
  				if (!get_aim_dir(&dir)) return;
  				drain_life(dir, 90);
  				o_ptr->timeout = 70;
***************
*** 3401,3407 ****
  
  			case ART_CUBRAGOL:
  			{
! 				msg_print("Your crossbow glows deep red...");
  				(void)brand_bolts();
  				o_ptr->timeout = 999;
  				break;
--- 3401,3407 ----
  
  			case ART_CUBRAGOL:
  			{
! 				msg_print("You see a firey red glow...");
  				(void)brand_bolts();
  				o_ptr->timeout = 999;
  				break;
diff -c -w -r \games\angb283/src/config.h ./src/config.h
*** \games\angb283/src/config.h	Fri Feb  6 09:10:30 1998
--- ./src/config.h	Mon Feb 23 17:32:36 1998
***************
*** 64,69 ****
--- 64,72 ----
   */
  /* #define USE_TCHARS */
  
+ /* OPTION: NO_PSI_ERASE allows non-psionicists to use wielded psionic foci */
+ /* #define NO_PSI_ERASE */
+ 
  
  /*
   * OPTION: Use "blocking getch() calls" in "main-gcu.c".
***************
*** 176,187 ****
  /*
   * OPTION: Hack -- Compile in support for "Debug Commands"
   */
! /* #define ALLOW_DEBUG */
  
  /*
   * OPTION: Hack -- Compile in support for "Spoiler Generation"
   */
! /* #define ALLOW_SPOILERS */
  
  
  /*
--- 179,190 ----
  /*
   * OPTION: Hack -- Compile in support for "Debug Commands"
   */
! #define ALLOW_DEBUG
  
  /*
   * OPTION: Hack -- Compile in support for "Spoiler Generation"
   */
! #define ALLOW_SPOILERS
  
  
  /*
***************
*** 205,210 ****
--- 208,217 ----
   */
  #define ALLOW_AUTOROLLER
  
+ /* OPTION: FAST_AUTOROLL makes the autoroller about 1000 times faster
+    when in preserve mode. */
+ #define FAST_AUTOROLL
+ 
  
  /*
   * OPTION: Allow monsters to "flee" when hit hard
***************
*** 348,353 ****
--- 355,364 ----
  /* #define WDT_TRACK_OPTIONS */
  
  
+ /*
+  * OPTION: Allow the use of random artifacts.
+  */
+ #define GJW_RANDART
  
  /*
   * OPTION: Allow the use of "sound" in various places.
diff -c -w -r \games\angb283/src/defines.h ./src/defines.h
*** \games\angb283/src/defines.h	Mon Feb  9 07:25:12 1998
--- ./src/defines.h	Mon Feb 23 17:32:38 1998
***************
*** 50,55 ****
--- 50,57 ----
  #define VERSION_MINOR	8
  #define VERSION_PATCH	3
  
+ #define PSI_VERSION "1.0.6"
+ 
  /*
   * This value is not currently used
   */
***************
*** 133,139 ****
  /*
   * Maximum number of player "class" types (see "table.c", etc)
   */
! #define MAX_CLASS            6
  
  
  /*
--- 135,141 ----
  /*
   * Maximum number of player "class" types (see "table.c", etc)
   */
! #define MAX_CLASS            7
  
  
  /*
***************
*** 238,245 ****
  #define STORE_TURNOVER	9		/* Normal shop turnover, per day */
  #define STORE_MIN_KEEP	6		/* Min slots to "always" keep full */
  #define STORE_MAX_KEEP	18		/* Max slots to "always" keep full */
! #define STORE_SHUFFLE	25		/* 1/Chance (per day) of an owner changing */
! #define STORE_TURNS		1000	/* Number of turns between turnovers */
  
  
  /*
--- 240,247 ----
  #define STORE_TURNOVER	9		/* Normal shop turnover, per day */
  #define STORE_MIN_KEEP	6		/* Min slots to "always" keep full */
  #define STORE_MAX_KEEP	18		/* Max slots to "always" keep full */
! #define STORE_SHUFFLE	4		/* 1/Chance (per day) of an owner changing */
! #define STORE_TURNS		700	/* Number of turns between turnovers */
  
  
  /*
***************
*** 258,271 ****
   * during the creation of an object (see "get_obj_num()" in "object.c").
   * Lower values yield better objects more often.
   */
! #define GREAT_OBJ	20
  
  /*
   * There is a 1/50 (2%) chance of inflating the requested monster_level
   * during the creation of a monsters (see "get_mon_num()" in "monster.c").
   * Lower values yield harder monsters more often.
   */
! #define NASTY_MON	50		/* 1/chance of inflated monster level */
  
  
  
--- 260,273 ----
   * during the creation of an object (see "get_obj_num()" in "object.c").
   * Lower values yield better objects more often.
   */
! #define GREAT_OBJ	12
  
  /*
   * There is a 1/50 (2%) chance of inflating the requested monster_level
   * during the creation of a monsters (see "get_mon_num()" in "monster.c").
   * Lower values yield harder monsters more often.
   */
! #define NASTY_MON	30		/* 1/chance of inflated monster level */
  
  
  
***************
*** 420,425 ****
--- 422,428 ----
  #define CLASS_ROGUE		3
  #define CLASS_RANGER	4
  #define CLASS_PALADIN	5
+ #define CLASS_PSIONICIST        6
  
  
  
***************
*** 589,594 ****
--- 592,608 ----
  #define GF_OLD_SLEEP	57
  #define GF_OLD_DRAIN	58
  #define GF_XXX8			59
+ #define GF_PSI GF_MIND_BLAST
+ #define GF_PSI2 GF_MIND_BLAST2
+ #define GF_MIND_BLAST   70
+ #define GF_MIND_BLAST2  71
+ #define GF_DISINTEGRATE 72
+ #define GF_PSI_DRAIN    73
+ #define GF_PSI3         74
+ #define GF_AMNESIA      75
+ #define GF_PAIN         76
+ #define GF_DOMINATE     77
+ #define GF_ANALYZE      78
  
  
  /*
***************
*** 1041,1046 ****
--- 1055,1061 ----
  #define TV_FOOD         80
  #define TV_MAGIC_BOOK   90
  #define TV_PRAYER_BOOK  91
+ #define TV_PSI_BOOK     92
  #define TV_GOLD         100	/* Gold can only be picked up by players */
  
  
***************
*** 1507,1513 ****
   * Special "sval" limit -- first "good" magic/prayer book
   */
  #define SV_BOOK_MIN_GOOD	4
! 
  
  
  /*** Monster blow constants ***/
--- 1522,1528 ----
   * Special "sval" limit -- first "good" magic/prayer book
   */
  #define SV_BOOK_MIN_GOOD	4
! #define SV_METAPSIONICS    4
  
  
  /*** Monster blow constants ***/
***************
*** 1789,1797 ****
  #define SM_OPP_FIRE		0x00000004
  #define SM_OPP_COLD		0x00000008
  #define SM_OPP_POIS		0x00000010
! #define SM_OPP_XXX1		0x00000020
! #define SM_OPP_XXX2		0x00000040
! #define SM_OPP_XXX3		0x00000080
  #define SM_IMM_XXX5		0x00000100
  #define SM_IMM_XXX6		0x00000200
  #define SM_IMM_FREE		0x00000400
--- 1804,1814 ----
  #define SM_OPP_FIRE		0x00000004
  #define SM_OPP_COLD		0x00000008
  #define SM_OPP_POIS		0x00000010
! #define SM_AMNESIA1     0x00000020
! #define SM_AMNESIA2     0x00000040
! #define SM_DOMINATE     0x00000080
! #define SM_INFLUENCE (SM_AMNESIA1 + SM_AMNESIA2 + SM_DOMINATE)
! 
  #define SM_IMM_XXX5		0x00000100
  #define SM_IMM_XXX6		0x00000200
  #define SM_IMM_FREE		0x00000400
***************
*** 1875,1886 ****
  #define TR2_SUST_DEX		0x00000008L	/* Sustain DEX */
  #define TR2_SUST_CON		0x00000010L	/* Sustain CON */
  #define TR2_SUST_CHR		0x00000020L	/* Sustain CHR */
! #define TR2_XXX1			0x00000040L	/* (reserved) */
! #define TR2_XXX2			0x00000080L	/* (reserved) */
! #define TR2_XXX3			0x00001000L	/* (reserved) */
! #define TR2_XXX4			0x00002000L	/* (reserved) */
! #define TR2_XXX5			0x00004000L	/* (reserved) */
! #define TR2_XXX6		 	0x00008000L	/* (reserved) */
  #define TR2_IM_ACID			0x00001000L	/* Immunity to acid */
  #define TR2_IM_ELEC			0x00002000L	/* Immunity to elec */
  #define TR2_IM_FIRE			0x00004000L	/* Immunity to fire */
--- 1892,1903 ----
  #define TR2_SUST_DEX		0x00000008L	/* Sustain DEX */
  #define TR2_SUST_CON		0x00000010L	/* Sustain CON */
  #define TR2_SUST_CHR		0x00000020L	/* Sustain CHR */
! #define TR2_META_PSI1   0x00000040L	/* Metapsionics 1 */
! #define TR2_META_PSI2	0x00000080L	/* Metapsionics 2 */
! #define TR2_RES_PSI             0x00000100L     /* Resist Psionics*/
! #define TR2_RES_FORCE   0x00000200L     /* Resist Force */
! #define TR2_RES_GRAVT   0x00000400L     /* Resist Gravity */
! #define TR2_RES_INERT   0x00000800L     /* Resist Inertia */
  #define TR2_IM_ACID			0x00001000L	/* Immunity to acid */
  #define TR2_IM_ELEC			0x00002000L	/* Immunity to elec */
  #define TR2_IM_FIRE			0x00004000L	/* Immunity to fire */
***************
*** 1922,1929 ****
  #define TR3_IGNORE_ELEC		0x00020000L	/* Item ignores Elec Damage */
  #define TR3_IGNORE_FIRE		0x00040000L	/* Item ignores Fire Damage */
  #define TR3_IGNORE_COLD		0x00080000L	/* Item ignores Cold Damage */
! #define TR3_XXX5			0x00100000L	/* (reserved) */
! #define TR3_XXX6			0x00200000L	/* (reserved) */
  #define TR3_BLESSED			0x00400000L	/* Item has been blessed */
  #define TR3_ACTIVATE		0x00800000L	/* Item can be activated */
  #define TR3_INSTA_ART		0x01000000L	/* Item makes an artifact */
--- 1939,1946 ----
  #define TR3_IGNORE_ELEC		0x00020000L	/* Item ignores Elec Damage */
  #define TR3_IGNORE_FIRE		0x00040000L	/* Item ignores Fire Damage */
  #define TR3_IGNORE_COLD		0x00080000L	/* Item ignores Cold Damage */
! #define TR3_PSEUDO_ID      0x00100000L     /* helps psionicists psuedo-id */
! #define TR3_PSI_ERASE			0x00200000L	/* only usable by psionicists */
  #define TR3_BLESSED			0x00400000L	/* Item has been blessed */
  #define TR3_ACTIVATE		0x00800000L	/* Item can be activated */
  #define TR3_INSTA_ART		0x01000000L	/* Item makes an artifact */
***************
*** 2087,2099 ****
  #define RF3_IM_FIRE			0x00040000	/* Resist fire a lot */
  #define RF3_IM_COLD			0x00080000	/* Resist cold a lot */
  #define RF3_IM_POIS			0x00100000	/* Resist poison a lot */
! #define RF3_XXX5			0x00200000	/* Immune to (?) */
  #define RF3_RES_NETH		0x00400000	/* Resist nether a lot */
  #define RF3_RES_WATE		0x00800000	/* Resist water */
  #define RF3_RES_PLAS		0x01000000	/* Resist plasma */
  #define RF3_RES_NEXU		0x02000000	/* Resist nexus */
  #define RF3_RES_DISE		0x04000000	/* Resist disenchantment */
! #define RF3_XXX6			0x08000000	/* Resist (?) */
  #define RF3_NO_FEAR			0x10000000	/* Cannot be scared */
  #define RF3_NO_STUN			0x20000000	/* Cannot be stunned */
  #define RF3_NO_CONF			0x40000000	/* Cannot be confused */
--- 2104,2116 ----
  #define RF3_IM_FIRE			0x00040000	/* Resist fire a lot */
  #define RF3_IM_COLD			0x00080000	/* Resist cold a lot */
  #define RF3_IM_POIS			0x00100000	/* Resist poison a lot */
! #define RF3_IM_PSI			0x00200000	/* Immune to (?) */
  #define RF3_RES_NETH		0x00400000	/* Resist nether a lot */
  #define RF3_RES_WATE		0x00800000	/* Resist water */
  #define RF3_RES_PLAS		0x01000000	/* Resist plasma */
  #define RF3_RES_NEXU		0x02000000	/* Resist nexus */
  #define RF3_RES_DISE		0x04000000	/* Resist disenchantment */
! #define RF3_RES_PSI			0x08000000	/* Resist (?) */
  #define RF3_NO_FEAR			0x10000000	/* Cannot be scared */
  #define RF3_NO_STUN			0x20000000	/* Cannot be stunned */
  #define RF3_NO_CONF			0x40000000	/* Cannot be confused */
***************
*** 2103,2111 ****
   * New monster race bit flags
   */
  #define RF4_SHRIEK			0x00000001	/* Shriek for help */
! #define RF4_XXX2			0x00000002	/* (?) */
! #define RF4_XXX3			0x00000004	/* (?) */
! #define RF4_XXX4			0x00000008	/* (?) */
  #define RF4_ARROW_1			0x00000010	/* Fire an arrow (light) */
  #define RF4_ARROW_2			0x00000020	/* Fire an arrow (heavy) */
  #define RF4_ARROW_3			0x00000040	/* Fire missiles (light) */
--- 2120,2128 ----
   * New monster race bit flags
   */
  #define RF4_SHRIEK			0x00000001	/* Shriek for help */
! #define RF4_P_BLAST        0x00000002	/* Psionic Blasts */
! #define RF4_P_CRUSH      	0x00000004	/* Psychic Crush */
! #define RF4_M_WRACK			0x00000008	/* Mind Wrack */
  #define RF4_ARROW_1			0x00000010	/* Fire an arrow (light) */
  #define RF4_ARROW_2			0x00000020	/* Fire an arrow (heavy) */
  #define RF4_ARROW_3			0x00000040	/* Fire missiles (light) */
***************
*** 2130,2137 ****
  #define RF4_BR_PLAS			0x02000000	/* Breathe Plasma */
  #define RF4_BR_WALL			0x04000000	/* Breathe Force */
  #define RF4_BR_MANA			0x08000000	/* Breathe Mana */
! #define RF4_XXX5			0x10000000
! #define RF4_XXX6			0x20000000
  #define RF4_XXX7			0x40000000
  #define RF4_XXX8			0x80000000
  
--- 2147,2154 ----
  #define RF4_BR_PLAS			0x02000000	/* Breathe Plasma */
  #define RF4_BR_WALL			0x04000000	/* Breathe Force */
  #define RF4_BR_MANA			0x08000000	/* Breathe Mana */
! #define RF4_BR_INSA			0x10000000
! #define RF4_P_WAVE			0x20000000
  #define RF4_XXX7			0x40000000
  #define RF4_XXX8			0x80000000
  
***************
*** 2177,2183 ****
  #define RF6_HASTE			0x00000001	/* Speed self */
  #define RF6_XXX1			0x00000002	/* Speed a lot (?) */
  #define RF6_HEAL			0x00000004	/* Heal self */
! #define RF6_XXX2			0x00000008	/* Heal a lot (?) */
  #define RF6_BLINK			0x00000010	/* Teleport Short */
  #define RF6_TPORT			0x00000020	/* Teleport Long */
  #define RF6_XXX3			0x00000040	/* Move to Player (?) */
--- 2194,2200 ----
  #define RF6_HASTE			0x00000001	/* Speed self */
  #define RF6_XXX1			0x00000002	/* Speed a lot (?) */
  #define RF6_HEAL			0x00000004	/* Heal self */
! #define RF6_HEAL2       0x00000008	/* Heal a lot (?) */
  #define RF6_BLINK			0x00000010	/* Teleport Short */
  #define RF6_TPORT			0x00000020	/* Teleport Long */
  #define RF6_XXX3			0x00000040	/* Move to Player (?) */
***************
*** 2221,2233 ****
  
  #define RF6_INT_MASK \
     (RF6_BLINK |  RF6_TPORT | RF6_TELE_LEVEL | RF6_TELE_AWAY | \
!     RF6_HEAL | RF6_HASTE | RF6_TRAPS | \
      RF6_S_MONSTER | RF6_S_MONSTERS | \
      RF6_S_ANT | RF6_S_SPIDER | RF6_S_HOUND | RF6_S_HYDRA | \
      RF6_S_ANGEL | RF6_S_DRAGON | RF6_S_UNDEAD | RF6_S_DEMON | \
      RF6_S_HI_DRAGON | RF6_S_HI_UNDEAD | RF6_S_WRAITH | RF6_S_UNIQUE)
  
  
  
  /*** Cheating option Definitions ***/
  
--- 2238,2264 ----
  
  #define RF6_INT_MASK \
     (RF6_BLINK |  RF6_TPORT | RF6_TELE_LEVEL | RF6_TELE_AWAY | \
!     RF6_HEAL | RF6_HEAL2 | RF6_HASTE | RF6_TRAPS | \
      RF6_S_MONSTER | RF6_S_MONSTERS | \
      RF6_S_ANT | RF6_S_SPIDER | RF6_S_HOUND | RF6_S_HYDRA | \
      RF6_S_ANGEL | RF6_S_DRAGON | RF6_S_UNDEAD | RF6_S_DEMON | \
      RF6_S_HI_DRAGON | RF6_S_HI_UNDEAD | RF6_S_WRAITH | RF6_S_UNIQUE)
  
  
+ /*
+  * Hack -- "bolt" spells that may hurt fellow monsters
+  */
+ #define RF4_BOLT_MASK \
+    (RF4_ARROW_1 | RF4_ARROW_2 | RF4_ARROW_3 | RF4_ARROW_4)
+ 
+ #define RF5_BOLT_MASK \
+    (RF5_BO_ACID | RF5_BO_ELEC | RF5_BO_FIRE | RF5_BO_COLD | \
+     RF5_BO_POIS | RF5_BO_NETH | RF5_BO_WATE | RF5_BO_MANA | \
+     RF5_BO_PLAS | RF5_BO_ICEE | RF5_MISSILE)
+ 
+ #define RF6_BOLT_MASK \
+    0L
+ 
  
  /*** Cheating option Definitions ***/
  
***************
*** 2721,2725 ****
--- 2752,2762 ----
  # undef MESSAGE_BUF
  # define MESSAGE_BUF	4096
  #endif
+ 
+ #define PSI_PSEUDO_ID 1
+ #define RES_FORCE     2
+ #define RES_INERT     4
+ #define RES_GRAVT     8
+ #define RES_PSI       16
  
  
diff -c -w -r \games\angb283/src/dungeon.c ./src/dungeon.c
*** \games\angb283/src/dungeon.c	Fri Feb  6 09:10:30 1998
--- ./src/dungeon.c	Mon Feb 23 18:47:22 1998
***************
*** 10,15 ****
--- 10,42 ----
  
  #include "angband.h"
  
+ static bool float_dot = FALSE;
+ 
+ static void do_cmd_oops()
+ {
+    char temp[80];
+    sprintf(temp,"Current value of ""oops"" is %d. Enter new value: ",
+      p_ptr->oops);
+    p_ptr->oops = get_quantity(temp,1);
+ #ifdef GJW_RANDART
+    sprintf(temp,"p_ptr->random_artifacts = %d. Enter new value: ",
+      p_ptr->random_artifacts);
+    if ((p_ptr->random_artifacts = get_quantity(temp,1)) != 0)
+    {
+      sprintf(temp,"%08X",(unsigned) seed_randart);
+      if (get_string("Enter new seed (0 for random): ",temp,11))
+      {
+        bool random = FALSE;
+        sscanf(temp,"%x",(unsigned *)&seed_randart);
+        if (!seed_randart) seed_randart = rand_int (0x10000000);
+        msg_format("New artifact %sseed is %08X.",random ? "(random) ":"",
+ 	      (unsigned) seed_randart);
+        msg_format("Restart angband to see changes.");
+      }
+    }
+ #endif
+ }
+ 
  
  
  
***************
*** 115,122 ****
  	/* No sensing when confused */
  	if (p_ptr->confused) return;
  
  	/* Analyze the class */
! 	switch (p_ptr->pclass)
  	{
  		case CLASS_WARRIOR:
  		{
--- 142,156 ----
  	/* No sensing when confused */
  	if (p_ptr->confused) return;
  
+ 	i = p_ptr->pclass;
+ 	if (i == CLASS_PSIONICIST)
+ 	  if (psi_flags & PSI_PSEUDO_ID) 
+ 	     i = CLASS_WARRIOR;
+ 	  else
+ 	     i = CLASS_MAGE;
+ 	     
  	/* Analyze the class */
! 	switch (i)
  	{
  		case CLASS_WARRIOR:
  		{
***************
*** 517,523 ****
  			int n;
  
  			/* Message */
! 			if (cheat_xtra) msg_print("Updating Shops...");
  
  			/* Maintain each shop (except home) */
  			for (n = 0; n < MAX_STORES - 1; n++)
--- 551,558 ----
  			int n;
  
  			/* Message */
! 			if (cheat_xtra || (pa_ptr->precognition > 0))
! 			   msg_print("Updating Shops...");
  
  			/* Maintain each shop (except home) */
  			for (n = 0; n < MAX_STORES - 1; n++)
***************
*** 530,543 ****
  			if (rand_int(STORE_SHUFFLE) == 0)
  			{
  				/* Message */
! 				if (cheat_xtra) msg_print("Shuffling a Shopkeeper...");
  
  				/* Shuffle a random shop (except home) */
  				store_shuffle(rand_int(MAX_STORES - 1));
  			}
  
  			/* Message */
! 			if (cheat_xtra) msg_print("Done.");
  		}
  	}
  
--- 565,580 ----
  			if (rand_int(STORE_SHUFFLE) == 0)
  			{
  				/* Message */
! 				if (cheat_xtra || (pa_ptr->precognition > 0))
! 				  msg_print("Shuffling a Shopkeeper...");
  
  				/* Shuffle a random shop (except home) */
  				store_shuffle(rand_int(MAX_STORES - 1));
  			}
  
  			/* Message */
! 			if (cheat_xtra || (pa_ptr->precognition > 0))
! 			  msg_print("Done.");
  		}
  	}
  
***************
*** 586,591 ****
--- 623,629 ----
  		}
  
  		/* Take damage */
+       if (!pa_ptr->biofeedback)
  		take_hit(i, "a fatal wound");
  	}
  
***************
*** 692,697 ****
--- 730,737 ----
  	if (p_ptr->stun) regen_amount = 0;
  	if (p_ptr->cut) regen_amount = 0;
  
+    if (pa_ptr->biofeedback) regen_amount += randint(0x400) + regen_amount;
+ 
  	/* Regenerate Hit Points if needed */
  	if (p_ptr->chp < p_ptr->mhp)
  	{
***************
*** 794,823 ****
--- 834,868 ----
  	/* Oppose Acid */
  	if (p_ptr->oppose_acid)
  	{
+       if ((p_ptr->oppose_acid >> 6) > randint(100)) p_ptr->oppose_acid = 1;
  		(void)set_oppose_acid(p_ptr->oppose_acid - 1);
  	}
  
  	/* Oppose Lightning */
  	if (p_ptr->oppose_elec)
  	{
+       if ((p_ptr->oppose_elec >> 6) > randint(100)) p_ptr->oppose_elec = 1;
  		(void)set_oppose_elec(p_ptr->oppose_elec - 1);
  	}
  
  	/* Oppose Fire */
  	if (p_ptr->oppose_fire)
  	{
+       if ((p_ptr->oppose_fire >> 6) > randint(100)) p_ptr->oppose_fire = 1;
  		(void)set_oppose_fire(p_ptr->oppose_fire - 1);
  	}
  
  	/* Oppose Cold */
  	if (p_ptr->oppose_cold)
  	{
+       if ((p_ptr->oppose_cold >> 6) > randint(100)) p_ptr->oppose_cold = 1;
  		(void)set_oppose_cold(p_ptr->oppose_cold - 1);
  	}
  
  	/* Oppose Poison */
  	if (p_ptr->oppose_pois)
  	{
+       if ((p_ptr->oppose_pois >> 6) > randint(100)) p_ptr->oppose_pois = 1;
  		(void)set_oppose_pois(p_ptr->oppose_pois - 1);
  	}
  
***************
*** 850,859 ****
--- 895,961 ----
  		/* Hack -- Truly "mortal" wound */
  		if (p_ptr->cut > 1000) adjust = 0;
  
+       if (pa_ptr->biofeedback) adjust += adjust + 10;
+ 
  		/* Apply some healing */
  		(void)set_cut(p_ptr->cut - adjust);
  	}
  
+    if (p_ptr->oops)
+    {
+       if (pa_ptr->awareness)
+ 	if (!--pa_ptr->awareness) 
+ 	{
+ 	   msg_print("You suddenly feel alone.");
+       float_dot = FALSE;
+       p_ptr->update |= PU_BONUS;
+       handle_stuff();
+ 	}
+       if (pa_ptr->adrenaline)
+       {
+         if (!--pa_ptr->adrenaline)
+ 	   msg_print("Your heart slows down to normal.");
+         p_ptr->update |= PU_BONUS | PU_HP;
+         handle_stuff();
+       }
+       if (pa_ptr->biofeedback) 
+ 	if (!--pa_ptr->biofeedback)
+ 	   msg_print("Your veins return to normal.");
+       if (pa_ptr->shadow_form) 
+ 	if (!--pa_ptr->shadow_form)
+ 	  msg_print("You resume corporeal form.");
+       if (pa_ptr->inertial_barrier) 
+ 	if (!--pa_ptr->inertial_barrier)
+ 	  msg_print("The inertial barrier dissipates.");
+       if (pa_ptr->prob_travel)
+ 	if (!--pa_ptr->prob_travel) 
+ 	  msg_print("You return to reality.");
+       if (pa_ptr->precognition)
+ 	if (!--pa_ptr->precognition)
+ 	  msg_print("The future recedes out of sight.");
+       if (pa_ptr->ts_anchor)
+ 	if (!--pa_ptr->ts_anchor)
+ 	  msg_print("Your block on extra-dimensional spaces unravels.");
+       if (pa_ptr->mental_barrier)
+ 	if (!--pa_ptr->mental_barrier)
+         {
+ 	  msg_print("Your psionic defenses go down.");
+           p_ptr->update |= PU_BONUS;
+           handle_stuff();
+          }
+    if ((pa_ptr->awareness >> 10) > rand_int(100))
+    {
+       if (float_dot) msg_print(".");
+       else
+       {
+         msg_print("Your mind temporarily floats out of your body.");
+         msg_print("This message will now be abbreviated by a period.");
+         float_dot = TRUE;
+       }
+       p_ptr->energy -= randint(200);
+    }
+    }
+ 
  
  
  	/*** Process Light ***/
***************
*** 1231,1236 ****
--- 1333,1351 ----
  
  #endif
  
+       /* New Psionic Debugging Command */
+       case KTRL('J'):
+       {
+ 	 do_cmd_oops();
+ 	 break;
+       }
+ 
+       /* Psionics! */
+       case 'n':
+       {
+          do_cmd_psi();
+          break;
+       }
  
  
  		/*** Inventory Commands ***/
***************
*** 2633,2640 ****
--- 2748,2766 ----
  		/* Hack -- seed for town layout */
  		seed_town = rand_int(0x10000000);
  
+ #ifdef GJW_RANDART
+ 		/* Hack -- seed for random artifacts */
+ 		seed_randart = rand_int (0x10000000);
+ #endif
+ 
  		/* Roll up a new character */
  		player_birth();
+ 
+ #ifdef GJW_RANDART
+ 		/* Randomize the artifacts. */
+ 		if (p_ptr->random_artifacts)
+ 			do_randart (seed_randart);
+ #endif
  
  		/* Hack -- enter the world */
  		turn = 1;
diff -c -w -r \games\angb283/src/externs.h ./src/externs.h
*** \games\angb283/src/externs.h	Mon Feb  9 06:49:44 1998
--- ./src/externs.h	Wed Feb 25 18:14:16 1998
***************
*** 14,19 ****
--- 14,21 ----
   * (z-virt.h, z-util.h, z-form.h, term.h, random.h)
   */
  
+ /* randart.c */
+ extern int do_randart (u32b randart_seed);
  
  /*
   * Automatically generated "variable" declarations
***************
*** 55,62 ****
  extern player_race race_info[MAX_RACES];
  extern player_class class_info[MAX_CLASS];
  extern player_magic magic_info[MAX_CLASS];
! extern u32b spell_flags[2][9][2];
! extern cptr spell_names[2][64];
  extern byte chest_traps[64];
  extern cptr player_title[MAX_CLASS][PY_MAX_LEVEL/5];
  extern cptr color_names[16];
--- 57,64 ----
  extern player_race race_info[MAX_RACES];
  extern player_class class_info[MAX_CLASS];
  extern player_magic magic_info[MAX_CLASS];
! extern u32b spell_flags[3][9][2];
! extern cptr spell_names[3][64];
  extern byte chest_traps[64];
  extern cptr player_title[MAX_CLASS][PY_MAX_LEVEL/5];
  extern cptr color_names[16];
***************
*** 69,74 ****
--- 71,85 ----
  extern byte option_page[4][16];
  
  /* variable.c */
+ extern u32b life_drained;
+ extern u32b psi_flags;
+ extern int fade_dam;
+ extern psi_aux *pa_ptr;
+ extern bool no_rating_bonus;
+ extern bool fade_dam_on;
+ extern int meta_psi_lev;
+ extern char *_killer;
+ 
  extern cptr copyright[5];
  extern byte version_major;
  extern byte version_minor;
***************
*** 96,101 ****
--- 107,115 ----
  extern s16b character_xtra;
  extern u32b seed_flavor;
  extern u32b seed_town;
+ #ifdef GJW_RANDART
+ extern u32b seed_randart;
+ #endif
  extern s16b num_repro;
  extern s16b object_level;
  extern s16b monster_level;
***************
*** 329,334 ****
--- 343,349 ----
  extern void do_cmd_knowledge(void);
  
  /* cmd5.c */
+ extern void do_cmd_psi(void);
  extern void do_cmd_browse(void);
  extern void do_cmd_study(void);
  extern void do_cmd_cast(void);
***************
*** 394,402 ****
--- 409,420 ----
  extern errr rd_savefile_new(void);
  
  /* melee1.c */
+ extern void monst_attack_monst(int m_idx,int t_idx);
+ 
  extern bool make_attack_normal(int m_idx);
  
  /* melee2.c */
+ extern bool summon_friendly;
  extern bool make_attack_spell(int m_idx);
  extern void process_monsters(void);
  
***************
*** 534,539 ****
--- 552,558 ----
  extern bool remove_all_curse(void);
  extern bool restore_level(void);
  extern void self_knowledge(void);
+ extern bool lose_some_info();
  extern bool lose_all_info(void);
  extern bool detect_traps(void);
  extern bool detect_doors(void);
***************
*** 658,663 ****
--- 677,683 ----
  extern bool is_a_vowel(int ch);
  
  /* xtra1.c */
+ extern bool tgt_pt(int *x,int *y);
  extern void cnv_stat(int val, char *out_val);
  extern s16b modify_stat_value(int value, int amount);
  extern void notice_stuff(void);
diff -c -w -r \games\angb283/src/files.c ./src/files.c
*** \games\angb283/src/files.c	Mon Feb  9 10:57:26 1998
--- ./src/files.c	Mon Feb 23 17:32:42 1998
***************
*** 1362,1367 ****
--- 1362,1378 ----
  	tmp = p_ptr->to_h + o_ptr->to_h;
  	xthb = p_ptr->skill_thb + (tmp * BTH_PLUS_ADJ);
  
+    /* Average damage per round */
+ 	o_ptr = &inventory[INVEN_WIELD];
+    dam = p_ptr->dis_to_d;
+    dam += (o_ptr->dd * (o_ptr->ds + 1)) >> 1;
+    if (object_known_p(o_ptr)) dam += o_ptr->to_d;
+    dam *= p_ptr->num_blow;
+    /* ***
+  	put_str("Average Dam:", 18, 55);
+  	put_str(format("%d", dam), 18, 69);
+    */
+ 
  	/* Basic abilities */
  	xdis = p_ptr->skill_dis;
  	xdev = p_ptr->skill_dev;
***************
*** 2044,2051 ****
  
  
  	/* Begin dump */
! 	fprintf(fff, "  [Angband %d.%d.%d Character Dump]\n\n",
! 	        VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
  
  
  	/* Display player */
--- 2055,2062 ----
  
  
  	/* Begin dump */
!         fprintf(fff, "  [Angband %d.%d.%d (Psi %s) Character Dump]\n\n",
!                 VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH,PSI_VERSION);
  
  
  	/* Display player */
diff -c -w -r \games\angb283/src/generate.c ./src/generate.c
*** \games\angb283/src/generate.c	Fri Feb  6 09:10:30 1998
--- ./src/generate.c	Mon Feb 23 17:32:44 1998
***************
*** 1832,1837 ****
--- 1832,1838 ----
  		good_item_flag = TRUE;
  	}
  
+         no_rating_bonus = TRUE;
  
  	/* Place some monsters */
  	for (y = y0 - 2; y <= y0 + 2; y++)
***************
*** 1844,1849 ****
--- 1845,1852 ----
  			(void)place_monster_aux(y, x, r_idx, FALSE, FALSE);
  		}
  	}
+ 
+         no_rating_bonus = FALSE;
  }
  
  
***************
*** 2143,2148 ****
--- 2146,2152 ----
  		good_item_flag = TRUE;
  	}
  
+ 	no_rating_bonus = TRUE;
  
  	/* Top and bottom rows */
  	for (x = x0 - 9; x <= x0 + 9; x++)
***************
*** 2192,2197 ****
--- 2196,2202 ----
  
  	/* Center monster */
  	place_monster_aux(y0, x0, what[7], FALSE, FALSE);
+    no_rating_bonus = FALSE;
  }
  
  
diff -c -w -r \games\angb283/src/h-config.h ./src/h-config.h
*** \games\angb283/src/h-config.h	Fri Feb  6 09:10:30 1998
--- ./src/h-config.h	Mon Feb 23 17:32:46 1998
***************
*** 32,38 ****
   * OPTION: Compile on an MSDOS machine
   */
  #ifndef MSDOS
! /* #define MSDOS */
  #endif
  
  /*
--- 32,38 ----
   * OPTION: Compile on an MSDOS machine
   */
  #ifndef MSDOS
!  #define MSDOS 
  #endif
  
  /*
***************
*** 289,295 ****
   */
  #if defined(linux)
  # define HAS_STRICMP
! # define stricmp(S,T) strcasecmp((S),(T))
  #endif
  
  
--- 289,295 ----
   */
  #if defined(linux)
  # define HAS_STRICMP
! # define stricmp strcasecmp
  #endif
  
  
***************
*** 314,318 ****
  
  
  #endif
- 
  
--- 314,317 ----
diff -c -w -r \games\angb283/src/init1.c ./src/init1.c
*** \games\angb283/src/init1.c	Mon Feb  9 06:12:38 1998
--- ./src/init1.c	Mon Feb 23 17:32:48 1998
***************
*** 237,249 ****
  	"IM_FIRE",
  	"IM_COLD",
  	"IM_POIS",
! 	"XXX5X3",
  	"RES_NETH",
  	"RES_WATE",
  	"RES_PLAS",
  	"RES_NEXU",
  	"RES_DISE",
! 	"XXX6X3",
  	"NO_FEAR",
  	"NO_STUN",
  	"NO_CONF",
--- 237,249 ----
  	"IM_FIRE",
  	"IM_COLD",
  	"IM_POIS",
! 	"IM_PSI",
  	"RES_NETH",
  	"RES_WATE",
  	"RES_PLAS",
  	"RES_NEXU",
  	"RES_DISE",
! 	"RES_PSI",
  	"NO_FEAR",
  	"NO_STUN",
  	"NO_CONF",
***************
*** 256,264 ****
  static cptr r_info_flags4[] =
  {
  	"SHRIEK",
! 	"XXX2X4",
! 	"XXX3X4",
! 	"XXX4X4",
  	"ARROW_1",
  	"ARROW_2",
  	"ARROW_3",
--- 256,264 ----
  static cptr r_info_flags4[] =
  {
  	"SHRIEK",
! 	"P_BLAST",
! 	"P_CRUSH",
! 	"M_WRACK",
  	"ARROW_1",
  	"ARROW_2",
  	"ARROW_3",
***************
*** 283,290 ****
  	"BR_PLAS",
  	"BR_WALL",
  	"BR_MANA",
! 	"XXX5X4",
! 	"XXX6X4",
  	"XXX7X4",
  	"XXX8X4"
  };
--- 283,290 ----
  	"BR_PLAS",
  	"BR_WALL",
  	"BR_MANA",
!         "BR_INSA",
! 	"P_WAVE",
  	"XXX7X4",
  	"XXX8X4"
  };
***************
*** 336,342 ****
  	"HASTE",
  	"XXX1X6",
  	"HEAL",
! 	"XXX2X6",
  	"BLINK",
  	"TPORT",
  	"XXX3X6",
--- 336,342 ----
  	"HASTE",
  	"XXX1X6",
  	"HEAL",
! 	"HEAL2",
  	"BLINK",
  	"TPORT",
  	"XXX3X6",
***************
*** 371,377 ****
  /*
   * Object flags
   */
! static cptr k_info_flags1[] =
  {
  	"STR",
  	"INT",
--- 371,377 ----
  /*
   * Object flags
   */
! cptr k_info_flags1[] =
  {
  	"STR",
  	"INT",
***************
*** 410,416 ****
  /*
   * Object flags
   */
! static cptr k_info_flags2[] =
  {
  	"SUST_STR",
  	"SUST_INT",
--- 410,416 ----
  /*
   * Object flags
   */
! cptr k_info_flags2[] =
  {
  	"SUST_STR",
  	"SUST_INT",
***************
*** 418,429 ****
  	"SUST_DEX",
  	"SUST_CON",
  	"SUST_CHR",
! 	"XXX1",
! 	"XXX2",
! 	"XXX3",
! 	"XXX4",
! 	"XXX5",
! 	"XXX6",
  	"IM_ACID",
  	"IM_ELEC",
  	"IM_FIRE",
--- 418,429 ----
  	"SUST_DEX",
  	"SUST_CON",
  	"SUST_CHR",
! 	"META_PSI1",
! 	"META_PSI2",
! 	"RES_PSI",
! 	"RES_FORCE",
! 	"RES_GRAVT",
! 	"RES_INERT",
  	"IM_ACID",
  	"IM_ELEC",
  	"IM_FIRE",
***************
*** 449,455 ****
  /*
   * Object flags
   */
! static cptr k_info_flags3[] =
  {
  	"SLOW_DIGEST",
  	"FEATHER",
--- 449,455 ----
  /*
   * Object flags
   */
! cptr k_info_flags3[] =
  {
  	"SLOW_DIGEST",
  	"FEATHER",
***************
*** 471,478 ****
  	"IGNORE_ELEC",
  	"IGNORE_FIRE",
  	"IGNORE_COLD",
! 	"XXX5",
! 	"XXX6",
  	"BLESSED",
  	"ACTIVATE",
  	"INSTA_ART",
--- 471,478 ----
  	"IGNORE_ELEC",
  	"IGNORE_FIRE",
  	"IGNORE_COLD",
! 	"PSI_PSEUDO_ID",
! 	"PSI_ERASE",
  	"BLESSED",
  	"ACTIVATE",
  	"INSTA_ART",
***************
*** 1036,1042 ****
  			i = atoi(buf+2);
  
  			/* Verify information */
! 			if (i <= error_idx) return (4);
  
  			/* Verify information */
  			if (i >= k_head->info_num) return (2);
--- 1036,1044 ----
  			i = atoi(buf+2);
  
  			/* Verify information */
! 			/*if (i <= error_idx) return (4);*/
! 
!          /* Say goodbye to "non-sequential record error"... */
  
  			/* Verify information */
  			if (i >= k_head->info_num) return (2);
diff -c -w -r \games\angb283/src/init2.c ./src/init2.c
*** \games\angb283/src/init2.c	Fri Feb  6 09:10:30 1998
--- ./src/init2.c	Mon Feb 23 17:32:50 1998
***************
*** 567,573 ****
   * Note that we let each entry have a unique "name" and "text" string,
   * even if the string happens to be empty (everyone has a unique '\0').
   */
! static errr init_k_info(void)
  {
  	int fd;
  
--- 567,573 ----
   * Note that we let each entry have a unique "name" and "text" string,
   * even if the string happens to be empty (everyone has a unique '\0').
   */
! errr init_k_info(void)
  {
  	int fd;
  
***************
*** 820,826 ****
   * Note that we let each entry have a unique "name" and "text" string,
   * even if the string happens to be empty (everyone has a unique '\0').
   */
! static errr init_a_info(void)
  {
  	int fd;
  
--- 820,826 ----
   * Note that we let each entry have a unique "name" and "text" string,
   * even if the string happens to be empty (everyone has a unique '\0').
   */
! errr init_a_info(void)
  {
  	int fd;
  
***************
*** 1979,1986 ****
  	{
  		/* Magic-User store */
  
- 		{ TV_RING, SV_RING_SEARCHING },
- 		{ TV_RING, SV_RING_FEATHER_FALL },
  		{ TV_RING, SV_RING_PROTECTION },
  		{ TV_AMULET, SV_AMULET_CHARISMA },
  		{ TV_AMULET, SV_AMULET_SLOW_DIGEST },
--- 1979,1984 ----
***************
*** 1994,2004 ****
  		{ TV_WAND, SV_WAND_WONDER },
  		{ TV_STAFF, SV_STAFF_LITE },
  		{ TV_STAFF, SV_STAFF_MAPPING },
- 		{ TV_STAFF, SV_STAFF_DETECT_TRAP },
- 		{ TV_STAFF, SV_STAFF_DETECT_DOOR },
  
- 		{ TV_STAFF, SV_STAFF_DETECT_GOLD },
- 		{ TV_STAFF, SV_STAFF_DETECT_ITEM },
  		{ TV_STAFF, SV_STAFF_DETECT_INVIS },
  		{ TV_STAFF, SV_STAFF_DETECT_EVIL },
  		{ TV_STAFF, SV_STAFF_TELEPORTATION },
--- 1992,1998 ----
***************
*** 2013,2019 ****
  		{ TV_MAGIC_BOOK, 1 },
  		{ TV_MAGIC_BOOK, 2 },
  		{ TV_MAGIC_BOOK, 2 },
! 		{ TV_MAGIC_BOOK, 3 }
  	}
  };
  
--- 2007,2020 ----
  		{ TV_MAGIC_BOOK, 1 },
  		{ TV_MAGIC_BOOK, 2 },
  		{ TV_MAGIC_BOOK, 2 },
!                 { TV_MAGIC_BOOK, 3 },
! 
!                 { TV_PSI_BOOK, 0},
!                 { TV_PSI_BOOK, 0},
!                 { TV_PSI_BOOK, 15},
!                 { TV_PSI_BOOK, 15},
!                 { TV_PSI_BOOK, 3},
!                 { TV_PSI_BOOK, 6}
  	}
  };
  
diff -c -w -r \games\angb283/src/load2.c ./src/load2.c
*** \games\angb283/src/load2.c	Fri Feb  6 09:10:30 1998
--- ./src/load2.c	Mon Feb 23 17:32:50 1998
***************
*** 871,876 ****
--- 871,879 ----
  	rd_byte(&m_ptr->confused);
  	rd_byte(&m_ptr->monfear);
  	rd_byte(&tmp8u);
+ 	if (tmp8u & 1) m_ptr->smart |= SM_AMNESIA1;
+ 	if (tmp8u & 2) m_ptr->smart |= SM_AMNESIA2;
+ 	if (tmp8u & 4) m_ptr->smart |= SM_DOMINATE;
  }
  
  
***************
*** 1236,1242 ****
  	}
  }
  
! 
  
  
  /*
--- 1239,1257 ----
  	}
  }
  
! static void rd_psi_aux()
! {
! 	rd_s16b(&pa_ptr->awareness);
!         rd_s16b(&pa_ptr->adrenaline);
! 	rd_s16b(&pa_ptr->biofeedback);
! 	rd_s16b(&pa_ptr->shadow_form);
! 	rd_s16b(&pa_ptr->inertial_barrier);
! 	rd_s16b(&pa_ptr->prob_travel);
! 	rd_s16b(&pa_ptr->precognition);
! 	rd_s16b(&pa_ptr->mental_barrier);
! 	rd_s16b(&pa_ptr->ts_anchor);
! 	rd_s16b(&pa_ptr->your_mom_is_fat);
! }
  
  
  /*
***************
*** 1262,1268 ****
  	rd_byte(&p_ptr->prace);
  	rd_byte(&p_ptr->pclass);
  	rd_byte(&p_ptr->psex);
! 	rd_byte(&tmp8u);	/* oops */
  
  	/* Repair psex (2.8.1 beta) */
  	if (p_ptr->psex > MAX_SEXES - 1) p_ptr->psex = MAX_SEXES - 1;
--- 1277,1283 ----
  	rd_byte(&p_ptr->prace);
  	rd_byte(&p_ptr->pclass);
  	rd_byte(&p_ptr->psex);
! 	rd_byte(&p_ptr->oops);	/* oops */
  
  	/* Repair psex (2.8.1 beta) */
  	if (p_ptr->psex > MAX_SEXES - 1) p_ptr->psex = MAX_SEXES - 1;
***************
*** 1356,1365 ****
  	rd_byte(&p_ptr->searching);
  	rd_byte(&p_ptr->maximize);
  	rd_byte(&p_ptr->preserve);
  	rd_byte(&tmp8u);
  
! 	/* Future use */
! 	for (i = 0; i < 48; i++) rd_byte(&tmp8u);
  
  	/* Skip the flags */
  	strip_bytes(12);
--- 1371,1408 ----
  	rd_byte(&p_ptr->searching);
  	rd_byte(&p_ptr->maximize);
  	rd_byte(&p_ptr->preserve);
+ #ifdef GJW_RANDART
+ 	rd_byte(&p_ptr->random_artifacts);
+ #else
  	rd_byte(&tmp8u);
+ #endif
+ 
+    if (p_ptr->oops)
+    {
+      rd_psi_aux();
+      i = 28;
+    }
+    else 
+    {
+      pa_ptr->awareness = 0;
+      pa_ptr->adrenaline = 0;
+      pa_ptr->biofeedback = 0;
+      pa_ptr->shadow_form = 0;
+      pa_ptr->inertial_barrier = 0;
+      pa_ptr->prob_travel = 0;
+      pa_ptr->precognition = 0;
+      pa_ptr->mental_barrier = 0;
+      pa_ptr->ts_anchor = 0;
+      pa_ptr->your_mom_is_fat = 0;
+      i = 48;
+    }
+ 
+    #ifdef GJW_RANDART
+    rd_u32b(&seed_randart);
+    i -= 4;
+    #endif
  
!    for (; i ; i--) rd_byte(&tmp8u);
  
  	/* Skip the flags */
  	strip_bytes(12);
***************
*** 1379,1384 ****
--- 1422,1433 ----
  	/* Read "death" */
  	rd_byte(&tmp8u);
  	p_ptr->is_dead = tmp8u;
+ 
+ #ifdef GJW_RANDART
+ 	/* Randomize the artifacts */
+         if (!p_ptr->is_dead)
+ 		if (p_ptr->random_artifacts) do_randart (seed_randart);
+ #endif
  
  	/* Read "feeling" */
  	rd_byte(&tmp8u);
diff -c -w -r \games\angb283/src/main-ibm.c ./src/main-ibm.c
*** \games\angb283/src/main-ibm.c	Fri Feb  6 09:10:30 1998
--- ./src/main-ibm.c	Mon Feb 23 17:32:52 1998
***************
*** 246,252 ****
  /*
   * The "complex" color set
   */
! static long ibm_color_complex[16];
  
  
  /*
--- 246,271 ----
  /*
   * The "complex" color set
   */
! static long ibm_color_complex[16] =
! {
! 	0x000000L,          /* 0 0 0  Dark       */
! 	0x3f3f3fL,          /* 4 4 4  White      */
! 	0x232323L,          /* 2 2 2  Slate      */
! 	0x00233fL,          /* 4 2 0  Orange     */
! 	0x000035L,          /* 3 0 0  Red        */
! 	0x112300L,          /* 0 2 1  Green      */
! 	0x3f0000L,          /* 0 0 4  Blue       */
! 	0x001123L,          /* 2 1 0  Umber      */
! 	0x111111L,          /* 1 1 1  Lt. Dark   */
! 	0x353535L,          /* 3 3 3  Lt. Slate  */
! 	0x3f003fL,          /* 4 0 4  Purple     */
! 	0x003f3fL,          /* 4 4 0  Yellow     */
! 	0x00003fL,          /* 4 0 0  Lt. Red    */
! 	0x003f00L,          /* 0 4 0  Lt. Green  */
! 	0x3f3f00L,          /* 0 4 4  Lt. Blue   */
! 	0x112335L           /* 3 2 1  Lt. Umber  */
! };
! 
  
  
  /*
***************
*** 1209,1215 ****
   */
  errr init_ibm(void)
  {
! 	int i;
  	int mode;
  
  	term *t = &term_screen_body;
--- 1228,1234 ----
   */
  errr init_ibm(void)
  {
!         int i,rv,gv,bv;
  	int mode;
  
  	term *t = &term_screen_body;
***************
*** 1228,1235 ****
  	/* Initialize "color_table" */
  	for (i = 0; i < 16; i++)
  	{
- 		long rv, gv, bv;
- 
  		/* Extract desired values */
  		rv = angband_color_table[i][1] >> 2;
  		gv = angband_color_table[i][2] >> 2;
--- 1247,1252 ----
Only in ./src: makefile
diff -c -w -r \games\angb283/src/melee1.c ./src/melee1.c
*** \games\angb283/src/melee1.c	Fri Feb  6 09:10:30 1998
--- ./src/melee1.c	Mon Feb 23 17:32:54 1998
***************
*** 78,83 ****
--- 78,102 ----
  	return (FALSE);
  }
  
+ static int check_hit2(int power, int level, int ac)
+ {
+ 	int i, k;
+ 
+ 	/* Percentile dice */
+ 	k = rand_int(100);
+ 
+ 	/* Hack -- Always miss or hit */
+ 	if (k < 10) return (k < 5);
+ 
+ 	/* Calculate the "attack quality" */
+ 	i = (power + (level * 3));
+ 
+ 	/* Power and Level compete against Armor */
+ 	if ((i > 0) && (randint(i) > ((ac * 3) / 4))) return (TRUE);
+ 
+ 	/* Assume miss */
+ 	return (FALSE);
+ }
  
  
  /*
***************
*** 437,443 ****
  					obvious = TRUE;
  
  					/* Hack -- Player armor reduces total damage */
! 					damage -= (damage * ((ac < 150) ? ac : 150) / 250);
  
  					/* Take damage */
  					take_hit(damage, ddesc);
--- 456,464 ----
  					obvious = TRUE;
  
  					/* Hack -- Player armor reduces total damage */
! 					damage -= ((pa_ptr->shadow_form ? 300 : 0) +
!                (pa_ptr->biofeedback ? 50 : 0) +
! 					damage * ((ac < 150) ? ac : 150)) / 250;
  
  					/* Take damage */
  					take_hit(damage, ddesc);
***************
*** 1000,1006 ****
  					obvious = TRUE;
  
  					/* Hack -- Reduce damage based on the player armor class */
! 					damage -= (damage * ((ac < 150) ? ac : 150) / 250);
  
  					/* Take damage */
  					take_hit(damage, ddesc);
--- 1021,1029 ----
  					obvious = TRUE;
  
  					/* Hack -- Reduce damage based on the player armor class */
! 					damage -= ((pa_ptr->shadow_form ? 300 : 0) +
!                (pa_ptr->biofeedback ? 50 : 0) +
! 					damage * ((ac < 150) ? ac : 150)) / 250;
  
  					/* Take damage */
  					take_hit(damage, ddesc);
***************
*** 1265,1268 ****
--- 1288,1738 ----
  	return (TRUE);
  }
  
+ extern bool project_m(int who, int r, int y, int x, int dam, int typ);
+ 
+ /* Monster attacks monster */
+ 
+ void monst_attack_monst(int m_idx,int t_idx)
+ {
+ 	monster_type    *m_ptr = &m_list[m_idx],*t_ptr = &m_list[t_idx];
+ 
+ 	monster_race    *r_ptr = &r_info[m_ptr->r_idx],
+ 			*tr_ptr =&r_info[t_ptr->r_idx];
+ 
+ 	int                     ap_cnt;
+ 
+ 	int                     ac, rlev,pt;
+ 
+ 	char            m_name[80],t_name[80];
+ 
+ 	char            ddesc[80],temp[80];
+ 
+ 	bool            blinked;
+ 
+ 
+ 	/* Not allowed to attack */
+ 	if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return;
+ 
+ 	/* Total armor */
+ 	ac = tr_ptr->ac;
+ 
+ 	/* Extract the effective monster level */
+ 	rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
+ 
+ 
+ 	/* Get the monster name (or "it") */
+ 	monster_desc(m_name, m_ptr, 0);
+ 
+ 	/* Get the monster name (or "it") */
+ 	monster_desc(t_name, t_ptr, 0);
+ 
+ 	/* Get the "died from" information (i.e. "a kobold") */
+ 	monster_desc(ddesc, m_ptr, 0x88);
+ 
+ 
+ 	/* Assume no blink */
+ 	blinked = FALSE;
+ 
+ 	/* Scan through all four blows */
+ 	for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
+ 	{
+ 		bool visible = FALSE;
+ 		bool obvious = FALSE;
+ 
+ 		int power = 0;
+ 		int damage = 0;
+ 
+ 		cptr act = NULL;
+ 
+ 		/* Extract the attack infomation */
+ 		int effect = r_ptr->blow[ap_cnt].effect;
+ 		int method = r_ptr->blow[ap_cnt].method;
+ 		int d_dice = r_ptr->blow[ap_cnt].d_dice;
+ 		int d_side = r_ptr->blow[ap_cnt].d_side;
+ 
+ 
+ 		/* Hack -- no more attacks */
+ 		if (!method) break;
+ 
+ 
+ 		/* Extract visibility (before blink) */
+ 		if (m_ptr->ml) visible = TRUE;
+ 
+ 		/* Extract the attack "power" */
+ 		switch (effect)
+ 		{
+ 			case RBE_HURT:  power = 60; break;
+ 			case RBE_POISON:        power =  5; break;
+ 			case RBE_UN_BONUS:      power = 20; break;
+ 			case RBE_UN_POWER:      power = 15; break;
+ 			case RBE_EAT_GOLD:      power =  5; break;
+ 			case RBE_EAT_ITEM:      power =  5; break;
+ 			case RBE_EAT_FOOD:      power =  5; break;
+ 			case RBE_EAT_LITE:      power =  5; break;
+ 			case RBE_ACID:  power =  0; break;
+ 			case RBE_ELEC:  power = 10; break;
+ 			case RBE_FIRE:  power = 10; break;
+ 			case RBE_COLD:  power = 10; break;
+ 			case RBE_BLIND: power =  2; break;
+ 			case RBE_CONFUSE:       power = 10; break;
+ 			case RBE_TERRIFY:       power = 10; break;
+ 			case RBE_PARALYZE:      power =  2; break;
+ 			case RBE_LOSE_STR:      power =  0; break;
+ 			case RBE_LOSE_DEX:      power =  0; break;
+ 			case RBE_LOSE_CON:      power =  0; break;
+ 			case RBE_LOSE_INT:      power =  0; break;
+ 			case RBE_LOSE_WIS:      power =  0; break;
+ 			case RBE_LOSE_CHR:      power =  0; break;
+ 			case RBE_LOSE_ALL:      power =  2; break;
+ 			case RBE_SHATTER:       power = 60; break;
+ 			case RBE_EXP_10:        power =  5; break;
+ 			case RBE_EXP_20:        power =  5; break;
+ 			case RBE_EXP_40:        power =  5; break;
+ 			case RBE_EXP_80:        power =  5; break;
+ 		}
+ 
+ 
+ 		/* Monster hits*/
+ 		if (!effect || check_hit2(power, rlev,ac))
+ 		{
+ 			/* Always disturbing */
+ 			disturb(1, 0);
+ 
+ 			/* Describe the attack method */
+ 			switch (method)
+ 			{
+ 				case RBM_HIT:
+ 				{
+ 					act = "hits %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_TOUCH:
+ 				{
+ 					act = "touches %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_PUNCH:
+ 				{
+ 					act = "punches %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_KICK:
+ 				{
+ 					act = "kicks %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_CLAW:
+ 				{
+ 					act = "claws %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_BITE:
+ 				{
+ 					act = "bites %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_STING:
+ 				{
+ 					act = "stings %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_XXX1:
+ 				{
+ 					act = "XXX1's %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_BUTT:
+ 				{
+ 					act = "butts %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_CRUSH:
+ 				{
+ 					act = "crushes %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_ENGULF:
+ 				{
+ 					act = "engulfs %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_XXX2:
+ 				{
+ 					act = "XXX2's %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_CRAWL:
+ 				{
+ 					act = "crawls on %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_DROOL:
+ 				{
+ 					act = "drools on %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_SPIT:
+ 				{
+ 					act = "spits on %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_XXX3:
+ 				{
+ 					act = "XXX3's on %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_GAZE:
+ 				{
+ 					act = "gazes at %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_WAIL:
+ 				{
+ 					act = "wails at %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_SPORE:
+ 				{
+ 					act = "releases spores at %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_XXX4:
+ 				{
+ 					act = "projects XXX4's at %s.";
+ 					break;
+ 				}
+ 
+ 				case RBM_BEG:
+ 				{
+ 					act = "begs %s for money.";
+ 					break;
+ 				}
+ 
+ 				case RBM_INSULT:
+ 				{
+ 					act = desc_insult[rand_int(8)];
+ 					break;
+ 				}
+ 
+ 				case RBM_MOAN:
+ 				{
+ 					act = desc_moan[rand_int(4)];
+ 					break;
+ 				}
+ 
+ 				case RBM_XXX5:
+ 				{
+ 					act = "XXX5's %s.";
+ 					break;
+ 				}
+ 			}
+ 
+ 			/* Message */
+ 			if (act)
+ 	 {
+ 	   strfmt(temp,act,t_name);
+ 	   msg_format("%^s %s", m_name, temp);
+ 	 }
+ 
+ 			/* Hack -- assume all attacks are obvious */
+ 			obvious = TRUE;
+ 
+ 			/* Roll out the damage */
+ 			damage = damroll(d_dice, d_side);
+ 
+ 	 pt = GF_MISSILE;
+ 
+ 			/* Apply appropriate damage */
+ 			switch (effect)
+ 			{
+ 				case 0:
+ 				{
+ 					damage = 0;
+ 	       pt  = 0;
+ 					break;
+ 				}
+ 
+ 				case RBE_HURT:
+ 				{
+ 					damage -= (damage * ((ac < 150) ? ac : 150) / 250);
+ 					break;
+ 				}
+ 
+ 				case RBE_POISON:
+ 				{
+ 	       pt = GF_POIS;
+ 					break;
+ 				}
+ 
+ 				case RBE_UN_BONUS:
+ 				case RBE_UN_POWER:
+ 				{
+ 	       pt = GF_DISENCHANT;
+ 					break;
+ 				}
+ 
+ 				case RBE_EAT_FOOD:
+ 				case RBE_EAT_LITE:
+ 				case RBE_EAT_ITEM:
+ 				case RBE_EAT_GOLD:
+ 				{
+ 	       pt = damage = 0;
+ 					break;
+ 				}
+ 
+ 				case RBE_ACID:
+ 				{
+ 	       pt = GF_ACID;
+ 					break;
+ 				}
+ 
+ 				case RBE_ELEC:
+ 				{
+ 	       pt = GF_ELEC;
+ 					break;
+ 				}
+ 
+ 				case RBE_FIRE:
+ 				{
+ 	       pt = GF_FIRE;
+ 	       break;
+ 	    }
+ 
+ 				case RBE_COLD:
+ 				{
+ 	       pt = GF_COLD;
+ 					break;
+ 				}
+ 
+ 				case RBE_BLIND:
+ 				{
+ 					break;
+ 				}
+ 
+ 				case RBE_CONFUSE:
+ 				{
+ 	       pt = GF_CONFUSION;
+ 					break;
+ 				}
+ 
+ 				case RBE_TERRIFY:
+ 				{
+ 	       pt = GF_TURN_ALL;
+ 					break;
+ 				}
+ 
+ 				case RBE_PARALYZE:
+ 				{
+ 	       pt = GF_PSI2; /* sort of close... */
+ 					break;
+ 				}
+ 
+ 				case RBE_LOSE_STR:
+ 				case RBE_LOSE_INT:
+ 				case RBE_LOSE_WIS:
+ 				case RBE_LOSE_DEX:
+ 				case RBE_LOSE_CON:
+ 				case RBE_LOSE_CHR:
+ 				case RBE_LOSE_ALL:
+ 				{
+ 					break;
+ 				}
+ 
+ 				case RBE_SHATTER:
+ 				{
+ 					if (damage > 23) earthquake(m_ptr->fy, m_ptr->fx, 8);
+ 					break;
+ 				}
+ 
+ 				case RBE_EXP_10:
+ 				case RBE_EXP_20:
+ 				case RBE_EXP_40:
+ 				case RBE_EXP_80:
+ 	    {
+ 	       pt = GF_NETHER;
+ 					break;
+ 				}
+ 	    default:
+ 	     pt = 0; break;
+ 			}
+ 	 if (pt) project_m(m_idx,0,t_ptr->fy,t_ptr->fx,damage,pt);
+ 
+ 	}
+ 
+ 		/* Monster missed player */
+ 		else
+ 		{
+ 			/* Analyze failed attacks */
+ 			switch (method)
+ 			{
+ 				case RBM_HIT:
+ 				case RBM_TOUCH:
+ 				case RBM_PUNCH:
+ 				case RBM_KICK:
+ 				case RBM_CLAW:
+ 				case RBM_BITE:
+ 				case RBM_STING:
+ 				case RBM_XXX1:
+ 				case RBM_BUTT:
+ 				case RBM_CRUSH:
+ 				case RBM_ENGULF:
+ 				case RBM_XXX2:
+ 
+ 				/* Visible monsters */
+ 				if (m_ptr->ml)
+ 				{
+ 					/* Disturbing */
+ 					disturb(1, 0);
+ 
+ 					/* Message */
+ 					msg_format("%^s misses %^s.", m_name,t_name);
+ 				}
+ 
+ 				break;
+ 			}
+ 		}
+ 
+ 
+ 		/* Analyze "visible" monsters only */
+ 		if (visible)
+ 		{
+ 			/* Count "obvious" attacks (and ones that cause damage) */
+ 			if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
+ 			{
+ 				/* Count attacks of this type */
+ 				if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
+ 				{
+ 					r_ptr->r_blows[ap_cnt]++;
+ 				}
+ 			}
+ 		}
+ 	}
+ 
+ 
+ 	/* Blink away */
+ 	if (blinked)
+ 	{
+ 		msg_print("There is a puff of smoke!");
+ 		teleport_away(m_idx, MAX_SIGHT * 2 + 5);
+ 	}
+ }
  
diff -c -w -r \games\angb283/src/melee2.c ./src/melee2.c
*** \games\angb283/src/melee2.c	Sun Feb  8 08:25:22 1998
--- ./src/melee2.c	Wed Feb 25 21:59:00 1998
***************
*** 10,16 ****
--- 10,129 ----
  
  #include "angband.h"
  
+ /*
+  * This file has several additions to it by Keldon Jones (keldon@umr.edu)
+  * to improve the general quality of the AI (version 0.1.1).
+  */
+ 
+ static int d_tgt_x,d_tgt_y;
+ bool summon_friendly = FALSE;
+ 
+ #include <go32.h>
+ #include <sys/farptr.h>
+ 
+ static int min(int a,int b) {return (a<b) ? a : b;}
  
+ static cptr r_flags456[] =
+  {
+  	"SHRIEK",
+  	"P_BLAST",
+  	"P_CRUSH",
+  	"M_WRACK",
+  	"ARROW_1",
+  	"ARROW_2",
+  	"ARROW_3",
+  	"ARROW_4",
+  	"BR_ACID",
+  	"BR_ELEC",
+  	"BR_FIRE",
+  	"BR_COLD",
+  	"BR_POIS",
+  	"BR_NETH",
+  	"BR_LITE",
+  	"BR_DARK",
+  	"BR_CONF",
+  	"BR_SOUN",
+  	"BR_CHAO",
+  	"BR_DISE",
+  	"BR_NEXU",
+  	"BR_TIME",
+  	"BR_INER",
+  	"BR_GRAV",
+  	"BR_SHAR",
+  	"BR_PLAS",
+  	"BR_WALL",
+  	"BR_MANA",
+  	"BR_INSA",
+  	"P_WAVE",
+  	"XXX7X4",
+  	"XXX8X4",
+ 
+  	"BA_ACID",
+  	"BA_ELEC",
+  	"BA_FIRE",
+  	"BA_COLD",
+  	"BA_POIS",
+  	"BA_NETH",
+  	"BA_WATE",
+  	"BA_MANA",
+  	"BA_DARK",
+  	"DRAIN_MANA",
+  	"MIND_BLAST",
+  	"BRAIN_SMASH",
+  	"CAUSE_1",
+  	"CAUSE_2",
+  	"CAUSE_3",
+  	"CAUSE_4",
+  	"BO_ACID",
+  	"BO_ELEC",
+  	"BO_FIRE",
+  	"BO_COLD",
+  	"BO_POIS",
+  	"BO_NETH",
+  	"BO_WATE",
+  	"BO_MANA",
+  	"BO_PLAS",
+  	"BO_ICEE",
+  	"MISSILE",
+  	"SCARE",
+  	"BLIND",
+  	"CONF",
+  	"SLOW",
+  	"HOLD",
+ 
+  	"HASTE",
+  	"XXX1X6",
+  	"HEAL",
+  	"HEAL2",
+  	"BLINK",
+  	"TPORT",
+  	"XXX3X6",
+  	"XXX4X6",
+  	"TELE_TO",
+  	"TELE_AWAY",
+  	"TELE_LEVEL",
+  	"XXX5",
+  	"DARKNESS",
+  	"TRAPS",
+  	"FORGET",
+  	"XXX6X6",
+  	"XXX7X6",
+  	"XXX8X6",
+  	"S_MONSTER",
+  	"S_MONSTERS",
+  	"S_ANT",
+  	"S_SPIDER",
+  	"S_HOUND",
+  	"S_HYDRA",
+  	"S_ANGEL",
+  	"S_DEMON",
+  	"S_UNDEAD",
+  	"S_DRAGON",
+  	"S_HI_UNDEAD",
+  	"S_HI_DRAGON",
+  	"S_WRAITH",
+  	"S_UNIQUE"
+  };
  
  #ifdef DRS_SMART_OPTIONS
  
***************
*** 90,96 ****
  	if (smart_learn)
  	{
  		/* Hack -- Occasionally forget player status */
! 		if (m_ptr->smart && (rand_int(100) < 1)) m_ptr->smart = 0L;
  
  		/* Use the memorized flags */
  		smart = m_ptr->smart;
--- 203,211 ----
  	if (smart_learn)
  	{
  		/* Hack -- Occasionally forget player status */
!        /* Especially if influenced... */
!  		if (m_ptr->smart && (rand_int(m_ptr->smart & SM_INFLUENCE ? 210 -
!  	      r_ptr->level * 2 : 100) < 1)) m_ptr->smart = 0L;
  
  		/* Use the memorized flags */
  		smart = m_ptr->smart;
***************
*** 139,144 ****
--- 254,260 ----
  
  	/* Nothing known */
  	if (!smart) return;
+    if (smart & SM_DOMINATE) return;
  
  
  	if (smart & (SM_IMM_ACID))
***************
*** 325,330 ****
--- 441,567 ----
  
  
  /*
+  * Determine if a bolt spell will hit the player.
+  *
+  * This is exactly like "projectable", but it will return FALSE if a monster
+  * is in the way.
+  */
+ static bool clean_shot(int y1, int x1, int y2, int x2)
+ {
+ 	int y, x;
+ 
+ 	int grid_n = 0;
+ 	u16b grid_g[512];
+ 
+ 	/* Check the projection path */
+ 	grid_n = project_path(grid_g, MAX_RANGE, y1, x1, y2, x2, PROJECT_STOP);
+ 
+ 	/* Source and target the same */
+ 	if (!grid_n) return (FALSE);
+ 
+ 	/* Final grid */
+ 	y = GRID_Y(grid_g[grid_n-1]);
+ 	x = GRID_X(grid_g[grid_n-1]);
+ 
+ 	/* May not end in a wall grid */
+ 	if (!cave_floor_bold(y, x)) return (FALSE);
+ 
+ 	/* May not end in an unrequested grid */
+ 	if ((y != y2) || (x != x2)) return (FALSE);
+ 
+ 	/* Assume okay */
+ 	return (TRUE);
+ }
+ 
+ 
+ /*
+  * Find closest target. Sorry about the very bad code, but this seems
+  * the most natural. (Hopefully more efficient, too, but I dunno.)
+  * Consider what this code does: for a given radius, this is the
+  * order in which squares are checked:
+  *  
+  *     12345
+  *     6   7
+  *     8   9
+  *     A   B
+  *     CDEFG
+  *
+  * This means that squares are checked in a concentric 
+  * ``egg-shell'' pattern.
+  *
+  * Note one bug: a monster only looks within a round circle;
+  * That means that if the edge of the dungeon is hit, the
+  * function just exits.
+  */
+ 
+ static void find_target_nearest(int sy, int sx, int range, int* ry, int* rx) {
+   int i, j;
+   int rad;
+ 
+   /* Default target */
+ 
+   *ry = p_ptr->py;
+   *rx = p_ptr->px;
+ 
+   /* Call pets. */
+ /*
+   if (p_ptr->pets_notice) {
+     return;
+   }*/
+ 
+   /* Paranoia */
+   if (sy < 0 || sy >= DUNGEON_WID || sx < 0 || sy >= DUNGEON_HGT) {
+     return;
+   }
+ 
+   for (rad = 1; rad < range; rad++) {
+ 
+     if (sx-rad < 0 || sy-rad < 0 || 
+ 	sx+rad >= DUNGEON_WID || sy+rad >= DUNGEON_HGT) {
+       return;
+     }
+ 
+     /* Top row */
+ 
+     for (j = sx-rad; j <= sx+rad; j++) {
+       if (cave_m_idx[sy-rad][j] > 0 && 
+ 	  !(m_list[cave_m_idx[sy-rad][j]].smart & SM_DOMINATE)) {
+ 	*ry = sy-rad;
+ 	*rx = j;
+ 	return;
+       }
+     }
+ 
+     /* Left/right side */
+ 
+     for (i = sy-(rad-1); i <= sy+(rad-1); i++) {
+       if (cave_m_idx[i][sx-rad] > 0 &&
+ 	  !(m_list[cave_m_idx[i][sx-rad]].smart & SM_DOMINATE)) {
+ 	*ry = i;
+ 	*rx = sx-rad;
+ 	return;
+       } else if (cave_m_idx[i][sx+rad] > 0 &&
+ 		 !(m_list[cave_m_idx[i][sx+rad]].smart & SM_DOMINATE)) {
+ 	*ry = i;
+ 	*rx = sx+rad;
+ 	return;
+       }
+     }
+ 
+     /* Bottom row */
+ 
+     for (j = sx-rad; j <= sx+rad; j++) {
+       if (cave_m_idx[sy+rad][j] > 0 &&
+ 	  !(m_list[cave_m_idx[sy+rad][j]].smart & SM_DOMINATE)) {
+ 	*ry = sy+rad;
+ 	*rx = j;
+ 	return;
+       }
+     }
+   }
+ }
+ 
+ /*
   * Cast a bolt at the player
   * Stop if we hit a monster
   * Affect monsters and the player
***************
*** 336,341 ****
--- 573,581 ----
  
  	int flg = PROJECT_STOP | PROJECT_KILL;
  
+     if (m_list[m_idx].smart & SM_DOMINATE)
+  	(void)project(m_idx, 0, d_tgt_y, d_tgt_x, dam_hp, typ, flg);
+     else
  	/* Target the player with a bolt attack */
  	(void)project(m_idx, 0, py, px, dam_hp, typ, flg);
  }
***************
*** 361,371 ****
--- 601,890 ----
  	/* Determine the radius of the blast */
  	rad = (r_ptr->flags2 & (RF2_POWERFUL)) ? 3 : 2;
  
+     if (m_list[m_idx].smart & SM_DOMINATE)
+     {
+  	   (void)project(m_idx, rad, d_tgt_y, d_tgt_x, dam_hp, typ, flg);
+        return;
+     }
+ 
+     if ((typ != GF_PSI) && (typ != GF_PSI2) && (typ != GF_PSI3))
+     if (pa_ptr->inertial_barrier) dam_hp /= 2;
+ 
  	/* Target the player with a ball attack */
  	(void)project(m_idx, rad, py, px, dam_hp, typ, flg);
  }
  
+ /*
+  * Cast a breath (or ball) attack at the player
+  * Pass over any monsters that may be in the way
+  * Affect grids, objects, monsters, and the player
+ */
+ static void ball(int m_idx, int typ, int dam_hp)
+ {
+  	int py = p_ptr->py;
+  	int px = p_ptr->px;
+ 
+  	int rad;
+ 
+  	int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
+ 
+  	monster_type *m_ptr = &m_list[m_idx];
+  	monster_race *r_ptr = &r_info[m_ptr->r_idx];
+ 
+  	/* Determine the radius of the blast */
+  	rad = (r_ptr->flags2 & (RF2_POWERFUL)) ? 3 : 2;
+ 
+     if (m_list[m_idx].smart & SM_DOMINATE)
+     {
+  	   (void)project(m_idx, rad, d_tgt_y, d_tgt_x, dam_hp, typ, flg);
+        return;
+     }
+ 
+  	/* Target the player with a ball attack */
+  	(void)project(m_idx, rad, py, px, dam_hp, typ, flg);
+ }
+ 
+ static void ball0(int m_idx,int typ, int dam_hp,bool dom)
+ {
+     project(m_idx,0,(dom ? d_tgt_y : p_ptr->py),(dom ? d_tgt_x : p_ptr->px),
+     dam_hp, typ, PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL);
+ }
+ 
+ /*
+  * Return TRUE if a spell is good for hurting the player (directly).
+  */
+ static bool spell_attack(byte spell)
+ {
+ 	/* All RF4 spells hurt (except for shriek) */
+ 	if (spell < 128 && spell > 96) return (TRUE);
+ 
+ 	/* Various "ball" spells */
+ 	if (spell >= 128 && spell <= 128 + 8) return (TRUE);
+ 
+ 	/* "Cause wounds" and "bolt" spells */
+ 	if (spell >= 128 + 12 && spell <= 128 + 27) return (TRUE);
+ 
+ 	/* Doesn't hurt */
+ 	return (FALSE);
+ }
+ 
+ /*
+  * Return TRUE if a spell is good for escaping.
+  */
+ static bool spell_escape(byte spell)
+ {
+ 	/* Blink or Teleport */
+ 	if (spell == 160 + 4 || spell == 160 + 5) return (TRUE);
+ 
+ 	/* Teleport the player away */
+ 	if (spell == 160 + 9 || spell == 160 + 10) return (TRUE);
+ 
+ 	/* Isn't good for escaping */
+ 	return (FALSE);
+ }
+ 
+ /*
+  * Return TRUE if a spell is good for annoying the player.
+  */
+ static bool spell_annoy(byte spell)
+ {
+ 	/* Shriek */
+ 	if (spell == 96 + 0) return (TRUE);
+ 
+ 	/* Brain smash, et al */
+ 	if (spell >= 128 + 9 && spell <= 128 + 11) return (TRUE);
+ 
+ 	/* Scare, confuse, blind, slow, paralyze */
+ 	if (spell >= 128 + 27 && spell <= 128 + 31) return (TRUE);
+ 
+ 	/* Teleport to */
+ 	if (spell == 160 + 8) return (TRUE);
+ 
+ 	/* Darkness, make traps, cause amnesia */
+ 	if (spell >= 160 + 12 && spell <= 160 + 14) return (TRUE);
+ 
+ 	/* Doesn't annoy */
+ 	return (FALSE);
+ }
  
+ /*
+  * Return TRUE if a spell summons help.
+  */
+ static bool spell_summon(byte spell)
+ {
+ 	/* All summon spells */
+ 	if (spell >= 160 + 18) return (TRUE);
+ 
+ 	/* Doesn't summon */
+ 	return (FALSE);
+ }
+ 
+ /*
+  * Return TRUE if a spell is good in a tactical situation.
+  */
+ static bool spell_tactic(byte spell)
+ {
+ 	/* Blink */
+ 	if (spell == 160 + 4) return (TRUE);
+ 
+ 	/* Not good */
+ 	return (FALSE);
+ }
+ 
+ /*
+  * Return TRUE if a spell hastes.
+  */
+ static bool spell_haste(byte spell)
+ {
+ 	/* Haste self */
+ 	if (spell == 160 + 0) return (TRUE);
+ 
+ 	/* Not a haste spell */
+ 	return (FALSE);
+ }
+ 
+ /*
+  * Return TRUE if a spell is good for healing.
+  */
+ static bool spell_heal(byte spell)
+ {
+ 	/* Heal */
+ 	if (spell == 160 + 2) return (TRUE);
+ 
+ 	/* No healing */
+ 	return (FALSE);
+ }
+ 
+ /*
+  * Have a monster choose a spell from a list of "useful" spells.
+  *
+  * Note that this list does NOT include spells that will just hit
+  * other monsters, and the list is restricted when the monster is
+  * "desperate".  Should that be the job of this function instead?
+  *
+  * Stupid monsters will just pick a spell randomly.  Smart monsters
+  * will choose more "intelligently".
+  *
+  * Use the helper functions above to put spells into categories.
+  *
+  * This function may well be an efficiency bottleneck.
+  */
+ static int choose_attack_spell(int m_idx, byte spells[], byte num)
+ {
+ 	monster_type *m_ptr = &m_list[m_idx];
+ 	monster_race *r_ptr = &r_info[m_ptr->r_idx];
+ 
+ 	byte escape[96], escape_num = 0;
+ 	byte attack[96], attack_num = 0;
+ 	byte summon[96], summon_num = 0;
+ 	byte tactic[96], tactic_num = 0;
+ 	byte annoy[96], annoy_num = 0;
+ 	byte haste[96], haste_num = 0;
+ 	byte heal[96], heal_num = 0;
+ 
+ 	int i, py = p_ptr->py, px = p_ptr->px;
+ 
+ 	/* Stupid monsters choose randomly */
+ 	if (r_ptr->flags2 & (RF2_STUPID))
+ 	{
+ 		/* Pick at random */
+ 		return (spells[rand_int(num)]);
+ 	}
+ 
+ 	/* Categorize spells */
+ 	for (i = 0; i < num; i++)
+ 	{
+ 		/* Escape spell? */
+ 		if (spell_escape(spells[i])) escape[escape_num++] = spells[i];
+ 
+ 		/* Attack spell? */
+ 		if (spell_attack(spells[i])) attack[attack_num++] = spells[i];
+ 
+ 		/* Summon spell? */
+ 		if (spell_summon(spells[i])) summon[summon_num++] = spells[i];
+ 
+ 		/* Tactical spell? */
+ 		if (spell_tactic(spells[i])) tactic[tactic_num++] = spells[i];
+ 
+ 		/* Annoyance spell? */
+ 		if (spell_annoy(spells[i])) annoy[annoy_num++] = spells[i];
+ 
+ 		/* Haste spell? */
+ 		if (spell_haste(spells[i])) haste[haste_num++] = spells[i];
+ 
+ 		/* Heal spell? */
+ 		if (spell_heal(spells[i])) heal[heal_num++] = spells[i];
+ 	}
+ 
+ 	/*** Try to pick an appropriate spell type ***/
+ 
+ 	/* Hurt badly or afraid, attempt to flee */
+ 	if ((m_ptr->hp < m_ptr->maxhp / 3) || m_ptr->monfear)
+ 	{
+ 		/* Choose escape spell if possible */
+ 		if (escape_num) return (escape[rand_int(escape_num)]);
+ 	}
+ 
+ 	/* Still hurt badly, couldn't flee, attempt to heal */
+ 	if (m_ptr->hp < m_ptr->maxhp / 3)
+ 	{
+ 		/* Choose heal spell if possible */
+ 		if (heal_num) return (heal[rand_int(heal_num)]);
+ 	}
+ 
+ 	/* Player is close and we have attack spells, blink away */
+ 	if ((distance(py, px, m_ptr->fy, m_ptr->fx) < 4) && attack_num &&
+ 	    (rand_int(100) < 75))
+ 	{
+ 		/* Choose tactical spell */
+ 		if (tactic_num) return (tactic[rand_int(tactic_num)]);
+ 	}
+ 
+ 	/* We're hurt (not badly), try to heal */
+ 	if ((m_ptr->hp < m_ptr->maxhp * 3 / 4) && (rand_int(100) < 75))
+ 	{
+ 		/* Choose heal spell if possible */
+ 		if (heal_num) return (heal[rand_int(heal_num)]);
+ 	}
+ 
+ 	/* Summon if possible (sometimes) */
+ 	if (summon_num && (rand_int(100) < 50))
+ 	{
+ 		/* Choose summon spell */
+ 		return (summon[rand_int(summon_num)]);
+ 	}
+ 
+ 	/* Attack spell (most of the time) */
+ 	if (attack_num && (rand_int(100) < 85))
+ 	{
+ 		/* Choose attack spell */
+ 		return (attack[rand_int(attack_num)]);
+ 	}
+ 
+ 	/* Try another tactical spell (sometimes) */
+ 	if (tactic_num && (rand_int(100) < 50))
+ 	{
+ 		/* Choose tactic spell */
+ 		return (tactic[rand_int(tactic_num)]);
+ 	}
+ 
+ 	/* Haste self if we aren't already somewhat hasted (rarely) */
+ 	if (haste_num && (rand_int(100) < (20 + r_ptr->speed - m_ptr->mspeed)))
+ 	{
+ 		/* Choose haste spell */
+ 		return (haste[rand_int(haste_num)]);
+ 	}
+ 
+ 	/* Annoy player (most of the time) */
+ 	if (annoy_num && (rand_int(100) < 85))
+ 	{
+ 		/* Choose annoyance spell */
+ 		return (annoy[rand_int(annoy_num)]);
+ 	}
+ 
+ 	/* Choose no spell */
+ 	return (0);
+ }
  	
  /*
   * Creatures can cast spells, shoot missiles, and breathe.
***************
*** 417,423 ****
  	int py = p_ptr->py;
  	int px = p_ptr->px;
  
! 	int k, chance, thrown_spell, rlev;
  
  	byte spell[96], num = 0;
  
--- 936,942 ----
  	int py = p_ptr->py;
  	int px = p_ptr->px;
  
! 	int k, chance, thrown_spell, rlev, failrate, i;
  
  	byte spell[96], num = 0;
  
***************
*** 431,441 ****
  
  	char ddesc[80];
  
! 
! 	/* Target player */
! 	int x = px;
! 	int y = py;
! 
  
  	/* Summon count */
  	int count = 0;
--- 950,956 ----
  
  	char ddesc[80];
  
! 	bool no_inate = FALSE;
  
  	/* Summon count */
  	int count = 0;
***************
*** 447,459 ****
  	/* Extract the "see-able-ness" */
  	bool seen = (!blind && m_ptr->ml);
  
- 
  	/* Assume "normal" target */
  	bool normal = TRUE;
  
  	/* Assume "projectable" */
  	bool direct = TRUE;
  
  
  	/* Cannot cast spells when confused */
  	if (m_ptr->confused) return (FALSE);
--- 962,979 ----
  	/* Extract the "see-able-ness" */
  	bool seen = (!blind && m_ptr->ml);
  
   	/* Assume "normal" target */
  	bool normal = TRUE;
  
  	/* Assume "projectable" */
  	bool direct = TRUE;
  
+    bool dom = FALSE;
+ 
+ 	/* Target player */
+ 	int x = px;
+ 	int y = py;
+ 
  
  	/* Cannot cast spells when confused */
  	if (m_ptr->confused) return (FALSE);
***************
*** 468,475 ****
  	if (!chance) return (FALSE);
  
  	/* Only do spells occasionally */
! 	if (rand_int(100) >= chance) return (FALSE);
  
  
  	/* Hack -- require projectable player */
  	if (normal)
--- 988,1009 ----
  	if (!chance) return (FALSE);
  
  	/* Only do spells occasionally */
! 	if (rand_int(100) >= 2 * chance) return (FALSE);
! 
! 	/* Sometimes forbid inate attacks (breaths) */
! 	if (rand_int(100) >= chance) no_inate = TRUE;
  
+   	/* Pets target enemies. */
+ 	/* Make sure that player isn't targetted by pet. */
+ 
+ 	if (m_ptr->smart & SM_DOMINATE)
+ 	{
+ 	  find_target_nearest(m_ptr->fy, m_ptr->fx, r_ptr->aaf, &py, &px);
+ 	  if (py == p_ptr->py && px == p_ptr->px) return FALSE;
+ 	  direct = FALSE;
+      x = d_tgt_x = px;
+      y = d_tgt_y = py;
+    }
  
  	/* Hack -- require projectable player */
  	if (normal)
***************
*** 492,497 ****
--- 1026,1034 ----
  	f6 = r_ptr->flags6;
  
  
+ 	/* Forbid inate attacks sometimes */
+ 	if (no_inate) f4 = 0L;
+ 
  	/* Hack -- allow "desperate" spells */
  	if ((r_ptr->flags2 & (RF2_SMART)) &&
  	    (m_ptr->hp < m_ptr->maxhp / 10) &&
***************
*** 517,539 ****
  
  #endif
  
  
  	/* Extract the "inate" spells */
  	for (k = 0; k < 32; k++)
  	{
! 		if (f4 & (1L << k)) spell[num++] = k + 32 * 3;
  	}
  
  	/* Extract the "normal" spells */
  	for (k = 0; k < 32; k++)
  	{
! 		if (f5 & (1L << k)) spell[num++] = k + 32 * 4;
  	}
  
  	/* Extract the "bizarre" spells */
  	for (k = 0; k < 32; k++)
  	{
! 		if (f6 & (1L << k)) spell[num++] = k + 32 * 5;
  	}
  
  	/* No spells left */
--- 1054,1092 ----
  
  #endif
  
+ 	/* Check for a clean bolt shot */
+ 	if (!(r_ptr->flags2 & (RF2_STUPID)) && 
+ 	    !clean_shot(m_ptr->fy, m_ptr->fx, py, px))
+ 	{
+ 		/* Remove spells that will only hurt friends */
+ 		f4 &= ~(RF4_BOLT_MASK);
+ 		f5 &= ~(RF5_BOLT_MASK);
+ 		f6 &= ~(RF6_BOLT_MASK);
+ 
+ 		/* No spells left */
+ 		if (!f4 && !f5 && !f6) return (FALSE);
+ 	}
+ 
+    /* lose 1/3, 2/3 or all of spells because of amnesia */
+  	i = (m_ptr->smart & SM_AMNESIA1 ? 1 : 0) +
+         (m_ptr->smart & SM_AMNESIA2 ? 2 : 0);
  
    	/* Extract the "inate" spells */
    	for (k = 0; k < 32; k++)
    	{
!  		if (f4 & (1L << k)) if (rand_int(3) >= i) spell[num++] = k + 32 * 3;
    	}
    
    	/* Extract the "normal" spells */
    	for (k = 0; k < 32; k++)
    	{
!  		if (f5 & (1L << k)) if (rand_int(3) >= i) spell[num++] = k + 32 * 4;
    	}
    
    	/* Extract the "bizarre" spells */
    	for (k = 0; k < 32; k++)
    	{
!  		if (f6 & (1L << k)) if (rand_int(3) >= i) spell[num++] = k + 32 * 5;
    	}
  
  	/* No spells left */
***************
*** 555,562 ****
  
  
  	/* Choose a spell to cast */
! 	thrown_spell = spell[rand_int(num)];
  
  
  	/* Cast the spell. */
  	switch (thrown_spell)
--- 1108,1157 ----
  
  
  	/* Choose a spell to cast */
! 	thrown_spell = choose_attack_spell(m_idx, spell, num);
! 
!     /* Dominated - pick a spell and target (not anymore*/
!     /*
!  	if (m_ptr->smart & SM_DOMINATE)
!     {
!        char buf[30];
!        dom = TRUE;
!        Term_save();
!        for (i=0 ; i<num ; i++)
!        {
!  	   strfmt(buf,"%-2d. %15s ",i + 1,r_flags456[spell[i] - 96]);
!  	   prt(buf,1 + i,0);
!        }
!        if (0 == (thrown_spell = get_quantity(format(
!  	"Choose a spell for %^s (1-%d):",m_name,num),num)))
!  	{
!  	   Term_load();
!  	   return FALSE;
!  	}
!        thrown_spell = spell[thrown_spell - 1];
!        Term_load();
!        while (!tgt_pt(&d_tgt_x,&d_tgt_y)) ;
!     }
!     */
! 	/* Abort if no spell was chosen */
! 	if (!thrown_spell) return (FALSE);
! 
! 	/* Calculate spell failure rate */
! 	failrate = 25 - (rlev + 3) / 4;
! 
! 	/* Hack -- Stupid monsters will never fail (for jellies and such) */
! 	if (r_ptr->flags2 & (RF2_STUPID)) failrate = 0;
! 
! 	/* Check for spell failure (inate attacks never fail) */
! 	if ((thrown_spell >= 128) && (rand_int(100) < failrate))
! 	{
! 		/* Message */
! 		msg_format("%^s tries to cast a spell, but fails.", m_name);
  
+ 		return (TRUE);
+ 	}
+ 
+    summon_friendly = (m_ptr->smart & SM_DOMINATE) != 0;
  
  	/* Cast the spell. */
  	switch (thrown_spell)
***************
*** 571,591 ****
  			break;
  		}
  
! 		/* RF4_XXX2X4 */
  		case 96+1:
  		{
! 			break;
  		}
  
! 		/* RF4_XXX3X4 */
  		case 96+2:
  		{
  			break;
  		}
  
! 		/* RF4_XXX4X4 */
  		case 96+3:
  		{
  			break;
  		}
  
--- 1166,1209 ----
  			break;
  		}
  
!  		/* RF4_P_BLAST */
    		case 96+1:
    		{
!  			disturb(1,0);
!           msg_format("%^s unleashes a blast of psychic energy.",m_name);
!           ball(m_idx,GF_PSI,damroll(3,rlev));
    		}
    
!  		/* RF4_P_CRUSH */
    		case 96+2:
    		{
+           disturb(1,0);
+  			if (!seen)
+  			{
+  				msg_print("You feel something focusing on your mind.");
+  			}
+  			else
+  			{
+  				msg_format("%^s squeezes its fingers together, saying, ", m_name);
+              msg_format("'I crush your head!'");
+  			}
+           ball0(m_idx,GF_PSI2,damroll(3,rlev),dom);
    			break;
    		}
    
!  		/* RF4_M_WRACK */
    		case 96+3:
    		{
+  			if (!seen)
+  			{
+  				msg_print("You feel something focusing on your mind.");
+  			}
+  			else
+  			{
+  				msg_format("%^s's eyes glow red and pain wracks your mind.", m_name);
+  			}
+           ball0(m_idx,GF_PSI3,randint(damroll(3,rlev)),dom);
+ 
    			break;
    		}
  
***************
*** 859,874 ****
  			break;
  		}
  
! 		/* RF4_XXX5X4 */
  		case 96+28:
  		{
  			break;
  		}
  
! 		/* RF4_XXX6X4 */
  		case 96+29:
  		{
! 			break;
  		}
  
  		/* RF4_XXX7X4 */
--- 1477,1499 ----
  			break;
  		}
  
!  		/* RF4_BR_INSA */
    		case 96+28:
    		{
+  			disturb(1,0);
+           msg_format("%^s breathes insanity.", m_name);
+           breath(m_idx,GF_PSI,min(800,m_ptr->hp / 4));
    			break;
    		}
    
!  		/* RF4_P_WAVE */
    		case 96+29:
    		{
!  			disturb(1,0);
!           msg_format("%^s casts a wave of psionic energy.",m_name);
!           project(m_idx,0,(dom ? d_tgt_y : py),(dom ? d_tgt_x : px),
!            damroll(rlev,4), GF_PSI2, PROJECT_BEAM | PROJECT_THRU |
!            PROJECT_KILL);
    		}
  
  		/* RF4_XXX7X4 */
***************
*** 891,897 ****
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s casts an acid ball.", m_name);
! 			breath(m_idx, GF_ACID,
  			       randint(rlev * 3) + 15);
  			update_smart_learn(m_idx, DRS_RES_ACID);
  			break;
--- 1516,1522 ----
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s casts an acid ball.", m_name);
! 			ball(m_idx, GF_ACID,
  			       randint(rlev * 3) + 15);
  			update_smart_learn(m_idx, DRS_RES_ACID);
  			break;
***************
*** 903,909 ****
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s casts a lightning ball.", m_name);
! 			breath(m_idx, GF_ELEC,
  			       randint(rlev * 3 / 2) + 8);
  			update_smart_learn(m_idx, DRS_RES_ELEC);
  			break;
--- 1528,1534 ----
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s casts a lightning ball.", m_name);
! 			ball(m_idx, GF_ELEC,
  			       randint(rlev * 3 / 2) + 8);
  			update_smart_learn(m_idx, DRS_RES_ELEC);
  			break;
***************
*** 915,921 ****
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s casts a fire ball.", m_name);
! 			breath(m_idx, GF_FIRE,
  			       randint(rlev * 7 / 2) + 10);
  			update_smart_learn(m_idx, DRS_RES_FIRE);
  			break;
--- 1540,1546 ----
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s casts a fire ball.", m_name);
! 			ball(m_idx, GF_FIRE,
  			       randint(rlev * 7 / 2) + 10);
  			update_smart_learn(m_idx, DRS_RES_FIRE);
  			break;
***************
*** 927,933 ****
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s casts a frost ball.", m_name);
! 			breath(m_idx, GF_COLD,
  			       randint(rlev * 3 / 2) + 10);
  			update_smart_learn(m_idx, DRS_RES_COLD);
  			break;
--- 1552,1558 ----
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s casts a frost ball.", m_name);
! 			ball(m_idx, GF_COLD,
  			       randint(rlev * 3 / 2) + 10);
  			update_smart_learn(m_idx, DRS_RES_COLD);
  			break;
***************
*** 939,945 ****
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s casts a stinking cloud.", m_name);
! 			breath(m_idx, GF_POIS,
  			       damroll(12, 2));
  			update_smart_learn(m_idx, DRS_RES_POIS);
  			break;
--- 1564,1570 ----
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s casts a stinking cloud.", m_name);
! 			ball(m_idx, GF_POIS,
  			       damroll(12, 2));
  			update_smart_learn(m_idx, DRS_RES_POIS);
  			break;
***************
*** 951,957 ****
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s casts a nether ball.", m_name);
! 			breath(m_idx, GF_NETHER,
  			       (50 + damroll(10, 10) + rlev));
  			update_smart_learn(m_idx, DRS_RES_NETHR);
  			break;
--- 1576,1582 ----
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s casts a nether ball.", m_name);
! 			ball(m_idx, GF_NETHER,
  			       (50 + damroll(10, 10) + rlev));
  			update_smart_learn(m_idx, DRS_RES_NETHR);
  			break;
***************
*** 964,970 ****
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s gestures fluidly.", m_name);
  			msg_print("You are engulfed in a whirlpool.");
! 			breath(m_idx, GF_WATER,
  			       randint(rlev * 5 / 2) + 50);
  			break;
  		}
--- 1589,1595 ----
  			if (blind) msg_format("%^s mumbles.", m_name);
  			else msg_format("%^s gestures fluidly.", m_name);
  			msg_print("You are engulfed in a whirlpool.");
! 			ball(m_idx, GF_WATER,
  			       randint(rlev * 5 / 2) + 50);
  			break;
  		}
***************
*** 975,981 ****
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles powerfully.", m_name);
  			else msg_format("%^s invokes a mana storm.", m_name);
! 			breath(m_idx, GF_MANA,
  			       (rlev * 5) + damroll(10, 10));
  			break;
  		}
--- 1600,1606 ----
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles powerfully.", m_name);
  			else msg_format("%^s invokes a mana storm.", m_name);
! 			ball(m_idx, GF_MANA,
  			       (rlev * 5) + damroll(10, 10));
  			break;
  		}
***************
*** 986,992 ****
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles powerfully.", m_name);
  			else msg_format("%^s invokes a darkness storm.", m_name);
! 			breath(m_idx, GF_DARK,
  			       (rlev * 5) + damroll(10, 10));
  			update_smart_learn(m_idx, DRS_RES_DARK);
  			break;
--- 1611,1617 ----
  			disturb(1, 0);
  			if (blind) msg_format("%^s mumbles powerfully.", m_name);
  			else msg_format("%^s invokes a darkness storm.", m_name);
! 			ball(m_idx, GF_DARK,
  			       (rlev * 5) + damroll(10, 10));
  			update_smart_learn(m_idx, DRS_RES_DARK);
  			break;
***************
*** 1003,1008 ****
--- 1628,1641 ----
  				/* Disturb if legal */
  				disturb(1, 0);
  
+             if ((pa_ptr->mental_barrier > 0) && (randint(2) == 1))
+   	         {
+   	           msg_format("Your mental barrier prevents %^s from draining your psychic energy."
+   		        , m_name);
+   		        update_smart_learn(m_idx, DRS_MANA);
+   	           break;
+             }
+ 
  				/* Basic message */
  				msg_format("%^s draws psychic energy from you!", m_name);
  
***************
*** 1064,1074 ****
  				msg_format("%^s gazes deep into your eyes.", m_name);
  			}
  
! 			if (rand_int(100) < p_ptr->skill_sav)
  			{
  				msg_print("You resist the effects!");
  			}
  			else
  			{
  				msg_print("Your mind is blasted by psionic energy.");
  				if (!p_ptr->resist_confu)
--- 1697,1711 ----
  				msg_format("%^s gazes deep into your eyes.", m_name);
  			}
  
!  			if ((rand_int(100) < p_ptr->skill_sav) ||
!               ((rand_int(100) < p_ptr->skill_sav) && (psi_flags & RES_PSI)))
           {
       			msg_print("You resist the effects!");
           }
  			else
+            if ((pa_ptr->mental_barrier > 0) && rand_int(3))
+  	          msg_print("Your mental barrier deflects the attack.");
+           else
  			{
  				msg_print("Your mind is blasted by psionic energy.");
  				if (!p_ptr->resist_confu)
***************
*** 1093,1103 ****
  			{
  				msg_format("%^s looks deep into your eyes.", m_name);
  			}
! 			if (rand_int(100) < p_ptr->skill_sav)
  			{
  				msg_print("You resist the effects!");
  			}
  			else
  			{
  				msg_print("Your mind is blasted by psionic energy.");
  				take_hit(damroll(12, 15), ddesc);
--- 1730,1744 ----
  			{
  				msg_format("%^s looks deep into your eyes.", m_name);
  			}
!  			if ((rand_int(100) < p_ptr->skill_sav) ||
!               ((rand_int(100) < p_ptr->skill_sav) && (psi_flags & RES_PSI)))
  			{
  				msg_print("You resist the effects!");
  			}
  			else
+  	      if ((pa_ptr->mental_barrier > 0) && rand_int(2))
+  	        msg_print("Your mental barrier deflects the attack.");
+           else
  			{
  				msg_print("Your mind is blasted by psionic energy.");
  				take_hit(damroll(12, 15), ddesc);
***************
*** 1325,1331 ****
  			{
  				msg_print("You refuse to be frightened.");
  			}
! 			else if (rand_int(100) < p_ptr->skill_sav)
  			{
  				msg_print("You refuse to be frightened.");
  			}
--- 1966,1974 ----
  			{
  				msg_print("You refuse to be frightened.");
  			}
!  			else if ((rand_int(100) < p_ptr->skill_sav) ||
!               ((rand_int(100) < p_ptr->skill_sav) && (psi_flags & RES_PSI)))
! 
  			{
  				msg_print("You refuse to be frightened.");
  			}
***************
*** 1371,1377 ****
  			{
  				msg_print("You disbelieve the feeble spell.");
  			}
! 			else if (rand_int(100) < p_ptr->skill_sav)
  			{
  				msg_print("You disbelieve the feeble spell.");
  			}
--- 2014,2021 ----
  			{
  				msg_print("You disbelieve the feeble spell.");
  			}
!  			else if ((rand_int(100) < p_ptr->skill_sav) ||
!               ((rand_int(100) < p_ptr->skill_sav) && (psi_flags & RES_PSI)))
  			{
  				msg_print("You disbelieve the feeble spell.");
  			}
***************
*** 1416,1425 ****
  			{
  				msg_print("You are unaffected!");
  			}
! 			else if (rand_int(100) < p_ptr->skill_sav)
  			{
  				msg_format("You resist the effects!");
! 			}
  			else
  			{
  				(void)set_paralyzed(p_ptr->paralyzed + rand_int(4) + 4);
--- 2060,2072 ----
  			{
  				msg_print("You are unaffected!");
  			}
!  			else if ((rand_int(100) < p_ptr->skill_sav) ||
!               ((rand_int(100) < p_ptr->skill_sav) && (psi_flags & RES_PSI)))
    			{
    				msg_format("You resist the effects!");
!  			} else
!           	  if ((pa_ptr->mental_barrier > 0) && rand_int(4))
!  	             msg_print("Your mental barrier deflects the attack.");
  			else
  			{
  				(void)set_paralyzed(p_ptr->paralyzed + rand_int(4) + 4);
***************
*** 1531,1539 ****
  			break;
  		}
  
! 		/* RF6_XXX2X6 */
  		case 160+3:
  		{
  			break;
  		}
  
--- 2178,2245 ----
  			break;
  		}
  
!                  /* RF6_HEAL2 */
    		case 160+3:
    		{
+  			disturb(1, 0);
+ 
+  			/* Message */
+  			if (blind)
+  			{
+  				msg_format("%^s mumbles.", m_name);
+  			}
+  			else
+  			{
+            msg_format(
+            "%^s fades out of existence and rematerializes far healthier.",
+             m_name);
+  			}
+ 
+                          /* Heal some (int avoids overflow) */
+                          k = m_ptr->hp;
+                          k += m_ptr->maxhp * rlev / (50 + randint(400));
+ 
+  			/* Fully healed */
+                          if (k >= m_ptr->maxhp)
+  			{
+  				/* Fully healed */
+  				m_ptr->hp = m_ptr->maxhp;
+ 
+  				/* Message */
+  				if (seen)
+  				{
+  					msg_format("%^s looks REALLY healthy!", m_name);
+  				}
+  				else
+  				{
+  					msg_format("%^s sounds REALLY healthy!", m_name);
+  				}
+  			}
+ 
+  			/* Partially healed */
+  			else
+  			{
+  				/* Message */
+  				if (seen)
+                   msg_format("%^s looks much healthier.", m_name);
+  				else
+                   msg_format("%^s sounds much healthier.", m_name);
+                                  m_ptr->hp = k;
+  			}
+ 
+  			/* Redraw (later) if needed */
+  			if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
+ 
+  			/* Cancel fear */
+  			if (m_ptr->monfear)
+  			{
+  				/* Cancel fear */
+  				m_ptr->monfear = 0;
+ 
+  				/* Message */
+  				msg_format("%^s recovers %s courage.", m_name, m_poss);
+  			}
+ 
    			break;
    		}
  
***************
*** 1645,1654 ****
  			disturb(1, 0);
  			msg_format("%^s tries to blank your mind.", m_name);
  
! 			if (rand_int(100) < p_ptr->skill_sav)
  			{
  				msg_print("You resist the effects!");
  			}
  			else if (lose_all_info())
  			{
  				msg_print("Your memories fade away.");
--- 2351,2364 ----
  			disturb(1, 0);
  			msg_format("%^s tries to blank your mind.", m_name);
  
!  			if ((rand_int(100) < p_ptr->skill_sav) ||
!               ((rand_int(100) < p_ptr->skill_sav) && (psi_flags & RES_PSI)))
  			{
  				msg_print("You resist the effects!");
  			}
+  			else
+            if ((pa_ptr->mental_barrier > 0) && rand_int(5))
+    	   msg_print("Your mental barrier deflects the attack.");
  			else if (lose_all_info())
  			{
  				msg_print("Your memories fade away.");
***************
*** 1924,1929 ****
--- 2634,2640 ----
  		r_ptr->r_deaths++;
  	}
  
+    summon_friendly = FALSE;
  
  	/* A spell was cast */
  	return (TRUE);
***************
*** 2101,2132 ****
  	return (TRUE);
  }
  
  #endif
  
  
  /*
   * Choose "logical" directions for monster movement
   *
   * We store the directions in a special "mm" array
   */
! static void get_moves(int m_idx, int mm[5])
  {
  	int py = p_ptr->py;
  	int px = p_ptr->px;
  
  	monster_type *m_ptr = &m_list[m_idx];
  
  	int y, ay, x, ax;
  
  	int move_val = 0;
- 
  	int y2 = py;
  	int x2 = px;
  
  
  #ifdef MONSTER_FLOW
  	/* Flow towards the player */
! 	if (flow_by_sound)
  	{
  		/* Flow towards the player */
  		(void)get_moves_aux(m_idx, &y2, &x2);
--- 2812,3099 ----
  	return (TRUE);
  }
  
+ /*
+  * Provide a location to flee to, but give the player a wide berth.
+  *
+  * A monster may wish to flee to a location that is behind the player,
+  * but instead of heading directly for it, the monster should "swerve"
+  * around the player so that he has a smaller chance of getting hit.
+  */
+ static bool get_fear_moves_aux(int m_idx, int *yp, int *xp)
+ {
+ 	int y, x, y1, x1, fy, fx, py, px, gy = 0, gx = 0;
+ 	int when = 0, score = -1;
+ 	int i;
+ 
+ 	monster_type *m_ptr = &m_list[m_idx];
+ 	monster_race *r_ptr = &r_info[m_ptr->r_idx];
+ 
+ 	/* Monster flowing disabled */
+ 	if (!flow_by_sound) return (FALSE);
+ 
+ 	/* Player location */
+ 	py = p_ptr->py;
+ 	px = p_ptr->px;
+ 
+ 	/* Monster location */
+ 	fy = m_ptr->fy;
+ 	fx = m_ptr->fx;
+ 
+ 	/* Desired destination */
+ 	y1 = fy - (*yp);
+ 	x1 = fx - (*xp);
+ 
+ 	/* The player is not currently near the monster grid */
+ 	if (cave_when[fy][fx] < cave_when[py][px])
+ 	{
+ 		/* No reason to attempt flowing */
+ 		return (FALSE);
+ 	}
+ 
+ 	/* Monster is too far away to use flow information */
+ 	if (cave_cost[fy][fx] > MONSTER_FLOW_DEPTH) return (FALSE);
+ 	if (cave_cost[fy][fx] > r_ptr->aaf) return (FALSE);
+ 
+ 	/* Check nearby grids, diagonals first */
+ 	for (i = 7; i >= 0; i--)
+ 	{
+ 		int dis, s;
+ 
+ 		/* Get the location */
+ 		y = fy + ddy_ddd[i];
+ 		x = fx + ddx_ddd[i];
+ 
+ 		/* Ignore illegal locations */
+ 		if (cave_when[y][x] == 0) continue;
+ 
+ 		/* Ignore ancient locations */
+ 		if (cave_when[y][x] < when) continue;
+ 
+ 		/* Calculate distance of this grid from our destination */
+ 		dis = distance(y, x, y1, x1);
+ 
+ 		/* Score this grid */
+ 		s = 5000 / (dis + 3) - 500 / (cave_cost[y][x] + 1);
+ 
+ 		/* No negative scores */
+ 		if (s < 0) s = 0;
+ 
+ 		/* Ignore lower scores */
+ 		if (s < score) continue;
+ 
+ 		/* Save the score and time */
+ 		when = cave_when[y][x];
+ 		score = s;
+ 
+ 		/* Save the location */
+ 		gy = y;
+ 		gx = x;
+ 	}
+ 
+ 	/* No legal move (?) */
+ 	if (!when) return (FALSE);
+ 
+ 	/* Find deltas */
+ 	(*yp) = fy - gy;
+ 	(*xp) = fx - gx;
+ 
+ 	/* Success */
+ 	return (TRUE);
+ }
+ 
  #endif
  
+ /*
+  * Choose a "safe" location near a monster for it to run toward.
+  *
+  * A location is "safe" if it can be reached quickly and the player
+  * is not able to fire into it (it isn't a "clean shot").  So, this will
+  * cause monsters to "duck" behind walls.  Hopefully, monsters will also
+  * try to run towards corridor openings if they are in a room.
+  *
+  * This function may take lots of CPU time if lots of monsters are
+  * fleeing.
+  *
+  * Return TRUE if a safe location is available.
+  */
+ static bool find_safety(int m_idx, int *yp, int *xp)
+ {
+ 	monster_type *m_ptr = &m_list[m_idx];
+ 
+ 	int fy = m_ptr->fy;
+ 	int fx = m_ptr->fx;
+ 
+ 	int py = p_ptr->py;
+ 	int px = p_ptr->px;
+ 
+ 	int y, x, d, dis;
+ 	int gy = 0, gx = 0, gdis = 0;
+ 
+ 	/* Start with adjacent locations, spread further */
+ 	for (d = 1; d < 10; d++)
+ 	{
+ 		/* Check nearby locations */
+ 		for (y = fy - d; y <= fy + d; y++)
+ 		{
+ 			for (x = fx - d; x <= fx + d; x++)
+ 			{
+ 				/* Skip illegal locations */
+ 				if (!in_bounds_fully(y, x)) continue;
+ 
+ 				/* Skip locations in a wall */
+ 				if (!cave_floor_bold(y, x)) continue;
+ 
+ 				/* Check distance */
+ 				if (distance(y, x, fy, fx) != d) continue;
+ 
+ 				/* Check for "availability" (if monsters can flow) */
+ 				if (flow_by_sound)
+ 				{
+ 					/* Ignore grids very far from the player */
+ 					if (cave_when[y][x] < cave_when[py][px]) continue;
+ 
+ 					/* Ignore too-distant grids */
+ 					if (cave_cost[y][x] > cave_cost[fy][fx] + 2 * d) continue;
+ 				}
+ 
+ 				/* Check for absence of shot */
+ 				if (!projectable(y, x, py, px))
+ 				{
+ 					/* Calculate distance from player */
+ 					dis = distance(y, x, py, px);
+ 
+ 					/* Remember if further than previous */
+ 					if (dis > gdis)
+ 					{
+ 						gy = y;
+ 						gx = x;
+ 						gdis = dis;
+ 					}
+ 				}
+ 			}
+ 		}
+ 
+ 		/* Check for success */
+ 		if (gdis > 0)
+ 		{
+ 			/* Good location */
+ 			(*yp) = fy - gy;
+ 			(*xp) = fx - gx;
+ 
+ 			/* Found safe place */
+ 			return (TRUE);
+ 		}
+ 	}
+ 
+ 	/* No safe place */
+ 	return (FALSE);
+ }
+ 
+ 
+ /*
+  * Choose a good hiding place near a monster for it to run toward.
+  *
+  * Pack monsters will use this to "ambush" the player and lure him out
+  * of corridors into open space so they can swarm him.
+  *
+  * Return TRUE if a good location is available.
+  */
+ static bool find_hiding(int m_idx, int *yp, int *xp)
+ {
+ 	monster_type *m_ptr = &m_list[m_idx];
+ 
+ 	int fy = m_ptr->fy;
+ 	int fx = m_ptr->fx;
+ 
+ 	int py = p_ptr->py;
+ 	int px = p_ptr->px;
+ 
+ 	int y, x, d, dis;
+ 	int gy = 0, gx = 0, gdis = 999, min;
+ 
+ 	/* Closest distance to get */
+ 	min = distance(py, px, fy, fx) * 3 / 4 + 2;
+ 
+ 	/* Start with adjacent locations, spread further */
+ 	for (d = 1; d < 10; d++)
+ 	{
+ 		/* Check nearby locations */
+ 		for (y = fy - d; y <= fy + d; y++)
+ 		{
+ 			for (x = fx - d; x <= fx + d; x++)
+ 			{
+ 				/* Skip illegal locations */
+ 				if (!in_bounds_fully(y, x)) continue;
+ 
+ 				/* Skip locations in a wall */
+ 				if (!cave_floor_bold(y, x)) continue;
+ 
+ 				/* Check distance */
+ 				if (distance(y, x, fy, fx) != d) continue;
+ 
+ 				/* Check for hidden, available grid */
+ 				if (!player_can_see_bold(y, x) && clean_shot(fy, fx, y, x))
+ 				{
+ 					/* Calculate distance from player */
+ 					dis = distance(y, x, py, px);
+ 
+ 					/* Remember if closer than previous */
+ 					if (dis < gdis && dis >= min)
+ 					{
+ 						gy = y;
+ 						gx = x;
+ 						gdis = dis;
+ 					}
+ 				}
+ 			}
+ 		}
+ 
+ 		/* Check for success */
+ 		if (gdis < 999)
+ 		{
+ 			/* Good location */
+ 			(*yp) = fy - gy;
+ 			(*xp) = fx - gx;
+ 
+ 			/* Found good place */
+ 			return (TRUE);
+ 		}
+ 	}
+ 
+ 	/* No good place */
+ 	return (FALSE);
+ }
+ 
  
  /*
   * Choose "logical" directions for monster movement
   *
   * We store the directions in a special "mm" array
   */
! static bool get_moves(int m_idx, int mm[5])
  {
  	int py = p_ptr->py;
  	int px = p_ptr->px;
  
  	monster_type *m_ptr = &m_list[m_idx];
+ 	monster_race *r_ptr = &r_info[m_ptr->r_idx];
  
  	int y, ay, x, ax;
  
  	int move_val = 0;
     int y2 = py;
  	int x2 = px;
+ 	bool done = FALSE;
+ 
  
+ 	/* Choose the appropriate target for pets. */
+ 	if (m_ptr->smart & SM_DOMINATE)
+ 	  find_target_nearest(m_ptr->fy, m_ptr->fx, r_ptr->aaf, &py, &px);
+    y2=py; x2=px;
  
  #ifdef MONSTER_FLOW
  	/* Flow towards the player */
! 	if (flow_by_sound && !(m_ptr->smart & SM_DOMINATE))
  	{
  		/* Flow towards the player */
  		(void)get_moves_aux(m_idx, &y2, &x2);
***************
*** 2138,2151 ****
  	x = m_ptr->fx - x2;
  
  
  	/* Apply fear */
! 	if (mon_will_run(m_idx))
  	{
  		/* This is not a very "smart" method XXX XXX */
  		y = (-y);
  		x = (-x);
  	}
  
  
  	/* Extract the "absolute distances" */
  	ax = ABS(x);
--- 3105,3200 ----
  	x = m_ptr->fx - x2;
  
  
+    if (!(m_ptr->smart & SM_DOMINATE))
+    {
+ 	/* Animal packs try to get the player out of corridors */
+ /*	if ((r_ptr->flags1 & RF1_FRIENDS) && (r_ptr->flags3 & RF3_ANIMAL))*/
+    if (r_ptr->flags1 & RF1_FRIENDS) /* all pack monsters */
+ 	{
+ 		int i, room = 0;
+ 
+ 		/* Count room grids next to player */
+ 		for (i = 0; i < 8; i++)
+ 		{
+ 			/* Check grid */
+ 			if (cave_info[py + ddy_ddd[i]][px + ddx_ddd[i]] & (CAVE_ROOM))
+ 			{
+ 				/* One more room grid */
+ 				room++;
+ 			}
+ 		}
+ 
+ 		/* Not in a room and strong player */
+ 		if ((room < 8) && (p_ptr->chp > p_ptr->mhp / 2))
+ 		{
+ 			/* Find hiding place */
+ 			if (find_hiding(m_idx, &y, &x)) done = TRUE;
+ 		}
+ 	}
+ 
+ 	/* Monster groups try to surround the player */
+ 	if (!done && (r_ptr->flags1 & RF1_FRIENDS))
+ 	{
+ 		int i;
+ 
+ 		/* Find an empty square near the player to fill */
+ 		for (i = 0; i < 8; i++)
+ 		{
+ 			/* Pick squares near player (semi-randomly) */
+ 			y2 = py + ddy_ddd[(m_idx + i) & 7];
+ 			x2 = px + ddx_ddd[(m_idx + i) & 7];
+ 
+ 			/* Already there? */
+ 			if ((m_ptr->fy == y2) && (m_ptr->fx == x2))
+ 			{
+ 				/* Attack the player */
+ 				y2 = py;
+ 				x2 = px;
+ 
+ 				break;
+ 			}
+ 
+ 			/* Ignore filled grids */
+ 			if (!cave_empty_bold(y2, x2))
+ 				continue;
+ 
+ 			/* Try to fill this hole */
+ 			break;
+ 		}
+ 
+ 		/* Extract the new "pseudo-direction" */
+ 		y = m_ptr->fy - y2;
+ 		x = m_ptr->fx - x2;
+ 
+ 		/* Done */
+ 		done = TRUE;
+ 	}
+ 
  	/* Apply fear */
! 	if (!done && mon_will_run(m_idx))
! 	{
! 		/* Try to find safe place */
! 		if (!find_safety(m_idx, &y, &x))
  		{
  			/* This is not a very "smart" method XXX XXX */
  			y = (-y);
  			x = (-x);
  		}
+ 		else
+ 		{
+ 			/* Attempt to avoid the player */
+ 			if (flow_by_sound)
+ 			{
+ 				/* Adjust movement */
+ 				(void)get_fear_moves_aux(m_idx, &y, &x);
+ 			}
+ 		}
+ 	}
+ 
+    } /* end of AI code for non-dominated monsters */
  
+ 	/* Check for no move */
+ 	if (!x && !y) return (FALSE);
  
  	/* Extract the "absolute distances" */
  	ax = ABS(x);
***************
*** 2333,2338 ****
--- 3382,3430 ----
  			break;
  		}
  	}
+    /* Old domination interface - replaced with kamband automatic pets */
+ 
+     if (m_ptr->smart & SM_DOMINATE)
+     {
+        char cmd,old_cu,old_cv;
+        int rlev = r_info[m_ptr->r_idx].level;
+        if ((randint(p_ptr->lev * 10 + 500) < rlev)
+           || ((r_info[m_ptr->r_idx].flags1 & RF1_UNIQUE) && !rand_int(8)))
+        {
+          m_ptr->smart &= ~SM_DOMINATE;
+          if ((rand_int(150) < rlev) || !rand_int(5) ||
+            ((r_info[m_ptr->r_idx].flags1 & RF1_UNIQUE) && rand_int(2)))
+          {
+            msg_print("Your domination is sharply broken!");
+            project(m_idx,0,p_ptr->py,p_ptr->px,damroll(5,rlev),
+             (r_info[m_ptr->r_idx].flags1 & RF1_UNIQUE) ?
+             (rlev < 20 ? GF_PSI : (rlev < 40 ? GF_PSI2 : GF_PSI3)) :
+             (rlev < 30 ? GF_PSI : (rlev < 70 ? GF_PSI2 : GF_PSI3)), 0);
+          }
+          /* else msg_print(format("%s glowers at you.")); */
+          return TRUE;
+        }
+        /*
+        move_cursor_relative(m_ptr->fy,m_ptr->fx);
+        old_cu = Term->scr->cu;
+        old_cv = Term->scr->cv;
+        Term->scr->cu = 0;
+        Term->scr->cv = 1;
+        Term_fresh();
+        if (!panel_contains(m_ptr->fy,m_ptr->fx)) return TRUE;
+        #ifdef MSDOS
+        _farpokeb(_dos_ds,0xB8001 + ((m_ptr->fy - p_ptr->wy) * 80 +
+       	(m_ptr->fx - p_ptr->wx)) * 2,r_info[m_ptr->r_idx].x_attr + 0x80);
+        #endif
+        mm[0] = get_com("Move dominated monster.",&cmd) ?
+               target_dir(cmd) : 0;
+        if (mm[0] == 5) mm[0] = 0;
+        Term->scr->cu = old_cu;
+        Term->scr->cv = old_cv;
+        }
+ */
+ 	/* Want to move */
+ 	return (TRUE);
  }
  
  
***************
*** 2505,2510 ****
--- 3597,3606 ----
  	{
  		int d = 1;
  
+        /* Uniques get a special save (psi) */
+        if (r_ptr->flags1 & RF1_UNIQUE)
+          while (randint(12) * randint(18) < r_ptr->level) d += randint(4);
+ 
  		/* Make a "saving throw" against stun */
  		if (rand_int(5000) <= r_ptr->level * r_ptr->level)
  		{
***************
*** 2539,2545 ****
  		}
  
  		/* Still stunned */
! 		if (m_ptr->stunned) return;
  	}
  
  
--- 3635,3643 ----
  		}
  
  		/* Still stunned */
! 		if (m_ptr->stunned)
! 		  if (randint(100) < 60)
! 		    return;
  	}
  
  
***************
*** 2714,2721 ****
  	/* Normal movement */
  	if (!stagger)
  	{
! 		/* Logical moves */
! 		get_moves(m_idx, mm);
  	}
  
  
--- 3812,3819 ----
  	/* Normal movement */
  	if (!stagger)
  	{
! 		/* Logical moves, may do nothing */
! 		if (!get_moves(m_idx, mm)) return;
  	}
  
  
***************
*** 2932,2937 ****
--- 4030,4036 ----
  		/* The player is in the way.  Attack him. */
  		if (do_move && (cave_m_idx[ny][nx] < 0))
  		{
+          if (!(m_ptr->smart & SM_DOMINATE))
  			/* Do the attack */
  			(void)make_attack_normal(m_idx);
  
***************
*** 2965,2983 ****
  			/* Kill weaker monsters */
  			if ((r_ptr->flags2 & (RF2_KILL_BODY)) &&
  			    (compare_monsters(m_ptr, n_ptr) > 0))
! 			{
! 				/* Allow movement */
! 				do_move = TRUE;
  
! 				/* Monster ate another monster */
! 				did_kill_body = TRUE;
  
  				/* Message XXX XXX XXX */
! 
  				/* Kill the monster */
  				delete_monster(ny, nx);
  			}
- 		}
  
  		/* A monster is in the way */
  		if (do_move && (cave_m_idx[ny][nx] > 0))
--- 4064,4085 ----
  			/* Kill weaker monsters */
  			if ((r_ptr->flags2 & (RF2_KILL_BODY)) &&
  			    (compare_monsters(m_ptr, n_ptr) > 0))
!  			      do_move = did_kill_body = TRUE;
  
!          /* monster-monster combat occurs if either one is dominated */
!           if ((m_ptr->smart & SM_DOMINATE) ^
!               (n_ptr->smart & SM_DOMINATE))
!  	        if (!did_kill_body)
!  	      {
!              monst_attack_monst(m_idx,cave_m_idx[ny][nx]);
!  		      do_turn = TRUE;
!  	      }
  
  				/* Message XXX XXX XXX */
!             if (did_kill_body)
  				/* Kill the monster */
  				delete_monster(ny, nx);
  		}
  
  		/* A monster is in the way */
  		if (do_move && (cave_m_idx[ny][nx] > 0))
***************
*** 2990,2996 ****
  			/* Push past weaker monsters (unless leaving a wall) */
  			if ((r_ptr->flags2 & (RF2_MOVE_BODY)) &&
  			    (compare_monsters(m_ptr, n_ptr) > 0) &&
! 			    (cave_floor_bold(m_ptr->fy, m_ptr->fx)))
  			{
  				/* Allow movement */
  				do_move = TRUE;
--- 4092,4100 ----
  			/* Push past weaker monsters (unless leaving a wall) */
  			if ((r_ptr->flags2 & (RF2_MOVE_BODY)) &&
  			    (compare_monsters(m_ptr, n_ptr) > 0) &&
! 			    (cave_floor_bold(m_ptr->fy, m_ptr->fx)) &&
! 			    !(m_ptr->smart & SM_DOMINATE) &&
! 			    !(n_ptr->smart & SM_DOMINATE))
  			{
  				/* Allow movement */
  				do_move = TRUE;
***************
*** 3020,3025 ****
--- 4124,4130 ----
  			     ((m_ptr->mflag & (MFLAG_VIEW)) &&
  			      disturb_near)))
  			{
+             /* if (!(m_ptr->smart & SM_DOMINATE)) ??? */
  				/* Disturb */
  				disturb(0, 0);
  			}
***************
*** 3142,3147 ****
--- 4247,4259 ----
  		if (do_turn) break;
  	}
  
+ 
+ 	/* If we haven't done anything, try casting a spell again */
+ 	if (!do_turn && !do_move && !m_ptr->monfear)
+ 	{
+ 		/* Cast spell */
+ 		if (make_attack_spell(m_idx)) return;
+ 	}
  
  	/* Notice changes in view */
  	if (do_view)
diff -c -w -r \games\angb283/src/monster1.c ./src/monster1.c
*** \games\angb283/src/monster1.c	Mon Feb  9 07:25:50 1998
--- ./src/monster1.c	Mon Feb 23 18:26:46 1998
***************
*** 153,167 ****
  
  
  	/* Cheat -- know everything */
! 	if (cheat_know)
  	{
  		/* XXX XXX XXX */
  
  		/* Hack -- save memory */
  		COPY(&save_mem, r_ptr, monster_type);
  
- 		/* Hack -- Maximal kills */
- 		r_ptr->r_tkills = MAX_SHORT;
  
  		/* Hack -- Maximal info */
  		r_ptr->r_wake = r_ptr->r_ignore = MAX_UCHAR;
--- 153,165 ----
  
  
  	/* Cheat -- know everything */
! 	if (cheat_know || r_ptr->r_xtra1)
  	{
  		/* XXX XXX XXX */
  
  		/* Hack -- save memory */
  		COPY(&save_mem, r_ptr, monster_type);
  
  
  		/* Hack -- Maximal info */
  		r_ptr->r_wake = r_ptr->r_ignore = MAX_UCHAR;
***************
*** 343,348 ****
--- 341,347 ----
  		}
  	}
  
+ if (cheat_know || (r_ptr->r_xtra1 != 0)) r_ptr->r_tkills = MAX_SHORT;
  
  	/* Descriptions */
  	if (show_details)
***************
*** 602,610 ****
  	/* Collect inate attacks */
  	vn = 0;
  	if (flags4 & (RF4_SHRIEK))		vp[vn++] = "shriek for help";
- 	if (flags4 & (RF4_XXX2))		vp[vn++] = "do something";
- 	if (flags4 & (RF4_XXX3))		vp[vn++] = "do something";
- 	if (flags4 & (RF4_XXX4))		vp[vn++] = "do something";
  	if (flags4 & (RF4_ARROW_1))		vp[vn++] = "fire an arrow";
  	if (flags4 & (RF4_ARROW_2))		vp[vn++] = "fire arrows";
  	if (flags4 & (RF4_ARROW_3))		vp[vn++] = "fire a missile";
--- 601,606 ----
***************
*** 655,662 ****
  	if (flags4 & (RF4_BR_PLAS))		vp[vn++] = "plasma";
  	if (flags4 & (RF4_BR_WALL))		vp[vn++] = "force";
  	if (flags4 & (RF4_BR_MANA))		vp[vn++] = "mana";
! 	if (flags4 & (RF4_XXX5))		vp[vn++] = "something";
! 	if (flags4 & (RF4_XXX6))		vp[vn++] = "something";
  	if (flags4 & (RF4_XXX7))		vp[vn++] = "something";
  	if (flags4 & (RF4_XXX8))		vp[vn++] = "something";
  
--- 651,657 ----
  	if (flags4 & (RF4_BR_PLAS))		vp[vn++] = "plasma";
  	if (flags4 & (RF4_BR_WALL))		vp[vn++] = "force";
  	if (flags4 & (RF4_BR_MANA))		vp[vn++] = "mana";
!         if (flags4 & (RF4_BR_INSA))             vp[vn++] = "insanity";
  	if (flags4 & (RF4_XXX7))		vp[vn++] = "something";
  	if (flags4 & (RF4_XXX8))		vp[vn++] = "something";
  
***************
*** 685,690 ****
--- 680,689 ----
  
  	/* Collect spells */
  	vn = 0;
+ 	if (flags4 & (RF4_P_BLAST))		vp[vn++] = "produce psionic blasts";
+ 	if (flags4 & (RF4_P_CRUSH))		vp[vn++] = "crush the psyche";
+ 	if (flags4 & (RF4_M_WRACK))		vp[vn++] = "wrack the mind";
+ 	if (flags4 & (RF4_P_WAVE))		   vp[vn++] = "project psychic waves";
  	if (flags5 & (RF5_BA_ACID))		vp[vn++] = "produce acid balls";
  	if (flags5 & (RF5_BA_ELEC))		vp[vn++] = "produce lightning balls";
  	if (flags5 & (RF5_BA_FIRE))		vp[vn++] = "produce fire balls";
***************
*** 720,726 ****
  	if (flags6 & (RF6_HASTE))		vp[vn++] = "haste-self";
  	if (flags6 & (RF6_XXX1))		vp[vn++] = "do something";
  	if (flags6 & (RF6_HEAL))		vp[vn++] = "heal-self";
! 	if (flags6 & (RF6_XXX2))		vp[vn++] = "do something";
  	if (flags6 & (RF6_BLINK))		vp[vn++] = "blink-self";
  	if (flags6 & (RF6_TPORT))		vp[vn++] = "teleport-self";
  	if (flags6 & (RF6_XXX3))		vp[vn++] = "do something";
--- 719,725 ----
  	if (flags6 & (RF6_HASTE))		vp[vn++] = "haste-self";
  	if (flags6 & (RF6_XXX1))		vp[vn++] = "do something";
  	if (flags6 & (RF6_HEAL))		vp[vn++] = "heal-self";
!  	if (flags6 & (RF6_HEAL2))     vp[vn++] = "super heal-self";
  	if (flags6 & (RF6_BLINK))		vp[vn++] = "blink-self";
  	if (flags6 & (RF6_TPORT))		vp[vn++] = "teleport-self";
  	if (flags6 & (RF6_XXX3))		vp[vn++] = "do something";
***************
*** 888,893 ****
--- 887,896 ----
  	{
  		roff(format("%^s is rarely detected by telepathy.  ", wd_he[msex]));
  	}
+    if (flags2 & RF2_STUPID)
+    {
+       roff(format("%^s is stupid.  ",wd_he[msex]));
+    }
  	if (flags2 & (RF2_MULTIPLY))
  	{
  		roff(format("%^s breeds explosively.  ", wd_he[msex]));
***************
*** 966,971 ****
--- 969,975 ----
  	if (flags3 & (RF3_RES_PLAS)) vp[vn++] = "plasma";
  	if (flags3 & (RF3_RES_NEXU)) vp[vn++] = "nexus";
  	if (flags3 & (RF3_RES_DISE)) vp[vn++] = "disenchantment";
+    if (flags3 & RF3_RES_PSI)    vp[vn++] = "psionics";
  
  	/* Describe resistances */
  	if (vn)
***************
*** 996,1001 ****
--- 1000,1006 ----
  	if (flags3 & (RF3_NO_FEAR)) vp[vn++] = "frightened";
  	if (flags3 & (RF3_NO_CONF)) vp[vn++] = "confused";
  	if (flags3 & (RF3_NO_SLEEP)) vp[vn++] = "slept";
+    if (flags3 & RF3_IM_PSI) vp[vn++] = "attacked mentally";
  
  	/* Describe non-effects */
  	if (vn)
***************
*** 1331,1336 ****
--- 1336,1346 ----
  	if (flags1 & (RF1_QUESTOR))
  	{
  		roff("You feel an intense desire to kill this monster...  ");
+ 	}
+ 
+ 	if (r_ptr->r_xtra1)
+ 	{
+ 		roff("You have successfully analyzed this monster.");
  	}
  
  
diff -c -w -r \games\angb283/src/monster2.c ./src/monster2.c
*** \games\angb283/src/monster2.c	Fri Feb  6 09:10:30 1998
--- ./src/monster2.c	Wed Feb 25 21:33:42 1998
***************
*** 725,730 ****
--- 725,736 ----
  			/* Append special notation */
  			strcat(desc, " (offscreen)");
  		}
+ 
+ 		/* Show pets */
+ 		if (m_ptr->smart & SM_DOMINATE) {
+ 		  strcat(desc, " (dominated)");
+ 		}
+ 
  	}
  }
  
***************
*** 1023,1029 ****
  			if (r_ptr->r_sights < MAX_SHORT) r_ptr->r_sights++;
  
  			/* Disturb on appearance */
! 			if (disturb_move) disturb(1, 0);
  		}
  	}
  
--- 1029,1035 ----
  			if (r_ptr->r_sights < MAX_SHORT) r_ptr->r_sights++;
  
  			/* Disturb on appearance */
! 			if (disturb_move && !(m_ptr->smart & SM_DOMINATE)) disturb(1, 0);
  		}
  	}
  
***************
*** 1043,1049 ****
  			if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
  
  			/* Disturb on disappearance */
! 			if (disturb_move) disturb(1, 0);
  		}
  	}
  
--- 1049,1055 ----
  			if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
  
  			/* Disturb on disappearance */
! 			if (disturb_move && !(m_ptr->smart & SM_DOMINATE)) disturb(1, 0);
  		}
  	}
  
***************
*** 1058,1064 ****
  			m_ptr->mflag |= (MFLAG_VIEW);
  
  			/* Disturb on appearance */
! 			if (disturb_near) disturb(1, 0);
  		}
  	}
  
--- 1064,1070 ----
  			m_ptr->mflag |= (MFLAG_VIEW);
  
  			/* Disturb on appearance */
! 			if (disturb_near && !(m_ptr->smart & SM_DOMINATE)) disturb(1, 0);
  		}
  	}
  
***************
*** 1072,1078 ****
  			m_ptr->mflag &= ~(MFLAG_VIEW);
  
  			/* Disturb on disappearance */
! 			if (disturb_near) disturb(1, 0);
  		}
  	}
  }
--- 1078,1084 ----
  			m_ptr->mflag &= ~(MFLAG_VIEW);
  
  			/* Disturb on disappearance */
! 			if (disturb_near && !(m_ptr->smart & SM_DOMINATE)) disturb(1, 0);
  		}
  	}
  }
***************
*** 1424,1432 ****
  		if (r_ptr->flags1 & (RF1_UNIQUE))
  		{
  			/* Message for cheaters */
! 			if (cheat_hear) msg_format("Deep Unique (%s).", name);
  
  			/* Boost rating by twice delta-depth */
  			rating += (r_ptr->level - p_ptr->depth) * 2;
  		}
  
--- 1430,1440 ----
  		if (r_ptr->flags1 & (RF1_UNIQUE))
  		{
  			/* Message for cheaters */
!                         if (cheat_hear || pa_ptr->precognition)
!                            msg_format("Deep Unique (%s).", name);
  
  			/* Boost rating by twice delta-depth */
+          if (!no_rating_bonus)
  			rating += (r_ptr->level - p_ptr->depth) * 2;
  		}
  
***************
*** 1434,1442 ****
  		else
  		{
  			/* Message for cheaters */
! 			if (cheat_hear) msg_format("Deep Monster (%s).", name);
  
  			/* Boost rating by delta-depth */
  			rating += (r_ptr->level - p_ptr->depth);
  		}
  	}
--- 1442,1452 ----
  		else
  		{
  			/* Message for cheaters */
!                         if (cheat_hear || pa_ptr->precognition)
!                            msg_format("Deep Monster (%s).", name);
  
  			/* Boost rating by delta-depth */
+          if (!no_rating_bonus)
  			rating += (r_ptr->level - p_ptr->depth);
  		}
  	}
***************
*** 1445,1451 ****
  	else if (r_ptr->flags1 & (RF1_UNIQUE))
  	{
  		/* Unique monsters induce message */
! 		if (cheat_hear) msg_format("Unique (%s).", name);
  	}
  
  
--- 1455,1462 ----
  	else if (r_ptr->flags1 & (RF1_UNIQUE))
  	{
  		/* Unique monsters induce message */
!                 if (cheat_hear || pa_ptr->precognition)
!                   msg_format("Unique (%s).", name);
  	}
  
  
***************
*** 1517,1522 ****
--- 1528,1535 ----
  	/* Place the monster in the dungeon */
  	if (!monster_place(y, x, n_ptr)) return (FALSE);
  
+    if (summon_friendly) n_ptr->smart |= SM_DOMINATE;
+ 
  	/* Success */
  	return (TRUE);
  }
***************
*** 2081,2086 ****
--- 2094,2101 ----
  
  	bool result = FALSE;
  
+    summon_friendly = (m_ptr->smart & SM_DOMINATE) != 0;
+ 
  	/* Try up to 18 times */
  	for (i = 0; i < 18; i++)
  	{
***************
*** 2098,2103 ****
--- 2113,2120 ----
  		/* Done */
  		break;
  	}
+ 
+    summon_friendly = FALSE;
  
  	/* Result */
  	return (result);
diff -c -w -r \games\angb283/src/object1.c ./src/object1.c
*** \games\angb283/src/object1.c	Mon Feb  9 11:02:32 1998
--- ./src/object1.c	Mon Feb 23 18:26:50 1998
***************
*** 333,338 ****
--- 333,339 ----
  		/* Spellbooks */
  		case TV_MAGIC_BOOK:
  		case TV_PRAYER_BOOK:
+       case TV_PSI_BOOK:
  		{
  			return (TRUE);
  		}
***************
*** 697,702 ****
--- 698,709 ----
  	(*f2) = k_ptr->flags2;
  	(*f3) = k_ptr->flags3;
  
+          #ifndef NO_PSI_ERASE
+          if (*f3 & TR3_PSI_ERASE)
+            if (mp_ptr->spell_book != TV_PSI_BOOK)
+              {*f1 = *f2 = 0; *f3 = TR3_PSI_ERASE; return;}
+          #endif
+ 
  	/* Artifact */
  	if (o_ptr->name1)
  	{
***************
*** 992,997 ****
--- 999,1005 ----
  
  	bool show_weapon;
  	bool show_armour;
+         bool show_missile = FALSE;
  
  	char *t;
  
***************
*** 1008,1014 ****
  	u32b f1, f2, f3;
  
  	object_kind *k_ptr = &k_info[o_ptr->k_idx];
! 
  
  	/* Extract some flags */
  	object_flags(o_ptr, &f1, &f2, &f3);
--- 1016,1022 ----
  	u32b f1, f2, f3;
  
  	object_kind *k_ptr = &k_info[o_ptr->k_idx];
!    object_type *bow_ptr;
  
  	/* Extract some flags */
  	object_flags(o_ptr, &f1, &f2, &f3);
***************
*** 1210,1215 ****
--- 1218,1231 ----
  			break;
  		}
  
+  			/* Psionic stuff */
+  		case TV_PSI_BOOK:
+  		{
+  			modstr = basenm;
+  			basenm = "& Psionic Focus~ #";
+  			break;
+  		}
+ 
  		/* Hack -- Gold/Gems */
  		case TV_GOLD:
  		{
***************
*** 1327,1339 ****
  			{
  				char k = t[-1];
  
  				/* Hack -- "Cutlass-es" and "Torch-es" */
! 				if ((k == 's') || (k == 'h')) *t++ = 'e';
  
  				/* Add an 's' */
  				*t++ = 's';
  			}
  		}
  
  		/* Modifier */
  		else if (*s == '#')
--- 1343,1365 ----
  			{
  				char k = t[-1];
  
+                                 /* Foci not focuses */
+                                 if ((k == 's') && (t[-2] == 'u'))
+                                 {
+                                         t[-2] = 'i';
+                                         t--;
+                                 }
+                                 else
+                                 {
  				/* Hack -- "Cutlass-es" and "Torch-es" */
! 				if ((k == 's') || (k == 'h'))
! 				  *t++ = 'e';
  
  				/* Add an 's' */
  				*t++ = 's';
  			}
  		}
+ 		}
  
  		/* Modifier */
  		else if (*s == '#')
***************
*** 1494,1499 ****
--- 1520,1526 ----
  		case TV_ARROW:
  		{
  			/* Fall through */
+          show_missile = TRUE;
  		}
  
  		/* Weapons */
***************
*** 1747,1752 ****
--- 1774,1790 ----
  		object_desc_str_macro(t, " (charging)");
  	}
  
+    /* Show average missile damage - adjust for unknown bow */
+ 	if (known && show_missile)
+      if (o_ptr->tval == p_ptr->ammo_tval)
+      {
+        bow_ptr = &inventory[INVEN_BOW];
+        if (bow_ptr->tval)
+           object_desc_str_macro(t,format(" (Avg Dam %d)",(p_ptr->num_fire
+           * (object_known_p(bow_ptr) ? p_ptr->ammo_mult : bow_ptr->sval % 10)
+           * (o_ptr->dd * (o_ptr->ds + 1) + (o_ptr->to_d * 2) +
+           (object_known_p(bow_ptr) ? bow_ptr->to_d * 2 : 0))) >> 1));
+      }
  
  	/* No more details wanted */
  	if (mode < 3)
***************
*** 2173,2178 ****
--- 2211,2224 ----
  		info[i++] = "...if it is being worn.";
  	}
  
+ 	if (f3 & TR3_PSEUDO_ID)
+ 	  if (p_ptr->pclass == CLASS_PSIONICIST)
+ 	    info[i++] = "It helps provide feelings about objects.";
+ 
+    if (f3 & TR3_PSI_ERASE)
+      if (p_ptr->pclass != CLASS_PSIONICIST)
+        info[i++] = "It can only be used by psionicists.";
+ 
  
  	/* Hack -- describe lite's */
  	if (o_ptr->tval == TV_LITE)
***************
*** 2428,2433 ****
--- 2474,2491 ----
  		info[i++] = "It provides resistance to disenchantment.";
  	}
  
+  	if (f2 & TR2_RES_FORCE)
+  	 info[i++] = "It provides resistance to force.";
+ 
+  	if (f2 & TR2_RES_INERT)
+  	 info[i++] = "It provides resistance to inertia.";
+ 
+  	if (f2 & TR2_RES_GRAVT)
+  	 info[i++] = "It provides resistance to gravity.";
+ 
+     if (f2 & TR2_RES_PSI)
+      info[i++] = "It provides resistance to mental attacks.";
+ 
  	if (f3 & (TR3_SLOW_DIGEST))
  	{
  		info[i++] = "It slows your metabolism.";
***************
*** 2526,2531 ****
--- 2584,2592 ----
  		info[i++] = "It cannot be harmed by cold.";
  	}
  
+    if (f2 & (TR2_META_PSI1 | TR2_META_PSI2))
+       info[i++] = format("It acts as a metapsionic focus (lvl %d).",
+       ((f2 & TR2_META_PSI1) ? 1 : 0) + ((f2 & TR2_META_PSI2) ? 2 : 0));
  
  	/* No special effects */
  	if (!i) return (FALSE);
***************
*** 2666,2671 ****
--- 2727,2733 ----
  		}
  
  		case TV_AMULET:
+                 case TV_PSI_BOOK:
  		{
  			return (INVEN_NECK);
  		}
diff -c -w -r \games\angb283/src/object2.c ./src/object2.c
*** \games\angb283/src/object2.c	Mon Feb  9 10:32:04 1998
--- ./src/object2.c	Mon Feb 23 18:26:56 1998
***************
*** 1395,1400 ****
--- 1395,1403 ----
  
  	/* Hack -- cursed items are always "cursed" */
  	if (k_ptr->flags3 & (TR3_LIGHT_CURSE)) o_ptr->ident |= (IDENT_CURSED);
+ 
+    /* Hack -- psionic foci are always fully identified */
+    if (k_ptr->flags3 & TR3_PSI_ERASE) o_ptr->ident |= IDENT_MENTAL;
  }
  
  
***************
*** 2176,2182 ****
  			rating += 30;
  
  			/* Mention the item */
! 			if (cheat_peek) object_mention(o_ptr);
  
  			break;
  		}
--- 2179,2186 ----
  			rating += 30;
  
  			/* Mention the item */
!                         if (cheat_peek || pa_ptr->precognition)
!                           object_mention(o_ptr);
  
  			break;
  		}
***************
*** 2696,2702 ****
  					rating += 25;
  
  					/* Mention the item */
! 					if (cheat_peek) object_mention(o_ptr);
  
  					break;
  				}
--- 2700,2707 ----
  					rating += 25;
  
  					/* Mention the item */
!                                         if (cheat_peek || pa_ptr->precognition)
!                                           object_mention(o_ptr);
  
  					break;
  				}
***************
*** 2917,2923 ****
  					rating += 25;
  
  					/* Mention the item */
! 					if (cheat_peek) object_mention(o_ptr);
  
  					break;
  				}
--- 2922,2929 ----
  					rating += 25;
  
  					/* Mention the item */
!                                         if (cheat_peek || pa_ptr->precognition)
!                                           object_mention(o_ptr);
  
  					break;
  				}
***************
*** 3137,3143 ****
  		good_item_flag = TRUE;
  
  		/* Cheat -- peek at the item */
! 		if (cheat_peek) object_mention(o_ptr);
  
  		/* Done */
  		return;
--- 3143,3150 ----
  		good_item_flag = TRUE;
  
  		/* Cheat -- peek at the item */
!                 if (cheat_peek || pa_ptr->precognition)
!                   object_mention(o_ptr);
  
  		/* Done */
  		return;
***************
*** 3258,3264 ****
  		rating += e_ptr->rating;
  
  		/* Cheat -- describe the item */
! 		if (cheat_peek) object_mention(o_ptr);
  
  		/* Done */
  		return;
--- 3265,3272 ----
  		rating += e_ptr->rating;
  
  		/* Cheat -- describe the item */
!                 if (cheat_peek || pa_ptr->precognition)
!                   object_mention(o_ptr);
  
  		/* Done */
  		return;
***************
*** 3432,3438 ****
  		rating += (k_info[j_ptr->k_idx].level - p_ptr->depth);
  
  		/* Cheat -- peek at items */
! 		if (cheat_peek) object_mention(j_ptr);
  	}
  
  	/* Success */
--- 3440,3447 ----
  		rating += (k_info[j_ptr->k_idx].level - p_ptr->depth);
  
  		/* Cheat -- peek at items */
!                 if (cheat_peek || pa_ptr->precognition)
!                  object_mention(j_ptr);
  	}
  
  	/* Success */
***************
*** 4743,4749 ****
  	minfail = adj_mag_fail[p_ptr->stat_ind[mp_ptr->spell_stat]];
  
  	/* Non mage/priest characters never get better than 5 percent */
! 	if ((p_ptr->pclass != CLASS_MAGE) && (p_ptr->pclass != CLASS_PRIEST))
  	{
  		if (minfail < 5) minfail = 5;
  	}
--- 4752,4759 ----
  	minfail = adj_mag_fail[p_ptr->stat_ind[mp_ptr->spell_stat]];
  
  	/* Non mage/priest characters never get better than 5 percent */
! 	if ((p_ptr->pclass != CLASS_MAGE) && (p_ptr->pclass != CLASS_PRIEST)
!        && (p_ptr->pclass != CLASS_PSIONICIST))
  	{
  		if (minfail < 5) minfail = 5;
  	}
***************
*** 4821,4826 ****
--- 4831,4888 ----
  {
  	/* Default */
  	strcpy(p, "");
+ 
+    /* Psionic powers */
+ 	if (mp_ptr->spell_book == TV_PSI_BOOK)
+ 	{
+ 		int plev = p_ptr->lev;
+ 		switch (spell)
+ 		{
+ 		   case 0: sprintf(p," dam %dd4",1 + plev / 4); break; /*MThrust*/
+ 	      case 1: sprintf(p," dur d%d",20 + 2 * plev); break; /*MBarrier*/
+ 		   case 2: sprintf(p," dam %dd9", plev); break;     /*PCrush*/
+ 		   case 5: sprintf(p," dam %d",5 * plev); break;       /*PBlast*/
+ 	      case 6: sprintf(p," dam 2d%d",plev); break;         /*MWrack*/
+ 
+ 		   case 9:sprintf(p," range 10"); break;                /*Blink*/
+ 		   case 10:sprintf(p," range %d",5 * plev); break;      /*Tport*/
+          case 11:sprintf(p," range %d",plev + 2); break;      /*DDoor*/
+ 	      case 12:sprintf(p," dur %d + d5",plev/8 - 3);break; /*PTravel*/
+ 	      case 15:sprintf(p," dur dd%d",plev + 100); break;    /*TSAnch*/
+ 	      case 16:sprintf(p," (5d%d)%%",plev); break;          /*TShift*/
+ 
+ 	      case 17: sprintf(p," heal %dd6",plev / 2); break;  /*CellAdj*/
+ 	      case 19: sprintf(p," dur %d+d20",plev); break;     /*Adren*/
+ 	      case 20: sprintf(p," dur d%d",10 + plev); break;   /*Biofeed*/
+ 	      case 21: sprintf(p," dur dd%d",12 + plev); break;  /*Shadow*/
+ 	      case 22: sprintf(p," dam %dd10",plev); break;      /*DrainL*/
+ 	      case 24: sprintf(p," dur 10+d20"); break;          /*EnergyC*/
+ 	      case 25: sprintf(p," dam 15d(6d%d)",plev); break;  /*DeathF*/
+ 
+ 	      case 28: sprintf(p," dur d%d",20 + plev / 2); break;   /*Inertia*/
+          case 29: if (plev > 30) plev = 30;
+ 	               sprintf(p," dam 3d%d",plev); break;       /*PForce*/
+          case 30: if (plev > 30) plev = 30;
+ 	               sprintf(p," dam %d",30+plev*2); break;    /*SonicB*/
+          case 31: if (plev > 30) plev = 30;
+ 	               sprintf(p," dam %dd9",plev); break;       /*Disin*/
+ 	      case 32: sprintf(p," dam %d",plev*9 - 36); break;  /*SoCold*/
+ 	      case 33: sprintf(p," dam %d",plev*15 - 65); break; /*FireE*/
+ 	      case 34: sprintf(p," dam 20d%d",plev); break;      /*Detonate*/
+ 	      case 35: sprintf(p," dam 5d%d",p_ptr->chp); break; /*Balefire*/
+ #if 0
+          case 38: sprintf(p," d%d/charge",plev); break;     /*Recep*/
+ #endif
+ 	      case 40: sprintf(p," dam %dd6",plev / 2); break;   /*PDrain*/
+ 	      case 42: sprintf(p," dur %d+d20",plev); break;     /*TControl*/
+ 	      case 43: sprintf(p," dam 40d%d",plev); break;      /*Ublast*/
+ 	      case 44: sprintf(p," dam 100d%d",plev); break;     /*Ublast2*/
+ 
+ 	      case 46: sprintf(p," dur %d+d80",plev * plev / 5); break; /*Aware*/
+ 	      case 51: sprintf(p," dur d%d",plev); break;        /*Precog*/
+ 
+ 		}
+    }
  
  	/* Mage spells */
  	if (mp_ptr->spell_book == TV_MAGIC_BOOK)
Only in ./src: randart.c
Only in ./src: randmain.c
diff -c -w -r \games\angb283/src/save.c ./src/save.c
*** \games\angb283/src/save.c	Fri Feb  6 09:10:30 1998
--- ./src/save.c	Mon Feb 23 18:26:58 1998
***************
*** 9,15 ****
   */
  
  #include "angband.h"
! 
  
  #ifdef FUTURE_SAVEFILES
  
--- 9,15 ----
   */
  
  #include "angband.h"
! #include <unistd.h>
  
  #ifdef FUTURE_SAVEFILES
  
***************
*** 756,762 ****
--- 756,767 ----
  	wr_byte(m_ptr->stunned);
  	wr_byte(m_ptr->confused);
  	wr_byte(m_ptr->monfear);
+    #if 1
+    	wr_byte((m_ptr->smart & SM_DOMINATE ? 4 : 0) + (m_ptr->smart & 
+ 	 SM_AMNESIA2 ? 2 : 0) + (m_ptr->smart & SM_AMNESIA1 ? 1 : 0));
+    #else
  	wr_byte(0);
+    #endif
  }
  
  
***************
*** 1010,1015 ****
--- 1015,1037 ----
  	for (i = 0; i < 60; i++) wr_byte(0);
  }
  
+ #define wr_ability(x) wr_s16b(pa_ptr->x)
+ 
+ static void wr_psi_aux()
+ {
+ 	wr_s16b(pa_ptr->awareness);
+         wr_s16b(pa_ptr->adrenaline);
+ 	wr_s16b(pa_ptr->biofeedback);
+ 	wr_s16b(pa_ptr->shadow_form);
+ 	wr_s16b(pa_ptr->inertial_barrier);
+ 	wr_s16b(pa_ptr->prob_travel);
+ 	wr_ability(precognition);
+ 	wr_ability(mental_barrier);
+ 	wr_ability(ts_anchor);
+ 	wr_ability(your_mom_is_fat);
+ }
+ 
+ #undef wr_ability
  
  /*
   * Write some "extra" info
***************
*** 1031,1037 ****
  	wr_byte(p_ptr->prace);
  	wr_byte(p_ptr->pclass);
  	wr_byte(p_ptr->psex);
! 	wr_byte(0);	/* oops */
  
  	wr_byte(p_ptr->hitdie);
  	wr_byte(p_ptr->expfact);
--- 1053,1059 ----
  	wr_byte(p_ptr->prace);
  	wr_byte(p_ptr->pclass);
  	wr_byte(p_ptr->psex);
! 	wr_byte(p_ptr->oops);	/* oops */
  
  	wr_byte(p_ptr->hitdie);
  	wr_byte(p_ptr->expfact);
***************
*** 1112,1122 ****
  	wr_byte(p_ptr->searching);
  	wr_byte(p_ptr->maximize);
  	wr_byte(p_ptr->preserve);
  	wr_byte(0);
  
  	/* Future use */
! 	for (i = 0; i < 12; i++) wr_u32b(0L);
  
  	/* Ignore some flags */
  	wr_u32b(0L);	/* oops */
  	wr_u32b(0L);	/* oops */
--- 1134,1161 ----
  	wr_byte(p_ptr->searching);
  	wr_byte(p_ptr->maximize);
  	wr_byte(p_ptr->preserve);
+ #ifdef GJW_RANDART
+ 	wr_byte(p_ptr->random_artifacts);
+ #else
  	wr_byte(0);
+ #endif
  
+    if (p_ptr->oops)
+    {
+       wr_psi_aux();
+       i = 7;
+    }
+    else
+      i = 12;
+ #ifdef GJW_RANDART
+ 	/* Future use */
+ 	wr_u32b(seed_randart);
+    i--;
+ #else
  	/* Future use */
! #endif
  
+ 	for (; i ; i--) wr_u32b(0L);
  	/* Ignore some flags */
  	wr_u32b(0L);	/* oops */
  	wr_u32b(0L);	/* oops */
diff -c -w -r \games\angb283/src/spells1.c ./src/spells1.c
*** \games\angb283/src/spells1.c	Mon Feb  9 08:36:10 1998
--- ./src/spells1.c	Mon Feb 23 21:11:38 1998
***************
*** 80,85 ****
--- 80,91 ----
  	/* Paranoia */
  	if (!m_ptr->r_idx) return;
  
+    if (pa_ptr->ts_anchor)
+    {
+      msg_print(
+        "The time/space anchor prevents the monster from teleporting.");
+      return;
+    }
  	/* Save the old location */
  	oy = m_ptr->fy;
  	ox = m_ptr->fx;
***************
*** 154,159 ****
--- 160,170 ----
  
  	bool look = TRUE;
  
+    if (pa_ptr->ts_anchor)
+    {
+      msg_print("The time/space anchor holds you firmly in place.");
+      return;
+    }
  
  	/* Initialize */
  	y = py;
***************
*** 230,235 ****
--- 241,252 ----
  
  	int dis = 0, ctr = 0;
  
+    if (pa_ptr->ts_anchor)
+    {
+      msg_print("The time/space anchor holds you firmly in place.");
+      return;
+    }
+ 
  	/* Initialize */
  	y = py;
  	x = px;
***************
*** 273,278 ****
--- 290,300 ----
   */
  void teleport_player_level(void)
  {
+    if (pa_ptr->ts_anchor)
+    {
+      msg_print("The time/space anchor holds you firmly in place.");
+      return;
+    }
  	if (!p_ptr->depth)
  	{
  		msg_print("You sink through the floor.");
***************
*** 344,350 ****
--- 366,376 ----
  		case GF_MANA:		return (TERM_L_DARK);
  		case GF_ARROW:		return (TERM_WHITE);
  		case GF_WATER:		return (TERM_SLATE);
+  		case GF_PSI:
  		case GF_NETHER:		return (TERM_L_GREEN);
+  		case GF_PSI2:
+       case GF_PSI3:
+       case GF_DOMINATE:
  		case GF_CHAOS:		return (TERM_VIOLET);
  		case GF_DISENCHANT:	return (TERM_VIOLET);
  		case GF_NEXUS:		return (TERM_L_RED);
***************
*** 547,552 ****
--- 573,580 ----
  		{
  			return (TRUE);
  		}
+ 		case TV_PSI_BOOK:
+                   return (rand_int(3) < (o_ptr->sval % 3));
  	}
  
  	return (FALSE);
***************
*** 1443,1448 ****
--- 1471,1477 ----
  		}
  
  		/* Destroy walls (and doors) */
+ 		case GF_DISINTEGRATE:
  		case GF_KILL_WALL:
  		{
  			/* Non-walls (etc) */
***************
*** 1810,1815 ****
--- 1839,1845 ----
  			}
  
  			/* Mana -- destroys everything */
+       	case GF_DISINTEGRATE:
  			case GF_MANA:
  			{
  				do_kill = TRUE;
***************
*** 1900,1905 ****
--- 1930,1949 ----
  	return (obvious);
  }
  
+ static int min(int a,int b) {return (a<b) ? a : b;}
+ 
+ static int no_psi_attacks(monster_race *r_ptr)
+ {
+   int x=0;
+   if (r_ptr->flags4 & RF4_P_BLAST) x++;
+   if (r_ptr->flags4 & RF4_P_CRUSH) x++;
+   if (r_ptr->flags4 & RF4_M_WRACK) x++;
+   if (r_ptr->flags4 & RF4_BR_INSA) x++;
+   if (r_ptr->flags4 & RF4_P_WAVE) x++;
+   if (r_ptr->flags5 & RF5_MIND_BLAST) x++;
+   if (r_ptr->flags5 & RF5_BRAIN_SMASH) x++;
+   return x;
+ }
  
  
  /*
***************
*** 1955,1961 ****
   *
   * We attempt to return "TRUE" if the player saw anything "useful" happen.
   */
! static bool project_m(int who, int r, int y, int x, int dam, int typ)
  {
  	int tmp;
  
--- 1999,2005 ----
   *
   * We attempt to return "TRUE" if the player saw anything "useful" happen.
   */
! bool project_m(int who, int r, int y, int x, int dam, int typ)
  {
  	int tmp;
  
***************
*** 1973,1978 ****
--- 2017,2023 ----
  	/* Were the effects "irrelevant"? */
  	bool skipped = FALSE;
  
+         bool resist = FALSE;
  
  	/* Polymorph setting (true or false) */
  	int do_poly = 0;
***************
*** 2024,2029 ****
--- 2069,2080 ----
  	/* Reduce damage by distance */
  	dam = (dam + r) / (r + 1);
  
+    /* Fade damage by about 35% per monster*/
+    if (fade_dam_on)
+    {
+       dam = fade_dam;
+       fade_dam = fade_dam * 6 / (6 + randint(7));
+    }
  
  	/* Get the monster name (BEFORE polymorphing) */
  	monster_desc(m_name, m_ptr, 0);
***************
*** 2044,2049 ****
--- 2095,2449 ----
  	/* Analyze the damage type */
  	switch (typ)
  	{
+ 		/* PSIONICS */
+ 		case GF_PSI:
+       case GF_PSI_DRAIN:
+ 		{
+ 			if (seen) obvious = TRUE;
+ 			note_dies = " collapses, a mindless husk.";
+ 
+          if (r_ptr->flags3 & RF3_RES_PSI)
+            if (rand_int(3))
+            {
+              resist = TRUE;
+              r_ptr->r_flags3 |= RF3_RES_PSI;
+            }
+ 
+          if ((r_ptr->flags3 & RF3_IM_PSI) || (r_ptr->flags2 & RF2_EMPTY_MIND))
+          {
+            note = " is unaffected.";
+            dam = 0;
+            break;
+          }
+ 
+          if (randint(100) < r_ptr->level) resist = TRUE;
+ 
+          if (r_ptr->flags1 & RF1_UNIQUE) if (rand_int(3)) resist = TRUE;
+ 
+ 			if (r_ptr->flags2 & RF2_SMART)
+ 			{
+            for (tmp = no_psi_attacks(r_ptr) ; tmp ; tmp--)
+            {
+              if (!rand_int(4)) resist = TRUE;
+              if (tmp > 2) if (!rand_int(3)) dam >>= 1;
+            }
+ 			  if (!resist) dam += dam / 2;
+ 			}
+ 
+ 			if (r_ptr->flags2 & RF2_WEIRD_MIND)
+ 			  if (randint(100) < 80) resist = TRUE;
+ 			    else {dam *= 3; dam /= 4;}
+ 			  
+ 			if (r_ptr->flags3 & RF3_UNDEAD) 
+ 			 {dam *= 2; dam /= 3;}
+ 
+ 			if ((r_ptr->flags2 & RF2_STUPID) ||
+ 			   (r_ptr->flags3 & RF3_ANIMAL))
+ 			{
+ 			   note = " is too stupid to be hurt.";
+ 			   dam /= 4;
+ 			}
+ 
+          if (((m_ptr->confused > 0) && !rand_int(3)) ||
+              ((m_ptr->confused > 20) && !rand_int(3)) ||
+              ((m_ptr->confused > 50) && !rand_int(3)))
+          {
+            resist = FALSE;
+            dam = dam * (3 + randint(7)) / 4;
+          }
+ 
+ 			if (resist)
+ 			{   
+ 			   note = " resists.";
+ 			   dam /= 3;
+ 			   if (randint(100) < 10) do_conf = randint(8);
+ 			}
+ 			else
+ 			if (randint(dam>20?20:dam) > randint(r_ptr->level))
+ 			{
+ 			   do_stun = randint(6);
+ 			   do_conf = randint(20);
+ 			   do_sleep = rand_int(2) ? randint(randint(90)) : 0;
+ 			   do_fear = randint(15);
+ 			}
+ 
+ 	 if (typ == GF_PSI_DRAIN)
+ 	   life_drained += min(damroll(6,r_ptr->level) >> 1,
+ 	     dam * 3 / (3 + randint(5)));
+       break;
+ 		}
+ 
+ 		case GF_PSI2:
+ 		{
+ 			if (seen) obvious = TRUE;
+ 			note_dies = " collapses, a mindless husk.";
+ 			
+          if (r_ptr->flags3 & RF3_RES_PSI)
+            if (rand_int(2))
+            {
+              resist = TRUE;
+              r_ptr->r_flags3 |= RF3_RES_PSI;
+            }
+ 
+          if ((r_ptr->flags3 & RF3_IM_PSI) || (r_ptr->flags2 & RF2_EMPTY_MIND))
+          {
+            note = " is unaffected.";
+            dam = 0;
+            break;
+          }
+ 
+          if (randint(100 + 5 * p_ptr->lev) < randint(110 + r_ptr->level))
+              resist = TRUE;
+          if (r_ptr->flags1 & RF1_UNIQUE)
+             if (!rand_int(3)) resist = TRUE;
+ 
+ 			if (r_ptr->flags2 & RF2_SMART)
+ 			{
+            for (tmp = no_psi_attacks(r_ptr) ; tmp ; tmp--)
+            {
+              if (!rand_int(6)) resist = TRUE;
+              if (tmp > 2) if (!rand_int(5)) dam >>= 1;
+            }
+ 			  if (!resist) dam += dam / 2;
+ 			}
+ 
+ 			if (r_ptr->flags2 & RF2_WEIRD_MIND)
+ 			  {
+ 			    if (randint(100) < 60) resist = TRUE;
+ 			    if (randint(100) < 40) dam >>= 1;
+ 			  }
+ 			  
+ 			if (r_ptr->flags3 & RF3_UNDEAD)
+ 			  {dam *= 2; dam /= 3;}
+ 
+ 			if ((r_ptr->flags2 & RF2_STUPID) ||
+ 			   (r_ptr->flags3 & RF3_ANIMAL))
+ 			{
+ 			   note = " is too stupid to be hurt.";
+ 			   dam /= 3;
+ 			}
+ 
+          if (((m_ptr->confused > 0) && !rand_int(3)) ||
+              ((m_ptr->confused > 20) && !rand_int(3)) ||
+              ((m_ptr->confused > 50) && !rand_int(3)))
+          {
+            resist = FALSE;
+            dam = dam * (3 + randint(7)) / 4;
+          }
+ 
+ 			if (resist)
+ 			{   
+ 			   note = " resists.";
+ 			   dam /= 3;
+ 			   if (randint(100) < 10) do_conf = randint(10);
+ 			   if (randint(100) < 5) do_stun = randint(6);
+ 			}
+ 			else
+                         if (randint(dam / 2) > randint(r_ptr->level + (r_ptr->flags1 &
+            RF1_UNIQUE ? r_ptr->level : 0)) + randint(30))
+ 			{
+ 			do_stun = randint(randint(dam >> 1));
+ 			do_conf = damroll(dam,5) / 7;
+ 			do_fear = rand_int(2) ? randint(dam) : 0;
+ 			
+ 			if ((randint(p_ptr->lev) > ((r_ptr->flags1 & RF1_UNIQUE)
+ 			  ? r_ptr->level * 2 + 10 : r_ptr->level))
+ 			    && (m_ptr->mspeed > 60))
+ 			  m_ptr->mspeed -= 10;
+ 			}
+ 			break;
+ 		}
+ 
+ 		case GF_PSI3:
+ 		{
+ 			if (seen) obvious = TRUE;
+ 			note_dies = " collapses, a mindless husk.";
+ 			
+          if ((r_ptr->flags3 & RF3_IM_PSI) || (r_ptr->flags2 & RF2_EMPTY_MIND))
+          {
+            dam = 0;
+            note = " is unaffected.";
+            break;
+          }
+ 
+          if (r_ptr->flags3 & RF3_RES_PSI)
+            if (!rand_int(3))
+            {
+              resist = TRUE;
+              r_ptr->r_flags3 |= RF3_RES_PSI;
+            }
+ 
+          if (randint(300 + p_ptr->lev) < (r_ptr->level + (r_ptr->flags1 &
+            RF1_UNIQUE ? randint(r_ptr->level) : 0)) + randint(100))
+            resist = TRUE;
+ 
+ 			if (r_ptr->flags2 & RF2_SMART)
+ 			{
+            for (tmp = no_psi_attacks(r_ptr) ; tmp ; tmp--)
+            {
+              if (!rand_int(6)) resist = TRUE;
+              if (tmp > 2) if (!rand_int(5)) dam >>= 1;
+            }
+ 			  if (!resist) dam += dam / 2;
+ 			}
+ 
+ 			if (r_ptr->flags2 & RF2_WEIRD_MIND)
+ 			  {
+ 			    if (randint(100) < 60) resist = TRUE;
+ 			    if (randint(100) < 40) dam >>= 2;
+ 			  }
+ 			  
+ 			if (r_ptr->flags3 & RF3_UNDEAD)
+ 			  {dam *= 2; dam /= 3;}
+ 
+ 			if ((r_ptr->flags2 & RF2_STUPID) ||
+ 			   (r_ptr->flags3 & RF3_ANIMAL))
+ 			{
+ 			   note = " is too stupid to be hurt.";
+ 			   dam /= 2;
+ 			}
+ 
+          if (((m_ptr->confused > 0) && !rand_int(3)) ||
+              ((m_ptr->confused > 20) && !rand_int(3)) ||
+              ((m_ptr->confused > 50) && !rand_int(3)))
+          {
+            resist = FALSE;
+            dam = dam * (3 + randint(7)) / 4;
+          }
+ 
+ 			if (resist)
+ 			{   
+ 			   note = " resists.";
+ 			   dam /= 2;
+ 			   if (randint(100) < 30) do_conf = randint(15);
+ 			   if (randint(100) < 15) do_stun = randint(8);
+ 			}
+ 			else
+ 			if (dam + damroll(2,dam) > randint(r_ptr->level + (r_ptr->flags1 &
+ 			  RF1_UNIQUE ? r_ptr->level : 0)) + randint(30))
+ 			{
+ 			if (rand_int(3))  do_stun = randint(dam);
+ 			if (rand_int(5))  do_conf = randint(damroll(dam,13));
+ 			if (rand_int(2)) do_fear = randint(dam * 3);
+ 			
+ 			if ((randint(dam * 5) > ((r_ptr->flags1 & RF1_UNIQUE)
+ 			  ? r_ptr->level * 2 + 10 : r_ptr->level) + randint(40))
+ 			    && (m_ptr->mspeed > 60))
+ 			  m_ptr->mspeed -= 10; /* message ? */
+ 			}
+ 			break;
+ 		}
+ 
+ 		/* Analyze Monster */
+       case GF_ANALYZE:
+       {
+          if (seen) obvious = TRUE;
+          if (randint(dam) > randint(r_ptr->level))
+            {
+              note = " has been successfully analyzed.";
+              r_ptr->r_xtra1 = 1;
+            }
+          else
+            note = " resists your psionic probe.";
+          dam = 0;
+          break;
+       }
+ 
+       /* Amnesia */
+       case GF_AMNESIA:
+       {
+          if (seen) obvious = TRUE;
+          if ((r_ptr->flags3 & RF3_IM_PSI) || (r_ptr->flags2 & RF2_EMPTY_MIND))
+          {
+            note = " is unaffected.";
+            dam = 0;
+            break;
+          }
+ 
+          if (r_ptr->flags3 & RF3_RES_PSI)
+            if (rand_int(2))
+            {
+              resist = TRUE;
+              r_ptr->r_flags3 |= RF3_RES_PSI;
+            }
+ 
+          if (randint(dam) > randint(r_ptr->level + (r_ptr->flags1 &
+            RF1_UNIQUE ? r_ptr->level + 10 : 0)))
+          {
+             tmp = (m_ptr->smart & SM_AMNESIA1 ? 1 : 0) +
+                   (m_ptr->smart & SM_AMNESIA2 ? 2 : 0);
+             switch (tmp)
+             {
+               case 0:
+                 note = " loses its short-term memory.";
+                 break;
+               case 1:
+                 note = " begins drooling and staring off into space.";
+                 break;
+               case 2:
+                 note = " starts forgetting basic motor skills.";
+                 m_ptr->mspeed -= randint(9);
+                 break;
+               case 3:
+                 note = " can't forget any more!";
+                 tmp--;
+                 break;
+             }
+             /* forget everything learned and other influences */
+             m_ptr->smart = ++tmp * SM_AMNESIA1;
+             do_sleep = 100;
+             m_ptr->confused += randint(dam / 3);
+             m_ptr->stunned += randint(dam / 5);
+             m_ptr->monfear = 0;
+          }
+          else
+            note = " holds onto its memories!";
+         dam = 0;
+         break;
+       }
+ 
+       case GF_PAIN:
+       {
+ 	 if (seen) obvious = TRUE;
+ 	 if (randint(dam) > r_ptr->level + ((r_ptr->flags1 & RF1_UNIQUE) ?
+ 	   r_ptr->level / 4 : 0))
+ 	 {
+ 	   note = " lets out an deafening roar of agony!";
+ 	   dam = m_ptr->hp / 2;
+ 	   if (dam > 1000) dam = 1000;
+ 	 }
+ 	 else
+ 	 {
+ 	   note = " is unaffected!";
+ 	   dam = 0;
+ 	 }
+ 	 break;
+       }
+ 
+       /* Domination */
+       case GF_DOMINATE:
+       {
+         if (seen) obvious = TRUE;
+          if ((r_ptr->flags3 & RF3_IM_PSI) || (r_ptr->flags2 & RF2_EMPTY_MIND))
+          {
+            note = " is unaffected.";
+            dam = 0;
+            break;
+          }
+ 
+         if (!(r_ptr->flags3 & RF3_RES_PSI) &&
+           (randint(dam) > r_ptr->level + (r_ptr->flags1 & RF1_UNIQUE ?
+            r_ptr->level : 0)))
+         {
+           m_ptr->smart |= SM_DOMINATE;
+           note = " awaits your mental commands.";
+         }
+         else
+           note = " resists.";
+         dam = 0;
+         break;
+       }
+ 
  		/* Magic Missile -- pure damage */
  		case GF_MISSILE:
  		{
***************
*** 2278,2283 ****
--- 2678,2691 ----
  			{
  				note = " resists.";
  				dam *= 3; dam /= (randint(6)+6);
+             do_stun = 0;
+  			}
+            if (((r_ptr->flags1 & RF1_UNIQUE)?10:0) + rand_int(r_ptr->level)
+              > rand_int(50))
+            {
+               note = " resists.";
+               dam >>= 1;
+               do_stun = 0;
              }
  			break;
  		}
***************
*** 2321,2326 ****
--- 2729,2749 ----
  		}
  
  		/* Pure damage */
+ 		case GF_DISINTEGRATE:
+ 			if (r_ptr->flags3 & (RF3_HURT_ROCK))
+ 			{
+ 			   if (seen) r_ptr->r_flags3 |= (RF3_HURT_ROCK);
+ 			   note = " loses some skin!";
+ 			   note_dies = " dissolves!";
+ 			   dam *= 2;
+ 			}
+ 
+          if (r_ptr->flags3 & RF1_UNIQUE)
+            if (rand_int(r_ptr->level + 10) > rand_int(p_ptr->lev))
+                           {
+                             note = " resists.";
+                             dam >>= 3;
+                           }
  		case GF_MANA:
  		{
  			if (seen) obvious = TRUE;
***************
*** 2370,2376 ****
  				obvious = FALSE;
  				dam = 0;
  			}
! 
  			break;
  		}
  
--- 2793,2806 ----
  				obvious = FALSE;
  				dam = 0;
  			}
!          else
!            if (((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->level >
!                         20 + randint(180))) && (rand_int(2)))
!                         {
!                           note = " resists.";
!                           dam >>= 1;
!                         } else
!                                 life_drained += dam;
  			break;
  		}
  
***************
*** 3003,3009 ****
  	}
  
  	/* Confusion and Chaos breathers (and sleepers) never confuse */
! 	else if (do_conf &&
  	         !(r_ptr->flags3 & (RF3_NO_CONF)) &&
  	         !(r_ptr->flags4 & (RF4_BR_CONF)) &&
  	         !(r_ptr->flags4 & (RF4_BR_CHAO)))
--- 3433,3439 ----
  	}
  
  	/* Confusion and Chaos breathers (and sleepers) never confuse */
! 	if (do_conf &&
  	         !(r_ptr->flags3 & (RF3_NO_CONF)) &&
  	         !(r_ptr->flags4 & (RF4_BR_CONF)) &&
  	         !(r_ptr->flags4 & (RF4_BR_CHAO)))
***************
*** 3025,3030 ****
--- 3455,3464 ----
  			tmp = do_conf;
  		}
  
+                 /* Dazed and confused */
+                 if (do_stun)
+                   note = " looks dazed and confused.";
+ 
  		/* Apply confusion */
  		m_ptr->confused = (tmp < 200) ? tmp : 200;
  	}
***************
*** 3145,3151 ****
  
  
  
! 
  
  
  /*
--- 3579,3586 ----
  
  
  
! #define resist1 {dam = dam * 6 / (6 + randint(6)); resist = TRUE;}
! #define resist2 {dam = dam * 4 / (4 + randint(6)); resist = TRUE;}
  
  
  /*
***************
*** 3167,3173 ****
   */
  static bool project_p(int who, int r, int y, int x, int dam, int typ)
  {
! 	int k = 0;
  
  	/* Hack -- assume obvious */
  	bool obvious = TRUE;
--- 3602,3610 ----
   */
  static bool project_p(int who, int r, int y, int x, int dam, int typ)
  {
! 	int k = 0,mana_lost = 0;
!    u32b t1,t2,t3,f1=0,f2=0,f3=0;
!    object_type *o_ptr;
  
  	/* Hack -- assume obvious */
  	bool obvious = TRUE;
***************
*** 3176,3185 ****
  	bool blind = (p_ptr->blind ? TRUE : FALSE);
  
  	/* Player needs a "description" (he is blind) */
! 	bool fuzzy = FALSE;
  
  	/* Source monster */
! 	monster_type *m_ptr;
  
  	/* Monster name (for attacks) */
  	char m_name[80];
--- 3613,3622 ----
  	bool blind = (p_ptr->blind ? TRUE : FALSE);
  
  	/* Player needs a "description" (he is blind) */
! 	bool fuzzy = FALSE,resist = FALSE;
  
  	/* Source monster */
! 	monster_type *m_ptr = NULL;
  
  	/* Monster name (for attacks) */
  	char m_name[80];
***************
*** 3208,3213 ****
--- 3645,3653 ----
  	/* If the player is blind, be more descriptive */
  	if (blind) fuzzy = TRUE;
  
+    if (who == -2) sprintf(killer,"%s",_killer);
+    else
+    {
  
  	/* Get the source monster */
  	m_ptr = &m_list[who];
***************
*** 3217,3227 ****
--- 3657,3846 ----
  
  	/* Get the monster's real name */
  	monster_desc(killer, m_ptr, 0x88);
+     }
+   
+        for (k = INVEN_WIELD ; k < INVEN_TOTAL ; k++)
+        {
+           o_ptr = &inventory[k];
+           if (!o_ptr->k_idx) continue;
+           object_flags(o_ptr,&t1,&t2,&t3);
+           f1 |= t1;
+           f2 |= t2;
+           f3 |= t3;
+        }
  
  
  	/* Analyze the damage */
  	switch (typ)
  	{
+        /* Psionics */
+        case GF_PSI:
+        if (fuzzy) msg_print("Your mind is hit by mental energy!");
+ 
+        if (f1 & TR1_INT) dam = dam * (12 + randint(6)) / 12;
+        if (f1 & TR1_WIS) dam = dam * (12 + randint(6)) / 12;
+        if (p_ptr->telepathy) dam = dam * (6 + randint(6)) / 6;
+ 
+        if (psi_flags & RES_PSI) resist1
+        if (pa_ptr->mental_barrier) resist1
+        if (rand_int(100) < p_ptr->skill_sav) resist1
+        if (p_ptr->sustain_int) if (rand_int(2)) resist1
+        if (p_ptr->sustain_wis) if (rand_int(2)) resist1
+        if (p_ptr->resist_confu) if (rand_int(3)) resist1
+ 
+        if (!rand_int(p_ptr->confused ? 3 : 12))
+        {
+          msg_print("Your mind is caught completely unguarded!");
+          resist = FALSE;
+          dam = dam * randint(randint(24)) / 3;
+        }
+        if (!resist) set_confused(p_ptr->confused + rand_int(20) + 10);
+        take_hit(dam,killer);
+        break;
+ 
+        case GF_PSI2:
+        case GF_PSI3:
+ 
+        if (fuzzy) msg_print("Your brain is struck with psychic energy!");
+ 
+        if (rand_int(rand_int(100 + (m_ptr ? r_info[m_ptr->r_idx].level : 50)))
+           < rand_int(p_ptr->skill_sav)) resist2
+        if (p_ptr->sustain_int) if (!rand_int(9)) resist2
+        if (p_ptr->sustain_wis) if (!rand_int(9)) resist2
+        if (psi_flags & RES_PSI)
+         if (rand_int(100) < p_ptr->skill_sav) resist2
+        if (pa_ptr->mental_barrier)
+         if (rand_int(r_info[m_ptr->r_idx].level) < rand_int(p_ptr->lev))
+           resist2
+        if (p_ptr->resist_confu) if (!rand_int(4)) resist2
+ 
+        if (p_ptr->shero)
+         if (rand_int(100) >= p_ptr->skill_sav)
+          {resist = FALSE; dam = dam * (6 + randint(6)) / 6;}
+ 
+        if ((rand_int(rand_int(rand_int(m_ptr?r_info[m_ptr->r_idx].level:50)))
+              > rand_int(p_ptr->lev)) || p_ptr->confused)
+        {
+           msg_print("Your mind is caught completely unguarded!");
+           if (rand_int(3)) resist = FALSE;
+           dam = dam * randint(randint(20)) / 3;
+        }
+ 
+        if (resist)
+        {
+          if (p_ptr->telepathy) dam = dam * (3 + randint(6)) / 9;
+          if (f1 & TR1_INT) dam = dam * (8 + randint(6)) / 8;
+          if (f1 & TR1_WIS) dam = dam * 8 / (8 + randint(6));
+        }
+        else
+        {
+          if (p_ptr->telepathy) dam = dam * (6 + randint(6)) / 6;
+          if (f1 & TR1_INT) dam = dam * (6 + randint(7)) / 8;
+          if (f1 & TR1_WIS) dam = dam * 8 / (6 + randint(7));
+        }
+ 
+        if ((typ == GF_PSI2) && !resist)
+        {
+          if ((!p_ptr->resist_confu) || rand_int(2))
+            set_confused(p_ptr->confused + rand_int(rand_int(100)));
+          if (rand_int(3)) set_slow(p_ptr->slow + 4 + rand_int(4));
+          if (!rand_int(3)) set_paralyzed(p_ptr->paralyzed + 1 + rand_int(4));
+          if (rand_int(3)) set_stun(p_ptr->stun + damroll(randint(6),20));
+          if (rand_int(2)) if (!p_ptr->resist_fear || rand_int(2))
+            set_afraid(p_ptr->afraid + rand_int(4) + 4);
+          if (!rand_int(8))
+          {
+            mana_lost = p_ptr->csp * (100 - randint(randint(100))) / 100;
+          }
+          if (!rand_int(8)) dec_stat(A_INT,randint(100),!rand_int(5));
+          if (!rand_int(8)) dec_stat(A_WIS,randint(100),!rand_int(5));
+          if (!rand_int(25))
+          {
+            msg_print("Your memories fade away.");
+            lose_all_info();
+          }
+        }
+ 
+        if (typ == GF_PSI3)
+        {
+          k = dam;
+          if (resist) k -= p_ptr->lev;
+ 
+          while (k > 0)
+          {
+            k--;
+            switch (rand_int(24))
+            {
+              case 0:
+              case 1:
+              case 2:
+              case 3:
+              case 4:
+              case 5:
+              case 6:
+              case 7:
+                      if ((!p_ptr->resist_confu) || rand_int(2))
+                         set_confused(p_ptr->confused + rand_int(10));
+                      if (rand_int(10)) break;
+              case 8:
+              case 9:
+              case 10:
+              case 11:
+                      set_slow(p_ptr->slow + randint(2));
+                      if (rand_int(10)) break;
+              case 12:
+              case 13:
+              case 14:
+              case 15:
+                      set_paralyzed(p_ptr->paralyzed + rand_int(rand_int(5)));
+                      if (rand_int(10)) break;
+              case 16:
+              case 17:
+                      set_stun(p_ptr->stun + randint(20));
+                      if (rand_int(10)) break;
+              case 18:
+              case 19:
+                      if ((!p_ptr->resist_fear) || rand_int(2))
+                        set_afraid(p_ptr->afraid + 1);
+                      if (rand_int(6)) break;
+             case 20:
+                     mana_lost += randint(randint(randint(p_ptr->csp * 100))) / 100;
+                     if (rand_int(3)) break;
+             case 21:
+                     dec_stat(A_INT,randint(rand_int(100)),!rand_int(5));
+                     if (rand_int(2)) break;
+             case 22:
+                     dec_stat(A_WIS,randint(rand_int(100)),!rand_int(5));
+                     if (rand_int(3)) break;
+                     break;
+             case 23:
+                     lose_some_info();
+                     break;
+             }
+          }
+        }
+ 
+        if (mana_lost)
+        {
+            p_ptr->csp -= mana_lost;
+            if (p_ptr->csp < 0) p_ptr->csp = 0;
+            p_ptr->redraw |= PR_MANA;
+            p_ptr->window |= PW_PLAYER;
+            msg_print("Your mana drains away.");
+        }
+        take_hit(dam,killer);
+        break;
+ 
+        case GF_AMNESIA:
+           if (randint(100) >= p_ptr->skill_sav)
+             if (lose_all_info())
+               msg_print("Your memories fade away.");
+             else ;
+           else
+             if (randint(100) >= randint(p_ptr->skill_sav))
+               lose_some_info();
+           break;
+ 
  		/* Standard damage -- hurts inventory too */
  		case GF_ACID:
  		{
***************
*** 3272,3277 ****
--- 3891,3899 ----
  		case GF_MISSILE:
  		{
  			if (fuzzy) msg_print("You are hit by something!");
+ 	      if (pa_ptr->shadow_form) dam /= 3;
+          if (pa_ptr->biofeedback) dam /= 2;
+ 	      if (pa_ptr->inertial_barrier) dam /= 2;
  			take_hit(dam, killer);
  			break;
  		}
***************
*** 3289,3294 ****
--- 3911,3919 ----
  		case GF_ARROW:
  		{
  			if (fuzzy) msg_print("You are hit by something sharp!");
+ 	      if (pa_ptr->shadow_form) dam /= 3;
+          if (pa_ptr->biofeedback) dam /= 2;
+ 	      if (pa_ptr->inertial_barrier) dam /= 2;
  			take_hit(dam, killer);
  			break;
  		}
***************
*** 3392,3397 ****
--- 4017,4024 ----
  		case GF_SHARD:
  		{
  			if (fuzzy) msg_print("You are hit by something sharp!");
+ 	      if (pa_ptr->shadow_form) dam /= 3;
+          if (pa_ptr->biofeedback) dam /= 2;
  			if (p_ptr->resist_shard)
  			{
  				dam *= 6; dam /= (randint(6) + 6);
***************
*** 3407,3413 ****
  		/* Sound -- mostly stunning */
  		case GF_SOUND:
  		{
! 			if (fuzzy) msg_print("You are hit by something!");
  			if (p_ptr->resist_sound)
  			{
  				dam *= 5; dam /= (randint(6) + 6);
--- 4034,4042 ----
  		/* Sound -- mostly stunning */
  		case GF_SOUND:
  		{
! 			if (fuzzy) msg_print("You are hit by something loud!");
!          if (pa_ptr->biofeedback) dam /= 2;
! 	      if (pa_ptr->inertial_barrier) dam /= 3;
  			if (p_ptr->resist_sound)
  			{
  				dam *= 5; dam /= (randint(6) + 6);
***************
*** 3473,3478 ****
--- 4102,4108 ----
  		case GF_FORCE:
  		{
  			if (fuzzy) msg_print("You are hit by something!");
+ 	      if (psi_flags & RES_FORCE) dam /= 2; else
  			if (!p_ptr->resist_sound)
  			{
  				(void)set_stun(p_ptr->stun + randint(20));
***************
*** 3485,3490 ****
--- 4115,4122 ----
  		case GF_INERTIA:
  		{
  			if (fuzzy) msg_print("You are hit by something strange!");
+ 	      if (pa_ptr->inertial_barrier) dam *= 6;
+                         if (psi_flags & RES_INERT) dam /= 2; else
  			(void)set_slow(p_ptr->slow + rand_int(4) + 4);
  			take_hit(dam, killer);
  			break;
***************
*** 3502,3508 ****
  			{
  				(void)set_blind(p_ptr->blind + randint(5) + 2);
  			}
! 			take_hit(dam, killer);
  			break;
  		}
  
--- 4134,4147 ----
  			{
  				(void)set_blind(p_ptr->blind + randint(5) + 2);
  			}
! 	 if (pa_ptr->shadow_form)
! 	 {
! 	   pa_ptr->shadow_form = 0;
! 	   msg_print("The light forces you out of shadow form.");
! 	   dam *= 2;
! 	 }
! 			if (pa_ptr->shadow_form) hp_player(dam);
! 			else take_hit(dam, killer);
  			break;
  		}
  
***************
*** 3527,3532 ****
--- 4166,4177 ----
  		{
  			if (fuzzy) msg_print("You are hit by something strange!");
  
+          if (pa_ptr->ts_anchor)
+          {
+            take_hit(dam * 6 / (5 + randint(5)),killer);
+            break;
+          }
+ 
  			switch (randint(10))
  			{
  				case 1: case 2: case 3: case 4: case 5:
***************
*** 3578,3583 ****
--- 4223,4232 ----
  		{
  			if (fuzzy) msg_print("You are hit by something strange!");
  			msg_print("Gravity warps around you.");
+               if (psi_flags & RES_GRAVT)
+ 	        dam /= 2;
+          else
+          {
  			teleport_player(5);
  			(void)set_slow(p_ptr->slow + rand_int(4) + 4);
  			if (!p_ptr->resist_sound)
***************
*** 3585,3590 ****
--- 4234,4240 ----
  				int k = (randint((dam > 90) ? 35 : (dam / 3 + 5)));
  				(void)set_stun(p_ptr->stun + k);
  			}
+          }
  			take_hit(dam, killer);
  			break;
  		}
***************
*** 3601,3606 ****
--- 4251,4257 ----
  		case GF_METEOR:
  		{
  			if (fuzzy) msg_print("You are hit by something!");
+ 	      if (pa_ptr->inertial_barrier) dam = dam * 3 / 4;
  			take_hit(dam, killer);
  			break;
  		}
***************
*** 3610,3615 ****
--- 4261,4267 ----
  		{
  			if (fuzzy) msg_print("You are hit by something sharp!");
  			cold_dam(dam, killer);
+ 	      if (pa_ptr->inertial_barrier) dam /= 2;
  			if (!p_ptr->resist_shard)
  			{
  				(void)set_cut(p_ptr->cut + damroll(5, 8));
***************
*** 3826,3831 ****
--- 4478,4485 ----
  	/* Encoded "radius" info (see above) */
  	byte gm[16];
  
+    /* Initializing fade_dam counter */
+ 	if (fade_dam_on) fade_dam = dam;
  
  	/* Hack -- Jump to target */
  	if (flg & (PROJECT_JUMP))
***************
*** 4009,4016 ****
  					/* Enforce a "circular" explosion */
  					if (distance(y2, x2, y, x) != dist) continue;
  
! 					/* Ball explosions are stopped by walls */
  					if (!los(y2, x2, y, x)) continue;
  
  					/* Save this grid */
  					gy[grids] = y;
--- 4663,4674 ----
  					/* Enforce a "circular" explosion */
  					if (distance(y2, x2, y, x) != dist) continue;
  
! 					/* Ball explosions are stopped by walls  - not disintegrate*/
!                if (typ != GF_DISINTEGRATE)
  					if (!los(y2, x2, y, x)) continue;
+ 
+                if (typ == GF_DISINTEGRATE)
+                  if (cave_feat[y][x] >= FEAT_PERM_EXTRA) break;
  
  					/* Save this grid */
  					gy[grids] = y;
diff -c -w -r \games\angb283/src/spells2.c ./src/spells2.c
*** \games\angb283/src/spells2.c	Fri Feb  6 09:10:30 1998
--- ./src/spells2.c	Wed Feb 25 17:57:58 1998
***************
*** 839,844 ****
--- 839,901 ----
  
  
  
+ bool lose_some_info()
+ {
+   object_type *o_ptr;
+ 
+   do
+     o_ptr = &inventory[rand_int(INVEN_TOTAL)];
+   while (!o_ptr->k_idx);
+ 
+ 		/* Allow "protection" by the MENTAL flag */
+ 		if (o_ptr->ident & (IDENT_MENTAL)) return FALSE;
+ 
+ 		/* Remove "default inscriptions" */
+ 		if (o_ptr->note && (o_ptr->ident & (IDENT_SENSE)))
+ 		{
+ 			/* Access the inscription */
+ 			cptr q = quark_str(o_ptr->note);
+ 
+ 			/* Hack -- Remove auto-inscriptions */
+ 			if ((streq(q, "cursed")) ||
+ 			    (streq(q, "broken")) ||
+ 			    (streq(q, "good")) ||
+ 			    (streq(q, "average")) ||
+ 			    (streq(q, "excellent")) ||
+ 			    (streq(q, "worthless")) ||
+ 			    (streq(q, "special")) ||
+ 			    (streq(q, "terrible")))
+ 			{
+ 				/* Forget the inscription */
+ 				o_ptr->note = 0;
+ 			}
+ 		}
+ 
+ 		/* Hack -- Clear the "empty" flag */
+ 		o_ptr->ident &= ~(IDENT_EMPTY);
+ 
+ 		/* Hack -- Clear the "known" flag */
+ 		o_ptr->ident &= ~(IDENT_KNOWN);
+ 
+ 		/* Hack -- Clear the "felt" flag */
+ 		o_ptr->ident &= ~(IDENT_SENSE);
+ 
+ 
+ 	/* Recalculate bonuses */
+ 	p_ptr->update |= (PU_BONUS);
+ 
+ 	/* Combine / Reorder the pack (later) */
+ 	p_ptr->notice |= (PN_COMBINE | PN_REORDER);
+ 
+ 	/* Window stuff */
+ 	p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
+ 
+ 	/* Mega-Hack -- Forget the map */
+ 	if (!rand_int(10)) wiz_dark();
+ 
+ 	/* It worked */
+ 	return (TRUE);
+ }
  
  
  
***************
*** 2281,2287 ****
--- 2338,2377 ----
  	else if (sleep) msg_print("You hear a sudden stirring in the distance!");
  }
  
+ /*
+  * Hack -- call pets to player.
+  */
+ 
+ /*
+ void call_pets_toggle(void)
+ {
+   p_ptr->energy_use = 100;
+ 
+   if (p_ptr->pets_notice) {
+     p_ptr->pets_notice = FALSE;
+     msg_print("You stop attracting your servant's attention.");
+   } else {
+     p_ptr->pets_notice = TRUE;
+     msg_print("You mentally summon your controlled monsters.");
+   }
+ 
+   p_ptr->redraw |= (PR_SHOUT);
+ }
+ */
+ /*
+ void summon_pet_monster(void) {
+   p_ptr->energy_use = 100;
  
+   if (p_ptr->number_pets <= adj_chr_pet_summon[p_ptr->stat_ind[A_CHR]] &&
+       summon_specific_friendly(p_ptr->py, p_ptr->px, 
+ 			       p_ptr->depth+randint(5), 0)) {
+     msg_print("You summon some help.");
+     p_ptr->number_pets++;
+   } else {
+     msg_print("You called, but no help came.");
+   }
+ }
+ */
  
  /*
   * Delete all non-unique monsters of a given "type" from the level
diff -c -w -r \games\angb283/src/store.c ./src/store.c
*** \games\angb283/src/store.c	Mon Feb  9 12:06:34 1998
--- ./src/store.c	Mon Feb 23 18:27:14 1998
***************
*** 503,508 ****
--- 503,509 ----
  		}
  
  		case TV_MAGIC_BOOK:
+       case TV_PSI_BOOK:
  		case TV_PRAYER_BOOK:
  		{
  			if (cost <= 50L) size += mass_roll(2, 3);
***************
*** 836,841 ****
--- 837,843 ----
  			switch (o_ptr->tval)
  			{
  				case TV_MAGIC_BOOK:
+             case TV_PSI_BOOK:
  				case TV_AMULET:
  				case TV_RING:
  				case TV_STAFF:
***************
*** 1191,1197 ****
  		if (store_num == 6)
  		{
  			/* Pick a level for object/magic */
! 			level = 25 + rand_int(25);
  
  			/* Random object kind (usually of given level) */
  			k_idx = get_obj_num(level);
--- 1193,1201 ----
  		if (store_num == 6)
  		{
  			/* Pick a level for object/magic */
! 			level = p_ptr->max_depth + rand_int(rand_int(50));
! 			if (level > 127) level = 127;
!          if (rand_int(2)) if (level < 10) level = 10 + rand_int(10);
  
  			/* Random object kind (usually of given level) */
  			k_idx = get_obj_num(level);
diff -c -w -r \games\angb283/src/tables.c ./src/tables.c
*** \games\angb283/src/tables.c	Mon Feb  9 11:54:40 1998
--- ./src/tables.c	Mon Feb 23 18:37:10 1998
***************
*** 138,144 ****
  	16	/* 18/190-18/199 */,
  	16	/* 18/200-18/209 */,
  	16	/* 18/210-18/219 */,
! 	16	/* 18/220+ */
  };
  
  
--- 138,144 ----
  	16	/* 18/190-18/199 */,
  	16	/* 18/200-18/209 */,
  	16	/* 18/210-18/219 */,
! 	18	/* 18/220+ */
  };
  
  
***************
*** 276,282 ****
  	81	/* 18/190-18/199 */,
  	80	/* 18/200-18/209 */,
  	80	/* 18/210-18/219 */,
! 	80	/* 18/220+ */
  };
  
  
--- 276,282 ----
  	81	/* 18/190-18/199 */,
  	80	/* 18/200-18/209 */,
  	80	/* 18/210-18/219 */,
! 	75	/* 18/220+ */
  };
  
  
***************
*** 1528,1534 ****
--- 1528,1543 ----
  		20, 24, 25, 1,  12, 2, 68, 40,
  		7,  10, 11, 0,  0,  0,  35, 30,
  		6, 35
+ 	},
+ 
+    {
+ 		"Psionicist",
+ 		{-5, 3, 1, 1, -2, 1},
+ 		30, 36, 20, 2,  16, 20, 34, 20,
+       7,  13, 12,  0,  0,  0,  11, 11,
+       -1, 50
  	}
+ 
  };
  
  
***************
*** 2083,2088 ****
--- 2092,2195 ----
  			{ 99,  0,  0,   0},
  			{ 99,  0,  0,   0}
  		}
+ 	},
+    	{        
+ 	   /*** Psionicist ***/
+ 
+ 		TV_PSI_BOOK,
+ 		0,
+ 
+ 		A_INT,
+ 		2,
+ 
+ 		1,
+ 		4000,
+ 
+ 		{
+ 			/* Telepathy */
+ 
+ 	      {  2,  1, 12,   3}, /* MThrust */
+ 			{  5,  1, 40,   4}, /* MBarrier */
+ 			{  7,  7, 40,   3}, /* PCrush */
+ 			{  7,  2, 15,   4}, /* Intimidate */
+ 			{  8,  2, 15,   4}, /* Sleep */
+ 			{ 12, 14, 66,   7}, /* PBlast */
+ 			{ 12,  4, 30,   20}, /* MWrack */
+ 			{ 18, 21, 70,   32}, /* Dominate */
+ 	      { 22, 30, 50,   45}, /* Amnesia */
+ 
+ 			/* Psychoportation */
+ 
+ 			{  3,  3, 20,   2}, /* Blink */
+ 			{  8,  7, 40,   4}, /* Teleport */
+ 			{ 10,  5, 44,   6}, /* DDoor */
+ 			{ 15, 30, 70,  20}, /* PTravel */
+ 			{ 20, 15, 42,  14}, /* TOther */
+ 			{ 25, 15, 70,  24}, /* Recall */
+ 			{ 35, 30, 50,  30}, /* TSAnchor */
+ 			{ 40, 20, 54,  55}, /* TShift */
+ 
+ 			/* Psychometabolism */
+ 
+ 			{  2,  2, 30,   2}, /* CAdj */
+ 			{  7,  7, 60,   4}, /* SHunger */
+ 			{ 12,  8, 40,   5}, /* AControl */
+ 			{ 14, 15, 33,   8}, /* Biofeedback */
+ 			{ 16, 20, 43,  13}, /* Shadowform */
+ 			{ 20, 18, 35,  14}, /* DLife */
+ 			{ 20, 22, 60,  27}, /* DPain */
+ 			{ 25, 15, 30,  10}, /* EContain */
+ 			{ 30, 30, 40,  15}, /* DField */
+ 			{ 32, 50, 31,  27}, /* CHealing */
+ 
+ 			/* Psychokinesis */
+ 
+ 		   {  4,  3, 40,   4}, /* Light */
+ 			{  8,  3, 30,   4}, /* IBarrier */
+ 			{  9,  8, 20,   4}, /* PForce */
+ 			{ 10, 17, 30,   7}, /* Sound */
+ 			{ 15, 28, 40,   8}, /* Disin */
+ 			{ 19, 40, 43,   9}, /* SoCold */
+ 			{ 24, 50, 55,  12}, /* FireE*/
+ 			{ 28, 60, 60,  15}, /* Detonate */
+ 			{ 31,100, 70,  20}, /* Balefire */
+ 
+ 			/* Metapsionics */
+ 
+ 			{  5,  3, 20,   4}, /* Cannibal */
+ 			{ 17,  1, 25,   7}, /* Splice */
+ 			{ 19,  1, 30,   4}, /* Recep */
+ 			{ 22, 30, 20,   7}, /* Empower */
+ 			{ 24, 10, 30,   9}, /* PDrain */
+ 			{ 28, 50, 40,  11}, /* PSurgery */
+ 			{ 30, 25, 60,  15}, /* TControl */
+ 			{ 40,100, 60,  15}, /* UBlast */
+ 			{ 49,255, 60, 255}, /* *U* Blast */
+ 
+ 	 /* Clairsentience */
+ 			{ 1,   1,  5,   3}, /* DMonst */
+ 			{ 4,   1, 30,   6}, /* Aware */
+ 			{ 5,   3, 40,   5}, /* RSecrets */
+ 			{ 9,   6, 54,   5}, /* Clairv */
+ 			{ 14, 15, 70,   8}, /* Id */
+ 			{ 20, 50, 40,  50}, /* Precog */
+ 			{ 30, 24, 40,  24}, /* AMonster */
+ 			{ 33, 75, 90,  50}, /* *Id* */
+ 
+ 			{ 99,  0,  0,   0},
+ 			{ 99,  0,  0,   0},
+ 			{ 99,  0,  0,   0},
+ 			{ 99,  0,  0,   0},
+ 
+ 			{ 99,  0,  0,   0},
+ 			{ 99,  0,  0,   0},
+ 			{ 99,  0,  0,   0},
+ 			{ 99,  0,  0,   0},
+ 
+ 			{ 99,  0,  0,   0},
+ 			{ 99,  0,  0,   0},
+ 			{ 99,  0,  0,   0}
+ 		}
  	}
  };
  
***************
*** 2090,2096 ****
  /*
   * Spells in each book (mage spells then priest spells)
   */
! u32b spell_flags[2][9][2] =
  {
  	{
  		/*** Mage spell books ***/
--- 2197,2203 ----
  /*
   * Spells in each book (mage spells then priest spells)
   */
! u32b spell_flags[3][9][2] =
  {
  	{
  		/*** Mage spell books ***/
***************
*** 2116,2121 ****
--- 2223,2241 ----
  		{ 0x00000000, 0x000001f0 },
  		{ 0x00000000, 0x000fc000 },
  		{ 0x00000000, 0x00003e00 }
+ 	},
+   	{
+       /*** Psionic Foci ***/
+ 		{ 0x000001ff, 0x00000000 },  /* Telepathy */
+ 		{ 0x0001fe00, 0x00000000 },  /* Psychoportation */
+ 		{ 0x07fe0000, 0x00000000 },  /* Psychometabolism */
+ 		{ 0xf8000000, 0x0000000f },  /* Psychokinesis */
+ 		{ 0x00000000, 0x00001ff0 },  /* Metapsionics */
+ 		{ 0x00000000, 0x001fe000 },  /* Clairsentience */
+ 
+ 		{ 0x00000000, 0x00000000 },
+ 		{ 0x00000000, 0x00000000 },
+ 		{ 0x00000000, 0x00000000 }
  	}
  };
  
***************
*** 2123,2129 ****
  /*
   * Names of the spells (mage spells then priest spells)
   */
! cptr spell_names[2][64] =
  {
  	/*** Mage Spells ***/
  
--- 2243,2249 ----
  /*
   * Names of the spells (mage spells then priest spells)
   */
! cptr spell_names[3][64] =
  {
  	/*** Mage Spells ***/
  
***************
*** 2297,2302 ****
--- 2417,2510 ----
  		"(blank)",
  		"(blank)",
  		"(blank)"
+  	},
+ 
+     {
+   /*** PSIONIC POWERS ***/
+   /* Telepathy */
+ 
+     "Mind Thrust",
+     "Mental Barrier",
+     "Psychic Crush (2)",
+     "Intimidate",
+     "Sleep",
+     "Psionic Blast",
+     "Mind Wrack (2)",
+     "Domination (3)",
+     "Amnesia (3)",
+ 
+   /* Psychoportation */
+ 
+     "Blink",
+     "Teleport",
+     "Dimension Door",
+     "Probability Travel (2)",
+     "Banishment (2)",
+     "Recall (3)",
+     "Time/Space Anchor",
+     "Time Shift (3)",
+ 
+   /* Psychometabolism */
+ 
+     "Cell Adjustment",
+     "Satisfy Hunger",
+     "Adrenaline Control",
+     "Biofeedback",
+     "Shadowform (3)",
+     "Drain Life (2)",
+     "Double Pain (3)",
+     "Energy Containment",
+     "Death Field (2)",
+     "Complete Healing (2)",
+ 
+   /* Psychokinesis */
+ 
+     "Light Control",
+     "Inertial Barrier",
+     "Project Force",
+     "Sonic Boom",
+     "Disintegrate (2)",
+     "Sphere of Cold (2)",
+     "Fire Eruption (2)",
+     "Detonate",
+     "Balefire (3)",
+ 
+   /* Metapsionics */
+ 
+     "Cannibalize",
+     "Splice (2)",
+     "Receptacle",
+     "Empower",
+     "Psychic Drain (3)",
+     "Psychic Surgery",
+     "Time Control (2)",
+     "Ultrablast (2)",
+     "*Ultrablast* (3)",
+ 
+   /* Clairsentience */
+ 
+     "Detect Monsters",
+     "Awareness",
+     "Reveal Secrets",
+     "Clairvoyance",
+     "Read Object (2)",
+     "Read Aura (3)",
+     "Precognition (3)",
+     "Analyze Monster (3)",
+ 
+     "(blank)",
+     "(blank)",
+     "(blank)",
+     "(blank)",
+     "(blank)",
+ 
+     "(blank)",
+     "(blank)",
+     "(blank)",
+     "(blank)",
+     "(blank)",
+ 
+     "(blank)"
    }
  };
  
***************
*** 2474,2480 ****
--- 2682,2703 ----
  		"Low Paladin",
  		"High Paladin",
  		"Paladin Lord",
+ 	},
+ 
+    /* Psionicists */
+ 	{
+ 		"Psionicist",
+ 		"Psionicist",
+ 		"Psionicist",
+ 		"Psionicist",
+ 		"Psionicist",
+ 		"Psionicist",
+ 		"Psionicist",
+ 		"Psionicist",
+ 		"Psionicist",
+ 		"Psionicist",
  	}
+ 
  };
  
  
diff -c -w -r \games\angb283/src/types.h ./src/types.h
*** \games\angb283/src/types.h	Mon Feb  9 06:11:56 1998
--- ./src/types.h	Mon Feb 23 18:27:24 1998
***************
*** 802,807 ****
--- 802,821 ----
  	s16b delay_factor;		/* Delay factor (0 to 9) */
  };
  
+ typedef struct psi_aux psi_aux;
+ struct psi_aux
+ {
+ 	s16b awareness;
+ 	s16b biofeedback;
+         s16b adrenaline;
+ 	s16b shadow_form;
+ 	s16b inertial_barrier;
+ 	s16b prob_travel;
+ 	s16b precognition;
+ 	s16b mental_barrier;
+ 	s16b ts_anchor;
+ 	s16b your_mom_is_fat;
+ };
  
  /*
   * Most of the "player" information goes here.
***************
*** 829,834 ****
--- 843,851 ----
  
  	byte maximize;		/* Maximize stats */
  	byte preserve;		/* Preserve artifacts */
+ #ifdef GJW_RANDART
+ 	byte random_artifacts;	/* Random artifacts */
+ #endif
  
  	s16b age;			/* Characters age */
  	s16b ht;			/* Height */
diff -c -w -r \games\angb283/src/util.c ./src/util.c
*** \games\angb283/src/util.c	Mon Feb  9 09:42:58 1998
--- ./src/util.c	Mon Feb 23 18:27:24 1998
***************
*** 9,15 ****
   */
  
  #include "angband.h"
! 
  
  
  
--- 9,15 ----
   */
  
  #include "angband.h"
! #include <unistd.h>
  
  
  
***************
*** 2720,2727 ****
  	/* Result */
  	return (res);
  }
- 
- 
  
  /*
   * Request a "quantity" from the user
--- 2720,2725 ----
diff -c -w -r \games\angb283/src/variable.c ./src/variable.c
*** \games\angb283/src/variable.c	Mon Feb  9 06:49:54 1998
--- ./src/variable.c	Mon Feb 23 18:27:26 1998
***************
*** 10,15 ****
--- 10,21 ----
  
  #include "angband.h"
  
+ u32b life_drained = 0;
+ u32b psi_flags = 0;
+ int fade_dam = 0,meta_psi_lev = 0;
+ bool fade_dam_on = FALSE;
+ bool no_rating_bonus = FALSE; /* Turned on during vault generation */
+ char *_killer;
  
  /*
   * Hack -- Link a copyright message into the executable
***************
*** 72,77 ****
--- 78,86 ----
  
  u32b seed_flavor;		/* Hack -- consistent object colors */
  u32b seed_town;			/* Hack -- consistent town layout */
+ #ifdef GJW_RANDART
+ u32b seed_randart;		/* Hack -- consistent random artifacts */
+ #endif
  
  s16b num_repro;			/* Current reproducer count */
  s16b object_level;		/* Current object creation level */
***************
*** 445,456 ****
   * The player info record (static)
   */
  static player_type player_type_body;
  
  /*
   * Pointer to the player info record
   */
  player_type *p_ptr = &player_type_body;
! 
  
  /*
   * The vault generation arrays
--- 454,466 ----
   * The player info record (static)
   */
  static player_type player_type_body;
+ static psi_aux psi_aux_body;
  
  /*
   * Pointer to the player info record
   */
  player_type *p_ptr = &player_type_body;
! psi_aux *pa_ptr = &psi_aux_body;
  
  /*
   * The vault generation arrays
diff -c -w -r \games\angb283/src/wizard1.c ./src/wizard1.c
*** \games\angb283/src/wizard1.c	Fri Feb  6 09:10:30 1998
--- ./src/wizard1.c	Mon Feb 23 18:27:28 1998
***************
*** 108,113 ****
--- 108,114 ----
  
  	{ TV_MAGIC_BOOK,	"Books (Mage)" },
  	{ TV_PRAYER_BOOK,	"Books (Priest)" },
+ 	{ TV_PSI_BOOK,          "Books (Psionicist)" },
  
  	{ TV_CHEST,		"Chests" },
  
***************
*** 514,519 ****
--- 515,521 ----
  	{ TR2_RES_NETHR,  "Nether" },
  	{ TR2_RES_CHAOS,  "Chaos" },
  	{ TR2_RES_DISEN,  "Disenchantment" },
+    { TR2_RES_PSI,    "Psionics"}
  };
  
  /*
***************
*** 1691,1699 ****
  		/* Collect inate attacks */
  		vn = 0;
  		if (flags4 & (RF4_SHRIEK)) vp[vn++] = "shriek for help";
- 		if (flags4 & (RF4_XXX2)) vp[vn++] = "do something";
- 		if (flags4 & (RF4_XXX3)) vp[vn++] = "do something";
- 		if (flags4 & (RF4_XXX4)) vp[vn++] = "do something";
  		if (flags4 & (RF4_ARROW_1)) vp[vn++] = "fire arrows";
  		if (flags4 & (RF4_ARROW_2)) vp[vn++] = "fire arrows";
  		if (flags4 & (RF4_ARROW_3)) vp[vn++] = "fire missiles";
--- 1693,1698 ----
***************
*** 1734,1741 ****
  		if (flags4 & (RF4_BR_PLAS)) vp[vn++] = "plasma";
  		if (flags4 & (RF4_BR_WALL)) vp[vn++] = "force";
  		if (flags4 & (RF4_BR_MANA)) vp[vn++] = "mana";
! 		if (flags4 & (RF4_XXX5)) vp[vn++] = "something";
! 		if (flags4 & (RF4_XXX6)) vp[vn++] = "something";
  		if (flags4 & (RF4_XXX7)) vp[vn++] = "something";
  		if (flags4 & (RF4_XXX8)) vp[vn++] = "something";
  
--- 1733,1739 ----
  		if (flags4 & (RF4_BR_PLAS)) vp[vn++] = "plasma";
  		if (flags4 & (RF4_BR_WALL)) vp[vn++] = "force";
  		if (flags4 & (RF4_BR_MANA)) vp[vn++] = "mana";
!                 if (flags4 & (RF4_BR_INSA)) vp[vn++] = "insanity";
  		if (flags4 & (RF4_XXX7)) vp[vn++] = "something";
  		if (flags4 & (RF4_XXX8)) vp[vn++] = "something";
  
***************
*** 1755,1760 ****
--- 1753,1762 ----
  
  		/* Collect spells */
  		vn = 0;
+ 		if (flags4 & (RF4_P_BLAST)) vp[vn++] = "produce psionic blasts";
+ 		if (flags4 & (RF4_P_CRUSH)) vp[vn++] = "crush the psyche";
+ 		if (flags4 & (RF4_M_WRACK)) vp[vn++] = "wrack the mind";
+ 		if (flags4 & (RF4_P_WAVE)) vp[vn++] = "produce psychic waves";
  		if (flags5 & (RF5_BA_ACID))           vp[vn++] = "produce acid balls";
  		if (flags5 & (RF5_BA_ELEC))           vp[vn++] = "produce lightning balls";
  		if (flags5 & (RF5_BA_FIRE))           vp[vn++] = "produce fire balls";
***************
*** 1790,1796 ****
  		if (flags6 & (RF6_HASTE))             vp[vn++] = "haste-self";
  		if (flags6 & (RF6_XXX1))            vp[vn++] = "do something";
  		if (flags6 & (RF6_HEAL))              vp[vn++] = "heal-self";
! 		if (flags6 & (RF6_XXX2))            vp[vn++] = "do something";
  		if (flags6 & (RF6_BLINK))             vp[vn++] = "blink-self";
  		if (flags6 & (RF6_TPORT))             vp[vn++] = "teleport-self";
  		if (flags6 & (RF6_XXX3))            vp[vn++] = "do something";
--- 1792,1798 ----
  		if (flags6 & (RF6_HASTE))             vp[vn++] = "haste-self";
  		if (flags6 & (RF6_XXX1))            vp[vn++] = "do something";
  		if (flags6 & (RF6_HEAL))              vp[vn++] = "heal-self";
!                 if (flags6 & (RF6_HEAL2))            vp[vn++] = "super heal-self";
  		if (flags6 & (RF6_BLINK))             vp[vn++] = "blink-self";
  		if (flags6 & (RF6_TPORT))             vp[vn++] = "teleport-self";
  		if (flags6 & (RF6_XXX3))            vp[vn++] = "do something";
***************
*** 1953,1958 ****
--- 1955,1961 ----
  		if (flags3 & (RF3_RES_PLAS)) vp[vn++] = "plasma";
  		if (flags3 & (RF3_RES_NEXU)) vp[vn++] = "nexus";
  		if (flags3 & (RF3_RES_DISE)) vp[vn++] = "disenchantment";
+       if (flags3 & RES_PSI)        vp[vn++] = "psionics";
  
  		if (vn)
  		{
***************
*** 1973,1978 ****
--- 1976,1982 ----
  		if (flags3 & (RF3_NO_FEAR)) vp[vn++] = "frightened";
  		if (flags3 & (RF3_NO_CONF)) vp[vn++] = "confused";
  		if (flags3 & (RF3_NO_SLEEP)) vp[vn++] = "slept";
+                 if (flags3 & RF3_IM_PSI) vp[vn++] = "affected by mental attacks";
  
  		if (vn)
  		{
diff -c -w -r \games\angb283/src/wizard2.c ./src/wizard2.c
*** \games\angb283/src/wizard2.c	Fri Feb  6 09:10:30 1998
--- ./src/wizard2.c	Mon Feb 23 18:27:30 1998
***************
*** 378,383 ****
--- 378,384 ----
  	{ TV_ROD,               "Rod"                  },
  	{ TV_PRAYER_BOOK,       "Priest Book"          },
  	{ TV_MAGIC_BOOK,        "Magic Book"           },
+ 	{ TV_PSI_BOOK,          "Psionic Focus"        },
  	{ TV_SPIKE,             "Spikes"               },
  	{ TV_DIGGING,           "Digger"               },
  	{ TV_CHEST,             "Chest"                },
diff -c -w -r \games\angb283/src/xtra1.c ./src/xtra1.c
*** \games\angb283/src/xtra1.c	Mon Feb  9 10:58:28 1998
--- ./src/xtra1.c	Mon Feb 23 18:27:32 1998
***************
*** 1140,1146 ****
  
  	magic_type *s_ptr;
  
! 	cptr p = ((mp_ptr->spell_book == TV_MAGIC_BOOK) ? "spell" : "prayer");
  
  
  	/* Hack -- must be literate */
--- 1140,1147 ----
  
  	magic_type *s_ptr;
  
! 	cptr p = ((mp_ptr->spell_book == TV_MAGIC_BOOK) ? "spell" :
! 	((mp_ptr->spell_book == TV_PSI_BOOK) ? "power" : "prayer"));
  
  
  	/* Hack -- must be literate */
***************
*** 1668,1673 ****
--- 1669,1676 ----
   *
   * This function induces various "status" messages.
   */
+ static int max(int a,int b) {return a>b ? a : b;}
+ 
  static void calc_bonuses(void)
  {
  	int i, j, hold;
***************
*** 1783,1788 ****
--- 1786,1813 ----
  	p_ptr->immune_fire = FALSE;
  	p_ptr->immune_cold = FALSE;
  
+    psi_flags = 0;
+    meta_psi_lev = 0;
+ 
+         if (pa_ptr->adrenaline)
+ 	{
+ 	  i = p_ptr->lev / 5;
+ 	  if (i>5) i = 5;
+ 	  p_ptr->stat_add[A_CON] += i;
+ 	  p_ptr->stat_add[A_STR] += i;
+ 	  p_ptr->stat_add[A_DEX] += i;
+ 		p_ptr->to_h += 12;
+ 		p_ptr->dis_to_h += 12;
+           if (pa_ptr->adrenaline & 1)
+ 	  {
+ 		p_ptr->to_d += 8;
+ 		p_ptr->dis_to_d += 8;
+ 	  }
+           if (pa_ptr->adrenaline & 2)
+ 		extra_blows++;
+ 	  p_ptr->to_a -= 10;
+ 	  p_ptr->dis_to_a -= 10;
+ 	}
  
  	/*** Extract race/class info ***/
  
***************
*** 1864,1869 ****
--- 1889,1905 ----
  		/* Extract the item flags */
  		object_flags(o_ptr, &f1, &f2, &f3);
  
+ 		/* New psionic shit */
+ 		if (f3 & TR3_PSEUDO_ID)    psi_flags |= PSI_PSEUDO_ID;
+ 		if (f2 & TR2_RES_FORCE)     psi_flags |= RES_FORCE;
+ 		if (f2 & TR2_RES_INERT)   psi_flags |= RES_INERT;
+ 		if (f2 & TR2_RES_GRAVT)   psi_flags |= RES_GRAVT;
+       if (f2 & TR2_RES_PSI)     psi_flags |= RES_PSI;
+ 
+       meta_psi_lev = max(meta_psi_lev, ((f2 & TR2_META_PSI1) ? 1 : 0) +
+         ((f2 & TR2_META_PSI2) ? 2 : 0));
+ 
+ 
  		/* Affect stats */
  		if (f1 & (TR1_STR)) p_ptr->stat_add[A_STR] += o_ptr->pval;
  		if (f1 & (TR1_INT)) p_ptr->stat_add[A_INT] += o_ptr->pval;
***************
*** 2102,2107 ****
--- 2138,2156 ----
  		p_ptr->see_infra++;
  	}
  
+    /* Temporary telepathy  & other psionic stuff*/
+ 	if (pa_ptr->awareness)
+ 	{
+ 		p_ptr->telepathy = TRUE;
+ 	}
+ 
+ 	if (pa_ptr->mental_barrier)
+ 	{
+       p_ptr->resist_confu = TRUE;
+ 		p_ptr->resist_fear = TRUE;
+ 		p_ptr->sustain_int = TRUE;
+ 		p_ptr->sustain_wis = TRUE;
+ 	}
  
  	/*** Special flags ***/
  
***************
*** 2351,2356 ****
--- 2400,2408 ----
  
  			/* Paladin */
  			case CLASS_PALADIN: num = 5; wgt = 30; mul = 4; break;
+ 
+          /* Psionicist */
+          case CLASS_PSIONICIST: num = 2; wgt = 50; mul = 2; break;
  		}
  
  		/* Enforce a minimum "weight" (tenth pounds) */
diff -c -w -r \games\angb283/src/xtra2.c ./src/xtra2.c
*** \games\angb283/src/xtra2.c	Fri Feb  6 09:10:30 1998
--- ./src/xtra2.c	Mon Feb 23 18:27:34 1998
***************
*** 3485,3490 ****
--- 3485,3539 ----
  	return (TRUE);
  }
  
+ bool tgt_pt(int *x,int *y)
+ {
+    char ch = 0;
+    int d,cu,cv;
+    bool success = FALSE;
+ 
+    *x = p_ptr->px;
+    *y = p_ptr->py;
+ 
+    cu = Term->scr->cu;
+    cv = Term->scr->cv;
+    Term->scr->cu = 0;
+    Term->scr->cv = 1;
+    msg_print("Select a point and press space.");
+ 
+    while ((ch != 27) && (ch != ' '))
+    {
+       move_cursor_relative(*y,*x);
+       ch = inkey();
+       switch (ch)
+       {
+    case 27: break;
+    case ' ': success = TRUE; break;
+ 	default:
+ 	{
+ 	   d = target_dir(ch);
+ 	   if (!d) break;
+ 				*x += ddx[d];
+ 				*y += ddy[d];
+ 
+ 				/* Hack -- Verify x */
+ 				if ((*x>=DUNGEON_WID-1) || (*x>=p_ptr->wx + SCREEN_WID)) (*x)--;
+ 				  else if ((*x<=0) || (*x<=p_ptr->wx)) (*x)++;
+ 
+ 				/* Hack -- Verify y */
+ 				if ((*y>=DUNGEON_HGT-1) || (*y>=p_ptr->wy + SCREEN_HGT)) (*y)--;
+ 				  else if ((*y<=0) || (*y<=p_ptr->wy)) (*y)++;
+ 
+    break;
+ 	}
+       }
+    }
+ 
+    Term->scr->cu = cu;
+    Term->scr->cv = cv;
+    Term_fresh();
+    return success;
+ 
+ }
  
  
  /*
